#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef void *uint8_t;

/* Variables and functions */
int png_get_scanline_len(int, int, int);
unsigned int png_paeth_predictor(unsigned int, unsigned int, unsigned int);
void png_defilter(const unsigned char *data, unsigned char *image, int width,
                  int height, int depth, int sample_per_pixel) {
  unsigned char type;
  int i, j;
  int ap, bp;
  unsigned int a, b, c, k;
  int scanline_len;
  scanline_len = png_get_scanline_len(width, depth, sample_per_pixel);
  if (depth < 8)
    ap = -1;
  else
    ap = -(depth / 8 * sample_per_pixel);
  bp = -scanline_len;
  for (i = 0; i < height; i++) {
    { type = (uint8_t) * (data)++; };
    *image++ = type;
    if (type == 0) {
      for (j = 1; j < scanline_len; j++) {
        { k = (uint8_t) * (data)++; };
        *image++ = k;
      }
    } else if (type == 1) {
      for (j = 1; j < scanline_len; j++) {
        a = (j + ap > 0) ? image[ap] : 0;
        { k = (uint8_t) * (data)++; };
        *image++ = k + a;
      }
    } else if (type == 2) {
      for (j = 1; j < scanline_len; j++) {
        b = (i > 0) ? image[bp] : 0;
        { k = (uint8_t) * (data)++; };
        *image++ = k + b;
      }
    } else if (type == 3) {
      for (j = 1; j < scanline_len; j++) {
        a = (j + ap > 0) ? image[ap] : 0;
        b = (i > 0) ? image[bp] : 0;
        { k = (uint8_t) * (data)++; };
        *image++ = k + (a + b) / 2;
      }
    } else if (type == 4) {
      for (j = 1; j < scanline_len; j++) {
        a = (j + ap > 0) ? image[ap] : 0;
        b = (i > 0) ? image[bp] : 0;
        c = (i > 0 && j + ap > 0) ? image[ap + bp] : 0;
        { k = (uint8_t) * (data)++; };
        *image++ = k + png_paeth_predictor(a, b, c);
      }
    }
  }
}


