void dradb2(int ido, int l1, double *cc, double *ch, double *wa1) {
  int i, k, t0, t1, t2, t3, t4, t5, t6;
  double ti2, tr2;
  t0 = l1 * ido;
  t1 = 0;
  t2 = 0;
  t3 = (ido << 1) - 1;
  for (k = 0; k < l1; k++) {
    ch[t1] = cc[t2] + cc[t3 + t2];
    ch[t1 + t0] = cc[t2] - cc[t3 + t2];
    t2 = (t1 += ido) << 1;
  }
  if (ido < 2)
    return;
  if (ido == 2)
    goto L105;
  t1 = 0;
  t2 = 0;
  for (k = 0; k < l1; k++) {
    t3 = t1;
    t5 = (t4 = t2) + (ido << 1);
    t6 = t0 + t1;
    for (i = 2; i < ido; i += 2) {
      t3 += 2;
      t4 += 2;
      t5 -= 2;
      t6 += 2;
      ch[t3 - 1] = cc[t4 - 1] + cc[t5 - 1];
      tr2 = cc[t4 - 1] - cc[t5 - 1];
      ch[t3] = cc[t4] - cc[t5];
      ti2 = cc[t4] + cc[t5];
      ch[t6 - 1] = wa1[i - 2] * tr2 - wa1[i - 1] * ti2;
      ch[t6] = wa1[i - 2] * ti2 + wa1[i - 1] * tr2;
    }
    t2 = (t1 += ido) << 1;
  }
  if (ido % 2 == 1)
    return;
L105:
  t1 = ido - 1;
  t2 = ido - 1;
  for (k = 0; k < l1; k++) {
    ch[t1] = cc[t2] + cc[t2];
    ch[t1 + t0] = -(cc[t2 + 1] + cc[t2 + 1]);
    t1 += ido;
    t2 += ido << 1;
  }
}


