void bayer2rgb24(unsigned char *dst, unsigned char *src, long int WIDTH,
                 long int HEIGHT) {
  long int i;
  unsigned char *rawpt, *scanpt;
  long int size;
  rawpt = src;
  scanpt = dst;
  size = WIDTH * HEIGHT;
  for (i = 0; i < size; i++) {
    if ((i / WIDTH) % 2 == 0) {
      if ((i % 2) == 0) {
        if ((i > WIDTH) && ((i % WIDTH) > 0)) {
          *scanpt++ = (*(rawpt - WIDTH - 1) + *(rawpt - WIDTH + 1) +
                       *(rawpt + WIDTH - 1) + *(rawpt + WIDTH + 1)) /
                      4;
          *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt + WIDTH) +
                       *(rawpt - WIDTH)) /
                      4;
          *scanpt++ = *rawpt;
        } else {
          *scanpt++ = *(rawpt + WIDTH + 1);
          *scanpt++ = (*(rawpt + 1) + *(rawpt + WIDTH)) / 2;
          *scanpt++ = *rawpt;
        }
      } else {
        if ((i > WIDTH) && ((i % WIDTH) < (WIDTH - 1))) {
          *scanpt++ = (*(rawpt + WIDTH) + *(rawpt - WIDTH)) / 2;
          *scanpt++ = *rawpt;
          *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2;
        } else {
          *scanpt++ = *(rawpt + WIDTH);
          *scanpt++ = *rawpt;
          *scanpt++ = *(rawpt - 1);
        }
      }
    } else {
      if ((i % 2) == 0) {
        if ((i < (WIDTH * (HEIGHT - 1))) && ((i % WIDTH) > 0)) {
          *scanpt++ = (*(rawpt - 1) + *(rawpt + 1)) / 2;
          *scanpt++ = *rawpt;
          *scanpt++ = (*(rawpt + WIDTH) + *(rawpt - WIDTH)) / 2;
        } else {
          *scanpt++ = *(rawpt + 1);
          *scanpt++ = *rawpt;
          *scanpt++ = *(rawpt - WIDTH);
        }
      } else {
        if (i < (WIDTH * (HEIGHT - 1)) && ((i % WIDTH) < (WIDTH - 1))) {
          *scanpt++ = *rawpt;
          *scanpt++ = (*(rawpt - 1) + *(rawpt + 1) + *(rawpt - WIDTH) +
                       *(rawpt + WIDTH)) /
                      4;
          *scanpt++ = (*(rawpt - WIDTH - 1) + *(rawpt - WIDTH + 1) +
                       *(rawpt + WIDTH - 1) + *(rawpt + WIDTH + 1)) /
                      4;
        } else {
          *scanpt++ = *rawpt;
          *scanpt++ = (*(rawpt - 1) + *(rawpt - WIDTH)) / 2;
          *scanpt++ = *(rawpt - WIDTH - 1);
        }
      }
    }
    rawpt++;
  }
}


