int main() {
  _Complex double *c1, *c2, *sum, *prod, *c1csin, *c2csin, *c1ccos, *c2ccos;
  c1 = (_Complex double *)malloc(sizeof(_Complex double));
  c2 = (_Complex double *)malloc(sizeof(_Complex double));
  sum = (_Complex double *)malloc(sizeof(_Complex double));
  prod = (_Complex double *)malloc(sizeof(_Complex double));
  c1csin = (_Complex double *)malloc(sizeof(_Complex double));
  c2csin = (_Complex double *)malloc(sizeof(_Complex double));
  c1ccos = (_Complex double *)malloc(sizeof(_Complex double));
  c2ccos = (_Complex double *)malloc(sizeof(_Complex double));
  *c1 = 1.3 + 2.5i;
  *c2 = -2.7 + 0.3i;
  printf("c1 = %g + %gi\n", creal(*c1), cimag(*c1));
  printf("c2 = %g + %gi\n", creal(*c2), cimag(*c2));
  *sum = *c1 + *c2;
  *prod = *c1 * (*c2);
  printf("c1 + c2 = %g + %gi\n", creal(*sum), cimag(*sum));
  printf("c1 * c2 = %g + %gi\n", creal(*prod), cimag(*prod));
  *c1csin = csin(*c1);
  *c2csin = csin(*c1);
  printf("csin(c1) = %g + %gi\n", creal(*c1csin), cimag(*c1csin));
  printf("csin(c2) = %g + %gi\n", creal(*c1csin), cimag(*c1csin));
  *c1ccos = ccos(*c1);
  *c2ccos = ccos(*c1);
  printf("ccos(c1) = %g + %gi\n", creal(*c1ccos), cimag(*c1ccos));
  printf("ccos(c2) = %g + %gi\n", creal(*c1ccos), cimag(*c1ccos));
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
movl   $0x0,-0x4(%rbp)
mov    $0x10,%edi
call   1060 <malloc@plt>
mov    %rax,-0x10(%rbp)
mov    $0x10,%edi
call   1060 <malloc@plt>
mov    %rax,-0x18(%rbp)
mov    $0x10,%edi
call   1060 <malloc@plt>
mov    %rax,-0x20(%rbp)
mov    $0x10,%edi
call   1060 <malloc@plt>
mov    %rax,-0x28(%rbp)
mov    $0x10,%edi
call   1060 <malloc@plt>
mov    %rax,-0x30(%rbp)
mov    $0x10,%edi
call   1060 <malloc@plt>
mov    %rax,-0x38(%rbp)
mov    $0x10,%edi
call   1060 <malloc@plt>
mov    %rax,-0x40(%rbp)
mov    $0x10,%edi
call   1060 <malloc@plt>
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0xe4a(%rip),%xmm0
movsd  %xmm0,(%rax)
movsd  0xe36(%rip),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0xe1d(%rip),%xmm0
movsd  %xmm0,(%rax)
movsd  0xe09(%rip),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    0xe0c(%rip),%rdi
mov    $0x2,%al
call   1040 <printf@plt>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    0xe15(%rip),%rdi
mov    $0x2,%al
call   1040 <printf@plt>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  0x8(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm3
movsd  0x8(%rax),%xmm2
addsd  %xmm3,%xmm1
addsd  %xmm2,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm1,(%rax)
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  %xmm1,-0xc8(%rbp)
ff
movsd  0x8(%rax),%xmm2
movsd  %xmm2,-0xc0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm4
movsd  %xmm4,-0xb8(%rbp)
ff
movsd  0x8(%rax),%xmm5
movsd  %xmm5,-0xb0(%rbp)
ff
movaps %xmm1,%xmm0
mulsd  %xmm4,%xmm0
movaps %xmm2,%xmm3
mulsd  %xmm5,%xmm3
mulsd  %xmm5,%xmm1
mulsd  %xmm4,%xmm2
subsd  %xmm3,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
addsd  %xmm2,%xmm1
movsd  %xmm1,-0xa0(%rbp)
ff
ucomisd %xmm0,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  %xmm1,-0x90(%rbp)
ff
jnp    134a <main+0x20a>
movsd  -0xa0(%rbp),%xmm1
ff
movsd  -0xa8(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm1
movsd  %xmm0,-0x98(%rbp)
ff
movsd  %xmm1,-0x90(%rbp)
ff
jnp    134a <main+0x20a>
movsd  -0xb0(%rbp),%xmm3
ff
movsd  -0xb8(%rbp),%xmm2
ff
movsd  -0xc0(%rbp),%xmm1
ff
movsd  -0xc8(%rbp),%xmm0
ff
call   1500 <__muldc3>
movsd  %xmm0,-0x98(%rbp)
ff
movsd  %xmm1,-0x90(%rbp)
ff
movsd  -0x98(%rbp),%xmm1
ff
movsd  -0x90(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
movsd  %xmm1,(%rax)
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    0xcb0(%rip),%rdi
mov    $0x2,%al
call   1040 <printf@plt>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    0xca5(%rip),%rdi
mov    $0x2,%al
call   1040 <printf@plt>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  0x8(%rax),%xmm0
movsd  %xmm1,-0x58(%rbp)
movsd  %xmm0,-0x50(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
call   1030 <csin@plt>
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  %xmm1,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  0x8(%rax),%xmm0
movsd  %xmm1,-0x68(%rbp)
movsd  %xmm0,-0x60(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm1
call   1030 <csin@plt>
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  %xmm1,0x8(%rax)
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    0xc34(%rip),%rdi
mov    $0x2,%al
call   1040 <printf@plt>
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    0xc2a(%rip),%rdi
mov    $0x2,%al
call   1040 <printf@plt>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  0x8(%rax),%xmm0
movsd  %xmm1,-0x78(%rbp)
movsd  %xmm0,-0x70(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm1
call   1050 <ccos@plt>
mov    -0x40(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  %xmm1,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  0x8(%rax),%xmm0
movsd  %xmm1,-0x88(%rbp)
ff
movsd  %xmm0,-0x80(%rbp)
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0x80(%rbp),%xmm1
call   1050 <ccos@plt>
mov    -0x48(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  %xmm1,0x8(%rax)
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x40(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    0xbb4(%rip),%rdi
mov    $0x2,%al
call   1040 <printf@plt>
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x40(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    0xbaa(%rip),%rdi
mov    $0x2,%al
call   1040 <printf@plt>
xor    %eax,%eax
add    $0xd0,%rsp
pop    %rbp
ret
xchg   %ax,%ax

x86 assembly (clang, -O2):
<main>:
sub    $0x18,%rsp
lea    0xf05(%rip),%rdi
movsd  0xebd(%rip),%xmm0
movsd  0xebd(%rip),%xmm1
mov    $0x2,%al
call   1040 <printf@plt>
lea    0xf0f(%rip),%rdi
movsd  0xeaf(%rip),%xmm0
movsd  0xeaf(%rip),%xmm1
mov    $0x2,%al
call   1040 <printf@plt>
lea    0xed8(%rip),%rdi
movsd  0xea1(%rip),%xmm0
movsd  0xea1(%rip),%xmm1
mov    $0x2,%al
call   1040 <printf@plt>
lea    0xece(%rip),%rdi
movsd  0xe93(%rip),%xmm0
movsd  0xe93(%rip),%xmm1
mov    $0x2,%al
call   1040 <printf@plt>
movsd  0xe4c(%rip),%xmm0
movsd  0xe4c(%rip),%xmm1
call   1030 <csin@plt>
movsd  %xmm0,0x10(%rsp)
movsd  %xmm1,0x8(%rsp)
movsd  0xe2b(%rip),%xmm0
movsd  0xe2b(%rip),%xmm1
call   1030 <csin@plt>
lea    0xe8e(%rip),%rdi
movsd  0x10(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
mov    $0x2,%al
call   1040 <printf@plt>
lea    0xe89(%rip),%rdi
movsd  0x10(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
mov    $0x2,%al
call   1040 <printf@plt>
movsd  0xde2(%rip),%xmm0
movsd  0xde2(%rip),%xmm1
call   1050 <ccos@plt>
movsd  %xmm0,0x10(%rsp)
movsd  %xmm1,0x8(%rsp)
movsd  0xdc1(%rip),%xmm0
movsd  0xdc1(%rip),%xmm1
call   1050 <ccos@plt>
lea    0xe4e(%rip),%rdi
movsd  0x10(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
mov    $0x2,%al
call   1040 <printf@plt>
lea    0xe49(%rip),%rdi
movsd  0x10(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
mov    $0x2,%al
call   1040 <printf@plt>
xor    %eax,%eax
add    $0x18,%rsp
ret

LLVM IR (-O0):
@.str = [15 x i8] c"c1 = %g + %gi\0A\00"
@.str.1 = [15 x i8] c"c2 = %g + %gi\0A\00"
@.str.2 = [20 x i8] c"c1 + c2 = %g + %gi\0A\00"
@.str.3 = [20 x i8] c"c1 * c2 = %g + %gi\0A\00"
@.str.4 = [21 x i8] c"csin(c1) = %g + %gi\0A\00"
@.str.5 = [21 x i8] c"csin(c2) = %g + %gi\0A\00"
@.str.6 = [21 x i8] c"ccos(c1) = %g + %gi\0A\00"
@.str.7 = [21 x i8] c"ccos(c2) = %g + %gi\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca { double, double }*
%3 = alloca { double, double }*
%4 = alloca { double, double }*
%5 = alloca { double, double }*
%6 = alloca { double, double }*
%7 = alloca { double, double }*
%8 = alloca { double, double }*
%9 = alloca { double, double }*
%10 = alloca { double, double }
%11 = alloca { double, double }
%12 = alloca { double, double }
%13 = alloca { double, double }
store i32 0, i32* %1
%14 = call i8* @malloc(i64 16)
%15 = bitcast i8* %14 to { double, double }*
store { double, double }* %15, { double, double }** %2
%16 = call i8* @malloc(i64 16)
%17 = bitcast i8* %16 to { double, double }*
store { double, double }* %17, { double, double }** %3
%18 = call i8* @malloc(i64 16)
%19 = bitcast i8* %18 to { double, double }*
store { double, double }* %19, { double, double }** %4
%20 = call i8* @malloc(i64 16)
%21 = bitcast i8* %20 to { double, double }*
store { double, double }* %21, { double, double }** %5
%22 = call i8* @malloc(i64 16)
%23 = bitcast i8* %22 to { double, double }*
store { double, double }* %23, { double, double }** %6
%24 = call i8* @malloc(i64 16)
%25 = bitcast i8* %24 to { double, double }*
store { double, double }* %25, { double, double }** %7
%26 = call i8* @malloc(i64 16)
%27 = bitcast i8* %26 to { double, double }*
store { double, double }* %27, { double, double }** %8
%28 = call i8* @malloc(i64 16)
%29 = bitcast i8* %28 to { double, double }*
store { double, double }* %29, { double, double }** %9
%30 = load { double, double }*, { double, double }** %2
%31 = getelementptr inbounds { double, double }, { double, double }* %30, i32 0, i32 0
%32 = getelementptr inbounds { double, double }, { double, double }* %30, i32 0, i32 1
store double 1.300000e+00, double* %31
store double 2.500000e+00, double* %32
%33 = load { double, double }*, { double, double }** %3
%34 = getelementptr inbounds { double, double }, { double, double }* %33, i32 0, i32 0
%35 = getelementptr inbounds { double, double }, { double, double }* %33, i32 0, i32 1
store double -2.700000e+00, double* %34
store double 3.000000e-01, double* %35
%36 = load { double, double }*, { double, double }** %2
%37 = getelementptr inbounds { double, double }, { double, double }* %36, i32 0, i32 0
%38 = load double, double* %37
%39 = getelementptr inbounds { double, double }, { double, double }* %36, i32 0, i32 1
%40 = load double, double* %39
%41 = load { double, double }*, { double, double }** %2
%42 = getelementptr inbounds { double, double }, { double, double }* %41, i32 0, i32 0
%43 = load double, double* %42
%44 = getelementptr inbounds { double, double }, { double, double }* %41, i32 0, i32 1
%45 = load double, double* %44
%46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0), double %38, double %45)
%47 = load { double, double }*, { double, double }** %3
%48 = getelementptr inbounds { double, double }, { double, double }* %47, i32 0, i32 0
%49 = load double, double* %48
%50 = getelementptr inbounds { double, double }, { double, double }* %47, i32 0, i32 1
%51 = load double, double* %50
%52 = load { double, double }*, { double, double }** %3
%53 = getelementptr inbounds { double, double }, { double, double }* %52, i32 0, i32 0
%54 = load double, double* %53
%55 = getelementptr inbounds { double, double }, { double, double }* %52, i32 0, i32 1
%56 = load double, double* %55
%57 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0), double %49, double %56)
%58 = load { double, double }*, { double, double }** %2
%59 = getelementptr inbounds { double, double }, { double, double }* %58, i32 0, i32 0
%60 = load double, double* %59
%61 = getelementptr inbounds { double, double }, { double, double }* %58, i32 0, i32 1
%62 = load double, double* %61
%63 = load { double, double }*, { double, double }** %3
%64 = getelementptr inbounds { double, double }, { double, double }* %63, i32 0, i32 0
%65 = load double, double* %64
%66 = getelementptr inbounds { double, double }, { double, double }* %63, i32 0, i32 1
%67 = load double, double* %66
%68 = fadd double %60, %65
%69 = fadd double %62, %67
%70 = load { double, double }*, { double, double }** %4
%71 = getelementptr inbounds { double, double }, { double, double }* %70, i32 0, i32 0
%72 = getelementptr inbounds { double, double }, { double, double }* %70, i32 0, i32 1
store double %68, double* %71
store double %69, double* %72
%73 = load { double, double }*, { double, double }** %2
%74 = getelementptr inbounds { double, double }, { double, double }* %73, i32 0, i32 0
%75 = load double, double* %74
%76 = getelementptr inbounds { double, double }, { double, double }* %73, i32 0, i32 1
%77 = load double, double* %76
%78 = load { double, double }*, { double, double }** %3
%79 = getelementptr inbounds { double, double }, { double, double }* %78, i32 0, i32 0
%80 = load double, double* %79
%81 = getelementptr inbounds { double, double }, { double, double }* %78, i32 0, i32 1
%82 = load double, double* %81
%83 = fmul double %75, %80
%84 = fmul double %77, %82
%85 = fmul double %75, %82
%86 = fmul double %77, %80
%87 = fsub double %83, %84
%88 = fadd double %85, %86
%89 = fcmp uno double %87, %87
br i1 %89, label %90, label %96
90: ; preds = %0
%91 = fcmp uno double %88, %88
br i1 %91, label %92, label %96
92: ; preds = %90
%93 = call { double, double } @__muldc3(double %75, double %77, double %80, double %82)
%94 = extractvalue { double, double } %93, 0
%95 = extractvalue { double, double } %93, 1
br label %96
96: ; preds = %92, %90, %0
%97 = phi double [ %87, %0 ], [ %87, %90 ], [ %94, %92 ]
%98 = phi double [ %88, %0 ], [ %88, %90 ], [ %95, %92 ]
%99 = load { double, double }*, { double, double }** %5
%100 = getelementptr inbounds { double, double }, { double, double }* %99, i32 0, i32 0
%101 = getelementptr inbounds { double, double }, { double, double }* %99, i32 0, i32 1
store double %97, double* %100
store double %98, double* %101
%102 = load { double, double }*, { double, double }** %4
%103 = getelementptr inbounds { double, double }, { double, double }* %102, i32 0, i32 0
%104 = load double, double* %103
%105 = getelementptr inbounds { double, double }, { double, double }* %102, i32 0, i32 1
%106 = load double, double* %105
%107 = load { double, double }*, { double, double }** %4
%108 = getelementptr inbounds { double, double }, { double, double }* %107, i32 0, i32 0
%109 = load double, double* %108
%110 = getelementptr inbounds { double, double }, { double, double }* %107, i32 0, i32 1
%111 = load double, double* %110
%112 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.2, i64 0, i64 0), double %104, double %111)
%113 = load { double, double }*, { double, double }** %5
%114 = getelementptr inbounds { double, double }, { double, double }* %113, i32 0, i32 0
%115 = load double, double* %114
%116 = getelementptr inbounds { double, double }, { double, double }* %113, i32 0, i32 1
%117 = load double, double* %116
%118 = load { double, double }*, { double, double }** %5
%119 = getelementptr inbounds { double, double }, { double, double }* %118, i32 0, i32 0
%120 = load double, double* %119
%121 = getelementptr inbounds { double, double }, { double, double }* %118, i32 0, i32 1
%122 = load double, double* %121
%123 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.3, i64 0, i64 0), double %115, double %122)
%124 = load { double, double }*, { double, double }** %2
%125 = getelementptr inbounds { double, double }, { double, double }* %124, i32 0, i32 0
%126 = load double, double* %125
%127 = getelementptr inbounds { double, double }, { double, double }* %124, i32 0, i32 1
%128 = load double, double* %127
%129 = getelementptr inbounds { double, double }, { double, double }* %10, i32 0, i32 0
%130 = getelementptr inbounds { double, double }, { double, double }* %10, i32 0, i32 1
store double %126, double* %129
store double %128, double* %130
%131 = getelementptr inbounds { double, double }, { double, double }* %10, i32 0, i32 0
%132 = load double, double* %131
%133 = getelementptr inbounds { double, double }, { double, double }* %10, i32 0, i32 1
%134 = load double, double* %133
%135 = call { double, double } @csin(double %132, double %134)
%136 = extractvalue { double, double } %135, 0
%137 = extractvalue { double, double } %135, 1
%138 = load { double, double }*, { double, double }** %6
%139 = getelementptr inbounds { double, double }, { double, double }* %138, i32 0, i32 0
%140 = getelementptr inbounds { double, double }, { double, double }* %138, i32 0, i32 1
store double %136, double* %139
store double %137, double* %140
%141 = load { double, double }*, { double, double }** %2
%142 = getelementptr inbounds { double, double }, { double, double }* %141, i32 0, i32 0
%143 = load double, double* %142
%144 = getelementptr inbounds { double, double }, { double, double }* %141, i32 0, i32 1
%145 = load double, double* %144
%146 = getelementptr inbounds { double, double }, { double, double }* %11, i32 0, i32 0
%147 = getelementptr inbounds { double, double }, { double, double }* %11, i32 0, i32 1
store double %143, double* %146
store double %145, double* %147
%148 = getelementptr inbounds { double, double }, { double, double }* %11, i32 0, i32 0
%149 = load double, double* %148
%150 = getelementptr inbounds { double, double }, { double, double }* %11, i32 0, i32 1
%151 = load double, double* %150
%152 = call { double, double } @csin(double %149, double %151)
%153 = extractvalue { double, double } %152, 0
%154 = extractvalue { double, double } %152, 1
%155 = load { double, double }*, { double, double }** %7
%156 = getelementptr inbounds { double, double }, { double, double }* %155, i32 0, i32 0
%157 = getelementptr inbounds { double, double }, { double, double }* %155, i32 0, i32 1
store double %153, double* %156
store double %154, double* %157
%158 = load { double, double }*, { double, double }** %6
%159 = getelementptr inbounds { double, double }, { double, double }* %158, i32 0, i32 0
%160 = load double, double* %159
%161 = getelementptr inbounds { double, double }, { double, double }* %158, i32 0, i32 1
%162 = load double, double* %161
%163 = load { double, double }*, { double, double }** %6
%164 = getelementptr inbounds { double, double }, { double, double }* %163, i32 0, i32 0
%165 = load double, double* %164
%166 = getelementptr inbounds { double, double }, { double, double }* %163, i32 0, i32 1
%167 = load double, double* %166
%168 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.4, i64 0, i64 0), double %160, double %167)
%169 = load { double, double }*, { double, double }** %6
%170 = getelementptr inbounds { double, double }, { double, double }* %169, i32 0, i32 0
%171 = load double, double* %170
%172 = getelementptr inbounds { double, double }, { double, double }* %169, i32 0, i32 1
%173 = load double, double* %172
%174 = load { double, double }*, { double, double }** %6
%175 = getelementptr inbounds { double, double }, { double, double }* %174, i32 0, i32 0
%176 = load double, double* %175
%177 = getelementptr inbounds { double, double }, { double, double }* %174, i32 0, i32 1
%178 = load double, double* %177
%179 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.5, i64 0, i64 0), double %171, double %178)
%180 = load { double, double }*, { double, double }** %2
%181 = getelementptr inbounds { double, double }, { double, double }* %180, i32 0, i32 0
%182 = load double, double* %181
%183 = getelementptr inbounds { double, double }, { double, double }* %180, i32 0, i32 1
%184 = load double, double* %183
%185 = getelementptr inbounds { double, double }, { double, double }* %12, i32 0, i32 0
%186 = getelementptr inbounds { double, double }, { double, double }* %12, i32 0, i32 1
store double %182, double* %185
store double %184, double* %186
%187 = getelementptr inbounds { double, double }, { double, double }* %12, i32 0, i32 0
%188 = load double, double* %187
%189 = getelementptr inbounds { double, double }, { double, double }* %12, i32 0, i32 1
%190 = load double, double* %189
%191 = call { double, double } @ccos(double %188, double %190)
%192 = extractvalue { double, double } %191, 0
%193 = extractvalue { double, double } %191, 1
%194 = load { double, double }*, { double, double }** %8
%195 = getelementptr inbounds { double, double }, { double, double }* %194, i32 0, i32 0
%196 = getelementptr inbounds { double, double }, { double, double }* %194, i32 0, i32 1
store double %192, double* %195
store double %193, double* %196
%197 = load { double, double }*, { double, double }** %2
%198 = getelementptr inbounds { double, double }, { double, double }* %197, i32 0, i32 0
%199 = load double, double* %198
%200 = getelementptr inbounds { double, double }, { double, double }* %197, i32 0, i32 1
%201 = load double, double* %200
%202 = getelementptr inbounds { double, double }, { double, double }* %13, i32 0, i32 0
%203 = getelementptr inbounds { double, double }, { double, double }* %13, i32 0, i32 1
store double %199, double* %202
store double %201, double* %203
%204 = getelementptr inbounds { double, double }, { double, double }* %13, i32 0, i32 0
%205 = load double, double* %204
%206 = getelementptr inbounds { double, double }, { double, double }* %13, i32 0, i32 1
%207 = load double, double* %206
%208 = call { double, double } @ccos(double %205, double %207)
%209 = extractvalue { double, double } %208, 0
%210 = extractvalue { double, double } %208, 1
%211 = load { double, double }*, { double, double }** %9
%212 = getelementptr inbounds { double, double }, { double, double }* %211, i32 0, i32 0
%213 = getelementptr inbounds { double, double }, { double, double }* %211, i32 0, i32 1
store double %209, double* %212
store double %210, double* %213
%214 = load { double, double }*, { double, double }** %8
%215 = getelementptr inbounds { double, double }, { double, double }* %214, i32 0, i32 0
%216 = load double, double* %215
%217 = getelementptr inbounds { double, double }, { double, double }* %214, i32 0, i32 1
%218 = load double, double* %217
%219 = load { double, double }*, { double, double }** %8
%220 = getelementptr inbounds { double, double }, { double, double }* %219, i32 0, i32 0
%221 = load double, double* %220
%222 = getelementptr inbounds { double, double }, { double, double }* %219, i32 0, i32 1
%223 = load double, double* %222
%224 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.6, i64 0, i64 0), double %216, double %223)
%225 = load { double, double }*, { double, double }** %8
%226 = getelementptr inbounds { double, double }, { double, double }* %225, i32 0, i32 0
%227 = load double, double* %226
%228 = getelementptr inbounds { double, double }, { double, double }* %225, i32 0, i32 1
%229 = load double, double* %228
%230 = load { double, double }*, { double, double }** %8
%231 = getelementptr inbounds { double, double }, { double, double }* %230, i32 0, i32 0
%232 = load double, double* %231
%233 = getelementptr inbounds { double, double }, { double, double }* %230, i32 0, i32 1
%234 = load double, double* %233
%235 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.7, i64 0, i64 0), double %227, double %234)
ret i32 0
}

