#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double dd_quick_two_sum(double, double, double *);
scalar_t__ fabs(double const);
double qd_quick_three_accum(double *, double *, double);
int /*<<< orphan*/ qd_renorm4(double *, double *, double *, double *);
void qd_add(const double *a, const double *b, double *c) {
  int i, j, k;
  double s, t;
  double u, v;
  double r[4];
  r[0] = 0.0;
  r[1] = 0.0;
  r[2] = 0.0;
  r[3] = 0.0;
  i = 0;
  j = 0;
  k = 0;
  if (fabs(a[i]) > fabs(b[j]))
    u = a[i++];
  else
    u = b[j++];
  if (fabs(a[i]) > fabs(b[j]))
    v = a[i++];
  else
    v = b[j++];
  u = dd_quick_two_sum(u, v, &v);
  while (k < 4) {
    if (i >= 4 && j >= 4) {
      r[k] = u;
      if (k < 3)
        r[++k] = v;
      break;
    }
    if (i >= 4)
      t = b[j++];
    else if (j >= 4)
      t = a[i++];
    else if (fabs(a[i]) > fabs(b[j]))
      t = a[i++];
    else
      t = b[j++];
    s = qd_quick_three_accum(&u, &v, t);
    if (s != 0.0)
      r[k++] = s;
  }
  for (k = i; k < 4; k++)
    r[3] += a[k];
  for (k = j; k < 4; k++)
    r[3] += b[k];
  qd_renorm4(&r[0], &r[1], &r[2], &r[3]);
  c[0] = r[0];
  c[1] = r[1];
  c[2] = r[2];
  c[3] = r[3];
}


