void kernel_strsv_n_4_lib4(int kmax, int ksv, float *A, float *x, float *y) {
  const int lda = 4;
  int k;
  float x_0, x_1, x_2, x_3, y_0 = 0, y_1 = 0, y_2 = 0, y_3 = 0;
  k = 0;
  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_2 += A[2 + lda * 0] * x_0;
    y_3 += A[3 + lda * 0] * x_0;
    y_0 += A[0 + lda * 1] * x_1;
    y_1 += A[1 + lda * 1] * x_1;
    y_2 += A[2 + lda * 1] * x_1;
    y_3 += A[3 + lda * 1] * x_1;
    y_0 += A[0 + lda * 2] * x_2;
    y_1 += A[1 + lda * 2] * x_2;
    y_2 += A[2 + lda * 2] * x_2;
    y_3 += A[3 + lda * 2] * x_2;
    y_0 += A[0 + lda * 3] * x_3;
    y_1 += A[1 + lda * 3] * x_3;
    y_2 += A[2 + lda * 3] * x_3;
    y_3 += A[3 + lda * 3] * x_3;
    A += 4 * lda;
    x += 4;
  }
  y_0 = y[0] - y_0;
  y_1 = y[1] - y_1;
  y_2 = y[2] - y_2;
  y_3 = y[3] - y_3;
  float a_00, a_10, a_20, a_30, a_11, a_21, a_31;
  a_00 = A[0 + lda * 0];
  a_10 = A[1 + lda * 0];
  a_20 = A[2 + lda * 0];
  a_30 = A[3 + lda * 0];
  y_0 *= a_00;
  y[0] = y_0;
  y_1 -= a_10 * y_0;
  y_2 -= a_20 * y_0;
  y_3 -= a_30 * y_0;
  if (ksv == 1) {
    y[1] = y_1;
    y[2] = y_2;
    y[3] = y_3;
    return;
  }
  a_11 = A[1 + lda * 1];
  a_21 = A[2 + lda * 1];
  a_31 = A[3 + lda * 1];
  y_1 *= a_11;
  y[1] = y_1;
  y_2 -= a_21 * y_1;
  y_3 -= a_31 * y_1;
  if (ksv == 2) {
    y[2] = y_2;
    y[3] = y_3;
    return;
  }
  a_00 = A[2 + lda * 2];
  a_10 = A[3 + lda * 2];
  y_2 *= a_00;
  y[2] = y_2;
  y_3 -= a_10 * y_2;
  if (ksv == 3) {
    y[3] = y_3;
    return;
  }
  a_11 = A[3 + lda * 3];
  y_3 *= a_11;
  y[3] = y_3;
}


