void dradb3(long ido, long l1, const double *cc, double *ch, const double *wa1,
            const double *wa2) {
  static double taur = -.5;
  static double taui = .86602540378443864676372317075293618;
  long i, k, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
  double ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;
  t0 = l1 * ido;
  t1 = 0;
  t2 = t0 << 1;
  t3 = ido << 1;
  t4 = ido + (ido << 1);
  t5 = 0;
  for (k = 0; k < l1; k++) {
    tr2 = cc[t3 - 1] + cc[t3 - 1];
    cr2 = cc[t5] + (taur * tr2);
    ch[t1] = cc[t5] + tr2;
    ci3 = taui * (cc[t3] + cc[t3]);
    ch[t1 + t0] = cr2 - ci3;
    ch[t1 + t2] = cr2 + ci3;
    t1 += ido;
    t3 += t4;
    t5 += t4;
  }
  if (ido == 1)
    return;
  t1 = 0;
  t3 = ido << 1;
  for (k = 0; k < l1; k++) {
    t7 = t1 + (t1 << 1);
    t6 = (t5 = t7 + t3);
    t8 = t1;
    t10 = (t9 = t1 + t0) + t0;
    for (i = 2; i < ido; i += 2) {
      t5 += 2;
      t6 -= 2;
      t7 += 2;
      t8 += 2;
      t9 += 2;
      t10 += 2;
      tr2 = cc[t5 - 1] + cc[t6 - 1];
      cr2 = cc[t7 - 1] + (taur * tr2);
      ch[t8 - 1] = cc[t7 - 1] + tr2;
      ti2 = cc[t5] - cc[t6];
      ci2 = cc[t7] + (taur * ti2);
      ch[t8] = cc[t7] + ti2;
      cr3 = taui * (cc[t5 - 1] - cc[t6 - 1]);
      ci3 = taui * (cc[t5] + cc[t6]);
      dr2 = cr2 - ci3;
      dr3 = cr2 + ci3;
      di2 = ci2 + cr3;
      di3 = ci2 - cr3;
      ch[t9 - 1] = wa1[i - 2] * dr2 - wa1[i - 1] * di2;
      ch[t9] = wa1[i - 2] * di2 + wa1[i - 1] * dr2;
      ch[t10 - 1] = wa2[i - 2] * dr3 - wa2[i - 1] * di3;
      ch[t10] = wa2[i - 2] * di3 + wa2[i - 1] * dr3;
    }
    t1 += ido;
  }
}


