void fft_pass12_0(double *ri, int n) {
  int i, j, k;
  for (i = (n - 1) & ~4095; i > 0; i -= 4096)
    for (j = i, k = i + 4096; j < k; j += 4) {
      double x00 = ri[j], x01 = ri[j + 1], x02 = ri[j + 2], x03 = ri[j + 3],
             x0 = x00 + x01, x1 = x00 - x01, x2 = x02 + x03, x3 = x02 - x03;
      ri[2 * (j)] = x0 + x2;
      ri[2 * (j) + 1] = 0.0;
      ri[2 * (j + 2)] = x0 - x2;
      ri[2 * (j + 2) + 1] = 0.0;
      ri[2 * (j + 1)] = ri[2 * (j + 3)] = x1;
      ri[2 * (j + 1) + 1] = x3;
      ri[2 * (j + 3) + 1] = -x3;
    }
  for (j = (n - 4) & 4092; j >= 0; j -= 4) {
    double x00 = ri[j], x01 = ri[j + 1], x02 = ri[j + 2], x03 = ri[j + 3],
           x0 = x00 + x01, x1 = x00 - x01, x2 = x02 + x03, x3 = x02 - x03;
    ri[2 * (j)] = x0 + x2;
    ri[2 * (j) + 1] = 0.0;
    ri[2 * (j + 2)] = x0 - x2;
    ri[2 * (j + 2) + 1] = 0.0;
    ri[2 * (j + 1)] = ri[2 * (j + 3)] = x1;
    ri[2 * (j + 1) + 1] = x3;
    ri[2 * (j + 3) + 1] = -x3;
  }
}