x86 assembly (clang, -O0):
<kernel_strsv_n_4_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
movl   $0x4,-0x24(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x48(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    13b1 <kernel_strsv_n_4_lib4+0x2b1>
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x2c(%rbp)
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x2c(%rbp),%xmm2
movss  -0x3c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  -0x2c(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  -0x2c(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x10(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  -0x2c(%rbp),%xmm2
movss  -0x48(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movss  0x10(%rax),%xmm0
movss  -0x30(%rbp),%xmm2
movss  -0x3c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movss  0x14(%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  0x18(%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  0x1c(%rax),%xmm0
movss  -0x30(%rbp),%xmm2
movss  -0x48(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movss  0x20(%rax),%xmm0
movss  -0x34(%rbp),%xmm2
movss  -0x3c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movss  0x24(%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  0x28(%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  0x2c(%rax),%xmm0
movss  -0x34(%rbp),%xmm2
movss  -0x48(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movss  0x30(%rax),%xmm0
movss  -0x38(%rbp),%xmm2
movss  -0x3c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movss  0x34(%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  0x38(%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  0x3c(%rax),%xmm0
movss  -0x38(%rbp),%xmm2
movss  -0x48(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x28(%rbp)
jmp    1144 <kernel_strsv_n_4_lib4+0x44>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
subss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x20(%rbp),%rax
movss  0x4(%rax),%xmm0
subss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movss  0x8(%rax),%xmm0
subss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x20(%rbp),%rax
movss  0xc(%rax),%xmm0
subss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4c(%rbp)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x54(%rbp)
mov    -0x10(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x4c(%rbp),%xmm0
mulss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x50(%rbp),%xmm0
movss  -0x3c(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x54(%rbp),%xmm0
movss  -0x3c(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x58(%rbp),%xmm0
movss  -0x3c(%rbp),%xmm2
movss  -0x48(%rbp),%xmm1
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x48(%rbp)
cmpl   $0x1,-0x8(%rbp)
jne    1503 <kernel_strsv_n_4_lib4+0x403>
movss  -0x40(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x44(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x48(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1671 <kernel_strsv_n_4_lib4+0x571>
mov    -0x10(%rbp),%rax
movss  0x14(%rax),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x10(%rbp),%rax
movss  0x18(%rax),%xmm0
movss  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movss  0x1c(%rax),%xmm0
movss  %xmm0,-0x64(%rbp)
movss  -0x5c(%rbp),%xmm0
mulss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x60(%rbp),%xmm0
movss  -0x40(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x64(%rbp),%xmm0
movss  -0x40(%rbp),%xmm2
movss  -0x48(%rbp),%xmm1
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x48(%rbp)
cmpl   $0x2,-0x8(%rbp)
jne    15c7 <kernel_strsv_n_4_lib4+0x4c7>
movss  -0x44(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x48(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1671 <kernel_strsv_n_4_lib4+0x571>
mov    -0x10(%rbp),%rax
movss  0x28(%rax),%xmm0
movss  %xmm0,-0x4c(%rbp)
mov    -0x10(%rbp),%rax
movss  0x2c(%rax),%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x4c(%rbp),%xmm0
mulss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x44(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x50(%rbp),%xmm0
movss  -0x44(%rbp),%xmm2
movss  -0x48(%rbp),%xmm1
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x48(%rbp)
cmpl   $0x3,-0x8(%rbp)
jne    1646 <kernel_strsv_n_4_lib4+0x546>
movss  -0x48(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1671 <kernel_strsv_n_4_lib4+0x571>
mov    -0x10(%rbp),%rax
movss  0x3c(%rax),%xmm0
movss  %xmm0,-0x5c(%rbp)
movss  -0x5c(%rbp),%xmm0
mulss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x48(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,0xc(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_strsv_n_4_lib4>:
xorps  %xmm1,%xmm1
cmp    $0x4,%edi
jl     1172 <kernel_strsv_n_4_lib4+0x72>
add    $0xfffffffd,%edi
xorps  %xmm2,%xmm2
xor    %eax,%eax
movups (%rdx),%xmm3
movups 0x10(%rdx),%xmm4
movups 0x20(%rdx),%xmm5
movups 0x30(%rdx),%xmm8
movss  (%rcx,%rax,4),%xmm7
movss  0x4(%rcx,%rax,4),%xmm6
movss  0x8(%rcx,%rax,4),%xmm0
movss  0xc(%rcx,%rax,4),%xmm1
shufps $0x0,%xmm7,%xmm7
mulps  %xmm3,%xmm7
addps  %xmm2,%xmm7
shufps $0x0,%xmm6,%xmm6
mulps  %xmm4,%xmm6
addps  %xmm7,%xmm6
shufps $0x0,%xmm0,%xmm0
mulps  %xmm5,%xmm0
addps  %xmm6,%xmm0
shufps $0x0,%xmm1,%xmm1
mulps  %xmm8,%xmm1
movaps %xmm1,%xmm2
addps  %xmm0,%xmm2
add    $0x40,%rdx
add    $0x4,%rax
cmp    %edi,%eax
jl     1110 <kernel_strsv_n_4_lib4+0x10>
addps  %xmm0,%xmm1
movss  (%r8),%xmm4
movss  0x4(%r8),%xmm3
subss  %xmm1,%xmm4
movaps %xmm1,%xmm0
shufps $0x55,%xmm1,%xmm0
subss  %xmm0,%xmm3
movss  0x8(%r8),%xmm2
movaps %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
subss  %xmm0,%xmm2
movss  0xc(%r8),%xmm0
shufps $0xff,%xmm1,%xmm1
mulss  (%rdx),%xmm4
subss  %xmm1,%xmm0
movss  0x4(%rdx),%xmm1
mulss  %xmm4,%xmm1
subss  %xmm1,%xmm3
movss  0x8(%rdx),%xmm1
mulss  %xmm4,%xmm1
subss  %xmm1,%xmm2
movss  0xc(%rdx),%xmm1
mulss  %xmm4,%xmm1
subss  %xmm1,%xmm0
movss  %xmm4,(%r8)
cmp    $0x1,%esi
jne    11e8 <kernel_strsv_n_4_lib4+0xe8>
movss  %xmm3,0x4(%r8)
jmp    1212 <kernel_strsv_n_4_lib4+0x112>
mulss  0x14(%rdx),%xmm3
movss  0x18(%rdx),%xmm1
mulss  %xmm3,%xmm1
movss  0x1c(%rdx),%xmm4
mulss  %xmm3,%xmm4
movss  %xmm3,0x4(%r8)
subss  %xmm1,%xmm2
subss  %xmm4,%xmm0
cmp    $0x2,%esi
jne    121f <kernel_strsv_n_4_lib4+0x11f>
movss  %xmm2,0x8(%r8)
movss  %xmm0,0xc(%r8)
ret
mulss  0x28(%rdx),%xmm2
movss  0x2c(%rdx),%xmm1
mulss  %xmm2,%xmm1
movss  %xmm2,0x8(%r8)
subss  %xmm1,%xmm0
cmp    $0x3,%esi
je     1241 <kernel_strsv_n_4_lib4+0x141>
mulss  0x3c(%rdx),%xmm0
movss  %xmm0,0xc(%r8)
ret

LLVM IR (-O0):
define void @kernel_strsv_n_4_lib4(i32 %0, i32 %1, float* %2, float* %3, float* %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca float*
%9 = alloca float*
%10 = alloca float*
%11 = alloca i32
%12 = alloca i32
%13 = alloca float
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
%19 = alloca float
%20 = alloca float
%21 = alloca float
%22 = alloca float
%23 = alloca float
%24 = alloca float
%25 = alloca float
%26 = alloca float
%27 = alloca float
store i32 %0, i32* %6
store i32 %1, i32* %7
store float* %2, float** %8
store float* %3, float** %9
store float* %4, float** %10
store i32 4, i32* %11
store float 0.000000e+00, float* %17
store float 0.000000e+00, float* %18
store float 0.000000e+00, float* %19
store float 0.000000e+00, float* %20
store i32 0, i32* %12
br label %28
28: ; preds = %146, %5
%29 = load i32, i32* %12
%30 = load i32, i32* %6
%31 = sub nsw i32 %30, 3
%32 = icmp slt i32 %29, %31
br i1 %32, label %33, label %149
33: ; preds = %28
%34 = load float*, float** %9
%35 = getelementptr inbounds float, float* %34, i64 0
%36 = load float, float* %35
store float %36, float* %13
%37 = load float*, float** %9
%38 = getelementptr inbounds float, float* %37, i64 1
%39 = load float, float* %38
store float %39, float* %14
%40 = load float*, float** %9
%41 = getelementptr inbounds float, float* %40, i64 2
%42 = load float, float* %41
store float %42, float* %15
%43 = load float*, float** %9
%44 = getelementptr inbounds float, float* %43, i64 3
%45 = load float, float* %44
store float %45, float* %16
%46 = load float*, float** %8
%47 = getelementptr inbounds float, float* %46, i64 0
%48 = load float, float* %47
%49 = load float, float* %13
%50 = load float, float* %17
%51 = call float @llvm.fmuladd.f32(float %48, float %49, float %50)
store float %51, float* %17
%52 = load float*, float** %8
%53 = getelementptr inbounds float, float* %52, i64 1
%54 = load float, float* %53
%55 = load float, float* %13
%56 = load float, float* %18
%57 = call float @llvm.fmuladd.f32(float %54, float %55, float %56)
store float %57, float* %18
%58 = load float*, float** %8
%59 = getelementptr inbounds float, float* %58, i64 2
%60 = load float, float* %59
%61 = load float, float* %13
%62 = load float, float* %19
%63 = call float @llvm.fmuladd.f32(float %60, float %61, float %62)
store float %63, float* %19
%64 = load float*, float** %8
%65 = getelementptr inbounds float, float* %64, i64 3
%66 = load float, float* %65
%67 = load float, float* %13
%68 = load float, float* %20
%69 = call float @llvm.fmuladd.f32(float %66, float %67, float %68)
store float %69, float* %20
%70 = load float*, float** %8
%71 = getelementptr inbounds float, float* %70, i64 4
%72 = load float, float* %71
%73 = load float, float* %14
%74 = load float, float* %17
%75 = call float @llvm.fmuladd.f32(float %72, float %73, float %74)
store float %75, float* %17
%76 = load float*, float** %8
%77 = getelementptr inbounds float, float* %76, i64 5
%78 = load float, float* %77
%79 = load float, float* %14
%80 = load float, float* %18
%81 = call float @llvm.fmuladd.f32(float %78, float %79, float %80)
store float %81, float* %18
%82 = load float*, float** %8
%83 = getelementptr inbounds float, float* %82, i64 6
%84 = load float, float* %83
%85 = load float, float* %14
%86 = load float, float* %19
%87 = call float @llvm.fmuladd.f32(float %84, float %85, float %86)
store float %87, float* %19
%88 = load float*, float** %8
%89 = getelementptr inbounds float, float* %88, i64 7
%90 = load float, float* %89
%91 = load float, float* %14
%92 = load float, float* %20
%93 = call float @llvm.fmuladd.f32(float %90, float %91, float %92)
store float %93, float* %20
%94 = load float*, float** %8
%95 = getelementptr inbounds float, float* %94, i64 8
%96 = load float, float* %95
%97 = load float, float* %15
%98 = load float, float* %17
%99 = call float @llvm.fmuladd.f32(float %96, float %97, float %98)
store float %99, float* %17
%100 = load float*, float** %8
%101 = getelementptr inbounds float, float* %100, i64 9
%102 = load float, float* %101
%103 = load float, float* %15
%104 = load float, float* %18
%105 = call float @llvm.fmuladd.f32(float %102, float %103, float %104)
store float %105, float* %18
%106 = load float*, float** %8
%107 = getelementptr inbounds float, float* %106, i64 10
%108 = load float, float* %107
%109 = load float, float* %15
%110 = load float, float* %19
%111 = call float @llvm.fmuladd.f32(float %108, float %109, float %110)
store float %111, float* %19
%112 = load float*, float** %8
%113 = getelementptr inbounds float, float* %112, i64 11
%114 = load float, float* %113
%115 = load float, float* %15
%116 = load float, float* %20
%117 = call float @llvm.fmuladd.f32(float %114, float %115, float %116)
store float %117, float* %20
%118 = load float*, float** %8
%119 = getelementptr inbounds float, float* %118, i64 12
%120 = load float, float* %119
%121 = load float, float* %16
%122 = load float, float* %17
%123 = call float @llvm.fmuladd.f32(float %120, float %121, float %122)
store float %123, float* %17
%124 = load float*, float** %8
%125 = getelementptr inbounds float, float* %124, i64 13
%126 = load float, float* %125
%127 = load float, float* %16
%128 = load float, float* %18
%129 = call float @llvm.fmuladd.f32(float %126, float %127, float %128)
store float %129, float* %18
%130 = load float*, float** %8
%131 = getelementptr inbounds float, float* %130, i64 14
%132 = load float, float* %131
%133 = load float, float* %16
%134 = load float, float* %19
%135 = call float @llvm.fmuladd.f32(float %132, float %133, float %134)
store float %135, float* %19
%136 = load float*, float** %8
%137 = getelementptr inbounds float, float* %136, i64 15
%138 = load float, float* %137
%139 = load float, float* %16
%140 = load float, float* %20
%141 = call float @llvm.fmuladd.f32(float %138, float %139, float %140)
store float %141, float* %20
%142 = load float*, float** %8
%143 = getelementptr inbounds float, float* %142, i64 16
store float* %143, float** %8
%144 = load float*, float** %9
%145 = getelementptr inbounds float, float* %144, i64 4
store float* %145, float** %9
br label %146
146: ; preds = %33
%147 = load i32, i32* %12
%148 = add nsw i32 %147, 4
store i32 %148, i32* %12
br label %28
149: ; preds = %28
%150 = load float*, float** %10
%151 = getelementptr inbounds float, float* %150, i64 0
%152 = load float, float* %151
%153 = load float, float* %17
%154 = fsub float %152, %153
store float %154, float* %17
%155 = load float*, float** %10
%156 = getelementptr inbounds float, float* %155, i64 1
%157 = load float, float* %156
%158 = load float, float* %18
%159 = fsub float %157, %158
store float %159, float* %18
%160 = load float*, float** %10
%161 = getelementptr inbounds float, float* %160, i64 2
%162 = load float, float* %161
%163 = load float, float* %19
%164 = fsub float %162, %163
store float %164, float* %19
%165 = load float*, float** %10
%166 = getelementptr inbounds float, float* %165, i64 3
%167 = load float, float* %166
%168 = load float, float* %20
%169 = fsub float %167, %168
store float %169, float* %20
%170 = load float*, float** %8
%171 = getelementptr inbounds float, float* %170, i64 0
%172 = load float, float* %171
store float %172, float* %21
%173 = load float*, float** %8
%174 = getelementptr inbounds float, float* %173, i64 1
%175 = load float, float* %174
store float %175, float* %22
%176 = load float*, float** %8
%177 = getelementptr inbounds float, float* %176, i64 2
%178 = load float, float* %177
store float %178, float* %23
%179 = load float*, float** %8
%180 = getelementptr inbounds float, float* %179, i64 3
%181 = load float, float* %180
store float %181, float* %24
%182 = load float, float* %21
%183 = load float, float* %17
%184 = fmul float %183, %182
store float %184, float* %17
%185 = load float, float* %17
%186 = load float*, float** %10
%187 = getelementptr inbounds float, float* %186, i64 0
store float %185, float* %187
%188 = load float, float* %22
%189 = load float, float* %17
%190 = load float, float* %18
%191 = fneg float %188
%192 = call float @llvm.fmuladd.f32(float %191, float %189, float %190)
store float %192, float* %18
%193 = load float, float* %23
%194 = load float, float* %17
%195 = load float, float* %19
%196 = fneg float %193
%197 = call float @llvm.fmuladd.f32(float %196, float %194, float %195)
store float %197, float* %19
%198 = load float, float* %24
%199 = load float, float* %17
%200 = load float, float* %20
%201 = fneg float %198
%202 = call float @llvm.fmuladd.f32(float %201, float %199, float %200)
store float %202, float* %20
%203 = load i32, i32* %7
%204 = icmp eq i32 %203, 1
br i1 %204, label %205, label %215
205: ; preds = %149
%206 = load float, float* %18
%207 = load float*, float** %10
%208 = getelementptr inbounds float, float* %207, i64 1
store float %206, float* %208
%209 = load float, float* %19
%210 = load float*, float** %10
%211 = getelementptr inbounds float, float* %210, i64 2
store float %209, float* %211
%212 = load float, float* %20
%213 = load float*, float** %10
%214 = getelementptr inbounds float, float* %213, i64 3
store float %212, float* %214
br label %284
215: ; preds = %149
%216 = load float*, float** %8
%217 = getelementptr inbounds float, float* %216, i64 5
%218 = load float, float* %217
store float %218, float* %25
%219 = load float*, float** %8
%220 = getelementptr inbounds float, float* %219, i64 6
%221 = load float, float* %220
store float %221, float* %26
%222 = load float*, float** %8
%223 = getelementptr inbounds float, float* %222, i64 7
%224 = load float, float* %223
store float %224, float* %27
%225 = load float, float* %25
%226 = load float, float* %18
%227 = fmul float %226, %225
store float %227, float* %18
%228 = load float, float* %18
%229 = load float*, float** %10
%230 = getelementptr inbounds float, float* %229, i64 1
store float %228, float* %230
%231 = load float, float* %26
%232 = load float, float* %18
%233 = load float, float* %19
%234 = fneg float %231
%235 = call float @llvm.fmuladd.f32(float %234, float %232, float %233)
store float %235, float* %19
%236 = load float, float* %27
%237 = load float, float* %18
%238 = load float, float* %20
%239 = fneg float %236
%240 = call float @llvm.fmuladd.f32(float %239, float %237, float %238)
store float %240, float* %20
%241 = load i32, i32* %7
%242 = icmp eq i32 %241, 2
br i1 %242, label %243, label %250
243: ; preds = %215
%244 = load float, float* %19
%245 = load float*, float** %10
%246 = getelementptr inbounds float, float* %245, i64 2
store float %244, float* %246
%247 = load float, float* %20
%248 = load float*, float** %10
%249 = getelementptr inbounds float, float* %248, i64 3
store float %247, float* %249
br label %284
250: ; preds = %215
%251 = load float*, float** %8
%252 = getelementptr inbounds float, float* %251, i64 10
%253 = load float, float* %252
store float %253, float* %21
%254 = load float*, float** %8
%255 = getelementptr inbounds float, float* %254, i64 11
%256 = load float, float* %255
store float %256, float* %22
%257 = load float, float* %21
%258 = load float, float* %19
%259 = fmul float %258, %257
store float %259, float* %19
%260 = load float, float* %19
%261 = load float*, float** %10
%262 = getelementptr inbounds float, float* %261, i64 2
store float %260, float* %262
%263 = load float, float* %22
%264 = load float, float* %19
%265 = load float, float* %20
%266 = fneg float %263
%267 = call float @llvm.fmuladd.f32(float %266, float %264, float %265)
store float %267, float* %20
%268 = load i32, i32* %7
%269 = icmp eq i32 %268, 3
br i1 %269, label %270, label %274
270: ; preds = %250
%271 = load float, float* %20
%272 = load float*, float** %10
%273 = getelementptr inbounds float, float* %272, i64 3
store float %271, float* %273
br label %284
274: ; preds = %250
%275 = load float*, float** %8
%276 = getelementptr inbounds float, float* %275, i64 15
%277 = load float, float* %276
store float %277, float* %25
%278 = load float, float* %25
%279 = load float, float* %20
%280 = fmul float %279, %278
store float %280, float* %20
%281 = load float, float* %20
%282 = load float*, float** %10
%283 = getelementptr inbounds float, float* %282, i64 3
store float %281, float* %283
br label %284
284: ; preds = %274, %270, %243, %205
ret void
}

LLVM IR (-O2):
define void @kernel_strsv_n_4_lib4(i32 %0, i32 %1, float* %2, float* nocapture %3, float* nocapture %4) {
%6 = add nsw i32 %0, -3
%7 = icmp sgt i32 %0, 3
br i1 %7, label %8, label %52
8: ; preds = %5, %8
%9 = phi float* [ %43, %8 ], [ %2, %5 ]
%10 = phi float* [ %44, %8 ], [ %3, %5 ]
%11 = phi i32 [ %45, %8 ], [ 0, %5 ]
%12 = phi <4 x float> [ %42, %8 ], [ zeroinitializer, %5 ]
%13 = load float, float* %10
%14 = getelementptr inbounds float, float* %10, i64 1
%15 = load float, float* %14
%16 = getelementptr inbounds float, float* %10, i64 2
%17 = load float, float* %16
%18 = getelementptr inbounds float, float* %10, i64 3
%19 = load float, float* %18
%20 = bitcast float* %9 to <4 x float>*
%21 = load <4 x float>, <4 x float>* %20
%22 = insertelement <4 x float> poison, float %13, i64 0
%23 = shufflevector <4 x float> %22, <4 x float> poison, <4 x i32> zeroinitializer
%24 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %21, <4 x float> %23, <4 x float> %12)
%25 = getelementptr inbounds float, float* %9, i64 4
%26 = bitcast float* %25 to <4 x float>*
%27 = load <4 x float>, <4 x float>* %26
%28 = insertelement <4 x float> poison, float %15, i64 0
%29 = shufflevector <4 x float> %28, <4 x float> poison, <4 x i32> zeroinitializer
%30 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %27, <4 x float> %29, <4 x float> %24)
%31 = getelementptr inbounds float, float* %9, i64 8
%32 = bitcast float* %31 to <4 x float>*
%33 = load <4 x float>, <4 x float>* %32
%34 = insertelement <4 x float> poison, float %17, i64 0
%35 = shufflevector <4 x float> %34, <4 x float> poison, <4 x i32> zeroinitializer
%36 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %33, <4 x float> %35, <4 x float> %30)
%37 = getelementptr inbounds float, float* %9, i64 12
%38 = bitcast float* %37 to <4 x float>*
%39 = load <4 x float>, <4 x float>* %38
%40 = insertelement <4 x float> poison, float %19, i64 0
%41 = shufflevector <4 x float> %40, <4 x float> poison, <4 x i32> zeroinitializer
%42 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %39, <4 x float> %41, <4 x float> %36)
%43 = getelementptr inbounds float, float* %9, i64 16
%44 = getelementptr inbounds float, float* %10, i64 4
%45 = add nuw nsw i32 %11, 4
%46 = icmp slt i32 %45, %6
br i1 %46, label %8, label %47
47: ; preds = %8
%48 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %21, <4 x float> %23, <4 x float> %12)
%49 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %27, <4 x float> %29, <4 x float> %48)
%50 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %33, <4 x float> %35, <4 x float> %49)
%51 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %39, <4 x float> %41, <4 x float> %50)
br label %52
52: ; preds = %47, %5
%53 = phi float* [ %2, %5 ], [ %43, %47 ]
%54 = phi <4 x float> [ zeroinitializer, %5 ], [ %51, %47 ]
%55 = load float, float* %4
%56 = extractelement <4 x float> %54, i64 0
%57 = fsub float %55, %56
%58 = getelementptr inbounds float, float* %4, i64 1
%59 = load float, float* %58
%60 = extractelement <4 x float> %54, i64 1
%61 = fsub float %59, %60
%62 = getelementptr inbounds float, float* %4, i64 2
%63 = load float, float* %62
%64 = extractelement <4 x float> %54, i64 2
%65 = fsub float %63, %64
%66 = getelementptr inbounds float, float* %4, i64 3
%67 = load float, float* %66
%68 = extractelement <4 x float> %54, i64 3
%69 = fsub float %67, %68
%70 = load float, float* %53
%71 = getelementptr inbounds float, float* %53, i64 1
%72 = load float, float* %71
%73 = getelementptr inbounds float, float* %53, i64 2
%74 = load float, float* %73
%75 = getelementptr inbounds float, float* %53, i64 3
%76 = load float, float* %75
%77 = fmul float %57, %70
store float %77, float* %4
%78 = fneg float %72
%79 = tail call float @llvm.fmuladd.f32(float %78, float %77, float %61)
%80 = fneg float %74
%81 = tail call float @llvm.fmuladd.f32(float %80, float %77, float %65)
%82 = fneg float %76
%83 = tail call float @llvm.fmuladd.f32(float %82, float %77, float %69)
%84 = icmp eq i32 %1, 1
br i1 %84, label %85, label %86
85: ; preds = %52
store float %79, float* %58
store float %81, float* %62
br label %113
86: ; preds = %52
%87 = getelementptr inbounds float, float* %53, i64 5
%88 = load float, float* %87
%89 = getelementptr inbounds float, float* %53, i64 6
%90 = load float, float* %89
%91 = getelementptr inbounds float, float* %53, i64 7
%92 = load float, float* %91
%93 = fmul float %79, %88
store float %93, float* %58
%94 = fneg float %90
%95 = tail call float @llvm.fmuladd.f32(float %94, float %93, float %81)
%96 = fneg float %92
%97 = tail call float @llvm.fmuladd.f32(float %96, float %93, float %83)
%98 = icmp eq i32 %1, 2
br i1 %98, label %99, label %100
99: ; preds = %86
store float %95, float* %62
br label %113
100: ; preds = %86
%101 = getelementptr inbounds float, float* %53, i64 10
%102 = load float, float* %101
%103 = getelementptr inbounds float, float* %53, i64 11
%104 = load float, float* %103
%105 = fmul float %95, %102
store float %105, float* %62
%106 = fneg float %104
%107 = tail call float @llvm.fmuladd.f32(float %106, float %105, float %97)
%108 = icmp eq i32 %1, 3
br i1 %108, label %113, label %109
109: ; preds = %100
%110 = getelementptr inbounds float, float* %53, i64 15
%111 = load float, float* %110
%112 = fmul float %107, %111
br label %113
113: ; preds = %100, %109, %99, %85
%114 = phi float [ %112, %109 ], [ %97, %99 ], [ %83, %85 ], [ %107, %100 ]
store float %114, float* %66
ret void
}