void rgb_filter(int width, int *pos_lut, int *neg_lut, unsigned char *src,
                unsigned char *dst, long int *neg0, long int *neg1,
                long int *neg2) {
  long int pixel;
  *dst++ = *src++;
  *dst++ = *src++;
  *dst++ = *src++;
  width -= 2;
  while (width > 0) {
    pixel = (pos_lut[*src++] - neg0[-3] - neg0[0] - neg0[3] - neg1[-3] -
             neg1[3] - neg2[-3] - neg2[0] - neg2[3]);
    pixel = (pixel + 4) >> 3;
    if (pixel < 0)
      *dst++ = 0;
    else if (pixel < 255)
      *dst++ = pixel;
    else
      *dst++ = 255;
    pixel = (pos_lut[*src++] - neg0[-2] - neg0[1] - neg0[4] - neg1[-2] -
             neg1[4] - neg2[-2] - neg2[1] - neg2[4]);
    pixel = (pixel + 4) >> 3;
    if (pixel < 0)
      *dst++ = 0;
    else if (pixel < 255)
      *dst++ = pixel;
    else
      *dst++ = 255;
    pixel = (pos_lut[*src++] - neg0[-1] - neg0[2] - neg0[5] - neg1[-1] -
             neg1[5] - neg2[-1] - neg2[2] - neg2[5]);
    pixel = (pixel + 4) >> 3;
    if (pixel < 0)
      *dst++ = 0;
    else if (pixel < 255)
      *dst++ = pixel;
    else
      *dst++ = 255;
    neg0 += 3;
    neg1 += 3;
    neg2 += 3;
    width--;
  };
  *dst++ = *src++;
  *dst++ = *src++;
  *dst++ = *src++;
}