x86 assembly (clang, -O0):
<qd_add>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1060 <fabs@plt>
mov    %rax,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1060 <fabs@plt>
mov    %rax,%rcx
mov    -0x78(%rbp),%rax
cmp    %rcx,%rax
jle    11e5 <qd_add+0xa5>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    1201 <qd_add+0xc1>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1060 <fabs@plt>
mov    %rax,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1060 <fabs@plt>
mov    %rax,%rcx
mov    -0x80(%rbp),%rax
cmp    %rcx,%rax
jle    125a <qd_add+0x11a>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    1276 <qd_add+0x136>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
lea    -0x48(%rbp),%rdi
call   1050 <dd_quick_two_sum@plt>
movsd  %xmm0,-0x40(%rbp)
cmpl   $0x4,-0x24(%rbp)
jge    140c <qd_add+0x2cc>
cmpl   $0x4,-0x1c(%rbp)
jl     12e0 <qd_add+0x1a0>
cmpl   $0x4,-0x20(%rbp)
jl     12e0 <qd_add+0x1a0>
movsd  -0x40(%rbp),%xmm0
movslq -0x24(%rbp),%rax
movsd  %xmm0,-0x70(%rbp,%rax,8)
cmpl   $0x3,-0x24(%rbp)
jge    12db <qd_add+0x19b>
movsd  -0x48(%rbp),%xmm0
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
cltq
movsd  %xmm0,-0x70(%rbp,%rax,8)
jmp    140c <qd_add+0x2cc>
cmpl   $0x4,-0x1c(%rbp)
jl     130b <qd_add+0x1cb>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    13bb <qd_add+0x27b>
cmpl   $0x4,-0x20(%rbp)
jl     1336 <qd_add+0x1f6>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    13b6 <qd_add+0x276>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1060 <fabs@plt>
mov    %rax,-0x88(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1060 <fabs@plt>
mov    %rax,%rcx
mov    -0x88(%rbp),%rax
cmp    %rcx,%rax
jle    1395 <qd_add+0x255>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    13b1 <qd_add+0x271>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    13b6 <qd_add+0x276>
jmp    13bb <qd_add+0x27b>
movsd  -0x38(%rbp),%xmm0
lea    -0x40(%rbp),%rdi
lea    -0x48(%rbp),%rsi
call   1030 <qd_quick_three_accum@plt>
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13ef <qd_add+0x2af>
jp     13ef <qd_add+0x2af>
jmp    1407 <qd_add+0x2c7>
movsd  -0x30(%rbp),%xmm0
mov    -0x24(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x24(%rbp)
cltq
movsd  %xmm0,-0x70(%rbp,%rax,8)
jmp    128e <qd_add+0x14e>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x4,-0x24(%rbp)
jge    1441 <qd_add+0x301>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1412 <qd_add+0x2d2>
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x4,-0x24(%rbp)
jge    1476 <qd_add+0x336>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1447 <qd_add+0x307>
lea    -0x70(%rbp),%rdi
lea    -0x70(%rbp),%rsi
add    $0x8,%rsi
lea    -0x70(%rbp),%rdx
add    $0x10,%rdx
lea    -0x70(%rbp),%rcx
add    $0x18,%rcx
call   1040 <qd_renorm4@plt>
movsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x18(%rax)
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<qd_add>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %rdx,0x60(%rsp)
mov    %rsi,%rbp
mov    %rdi,%rbx
xorps  %xmm0,%xmm0
movaps %xmm0,0x40(%rsp)
movaps %xmm0,0x30(%rsp)
movsd  (%rdi),%xmm0
call   1060 <fabs@plt>
mov    %rax,%r12
movsd  0x0(%rbp),%xmm0
call   1060 <fabs@plt>
xor    %r15d,%r15d
xor    %r14d,%r14d
cmp    %rax,%r12
setg   %r15b
mov    %rbp,%rax
cmovg  %rbx,%rax
setle  %r14b
movsd  (%rax),%xmm0
movsd  %xmm0,0x28(%rsp)
lea    (%rbx,%r15,8),%r13
mov    %rbx,0x8(%rsp)
movsd  (%rbx,%r15,8),%xmm0
call   1060 <fabs@plt>
mov    %rax,0x58(%rsp)
lea    0x0(,%r14,8),%rbx
add    %rbp,%rbx
mov    %rbp,0x10(%rsp)
movsd  0x0(%rbp,%r14,8),%xmm0
call   1060 <fabs@plt>
mov    $0x2,%r12d
sub    %r15d,%r12d
lea    0x1(%r15),%ebp
cmp    %rax,0x58(%rsp)
cmovg  %r13,%rbx
cmovg  %r14d,%r12d
cmovle %r15d,%ebp
movsd  (%rbx),%xmm1
movsd  %xmm1,0x18(%rsp)
lea    0x18(%rsp),%r15
movsd  0x28(%rsp),%xmm0
mov    %r15,%rdi
call   1050 <dd_quick_two_sum@plt>
movsd  %xmm0,0x20(%rsp)
xor    %r14d,%r14d
lea    0x20(%rsp),%rbx
jmp    122a <qd_add+0xea>
xchg   %ax,%ax
cmp    $0x4,%r14d
jge    131d <qd_add+0x1dd>
cmp    $0x4,%ebp
jl     1239 <qd_add+0xf9>
cmp    $0x4,%r12d
jge    12f1 <qd_add+0x1b1>
cmp    $0x4,%ebp
jl     1250 <qd_add+0x110>
movslq %r12d,%rax
add    $0x1,%r12d
mov    0x10(%rsp),%rcx
lea    (%rcx,%rax,8),%rax
jmp    12c0 <qd_add+0x180>
movslq %ebp,%r13
cmp    $0x4,%r12d
mov    0x8(%rsp),%rax
jl     1270 <qd_add+0x130>
add    $0x1,%ebp
lea    (%rax,%r13,8),%rax
jmp    12c0 <qd_add+0x180>
nopw   0x0(%rax,%rax,1)
movsd  (%rax,%r13,8),%xmm0
call   1060 <fabs@plt>
mov    %rax,0x28(%rsp)
movslq %r12d,%rbx
mov    %r12d,%r15d
mov    0x10(%rsp),%r12
movsd  (%r12,%rbx,8),%xmm0
call   1060 <fabs@plt>
cmp    %rax,0x28(%rsp)
jle    12ab <qd_add+0x16b>
mov    0x8(%rsp),%rax
lea    (%rax,%r13,8),%rax
add    $0x1,%ebp
jmp    12b3 <qd_add+0x173>
lea    (%r12,%rbx,8),%rax
add    $0x1,%r15d
mov    %r15d,%r12d
lea    0x18(%rsp),%r15
lea    0x20(%rsp),%rbx
movsd  (%rax),%xmm0
mov    %rbx,%rdi
mov    %r15,%rsi
call   1030 <qd_quick_three_accum@plt>
ucomisd 0xd29(%rip),%xmm0
jne    12df <qd_add+0x19f>
jnp    1220 <qd_add+0xe0>
movslq %r14d,%rax
add    $0x1,%r14d
movsd  %xmm0,0x30(%rsp,%rax,8)
jmp    1220 <qd_add+0xe0>
movsd  0x20(%rsp),%xmm0
movslq %r14d,%rax
movsd  %xmm0,0x30(%rsp,%rax,8)
cmp    $0x2,%r14d
jg     1312 <qd_add+0x1d2>
movsd  0x18(%rsp),%xmm0
movsd  %xmm0,0x38(%rsp,%rax,8)
movsd  0x48(%rsp),%xmm0
jmp    1428 <qd_add+0x2e8>
movsd  0x48(%rsp),%xmm0
cmp    $0x3,%ebp
jg     1360 <qd_add+0x220>
movslq %ebp,%rax
mov    $0x4,%ecx
sub    %ebp,%ecx
and    $0x7,%ecx
mov    0x10(%rsp),%rdx
je     1367 <qd_add+0x227>
mov    0x8(%rsp),%rsi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
addsd  (%rsi,%rax,8),%xmm0
add    $0x1,%rax
add    $0xffffffff,%ecx
jne    1350 <qd_add+0x210>
jmp    136c <qd_add+0x22c>
mov    0x10(%rsp),%rdx
jmp    13b8 <qd_add+0x278>
mov    0x8(%rsp),%rsi
add    $0x3,%ebp
cmp    $0x7,%ebp
jb     13b8 <qd_add+0x278>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
addsd  (%rsi,%rax,8),%xmm0
addsd  0x8(%rsi,%rax,8),%xmm0
addsd  0x10(%rsi,%rax,8),%xmm0
addsd  0x18(%rsi,%rax,8),%xmm0
addsd  0x20(%rsi,%rax,8),%xmm0
addsd  0x28(%rsi,%rax,8),%xmm0
addsd  0x30(%rsi,%rax,8),%xmm0
addsd  0x38(%rsi,%rax,8),%xmm0
add    $0x8,%rax
cmp    $0x4,%eax
jne    1380 <qd_add+0x240>
cmp    $0x3,%r12d
jg     1428 <qd_add+0x2e8>
movslq %r12d,%rax
mov    $0x4,%ecx
sub    %r12d,%ecx
and    $0x7,%ecx
je     13de <qd_add+0x29e>
xchg   %ax,%ax
addsd  (%rdx,%rax,8),%xmm0
add    $0x1,%rax
add    $0xffffffff,%ecx
jne    13d0 <qd_add+0x290>
add    $0x3,%r12d
cmp    $0x7,%r12d
jb     1428 <qd_add+0x2e8>
nopl   0x0(%rax,%rax,1)
addsd  (%rdx,%rax,8),%xmm0
addsd  0x8(%rdx,%rax,8),%xmm0
addsd  0x10(%rdx,%rax,8),%xmm0
addsd  0x18(%rdx,%rax,8),%xmm0
addsd  0x20(%rdx,%rax,8),%xmm0
addsd  0x28(%rdx,%rax,8),%xmm0
addsd  0x30(%rdx,%rax,8),%xmm0
addsd  0x38(%rdx,%rax,8),%xmm0
add    $0x8,%rax
cmp    $0x4,%eax
jne    13f0 <qd_add+0x2b0>
lea    0x38(%rsp),%rsi
movsd  %xmm0,0x48(%rsp)
lea    0x30(%rsp),%rdi
lea    0x40(%rsp),%rdx
lea    0x48(%rsp),%rcx
call   1040 <qd_renorm4@plt>
movaps 0x30(%rsp),%xmm0
mov    0x60(%rsp),%rax
movups %xmm0,(%rax)
movaps 0x40(%rsp),%xmm0
movups %xmm0,0x10(%rax)
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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