void colormatrix(unsigned char *img, int width, int height, float *m) {
  unsigned char *imgEnd = img + ((width * height) << 2);
  unsigned int *img32 = (unsigned int *)img;
  int r, g, b, a;
  float rr, rg, rb, ra;
  while (img < imgEnd) {
    r = *img;
    g = *(img + 1);
    b = *(img + 2);
    a = *(img + 3);
    rr = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4];
    rg = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9];
    rb = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14];
    ra = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19];
    *img32++ = (int)((rr) > 0xff ? 0xff : ((rr) < 0 ? 0 : (rr))) |
               (int)((rg) > 0xff ? 0xff : ((rg) < 0 ? 0 : (rg))) << 8 |
               (int)((rb) > 0xff ? 0xff : ((rb) < 0 ? 0 : (rb))) << 16 |
               (int)((ra) > 0xff ? 0xff : ((ra) < 0 ? 0 : (ra))) << 24;
    img += 4;
  }
}


x86 assembly (clang, -O0):
<colormatrix>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
imul   -0x10(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    14a1 <colormatrix+0x3a1>
mov    -0x8(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
mov    %eax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movzbl 0x2(%rax),%eax
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%rax
movzbl 0x3(%rax),%eax
mov    %eax,-0x38(%rbp)
cvtsi2ssl -0x2c(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm2
cvtsi2ssl -0x30(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mulss  0x4(%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtsi2ssl -0x34(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movss  0x8(%rax),%xmm2
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
cvtsi2ssl -0x38(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  0xc(%rax),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
addss  0x10(%rax),%xmm0
movss  %xmm0,-0x3c(%rbp)
cvtsi2ssl -0x2c(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  0x14(%rax),%xmm2
cvtsi2ssl -0x30(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mulss  0x18(%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtsi2ssl -0x34(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movss  0x1c(%rax),%xmm2
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
cvtsi2ssl -0x38(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  0x20(%rax),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
addss  0x24(%rax),%xmm0
movss  %xmm0,-0x40(%rbp)
cvtsi2ssl -0x2c(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  0x28(%rax),%xmm2
cvtsi2ssl -0x30(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mulss  0x2c(%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtsi2ssl -0x34(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movss  0x30(%rax),%xmm2
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
cvtsi2ssl -0x38(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  0x34(%rax),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
addss  0x38(%rax),%xmm0
movss  %xmm0,-0x44(%rbp)
cvtsi2ssl -0x2c(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  0x3c(%rax),%xmm2
cvtsi2ssl -0x30(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mulss  0x40(%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtsi2ssl -0x34(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movss  0x44(%rax),%xmm2
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
cvtsi2ssl -0x38(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  0x48(%rax),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
addss  0x4c(%rax),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x3c(%rbp),%xmm0
movss  0xd11(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    130a <colormatrix+0x20a>
movss  0xd00(%rip),%xmm0
movss  %xmm0,-0x4c(%rbp)
jmp    1338 <colormatrix+0x238>
xorps  %xmm0,%xmm0
ucomiss -0x3c(%rbp),%xmm0
jbe    1324 <colormatrix+0x224>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x50(%rbp)
jmp    132e <colormatrix+0x22e>
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x50(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x4c(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x54(%rbp)
movss  -0x40(%rbp),%xmm0
movss  0xcaf(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    136c <colormatrix+0x26c>
movss  0xc9e(%rip),%xmm0
movss  %xmm0,-0x58(%rbp)
jmp    139a <colormatrix+0x29a>
xorps  %xmm0,%xmm0
ucomiss -0x40(%rbp),%xmm0
jbe    1386 <colormatrix+0x286>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x5c(%rbp)
jmp    1390 <colormatrix+0x290>
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
movss  -0x5c(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
mov    -0x54(%rbp),%eax
movss  -0x58(%rbp),%xmm0
cvttss2si %xmm0,%ecx
shl    $0x8,%ecx
or     %ecx,%eax
mov    %eax,-0x60(%rbp)
movss  -0x44(%rbp),%xmm0
movss  0xc45(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    13d6 <colormatrix+0x2d6>
movss  0xc34(%rip),%xmm0
movss  %xmm0,-0x64(%rbp)
jmp    1404 <colormatrix+0x304>
xorps  %xmm0,%xmm0
ucomiss -0x44(%rbp),%xmm0
jbe    13f0 <colormatrix+0x2f0>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x68(%rbp)
jmp    13fa <colormatrix+0x2fa>
movss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x68(%rbp)
movss  -0x68(%rbp),%xmm0
movss  %xmm0,-0x64(%rbp)
mov    -0x60(%rbp),%eax
movss  -0x64(%rbp),%xmm0
cvttss2si %xmm0,%ecx
shl    $0x10,%ecx
or     %ecx,%eax
mov    %eax,-0x6c(%rbp)
movss  -0x48(%rbp),%xmm0
movss  0xbdb(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    1440 <colormatrix+0x340>
movss  0xbca(%rip),%xmm0
movss  %xmm0,-0x70(%rbp)
jmp    146e <colormatrix+0x36e>
xorps  %xmm0,%xmm0
ucomiss -0x48(%rbp),%xmm0
jbe    145a <colormatrix+0x35a>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x74(%rbp)
jmp    1464 <colormatrix+0x364>
movss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x74(%rbp)
movss  -0x74(%rbp),%xmm0
movss  %xmm0,-0x70(%rbp)
mov    -0x6c(%rbp),%ecx
movss  -0x70(%rbp),%xmm0
cvttss2si %xmm0,%eax
shl    $0x18,%eax
or     %eax,%ecx
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x28(%rbp)
mov    %ecx,(%rax)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
jmp    1132 <colormatrix+0x32>
pop    %rbp
ret

x86 assembly (clang, -O2):
<colormatrix>:
imul   %edx,%esi
shl    $0x2,%esi
test   %esi,%esi
jle    12f8 <colormatrix+0x1f8>
movslq %esi,%rax
add    %rdi,%rax
movss  0x10(%rcx),%xmm0
movss  0x24(%rcx),%xmm1
unpcklps %xmm0,%xmm1
movss  0x38(%rcx),%xmm0
movss  0x4c(%rcx),%xmm9
unpcklps %xmm0,%xmm9
movlhps %xmm1,%xmm9
movss  (%rcx),%xmm0
movss  0x4(%rcx),%xmm1
movss  0x8(%rcx),%xmm2
movss  0xc(%rcx),%xmm3
movss  0x20(%rcx),%xmm4
unpcklps %xmm3,%xmm4
movss  0x34(%rcx),%xmm3
movss  0x48(%rcx),%xmm10
unpcklps %xmm3,%xmm10
movlhps %xmm4,%xmm10
movss  0x1c(%rcx),%xmm3
unpcklps %xmm2,%xmm3
movss  0x30(%rcx),%xmm2
movss  0x44(%rcx),%xmm11
unpcklps %xmm2,%xmm11
movlhps %xmm3,%xmm11
movss  0x14(%rcx),%xmm2
unpcklps %xmm0,%xmm2
movss  0x28(%rcx),%xmm0
movss  0x3c(%rcx),%xmm12
unpcklps %xmm0,%xmm12
movlhps %xmm2,%xmm12
movss  0x18(%rcx),%xmm0
unpcklps %xmm1,%xmm0
movss  0x2c(%rcx),%xmm1
movss  0x40(%rcx),%xmm13
unpcklps %xmm1,%xmm13
movlhps %xmm0,%xmm13
xorps  %xmm8,%xmm8
movss  0xe41(%rip),%xmm4
jmp    11fc <colormatrix+0xfc>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movaps %xmm4,%xmm0
cmpltss %xmm7,%xmm0
movaps %xmm0,%xmm1
andnps %xmm5,%xmm1
andps  %xmm4,%xmm0
orps   %xmm1,%xmm0
cvttss2si %xmm0,%ecx
shl    $0x18,%ecx
or     %ecx,%edx
mov    %edx,(%rdi)
add    $0x4,%rdi
cmp    %rax,%rdi
jae    12f8 <colormatrix+0x1f8>
movzbl (%rdi),%ecx
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
movzbl 0x1(%rdi),%ecx
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
movzbl 0x2(%rdi),%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
movzbl 0x3(%rdi),%ecx
cvtsi2ss %ecx,%xmm7
shufps $0x0,%xmm1,%xmm1
mulps  %xmm13,%xmm1
shufps $0x0,%xmm0,%xmm0
mulps  %xmm12,%xmm0
addps  %xmm1,%xmm0
shufps $0x0,%xmm2,%xmm2
mulps  %xmm11,%xmm2
addps  %xmm0,%xmm2
shufps $0x0,%xmm7,%xmm7
mulps  %xmm10,%xmm7
addps  %xmm2,%xmm7
addps  %xmm9,%xmm7
movaps %xmm7,%xmm0
shufps $0xff,%xmm7,%xmm0
movaps %xmm7,%xmm1
cmpltps %xmm8,%xmm1
movmskps %xmm1,%ecx
xorps  %xmm5,%xmm5
xorps  %xmm2,%xmm2
test   $0x8,%cl
jne    1271 <colormatrix+0x171>
movaps %xmm0,%xmm2
movaps %xmm7,%xmm1
unpckhpd %xmm7,%xmm1
xorps  %xmm3,%xmm3
test   $0x4,%cl
jne    1283 <colormatrix+0x183>
movaps %xmm1,%xmm3
movaps %xmm4,%xmm6
cmpltss %xmm0,%xmm6
movaps %xmm6,%xmm0
andnps %xmm2,%xmm0
andps  %xmm4,%xmm6
orps   %xmm0,%xmm6
cvttss2si %xmm6,%esi
movaps %xmm4,%xmm0
cmpltss %xmm1,%xmm0
movaps %xmm0,%xmm1
andnps %xmm3,%xmm1
andps  %xmm4,%xmm0
orps   %xmm1,%xmm0
cvttss2si %xmm0,%edx
shl    $0x8,%edx
or     %esi,%edx
movaps %xmm7,%xmm0
shufps $0x55,%xmm7,%xmm0
xorps  %xmm1,%xmm1
test   $0x2,%cl
jne    12ca <colormatrix+0x1ca>
movaps %xmm0,%xmm1
movaps %xmm4,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm0
andnps %xmm1,%xmm0
andps  %xmm4,%xmm2
orps   %xmm0,%xmm2
cvttss2si %xmm2,%esi
shl    $0x10,%esi
or     %esi,%edx
test   $0x1,%cl
jne    11d0 <colormatrix+0xd0>
movaps %xmm7,%xmm5
jmp    11d0 <colormatrix+0xd0>
ret

LLVM IR (-O0):
define void @colormatrix(i8* %0, i32 %1, i32 %2, float* %3) {
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca float*
%9 = alloca i8*
%10 = alloca i32*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
store i8* %0, i8** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store float* %3, float** %8
%19 = load i8*, i8** %5
%20 = load i32, i32* %6
%21 = load i32, i32* %7
%22 = mul nsw i32 %20, %21
%23 = shl i32 %22, 2
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %19, i64 %24
store i8* %25, i8** %9
%26 = load i8*, i8** %5
%27 = bitcast i8* %26 to i32*
store i32* %27, i32** %10
br label %28
28: ; preds = %217, %4
%29 = load i8*, i8** %5
%30 = load i8*, i8** %9
%31 = icmp ult i8* %29, %30
br i1 %31, label %32, label %226
32: ; preds = %28
%33 = load i8*, i8** %5
%34 = load i8, i8* %33
%35 = zext i8 %34 to i32
store i32 %35, i32* %11
%36 = load i8*, i8** %5
%37 = getelementptr inbounds i8, i8* %36, i64 1
%38 = load i8, i8* %37
%39 = zext i8 %38 to i32
store i32 %39, i32* %12
%40 = load i8*, i8** %5
%41 = getelementptr inbounds i8, i8* %40, i64 2
%42 = load i8, i8* %41
%43 = zext i8 %42 to i32
store i32 %43, i32* %13
%44 = load i8*, i8** %5
%45 = getelementptr inbounds i8, i8* %44, i64 3
%46 = load i8, i8* %45
%47 = zext i8 %46 to i32
store i32 %47, i32* %14
%48 = load i32, i32* %11
%49 = sitofp i32 %48 to float
%50 = load float*, float** %8
%51 = getelementptr inbounds float, float* %50, i64 0
%52 = load float, float* %51
%53 = load i32, i32* %12
%54 = sitofp i32 %53 to float
%55 = load float*, float** %8
%56 = getelementptr inbounds float, float* %55, i64 1
%57 = load float, float* %56
%58 = fmul float %54, %57
%59 = call float @llvm.fmuladd.f32(float %49, float %52, float %58)
%60 = load i32, i32* %13
%61 = sitofp i32 %60 to float
%62 = load float*, float** %8
%63 = getelementptr inbounds float, float* %62, i64 2
%64 = load float, float* %63
%65 = call float @llvm.fmuladd.f32(float %61, float %64, float %59)
%66 = load i32, i32* %14
%67 = sitofp i32 %66 to float
%68 = load float*, float** %8
%69 = getelementptr inbounds float, float* %68, i64 3
%70 = load float, float* %69
%71 = call float @llvm.fmuladd.f32(float %67, float %70, float %65)
%72 = load float*, float** %8
%73 = getelementptr inbounds float, float* %72, i64 4
%74 = load float, float* %73
%75 = fadd float %71, %74
store float %75, float* %15
%76 = load i32, i32* %11
%77 = sitofp i32 %76 to float
%78 = load float*, float** %8
%79 = getelementptr inbounds float, float* %78, i64 5
%80 = load float, float* %79
%81 = load i32, i32* %12
%82 = sitofp i32 %81 to float
%83 = load float*, float** %8
%84 = getelementptr inbounds float, float* %83, i64 6
%85 = load float, float* %84
%86 = fmul float %82, %85
%87 = call float @llvm.fmuladd.f32(float %77, float %80, float %86)
%88 = load i32, i32* %13
%89 = sitofp i32 %88 to float
%90 = load float*, float** %8
%91 = getelementptr inbounds float, float* %90, i64 7
%92 = load float, float* %91
%93 = call float @llvm.fmuladd.f32(float %89, float %92, float %87)
%94 = load i32, i32* %14
%95 = sitofp i32 %94 to float
%96 = load float*, float** %8
%97 = getelementptr inbounds float, float* %96, i64 8
%98 = load float, float* %97
%99 = call float @llvm.fmuladd.f32(float %95, float %98, float %93)
%100 = load float*, float** %8
%101 = getelementptr inbounds float, float* %100, i64 9
%102 = load float, float* %101
%103 = fadd float %99, %102
store float %103, float* %16
%104 = load i32, i32* %11
%105 = sitofp i32 %104 to float
%106 = load float*, float** %8
%107 = getelementptr inbounds float, float* %106, i64 10
%108 = load float, float* %107
%109 = load i32, i32* %12
%110 = sitofp i32 %109 to float
%111 = load float*, float** %8
%112 = getelementptr inbounds float, float* %111, i64 11
%113 = load float, float* %112
%114 = fmul float %110, %113
%115 = call float @llvm.fmuladd.f32(float %105, float %108, float %114)
%116 = load i32, i32* %13
%117 = sitofp i32 %116 to float
%118 = load float*, float** %8
%119 = getelementptr inbounds float, float* %118, i64 12
%120 = load float, float* %119
%121 = call float @llvm.fmuladd.f32(float %117, float %120, float %115)
%122 = load i32, i32* %14
%123 = sitofp i32 %122 to float
%124 = load float*, float** %8
%125 = getelementptr inbounds float, float* %124, i64 13
%126 = load float, float* %125
%127 = call float @llvm.fmuladd.f32(float %123, float %126, float %121)
%128 = load float*, float** %8
%129 = getelementptr inbounds float, float* %128, i64 14
%130 = load float, float* %129
%131 = fadd float %127, %130
store float %131, float* %17
%132 = load i32, i32* %11
%133 = sitofp i32 %132 to float
%134 = load float*, float** %8
%135 = getelementptr inbounds float, float* %134, i64 15
%136 = load float, float* %135
%137 = load i32, i32* %12
%138 = sitofp i32 %137 to float
%139 = load float*, float** %8
%140 = getelementptr inbounds float, float* %139, i64 16
%141 = load float, float* %140
%142 = fmul float %138, %141
%143 = call float @llvm.fmuladd.f32(float %133, float %136, float %142)
%144 = load i32, i32* %13
%145 = sitofp i32 %144 to float
%146 = load float*, float** %8
%147 = getelementptr inbounds float, float* %146, i64 17
%148 = load float, float* %147
%149 = call float @llvm.fmuladd.f32(float %145, float %148, float %143)
%150 = load i32, i32* %14
%151 = sitofp i32 %150 to float
%152 = load float*, float** %8
%153 = getelementptr inbounds float, float* %152, i64 18
%154 = load float, float* %153
%155 = call float @llvm.fmuladd.f32(float %151, float %154, float %149)
%156 = load float*, float** %8
%157 = getelementptr inbounds float, float* %156, i64 19
%158 = load float, float* %157
%159 = fadd float %155, %158
store float %159, float* %18
%160 = load float, float* %15
%161 = fcmp ogt float %160, 2.550000e+02
br i1 %161, label %162, label %163
162: ; preds = %32
br label %171
163: ; preds = %32
%164 = load float, float* %15
%165 = fcmp olt float %164, 0.000000e+00
br i1 %165, label %166, label %167
166: ; preds = %163
br label %169
167: ; preds = %163
%168 = load float, float* %15
br label %169
169: ; preds = %167, %166
%170 = phi float [ 0.000000e+00, %166 ], [ %168, %167 ]
br label %171
171: ; preds = %169, %162
%172 = phi float [ 2.550000e+02, %162 ], [ %170, %169 ]
%173 = fptosi float %172 to i32
%174 = load float, float* %16
%175 = fcmp ogt float %174, 2.550000e+02
br i1 %175, label %176, label %177
176: ; preds = %171
br label %185
177: ; preds = %171
%178 = load float, float* %16
%179 = fcmp olt float %178, 0.000000e+00
br i1 %179, label %180, label %181
180: ; preds = %177
br label %183
181: ; preds = %177
%182 = load float, float* %16
br label %183
183: ; preds = %181, %180
%184 = phi float [ 0.000000e+00, %180 ], [ %182, %181 ]
br label %185
185: ; preds = %183, %176
%186 = phi float [ 2.550000e+02, %176 ], [ %184, %183 ]
%187 = fptosi float %186 to i32
%188 = shl i32 %187, 8
%189 = or i32 %173, %188
%190 = load float, float* %17
%191 = fcmp ogt float %190, 2.550000e+02
br i1 %191, label %192, label %193
192: ; preds = %185
br label %201
193: ; preds = %185
%194 = load float, float* %17
%195 = fcmp olt float %194, 0.000000e+00
br i1 %195, label %196, label %197
196: ; preds = %193
br label %199
197: ; preds = %193
%198 = load float, float* %17
br label %199
199: ; preds = %197, %196
%200 = phi float [ 0.000000e+00, %196 ], [ %198, %197 ]
br label %201
201: ; preds = %199, %192
%202 = phi float [ 2.550000e+02, %192 ], [ %200, %199 ]
%203 = fptosi float %202 to i32
%204 = shl i32 %203, 16
%205 = or i32 %189, %204
%206 = load float, float* %18
%207 = fcmp ogt float %206, 2.550000e+02
br i1 %207, label %208, label %209
208: ; preds = %201
br label %217
209: ; preds = %201
%210 = load float, float* %18
%211 = fcmp olt float %210, 0.000000e+00
br i1 %211, label %212, label %213
212: ; preds = %209
br label %215
213: ; preds = %209
%214 = load float, float* %18
br label %215
215: ; preds = %213, %212
%216 = phi float [ 0.000000e+00, %212 ], [ %214, %213 ]
br label %217
217: ; preds = %215, %208
%218 = phi float [ 2.550000e+02, %208 ], [ %216, %215 ]
%219 = fptosi float %218 to i32
%220 = shl i32 %219, 24
%221 = or i32 %205, %220
%222 = load i32*, i32** %10
%223 = getelementptr inbounds i32, i32* %222, i32 1
store i32* %223, i32** %10
store i32 %221, i32* %222
%224 = load i8*, i8** %5
%225 = getelementptr inbounds i8, i8* %224, i64 4
store i8* %225, i8** %5
br label %28
226: ; preds = %28
ret void
}

LLVM IR (-O2):
define void @colormatrix(i8* %0, i32 %1, i32 %2, float* nocapture %3) {
%5 = shl i32 %1, 2
%6 = mul i32 %5, %2
%7 = sext i32 %6 to i64
%8 = getelementptr inbounds i8, i8* %0, i64 %7
%9 = icmp sgt i32 %6, 0
br i1 %9, label %10, label %130
10: ; preds = %4
%11 = load float, float* %3
%12 = getelementptr inbounds float, float* %3, i64 1
%13 = load float, float* %12
%14 = getelementptr inbounds float, float* %3, i64 2
%15 = load float, float* %14
%16 = getelementptr inbounds float, float* %3, i64 3
%17 = load float, float* %16
%18 = getelementptr inbounds float, float* %3, i64 4
%19 = load float, float* %18
%20 = getelementptr inbounds float, float* %3, i64 5
%21 = load float, float* %20
%22 = getelementptr inbounds float, float* %3, i64 6
%23 = load float, float* %22
%24 = getelementptr inbounds float, float* %3, i64 7
%25 = load float, float* %24
%26 = getelementptr inbounds float, float* %3, i64 8
%27 = load float, float* %26
%28 = getelementptr inbounds float, float* %3, i64 9
%29 = load float, float* %28
%30 = getelementptr inbounds float, float* %3, i64 10
%31 = load float, float* %30
%32 = getelementptr inbounds float, float* %3, i64 11
%33 = load float, float* %32
%34 = getelementptr inbounds float, float* %3, i64 12
%35 = load float, float* %34
%36 = getelementptr inbounds float, float* %3, i64 13
%37 = load float, float* %36
%38 = getelementptr inbounds float, float* %3, i64 14
%39 = load float, float* %38
%40 = getelementptr inbounds float, float* %3, i64 15
%41 = load float, float* %40
%42 = getelementptr inbounds float, float* %3, i64 16
%43 = load float, float* %42
%44 = getelementptr inbounds float, float* %3, i64 17
%45 = load float, float* %44
%46 = getelementptr inbounds float, float* %3, i64 18
%47 = load float, float* %46
%48 = getelementptr inbounds float, float* %3, i64 19
%49 = load float, float* %48
%50 = insertelement <4 x float> poison, float %49, i64 0
%51 = insertelement <4 x float> %50, float %39, i64 1
%52 = insertelement <4 x float> %51, float %29, i64 2
%53 = insertelement <4 x float> %52, float %19, i64 3
%54 = insertelement <4 x float> poison, float %47, i64 0
%55 = insertelement <4 x float> %54, float %37, i64 1
%56 = insertelement <4 x float> %55, float %27, i64 2
%57 = insertelement <4 x float> %56, float %17, i64 3
%58 = insertelement <4 x float> poison, float %45, i64 0
%59 = insertelement <4 x float> %58, float %35, i64 1
%60 = insertelement <4 x float> %59, float %25, i64 2
%61 = insertelement <4 x float> %60, float %15, i64 3
%62 = insertelement <4 x float> poison, float %41, i64 0
%63 = insertelement <4 x float> %62, float %31, i64 1
%64 = insertelement <4 x float> %63, float %21, i64 2
%65 = insertelement <4 x float> %64, float %11, i64 3
%66 = insertelement <4 x float> poison, float %43, i64 0
%67 = insertelement <4 x float> %66, float %33, i64 1
%68 = insertelement <4 x float> %67, float %23, i64 2
%69 = insertelement <4 x float> %68, float %13, i64 3
br label %70
70: ; preds = %10, %70
%71 = phi i8* [ %0, %10 ], [ %128, %70 ]
%72 = bitcast i8* %71 to i32*
%73 = load i8, i8* %71
%74 = getelementptr inbounds i8, i8* %71, i64 1
%75 = load i8, i8* %74
%76 = getelementptr inbounds i8, i8* %71, i64 2
%77 = load i8, i8* %76
%78 = getelementptr inbounds i8, i8* %71, i64 3
%79 = load i8, i8* %78
%80 = uitofp i8 %73 to float
%81 = uitofp i8 %75 to float
%82 = uitofp i8 %77 to float
%83 = uitofp i8 %79 to float
%84 = insertelement <4 x float> poison, float %81, i64 0
%85 = shufflevector <4 x float> %84, <4 x float> poison, <4 x i32> zeroinitializer
%86 = fmul <4 x float> %69, %85
%87 = insertelement <4 x float> poison, float %80, i64 0
%88 = shufflevector <4 x float> %87, <4 x float> poison, <4 x i32> zeroinitializer
%89 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %88, <4 x float> %65, <4 x float> %86)
%90 = insertelement <4 x float> poison, float %82, i64 0
%91 = shufflevector <4 x float> %90, <4 x float> poison, <4 x i32> zeroinitializer
%92 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %91, <4 x float> %61, <4 x float> %89)
%93 = insertelement <4 x float> poison, float %83, i64 0
%94 = shufflevector <4 x float> %93, <4 x float> poison, <4 x i32> zeroinitializer
%95 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %94, <4 x float> %57, <4 x float> %92)
%96 = fadd <4 x float> %53, %95
%97 = extractelement <4 x float> %96, i64 3
%98 = fcmp ogt float %97, 2.550000e+02
%99 = fcmp olt <4 x float> %96, zeroinitializer
%100 = extractelement <4 x i1> %99, i64 3
%101 = select i1 %100, float 0.000000e+00, float %97
%102 = select i1 %98, float 2.550000e+02, float %101
%103 = fptosi float %102 to i32
%104 = extractelement <4 x float> %96, i64 2
%105 = fcmp ogt float %104, 2.550000e+02
%106 = extractelement <4 x i1> %99, i64 2
%107 = select i1 %106, float 0.000000e+00, float %104
%108 = select i1 %105, float 2.550000e+02, float %107
%109 = fptosi float %108 to i32
%110 = shl i32 %109, 8
%111 = or i32 %110, %103
%112 = extractelement <4 x float> %96, i64 1
%113 = fcmp ogt float %112, 2.550000e+02
%114 = extractelement <4 x i1> %99, i64 1
%115 = select i1 %114, float 0.000000e+00, float %112
%116 = select i1 %113, float 2.550000e+02, float %115
%117 = fptosi float %116 to i32
%118 = shl i32 %117, 16
%119 = or i32 %111, %118
%120 = extractelement <4 x float> %96, i64 0
%121 = fcmp ogt float %120, 2.550000e+02
%122 = extractelement <4 x i1> %99, i64 0
%123 = select i1 %122, float 0.000000e+00, float %120
%124 = select i1 %121, float 2.550000e+02, float %123
%125 = fptosi float %124 to i32
%126 = shl i32 %125, 24
%127 = or i32 %119, %126
%128 = getelementptr inbounds i8, i8* %71, i64 4
store i32 %127, i32* %72
%129 = icmp ult i8* %128, %8
br i1 %129, label %70, label %130
130: ; preds = %70, %4
ret void
}