x86 assembly (clang, -O0):
<fft_pass12_0>:
push   %rbp
mov    %rsp,%rbp
sub    $0x18,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
and    $0xfffff000,%eax
mov    %eax,-0x10(%rbp)
cmpl   $0x0,-0x10(%rbp)
jle    12e8 <fft_pass12_0+0x1e8>
mov    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1000,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    12d3 <fft_pass12_0+0x1d3>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x20(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x20(%rbp),%xmm0
subsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x30(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
addsd  -0x50(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x40(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x3,%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x58(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x3,%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x14(%rbp)
jmp    1138 <fft_pass12_0+0x38>
jmp    12d8 <fft_pass12_0+0x1d8>
mov    -0x10(%rbp),%eax
sub    $0x1000,%eax
mov    %eax,-0x10(%rbp)
jmp    111d <fft_pass12_0+0x1d>
mov    -0xc(%rbp),%eax
sub    $0x4,%eax
and    $0xffc,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jl     14a7 <fft_pass12_0+0x3a7>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x60(%rbp),%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
addsd  -0x90(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x80(%rbp),%xmm0
subsd  -0x90(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x3,%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x98(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x98(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x3,%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
sub    $0x4,%eax
mov    %eax,-0x14(%rbp)
jmp    12f6 <fft_pass12_0+0x1f6>
add    $0x18,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fft_pass12_0>:
push   %rbp
push   %rbx
lea    -0x1(%rsi),%r10d
mov    %r10d,%eax
and    $0xfffff000,%eax
jle    122b <fft_pass12_0+0x12b>
mov    %eax,%r8d
add    %r10d,%r10d
and    $0xffffe000,%r10d
lea    -0x4(%r8),%r9
lea    (%rdi,%r8,8),%rcx
add    $0x18,%rcx
movapd 0xecb(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r8,%r11
or     $0xffc,%r11
mov    %r9,%rax
xor    %edx,%edx
nop
movsd  -0x18(%rcx,%rdx,4),%xmm2
movsd  -0x10(%rcx,%rdx,4),%xmm3
movsd  -0x8(%rcx,%rdx,4),%xmm1
movsd  (%rcx,%rdx,4),%xmm4
movapd %xmm2,%xmm5
addsd  %xmm3,%xmm5
subsd  %xmm3,%xmm2
movapd %xmm1,%xmm3
addsd  %xmm4,%xmm3
subsd  %xmm4,%xmm1
movapd %xmm5,%xmm4
addsd  %xmm3,%xmm4
lea    (%r10,%rdx,1),%rbx
movslq %ebx,%rbx
movsd  %xmm4,(%rdi,%rbx,8)
lea    0x1(%rbx),%ebp
movslq %ebp,%rbp
movq   $0x0,(%rdi,%rbp,8)
subsd  %xmm3,%xmm5
lea    0x4(%rbx),%ebp
movslq %ebp,%rbp
movsd  %xmm5,(%rdi,%rbp,8)
lea    0x5(%rbx),%ebp
movslq %ebp,%rbp
movq   $0x0,(%rdi,%rbp,8)
lea    0x6(%rbx),%ebp
movslq %ebp,%rbp
movsd  %xmm2,(%rdi,%rbp,8)
lea    0x2(%rbx),%ebp
movslq %ebp,%rbp
movsd  %xmm2,(%rdi,%rbp,8)
lea    0x3(%rbx),%ebp
movslq %ebp,%rbp
movsd  %xmm1,(%rdi,%rbp,8)
xorpd  %xmm0,%xmm1
add    $0x7,%ebx
movslq %ebx,%rbx
movlpd %xmm1,(%rdi,%rbx,8)
add    $0x8,%rdx
add    $0x4,%rax
cmp    %r11,%rax
jl     1150 <fft_pass12_0+0x50>
lea    -0x1000(%r8),%rax
add    $0xffffffffffffe000,%r10
add    $0xfffffffffffff000,%r9
add    $0xffffffffffff8000,%rcx
cmp    $0x1000,%r8
mov    %rax,%r8
jg     1140 <fft_pass12_0+0x40>
add    $0xffc,%esi
and    $0xffc,%esi
lea    (%rsi,%rsi,1),%eax
add    $0x4,%eax
movapd 0xdbb(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nop
mov    %esi,%ecx
movsd  (%rdi,%rcx,8),%xmm2
lea    0x1(%rsi),%ecx
movsd  (%rdi,%rcx,8),%xmm3
lea    0x2(%rsi),%ecx
movsd  (%rdi,%rcx,8),%xmm1
lea    0x3(%rsi),%ecx
movsd  (%rdi,%rcx,8),%xmm4
movapd %xmm2,%xmm5
addsd  %xmm3,%xmm5
subsd  %xmm3,%xmm2
movapd %xmm1,%xmm3
addsd  %xmm4,%xmm3
subsd  %xmm4,%xmm1
movapd %xmm5,%xmm4
addsd  %xmm3,%xmm4
lea    -0x4(%rax),%ecx
movsd  %xmm4,(%rdi,%rcx,8)
lea    -0x3(%rax),%ecx
movq   $0x0,(%rdi,%rcx,8)
subsd  %xmm3,%xmm5
mov    %eax,%ecx
movsd  %xmm5,(%rdi,%rcx,8)
lea    0x1(%rax),%ecx
movq   $0x0,(%rdi,%rcx,8)
lea    0x2(%rax),%ecx
movsd  %xmm2,(%rdi,%rcx,8)
lea    -0x2(%rax),%ecx
movsd  %xmm2,(%rdi,%rcx,8)
lea    -0x1(%rax),%ecx
movsd  %xmm1,(%rdi,%rcx,8)
xorpd  %xmm0,%xmm1
lea    0x3(%rax),%ecx
movlpd %xmm1,(%rdi,%rcx,8)
add    $0xfffffffc,%esi
add    $0xfffffff8,%eax
cmp    $0xfffffffc,%eax
jne    1250 <fft_pass12_0+0x150>
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define void @fft_pass12_0(double* %0, i32 %1) {
%3 = add nsw i32 %1, -1
%4 = and i32 %3, -4096
%5 = icmp sgt i32 %4, 0
br i1 %5, label %6, label %64
6: ; preds = %2
%7 = zext i32 %4 to i64
br label %8
8: ; preds = %6, %61
%9 = phi i64 [ %7, %6 ], [ %62, %61 ]
%10 = or i64 %9, 4092
br label %11
11: ; preds = %8, %11
%12 = phi i64 [ %9, %8 ], [ %59, %11 ]
%13 = trunc i64 %12 to i32
%14 = getelementptr inbounds double, double* %0, i64 %12
%15 = load double, double* %14
%16 = or i64 %12, 1
%17 = getelementptr inbounds double, double* %0, i64 %16
%18 = load double, double* %17
%19 = or i64 %12, 2
%20 = getelementptr inbounds double, double* %0, i64 %19
%21 = load double, double* %20
%22 = or i64 %12, 3
%23 = getelementptr inbounds double, double* %0, i64 %22
%24 = load double, double* %23
%25 = fadd double %15, %18
%26 = fsub double %15, %18
%27 = fadd double %21, %24
%28 = fsub double %21, %24
%29 = fadd double %25, %27
%30 = shl nsw i32 %13, 1
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds double, double* %0, i64 %31
store double %29, double* %32
%33 = or i32 %30, 1
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds double, double* %0, i64 %34
store double 0.000000e+00, double* %35
%36 = fsub double %25, %27
%37 = shl i32 %13, 1
%38 = or i32 %37, 4
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds double, double* %0, i64 %39
store double %36, double* %40
%41 = or i32 %37, 5
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds double, double* %0, i64 %42
store double 0.000000e+00, double* %43
%44 = trunc i64 %22 to i32
%45 = shl nsw i32 %44, 1
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds double, double* %0, i64 %46
store double %26, double* %47
%48 = trunc i64 %16 to i32
%49 = shl nsw i32 %48, 1
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds double, double* %0, i64 %50
store double %26, double* %51
%52 = or i32 %49, 1
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds double, double* %0, i64 %53
store double %28, double* %54
%55 = fneg double %28
%56 = or i32 %45, 1
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds double, double* %0, i64 %57
store double %55, double* %58
%59 = add nsw i64 %12, 4
%60 = icmp slt i64 %12, %10
br i1 %60, label %11, label %61
61: ; preds = %11
%62 = add nsw i64 %9, -4096
%63 = icmp sgt i64 %9, 4096
br i1 %63, label %8, label %64
64: ; preds = %61, %2
%65 = add i32 %1, 4092
%66 = and i32 %65, 4092
br label %67
67: ; preds = %64, %67
%68 = phi i32 [ %66, %64 ], [ %115, %67 ]
%69 = zext i32 %68 to i64
%70 = getelementptr inbounds double, double* %0, i64 %69
%71 = load double, double* %70
%72 = or i32 %68, 1
%73 = zext i32 %72 to i64
%74 = getelementptr inbounds double, double* %0, i64 %73
%75 = load double, double* %74
%76 = or i32 %68, 2
%77 = zext i32 %76 to i64
%78 = getelementptr inbounds double, double* %0, i64 %77
%79 = load double, double* %78
%80 = or i32 %68, 3
%81 = zext i32 %80 to i64
%82 = getelementptr inbounds double, double* %0, i64 %81
%83 = load double, double* %82
%84 = fadd double %71, %75
%85 = fsub double %71, %75
%86 = fadd double %79, %83
%87 = fsub double %79, %83
%88 = fadd double %84, %86
%89 = shl nuw nsw i32 %68, 1
%90 = zext i32 %89 to i64
%91 = getelementptr inbounds double, double* %0, i64 %90
store double %88, double* %91
%92 = or i32 %89, 1
%93 = zext i32 %92 to i64
%94 = getelementptr inbounds double, double* %0, i64 %93
store double 0.000000e+00, double* %94
%95 = fsub double %84, %86
%96 = shl nsw i32 %76, 1
%97 = zext i32 %96 to i64
%98 = getelementptr inbounds double, double* %0, i64 %97
store double %95, double* %98
%99 = or i32 %96, 1
%100 = zext i32 %99 to i64
%101 = getelementptr inbounds double, double* %0, i64 %100
store double 0.000000e+00, double* %101
%102 = shl nsw i32 %80, 1
%103 = zext i32 %102 to i64
%104 = getelementptr inbounds double, double* %0, i64 %103
store double %85, double* %104
%105 = shl nsw i32 %72, 1
%106 = zext i32 %105 to i64
%107 = getelementptr inbounds double, double* %0, i64 %106
store double %85, double* %107
%108 = or i32 %105, 1
%109 = zext i32 %108 to i64
%110 = getelementptr inbounds double, double* %0, i64 %109
store double %87, double* %110
%111 = fneg double %87
%112 = or i32 %102, 1
%113 = zext i32 %112 to i64
%114 = getelementptr inbounds double, double* %0, i64 %113
store double %111, double* %114
%115 = add nsw i32 %68, -4
%116 = icmp eq i32 %68, 0
br i1 %116, label %117, label %67
117: ; preds = %67
ret void
}