void dscale_tile(double *X, int ldX, double f0, int M, int N) {
  register double *Xr, *Xc;
  register int i, j;
  if (f0 == 1.0) {
    return;
  }
  Xc = X;
  if (f0 == 0.0) {
    for (j = 0; j < N; j++) {
      Xr = Xc;
      for (i = 0; i < M; i++) {
        Xr[0] = 0.0;
        Xr++;
      }
      Xc += ldX;
    }
    return;
  }
  for (j = 0; j < N; j++) {
    Xr = Xc;
    for (i = 0; i < M - 3; i += 4) {
      Xr[0] *= f0;
      Xr[1] *= f0;
      Xr[2] *= f0;
      Xr[3] *= f0;
      Xr += 4;
    }
    if (i == M)
      goto increment;
    if (i < M - 1) {
      Xr[0] *= f0;
      Xr[1] *= f0;
      Xr += 2;
      i += 2;
    }
    if (i < M) {
      Xr[0] *= f0;
      i++;
    }
  increment:
    Xc += ldX;
  }
  return;
}


x86 assembly (clang, -O0):
<dscale_tile>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  0xedd(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1138 <dscale_tile+0x38>
jp     1138 <dscale_tile+0x38>
jmp    1318 <dscale_tile+0x218>
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
movsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11d3 <dscale_tile+0xd3>
jp     11d3 <dscale_tile+0xd3>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11ce <dscale_tile+0xce>
mov    -0x30(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11ab <dscale_tile+0xab>
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    117a <dscale_tile+0x7a>
mov    -0xc(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    115f <dscale_tile+0x5f>
jmp    1318 <dscale_tile+0x218>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1313 <dscale_tile+0x213>
mov    -0x30(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    126a <dscale_tile+0x16a>
movsd  -0x18(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x18(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mulsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  -0x18(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mulsd  0x10(%rax),%xmm0
movsd  %xmm0,0x10(%rax)
movsd  -0x18(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mulsd  0x18(%rax),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x28(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x34(%rbp)
jmp    11f5 <dscale_tile+0xf5>
mov    -0x34(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jne    127b <dscale_tile+0x17b>
jmp    12f0 <dscale_tile+0x1f0>
mov    -0x34(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    12c5 <dscale_tile+0x1c5>
movsd  -0x18(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x18(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mulsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x28(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    12eb <dscale_tile+0x1eb>
movsd  -0x18(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    12f0 <dscale_tile+0x1f0>
mov    -0xc(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11da <dscale_tile+0xda>
jmp    1318 <dscale_tile+0x218>
pop    %rbp
ret

x86 assembly (clang, -O2):
<dscale_tile>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
ucomisd 0xeda(%rip),%xmm0
jne    1139 <dscale_tile+0x29>
jp     1139 <dscale_tile+0x29>
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %ecx,%r15d
mov    %edx,%r14d
mov    %rdi,%r13
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11ac <dscale_tile+0x9c>
jp     11ac <dscale_tile+0x9c>
test   %r15d,%r15d
jle    112a <dscale_tile+0x1a>
movslq %esi,%rcx
mov    %r14d,%r12d
shl    $0x3,%r12
lea    -0x1(%r15),%eax
mov    %r15d,%ebx
and    $0x3,%ebx
cmp    $0x3,%eax
mov    %rcx,0x10(%rsp)
jae    1342 <dscale_tile+0x232>
test   %ebx,%ebx
mov    0x10(%rsp),%rbp
je     112a <dscale_tile+0x1a>
shl    $0x3,%rbp
jmp    1198 <dscale_tile+0x88>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    %rbp,%r13
add    $0xffffffff,%ebx
je     112a <dscale_tile+0x1a>
test   %r14d,%r14d
jle    1190 <dscale_tile+0x80>
mov    %r13,%rdi
xor    %esi,%esi
mov    %r12,%rdx
call   1030 <memset@plt>
jmp    1190 <dscale_tile+0x80>
test   %r15d,%r15d
jle    112a <dscale_tile+0x1a>
lea    -0x3(%r14),%eax
lea    -0x1(%r14),%r9d
movslq %esi,%rdx
mov    %r14d,%esi
and    $0xfffffffc,%esi
lea    -0x4(%r14),%r12d
mov    %r12d,%r11d
shr    $0x2,%r11d
add    $0x1,%r11d
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
mov    %r11d,%r8d
and    $0xfffffffe,%r8d
lea    0x0(,%r8,4),%r10d
lea    0x0(,%r8,4),%rcx
mov    %rcx,0x8(%rsp)
shl    $0x3,%rdx
xor    %edi,%edi
jmp    121f <dscale_tile+0x10f>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    %rdx,%r13
add    $0x1,%edi
cmp    %r15d,%edi
je     112a <dscale_tile+0x1a>
mov    %r13,%rbx
mov    $0x0,%ebp
cmp    $0x4,%r14d
jl     1307 <dscale_tile+0x1f7>
xor    %ecx,%ecx
mov    %r13,%rbx
cmp    $0x4,%r12d
jb     12e0 <dscale_tile+0x1d0>
mov    0x8(%rsp),%rcx
lea    0x0(,%rcx,8),%rbx
add    %r13,%rbx
mov    %r8,%rcx
mov    %r13,%rbp
cs nopw 0x0(%rax,%rax,1)
movupd 0x0(%rbp),%xmm2
movupd 0x10(%rbp),%xmm3
movupd 0x20(%rbp),%xmm4
movupd 0x30(%rbp),%xmm5
movapd %xmm2,%xmm6
unpcklpd %xmm4,%xmm6
unpckhpd %xmm4,%xmm2
movapd %xmm3,%xmm4
unpcklpd %xmm5,%xmm4
unpckhpd %xmm5,%xmm3
mulpd  %xmm1,%xmm6
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm4
mulpd  %xmm1,%xmm3
movapd %xmm4,%xmm5
unpcklpd %xmm3,%xmm5
movapd %xmm6,%xmm7
unpcklpd %xmm2,%xmm7
movhlps %xmm4,%xmm3
movhlps %xmm6,%xmm2
movups %xmm2,0x20(%rbp)
movups %xmm3,0x30(%rbp)
movupd %xmm7,0x0(%rbp)
movupd %xmm5,0x10(%rbp)
add    $0x40,%rbp
add    $0xfffffffffffffffe,%rcx
jne    1260 <dscale_tile+0x150>
mov    %r10d,%ecx
mov    %esi,%ebp
cmp    %r11,%r8
je     1307 <dscale_tile+0x1f7>
nopl   0x0(%rax,%rax,1)
movupd (%rbx),%xmm2
movupd 0x10(%rbx),%xmm3
mulpd  %xmm1,%xmm2
movupd %xmm2,(%rbx)
mulpd  %xmm1,%xmm3
movupd %xmm3,0x10(%rbx)
add    $0x20,%rbx
add    $0x4,%ecx
cmp    %eax,%ecx
jl     12e0 <dscale_tile+0x1d0>
mov    %esi,%ebp
cmp    %r14d,%ebp
je     1210 <dscale_tile+0x100>
cmp    %r9d,%ebp
jge    1328 <dscale_tile+0x218>
movupd (%rbx),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,(%rbx)
add    $0x10,%rbx
or     $0x2,%ebp
cmp    %r14d,%ebp
jge    1210 <dscale_tile+0x100>
movsd  (%rbx),%xmm2
mulsd  %xmm0,%xmm2
movsd  %xmm2,(%rbx)
jmp    1210 <dscale_tile+0x100>
and    $0xfffffffc,%r15d
mov    %rcx,%rax
mov    %rcx,%rbp
shl    $0x5,%rbp
lea    0x0(,%rcx,8),%rcx
mov    %rcx,0x8(%rsp)
lea    (%rcx,%rcx,2),%rcx
mov    %rcx,0x20(%rsp)
shl    $0x4,%rax
mov    %rax,0x18(%rsp)
jmp    138d <dscale_tile+0x27d>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    %rbp,%r13
add    $0xfffffffc,%r15d
je     1175 <dscale_tile+0x65>
test   %r14d,%r14d
jle    139f <dscale_tile+0x28f>
mov    %r13,%rdi
xor    %esi,%esi
mov    %r12,%rdx
call   1030 <memset@plt>
test   %r14d,%r14d
jle    13b7 <dscale_tile+0x2a7>
mov    0x8(%rsp),%rax
lea    (%rax,%r13,1),%rdi
xor    %esi,%esi
mov    %r12,%rdx
call   1030 <memset@plt>
test   %r14d,%r14d
jle    13cf <dscale_tile+0x2bf>
mov    0x18(%rsp),%rax
lea    (%rax,%r13,1),%rdi
xor    %esi,%esi
mov    %r12,%rdx
call   1030 <memset@plt>
test   %r14d,%r14d
jle    1380 <dscale_tile+0x270>
mov    0x20(%rsp),%rax
lea    (%rax,%r13,1),%rdi
xor    %esi,%esi
mov    %r12,%rdx
call   1030 <memset@plt>
jmp    1380 <dscale_tile+0x270>

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

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