void rgb2yuv(unsigned char **red, unsigned char **green, unsigned char **blue,
             unsigned char **Y, unsigned char **U, unsigned char **V,
             int height, int width) {
  int i, j;
  int value;
  for (i = 0; i < height; ++i) {
    for (j = 0; j < width; ++j) {
      value = red[i][j] * 0.2999 + green[i][j] * 0.587 + blue[i][j] * 0.114;
      if (value > 255)
        Y[i][j] = 255;
      else if (value < 0)
        Y[i][j] = 0;
      else
        Y[i][j] = (unsigned char)value;
      value = red[i][j] * (-0.168736) + green[i][j] * (-0.331264) +
              blue[i][j] * (0.500002) + 128;
      if (value > 255)
        U[i][j] = 255;
      else if (value < 0)
        U[i][j] = 0;
      else
        U[i][j] = (unsigned char)value;
      value = red[i][j] * 0.5 + green[i][j] * (-0.418688) +
              blue[i][j] * (-0.081312) + 128;
      if (value > 255)
        V[i][j] = 255;
      else if (value < 0)
        V[i][j] = 0;
      else
        V[i][j] = (unsigned char)value;
    }
  }
}


x86 assembly (clang, -O0):
<rgb2yuv>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    1429 <rgb2yuv+0x329>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    1416 <rgb2yuv+0x316>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm1
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe90(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xe7c(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe4c(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0xff,-0x3c(%rbp)
jle    11e9 <rgb2yuv+0xe9>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movb   $0xff,(%rax,%rcx,1)
jmp    1229 <rgb2yuv+0x129>
cmpl   $0x0,-0x3c(%rbp)
jge    120c <rgb2yuv+0x10c>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1224 <rgb2yuv+0x124>
mov    -0x3c(%rbp),%eax
mov    %al,%dl
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1229 <rgb2yuv+0x129>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm1
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
movsd  0xdcf(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xdbb(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
movsd  0xd8b(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd73(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0xff,-0x3c(%rbp)
jle    12d6 <rgb2yuv+0x1d6>
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movb   $0xff,(%rax,%rcx,1)
jmp    1316 <rgb2yuv+0x216>
cmpl   $0x0,-0x3c(%rbp)
jge    12f9 <rgb2yuv+0x1f9>
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1311 <rgb2yuv+0x211>
mov    -0x3c(%rbp),%eax
mov    %al,%dl
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1316 <rgb2yuv+0x216>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm1
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
movsd  0xcfa(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xce6(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
movsd  0xcb6(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xc86(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0xff,-0x3c(%rbp)
jle    13c3 <rgb2yuv+0x2c3>
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movb   $0xff,(%rax,%rcx,1)
jmp    1403 <rgb2yuv+0x303>
cmpl   $0x0,-0x3c(%rbp)
jge    13e6 <rgb2yuv+0x2e6>
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    13fe <rgb2yuv+0x2fe>
mov    -0x3c(%rbp),%eax
mov    %al,%dl
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1403 <rgb2yuv+0x303>
jmp    1408 <rgb2yuv+0x308>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    113c <rgb2yuv+0x3c>
jmp    141b <rgb2yuv+0x31b>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1129 <rgb2yuv+0x29>
pop    %rbp
ret

x86 assembly (clang, -O2):
<rgb2yuv>:
push   %rbp
push   %r15
push   %r14
push   %rbx
mov    0x28(%rsp),%eax
test   %eax,%eax
jle    12e1 <rgb2yuv+0x1e1>
mov    0x30(%rsp),%r10d
mov    %eax,%r11d
mov    %r10d,%r14d
xor    %r15d,%r15d
movsd  0xed7(%rip),%xmm8
movsd  0xed6(%rip),%xmm9
movsd  0xed5(%rip),%xmm10
movsd  0xed4(%rip),%xmm11
movsd  0xed4(%rip),%xmm4
movsd  0xed4(%rip),%xmm5
movsd  0xed4(%rip),%xmm6
movsd  0xed4(%rip),%xmm7
movsd  0xed4(%rip),%xmm0
movsd  0xed4(%rip),%xmm1
jmp    118d <rgb2yuv+0x8d>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%r15
cmp    %r11,%r15
je     12e1 <rgb2yuv+0x1e1>
test   %r10d,%r10d
jle    1180 <rgb2yuv+0x80>
xor    %eax,%eax
jmp    11b1 <rgb2yuv+0xb1>
cs nopw 0x0(%rax,%rax,1)
mov    (%r9,%r15,8),%rbx
mov    %bpl,(%rbx,%rax,1)
add    $0x1,%rax
cmp    %rax,%r14
je     1180 <rgb2yuv+0x80>
mov    (%rdi,%r15,8),%rbp
movzbl 0x0(%rbp,%rax,1),%ebp
xorps  %xmm2,%xmm2
cvtsi2sd %ebp,%xmm2
mov    (%rsi,%r15,8),%rbp
movzbl 0x0(%rbp,%rax,1),%ebp
xorps  %xmm3,%xmm3
cvtsi2sd %ebp,%xmm3
mulsd  %xmm8,%xmm3
mulsd  %xmm9,%xmm2
addsd  %xmm3,%xmm2
mov    (%rdx,%r15,8),%rbp
movzbl 0x0(%rbp,%rax,1),%ebp
xorps  %xmm3,%xmm3
cvtsi2sd %ebp,%xmm3
mulsd  %xmm10,%xmm3
addsd  %xmm2,%xmm3
cvttsd2si %xmm3,%ebp
test   %ebp,%ebp
jns    1202 <rgb2yuv+0x102>
xor    %ebp,%ebp
cmp    $0xff,%ebp
jl     120f <rgb2yuv+0x10f>
mov    $0xff,%ebp
mov    (%rcx,%r15,8),%rbx
mov    %bpl,(%rbx,%rax,1)
mov    (%rdi,%r15,8),%rbx
movzbl (%rbx,%rax,1),%ebx
xorps  %xmm2,%xmm2
cvtsi2sd %ebx,%xmm2
mov    (%rsi,%r15,8),%rbx
movzbl (%rbx,%rax,1),%ebx
xorps  %xmm3,%xmm3
cvtsi2sd %ebx,%xmm3
mulsd  %xmm11,%xmm3
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
mov    (%rdx,%r15,8),%rbx
movzbl (%rbx,%rax,1),%ebx
xorps  %xmm3,%xmm3
cvtsi2sd %ebx,%xmm3
mulsd  %xmm5,%xmm3
addsd  %xmm2,%xmm3
addsd  %xmm6,%xmm3
cvttsd2si %xmm3,%ebp
test   %ebp,%ebp
jns    1267 <rgb2yuv+0x167>
xor    %ebp,%ebp
cmp    $0xff,%ebp
jl     1274 <rgb2yuv+0x174>
mov    $0xff,%ebp
mov    (%r8,%r15,8),%rbx
mov    %bpl,(%rbx,%rax,1)
mov    (%rdi,%r15,8),%rbx
movzbl (%rbx,%rax,1),%ebx
xorps  %xmm2,%xmm2
cvtsi2sd %ebx,%xmm2
mov    (%rsi,%r15,8),%rbx
movzbl (%rbx,%rax,1),%ebx
xorps  %xmm3,%xmm3
cvtsi2sd %ebx,%xmm3
mulsd  %xmm7,%xmm3
mulsd  %xmm0,%xmm2
addsd  %xmm3,%xmm2
mov    (%rdx,%r15,8),%rbx
movzbl (%rbx,%rax,1),%ebx
xorps  %xmm3,%xmm3
cvtsi2sd %ebx,%xmm3
mulsd  %xmm1,%xmm3
addsd  %xmm2,%xmm3
addsd  %xmm6,%xmm3
cvttsd2si %xmm3,%ebp
test   %ebp,%ebp
jns    12cb <rgb2yuv+0x1cb>
xor    %ebp,%ebp
cmp    $0xff,%ebp
jl     11a0 <rgb2yuv+0xa0>
mov    $0xff,%ebp
jmp    11a0 <rgb2yuv+0xa0>
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @rgb2yuv(i8** nocapture %0, i8** nocapture %1, i8** nocapture %2, i8** nocapture %3, i8** nocapture %4, i8** nocapture %5, i32 %6, i32 %7) {
%9 = icmp sgt i32 %6, 0
br i1 %9, label %10, label %101
10: ; preds = %8
%11 = icmp sgt i32 %7, 0
%12 = zext i32 %6 to i64
%13 = zext i32 %7 to i64
br label %14
14: ; preds = %10, %98
%15 = phi i64 [ 0, %10 ], [ %99, %98 ]
br i1 %11, label %16, label %98
16: ; preds = %14
%17 = getelementptr inbounds i8*, i8** %0, i64 %15
%18 = getelementptr inbounds i8*, i8** %1, i64 %15
%19 = getelementptr inbounds i8*, i8** %2, i64 %15
%20 = getelementptr inbounds i8*, i8** %3, i64 %15
%21 = getelementptr inbounds i8*, i8** %4, i64 %15
%22 = getelementptr inbounds i8*, i8** %5, i64 %15
br label %23
23: ; preds = %16, %23
%24 = phi i64 [ 0, %16 ], [ %96, %23 ]
%25 = load i8*, i8** %17
%26 = getelementptr inbounds i8, i8* %25, i64 %24
%27 = load i8, i8* %26
%28 = uitofp i8 %27 to double
%29 = load i8*, i8** %18
%30 = getelementptr inbounds i8, i8* %29, i64 %24
%31 = load i8, i8* %30
%32 = uitofp i8 %31 to double
%33 = fmul double %32, 5.870000e-01
%34 = tail call double @llvm.fmuladd.f64(double %28, double 2.999000e-01, double %33)
%35 = load i8*, i8** %19
%36 = getelementptr inbounds i8, i8* %35, i64 %24
%37 = load i8, i8* %36
%38 = uitofp i8 %37 to double
%39 = tail call double @llvm.fmuladd.f64(double %38, double 1.140000e-01, double %34)
%40 = fptosi double %39 to i32
%41 = icmp sgt i32 %40, 0
%42 = select i1 %41, i32 %40, i32 0
%43 = icmp slt i32 %42, 255
%44 = select i1 %43, i32 %42, i32 255
%45 = trunc i32 %44 to i8
%46 = load i8*, i8** %20
%47 = getelementptr inbounds i8, i8* %46, i64 %24
store i8 %45, i8* %47
%48 = load i8*, i8** %17
%49 = getelementptr inbounds i8, i8* %48, i64 %24
%50 = load i8, i8* %49
%51 = uitofp i8 %50 to double
%52 = load i8*, i8** %18
%53 = getelementptr inbounds i8, i8* %52, i64 %24
%54 = load i8, i8* %53
%55 = uitofp i8 %54 to double
%56 = fmul double %55, -3.312640e-01
%57 = tail call double @llvm.fmuladd.f64(double %51, double -1.687360e-01, double %56)
%58 = load i8*, i8** %19
%59 = getelementptr inbounds i8, i8* %58, i64 %24
%60 = load i8, i8* %59
%61 = uitofp i8 %60 to double
%62 = tail call double @llvm.fmuladd.f64(double %61, double 5.000020e-01, double %57)
%63 = fadd double %62, 1.280000e+02
%64 = fptosi double %63 to i32
%65 = icmp sgt i32 %64, 0
%66 = select i1 %65, i32 %64, i32 0
%67 = icmp slt i32 %66, 255
%68 = select i1 %67, i32 %66, i32 255
%69 = trunc i32 %68 to i8
%70 = load i8*, i8** %21
%71 = getelementptr inbounds i8, i8* %70, i64 %24
store i8 %69, i8* %71
%72 = load i8*, i8** %17
%73 = getelementptr inbounds i8, i8* %72, i64 %24
%74 = load i8, i8* %73
%75 = uitofp i8 %74 to double
%76 = load i8*, i8** %18
%77 = getelementptr inbounds i8, i8* %76, i64 %24
%78 = load i8, i8* %77
%79 = uitofp i8 %78 to double
%80 = fmul double %79, -4.186880e-01
%81 = tail call double @llvm.fmuladd.f64(double %75, double 5.000000e-01, double %80)
%82 = load i8*, i8** %19
%83 = getelementptr inbounds i8, i8* %82, i64 %24
%84 = load i8, i8* %83
%85 = uitofp i8 %84 to double
%86 = tail call double @llvm.fmuladd.f64(double %85, double -8.131200e-02, double %81)
%87 = fadd double %86, 1.280000e+02
%88 = fptosi double %87 to i32
%89 = icmp sgt i32 %88, 0
%90 = select i1 %89, i32 %88, i32 0
%91 = icmp slt i32 %90, 255
%92 = select i1 %91, i32 %90, i32 255
%93 = trunc i32 %92 to i8
%94 = load i8*, i8** %22
%95 = getelementptr inbounds i8, i8* %94, i64 %24
store i8 %93, i8* %95
%96 = add nuw nsw i64 %24, 1
%97 = icmp eq i64 %96, %13
br i1 %97, label %98, label %23
98: ; preds = %23, %14
%99 = add nuw nsw i64 %15, 1
%100 = icmp eq i64 %99, %12
br i1 %100, label %101, label %14
101: ; preds = %98, %8
ret void
}