x86 assembly (clang, -O0):
<bayer2rgb24>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rax
imul   -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x40(%rbp),%rax
jge    166a <bayer2rgb24+0x56a>
mov    -0x28(%rbp),%rax
cqto
idivq  -0x18(%rbp)
mov    $0x2,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    13c7 <bayer2rgb24+0x2c7>
mov    -0x28(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    12c9 <bayer2rgb24+0x1c9>
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jle    125f <bayer2rgb24+0x15f>
mov    -0x28(%rbp),%rax
cqto
idivq  -0x18(%rbp)
cmp    $0x0,%rdx
jle    125f <bayer2rgb24+0x15f>
mov    -0x30(%rbp),%rax
xor    %ecx,%ecx
sub    -0x18(%rbp),%rcx
movzbl -0x1(%rax,%rcx,1),%eax
mov    -0x30(%rbp),%rcx
xor    %edx,%edx
sub    -0x18(%rbp),%rdx
movzbl 0x1(%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rdx
movzbl -0x1(%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rdx
movzbl 0x1(%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
movzbl -0x1(%rax),%eax
mov    -0x30(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
xor    %edx,%edx
sub    -0x18(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    12c4 <bayer2rgb24+0x1c4>
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    0x1(%rax,%rcx,1),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x1(%rax),%eax
mov    -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    13c2 <bayer2rgb24+0x2c2>
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jle    1372 <bayer2rgb24+0x272>
mov    -0x28(%rbp),%rax
cqto
idivq  -0x18(%rbp)
mov    -0x18(%rbp),%rax
sub    $0x1,%rax
cmp    %rax,%rdx
jge    1372 <bayer2rgb24+0x272>
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x30(%rbp),%rcx
xor    %edx,%edx
sub    -0x18(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
movzbl -0x1(%rax),%eax
mov    -0x30(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
add    %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    13bd <bayer2rgb24+0x2bd>
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    -0x1(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    13c2 <bayer2rgb24+0x2c2>
jmp    164d <bayer2rgb24+0x54d>
mov    -0x28(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    14e2 <bayer2rgb24+0x3e2>
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rdx
sub    $0x1,%rdx
imul   %rdx,%rcx
cmp    %rcx,%rax
jge    1490 <bayer2rgb24+0x390>
mov    -0x28(%rbp),%rax
cqto
idivq  -0x18(%rbp)
cmp    $0x0,%rdx
jle    1490 <bayer2rgb24+0x390>
mov    -0x30(%rbp),%rax
movzbl -0x1(%rax),%eax
mov    -0x30(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
add    %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x30(%rbp),%rcx
xor    %edx,%edx
sub    -0x18(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    14dd <bayer2rgb24+0x3dd>
mov    -0x30(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
xor    %ecx,%ecx
sub    -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    1648 <bayer2rgb24+0x548>
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rdx
sub    $0x1,%rdx
imul   %rdx,%rcx
cmp    %rcx,%rax
jge    15da <bayer2rgb24+0x4da>
mov    -0x28(%rbp),%rax
cqto
idivq  -0x18(%rbp)
mov    -0x18(%rbp),%rax
sub    $0x1,%rax
cmp    %rax,%rdx
jge    15da <bayer2rgb24+0x4da>
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
movzbl -0x1(%rax),%eax
mov    -0x30(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
xor    %edx,%edx
sub    -0x18(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
xor    %ecx,%ecx
sub    -0x18(%rbp),%rcx
movzbl -0x1(%rax,%rcx,1),%eax
mov    -0x30(%rbp),%rcx
xor    %edx,%edx
sub    -0x18(%rbp),%rdx
movzbl 0x1(%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rdx
movzbl -0x1(%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rdx
movzbl 0x1(%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    1643 <bayer2rgb24+0x543>
mov    -0x30(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
movzbl -0x1(%rax),%eax
mov    -0x30(%rbp),%rcx
xor    %edx,%edx
sub    -0x18(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
xor    %ecx,%ecx
sub    -0x18(%rbp),%rcx
mov    -0x1(%rax,%rcx,1),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    1648 <bayer2rgb24+0x548>
jmp    164d <bayer2rgb24+0x54d>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1139 <bayer2rgb24+0x39>
pop    %rbp
ret

x86 assembly (clang, -O2):
<bayer2rgb24>:
push   %r15
push   %r14
push   %rbx
mov    %rcx,%r10
imul   %rdx,%r10
test   %r10,%r10
jle    13c4 <bayer2rgb24+0x2c4>
mov    %rdx,%r8
add    $0xffffffffffffffff,%rcx
imul   %rdx,%rcx
lea    -0x1(%rdx),%r11
add    $0x2,%rdi
mov    %rsi,%r14
sub    %rdx,%r14
lea    (%rsi,%rdx,1),%r15
xor    %r9d,%r9d
jmp    1160 <bayer2rgb24+0x60>
movzbl (%r15,%r9,1),%eax
mov    %al,-0x2(%rdi)
movzbl (%rsi,%r9,1),%eax
mov    %al,-0x1(%rdi)
movzbl -0x1(%rsi,%r9,1),%eax
mov    %al,(%rdi)
add    $0x1,%r9
add    $0x3,%rdi
cmp    %r9,%r10
je     13c4 <bayer2rgb24+0x2c4>
mov    %r9,%rbx
or     %r8,%rbx
shr    $0x20,%rbx
je     1200 <bayer2rgb24+0x100>
mov    %r9,%rax
cqto
idiv   %r8
test   $0x1,%al
jne    1210 <bayer2rgb24+0x110>
test   $0x1,%r9b
jne    1270 <bayer2rgb24+0x170>
cmp    %r8,%r9
jle    1332 <bayer2rgb24+0x232>
test   %rbx,%rbx
je     1321 <bayer2rgb24+0x221>
mov    %r9,%rax
cqto
idiv   %r8
test   %rdx,%rdx
je     1332 <bayer2rgb24+0x232>
movzbl -0x1(%r14,%r9,1),%eax
movzbl 0x1(%r14,%r9,1),%edx
add    %eax,%edx
movzbl -0x1(%r15,%r9,1),%eax
add    %edx,%eax
movzbl 0x1(%r15,%r9,1),%edx
add    %eax,%edx
shr    $0x2,%edx
mov    %dl,-0x2(%rdi)
movzbl -0x1(%rsi,%r9,1),%eax
movzbl 0x1(%rsi,%r9,1),%edx
add    %eax,%edx
movzbl (%r15,%r9,1),%eax
add    %edx,%eax
movzbl (%r14,%r9,1),%edx
add    %eax,%edx
shr    $0x2,%edx
jmp    134a <bayer2rgb24+0x24a>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r9d,%eax
xor    %edx,%edx
div    %r8d
test   $0x1,%al
je     1180 <bayer2rgb24+0x80>
test   $0x1,%r9b
jne    12a0 <bayer2rgb24+0x1a0>
cmp    %rcx,%r9
jge    1368 <bayer2rgb24+0x268>
test   %rbx,%rbx
je     1357 <bayer2rgb24+0x257>
mov    %r9,%rax
cqto
idiv   %r8
test   %rdx,%rdx
je     1368 <bayer2rgb24+0x268>
movzbl -0x1(%rsi,%r9,1),%eax
movzbl 0x1(%rsi,%r9,1),%edx
add    %eax,%edx
shr    %edx
mov    %dl,-0x2(%rdi)
movzbl (%rsi,%r9,1),%eax
mov    %al,-0x1(%rdi)
movzbl (%r15,%r9,1),%eax
movzbl (%r14,%r9,1),%edx
jmp    13b9 <bayer2rgb24+0x2b9>
nopw   0x0(%rax,%rax,1)
cmp    %r8,%r9
jle    1137 <bayer2rgb24+0x37>
test   %rbx,%rbx
je     1383 <bayer2rgb24+0x283>
mov    %r9,%rax
cqto
idiv   %r8
cmp    %r11,%rdx
jge    1137 <bayer2rgb24+0x37>
jmp    1394 <bayer2rgb24+0x294>
nopl   0x0(%rax,%rax,1)
cmp    %rcx,%r9
jge    12fc <bayer2rgb24+0x1fc>
cmp    %r11,%rdx
jge    12fc <bayer2rgb24+0x1fc>
movzbl (%rsi,%r9,1),%eax
mov    %al,-0x2(%rdi)
movzbl -0x1(%rsi,%r9,1),%eax
movzbl 0x1(%rsi,%r9,1),%edx
add    %eax,%edx
movzbl (%r14,%r9,1),%eax
add    %edx,%eax
movzbl (%r15,%r9,1),%edx
add    %eax,%edx
shr    $0x2,%edx
mov    %dl,-0x1(%rdi)
movzbl -0x1(%r14,%r9,1),%eax
movzbl 0x1(%r14,%r9,1),%edx
add    %eax,%edx
movzbl -0x1(%r15,%r9,1),%eax
add    %edx,%eax
movzbl 0x1(%r15,%r9,1),%edx
add    %eax,%edx
shr    $0x2,%edx
mov    %dl,(%rdi)
jmp    114f <bayer2rgb24+0x4f>
movzbl (%rsi,%r9,1),%eax
mov    %al,-0x2(%rdi)
movzbl -0x1(%rsi,%r9,1),%eax
movzbl (%r14,%r9,1),%edx
add    %eax,%edx
shr    %edx
mov    %dl,-0x1(%rdi)
movzbl -0x1(%r14,%r9,1),%eax
jmp    114d <bayer2rgb24+0x4d>
mov    %r9d,%eax
xor    %edx,%edx
div    %r8d
test   %rdx,%rdx
jne    11ad <bayer2rgb24+0xad>
movzbl 0x1(%r15,%r9,1),%eax
mov    %al,-0x2(%rdi)
movzbl 0x1(%rsi,%r9,1),%eax
movzbl (%r15,%r9,1),%edx
add    %eax,%edx
shr    %edx
mov    %dl,-0x1(%rdi)
movzbl (%rsi,%r9,1),%eax
jmp    114d <bayer2rgb24+0x4d>
mov    %r9d,%eax
xor    %edx,%edx
div    %r8d
test   %rdx,%rdx
jne    123d <bayer2rgb24+0x13d>
movzbl 0x1(%rsi,%r9,1),%eax
mov    %al,-0x2(%rdi)
movzbl (%rsi,%r9,1),%eax
mov    %al,-0x1(%rdi)
movzbl (%r14,%r9,1),%eax
jmp    114d <bayer2rgb24+0x4d>
mov    %r9d,%eax
xor    %edx,%edx
div    %r8d
cmp    %r11,%rdx
jge    1137 <bayer2rgb24+0x37>
movzbl (%r15,%r9,1),%eax
movzbl (%r14,%r9,1),%edx
add    %eax,%edx
shr    %edx
mov    %dl,-0x2(%rdi)
movzbl (%rsi,%r9,1),%eax
mov    %al,-0x1(%rdi)
movzbl -0x1(%rsi,%r9,1),%eax
movzbl 0x1(%rsi,%r9,1),%edx
add    %eax,%edx
shr    %edx
mov    %dl,(%rdi)
jmp    114f <bayer2rgb24+0x4f>
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @bayer2rgb24(i8* %0, i8* %1, i64 %2, i64 %3) {
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i8*
%11 = alloca i8*
%12 = alloca i64
store i8* %0, i8** %5
store i8* %1, i8** %6
store i64 %2, i64* %7
store i64 %3, i64* %8
%13 = load i8*, i8** %6
store i8* %13, i8** %10
%14 = load i8*, i8** %5
store i8* %14, i8** %11
%15 = load i64, i64* %7
%16 = load i64, i64* %8
%17 = mul nsw i64 %15, %16
store i64 %17, i64* %12
store i64 0, i64* %9
br label %18
18: ; preds = %374, %4
%19 = load i64, i64* %9
%20 = load i64, i64* %12
%21 = icmp slt i64 %19, %20
br i1 %21, label %22, label %377
22: ; preds = %18
%23 = load i64, i64* %9
%24 = load i64, i64* %7
%25 = sdiv i64 %23, %24
%26 = srem i64 %25, 2
%27 = icmp eq i64 %26, 0
br i1 %27, label %28, label %195
28: ; preds = %22
%29 = load i64, i64* %9
%30 = srem i64 %29, 2
%31 = icmp eq i64 %30, 0
br i1 %31, label %32, label %132
32: ; preds = %28
%33 = load i64, i64* %9
%34 = load i64, i64* %7
%35 = icmp sgt i64 %33, %34
br i1 %35, label %36, label %105
36: ; preds = %32
%37 = load i64, i64* %9
%38 = load i64, i64* %7
%39 = srem i64 %37, %38
%40 = icmp sgt i64 %39, 0
br i1 %40, label %41, label %105
41: ; preds = %36
%42 = load i8*, i8** %10
%43 = load i64, i64* %7
%44 = sub i64 0, %43
%45 = getelementptr inbounds i8, i8* %42, i64 %44
%46 = getelementptr inbounds i8, i8* %45, i64 -1
%47 = load i8, i8* %46
%48 = zext i8 %47 to i32
%49 = load i8*, i8** %10
%50 = load i64, i64* %7
%51 = sub i64 0, %50
%52 = getelementptr inbounds i8, i8* %49, i64 %51
%53 = getelementptr inbounds i8, i8* %52, i64 1
%54 = load i8, i8* %53
%55 = zext i8 %54 to i32
%56 = add nsw i32 %48, %55
%57 = load i8*, i8** %10
%58 = load i64, i64* %7
%59 = getelementptr inbounds i8, i8* %57, i64 %58
%60 = getelementptr inbounds i8, i8* %59, i64 -1
%61 = load i8, i8* %60
%62 = zext i8 %61 to i32
%63 = add nsw i32 %56, %62
%64 = load i8*, i8** %10
%65 = load i64, i64* %7
%66 = getelementptr inbounds i8, i8* %64, i64 %65
%67 = getelementptr inbounds i8, i8* %66, i64 1
%68 = load i8, i8* %67
%69 = zext i8 %68 to i32
%70 = add nsw i32 %63, %69
%71 = sdiv i32 %70, 4
%72 = trunc i32 %71 to i8
%73 = load i8*, i8** %11
%74 = getelementptr inbounds i8, i8* %73, i32 1
store i8* %74, i8** %11
store i8 %72, i8* %73
%75 = load i8*, i8** %10
%76 = getelementptr inbounds i8, i8* %75, i64 -1
%77 = load i8, i8* %76
%78 = zext i8 %77 to i32
%79 = load i8*, i8** %10
%80 = getelementptr inbounds i8, i8* %79, i64 1
%81 = load i8, i8* %80
%82 = zext i8 %81 to i32
%83 = add nsw i32 %78, %82
%84 = load i8*, i8** %10
%85 = load i64, i64* %7
%86 = getelementptr inbounds i8, i8* %84, i64 %85
%87 = load i8, i8* %86
%88 = zext i8 %87 to i32
%89 = add nsw i32 %83, %88
%90 = load i8*, i8** %10
%91 = load i64, i64* %7
%92 = sub i64 0, %91
%93 = getelementptr inbounds i8, i8* %90, i64 %92
%94 = load i8, i8* %93
%95 = zext i8 %94 to i32
%96 = add nsw i32 %89, %95
%97 = sdiv i32 %96, 4
%98 = trunc i32 %97 to i8
%99 = load i8*, i8** %11
%100 = getelementptr inbounds i8, i8* %99, i32 1
store i8* %100, i8** %11
store i8 %98, i8* %99
%101 = load i8*, i8** %10
%102 = load i8, i8* %101
%103 = load i8*, i8** %11
%104 = getelementptr inbounds i8, i8* %103, i32 1
store i8* %104, i8** %11
store i8 %102, i8* %103
br label %131
105: ; preds = %36, %32
%106 = load i8*, i8** %10
%107 = load i64, i64* %7
%108 = getelementptr inbounds i8, i8* %106, i64 %107
%109 = getelementptr inbounds i8, i8* %108, i64 1
%110 = load i8, i8* %109
%111 = load i8*, i8** %11
%112 = getelementptr inbounds i8, i8* %111, i32 1
store i8* %112, i8** %11
store i8 %110, i8* %111
%113 = load i8*, i8** %10
%114 = getelementptr inbounds i8, i8* %113, i64 1
%115 = load i8, i8* %114
%116 = zext i8 %115 to i32
%117 = load i8*, i8** %10
%118 = load i64, i64* %7
%119 = getelementptr inbounds i8, i8* %117, i64 %118
%120 = load i8, i8* %119
%121 = zext i8 %120 to i32
%122 = add nsw i32 %116, %121
%123 = sdiv i32 %122, 2
%124 = trunc i32 %123 to i8
%125 = load i8*, i8** %11
%126 = getelementptr inbounds i8, i8* %125, i32 1
store i8* %126, i8** %11
store i8 %124, i8* %125
%127 = load i8*, i8** %10
%128 = load i8, i8* %127
%129 = load i8*, i8** %11
%130 = getelementptr inbounds i8, i8* %129, i32 1
store i8* %130, i8** %11
store i8 %128, i8* %129
br label %131
131: ; preds = %105, %41
br label %194
132: ; preds = %28
%133 = load i64, i64* %9
%134 = load i64, i64* %7
%135 = icmp sgt i64 %133, %134
br i1 %135, label %136, label %177
136: ; preds = %132
%137 = load i64, i64* %9
%138 = load i64, i64* %7
%139 = srem i64 %137, %138
%140 = load i64, i64* %7
%141 = sub nsw i64 %140, 1
%142 = icmp slt i64 %139, %141
br i1 %142, label %143, label %177
143: ; preds = %136
%144 = load i8*, i8** %10
%145 = load i64, i64* %7
%146 = getelementptr inbounds i8, i8* %144, i64 %145
%147 = load i8, i8* %146
%148 = zext i8 %147 to i32
%149 = load i8*, i8** %10
%150 = load i64, i64* %7
%151 = sub i64 0, %150
%152 = getelementptr inbounds i8, i8* %149, i64 %151
%153 = load i8, i8* %152
%154 = zext i8 %153 to i32
%155 = add nsw i32 %148, %154
%156 = sdiv i32 %155, 2
%157 = trunc i32 %156 to i8
%158 = load i8*, i8** %11
%159 = getelementptr inbounds i8, i8* %158, i32 1
store i8* %159, i8** %11
store i8 %157, i8* %158
%160 = load i8*, i8** %10
%161 = load i8, i8* %160
%162 = load i8*, i8** %11
%163 = getelementptr inbounds i8, i8* %162, i32 1
store i8* %163, i8** %11
store i8 %161, i8* %162
%164 = load i8*, i8** %10
%165 = getelementptr inbounds i8, i8* %164, i64 -1
%166 = load i8, i8* %165
%167 = zext i8 %166 to i32
%168 = load i8*, i8** %10
%169 = getelementptr inbounds i8, i8* %168, i64 1
%170 = load i8, i8* %169
%171 = zext i8 %170 to i32
%172 = add nsw i32 %167, %171
%173 = sdiv i32 %172, 2
%174 = trunc i32 %173 to i8
%175 = load i8*, i8** %11
%176 = getelementptr inbounds i8, i8* %175, i32 1
store i8* %176, i8** %11
store i8 %174, i8* %175
br label %193
177: ; preds = %136, %132
%178 = load i8*, i8** %10
%179 = load i64, i64* %7
%180 = getelementptr inbounds i8, i8* %178, i64 %179
%181 = load i8, i8* %180
%182 = load i8*, i8** %11
%183 = getelementptr inbounds i8, i8* %182, i32 1
store i8* %183, i8** %11
store i8 %181, i8* %182
%184 = load i8*, i8** %10
%185 = load i8, i8* %184
%186 = load i8*, i8** %11
%187 = getelementptr inbounds i8, i8* %186, i32 1
store i8* %187, i8** %11
store i8 %185, i8* %186
%188 = load i8*, i8** %10
%189 = getelementptr inbounds i8, i8* %188, i64 -1
%190 = load i8, i8* %189
%191 = load i8*, i8** %11
%192 = getelementptr inbounds i8, i8* %191, i32 1
store i8* %192, i8** %11
store i8 %190, i8* %191
br label %193
193: ; preds = %177, %143
br label %194
194: ; preds = %193, %131
br label %371
195: ; preds = %22
%196 = load i64, i64* %9
%197 = srem i64 %196, 2
%198 = icmp eq i64 %197, 0
br i1 %198, label %199, label %263
199: ; preds = %195
%200 = load i64, i64* %9
%201 = load i64, i64* %7
%202 = load i64, i64* %8
%203 = sub nsw i64 %202, 1
%204 = mul nsw i64 %201, %203
%205 = icmp slt i64 %200, %204
br i1 %205, label %206, label %245
206: ; preds = %199
%207 = load i64, i64* %9
%208 = load i64, i64* %7
%209 = srem i64 %207, %208
%210 = icmp sgt i64 %209, 0
br i1 %210, label %211, label %245
211: ; preds = %206
%212 = load i8*, i8** %10
%213 = getelementptr inbounds i8, i8* %212, i64 -1
%214 = load i8, i8* %213
%215 = zext i8 %214 to i32
%216 = load i8*, i8** %10
%217 = getelementptr inbounds i8, i8* %216, i64 1
%218 = load i8, i8* %217
%219 = zext i8 %218 to i32
%220 = add nsw i32 %215, %219
%221 = sdiv i32 %220, 2
%222 = trunc i32 %221 to i8
%223 = load i8*, i8** %11
%224 = getelementptr inbounds i8, i8* %223, i32 1
store i8* %224, i8** %11
store i8 %222, i8* %223
%225 = load i8*, i8** %10
%226 = load i8, i8* %225
%227 = load i8*, i8** %11
%228 = getelementptr inbounds i8, i8* %227, i32 1
store i8* %228, i8** %11
store i8 %226, i8* %227
%229 = load i8*, i8** %10
%230 = load i64, i64* %7
%231 = getelementptr inbounds i8, i8* %229, i64 %230
%232 = load i8, i8* %231
%233 = zext i8 %232 to i32
%234 = load i8*, i8** %10
%235 = load i64, i64* %7
%236 = sub i64 0, %235
%237 = getelementptr inbounds i8, i8* %234, i64 %236
%238 = load i8, i8* %237
%239 = zext i8 %238 to i32
%240 = add nsw i32 %233, %239
%241 = sdiv i32 %240, 2
%242 = trunc i32 %241 to i8
%243 = load i8*, i8** %11
%244 = getelementptr inbounds i8, i8* %243, i32 1
store i8* %244, i8** %11
store i8 %242, i8* %243
br label %262
245: ; preds = %206, %199
%246 = load i8*, i8** %10
%247 = getelementptr inbounds i8, i8* %246, i64 1
%248 = load i8, i8* %247
%249 = load i8*, i8** %11
%250 = getelementptr inbounds i8, i8* %249, i32 1
store i8* %250, i8** %11
store i8 %248, i8* %249
%251 = load i8*, i8** %10
%252 = load i8, i8* %251
%253 = load i8*, i8** %11
%254 = getelementptr inbounds i8, i8* %253, i32 1
store i8* %254, i8** %11
store i8 %252, i8* %253
%255 = load i8*, i8** %10
%256 = load i64, i64* %7
%257 = sub i64 0, %256
%258 = getelementptr inbounds i8, i8* %255, i64 %257
%259 = load i8, i8* %258
%260 = load i8*, i8** %11
%261 = getelementptr inbounds i8, i8* %260, i32 1
store i8* %261, i8** %11
store i8 %259, i8* %260
br label %262
262: ; preds = %245, %211
br label %370
263: ; preds = %195
%264 = load i64, i64* %9
%265 = load i64, i64* %7
%266 = load i64, i64* %8
%267 = sub nsw i64 %266, 1
%268 = mul nsw i64 %265, %267
%269 = icmp slt i64 %264, %268
br i1 %269, label %270, label %341
270: ; preds = %263
%271 = load i64, i64* %9
%272 = load i64, i64* %7
%273 = srem i64 %271, %272
%274 = load i64, i64* %7
%275 = sub nsw i64 %274, 1
%276 = icmp slt i64 %273, %275
br i1 %276, label %277, label %341
277: ; preds = %270
%278 = load i8*, i8** %10
%279 = load i8, i8* %278
%280 = load i8*, i8** %11
%281 = getelementptr inbounds i8, i8* %280, i32 1
store i8* %281, i8** %11
store i8 %279, i8* %280
%282 = load i8*, i8** %10
%283 = getelementptr inbounds i8, i8* %282, i64 -1
%284 = load i8, i8* %283
%285 = zext i8 %284 to i32
%286 = load i8*, i8** %10
%287 = getelementptr inbounds i8, i8* %286, i64 1
%288 = load i8, i8* %287
%289 = zext i8 %288 to i32
%290 = add nsw i32 %285, %289
%291 = load i8*, i8** %10
%292 = load i64, i64* %7
%293 = sub i64 0, %292
%294 = getelementptr inbounds i8, i8* %291, i64 %293
%295 = load i8, i8* %294
%296 = zext i8 %295 to i32
%297 = add nsw i32 %290, %296
%298 = load i8*, i8** %10
%299 = load i64, i64* %7
%300 = getelementptr inbounds i8, i8* %298, i64 %299
%301 = load i8, i8* %300
%302 = zext i8 %301 to i32
%303 = add nsw i32 %297, %302
%304 = sdiv i32 %303, 4
%305 = trunc i32 %304 to i8
%306 = load i8*, i8** %11
%307 = getelementptr inbounds i8, i8* %306, i32 1
store i8* %307, i8** %11
store i8 %305, i8* %306
%308 = load i8*, i8** %10
%309 = load i64, i64* %7
%310 = sub i64 0, %309
%311 = getelementptr inbounds i8, i8* %308, i64 %310
%312 = getelementptr inbounds i8, i8* %311, i64 -1
%313 = load i8, i8* %312
%314 = zext i8 %313 to i32
%315 = load i8*, i8** %10
%316 = load i64, i64* %7
%317 = sub i64 0, %316
%318 = getelementptr inbounds i8, i8* %315, i64 %317
%319 = getelementptr inbounds i8, i8* %318, i64 1
%320 = load i8, i8* %319
%321 = zext i8 %320 to i32
%322 = add nsw i32 %314, %321
%323 = load i8*, i8** %10
%324 = load i64, i64* %7
%325 = getelementptr inbounds i8, i8* %323, i64 %324
%326 = getelementptr inbounds i8, i8* %325, i64 -1
%327 = load i8, i8* %326
%328 = zext i8 %327 to i32
%329 = add nsw i32 %322, %328
%330 = load i8*, i8** %10
%331 = load i64, i64* %7
%332 = getelementptr inbounds i8, i8* %330, i64 %331
%333 = getelementptr inbounds i8, i8* %332, i64 1
%334 = load i8, i8* %333
%335 = zext i8 %334 to i32
%336 = add nsw i32 %329, %335
%337 = sdiv i32 %336, 4
%338 = trunc i32 %337 to i8
%339 = load i8*, i8** %11
%340 = getelementptr inbounds i8, i8* %339, i32 1
store i8* %340, i8** %11
store i8 %338, i8* %339
br label %369
341: ; preds = %270, %263
%342 = load i8*, i8** %10
%343 = load i8, i8* %342
%344 = load i8*, i8** %11
%345 = getelementptr inbounds i8, i8* %344, i32 1
store i8* %345, i8** %11
store i8 %343, i8* %344
%346 = load i8*, i8** %10
%347 = getelementptr inbounds i8, i8* %346, i64 -1
%348 = load i8, i8* %347
%349 = zext i8 %348 to i32
%350 = load i8*, i8** %10
%351 = load i64, i64* %7
%352 = sub i64 0, %351
%353 = getelementptr inbounds i8, i8* %350, i64 %352
%354 = load i8, i8* %353
%355 = zext i8 %354 to i32
%356 = add nsw i32 %349, %355
%357 = sdiv i32 %356, 2
%358 = trunc i32 %357 to i8
%359 = load i8*, i8** %11
%360 = getelementptr inbounds i8, i8* %359, i32 1
store i8* %360, i8** %11
store i8 %358, i8* %359
%361 = load i8*, i8** %10
%362 = load i64, i64* %7
%363 = sub i64 0, %362
%364 = getelementptr inbounds i8, i8* %361, i64 %363
%365 = getelementptr inbounds i8, i8* %364, i64 -1
%366 = load i8, i8* %365
%367 = load i8*, i8** %11
%368 = getelementptr inbounds i8, i8* %367, i32 1
store i8* %368, i8** %11
store i8 %366, i8* %367
br label %369
369: ; preds = %341, %277
br label %370
370: ; preds = %369, %262
br label %371
371: ; preds = %370, %194
%372 = load i8*, i8** %10
%373 = getelementptr inbounds i8, i8* %372, i32 1
store i8* %373, i8** %10
br label %374
374: ; preds = %371
%375 = load i64, i64* %9
%376 = add nsw i64 %375, 1
store i64 %376, i64* %9
br label %18
377: ; preds = %18
ret void
}

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