_Complex double test_cpow(_Complex double x, _Complex double y) {
  return __builtin_cpow(x, y);
}


x86 assembly (clang, -O0):
<test_cpow>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movsd  %xmm0,-0x20(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x30(%rbp)
movsd  %xmm3,-0x28(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm3
movsd  -0x28(%rbp),%xmm2
movsd  %xmm1,-0x40(%rbp)
movsd  %xmm0,-0x38(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  %xmm3,-0x50(%rbp)
movsd  %xmm2,-0x48(%rbp)
movsd  -0x50(%rbp),%xmm2
movsd  -0x48(%rbp),%xmm3
call   1030 <cpow@plt>
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x8(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<test_cpow>:
jmp    1030 <cpow@plt>

LLVM IR (-O0):
define { double, double } @test_cpow(double %0, double %1, double %2, double %3) {
%5 = alloca { double, double }
%6 = alloca { double, double }
%7 = alloca { double, double }
%8 = alloca { double, double }
%9 = alloca { double, double }
%10 = getelementptr inbounds { double, double }, { double, double }* %6, i32 0, i32 0
store double %0, double* %10
%11 = getelementptr inbounds { double, double }, { double, double }* %6, i32 0, i32 1
store double %1, double* %11
%12 = getelementptr inbounds { double, double }, { double, double }* %7, i32 0, i32 0
store double %2, double* %12
%13 = getelementptr inbounds { double, double }, { double, double }* %7, i32 0, i32 1
store double %3, double* %13
%14 = getelementptr inbounds { double, double }, { double, double }* %6, i32 0, i32 0
%15 = load double, double* %14
%16 = getelementptr inbounds { double, double }, { double, double }* %6, i32 0, i32 1
%17 = load double, double* %16
%18 = getelementptr inbounds { double, double }, { double, double }* %7, i32 0, i32 0
%19 = load double, double* %18
%20 = getelementptr inbounds { double, double }, { double, double }* %7, i32 0, i32 1
%21 = load double, double* %20
%22 = getelementptr inbounds { double, double }, { double, double }* %8, i32 0, i32 0
%23 = getelementptr inbounds { double, double }, { double, double }* %8, i32 0, i32 1
store double %15, double* %22
store double %17, double* %23
%24 = getelementptr inbounds { double, double }, { double, double }* %8, i32 0, i32 0
%25 = load double, double* %24
%26 = getelementptr inbounds { double, double }, { double, double }* %8, i32 0, i32 1
%27 = load double, double* %26
%28 = getelementptr inbounds { double, double }, { double, double }* %9, i32 0, i32 0
%29 = getelementptr inbounds { double, double }, { double, double }* %9, i32 0, i32 1
store double %19, double* %28
store double %21, double* %29
%30 = getelementptr inbounds { double, double }, { double, double }* %9, i32 0, i32 0
%31 = load double, double* %30
%32 = getelementptr inbounds { double, double }, { double, double }* %9, i32 0, i32 1
%33 = load double, double* %32
%34 = call { double, double } @cpow(double %25, double %27, double %31, double %33)
%35 = extractvalue { double, double } %34, 0
%36 = extractvalue { double, double } %34, 1
%37 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 0
%38 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 1
store double %35, double* %37
store double %36, double* %38
%39 = load { double, double }, { double, double }* %5
ret { double, double } %39
}

LLVM IR (-O2):
define { double, double } @test_cpow(double %0, double %1, double %2, double %3) {
%5 = tail call { double, double } @cpow(double %0, double %1, double %2, double %3)
ret { double, double } %5
}