void kernel_strmv_u_n_2_lib4(int kmax, float *A, float *x, float *y, int alg) {
  if (kmax <= 0)
    return;
  const int lda = 4;
  int k;
  float x_0, x_1, x_2, x_3, y_0 = 0, y_1 = 0;
  x_0 = x[0];
  x_1 = x[1];
  y_0 += A[0 + lda * 0] * x_0;
  y_0 += A[0 + lda * 1] * x_1;
  y_1 += A[1 + lda * 1] * x_1;
  A += 2 * lda;
  x += 2;
  k = 2;
  for (; k < kmax - 3; k += 4) {
    x_0 = x[0];
    x_1 = x[1];
    x_2 = x[2];
    x_3 = x[3];
    y_0 += A[0 + lda * 0] * x_0;
    y_1 += A[1 + lda * 0] * x_0;
    y_0 += A[0 + lda * 1] * x_1;
    y_1 += A[1 + lda * 1] * x_1;
    y_0 += A[0 + lda * 2] * x_2;
    y_1 += A[1 + lda * 2] * x_2;
    y_0 += A[0 + lda * 3] * x_3;
    y_1 += A[1 + lda * 3] * x_3;
    A += 4 * lda;
    x += 4;
  }
  for (; k < kmax; k++) {
    x_0 = x[0];
    y_0 += A[0 + lda * 0] * x_0;
    y_1 += A[1 + lda * 0] * x_0;
    A += 1 * lda;
    x += 1;
  }
  if (alg == 0) {
    y[0] = y_0;
    y[1] = y_1;
  } else if (alg == 1) {
    y[0] += y_0;
    y[1] += y_1;
  } else {
    y[0] -= y_0;
    y[1] -= y_1;
  }
}


