The issue was noticed on Icelake CPU where the benchmark runs 1.38x slower when …compiled with -march=native vs w/o this option.
There is a single loop that runs 1.5x slower, in `mat_times_vec` function from `block_solver.f`:
```
178 do m=1,nb 179 y(l,i,j,k)=y(l,i,j,k)+ 180 1 a(l,m,i,j,k)*x(m,i,j,k)+
181 2 axp(l,m,i,j,k)*x(m,ip1,j,k)+
182 3 ayp(l,m,i,j,k)*x(m,i,jp1,k)+
183 4 azp(l,m,i,j,k)*x(m,i,j,kp1)+
184 5 axm(l,m,i,j,k)*x(m,im1,j,k)+ 185 6 aym(l,m,i,j,k)*x(m,i,jm1,k)+
186 7 azm(l,m,i,j,k)*x(m,i,j,km1)
187 enddo
```
The bigger part of the issue related to FMAs is described in #60322 (it has the LLVM IR and `clang` commands that may be used for this issue as well). The LSR "problem" may be seen by comparing the code produced with and w/o `-march=native`:
<table>
<tr>
<td>
W/o `-march=native` (fast):</td><td>
With `-march=native` (slow):</td>
</tr>
<tr>
<td>
```asm
.LBB1_10: # Parent Loop BB1_2 Depth=1
# Parent Loop BB1_4 Depth=2
# Parent Loop BB1_6 Depth=3
# Parent Loop BB1_8 Depth=4
# => This Inner Loop Header: Depth=5
movsd (%rbx,%r8), %xmm1 # xmm1 = mem[0],zero
movhpd (%r14,%r8), %xmm1 # xmm1 = xmm1[0],mem[0]
movsd (%rbp,%r8), %xmm2 # xmm2 = mem[0],zero
movhpd (%rsi,%r8), %xmm2 # xmm2 = xmm2[0],mem[0]
movq 232(%rsp), %rcx # 8-byte Reload
movsd (%rcx,%r13,8), %xmm3 # xmm3 = mem[0],zero
movq 224(%rsp), %rcx # 8-byte Reload
movhpd (%rcx,%r13,8), %xmm3 # xmm3 = xmm3[0],mem[0]
movq 216(%rsp), %rcx # 8-byte Reload
movsd (%rcx,%r13,8), %xmm4 # xmm4 = mem[0],zero
movq 208(%rsp), %rcx # 8-byte Reload
movhpd (%rcx,%r13,8), %xmm4 # xmm4 = xmm4[0],mem[0]
movsd (%rax,%r8), %xmm5 # xmm5 = mem[0],zero
movq 200(%rsp), %rcx # 8-byte Reload
mulsd (%rcx,%r13,8), %xmm5
mulpd %xmm1, %xmm3
movsd (%rdx,%r8), %xmm1 # xmm1 = mem[0],zero
mulsd (%rdi,%r13,8), %xmm1
mulpd %xmm2, %xmm4
movsd (%r9,%r8), %xmm2 # xmm2 = mem[0],zero
mulsd (%r15,%r13,8), %xmm2
addpd %xmm3, %xmm4
addsd %xmm1, %xmm2
addsd %xmm5, %xmm2
addsd %xmm0, %xmm2
movapd %xmm4, %xmm0
unpckhpd %xmm4, %xmm0 # xmm0 = xmm0[1],xmm4[1]
addsd %xmm4, %xmm0
addsd %xmm2, %xmm0
movq 192(%rsp), %rcx # 8-byte Reload
movsd %xmm0, (%rcx,%r12,8)
addq $8, %r8
addq %r10, %r13
cmpq %r8, %r11
jne .LBB1_10
jmp .LBB1_11
```
</td>
<td>
```asm
.LBB1_32: # %scalar.ph
# Parent Loop BB1_3 Depth=1
# Parent Loop BB1_6 Depth=2
# Parent Loop BB1_9 Depth=3
# Parent Loop BB1_12 Depth=4
# => This Inner Loop Header: Depth=5
movq 376(%rsp), %r12 # 8-byte Reload
vmovsd (%r12,%r10,8), %xmm6 # xmm6 = mem[0],zero
vfmadd132sd (%r9,%r8), %xmm5, %xmm6 # xmm6 = (xmm6 * mem) + xmm5
vmovsd 8(%rbx,%r10,8), %xmm5 # xmm5 = mem[0],zero
vfmadd132sd (%r14,%r8), %xmm6, %xmm5 # xmm5 = (xmm5 * mem) + xmm6
movq 384(%rsp), %r12 # 8-byte Reload
vmovsd 8(%r12,%r10,8), %xmm6 # xmm6 = mem[0],zero
vfmadd132sd (%rdx,%r8), %xmm5, %xmm6 # xmm6 = (xmm6 * mem) + xmm5
movq 368(%rsp), %r12 # 8-byte Reload
vmovsd (%r12,%r10,8), %xmm5 # xmm5 = mem[0],zero
vfmadd132sd (%rbp,%r8), %xmm6, %xmm5 # xmm5 = (xmm5 * mem) + xmm6
vmovsd 8(%rax,%r10,8), %xmm6 # xmm6 = mem[0],zero
vfmadd132sd (%r13,%r8), %xmm5, %xmm6 # xmm6 = (xmm6 * mem) + xmm5
movq 400(%rsp), %r12 # 8-byte Reload
vmovsd 8(%r12,%r10,8), %xmm7 # xmm7 = mem[0],zero
vfmadd132sd (%r11,%r8), %xmm6, %xmm7 # xmm7 = (xmm7 * mem) + xmm6
vmovsd (%rdi,%r10,8), %xmm5 # xmm5 = mem[0],zero
vfmadd132sd (%r15,%r8), %xmm7, %xmm5 # xmm5 = (xmm5 * mem) + xmm7
movq -72(%rsp), %r12 # 8-byte Reload
movq %r10, %rcx
movq %rax, %r10
movq %rbx, %rax
movq %rdi, %rbx
movq 392(%rsp), %rdi # 8-byte Reload
vmovsd %xmm5, (%r12,%rdi,8)
movq %rbx, %rdi
movq %rax, %rbx
movq %r10, %rax
movq %rcx, %r10
movq 8(%rsp), %r12 # 8-byte Reload
incq %r10
addq %rsi, %r15
addq %rsi, %r11
addq %rsi, %r13
addq %rsi, %rbp
addq %rsi, %rdx
addq %rsi, %r14
addq %rsi, %r9
cmpq %r10, %r12
jne .LBB1_32
jmp .LBB1_11
```
</td>
</tr>
</table>
LSR produces too many induction temps while it does not seem to be needed. I took the [original](https://github.com/llvm/llvm-project/files/10514310/block_solver.orig.ll.gz) LLVM IR as a base, and disabled the loop vectorization using `llvm.loop` metadata (see [block_solver.mod.ll.gz](https://github.com/llvm/llvm-project/files/10514603/block_solver.mod.ll.gz) ) - this sped up the loop by **1.07x**, and the generated code became much cleaner:
```asm
.LBB1_10: # Parent Loop BB1_2 Depth=1
# Parent Loop BB1_4 Depth=2
# Parent Loop BB1_6 Depth=3
# Parent Loop BB1_8 Depth=4
# => This Inner Loop Header: Depth=5
vmovsd (%rbx,%r10), %xmm1 # xmm1 = mem[0],zero
movq %r9, %rax
movq 232(%rsp), %r9 # 8-byte Reload
vfmadd132sd (%r9,%r15,8), %xmm0, %xmm1 # xmm1 = (xmm1 * mem) + xmm0
movq %rax, %r9
vmovsd (%r14,%r10), %xmm0 # xmm0 = mem[0],zero
movq 224(%rsp), %rax # 8-byte Reload
vfmadd132sd (%rax,%r15,8), %xmm1, %xmm0 # xmm0 = (xmm0 * mem) + xmm1
vmovsd (%rbp,%r10), %xmm1 # xmm1 = mem[0],zero
movq 208(%rsp), %rax # 8-byte Reload
vfmadd132sd (%rax,%r15,8), %xmm0, %xmm1 # xmm1 = (xmm1 * mem) + xmm0
vmovsd (%r13,%r10), %xmm0 # xmm0 = mem[0],zero
movq 200(%rsp), %rax # 8-byte Reload
vfmadd132sd (%rax,%r15,8), %xmm1, %xmm0 # xmm0 = (xmm0 * mem) + xmm1
vmovsd (%r12,%r10), %xmm1 # xmm1 = mem[0],zero
vfmadd132sd (%rcx,%r15,8), %xmm0, %xmm1 # xmm1 = (xmm1 * mem) + xmm0
vmovsd (%rdx,%r10), %xmm2 # xmm2 = mem[0],zero
vfmadd132sd (%r9,%r15,8), %xmm1, %xmm2 # xmm2 = (xmm2 * mem) + xmm1
vmovsd (%rsi,%r10), %xmm0 # xmm0 = mem[0],zero
movq 216(%rsp), %rax # 8-byte Reload
vfmadd132sd (%rax,%r15,8), %xmm2, %xmm0 # xmm0 = (xmm0 * mem) + xmm2
movq 192(%rsp), %rax # 8-byte Reload
vmovsd %xmm0, (%rax,%r8,8)
addq $8, %r10
addq %rdi, %r15
cmpq %r10, %r11
jne .LBB1_10
jmp .LBB1_11
```
It looks like LSR is "confused" by the PHI instructions produced by the loop vectorizer before LSR. I have no experience with LSR, so I will appreciate some hints what might be causing this.
Below are IR dumps before and after LSR for the two cases: with and w/o `llvm.loop` novec metadata - note that the loop IR on input to LSR is quite similar:
<table>
<tr><td colspan="2">*** IR Dump Before Loop Strength Reduction (loop-reduce) ***</td></tr>
<tr><td>W/o `llvm.loop` metadata (slow):</td><td>With `llvm.loop` novec metadata (fast):</td></tr>
<tr><td>
```ll
; Preheader:
scalar.ph.preheader: ; preds = %vector.memcheck, \
; %.lr.ph, %middle.block
%indvars.iv.ph = phi i64 [ 1, %vector.memcheck ], \
[ 1, %.lr.ph ], \
[ %ind.end, %middle.block ]
%.ph = phi double [ 0.000000e+00, %vector.memcheck ], \
[ 0.000000e+00, %.lr.ph ], \
[ %272, %middle.block ]
br label %scalar.ph
; Loop:
scalar.ph: ; preds = %scalar.ph.preheader, %scalar.ph
%indvars.iv = phi i64 [ %indvars.iv.next, %scalar.ph ], \
[ %indvars.iv.ph, %scalar.ph.preheader ]
%273 = phi double [ %329, %scalar.ph ], \
[ %.ph, %scalar.ph.preheader ]
%274 = add nsw i64 %indvars.iv, -1
%275 = mul nuw nsw i64 %274, %16
%276 = add nuw nsw i64 %275, %157
%277 = add i64 %276, %reass.mul31
%278 = getelementptr double, ptr %2, i64 %277
%279 = load double, ptr %278, align 8, !tbaa !1
%280 = add nuw nsw i64 %274, %140
%281 = add i64 %280, %105
%282 = add i64 %281, %74
%283 = getelementptr double, ptr %1, i64 %282
%284 = load double, ptr %283, align 8, !tbaa !1
%285 = fmul fast double %284, %279
%286 = fadd fast double %285, %273
%287 = getelementptr double, ptr %3, i64 %277
%288 = load double, ptr %287, align 8, !tbaa !1
%289 = add i64 %145, %274
%290 = getelementptr double, ptr %1, i64 %289
%291 = load double, ptr %290, align 8, !tbaa !1
%292 = fmul fast double %291, %288
%293 = fadd fast double %286, %292
%294 = getelementptr double, ptr %4, i64 %277
%295 = load double, ptr %294, align 8, !tbaa !1
%296 = add i64 %280, %74
%297 = add i64 %296, %109
%298 = getelementptr double, ptr %1, i64 %297
%299 = load double, ptr %298, align 8, !tbaa !1
%300 = fmul fast double %299, %295
%301 = fadd fast double %293, %300
%302 = getelementptr double, ptr %5, i64 %277
%303 = load double, ptr %302, align 8, !tbaa !1
%304 = add i64 %281, %78
%305 = getelementptr double, ptr %1, i64 %304
%306 = load double, ptr %305, align 8, !tbaa !1
%307 = fmul fast double %306, %303
%308 = fadd fast double %301, %307
%309 = getelementptr double, ptr %6, i64 %277
%310 = load double, ptr %309, align 8, !tbaa !1
%311 = add i64 %149, %274
%312 = getelementptr double, ptr %1, i64 %311
%313 = load double, ptr %312, align 8, !tbaa !1
%314 = fmul fast double %313, %310
%315 = fadd fast double %308, %314
%316 = getelementptr double, ptr %7, i64 %277
%317 = load double, ptr %316, align 8, !tbaa !1
%318 = add i64 %296, %112
%319 = getelementptr double, ptr %1, i64 %318
%320 = load double, ptr %319, align 8, !tbaa !1
%321 = fmul fast double %320, %317
%322 = fadd fast double %315, %321
%323 = getelementptr double, ptr %8, i64 %277
%324 = load double, ptr %323, align 8, !tbaa !1
%325 = add i64 %281, %81
%326 = getelementptr double, ptr %1, i64 %325
%327 = load double, ptr %326, align 8, !tbaa !1
%328 = fmul fast double %327, %324
%329 = fadd fast double %322, %328
store double %329, ptr %159, align 8, !tbaa !1
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%exitcond.not = icmp eq i64 %indvars.iv, %162
br i1 %exitcond.not, label %._crit_edge.loopexit, \
label %scalar.ph, !llvm.loop !37
; Exit blocks
._crit_edge.loopexit: ; preds = %scalar.ph
br label %._crit_edge
```
</td><td>
```ll
; Preheader:
.lr.ph: ; preds = %97
%103 = zext i32 %101 to i64
br label %104
; Loop:
104: ; preds = %.lr.ph, %104
%indvars.iv = phi i64 [ 1, %.lr.ph ], \
[ %indvars.iv.next, %104 ]
%105 = phi double [ 0.000000e+00, %.lr.ph ], \
[ %161, %104 ]
%106 = add nsw i64 %indvars.iv, -1
%107 = mul nuw nsw i64 %106, %16
%108 = add nuw nsw i64 %107, %98
%109 = add i64 %108, %reass.mul31
%110 = getelementptr double, ptr %2, i64 %109
%111 = load double, ptr %110, align 8, !tbaa !1
%112 = add nuw nsw i64 %106, %87
%113 = add i64 %112, %65
%114 = add i64 %113, %43
%115 = getelementptr double, ptr %1, i64 %114
%116 = load double, ptr %115, align 8, !tbaa !1
%117 = fmul fast double %116, %111
%118 = fadd fast double %117, %105
%119 = getelementptr double, ptr %3, i64 %109
%120 = load double, ptr %119, align 8, !tbaa !1
%121 = add i64 %92, %106
%122 = getelementptr double, ptr %1, i64 %121
%123 = load double, ptr %122, align 8, !tbaa !1
%124 = fmul fast double %123, %120
%125 = fadd fast double %118, %124
%126 = getelementptr double, ptr %4, i64 %109
%127 = load double, ptr %126, align 8, !tbaa !1
%128 = add i64 %112, %43
%129 = add i64 %128, %69
%130 = getelementptr double, ptr %1, i64 %129
%131 = load double, ptr %130, align 8, !tbaa !1
%132 = fmul fast double %131, %127
%133 = fadd fast double %125, %132
%134 = getelementptr double, ptr %5, i64 %109
%135 = load double, ptr %134, align 8, !tbaa !1
%136 = add i64 %113, %47
%137 = getelementptr double, ptr %1, i64 %136
%138 = load double, ptr %137, align 8, !tbaa !1
%139 = fmul fast double %138, %135
%140 = fadd fast double %133, %139
%141 = getelementptr double, ptr %6, i64 %109
%142 = load double, ptr %141, align 8, !tbaa !1
%143 = add i64 %96, %106
%144 = getelementptr double, ptr %1, i64 %143
%145 = load double, ptr %144, align 8, !tbaa !1
%146 = fmul fast double %145, %142
%147 = fadd fast double %140, %146
%148 = getelementptr double, ptr %7, i64 %109
%149 = load double, ptr %148, align 8, !tbaa !1
%150 = add i64 %128, %72
%151 = getelementptr double, ptr %1, i64 %150
%152 = load double, ptr %151, align 8, !tbaa !1
%153 = fmul fast double %152, %149
%154 = fadd fast double %147, %153
%155 = getelementptr double, ptr %8, i64 %109
%156 = load double, ptr %155, align 8, !tbaa !1
%157 = add i64 %113, %50
%158 = getelementptr double, ptr %1, i64 %157
%159 = load double, ptr %158, align 8, !tbaa !1
%160 = fmul fast double %159, %156
%161 = fadd fast double %154, %160
store double %161, ptr %100, align 8, !tbaa !1
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%exitcond.not = icmp eq i64 %indvars.iv, %103
br i1 %exitcond.not, label %._crit_edge.loopexit, \
label %104, !llvm.loop !5
; Exit blocks
._crit_edge.loopexit: ; preds = %104
br label %._crit_edge
```
</td></tr>
</table>
<table>
<tr><td colspan="2">*** IR Dump After Loop Strength Reduction (loop-reduce) ***</td></tr>
<tr><td>W/o `llvm.loop` metadata (slow):</td><td>With `llvm.loop` novec metadata (fast):</td></tr>
<tr><td>
```ll
; Preheader:
scalar.ph.preheader: ; preds = %vector.memcheck, %.lr.ph, %middle.block
%indvars.iv.ph = phi i64 [ 1, %vector.memcheck ], [ 1, %.lr.ph ], [ %ind.end, %middle.block ]
%.ph = phi double [ 0.000000e+00, %vector.memcheck ], [ 0.000000e+00, %.lr.ph ], [ %303, %middle.block ]
%304 = add nsw i64 %indvars.iv.ph, -1
%305 = mul i64 %63, %304
br label %scalar.ph
; Loop:
scalar.ph: ; preds = %scalar.ph.preheader, %scalar.ph
%lsr.iv310 = phi ptr [ %lsr.iv308, %scalar.ph.preheader ], [ %uglygep311, %scalar.ph ]
%lsr.iv299 = phi ptr [ %lsr.iv297, %scalar.ph.preheader ], [ %uglygep300, %scalar.ph ]
%lsr.iv288 = phi ptr [ %lsr.iv286, %scalar.ph.preheader ], [ %uglygep289, %scalar.ph ]
%lsr.iv277 = phi ptr [ %lsr.iv275, %scalar.ph.preheader ], [ %uglygep278, %scalar.ph ]
%lsr.iv266 = phi ptr [ %lsr.iv264, %scalar.ph.preheader ], [ %uglygep267, %scalar.ph ]
%lsr.iv255 = phi ptr [ %lsr.iv253, %scalar.ph.preheader ], [ %uglygep256, %scalar.ph ]
%lsr.iv244 = phi ptr [ %lsr.iv242, %scalar.ph.preheader ], [ %uglygep245, %scalar.ph ]
%lsr.iv223 = phi i64 [ %304, %scalar.ph.preheader ], [ %lsr.iv.next224, %scalar.ph ]
%306 = phi double [ %341, %scalar.ph ], [ %.ph, %scalar.ph.preheader ]
%uglygep312 = getelementptr i8, ptr %lsr.iv310, i64 %305
%307 = load double, ptr %uglygep312, align 8, !tbaa !1
%308 = shl i64 %lsr.iv223, 3
%uglygep341 = getelementptr i8, ptr %lsr.iv339, i64 %308
%309 = load double, ptr %uglygep341, align 8, !tbaa !1
%310 = fmul fast double %309, %307
%311 = fadd fast double %310, %306
%uglygep301 = getelementptr i8, ptr %lsr.iv299, i64 %305
%312 = load double, ptr %uglygep301, align 8, !tbaa !1
%313 = shl i64 %lsr.iv223, 3
%uglygep234 = getelementptr i8, ptr %uglygep233, i64 %313
%uglygep235 = getelementptr i8, ptr %uglygep234, i64 8
%314 = load double, ptr %uglygep235, align 8, !tbaa !1
%315 = fmul fast double %314, %312
%316 = fadd fast double %311, %315
%uglygep290 = getelementptr i8, ptr %lsr.iv288, i64 %305
%317 = load double, ptr %uglygep290, align 8, !tbaa !1
%318 = shl i64 %lsr.iv223, 3
%uglygep321 = getelementptr i8, ptr %lsr.iv319, i64 %318
%uglygep322 = getelementptr i8, ptr %uglygep321, i64 8
%319 = load double, ptr %uglygep322, align 8, !tbaa !1
%320 = fmul fast double %319, %317
%321 = fadd fast double %316, %320
%uglygep279 = getelementptr i8, ptr %lsr.iv277, i64 %305
%322 = load double, ptr %uglygep279, align 8, !tbaa !1
%323 = shl i64 %lsr.iv223, 3
%uglygep334 = getelementptr i8, ptr %lsr.iv332, i64 %323
%324 = load double, ptr %uglygep334, align 8, !tbaa !1
%325 = fmul fast double %324, %322
%326 = fadd fast double %321, %325
%uglygep268 = getelementptr i8, ptr %lsr.iv266, i64 %305
%327 = load double, ptr %uglygep268, align 8, !tbaa !1
%328 = shl i64 %lsr.iv223, 3
%uglygep231 = getelementptr i8, ptr %uglygep230, i64 %328
%uglygep232 = getelementptr i8, ptr %uglygep231, i64 8
%329 = load double, ptr %uglygep232, align 8, !tbaa !1
%330 = fmul fast double %329, %327
%331 = fadd fast double %326, %330
%uglygep257 = getelementptr i8, ptr %lsr.iv255, i64 %305
%332 = load double, ptr %uglygep257, align 8, !tbaa !1
%333 = shl i64 %lsr.iv223, 3
%uglygep316 = getelementptr i8, ptr %lsr.iv314, i64 %333
%uglygep317 = getelementptr i8, ptr %uglygep316, i64 8
%334 = load double, ptr %uglygep317, align 8, !tbaa !1
%335 = fmul fast double %334, %332
%336 = fadd fast double %331, %335
%uglygep246 = getelementptr i8, ptr %lsr.iv244, i64 %305
%337 = load double, ptr %uglygep246, align 8, !tbaa !1
%338 = shl i64 %lsr.iv223, 3
%uglygep328 = getelementptr i8, ptr %lsr.iv326, i64 %338
%339 = load double, ptr %uglygep328, align 8, !tbaa !1
%340 = fmul fast double %339, %337
%341 = fadd fast double %336, %340
store double %341, ptr %190, align 8, !tbaa !1
%lsr.iv.next224 = add nsw i64 %lsr.iv223, 1
%uglygep245 = getelementptr i8, ptr %lsr.iv244, i64 %71
%uglygep256 = getelementptr i8, ptr %lsr.iv255, i64 %71
%uglygep267 = getelementptr i8, ptr %lsr.iv266, i64 %71
%uglygep278 = getelementptr i8, ptr %lsr.iv277, i64 %71
%uglygep289 = getelementptr i8, ptr %lsr.iv288, i64 %71
%uglygep300 = getelementptr i8, ptr %lsr.iv299, i64 %71
%uglygep311 = getelementptr i8, ptr %lsr.iv310, i64 %71
%exitcond.not = icmp eq i64 %193, %lsr.iv.next224
br i1 %exitcond.not, label %._crit_edge.loopexit, label %scalar.ph, !llvm.loop !37
; Exit blocks
._crit_edge.loopexit: ; preds = %scalar.ph
br label %._crit_edge
```
</td><td>
```ll
; Preheader:
.lr.ph: ; preds = %117
%123 = zext i32 %121 to i64
%124 = shl nuw nsw i64 %123, 3
br label %125
; Loop:
125: ; preds = %.lr.ph, %125
%lsr.iv80 = phi i64 [ 0, %.lr.ph ], [ %lsr.iv.next81, %125 ]
%lsr.iv = phi i64 [ 0, %.lr.ph ], [ %lsr.iv.next, %125 ]
%126 = phi double [ 0.000000e+00, %.lr.ph ], [ %161, %125 ]
%127 = shl i64 %lsr.iv80, 3
%uglygep136 = getelementptr i8, ptr %lsr.iv134, i64 %127
%128 = load double, ptr %uglygep136, align 8, !tbaa !1
%uglygep159 = getelementptr i8, ptr %lsr.iv157, i64 %lsr.iv
%129 = load double, ptr %uglygep159, align 8, !tbaa !1
%130 = fmul fast double %129, %128
%131 = fadd fast double %130, %126
%132 = shl i64 %lsr.iv80, 3
%uglygep127 = getelementptr i8, ptr %lsr.iv125, i64 %132
%133 = load double, ptr %uglygep127, align 8, !tbaa !1
%uglygep71 = getelementptr i8, ptr %uglygep70, i64 %lsr.iv
%134 = load double, ptr %uglygep71, align 8, !tbaa !1
%135 = fmul fast double %134, %133
%136 = fadd fast double %131, %135
%137 = shl i64 %lsr.iv80, 3
%uglygep118 = getelementptr i8, ptr %lsr.iv116, i64 %137
%138 = load double, ptr %uglygep118, align 8, !tbaa !1
%uglygep144 = getelementptr i8, ptr %lsr.iv142, i64 %lsr.iv
%139 = load double, ptr %uglygep144, align 8, !tbaa !1
%140 = fmul fast double %139, %138
%141 = fadd fast double %136, %140
%142 = shl i64 %lsr.iv80, 3
%uglygep109 = getelementptr i8, ptr %lsr.iv107, i64 %142
%143 = load double, ptr %uglygep109, align 8, !tbaa !1
%uglygep156 = getelementptr i8, ptr %lsr.iv154, i64 %lsr.iv
%144 = load double, ptr %uglygep156, align 8, !tbaa !1
%145 = fmul fast double %144, %143
%146 = fadd fast double %141, %145
%147 = shl i64 %lsr.iv80, 3
%uglygep100 = getelementptr i8, ptr %lsr.iv98, i64 %147
%148 = load double, ptr %uglygep100, align 8, !tbaa !1
%uglygep69 = getelementptr i8, ptr %uglygep68, i64 %lsr.iv
%149 = load double, ptr %uglygep69, align 8, !tbaa !1
%150 = fmul fast double %149, %148
%151 = fadd fast double %146, %150
%152 = shl i64 %lsr.iv80, 3
%uglygep91 = getelementptr i8, ptr %lsr.iv89, i64 %152
%153 = load double, ptr %uglygep91, align 8, !tbaa !1
%uglygep140 = getelementptr i8, ptr %lsr.iv138, i64 %lsr.iv
%154 = load double, ptr %uglygep140, align 8, !tbaa !1
%155 = fmul fast double %154, %153
%156 = fadd fast double %151, %155
%157 = shl i64 %lsr.iv80, 3
%uglygep82 = getelementptr i8, ptr %lsr.iv78, i64 %157
%158 = load double, ptr %uglygep82, align 8, !tbaa !1
%uglygep150 = getelementptr i8, ptr %lsr.iv148, i64 %lsr.iv
%159 = load double, ptr %uglygep150, align 8, !tbaa !1
%160 = fmul fast double %159, %158
%161 = fadd fast double %156, %160
store double %161, ptr %120, align 8, !tbaa !1
%lsr.iv.next = add nuw nsw i64 %lsr.iv, 8
%lsr.iv.next81 = add nuw nsw i64 %lsr.iv80, %16
%exitcond.not = icmp eq i64 %124, %lsr.iv.next
br i1 %exitcond.not, label %._crit_edge.loopexit, label %125, !llvm.loop !5
; Exit blocks
._crit_edge.loopexit: ; preds = %125
br label %._crit_edge
```
</td></tr>
</table>