double ddotRef(int *n, double *dx, int *incx, double *dy, int *incy) {
  int i, m;
  double dtemp;
  int ix, iy;
  dtemp = 0.;
  if (*n <= 0) {
    return 0.;
  }
  if (*incx != 1 || *incy != 1) {
    ix = 1;
    iy = 1;
    if (*incx < 0) {
      ix = (-(*n) + 1) * *incx + 1;
    }
    if (*incy < 0) {
      iy = (-(*n) + 1) * *incy + 1;
    }
    for (i = 1; i <= *n; ++i) {
      dtemp += dx[(ix)-1] * dy[(iy)-1];
      ix += *incx;
      iy += *incy;
    }
    return dtemp;
  }
  m = *n % 5;
  if (m != 0) {
    for (i = 1; i <= m; ++i)
      dtemp += dx[(i)-1] * dy[(i)-1];
    if (*n < 5)
      return dtemp;
  }
  for (i = m + 1; i <= *n; i += 5) {
    dtemp = dtemp + dx[(i)-1] * dy[(i)-1] + dx[(i + 1) - 1] * dy[(i + 1) - 1] +
            dx[(i + 2) - 1] * dy[(i + 2) - 1] +
            dx[(i + 3) - 1] * dy[(i + 3) - 1] +
            dx[(i + 4) - 1] * dy[(i + 4) - 1];
  }
  return dtemp;
}