x86 assembly (clang, -O0):
<kernel_strmv_u_n_2_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1126 <kernel_strmv_u_n_2_lib4+0x26>
jmp    1454 <kernel_strmv_u_n_2_lib4+0x354>
movl   $0x4,-0x28(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x30(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movss  0x10(%rax),%xmm0
movss  -0x34(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movss  0x14(%rax),%xmm0
movss  -0x34(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x18(%rbp)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1343 <kernel_strmv_u_n_2_lib4+0x243>
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x30(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  -0x30(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x10(%rbp),%rax
movss  0x10(%rax),%xmm0
movss  -0x34(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movss  0x14(%rax),%xmm0
movss  -0x34(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x10(%rbp),%rax
movss  0x20(%rax),%xmm0
movss  -0x38(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movss  0x24(%rax),%xmm0
movss  -0x38(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x10(%rbp),%rax
movss  0x30(%rax),%xmm0
movss  -0x3c(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movss  0x34(%rax),%xmm0
movss  -0x3c(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x10(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    11d6 <kernel_strmv_u_n_2_lib4+0xd6>
jmp    1348 <kernel_strmv_u_n_2_lib4+0x248>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    13c6 <kernel_strmv_u_n_2_lib4+0x2c6>
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x30(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  -0x30(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1348 <kernel_strmv_u_n_2_lib4+0x248>
cmpl   $0x0,-0x24(%rbp)
jne    13f0 <kernel_strmv_u_n_2_lib4+0x2f0>
movss  -0x40(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x44(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0x4(%rax)
jmp    1454 <kernel_strmv_u_n_2_lib4+0x354>
cmpl   $0x1,-0x24(%rbp)
jne    1423 <kernel_strmv_u_n_2_lib4+0x323>
movss  -0x40(%rbp),%xmm0
mov    -0x20(%rbp),%rax
addss  (%rax),%xmm0
movss  %xmm0,(%rax)
movss  -0x44(%rbp),%xmm0
mov    -0x20(%rbp),%rax
addss  0x4(%rax),%xmm0
movss  %xmm0,0x4(%rax)
jmp    144f <kernel_strmv_u_n_2_lib4+0x34f>
movss  -0x40(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,(%rax)
movss  -0x44(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movss  0x4(%rax),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,0x4(%rax)
jmp    1454 <kernel_strmv_u_n_2_lib4+0x354>
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_strmv_u_n_2_lib4>:
test   %edi,%edi
jle    12ac <kernel_strmv_u_n_2_lib4+0x1ac>
movss  (%rsi),%xmm0
mulss  (%rdx),%xmm0
xorps  %xmm1,%xmm1
addss  %xmm0,%xmm1
movsd  0x10(%rsi),%xmm0
movss  0x4(%rdx),%xmm2
shufps $0x0,%xmm2,%xmm2
mulps  %xmm0,%xmm2
xorps  %xmm0,%xmm0
movss  %xmm1,%xmm0
addps  %xmm2,%xmm0
add    $0x20,%rsi
add    $0x8,%rdx
mov    $0x2,%r9d
cmp    $0x6,%edi
jb     11cd <kernel_strmv_u_n_2_lib4+0xcd>
lea    -0x3(%rdi),%r10d
lea    -0x6(%rdi),%r9d
and    $0xfffffffc,%r9d
mov    $0x2,%eax
nopw   0x0(%rax,%rax,1)
movsd  (%rsi),%xmm3
movsd  0x10(%rsi),%xmm4
movsd  0x20(%rsi),%xmm5
movsd  0x30(%rsi),%xmm8
movss  (%rdx),%xmm7
movss  0x4(%rdx),%xmm6
movss  0x8(%rdx),%xmm2
movss  0xc(%rdx),%xmm1
shufps $0x0,%xmm7,%xmm7
mulps  %xmm3,%xmm7
addps  %xmm0,%xmm7
shufps $0x0,%xmm6,%xmm6
mulps  %xmm4,%xmm6
addps  %xmm7,%xmm6
shufps $0x0,%xmm2,%xmm2
mulps  %xmm5,%xmm2
addps  %xmm6,%xmm2
shufps $0x0,%xmm1,%xmm1
mulps  %xmm8,%xmm1
movaps %xmm1,%xmm0
addps  %xmm2,%xmm0
add    $0x40,%rsi
add    $0x10,%rdx
add    $0x4,%eax
cmp    %r10d,%eax
jl     1160 <kernel_strmv_u_n_2_lib4+0x60>
addps  %xmm2,%xmm1
add    $0x6,%r9d
movaps %xmm1,%xmm0
cmp    %edi,%r9d
jge    11e8 <kernel_strmv_u_n_2_lib4+0xe8>
mov    %edi,%eax
sub    %r9d,%eax
mov    %r9d,%r10d
not    %r10d
test   $0x1,%al
jne    11ed <kernel_strmv_u_n_2_lib4+0xed>
add    %edi,%r10d
jne    1213 <kernel_strmv_u_n_2_lib4+0x113>
jmp    125a <kernel_strmv_u_n_2_lib4+0x15a>
movaps %xmm0,%xmm1
jmp    125a <kernel_strmv_u_n_2_lib4+0x15a>
movsd  (%rsi),%xmm2
movss  (%rdx),%xmm1
shufps $0x0,%xmm1,%xmm1
mulps  %xmm2,%xmm1
addps  %xmm0,%xmm1
add    $0x10,%rsi
add    $0x4,%rdx
add    $0x1,%r9d
movaps %xmm1,%xmm0
add    %edi,%r10d
je     125a <kernel_strmv_u_n_2_lib4+0x15a>
sub    %r9d,%edi
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
movss  (%rdx,%rax,4),%xmm3
movss  0x4(%rdx,%rax,4),%xmm1
shufps $0x0,%xmm3,%xmm3
movsd  (%rsi),%xmm2
mulps  %xmm3,%xmm2
addps  %xmm0,%xmm2
movsd  0x10(%rsi),%xmm0
shufps $0x0,%xmm1,%xmm1
mulps  %xmm0,%xmm1
movaps %xmm1,%xmm0
addps  %xmm2,%xmm0
add    $0x2,%rax
add    $0x20,%rsi
cmp    %eax,%edi
jne    1220 <kernel_strmv_u_n_2_lib4+0x120>
addps  %xmm2,%xmm1
cmp    $0x1,%r8d
je     1273 <kernel_strmv_u_n_2_lib4+0x173>
test   %r8d,%r8d
jne    128e <kernel_strmv_u_n_2_lib4+0x18e>
movss  %xmm1,(%rcx)
shufps $0x55,%xmm1,%xmm1
movss  %xmm1,0x4(%rcx)
ret
movss  (%rcx),%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rcx)
shufps $0x55,%xmm1,%xmm1
addss  0x4(%rcx),%xmm1
movss  %xmm1,0x4(%rcx)
ret
movss  (%rcx),%xmm0
movss  0x4(%rcx),%xmm2
subss  %xmm1,%xmm0
movss  %xmm0,(%rcx)
shufps $0x55,%xmm1,%xmm1
subss  %xmm1,%xmm2
movss  %xmm2,0x4(%rcx)
ret

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

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