double my_ddot(int n, const double *dx, int incx, const double *dy, int incy) {
  double dtemp;
  int i, ix, iy;
  int m;
  dtemp = 0.0;
  if (n <= 0)
    return (dtemp);
  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 = 0; i < n; i++) {
      dtemp += dx[ix] * dy[iy];
      ix = ix + incx;
      iy = iy + incy;
    }
    return (dtemp);
  } else {
    m = n % 5;
    if (m != 0) {
      for (i = 0; i < m; i++)
        dtemp += dx[i] * dy[i];
      if (n < 5)
        return (dtemp);
    }
    for (i = m; i < n; i += 5) {
      dtemp += dx[i] * dy[i] + dx[i + 1] * dy[i + 1] + dx[i + 2] * dy[i + 2] +
               dx[i + 3] * dy[i + 3] + dx[i + 4] * dy[i + 4];
    }
    return (dtemp);
  }
}


x86 assembly (clang, -O0):
<my_ddot>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
cmpl   $0x0,-0xc(%rbp)
jg     1137 <my_ddot+0x37>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1380 <my_ddot+0x280>
cmpl   $0x1,-0x1c(%rbp)
jne    114b <my_ddot+0x4b>
cmpl   $0x1,-0x2c(%rbp)
je     11ff <my_ddot+0xff>
movl   $0x1,-0x40(%rbp)
movl   $0x1,-0x44(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jge    1175 <my_ddot+0x75>
xor    %eax,%eax
sub    -0xc(%rbp),%eax
add    $0x1,%eax
imul   -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jge    1191 <my_ddot+0x91>
xor    %eax,%eax
sub    -0xc(%rbp),%eax
add    $0x1,%eax
imul   -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11f0 <my_ddot+0xf0>
mov    -0x18(%rbp),%rax
movslq -0x40(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x40(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x44(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1198 <my_ddot+0x98>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1380 <my_ddot+0x280>
mov    -0xc(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    %edx,-0x48(%rbp)
cmpl   $0x0,-0x48(%rbp)
je     1282 <my_ddot+0x182>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    1264 <my_ddot+0x164>
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    121e <my_ddot+0x11e>
cmpl   $0x5,-0xc(%rbp)
jge    127d <my_ddot+0x17d>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1380 <my_ddot+0x280>
jmp    1282 <my_ddot+0x182>
mov    -0x48(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1376 <my_ddot+0x276>
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x18(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x18(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x3c(%rbp)
jmp    1288 <my_ddot+0x188>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<my_ddot>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %edi,%edi
jle    116c <my_ddot+0x6c>
cmp    $0x1,%edx
jne    1175 <my_ddot+0x75>
cmp    $0x1,%r8d
jne    1175 <my_ddot+0x75>
mov    %edi,%r11d
mov    $0xcccccccd,%edx
mov    %r11,%rax
imul   %rdx,%rax
shr    $0x22,%rax
lea    (%rax,%rax,4),%eax
mov    %edi,%r8d
sub    %eax,%r8d
je     1237 <my_ddot+0x137>
mov    %r8d,%r9d
imul   %r11,%rdx
shr    $0x22,%rdx
lea    (%rdx,%rdx,4),%eax
mov    %edi,%edx
sub    %eax,%edx
add    $0xffffffffffffffff,%rdx
mov    %r9d,%r10d
and    $0x3,%r10d
cmp    $0x3,%rdx
jae    1240 <my_ddot+0x140>
xorpd  %xmm0,%xmm0
xor    %ebx,%ebx
jmp    1297 <my_ddot+0x197>
xorpd  %xmm0,%xmm0
jmp    1364 <my_ddot+0x264>
lea    -0x1(%rdi),%eax
neg    %eax
mov    %eax,%ebx
imul   %r8d,%ebx
add    $0x1,%ebx
test   %r8d,%r8d
mov    $0x1,%r9d
cmovns %r9d,%ebx
imul   %edx,%eax
add    $0x1,%eax
test   %edx,%edx
cmovns %r9d,%eax
mov    %edi,%r10d
movslq %ebx,%r9
cltq
dec    %r10d
jne    11af <my_ddot+0xaf>
xorpd  %xmm0,%xmm0
jmp    1215 <my_ddot+0x115>
movslq %r8d,%r8
movslq %edx,%r10
mov    %edi,%r11d
and    $0xfffffffe,%r11d
lea    (%rsi,%rax,8),%rdx
mov    %r10,%r15
shl    $0x4,%r15
lea    (%rsi,%r10,8),%r14
lea    (%rcx,%r9,8),%rbx
mov    %r8,%r12
shl    $0x4,%r12
lea    (%rcx,%r8,8),%r13
xorpd  %xmm0,%xmm0
xchg   %ax,%ax
movsd  (%rdx),%xmm1
mulsd  (%rbx),%xmm1
addsd  %xmm0,%xmm1
movsd  (%r14,%rax,8),%xmm0
mulsd  0x0(%r13,%r9,8),%xmm0
add    %r10,%rax
add    %r8,%r9
addsd  %xmm1,%xmm0
add    %r10,%rax
add    %r8,%r9
add    %r15,%rdx
add    %r12,%rbx
add    $0xfffffffe,%r11d
jne    11e0 <my_ddot+0xe0>
test   $0x1,%dil
je     1364 <my_ddot+0x264>
movsd  (%rsi,%rax,8),%xmm1
mulsd  (%rcx,%r9,8),%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
jmp    1364 <my_ddot+0x264>
xorpd  %xmm0,%xmm0
jmp    12d1 <my_ddot+0x1d1>
and    $0x4,%r9d
xorpd  %xmm0,%xmm0
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movsd  (%rsi,%rbx,8),%xmm1
movsd  0x8(%rsi,%rbx,8),%xmm2
mulsd  (%rcx,%rbx,8),%xmm1
mulsd  0x8(%rcx,%rbx,8),%xmm2
addsd  %xmm0,%xmm1
movsd  0x10(%rsi,%rbx,8),%xmm3
mulsd  0x10(%rcx,%rbx,8),%xmm3
addsd  %xmm1,%xmm2
movsd  0x18(%rsi,%rbx,8),%xmm0
mulsd  0x18(%rcx,%rbx,8),%xmm0
addsd  %xmm2,%xmm3
addsd  %xmm3,%xmm0
add    $0x4,%rbx
cmp    %rbx,%r9
jne    1250 <my_ddot+0x150>
test   %r10,%r10
je     12c8 <my_ddot+0x1c8>
lea    (%rcx,%rbx,8),%r9
lea    (%rsi,%rbx,8),%rbx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
movsd  (%rbx,%rdx,8),%xmm1
mulsd  (%r9,%rdx,8),%xmm1
addsd  %xmm1,%xmm0
add    $0x1,%rdx
cmp    %rdx,%r10
jne    12b0 <my_ddot+0x1b0>
cmp    $0x5,%edi
jl     1364 <my_ddot+0x264>
cmp    %edi,%r8d
jge    1364 <my_ddot+0x264>
mov    $0xcccccccd,%eax
imul   %r11,%rax
shr    $0x22,%rax
lea    (%rax,%rax,4),%rdx
mov    $0x4,%ebx
sub    %rdx,%rbx
lea    (%rcx,%rbx,8),%rcx
lea    (%rsi,%rbx,8),%rdx
lea    (%rax,%rax,4),%esi
neg    %esi
movsd  -0x18(%rdx,%r11,8),%xmm1
mulsd  -0x18(%rcx,%r11,8),%xmm1
movsd  -0x20(%rdx,%r11,8),%xmm2
mulsd  -0x20(%rcx,%r11,8),%xmm2
addsd  %xmm1,%xmm2
movsd  -0x10(%rdx,%r11,8),%xmm1
mulsd  -0x10(%rcx,%r11,8),%xmm1
addsd  %xmm2,%xmm1
movsd  -0x8(%rdx,%r11,8),%xmm2
mulsd  -0x8(%rcx,%r11,8),%xmm2
addsd  %xmm1,%xmm2
movsd  (%rdx,%r11,8),%xmm1
mulsd  (%rcx,%r11,8),%xmm1
addsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
add    $0x5,%r11
lea    (%rsi,%r11,1),%eax
cmp    %edi,%eax
jl     1300 <my_ddot+0x200>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

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

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