x86 assembly (clang, -O0):
<dradb3>:
push   %rbp
mov    %rsp,%rbp
sub    $0x68,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x10(%rbp),%rax
imul   -0x8(%rbp),%rax
mov    %rax,-0x48(%rbp)
movq   $0x0,-0x50(%rbp)
mov    -0x48(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x60(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x8(%rbp),%rcx
shl    $0x1,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
movq   $0x0,-0x70(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    129c <dradb3+0x19c>
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
sub    $0x1,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0x2e63(%rip),%xmm0
movsd  -0xe8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0xe8(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x50(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  0x2e29(%rip),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
subsd  -0xa8(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x50(%rbp),%rcx
add    -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xc0(%rbp),%xmm0
ff
addsd  -0xa8(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x50(%rbp),%rcx
add    -0x58(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x68(%rbp),%rax
add    -0x60(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x68(%rbp),%rax
add    -0x70(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1170 <dradb3+0x70>
cmpq   $0x1,-0x8(%rbp)
jne    12ac <dradb3+0x1ac>
jmp    16da <dradb3+0x5da>
movq   $0x0,-0x50(%rbp)
mov    -0x8(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x60(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    16da <dradb3+0x5da>
mov    -0x50(%rbp),%rax
mov    -0x50(%rbp),%rcx
shl    $0x1,%rcx
add    %rcx,%rax
mov    %rax,-0x80(%rbp)
mov    -0x80(%rbp),%rax
add    -0x60(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    %rax,-0x78(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    -0x50(%rbp),%rax
add    -0x48(%rbp),%rax
mov    %rax,-0x90(%rbp)
add    -0x48(%rbp),%rax
mov    %rax,-0x98(%rbp)
movq   $0x2,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x8(%rbp),%rax
jge    16bd <dradb3+0x5bd>
mov    -0x70(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x70(%rbp)
mov    -0x78(%rbp),%rax
sub    $0x2,%rax
mov    %rax,-0x78(%rbp)
mov    -0x80(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x80(%rbp)
mov    -0x88(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x88(%rbp)
mov    -0x90(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x90(%rbp)
mov    -0x98(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x98(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x78(%rbp),%rcx
sub    $0x1,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x80(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0x2c4f(%rip),%xmm0
movsd  -0xe8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x80(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0xe8(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x88(%rbp),%rcx
sub    $0x1,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x78(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x80(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0x2bd3(%rip),%xmm0
movsd  -0xe0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x80(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0xe0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x88(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  0x2b96(%rip),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x78(%rbp),%rcx
sub    $0x1,%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  0x2b60(%rip),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x78(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
subsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
addsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0xa0(%rbp),%xmm0
ff
addsd  -0xc8(%rbp),%xmm0
ff
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0xa0(%rbp),%xmm0
ff
subsd  -0xc8(%rbp),%xmm0
ff
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xd0(%rbp),%xmm2
ff
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xb0(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x90(%rbp),%rcx
sub    $0x1,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xb0(%rbp),%xmm2
ff
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xd0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x90(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xd8(%rbp),%xmm2
ff
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xb8(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x98(%rbp),%rcx
sub    $0x1,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xb8(%rbp),%xmm2
ff
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xd8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x98(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
jmp    1326 <dradb3+0x226>
mov    -0x8(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    12c8 <dradb3+0x1c8>
add    $0x68,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dradb3>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %rsi,%rsi
jle    1326 <dradb3+0x226>
mov    %rsi,%r12
imul   %rdi,%r12
lea    (%rdi,%rdi,1),%r15
lea    0x0(,%rdi,8),%r10
mov    %r12,%r14
shl    $0x4,%r14
mov    %rdi,%r13
shl    $0x4,%r13
lea    (%r10,%r10,2),%r11
movsd  0xec0(%rip),%xmm0
movsd  0xec0(%rip),%xmm1
mov    %rdx,%rax
mov    %rcx,%rbx
mov    %rsi,%rbp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  -0x8(%rax,%r13,1),%xmm2
addsd  %xmm2,%xmm2
movsd  (%rax),%xmm3
movapd %xmm2,%xmm4
mulsd  %xmm0,%xmm4
addsd  %xmm3,%xmm4
addsd  %xmm3,%xmm2
movsd  %xmm2,(%rbx)
movsd  (%rax,%r13,1),%xmm2
addsd  %xmm2,%xmm2
mulsd  %xmm1,%xmm2
movapd %xmm4,%xmm3
subsd  %xmm2,%xmm3
movsd  %xmm3,(%rbx,%r12,8)
addsd  %xmm4,%xmm2
movsd  %xmm2,(%rbx,%r14,1)
add    %r10,%rbx
add    %r11,%rax
add    $0xffffffffffffffff,%rbp
jne    1160 <dradb3+0x60>
cmp    $0x1,%rdi
je     1326 <dradb3+0x226>
test   %rsi,%rsi
jle    1326 <dradb3+0x226>
lea    (%rdx,%r15,8),%r13
add    %rcx,%r14
lea    (%rcx,%r12,8),%r12
xor    %r15d,%r15d
jmp    11fc <dradb3+0xfc>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r15
add    %r11,%r13
add    %r11,%rdx
add    %r10,%r14
add    %r10,%r12
add    %r10,%rcx
cmp    %rsi,%r15
je     1326 <dradb3+0x226>
cmp    $0x3,%rdi
jl     11e0 <dradb3+0xe0>
mov    $0x2,%eax
mov    $0xfffffffffffffffe,%rbx
xchg   %ax,%ax
movsd  -0x8(%r13,%rax,8),%xmm2
addsd  -0x8(%r13,%rbx,8),%xmm2
movsd  -0x8(%rdx,%rax,8),%xmm3
movapd %xmm2,%xmm4
mulsd  %xmm0,%xmm4
addsd  %xmm3,%xmm4
addsd  %xmm3,%xmm2
movsd  %xmm2,-0x8(%rcx,%rax,8)
movsd  0x0(%r13,%rax,8),%xmm3
subsd  0x0(%r13,%rbx,8),%xmm3
movsd  (%rdx,%rax,8),%xmm5
movapd %xmm3,%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm5,%xmm2
addsd  %xmm5,%xmm3
movsd  %xmm3,(%rcx,%rax,8)
movsd  -0x8(%r13,%rax,8),%xmm5
movsd  0x0(%r13,%rax,8),%xmm3
subsd  -0x8(%r13,%rbx,8),%xmm5
mulsd  %xmm1,%xmm5
addsd  0x0(%r13,%rbx,8),%xmm3
mulsd  %xmm1,%xmm3
movapd %xmm4,%xmm6
subsd  %xmm3,%xmm6
addsd  %xmm4,%xmm3
movapd %xmm2,%xmm4
addsd  %xmm5,%xmm4
subsd  %xmm5,%xmm2
movsd  -0x8(%r8,%rax,8),%xmm5
mulsd  %xmm4,%xmm5
movsd  -0x10(%r8,%rax,8),%xmm7
mulsd  %xmm6,%xmm7
subsd  %xmm5,%xmm7
movsd  %xmm7,-0x8(%r12,%rax,8)
mulsd  -0x8(%r8,%rax,8),%xmm6
mulsd  -0x10(%r8,%rax,8),%xmm4
addsd  %xmm6,%xmm4
movsd  %xmm4,(%r12,%rax,8)
movsd  -0x8(%r9,%rax,8),%xmm4
mulsd  %xmm2,%xmm4
movsd  -0x10(%r9,%rax,8),%xmm5
mulsd  %xmm3,%xmm5
subsd  %xmm4,%xmm5
movsd  %xmm5,-0x8(%r14,%rax,8)
mulsd  -0x8(%r9,%rax,8),%xmm3
mulsd  -0x10(%r9,%rax,8),%xmm2
addsd  %xmm3,%xmm2
movsd  %xmm2,(%r14,%rax,8)
add    $0x2,%rax
add    $0xfffffffffffffffe,%rbx
cmp    %rdi,%rax
jl     1210 <dradb3+0x110>
jmp    11e0 <dradb3+0xe0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@dradb3.taur = internal global double -5.000000e-01
@dradb3.taui = internal global double 0x3FEBB67AE8584CAA
define void @dradb3(i64 %0, i64 %1, double* %2, double* %3, double* %4, double* %5) {
%7 = alloca i64
%8 = alloca i64
%9 = alloca double*
%10 = alloca double*
%11 = alloca double*
%12 = alloca double*
%13 = alloca i64
%14 = alloca i64
%15 = alloca i64
%16 = alloca i64
%17 = alloca i64
%18 = alloca i64
%19 = alloca i64
%20 = alloca i64
%21 = alloca i64
%22 = alloca i64
%23 = alloca i64
%24 = alloca i64
%25 = alloca i64
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
%33 = alloca double
%34 = alloca double
%35 = alloca double
store i64 %0, i64* %7
store i64 %1, i64* %8
store double* %2, double** %9
store double* %3, double** %10
store double* %4, double** %11
store double* %5, double** %12
%36 = load i64, i64* %8
%37 = load i64, i64* %7
%38 = mul nsw i64 %36, %37
store i64 %38, i64* %15
store i64 0, i64* %16
%39 = load i64, i64* %15
%40 = shl i64 %39, 1
store i64 %40, i64* %17
%41 = load i64, i64* %7
%42 = shl i64 %41, 1
store i64 %42, i64* %18
%43 = load i64, i64* %7
%44 = load i64, i64* %7
%45 = shl i64 %44, 1
%46 = add nsw i64 %43, %45
store i64 %46, i64* %19
store i64 0, i64* %20
store i64 0, i64* %14
br label %47
47: ; preds = %115, %6
%48 = load i64, i64* %14
%49 = load i64, i64* %8
%50 = icmp slt i64 %48, %49
br i1 %50, label %51, label %118
51: ; preds = %47
%52 = load double*, double** %9
%53 = load i64, i64* %18
%54 = sub nsw i64 %53, 1
%55 = getelementptr inbounds double, double* %52, i64 %54
%56 = load double, double* %55
%57 = load double*, double** %9
%58 = load i64, i64* %18
%59 = sub nsw i64 %58, 1
%60 = getelementptr inbounds double, double* %57, i64 %59
%61 = load double, double* %60
%62 = fadd double %56, %61
store double %62, double* %35
%63 = load double*, double** %9
%64 = load i64, i64* %20
%65 = getelementptr inbounds double, double* %63, i64 %64
%66 = load double, double* %65
%67 = load double, double* @dradb3.taur
%68 = load double, double* %35
%69 = call double @llvm.fmuladd.f64(double %67, double %68, double %66)
store double %69, double* %30
%70 = load double*, double** %9
%71 = load i64, i64* %20
%72 = getelementptr inbounds double, double* %70, i64 %71
%73 = load double, double* %72
%74 = load double, double* %35
%75 = fadd double %73, %74
%76 = load double*, double** %10
%77 = load i64, i64* %16
%78 = getelementptr inbounds double, double* %76, i64 %77
store double %75, double* %78
%79 = load double, double* @dradb3.taui
%80 = load double*, double** %9
%81 = load i64, i64* %18
%82 = getelementptr inbounds double, double* %80, i64 %81
%83 = load double, double* %82
%84 = load double*, double** %9
%85 = load i64, i64* %18
%86 = getelementptr inbounds double, double* %84, i64 %85
%87 = load double, double* %86
%88 = fadd double %83, %87
%89 = fmul double %79, %88
store double %89, double* %27
%90 = load double, double* %30
%91 = load double, double* %27
%92 = fsub double %90, %91
%93 = load double*, double** %10
%94 = load i64, i64* %16
%95 = load i64, i64* %15
%96 = add nsw i64 %94, %95
%97 = getelementptr inbounds double, double* %93, i64 %96
store double %92, double* %97
%98 = load double, double* %30
%99 = load double, double* %27
%100 = fadd double %98, %99
%101 = load double*, double** %10
%102 = load i64, i64* %16
%103 = load i64, i64* %17
%104 = add nsw i64 %102, %103
%105 = getelementptr inbounds double, double* %101, i64 %104
store double %100, double* %105
%106 = load i64, i64* %7
%107 = load i64, i64* %16
%108 = add nsw i64 %107, %106
store i64 %108, i64* %16
%109 = load i64, i64* %19
%110 = load i64, i64* %18
%111 = add nsw i64 %110, %109
store i64 %111, i64* %18
%112 = load i64, i64* %19
%113 = load i64, i64* %20
%114 = add nsw i64 %113, %112
store i64 %114, i64* %20
br label %115
115: ; preds = %51
%116 = load i64, i64* %14
%117 = add nsw i64 %116, 1
store i64 %117, i64* %14
br label %47
118: ; preds = %47
%119 = load i64, i64* %7
%120 = icmp eq i64 %119, 1
br i1 %120, label %121, label %122
121: ; preds = %118
br label %333
122: ; preds = %118
store i64 0, i64* %16
%123 = load i64, i64* %7
%124 = shl i64 %123, 1
store i64 %124, i64* %18
store i64 0, i64* %14
br label %125
125: ; preds = %330, %122
%126 = load i64, i64* %14
%127 = load i64, i64* %8
%128 = icmp slt i64 %126, %127
br i1 %128, label %129, label %333
129: ; preds = %125
%130 = load i64, i64* %16
%131 = load i64, i64* %16
%132 = shl i64 %131, 1
%133 = add nsw i64 %130, %132
store i64 %133, i64* %22
%134 = load i64, i64* %22
%135 = load i64, i64* %18
%136 = add nsw i64 %134, %135
store i64 %136, i64* %20
store i64 %136, i64* %21
%137 = load i64, i64* %16
store i64 %137, i64* %23
%138 = load i64, i64* %16
%139 = load i64, i64* %15
%140 = add nsw i64 %138, %139
store i64 %140, i64* %24
%141 = load i64, i64* %15
%142 = add nsw i64 %140, %141
store i64 %142, i64* %25
store i64 2, i64* %13
br label %143
143: ; preds = %323, %129
%144 = load i64, i64* %13
%145 = load i64, i64* %7
%146 = icmp slt i64 %144, %145
br i1 %146, label %147, label %326
147: ; preds = %143
%148 = load i64, i64* %20
%149 = add nsw i64 %148, 2
store i64 %149, i64* %20
%150 = load i64, i64* %21
%151 = sub nsw i64 %150, 2
store i64 %151, i64* %21
%152 = load i64, i64* %22
%153 = add nsw i64 %152, 2
store i64 %153, i64* %22
%154 = load i64, i64* %23
%155 = add nsw i64 %154, 2
store i64 %155, i64* %23
%156 = load i64, i64* %24
%157 = add nsw i64 %156, 2
store i64 %157, i64* %24
%158 = load i64, i64* %25
%159 = add nsw i64 %158, 2
store i64 %159, i64* %25
%160 = load double*, double** %9
%161 = load i64, i64* %20
%162 = sub nsw i64 %161, 1
%163 = getelementptr inbounds double, double* %160, i64 %162
%164 = load double, double* %163
%165 = load double*, double** %9
%166 = load i64, i64* %21
%167 = sub nsw i64 %166, 1
%168 = getelementptr inbounds double, double* %165, i64 %167
%169 = load double, double* %168
%170 = fadd double %164, %169
store double %170, double* %35
%171 = load double*, double** %9
%172 = load i64, i64* %22
%173 = sub nsw i64 %172, 1
%174 = getelementptr inbounds double, double* %171, i64 %173
%175 = load double, double* %174
%176 = load double, double* @dradb3.taur
%177 = load double, double* %35
%178 = call double @llvm.fmuladd.f64(double %176, double %177, double %175)
store double %178, double* %30
%179 = load double*, double** %9
%180 = load i64, i64* %22
%181 = sub nsw i64 %180, 1
%182 = getelementptr inbounds double, double* %179, i64 %181
%183 = load double, double* %182
%184 = load double, double* %35
%185 = fadd double %183, %184
%186 = load double*, double** %10
%187 = load i64, i64* %23
%188 = sub nsw i64 %187, 1
%189 = getelementptr inbounds double, double* %186, i64 %188
store double %185, double* %189
%190 = load double*, double** %9
%191 = load i64, i64* %20
%192 = getelementptr inbounds double, double* %190, i64 %191
%193 = load double, double* %192
%194 = load double*, double** %9
%195 = load i64, i64* %21
%196 = getelementptr inbounds double, double* %194, i64 %195
%197 = load double, double* %196
%198 = fsub double %193, %197
store double %198, double* %34
%199 = load double*, double** %9
%200 = load i64, i64* %22
%201 = getelementptr inbounds double, double* %199, i64 %200
%202 = load double, double* %201
%203 = load double, double* @dradb3.taur
%204 = load double, double* %34
%205 = call double @llvm.fmuladd.f64(double %203, double %204, double %202)
store double %205, double* %26
%206 = load double*, double** %9
%207 = load i64, i64* %22
%208 = getelementptr inbounds double, double* %206, i64 %207
%209 = load double, double* %208
%210 = load double, double* %34
%211 = fadd double %209, %210
%212 = load double*, double** %10
%213 = load i64, i64* %23
%214 = getelementptr inbounds double, double* %212, i64 %213
store double %211, double* %214
%215 = load double, double* @dradb3.taui
%216 = load double*, double** %9
%217 = load i64, i64* %20
%218 = sub nsw i64 %217, 1
%219 = getelementptr inbounds double, double* %216, i64 %218
%220 = load double, double* %219
%221 = load double*, double** %9
%222 = load i64, i64* %21
%223 = sub nsw i64 %222, 1
%224 = getelementptr inbounds double, double* %221, i64 %223
%225 = load double, double* %224
%226 = fsub double %220, %225
%227 = fmul double %215, %226
store double %227, double* %31
%228 = load double, double* @dradb3.taui
%229 = load double*, double** %9
%230 = load i64, i64* %20
%231 = getelementptr inbounds double, double* %229, i64 %230
%232 = load double, double* %231
%233 = load double*, double** %9
%234 = load i64, i64* %21
%235 = getelementptr inbounds double, double* %233, i64 %234
%236 = load double, double* %235
%237 = fadd double %232, %236
%238 = fmul double %228, %237
store double %238, double* %27
%239 = load double, double* %30
%240 = load double, double* %27
%241 = fsub double %239, %240
store double %241, double* %32
%242 = load double, double* %30
%243 = load double, double* %27
%244 = fadd double %242, %243
store double %244, double* %33
%245 = load double, double* %26
%246 = load double, double* %31
%247 = fadd double %245, %246
store double %247, double* %28
%248 = load double, double* %26
%249 = load double, double* %31
%250 = fsub double %248, %249
store double %250, double* %29
%251 = load double*, double** %11
%252 = load i64, i64* %13
%253 = sub nsw i64 %252, 2
%254 = getelementptr inbounds double, double* %251, i64 %253
%255 = load double, double* %254
%256 = load double, double* %32
%257 = load double*, double** %11
%258 = load i64, i64* %13
%259 = sub nsw i64 %258, 1
%260 = getelementptr inbounds double, double* %257, i64 %259
%261 = load double, double* %260
%262 = load double, double* %28
%263 = fmul double %261, %262
%264 = fneg double %263
%265 = call double @llvm.fmuladd.f64(double %255, double %256, double %264)
%266 = load double*, double** %10
%267 = load i64, i64* %24
%268 = sub nsw i64 %267, 1
%269 = getelementptr inbounds double, double* %266, i64 %268
store double %265, double* %269
%270 = load double*, double** %11
%271 = load i64, i64* %13
%272 = sub nsw i64 %271, 2
%273 = getelementptr inbounds double, double* %270, i64 %272
%274 = load double, double* %273
%275 = load double, double* %28
%276 = load double*, double** %11
%277 = load i64, i64* %13
%278 = sub nsw i64 %277, 1
%279 = getelementptr inbounds double, double* %276, i64 %278
%280 = load double, double* %279
%281 = load double, double* %32
%282 = fmul double %280, %281
%283 = call double @llvm.fmuladd.f64(double %274, double %275, double %282)
%284 = load double*, double** %10
%285 = load i64, i64* %24
%286 = getelementptr inbounds double, double* %284, i64 %285
store double %283, double* %286
%287 = load double*, double** %12
%288 = load i64, i64* %13
%289 = sub nsw i64 %288, 2
%290 = getelementptr inbounds double, double* %287, i64 %289
%291 = load double, double* %290
%292 = load double, double* %33
%293 = load double*, double** %12
%294 = load i64, i64* %13
%295 = sub nsw i64 %294, 1
%296 = getelementptr inbounds double, double* %293, i64 %295
%297 = load double, double* %296
%298 = load double, double* %29
%299 = fmul double %297, %298
%300 = fneg double %299
%301 = call double @llvm.fmuladd.f64(double %291, double %292, double %300)
%302 = load double*, double** %10
%303 = load i64, i64* %25
%304 = sub nsw i64 %303, 1
%305 = getelementptr inbounds double, double* %302, i64 %304
store double %301, double* %305
%306 = load double*, double** %12
%307 = load i64, i64* %13
%308 = sub nsw i64 %307, 2
%309 = getelementptr inbounds double, double* %306, i64 %308
%310 = load double, double* %309
%311 = load double, double* %29
%312 = load double*, double** %12
%313 = load i64, i64* %13
%314 = sub nsw i64 %313, 1
%315 = getelementptr inbounds double, double* %312, i64 %314
%316 = load double, double* %315
%317 = load double, double* %33
%318 = fmul double %316, %317
%319 = call double @llvm.fmuladd.f64(double %310, double %311, double %318)
%320 = load double*, double** %10
%321 = load i64, i64* %25
%322 = getelementptr inbounds double, double* %320, i64 %321
store double %319, double* %322
br label %323
323: ; preds = %147
%324 = load i64, i64* %13
%325 = add nsw i64 %324, 2
store i64 %325, i64* %13
br label %143
326: ; preds = %143
%327 = load i64, i64* %7
%328 = load i64, i64* %16
%329 = add nsw i64 %328, %327
store i64 %329, i64* %16
br label %330
330: ; preds = %326
%331 = load i64, i64* %14
%332 = add nsw i64 %331, 1
store i64 %332, i64* %14
br label %125
333: ; preds = %121, %125
ret void
}

LLVM IR (-O2):
define void @dradb3(i64 %0, i64 %1, double* nocapture %2, double* nocapture writeonly %3, double* nocapture %4, double* nocapture %5) {
%7 = mul nsw i64 %1, %0
%8 = shl i64 %7, 1
%9 = shl i64 %0, 1
%10 = mul i64 %0, 3
%11 = icmp sgt i64 %1, 0
br i1 %11, label %12, label %140
12: ; preds = %6, %12
%13 = phi i64 [ %39, %12 ], [ 0, %6 ]
%14 = phi i64 [ %36, %12 ], [ 0, %6 ]
%15 = phi i64 [ %37, %12 ], [ %9, %6 ]
%16 = phi i64 [ %38, %12 ], [ 0, %6 ]
%17 = add nsw i64 %15, -1
%18 = getelementptr inbounds double, double* %2, i64 %17
%19 = load double, double* %18
%20 = fadd double %19, %19
%21 = getelementptr inbounds double, double* %2, i64 %16
%22 = load double, double* %21
%23 = tail call double @llvm.fmuladd.f64(double %20, double -5.000000e-01, double %22)
%24 = fadd double %22, %20
%25 = getelementptr inbounds double, double* %3, i64 %14
store double %24, double* %25
%26 = getelementptr inbounds double, double* %2, i64 %15
%27 = load double, double* %26
%28 = fadd double %27, %27
%29 = fmul double %28, 0x3FEBB67AE8584CAA
%30 = fsub double %23, %29
%31 = add nsw i64 %14, %7
%32 = getelementptr inbounds double, double* %3, i64 %31
store double %30, double* %32
%33 = fadd double %23, %29
%34 = add nsw i64 %14, %8
%35 = getelementptr inbounds double, double* %3, i64 %34
store double %33, double* %35
%36 = add nsw i64 %14, %0
%37 = add nsw i64 %15, %10
%38 = add nsw i64 %16, %10
%39 = add nuw nsw i64 %13, 1
%40 = icmp eq i64 %39, %1
br i1 %40, label %41, label %12
41: ; preds = %12
%42 = icmp ne i64 %0, 1
%43 = and i1 %42, %11
br i1 %43, label %44, label %140
44: ; preds = %41
%45 = icmp sgt i64 %0, 2
br label %46
46: ; preds = %44, %136
%47 = phi i64 [ 0, %44 ], [ %138, %136 ]
%48 = phi i64 [ 0, %44 ], [ %137, %136 ]
%49 = mul i64 %48, 3
%50 = add nsw i64 %49, %9
%51 = add nsw i64 %48, %7
br i1 %45, label %52, label %136
52: ; preds = %46
%53 = add nsw i64 %51, %7
br label %54
54: ; preds = %52, %54
%55 = phi i64 [ %134, %54 ], [ 2, %52 ]
%56 = phi i64 [ %62, %54 ], [ %50, %52 ]
%57 = phi i64 [ %63, %54 ], [ %50, %52 ]
%58 = phi i64 [ %64, %54 ], [ %49, %52 ]
%59 = phi i64 [ %67, %54 ], [ %53, %52 ]
%60 = phi i64 [ %66, %54 ], [ %51, %52 ]
%61 = phi i64 [ %65, %54 ], [ %48, %52 ]
%62 = add nsw i64 %56, 2
%63 = add nsw i64 %57, -2
%64 = add nsw i64 %58, 2
%65 = add nsw i64 %61, 2
%66 = add nsw i64 %60, 2
%67 = add nsw i64 %59, 2
%68 = add nsw i64 %56, 1
%69 = getelementptr inbounds double, double* %2, i64 %68
%70 = load double, double* %69
%71 = add nsw i64 %57, -3
%72 = getelementptr inbounds double, double* %2, i64 %71
%73 = load double, double* %72
%74 = fadd double %70, %73
%75 = add nsw i64 %58, 1
%76 = getelementptr inbounds double, double* %2, i64 %75
%77 = load double, double* %76
%78 = tail call double @llvm.fmuladd.f64(double %74, double -5.000000e-01, double %77)
%79 = fadd double %77, %74
%80 = add nsw i64 %61, 1
%81 = getelementptr inbounds double, double* %3, i64 %80
store double %79, double* %81
%82 = getelementptr inbounds double, double* %2, i64 %62
%83 = load double, double* %82
%84 = getelementptr inbounds double, double* %2, i64 %63
%85 = load double, double* %84
%86 = fsub double %83, %85
%87 = getelementptr inbounds double, double* %2, i64 %64
%88 = load double, double* %87
%89 = tail call double @llvm.fmuladd.f64(double %86, double -5.000000e-01, double %88)
%90 = fadd double %88, %86
%91 = getelementptr inbounds double, double* %3, i64 %65
store double %90, double* %91
%92 = load double, double* %69
%93 = load double, double* %72
%94 = fsub double %92, %93
%95 = fmul double %94, 0x3FEBB67AE8584CAA
%96 = load double, double* %82
%97 = load double, double* %84
%98 = fadd double %96, %97
%99 = fmul double %98, 0x3FEBB67AE8584CAA
%100 = fsub double %78, %99
%101 = fadd double %78, %99
%102 = fadd double %89, %95
%103 = fsub double %89, %95
%104 = add nsw i64 %55, -2
%105 = getelementptr inbounds double, double* %4, i64 %104
%106 = load double, double* %105
%107 = add nsw i64 %55, -1
%108 = getelementptr inbounds double, double* %4, i64 %107
%109 = load double, double* %108
%110 = fneg double %109
%111 = fmul double %102, %110
%112 = tail call double @llvm.fmuladd.f64(double %106, double %100, double %111)
%113 = add nsw i64 %60, 1
%114 = getelementptr inbounds double, double* %3, i64 %113
store double %112, double* %114
%115 = load double, double* %105
%116 = load double, double* %108
%117 = fmul double %100, %116
%118 = tail call double @llvm.fmuladd.f64(double %115, double %102, double %117)
%119 = getelementptr inbounds double, double* %3, i64 %66
store double %118, double* %119
%120 = getelementptr inbounds double, double* %5, i64 %104
%121 = load double, double* %120
%122 = getelementptr inbounds double, double* %5, i64 %107
%123 = load double, double* %122
%124 = fneg double %123
%125 = fmul double %103, %124
%126 = tail call double @llvm.fmuladd.f64(double %121, double %101, double %125)
%127 = add nsw i64 %59, 1
%128 = getelementptr inbounds double, double* %3, i64 %127
store double %126, double* %128
%129 = load double, double* %120
%130 = load double, double* %122
%131 = fmul double %101, %130
%132 = tail call double @llvm.fmuladd.f64(double %129, double %103, double %131)
%133 = getelementptr inbounds double, double* %3, i64 %67
store double %132, double* %133
%134 = add nuw nsw i64 %55, 2
%135 = icmp slt i64 %134, %0
br i1 %135, label %54, label %136
136: ; preds = %54, %46
%137 = add nsw i64 %48, %0
%138 = add nuw nsw i64 %47, 1
%139 = icmp eq i64 %138, %1
br i1 %139, label %140, label %46
140: ; preds = %136, %6, %41
ret void
}