x86 assembly (clang, -O0):
<dradb2>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    -0x8(%rbp),%eax
imul   -0x4(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x1,%eax
sub    $0x1,%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    11c7 <dradb2+0xc7>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
shl    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1141 <dradb2+0x41>
cmpl   $0x2,-0x4(%rbp)
jge    11d6 <dradb2+0xd6>
jmp    14a9 <dradb2+0x3a9>
cmpl   $0x2,-0x4(%rbp)
jne    11e5 <dradb2+0xe5>
jmp    13ed <dradb2+0x2ed>
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    13cf <dradb2+0x2cf>
mov    -0x30(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
mov    %eax,-0x40(%rbp)
mov    -0x2c(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x44(%rbp)
movl   $0x2,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    13b2 <dradb2+0x2b2>
mov    -0x38(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x40(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x40(%rbp)
mov    -0x44(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x44(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x40(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x40(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x58(%rbp),%xmm2
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0x50(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x50(%rbp),%xmm2
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    122d <dradb2+0x12d>
mov    -0x4(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
shl    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    11fa <dradb2+0xfa>
mov    -0x4(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x1,%edx
jne    13e8 <dradb2+0x2e8>
jmp    14a9 <dradb2+0x3a9>
jmp    13ed <dradb2+0x2ed>
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    14a9 <dradb2+0x3a9>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x1,%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1406 <dradb2+0x306>
pop    %rbp
ret

x86 assembly (clang, -O2):
<dradb2>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %esi,%r15d
imul   %edi,%r15d
mov    %rdi,-0x30(%rsp)
lea    (%rdi,%rdi,1),%r12d
test   %esi,%esi
jle    1174 <dradb2+0x74>
mov    -0x30(%rsp),%rax
lea    (%rax,%rax,1),%r9d
add    $0xffffffff,%r9d
movslq %eax,%r11
movslq %r15d,%r10
shl    $0x3,%r11
xor    %eax,%eax
mov    %esi,%edi
mov    %rcx,%rbp
nopl   0x0(%rax)
cltq
movsd  (%rdx,%rax,8),%xmm0
lea    (%r9,%rax,1),%ebx
movslq %ebx,%rbx
addsd  (%rdx,%rbx,8),%xmm0
movsd  %xmm0,0x0(%rbp)
movsd  (%rdx,%rax,8),%xmm0
subsd  (%rdx,%rbx,8),%xmm0
movsd  %xmm0,0x0(%rbp,%r10,8)
add    %r11,%rbp
add    %r12d,%eax
add    $0xffffffff,%edi
jne    1140 <dradb2+0x40>
cmpl   $0x2,-0x30(%rsp)
jl     134a <dradb2+0x24a>
jne    1193 <dradb2+0x93>
mov    $0x1,%eax
test   %esi,%esi
jg     12ef <dradb2+0x1ef>
jmp    134a <dradb2+0x24a>
test   %esi,%esi
jle    134a <dradb2+0x24a>
mov    %esi,-0x28(%rsp)
mov    -0x30(%rsp),%eax
lea    0x0(,%rax,8),%rdi
mov    %rdi,-0x10(%rsp)
lea    -0x10(%rdx),%rdi
mov    %rdi,-0x18(%rsp)
xor    %esi,%esi
mov    %rcx,%rbx
mov    %r12,-0x20(%rsp)
mov    %r15d,-0x24(%rsp)
xor    %r13d,%r13d
mov    %rcx,-0x8(%rsp)
mov    -0x18(%rsp),%rbp
cs nopw 0x0(%rax,%rax,1)
nop
movslq %esi,%rdi
lea    (%rdx,%rdi,8),%r9
movslq %r12d,%rdi
lea    0x0(,%rdi,8),%r11
add    %rbp,%r11
movslq %r15d,%rdi
lea    (%rcx,%rdi,8),%r14
mov    $0x2,%r10d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  -0x8(%r9,%r10,8),%xmm0
addsd  -0x8(%r11),%xmm0
movsd  %xmm0,-0x8(%rbx,%r10,8)
movsd  -0x8(%r9,%r10,8),%xmm0
movsd  (%r9,%r10,8),%xmm1
subsd  -0x8(%r11),%xmm0
subsd  (%r11),%xmm1
movsd  %xmm1,(%rbx,%r10,8)
movsd  (%r9,%r10,8),%xmm1
addsd  (%r11),%xmm1
movsd  -0x8(%r8,%r10,8),%xmm2
mulsd  %xmm1,%xmm2
movsd  -0x10(%r8,%r10,8),%xmm3
mulsd  %xmm0,%xmm3
subsd  %xmm2,%xmm3
movsd  %xmm3,-0x8(%r14,%r10,8)
mulsd  -0x8(%r8,%r10,8),%xmm0
mulsd  -0x10(%r8,%r10,8),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%r14,%r10,8)
add    $0x2,%r10
add    $0xfffffffffffffff0,%r11
cmp    %rax,%r10
jb     1210 <dradb2+0x110>
add    $0x1,%r13d
add    -0x30(%rsp),%r15d
mov    -0x20(%rsp),%rcx
add    %ecx,%r12d
add    %ecx,%esi
add    -0x10(%rsp),%rbx
cmp    -0x28(%rsp),%r13d
mov    -0x8(%rsp),%rcx
jne    11e0 <dradb2+0xe0>
mov    -0x30(%rsp),%rdi
mov    %edi,%eax
shr    $0x1f,%eax
add    %edi,%eax
and    $0xfffffffe,%eax
sub    %eax,%edi
cmp    $0x1,%edi
mov    -0x24(%rsp),%r15d
mov    -0x20(%rsp),%r12
mov    -0x28(%rsp),%esi
je     134a <dradb2+0x24a>
test   %esi,%esi
jle    134a <dradb2+0x24a>
mov    -0x30(%rsp),%rax
add    $0xffffffff,%eax
cltq
movslq %r12d,%rdi
movslq -0x30(%rsp),%rbp
movslq %r15d,%rbx
shl    $0x3,%rbp
lea    (%rcx,%rbx,8),%rbx
lea    (%rdx,%rax,8),%rdx
add    $0x8,%rdx
shl    $0x3,%rax
shl    $0x3,%rdi
movapd 0xce4(%rip),%xmm0
nopl   0x0(%rax)
movsd  -0x8(%rdx),%xmm1
addsd  %xmm1,%xmm1
movsd  %xmm1,(%rcx,%rax,1)
movsd  (%rdx),%xmm1
addsd  %xmm1,%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,(%rbx,%rax,1)
add    %rbp,%rax
add    %rdi,%rdx
add    $0xffffffff,%esi
jne    1320 <dradb2+0x220>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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