x86 assembly (clang, -O0):
<png_defilter>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9d,-0x20(%rbp)
mov    -0x14(%rbp),%edi
mov    -0x1c(%rbp),%esi
mov    -0x20(%rbp),%edx
call   1040 <png_get_scanline_len@plt>
mov    %eax,-0x48(%rbp)
cmpl   $0x8,-0x1c(%rbp)
jge    1165 <png_defilter+0x45>
movl   $0xffffffff,-0x30(%rbp)
jmp    117d <png_defilter+0x5d>
mov    -0x1c(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
imul   -0x20(%rbp),%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x30(%rbp)
xor    %eax,%eax
sub    -0x48(%rbp),%eax
mov    %eax,-0x34(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    154c <png_defilter+0x42c>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
movzbl -0x21(%rbp),%eax
cmp    $0x0,%eax
jne    121f <png_defilter+0xff>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    121a <png_defilter+0xfa>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11d5 <png_defilter+0xb5>
jmp    1539 <png_defilter+0x419>
movzbl -0x21(%rbp),%eax
cmp    $0x1,%eax
jne    12b3 <png_defilter+0x193>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    12ae <png_defilter+0x18e>
mov    -0x2c(%rbp),%eax
add    -0x30(%rbp),%eax
cmp    $0x0,%eax
jle    1262 <png_defilter+0x142>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x4c(%rbp)
jmp    126c <png_defilter+0x14c>
xor    %eax,%eax
mov    %eax,-0x4c(%rbp)
jmp    126c <png_defilter+0x14c>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1233 <png_defilter+0x113>
jmp    1534 <png_defilter+0x414>
movzbl -0x21(%rbp),%eax
cmp    $0x2,%eax
jne    1342 <png_defilter+0x222>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    133d <png_defilter+0x21d>
cmpl   $0x0,-0x28(%rbp)
jle    12f1 <png_defilter+0x1d1>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x50(%rbp)
jmp    12fb <png_defilter+0x1db>
xor    %eax,%eax
mov    %eax,-0x50(%rbp)
jmp    12fb <png_defilter+0x1db>
mov    -0x50(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
add    -0x3c(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    12c7 <png_defilter+0x1a7>
jmp    152f <png_defilter+0x40f>
movzbl -0x21(%rbp),%eax
cmp    $0x3,%eax
jne    140c <png_defilter+0x2ec>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    1407 <png_defilter+0x2e7>
mov    -0x2c(%rbp),%eax
add    -0x30(%rbp),%eax
cmp    $0x0,%eax
jle    1385 <png_defilter+0x265>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x54(%rbp)
jmp    138f <png_defilter+0x26f>
xor    %eax,%eax
mov    %eax,-0x54(%rbp)
jmp    138f <png_defilter+0x26f>
mov    -0x54(%rbp),%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x0,-0x28(%rbp)
jle    13b3 <png_defilter+0x293>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x58(%rbp)
jmp    13bd <png_defilter+0x29d>
xor    %eax,%eax
mov    %eax,-0x58(%rbp)
jmp    13bd <png_defilter+0x29d>
mov    -0x58(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    -0x38(%rbp),%ecx
add    -0x3c(%rbp),%ecx
shr    $0x1,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1356 <png_defilter+0x236>
jmp    152a <png_defilter+0x40a>
movzbl -0x21(%rbp),%eax
cmp    $0x4,%eax
jne    1525 <png_defilter+0x405>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    1520 <png_defilter+0x400>
mov    -0x2c(%rbp),%eax
add    -0x30(%rbp),%eax
cmp    $0x0,%eax
jle    144f <png_defilter+0x32f>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x5c(%rbp)
jmp    1459 <png_defilter+0x339>
xor    %eax,%eax
mov    %eax,-0x5c(%rbp)
jmp    1459 <png_defilter+0x339>
mov    -0x5c(%rbp),%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x0,-0x28(%rbp)
jle    147d <png_defilter+0x35d>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x60(%rbp)
jmp    1487 <png_defilter+0x367>
xor    %eax,%eax
mov    %eax,-0x60(%rbp)
jmp    1487 <png_defilter+0x367>
mov    -0x60(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x28(%rbp)
jle    14bf <png_defilter+0x39f>
mov    -0x2c(%rbp),%eax
add    -0x30(%rbp),%eax
cmp    $0x0,%eax
jle    14bf <png_defilter+0x39f>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x64(%rbp)
jmp    14c9 <png_defilter+0x3a9>
xor    %eax,%eax
mov    %eax,-0x64(%rbp)
jmp    14c9 <png_defilter+0x3a9>
mov    -0x64(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    %eax,-0x68(%rbp)
mov    -0x38(%rbp),%edi
mov    -0x3c(%rbp),%esi
mov    -0x40(%rbp),%edx
call   1030 <png_paeth_predictor@plt>
mov    %eax,%ecx
mov    -0x68(%rbp),%eax
add    %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1420 <png_defilter+0x300>
jmp    1525 <png_defilter+0x405>
jmp    152a <png_defilter+0x40a>
jmp    152f <png_defilter+0x40f>
jmp    1534 <png_defilter+0x414>
jmp    1539 <png_defilter+0x419>
jmp    153e <png_defilter+0x41e>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    118c <png_defilter+0x6c>
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<png_defilter>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xb8,%rsp
mov    %r9d,%ebx
mov    %r8d,%ebp
mov    %ecx,%r14d
mov    %rsi,%r12
mov    %rdi,%r13
mov    %edx,%edi
mov    %r8d,%esi
mov    %r9d,%edx
call   1040 <png_get_scanline_len@plt>
mov    %eax,(%rsp)
mov    %ebp,%eax
shr    $0x3,%eax
imul   %ebx,%eax
neg    %eax
cmp    $0x8,%ebp
mov    $0xffffffff,%ecx
cmovge %eax,%ecx
mov    %ecx,0x4(%rsp)
test   %r14d,%r14d
jle    1709 <png_defilter+0x5e9>
movslq (%rsp),%rax
movslq 0x4(%rsp),%rdx
mov    %edx,%ecx
sub    %eax,%ecx
lea    -0x2(%rax),%esi
lea    -0x1(%rax),%r9d
mov    $0x1,%ebp
sub    %rax,%rbp
mov    %rbp,0x28(%rsp)
mov    $0x2,%ebp
sub    %rax,%rbp
mov    %rbp,0x90(%rsp)
neg    %rax
mov    %rax,0x70(%rsp)
movslq %ecx,%rax
lea    0x2(%rsi),%rcx
mov    %rcx,0x78(%rsp)
mov    %rsi,0x8(%rsp)
lea    0x1(%rsi),%rcx
mov    %rcx,0x60(%rsp)
and    $0xffffffffffffffe0,%rcx
lea    -0x20(%rcx),%rsi
mov    %rsi,0x50(%rsp)
shr    $0x5,%rsi
add    $0x1,%rsi
mov    %esi,%ebp
and    $0x3,%ebp
and    $0xfffffffffffffffc,%rsi
mov    %rsi,0x38(%rsp)
add    $0x1,%rax
mov    %rax,0x98(%rsp)
mov    %r9d,%eax
and    $0xfffffffe,%eax
mov    %rax,0x18(%rsp)
mov    %rbp,0x48(%rsp)
shl    $0x5,%rbp
mov    %rbp,0x40(%rsp)
mov    %rcx,0x58(%rsp)
lea    0x1(%rcx),%eax
mov    %eax,0x10(%rsp)
lea    0x1(%rdx),%rax
mov    %rax,0x20(%rsp)
lea    0x1(%rdx),%edi
lea    0x2(%rdx),%rax
mov    %rax,0x88(%rsp)
mov    %rdx,%rax
mov    %rdx,0x68(%rsp)
mov    %edx,%eax
mov    %rax,0x80(%rsp)
xor    %r15d,%r15d
mov    %r9,0xb0(%rsp)
mov    %rdi,0xa8(%rsp)
mov    %r14d,0x14(%rsp)
jmp    1283 <png_defilter+0x163>
add    %rax,%rbp
add    %rax,%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %rbx,%r12
mov    %rbp,%r13
add    $0x1,%r15d
cmp    %r14d,%r15d
je     1709 <png_defilter+0x5e9>
lea    0x1(%r13),%rbp
movzbl 0x0(%r13),%eax
lea    0x1(%r12),%rbx
mov    %al,(%r12)
cmp    $0x4,%rax
ja     1270 <png_defilter+0x150>
lea    0xd5e(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
cmpl   $0x2,(%rsp)
jl     1270 <png_defilter+0x150>
mov    $0x1,%r8d
cmpl   $0x1f,0x8(%rsp)
jb     166c <png_defilter+0x54c>
mov    0x78(%rsp),%rax
lea    (%rax,%r13,1),%rcx
cmp    %rcx,%rbx
jae    12dd <png_defilter+0x1bd>
lea    (%r12,%rax,1),%rcx
cmp    %rcx,%rbp
jb     166c <png_defilter+0x54c>
cmpq   $0x60,0x50(%rsp)
mov    0x40(%rsp),%rsi
jae    1592 <png_defilter+0x472>
xor    %eax,%eax
jmp    160a <png_defilter+0x4ea>
cmpl   $0x2,(%rsp)
jl     1270 <png_defilter+0x150>
cmpl   $0x0,0x8(%rsp)
je     1549 <png_defilter+0x429>
add    0x90(%rsp),%r12
xor    %eax,%eax
mov    0x18(%rsp),%rdx
jmp    1339 <png_defilter+0x219>
nopl   0x0(%rax,%rax,1)
movzbl (%r12,%rax,1),%ecx
add    0x1(%rbp,%rax,1),%cl
mov    %cl,0x1(%rbx,%rax,1)
add    $0x2,%rax
cmp    %eax,%edx
je     1516 <png_defilter+0x3f6>
test   %r15d,%r15d
je     1350 <png_defilter+0x230>
movzbl -0x1(%r12,%rax,1),%ecx
jmp    1352 <png_defilter+0x232>
cs nopw 0x0(%rax,%rax,1)
xor    %ecx,%ecx
add    0x0(%rbp,%rax,1),%cl
mov    %cl,(%rbx,%rax,1)
test   %r15d,%r15d
jne    1320 <png_defilter+0x200>
xor    %ecx,%ecx
jmp    1325 <png_defilter+0x205>
cmpl   $0x2,(%rsp)
jl     1270 <png_defilter+0x150>
mov    0x28(%rsp),%rax
add    %r12,%rax
mov    %rax,0x30(%rsp)
mov    0x20(%rsp),%rax
add    %r12,%rax
mov    %rax,0xa0(%rsp)
add    0x98(%rsp),%r12
xor    %r14d,%r14d
jmp    13d1 <png_defilter+0x2b1>
xor    %eax,%eax
xor    %ecx,%ecx
xor    %edx,%edx
movzbl %al,%edi
movzbl %cl,%esi
movzbl 0x0(%rbp,%r14,1),%r13d
call   1030 <png_paeth_predictor@plt>
add    %r13b,%al
mov    %al,(%rbx,%r14,1)
add    $0x1,%r14
mov    0xb0(%rsp),%r9
cmp    %r14d,%r9d
mov    0xa8(%rsp),%rdi
je     1500 <png_defilter+0x3e0>
lea    (%rdi,%r14,1),%eax
test   %eax,%eax
jle    1400 <png_defilter+0x2e0>
mov    0xa0(%rsp),%rax
movzbl (%rax,%r14,1),%eax
test   %r15d,%r15d
je     1398 <png_defilter+0x278>
mov    0x30(%rsp),%rcx
movzbl (%rcx,%r14,1),%ecx
movzbl (%r12,%r14,1),%edx
jmp    139c <png_defilter+0x27c>
nopl   0x0(%rax)
test   %r15d,%r15d
je     1396 <png_defilter+0x276>
mov    0x30(%rsp),%rax
movzbl (%rax,%r14,1),%ecx
xor    %eax,%eax
jmp    139a <png_defilter+0x27a>
cmpl   $0x2,(%rsp)
jl     1270 <png_defilter+0x150>
cmpl   $0x0,0x8(%rsp)
je     155f <png_defilter+0x43f>
add    0x88(%rsp),%r12
xor    %eax,%eax
mov    0x18(%rsp),%rdx
mov    0x80(%rsp),%rsi
jmp    1469 <png_defilter+0x349>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl (%r12,%rax,1),%ecx
add    0x1(%rbp,%rax,1),%cl
mov    %cl,0x1(%rbx,%rax,1)
add    $0x2,%rax
cmp    %eax,%edx
je     152e <png_defilter+0x40e>
lea    (%rsi,%rax,1),%ecx
add    $0x1,%ecx
test   %ecx,%ecx
jle    1480 <png_defilter+0x360>
movzbl -0x1(%r12,%rax,1),%ecx
jmp    1482 <png_defilter+0x362>
nopl   0x0(%rax,%rax,1)
xor    %ecx,%ecx
add    0x0(%rbp,%rax,1),%cl
mov    %cl,(%rbx,%rax,1)
lea    (%rsi,%rax,1),%ecx
add    $0x2,%ecx
test   %ecx,%ecx
jg     1450 <png_defilter+0x330>
xor    %ecx,%ecx
jmp    1455 <png_defilter+0x335>
cmpl   $0x2,(%rsp)
jl     1270 <png_defilter+0x150>
mov    0x20(%rsp),%rax
lea    (%r12,%rax,1),%rcx
add    0x28(%rsp),%r12
xor    %eax,%eax
jmp    14ec <png_defilter+0x3cc>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xor    %edx,%edx
test   %r15d,%r15d
je     14fc <png_defilter+0x3dc>
movzbl (%r12,%rax,1),%esi
movzwl %dx,%edx
movzwl %si,%esi
add    %edx,%esi
shr    %esi
add    0x0(%rbp,%rax,1),%sil
mov    %sil,(%rbx,%rax,1)
add    $0x1,%rax
cmp    %eax,%r9d
je     125d <png_defilter+0x13d>
lea    (%rdi,%rax,1),%edx
test   %edx,%edx
jle    14c0 <png_defilter+0x3a0>
movzbl (%rcx,%rax,1),%edx
test   %r15d,%r15d
jne    14c7 <png_defilter+0x3a7>
xor    %esi,%esi
jmp    14cc <png_defilter+0x3ac>
add    %r14,%rbp
add    %r14,%rbx
mov    %rbx,%r12
mov    %rbp,%r13
mov    0x14(%rsp),%r14d
jmp    1276 <png_defilter+0x156>
add    %rax,%rbp
add    %rax,%rbx
mov    %rbp,%r13
mov    %rbx,%r12
test   $0x1,%r9b
je     1276 <png_defilter+0x156>
jmp    1553 <png_defilter+0x433>
add    %rax,%rbp
add    %rax,%rbx
add    $0x1,%eax
mov    %rbp,%r13
mov    %rbx,%r12
test   $0x1,%r9b
je     1276 <png_defilter+0x156>
jmp    156e <png_defilter+0x44e>
test   $0x1,%r9b
je     1276 <png_defilter+0x156>
test   %r15d,%r15d
je     157e <png_defilter+0x45e>
mov    0x70(%rsp),%rax
jmp    1579 <png_defilter+0x459>
mov    $0x1,%eax
test   $0x1,%r9b
je     1276 <png_defilter+0x156>
add    0x4(%rsp),%eax
jle    157e <png_defilter+0x45e>
mov    0x68(%rsp),%rax
mov    (%rbx,%rax,1),%al
jmp    1580 <png_defilter+0x460>
xor    %eax,%eax
add    0x0(%rbp),%al
add    $0x1,%rbp
mov    %al,(%rbx)
add    $0x1,%rbx
jmp    1270 <png_defilter+0x150>
mov    0x38(%rsp),%rcx
xor    %eax,%eax
nopl   0x0(%rax)
movups 0x1(%r13,%rax,1),%xmm0
movups 0x11(%r13,%rax,1),%xmm1
movups %xmm0,0x1(%r12,%rax,1)
movups %xmm1,0x11(%r12,%rax,1)
movups 0x21(%r13,%rax,1),%xmm0
movups 0x31(%r13,%rax,1),%xmm1
movups %xmm0,0x21(%r12,%rax,1)
movups %xmm1,0x31(%r12,%rax,1)
movups 0x41(%r13,%rax,1),%xmm0
movups 0x51(%r13,%rax,1),%xmm1
movups %xmm0,0x41(%r12,%rax,1)
movups %xmm1,0x51(%r12,%rax,1)
movups 0x61(%r13,%rax,1),%xmm0
movups 0x71(%r13,%rax,1),%xmm1
movups %xmm0,0x61(%r12,%rax,1)
movups %xmm1,0x71(%r12,%rax,1)
sub    $0xffffffffffffff80,%rax
add    $0xfffffffffffffffc,%rcx
jne    15a0 <png_defilter+0x480>
cmpq   $0x0,0x48(%rsp)
je     164b <png_defilter+0x52b>
lea    (%r12,%rax,1),%rcx
add    $0x11,%rcx
add    %r13,%rax
add    $0x11,%rax
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x10(%rax,%rdx,1),%xmm0
movups (%rax,%rdx,1),%xmm1
movups %xmm0,-0x10(%rcx,%rdx,1)
movups %xmm1,(%rcx,%rdx,1)
add    $0x20,%rdx
cmp    %rdx,%rsi
jne    1630 <png_defilter+0x510>
mov    0x58(%rsp),%rax
add    %rax,%rbp
add    %rax,%rbx
mov    0x10(%rsp),%r8d
mov    %rbx,%r12
mov    %rbp,%r13
cmp    %rax,0x60(%rsp)
je     1276 <png_defilter+0x156>
mov    (%rsp),%eax
mov    %eax,%edx
sub    %r8d,%edx
mov    %r8d,%ecx
not    %ecx
add    %eax,%ecx
and    $0x7,%edx
je     16a9 <png_defilter+0x589>
neg    %edx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl 0x0(%rbp),%eax
add    $0x1,%rbp
mov    %al,(%rbx)
add    $0x1,%rbx
add    $0xffffffffffffffff,%rsi
cmp    %esi,%edx
jne    1690 <png_defilter+0x570>
sub    %esi,%r8d
mov    %rbx,%r12
mov    %rbp,%r13
cmp    $0x7,%ecx
jb     1276 <png_defilter+0x156>
mov    (%rsp),%ecx
sub    %r8d,%ecx
xchg   %ax,%ax
movzbl 0x0(%rbp),%eax
mov    %al,(%rbx)
movzbl 0x1(%rbp),%eax
mov    %al,0x1(%rbx)
movzbl 0x2(%rbp),%eax
mov    %al,0x2(%rbx)
movzbl 0x3(%rbp),%eax
mov    %al,0x3(%rbx)
movzbl 0x4(%rbp),%eax
mov    %al,0x4(%rbx)
movzbl 0x5(%rbp),%eax
mov    %al,0x5(%rbx)
movzbl 0x6(%rbp),%eax
mov    %al,0x6(%rbx)
movzbl 0x7(%rbp),%eax
add    $0x8,%rbp
mov    %al,0x7(%rbx)
add    $0x8,%rbx
add    $0xfffffff8,%ecx
jne    16c0 <png_defilter+0x5a0>
jmp    1270 <png_defilter+0x150>
add    $0xb8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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