void bar(float *A, float *B, float K) {
  int i;
  for (i = 0; i < 64; ++i)
    A[i] *= B[i] + K;
}


x86 assembly (clang, -O0):
<bar>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x40,-0x18(%rbp)
jge    1154 <bar+0x54>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x14(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1118 <bar+0x18>
pop    %rbp
ret

x86 assembly (clang, -O2):
<bar>:
lea    0x100(%rsi),%rax
cmp    %rdi,%rax
jbe    1154 <bar+0x54>
lea    0x100(%rdi),%rax
cmp    %rsi,%rax
jbe    1154 <bar+0x54>
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movss  (%rsi,%rax,4),%xmm1
addss  %xmm0,%xmm1
mulss  (%rdi,%rax,4),%xmm1
movss  %xmm1,(%rdi,%rax,4)
movss  0x4(%rsi,%rax,4),%xmm1
addss  %xmm0,%xmm1
mulss  0x4(%rdi,%rax,4),%xmm1
movss  %xmm1,0x4(%rdi,%rax,4)
add    $0x2,%rax
cmp    $0x40,%rax
jne    1120 <bar+0x20>
ret
shufps $0x0,%xmm0,%xmm0
movups (%rsi),%xmm1
addps  %xmm0,%xmm1
movups (%rdi),%xmm2
mulps  %xmm1,%xmm2
movups 0x10(%rdi),%xmm1
movups 0x20(%rdi),%xmm3
movups 0x30(%rdi),%xmm4
movups %xmm2,(%rdi)
movups 0x10(%rsi),%xmm2
addps  %xmm0,%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0x10(%rdi)
movups 0x20(%rsi),%xmm1
addps  %xmm0,%xmm1
mulps  %xmm3,%xmm1
movups %xmm1,0x20(%rdi)
movups 0x30(%rsi),%xmm1
addps  %xmm0,%xmm1
mulps  %xmm4,%xmm1
movups %xmm1,0x30(%rdi)
movups 0x40(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0x40(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0x40(%rdi)
movups 0x50(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0x50(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0x50(%rdi)
movups 0x60(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0x60(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0x60(%rdi)
movups 0x70(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0x70(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0x70(%rdi)
movups 0x80(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0x80(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0x80(%rdi)
movups 0x90(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0x90(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0x90(%rdi)
movups 0xa0(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0xa0(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0xa0(%rdi)
movups 0xb0(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0xb0(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0xb0(%rdi)
movups 0xc0(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0xc0(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0xc0(%rdi)
movups 0xd0(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0xd0(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0xd0(%rdi)
movups 0xe0(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0xe0(%rdi),%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0xe0(%rdi)
movups 0xf0(%rsi),%xmm1
addps  %xmm0,%xmm1
movups 0xf0(%rdi),%xmm0
mulps  %xmm1,%xmm0
movups %xmm0,0xf0(%rdi)
ret

LLVM IR (-O0):
define void @bar(float* %0, float* %1, float %2) {
%4 = alloca float*
%5 = alloca float*
%6 = alloca float
%7 = alloca i32
store float* %0, float** %4
store float* %1, float** %5
store float %2, float* %6
store i32 0, i32* %7
br label %8
8: ; preds = %25, %3
%9 = load i32, i32* %7
%10 = icmp slt i32 %9, 64
br i1 %10, label %11, label %28
11: ; preds = %8
%12 = load float*, float** %5
%13 = load i32, i32* %7
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds float, float* %12, i64 %14
%16 = load float, float* %15
%17 = load float, float* %6
%18 = fadd float %16, %17
%19 = load float*, float** %4
%20 = load i32, i32* %7
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds float, float* %19, i64 %21
%23 = load float, float* %22
%24 = fmul float %23, %18
store float %24, float* %22
br label %25
25: ; preds = %11
%26 = load i32, i32* %7
%27 = add nsw i32 %26, 1
store i32 %27, i32* %7
br label %8
28: ; preds = %8
ret void
}

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