x86 assembly (clang, -O0):
<ddotRef>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
jg     113a <ddotRef+0x3a>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13ee <ddotRef+0x2ee>
mov    -0x20(%rbp),%rax
cmpl   $0x1,(%rax)
jne    1154 <ddotRef+0x54>
mov    -0x30(%rbp),%rax
cmpl   $0x1,(%rax)
je     122d <ddotRef+0x12d>
movl   $0x1,-0x44(%rbp)
movl   $0x1,-0x48(%rbp)
mov    -0x20(%rbp),%rax
cmpl   $0x0,(%rax)
jge    1187 <ddotRef+0x87>
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
sub    (%rcx),%eax
add    $0x1,%eax
mov    -0x20(%rbp),%rcx
imul   (%rcx),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x30(%rbp),%rax
cmpl   $0x0,(%rax)
jge    11ac <ddotRef+0xac>
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
sub    (%rcx),%eax
add    $0x1,%eax
mov    -0x30(%rbp),%rcx
imul   (%rcx),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
movl   $0x1,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jg     121e <ddotRef+0x11e>
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
add    -0x48(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11b3 <ddotRef+0xb3>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13ee <ddotRef+0x2ee>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    %edx,-0x38(%rbp)
cmpl   $0x0,-0x38(%rbp)
je     12c0 <ddotRef+0x1c0>
movl   $0x1,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x38(%rbp),%eax
jg     129f <ddotRef+0x19f>
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    124f <ddotRef+0x14f>
mov    -0x10(%rbp),%rax
cmpl   $0x5,(%rax)
jge    12bb <ddotRef+0x1bb>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13ee <ddotRef+0x2ee>
jmp    12c0 <ddotRef+0x1c0>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jg     13e4 <ddotRef+0x2e4>
movsd  -0x40(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x2,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x2,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x3,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x3,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x4,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x4,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x34(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x34(%rbp)
jmp    12c9 <ddotRef+0x1c9>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<ddotRef>:
push   %r15
push   %r14
push   %rbx
mov    (%rdi),%r9d
test   %r9d,%r9d
jle    1163 <ddotRef+0x63>
movslq (%rdx),%r10
cmp    $0x1,%r10
jne    116c <ddotRef+0x6c>
mov    (%r8),%edx
cmp    $0x1,%edx
jne    1190 <ddotRef+0x90>
mov    $0xcccccccd,%eax
imul   %r9,%rax
shr    $0x22,%rax
lea    (%rax,%rax,4),%edx
mov    %r9d,%r8d
sub    %edx,%r8d
je     1242 <ddotRef+0x142>
lea    (%rax,%rax,4),%edx
mov    %r9d,%eax
sub    %edx,%eax
lea    -0x1(%rax),%rdx
mov    %eax,%edi
and    $0x3,%edi
cmp    $0x3,%rdx
jae    124b <ddotRef+0x14b>
xorpd  %xmm0,%xmm0
mov    $0x1,%edx
jmp    12b0 <ddotRef+0x1b0>
xorpd  %xmm0,%xmm0
jmp    123c <ddotRef+0x13c>
mov    $0x1,%edx
mov    $0x1,%eax
sub    %r9d,%eax
mov    %r10d,%edi
imul   %eax,%edi
add    $0x1,%edi
test   %r10d,%r10d
cmovns %edx,%edi
mov    (%r8),%edx
movslq %edi,%rdi
jmp    119d <ddotRef+0x9d>
mov    $0x1,%eax
sub    %r9d,%eax
mov    $0x1,%edi
imul   %edx,%eax
add    $0x1,%eax
test   %edx,%edx
mov    $0x1,%ebx
cmovs  %eax,%ebx
movslq %ebx,%rax
cmp    $0x1,%r9d
jne    11bc <ddotRef+0xbc>
xorpd  %xmm0,%xmm0
jmp    1222 <ddotRef+0x122>
movslq %edx,%r8
mov    %r9d,%edx
and    $0xfffffffe,%edx
lea    (%rsi,%r10,8),%r11
add    $0xfffffffffffffff8,%r11
lea    (%rcx,%rax,8),%rbx
add    $0xfffffffffffffff8,%rbx
mov    %r8,%r14
shl    $0x4,%r14
lea    (%rcx,%r8,8),%r15
add    $0xfffffffffffffff8,%r15
xorpd  %xmm0,%xmm0
nopl   0x0(%rax,%rax,1)
movsd  -0x8(%rsi,%rdi,8),%xmm1
mulsd  (%rbx),%xmm1
addsd  %xmm0,%xmm1
movsd  (%r11,%rdi,8),%xmm0
add    %r10,%rdi
mulsd  (%r15,%rax,8),%xmm0
add    %r8,%rax
addsd  %xmm1,%xmm0
add    %r10,%rdi
add    %r8,%rax
add    %r14,%rbx
add    $0xfffffffe,%edx
jne    11f0 <ddotRef+0xf0>
test   $0x1,%r9b
je     123c <ddotRef+0x13c>
movsd  -0x8(%rsi,%rdi,8),%xmm1
mulsd  -0x8(%rcx,%rax,8),%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
pop    %rbx
pop    %r14
pop    %r15
ret
xorpd  %xmm0,%xmm0
jmp    12f1 <ddotRef+0x1f1>
and    $0xfffffffc,%eax
neg    %rax
xorpd  %xmm0,%xmm0
mov    $0x1,%edx
nopw   0x0(%rax,%rax,1)
movsd  -0x8(%rsi,%rdx,8),%xmm1
mulsd  -0x8(%rcx,%rdx,8),%xmm1
movsd  (%rsi,%rdx,8),%xmm2
addsd  %xmm0,%xmm1
mulsd  (%rcx,%rdx,8),%xmm2
addsd  %xmm1,%xmm2
movsd  0x8(%rsi,%rdx,8),%xmm1
mulsd  0x8(%rcx,%rdx,8),%xmm1
addsd  %xmm2,%xmm1
movsd  0x10(%rsi,%rdx,8),%xmm0
mulsd  0x10(%rcx,%rdx,8),%xmm0
addsd  %xmm1,%xmm0
lea    (%rax,%rdx,1),%rbx
add    $0x4,%rbx
add    $0x4,%rdx
cmp    $0x1,%rbx
jne    1260 <ddotRef+0x160>
test   %rdi,%rdi
je     12e7 <ddotRef+0x1e7>
lea    (%rcx,%rdx,8),%rax
add    $0xfffffffffffffff8,%rax
lea    (%rsi,%rdx,8),%rdx
add    $0xfffffffffffffff8,%rdx
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movsd  (%rdx,%rbx,8),%xmm1
mulsd  (%rax,%rbx,8),%xmm1
addsd  %xmm1,%xmm0
add    $0x1,%rbx
cmp    %rbx,%rdi
jne    12d0 <ddotRef+0x1d0>
cmp    $0x5,%r9d
jl     123c <ddotRef+0x13c>
cmp    %r9d,%r8d
jge    123c <ddotRef+0x13c>
mov    %r8d,%eax
add    $0x4,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    -0x3(%rax),%edx
movsd  -0x20(%rsi,%rax,8),%xmm1
mulsd  -0x20(%rcx,%rax,8),%xmm1
addsd  %xmm0,%xmm1
movsd  (%rsi,%rdx,8),%xmm0
mulsd  (%rcx,%rdx,8),%xmm0
lea    -0x2(%rax),%edx
movsd  (%rsi,%rdx,8),%xmm2
mulsd  (%rcx,%rdx,8),%xmm2
addsd  %xmm1,%xmm0
addsd  %xmm0,%xmm2
lea    -0x1(%rax),%edx
movsd  (%rsi,%rdx,8),%xmm1
mulsd  (%rcx,%rdx,8),%xmm1
addsd  %xmm2,%xmm1
mov    %eax,%edx
shl    $0x3,%rdx
movsd  (%rsi,%rdx,1),%xmm0
mulsd  (%rcx,%rdx,1),%xmm0
addsd  %xmm1,%xmm0
lea    0x5(%rax),%rdx
add    $0x2,%rax
cmp    %r9,%rax
mov    %rdx,%rax
jbe    1310 <ddotRef+0x210>
jmp    123c <ddotRef+0x13c>

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

LLVM IR (-O2):
define double @ddotRef(i32* nocapture %0, double* nocapture %1, i32* nocapture %2, double* nocapture %3, i32* nocapture %4) {
%6 = load i32, i32* %0
%7 = icmp slt i32 %6, 1
br i1 %7, label %187, label %8
8: ; preds = %5
%9 = load i32, i32* %2
%10 = icmp eq i32 %9, 1
br i1 %10, label %11, label %16
11: ; preds = %8
%12 = load i32, i32* %4
%13 = icmp eq i32 %12, 1
br i1 %13, label %64, label %14
14: ; preds = %11
%15 = sub nsw i32 1, %6
br label %24
16: ; preds = %8
%17 = icmp slt i32 %9, 0
%18 = sub nsw i32 1, %6
%19 = mul nsw i32 %9, %18
%20 = add nsw i32 %19, 1
%21 = select i1 %17, i32 %20, i32 1
%22 = load i32, i32* %4
%23 = sext i32 %21 to i64
br label %24
24: ; preds = %16, %14
%25 = phi i32 [ %15, %14 ], [ %18, %16 ]
%26 = phi i32 [ %12, %14 ], [ %22, %16 ]
%27 = phi i64 [ 1, %14 ], [ %23, %16 ]
%28 = icmp slt i32 %26, 0
%29 = mul nsw i32 %26, %25
%30 = add nsw i32 %29, 1
%31 = select i1 %28, i32 %30, i32 1
%32 = sext i32 %31 to i64
%33 = sext i32 %26 to i64
%34 = sext i32 %9 to i64
%35 = and i32 %6, 1
%36 = icmp eq i32 %6, 1
br i1 %36, label %173, label %37
37: ; preds = %24
%38 = and i32 %6, -2
br label %39
39: ; preds = %39, %37
%40 = phi i64 [ %27, %37 ], [ %60, %39 ]
%41 = phi i64 [ %32, %37 ], [ %61, %39 ]
%42 = phi double [ 0.000000e+00, %37 ], [ %59, %39 ]
%43 = phi i32 [ 0, %37 ], [ %62, %39 ]
%44 = add nsw i64 %40, -1
%45 = getelementptr inbounds double, double* %1, i64 %44
%46 = load double, double* %45
%47 = add nsw i64 %41, -1
%48 = getelementptr inbounds double, double* %3, i64 %47
%49 = load double, double* %48
%50 = tail call double @llvm.fmuladd.f64(double %46, double %49, double %42)
%51 = add i64 %40, %34
%52 = add i64 %41, %33
%53 = add nsw i64 %51, -1
%54 = getelementptr inbounds double, double* %1, i64 %53
%55 = load double, double* %54
%56 = add nsw i64 %52, -1
%57 = getelementptr inbounds double, double* %3, i64 %56
%58 = load double, double* %57
%59 = tail call double @llvm.fmuladd.f64(double %55, double %58, double %50)
%60 = add i64 %51, %34
%61 = add i64 %52, %33
%62 = add i32 %43, 2
%63 = icmp eq i32 %62, %38
br i1 %63, label %173, label %39
64: ; preds = %11
%65 = urem i32 %6, 5
%66 = icmp eq i32 %65, 0
br i1 %66, label %128, label %67
67: ; preds = %64
%68 = urem i32 %6, 5
%69 = add nuw nsw i32 %68, 1
%70 = zext i32 %69 to i64
%71 = add nsw i64 %70, -1
%72 = add nsw i64 %70, -2
%73 = and i64 %71, 3
%74 = icmp ult i64 %72, 3
br i1 %74, label %107, label %75
75: ; preds = %67
%76 = and i64 %71, -4
br label %77
77: ; preds = %77, %75
%78 = phi i64 [ 1, %75 ], [ %104, %77 ]
%79 = phi double [ 0.000000e+00, %75 ], [ %103, %77 ]
%80 = phi i64 [ 0, %75 ], [ %105, %77 ]
%81 = add nsw i64 %78, -1
%82 = getelementptr inbounds double, double* %1, i64 %81
%83 = load double, double* %82
%84 = getelementptr inbounds double, double* %3, i64 %81
%85 = load double, double* %84
%86 = tail call double @llvm.fmuladd.f64(double %83, double %85, double %79)
%87 = add nuw nsw i64 %78, 1
%88 = getelementptr inbounds double, double* %1, i64 %78
%89 = load double, double* %88
%90 = getelementptr inbounds double, double* %3, i64 %78
%91 = load double, double* %90
%92 = tail call double @llvm.fmuladd.f64(double %89, double %91, double %86)
%93 = add nuw nsw i64 %78, 2
%94 = getelementptr inbounds double, double* %1, i64 %87
%95 = load double, double* %94
%96 = getelementptr inbounds double, double* %3, i64 %87
%97 = load double, double* %96
%98 = tail call double @llvm.fmuladd.f64(double %95, double %97, double %92)
%99 = getelementptr inbounds double, double* %1, i64 %93
%100 = load double, double* %99
%101 = getelementptr inbounds double, double* %3, i64 %93
%102 = load double, double* %101
%103 = tail call double @llvm.fmuladd.f64(double %100, double %102, double %98)
%104 = add nuw nsw i64 %78, 4
%105 = add nuw i64 %80, 4
%106 = icmp eq i64 %105, %76
br i1 %106, label %107, label %77
107: ; preds = %77, %67
%108 = phi double [ undef, %67 ], [ %103, %77 ]
%109 = phi i64 [ 1, %67 ], [ %104, %77 ]
%110 = phi double [ 0.000000e+00, %67 ], [ %103, %77 ]
%111 = icmp eq i64 %73, 0
br i1 %111, label %125, label %112
112: ; preds = %107, %112
%113 = phi i64 [ %122, %112 ], [ %109, %107 ]
%114 = phi double [ %121, %112 ], [ %110, %107 ]
%115 = phi i64 [ %123, %112 ], [ 0, %107 ]
%116 = add nsw i64 %113, -1
%117 = getelementptr inbounds double, double* %1, i64 %116
%118 = load double, double* %117
%119 = getelementptr inbounds double, double* %3, i64 %116
%120 = load double, double* %119
%121 = tail call double @llvm.fmuladd.f64(double %118, double %120, double %114)
%122 = add nuw nsw i64 %113, 1
%123 = add i64 %115, 1
%124 = icmp eq i64 %123, %73
br i1 %124, label %125, label %112
125: ; preds = %112, %107
%126 = phi double [ %108, %107 ], [ %121, %112 ]
%127 = icmp slt i32 %6, 5
br i1 %127, label %187, label %128
128: ; preds = %125, %64
%129 = phi double [ %126, %125 ], [ 0.000000e+00, %64 ]
%130 = icmp slt i32 %65, %6
br i1 %130, label %131, label %187
131: ; preds = %128
%132 = add nuw nsw i32 %65, 1
%133 = zext i32 %132 to i64
%134 = zext i32 %6 to i64
br label %135
135: ; preds = %131, %135
%136 = phi i64 [ %133, %131 ], [ %171, %135 ]
%137 = phi double [ %129, %131 ], [ %170, %135 ]
%138 = add nsw i64 %136, -1
%139 = getelementptr inbounds double, double* %1, i64 %138
%140 = load double, double* %139
%141 = getelementptr inbounds double, double* %3, i64 %138
%142 = load double, double* %141
%143 = tail call double @llvm.fmuladd.f64(double %140, double %142, double %137)
%144 = and i64 %136, 4294967295
%145 = getelementptr inbounds double, double* %1, i64 %144
%146 = load double, double* %145
%147 = getelementptr inbounds double, double* %3, i64 %144
%148 = load double, double* %147
%149 = tail call double @llvm.fmuladd.f64(double %146, double %148, double %143)
%150 = add nuw i64 %136, 1
%151 = and i64 %150, 4294967295
%152 = getelementptr inbounds double, double* %1, i64 %151
%153 = load double, double* %152
%154 = getelementptr inbounds double, double* %3, i64 %151
%155 = load double, double* %154
%156 = tail call double @llvm.fmuladd.f64(double %153, double %155, double %149)
%157 = add nuw i64 %136, 2
%158 = and i64 %157, 4294967295
%159 = getelementptr inbounds double, double* %1, i64 %158
%160 = load double, double* %159
%161 = getelementptr inbounds double, double* %3, i64 %158
%162 = load double, double* %161
%163 = tail call double @llvm.fmuladd.f64(double %160, double %162, double %156)
%164 = add nuw i64 %136, 3
%165 = and i64 %164, 4294967295
%166 = getelementptr inbounds double, double* %1, i64 %165
%167 = load double, double* %166
%168 = getelementptr inbounds double, double* %3, i64 %165
%169 = load double, double* %168
%170 = tail call double @llvm.fmuladd.f64(double %167, double %169, double %163)
%171 = add nuw nsw i64 %136, 5
%172 = icmp ugt i64 %171, %134
br i1 %172, label %187, label %135
173: ; preds = %39, %24
%174 = phi double [ undef, %24 ], [ %59, %39 ]
%175 = phi i64 [ %27, %24 ], [ %60, %39 ]
%176 = phi i64 [ %32, %24 ], [ %61, %39 ]
%177 = phi double [ 0.000000e+00, %24 ], [ %59, %39 ]
%178 = icmp eq i32 %35, 0
br i1 %178, label %187, label %179
179: ; preds = %173
%180 = add nsw i64 %175, -1
%181 = getelementptr inbounds double, double* %1, i64 %180
%182 = load double, double* %181
%183 = add nsw i64 %176, -1
%184 = getelementptr inbounds double, double* %3, i64 %183
%185 = load double, double* %184
%186 = tail call double @llvm.fmuladd.f64(double %182, double %185, double %177)
br label %187
187: ; preds = %179, %173, %135, %128, %125, %5
%188 = phi double [ 0.000000e+00, %5 ], [ %126, %125 ], [ %129, %128 ], [ %170, %135 ], [ %174, %173 ], [ %186, %179 ]
ret double %188
}