x86 assembly (clang, -O0):
<rgb_filter>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x4(%rbp)
cmpl   $0x0,-0x4(%rbp)
jle    143f <rgb_filter+0x33f>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
movzbl (%rcx),%ecx
movslq (%rax,%rcx,4),%rax
mov    -0x30(%rbp),%rcx
sub    -0x18(%rcx),%rax
mov    -0x30(%rbp),%rcx
sub    (%rcx),%rax
mov    -0x30(%rbp),%rcx
sub    0x18(%rcx),%rax
mov    0x10(%rbp),%rcx
sub    -0x18(%rcx),%rax
mov    0x10(%rbp),%rcx
sub    0x18(%rcx),%rax
mov    0x18(%rbp),%rcx
sub    -0x18(%rcx),%rax
mov    0x18(%rbp),%rcx
sub    (%rcx),%rax
mov    0x18(%rbp),%rcx
sub    0x18(%rcx),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
sar    $0x3,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jge    122a <rgb_filter+0x12a>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x0,(%rax)
jmp    126b <rgb_filter+0x16b>
cmpq   $0xff,-0x38(%rbp)
jge    1254 <rgb_filter+0x154>
mov    -0x38(%rbp),%rax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    1266 <rgb_filter+0x166>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0xff,(%rax)
jmp    126b <rgb_filter+0x16b>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
movzbl (%rcx),%ecx
movslq (%rax,%rcx,4),%rax
mov    -0x30(%rbp),%rcx
sub    -0x10(%rcx),%rax
mov    -0x30(%rbp),%rcx
sub    0x8(%rcx),%rax
mov    -0x30(%rbp),%rcx
sub    0x20(%rcx),%rax
mov    0x10(%rbp),%rcx
sub    -0x10(%rcx),%rax
mov    0x10(%rbp),%rcx
sub    0x20(%rcx),%rax
mov    0x18(%rbp),%rcx
sub    -0x10(%rcx),%rax
mov    0x18(%rbp),%rcx
sub    0x8(%rcx),%rax
mov    0x18(%rbp),%rcx
sub    0x20(%rcx),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
sar    $0x3,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jge    12fb <rgb_filter+0x1fb>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x0,(%rax)
jmp    133c <rgb_filter+0x23c>
cmpq   $0xff,-0x38(%rbp)
jge    1325 <rgb_filter+0x225>
mov    -0x38(%rbp),%rax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    1337 <rgb_filter+0x237>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0xff,(%rax)
jmp    133c <rgb_filter+0x23c>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
movzbl (%rcx),%ecx
movslq (%rax,%rcx,4),%rax
mov    -0x30(%rbp),%rcx
sub    -0x8(%rcx),%rax
mov    -0x30(%rbp),%rcx
sub    0x10(%rcx),%rax
mov    -0x30(%rbp),%rcx
sub    0x28(%rcx),%rax
mov    0x10(%rbp),%rcx
sub    -0x8(%rcx),%rax
mov    0x10(%rbp),%rcx
sub    0x28(%rcx),%rax
mov    0x18(%rbp),%rcx
sub    -0x8(%rcx),%rax
mov    0x18(%rbp),%rcx
sub    0x10(%rcx),%rax
mov    0x18(%rbp),%rcx
sub    0x28(%rcx),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
sar    $0x3,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jge    13cc <rgb_filter+0x2cc>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x0,(%rax)
jmp    140d <rgb_filter+0x30d>
cmpq   $0xff,-0x38(%rbp)
jge    13f6 <rgb_filter+0x2f6>
mov    -0x38(%rbp),%rax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    1408 <rgb_filter+0x308>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0xff,(%rax)
jmp    140d <rgb_filter+0x30d>
mov    -0x30(%rbp),%rax
add    $0x18,%rax
mov    %rax,-0x30(%rbp)
mov    0x10(%rbp),%rax
add    $0x18,%rax
mov    %rax,0x10(%rbp)
mov    0x18(%rbp),%rax
add    $0x18,%rax
mov    %rax,0x18(%rbp)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
jmp    1192 <rgb_filter+0x92>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<rgb_filter>:
push   %rbp
push   %r14
push   %rbx
mov    (%rcx),%al
mov    %al,(%r8)
mov    0x1(%rcx),%al
mov    %al,0x1(%r8)
mov    0x2(%rcx),%al
mov    %al,0x2(%r8)
cmp    $0x3,%edi
jl     125c <rgb_filter+0x15c>
mov    0x28(%rsp),%rax
mov    0x20(%rsp),%r10
add    $0xffffffff,%edi
xor    %r11d,%r11d
mov    $0xff,%r14d
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movzbl 0x3(%rcx,%rdx,1),%ebx
movslq (%rsi,%rbx,4),%rbx
mov    -0x18(%r9,%rdx,8),%rbp
add    (%r9,%rdx,8),%rbp
add    0x18(%r9,%rdx,8),%rbp
add    -0x18(%r10,%rdx,8),%rbp
add    0x18(%r10,%rdx,8),%rbp
add    -0x18(%rax,%rdx,8),%rbp
add    (%rax,%rdx,8),%rbp
add    0x18(%rax,%rdx,8),%rbp
sub    %rbp,%rbx
lea    0x4(%rbx),%ebp
shr    $0x3,%ebp
cmp    $0x7f4,%rbx
cmovge %r14d,%ebp
cmp    $0xfffffffffffffffc,%rbx
cmovl  %r11d,%ebp
mov    %bpl,0x3(%r8,%rdx,1)
movzbl 0x4(%rcx,%rdx,1),%ebx
movslq (%rsi,%rbx,4),%rbx
mov    -0x10(%r9,%rdx,8),%rbp
add    0x8(%r9,%rdx,8),%rbp
add    0x20(%r9,%rdx,8),%rbp
add    -0x10(%r10,%rdx,8),%rbp
add    0x20(%r10,%rdx,8),%rbp
add    -0x10(%rax,%rdx,8),%rbp
add    0x8(%rax,%rdx,8),%rbp
add    0x20(%rax,%rdx,8),%rbp
sub    %rbp,%rbx
lea    0x4(%rbx),%ebp
shr    $0x3,%ebp
cmp    $0x7f4,%rbx
cmovge %r14d,%ebp
cmp    $0xfffffffffffffffc,%rbx
cmovl  %r11d,%ebp
mov    %bpl,0x4(%r8,%rdx,1)
movzbl 0x5(%rcx,%rdx,1),%ebx
movslq (%rsi,%rbx,4),%rbx
mov    -0x8(%r9,%rdx,8),%rbp
add    0x10(%r9,%rdx,8),%rbp
add    0x28(%r9,%rdx,8),%rbp
add    -0x8(%r10,%rdx,8),%rbp
add    0x28(%r10,%rdx,8),%rbp
add    -0x8(%rax,%rdx,8),%rbp
add    0x10(%rax,%rdx,8),%rbp
add    0x28(%rax,%rdx,8),%rbp
sub    %rbp,%rbx
lea    0x4(%rbx),%ebp
shr    $0x3,%ebp
cmp    $0x7f4,%rbx
cmovge %r14d,%ebp
cmp    $0xfffffffffffffffc,%rbx
cmovl  %r11d,%ebp
mov    %bpl,0x5(%r8,%rdx,1)
add    $0x3,%rdx
add    $0xffffffff,%edi
cmp    $0x1,%edi
jg     1140 <rgb_filter+0x40>
lea    (%rcx,%rdx,1),%rax
add    $0x3,%rax
add    %rdx,%rcx
lea    (%r8,%rdx,1),%rsi
add    $0x3,%rsi
add    %rdx,%r8
jmp    1264 <rgb_filter+0x164>
lea    0x3(%r8),%rsi
lea    0x3(%rcx),%rax
mov    (%rax),%al
mov    %al,(%rsi)
mov    0x4(%rcx),%al
mov    %al,0x4(%r8)
mov    0x5(%rcx),%al
mov    %al,0x5(%r8)
pop    %rbx
pop    %r14
pop    %rbp
ret

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

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