LLVM IR (-O2):
@.str = [15 x i8] c"c1 = %g + %gi\0A\00"
@.str.1 = [15 x i8] c"c2 = %g + %gi\0A\00"
@.str.2 = [20 x i8] c"c1 + c2 = %g + %gi\0A\00"
@.str.3 = [20 x i8] c"c1 * c2 = %g + %gi\0A\00"
@.str.4 = [21 x i8] c"csin(c1) = %g + %gi\0A\00"
@.str.5 = [21 x i8] c"csin(c2) = %g + %gi\0A\00"
@.str.6 = [21 x i8] c"ccos(c1) = %g + %gi\0A\00"
@.str.7 = [21 x i8] c"ccos(c2) = %g + %gi\0A\00"
define i32 @main() {
%1 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0), double 1.300000e+00, double 2.500000e+00)
%2 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0), double -2.700000e+00, double 3.000000e-01)
%3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @.str.2, i64 0, i64 0), double 0xBFF6666666666667, double 2.800000e+00)
%4 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @.str.3, i64 0, i64 0), double -4.260000e+00, double -6.360000e+00)
%5 = tail call { double, double } @csin(double 1.300000e+00, double 2.500000e+00)
%6 = extractvalue { double, double } %5, 0
%7 = extractvalue { double, double } %5, 1
%8 = tail call { double, double } @csin(double 1.300000e+00, double 2.500000e+00)
%9 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([21 x i8], [21 x i8]* @.str.4, i64 0, i64 0), double %6, double %7)
%10 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([21 x i8], [21 x i8]* @.str.5, i64 0, i64 0), double %6, double %7)
%11 = tail call { double, double } @ccos(double 1.300000e+00, double 2.500000e+00)
%12 = extractvalue { double, double } %11, 0
%13 = extractvalue { double, double } %11, 1
%14 = tail call { double, double } @ccos(double 1.300000e+00, double 2.500000e+00)
%15 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([21 x i8], [21 x i8]* @.str.6, i64 0, i64 0), double %12, double %13)
%16 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([21 x i8], [21 x i8]* @.str.7, i64 0, i64 0), double %12, double %13)
ret i32 0
}