#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 int uint8_t;

/* Variables and functions */
int /*<<< orphan*/ memcpy(int *, int const *, int);
int sproto_unpack(const void *srcv, int srcsz, void *bufferv, int bufsz) {
  const uint8_t *src = srcv;
  uint8_t *buffer = bufferv;
  int size = 0;
  while (srcsz > 0) {
    uint8_t header = src[0];
    --srcsz;
    ++src;
    if (header == 0xff) {
      if (srcsz < 0) {
        return -1;
      }
      int n = (src[0] + 1) * 8;
      if (srcsz < n + 1)
        return -1;
      srcsz -= n + 1;
      ++src;
      if (bufsz >= n) {
        memcpy(buffer, src, n);
      }
      bufsz -= n;
      buffer += n;
      src += n;
      size += n;
    } else {
      int i;
      for (i = 0; i < 8; i++) {
        int nz = (header >> i) & 1;
        if (nz) {
          if (srcsz < 0)
            return -1;
          if (bufsz > 0) {
            *buffer = *src;
            --bufsz;
            ++buffer;
          }
          ++src;
          --srcsz;
        } else {
          if (bufsz > 0) {
            *buffer = 0;
            --bufsz;
            ++buffer;
          }
        }
        ++size;
      }
    }
  }
  return size;
}


x86 assembly (clang, -O0):
<sproto_unpack>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
cmpl   $0x0,-0x14(%rbp)
jle    1300 <sproto_unpack+0x1f0>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x40(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x30(%rbp)
cmpl   $0xff,-0x40(%rbp)
jne    122d <sproto_unpack+0x11d>
cmpl   $0x0,-0x14(%rbp)
jge    1188 <sproto_unpack+0x78>
movl   $0xffffffff,-0x4(%rbp)
jmp    1306 <sproto_unpack+0x1f6>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
add    $0x1,%eax
shl    $0x3,%eax
mov    %eax,-0x44(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    11b4 <sproto_unpack+0xa4>
movl   $0xffffffff,-0x4(%rbp)
jmp    1306 <sproto_unpack+0x1f6>
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x30(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x44(%rbp),%eax
jl     11ea <sproto_unpack+0xda>
mov    -0x38(%rbp),%rdi
mov    -0x30(%rbp),%rsi
mov    -0x44(%rbp),%edx
call   1030 <memcpy@plt>
mov    -0x44(%rbp),%ecx
mov    -0x24(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x44(%rbp),%ecx
mov    -0x38(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x44(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x44(%rbp),%eax
add    -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    12fb <sproto_unpack+0x1eb>
movl   $0x0,-0x48(%rbp)
cmpl   $0x8,-0x48(%rbp)
jge    12f6 <sproto_unpack+0x1e6>
mov    -0x40(%rbp),%eax
mov    -0x48(%rbp),%ecx
sar    %cl,%eax
and    $0x1,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
je     12b1 <sproto_unpack+0x1a1>
cmpl   $0x0,-0x14(%rbp)
jge    126c <sproto_unpack+0x15c>
movl   $0xffffffff,-0x4(%rbp)
jmp    1306 <sproto_unpack+0x1f6>
cmpl   $0x0,-0x24(%rbp)
jle    1297 <sproto_unpack+0x187>
mov    -0x30(%rbp),%rax
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x30(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    12df <sproto_unpack+0x1cf>
cmpl   $0x0,-0x24(%rbp)
jle    12da <sproto_unpack+0x1ca>
mov    -0x38(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
mov    -0x38(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
jmp    12df <sproto_unpack+0x1cf>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1234 <sproto_unpack+0x124>
jmp    12fb <sproto_unpack+0x1eb>
jmp    113d <sproto_unpack+0x2d>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sproto_unpack>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
test   %esi,%esi
jle    13fb <sproto_unpack+0x2eb>
mov    %ecx,%r12d
mov    %rdx,%r15
mov    %rdi,%rbx
xor    %eax,%eax
jmp    114f <sproto_unpack+0x3f>
sub    %r14d,%r13d
movslq %ebp,%rcx
lea    (%r15,%rcx,4),%r15
lea    (%rbx,%rcx,4),%rdi
add    %ebp,%eax
mov    %r13d,%esi
mov    %rdi,%rbx
test   %r13d,%r13d
jle    13fd <sproto_unpack+0x2ed>
mov    (%rbx),%ecx
lea    -0x1(%rsi),%r13d
lea    0x4(%rbx),%rdi
cmp    $0xff,%ecx
jne    11a0 <sproto_unpack+0x90>
mov    (%rdi),%ecx
lea    0x9(,%rcx,8),%r14d
cmp    %r14d,%esi
jle    13f4 <sproto_unpack+0x2e4>
lea    0x8(,%rcx,8),%ebp
add    $0x8,%rbx
sub    %ebp,%r12d
jl     1130 <sproto_unpack+0x20>
mov    %eax,0x4(%rsp)
mov    %r15,%rdi
mov    %rbx,%rsi
mov    %ebp,%edx
call   1030 <memcpy@plt>
mov    0x4(%rsp),%eax
jmp    1130 <sproto_unpack+0x20>
nopl   0x0(%rax,%rax,1)
test   $0x1,%cl
jne    1280 <sproto_unpack+0x170>
test   %r12d,%r12d
jle    11bd <sproto_unpack+0xad>
movl   $0x0,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
test   $0x2,%cl
jne    12a8 <sproto_unpack+0x198>
test   %r12d,%r12d
jle    11da <sproto_unpack+0xca>
movl   $0x0,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
test   $0x4,%cl
jne    12d4 <sproto_unpack+0x1c4>
test   %r12d,%r12d
jle    11f7 <sproto_unpack+0xe7>
movl   $0x0,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
test   $0x8,%cl
jne    1300 <sproto_unpack+0x1f0>
test   %r12d,%r12d
jle    1214 <sproto_unpack+0x104>
movl   $0x0,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
test   $0x10,%cl
jne    132c <sproto_unpack+0x21c>
test   %r12d,%r12d
jle    1231 <sproto_unpack+0x121>
movl   $0x0,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
test   $0x20,%cl
jne    1358 <sproto_unpack+0x248>
test   %r12d,%r12d
jle    124e <sproto_unpack+0x13e>
movl   $0x0,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
test   $0x40,%cl
jne    1384 <sproto_unpack+0x274>
test   %r12d,%r12d
jle    13a3 <sproto_unpack+0x293>
movl   $0x0,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
jmp    13a3 <sproto_unpack+0x293>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
test   %r12d,%r12d
jle    1292 <sproto_unpack+0x182>
mov    (%rdi),%edx
mov    %edx,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
add    $0x8,%rbx
add    $0xfffffffe,%esi
mov    %rbx,%rdi
mov    %esi,%r13d
test   $0x2,%cl
je     11c6 <sproto_unpack+0xb6>
test   %r13d,%r13d
js     13f4 <sproto_unpack+0x2e4>
test   %r12d,%r12d
jle    12c3 <sproto_unpack+0x1b3>
mov    (%rdi),%edx
mov    %edx,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
add    $0x4,%rdi
add    $0xffffffff,%r13d
test   $0x4,%cl
je     11e3 <sproto_unpack+0xd3>
test   %r13d,%r13d
js     13f4 <sproto_unpack+0x2e4>
test   %r12d,%r12d
jle    12ef <sproto_unpack+0x1df>
mov    (%rdi),%edx
mov    %edx,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
add    $0x4,%rdi
add    $0xffffffff,%r13d
test   $0x8,%cl
je     1200 <sproto_unpack+0xf0>
test   %r13d,%r13d
js     13f4 <sproto_unpack+0x2e4>
test   %r12d,%r12d
jle    131b <sproto_unpack+0x20b>
mov    (%rdi),%edx
mov    %edx,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
add    $0x4,%rdi
add    $0xffffffff,%r13d
test   $0x10,%cl
je     121d <sproto_unpack+0x10d>
test   %r13d,%r13d
js     13f4 <sproto_unpack+0x2e4>
test   %r12d,%r12d
jle    1347 <sproto_unpack+0x237>
mov    (%rdi),%edx
mov    %edx,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
add    $0x4,%rdi
add    $0xffffffff,%r13d
test   $0x20,%cl
je     123a <sproto_unpack+0x12a>
test   %r13d,%r13d
js     13f4 <sproto_unpack+0x2e4>
test   %r12d,%r12d
jle    1373 <sproto_unpack+0x263>
mov    (%rdi),%edx
mov    %edx,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
add    $0x4,%rdi
add    $0xffffffff,%r13d
test   $0x40,%cl
je     1257 <sproto_unpack+0x147>
test   %r13d,%r13d
js     13f4 <sproto_unpack+0x2e4>
test   %r12d,%r12d
jle    139b <sproto_unpack+0x28b>
mov    (%rdi),%edx
mov    %edx,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
add    $0x4,%rdi
add    $0xffffffff,%r13d
add    $0x8,%eax
test   $0x80,%cl
jne    13d0 <sproto_unpack+0x2c0>
test   %r12d,%r12d
jle    1140 <sproto_unpack+0x30>
movl   $0x0,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
jmp    1140 <sproto_unpack+0x30>
nopl   0x0(%rax,%rax,1)
test   %r13d,%r13d
js     13f4 <sproto_unpack+0x2e4>
test   %r12d,%r12d
jle    13e7 <sproto_unpack+0x2d7>
mov    (%rdi),%ecx
mov    %ecx,(%r15)
add    $0xffffffff,%r12d
add    $0x4,%r15
add    $0x4,%rdi
add    $0xffffffff,%r13d
jmp    1140 <sproto_unpack+0x30>
mov    $0xffffffff,%eax
jmp    13fd <sproto_unpack+0x2ed>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @sproto_unpack(i8* %0, i32 %1, i8* %2, i32 %3) {
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32*
%11 = alloca i32*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
store i8* %0, i8** %6
store i32 %1, i32* %7
store i8* %2, i8** %8
store i32 %3, i32* %9
%17 = load i8*, i8** %6
%18 = bitcast i8* %17 to i32*
store i32* %18, i32** %10
%19 = load i8*, i8** %8
%20 = bitcast i8* %19 to i32*
store i32* %20, i32** %11
store i32 0, i32* %12
br label %21
21: ; preds = %127, %4
%22 = load i32, i32* %7
%23 = icmp sgt i32 %22, 0
br i1 %23, label %24, label %128
24: ; preds = %21
%25 = load i32*, i32** %10
%26 = getelementptr inbounds i32, i32* %25, i64 0
%27 = load i32, i32* %26
store i32 %27, i32* %13
%28 = load i32, i32* %7
%29 = add nsw i32 %28, -1
store i32 %29, i32* %7
%30 = load i32*, i32** %10
%31 = getelementptr inbounds i32, i32* %30, i32 1
store i32* %31, i32** %10
%32 = load i32, i32* %13
%33 = icmp eq i32 %32, 255
br i1 %33, label %34, label %79
34: ; preds = %24
%35 = load i32, i32* %7
%36 = icmp slt i32 %35, 0
br i1 %36, label %37, label %38
37: ; preds = %34
store i32 -1, i32* %5
br label %130
38: ; preds = %34
%39 = load i32*, i32** %10
%40 = getelementptr inbounds i32, i32* %39, i64 0
%41 = load i32, i32* %40
%42 = add nsw i32 %41, 1
%43 = mul nsw i32 %42, 8
store i32 %43, i32* %14
%44 = load i32, i32* %7
%45 = load i32, i32* %14
%46 = add nsw i32 %45, 1
%47 = icmp slt i32 %44, %46
br i1 %47, label %48, label %49
48: ; preds = %38
store i32 -1, i32* %5
br label %130
49: ; preds = %38
%50 = load i32, i32* %14
%51 = add nsw i32 %50, 1
%52 = load i32, i32* %7
%53 = sub nsw i32 %52, %51
store i32 %53, i32* %7
%54 = load i32*, i32** %10
%55 = getelementptr inbounds i32, i32* %54, i32 1
store i32* %55, i32** %10
%56 = load i32, i32* %9
%57 = load i32, i32* %14
%58 = icmp sge i32 %56, %57
br i1 %58, label %59, label %64
59: ; preds = %49
%60 = load i32*, i32** %11
%61 = load i32*, i32** %10
%62 = load i32, i32* %14
%63 = call i32 @memcpy(i32* %60, i32* %61, i32 %62)
br label %64
64: ; preds = %59, %49
%65 = load i32, i32* %14
%66 = load i32, i32* %9
%67 = sub nsw i32 %66, %65
store i32 %67, i32* %9
%68 = load i32, i32* %14
%69 = load i32*, i32** %11
%70 = sext i32 %68 to i64
%71 = getelementptr inbounds i32, i32* %69, i64 %70
store i32* %71, i32** %11
%72 = load i32, i32* %14
%73 = load i32*, i32** %10
%74 = sext i32 %72 to i64
%75 = getelementptr inbounds i32, i32* %73, i64 %74
store i32* %75, i32** %10
%76 = load i32, i32* %14
%77 = load i32, i32* %12
%78 = add nsw i32 %77, %76
store i32 %78, i32* %12
br label %127
79: ; preds = %24
store i32 0, i32* %15
br label %80
80: ; preds = %123, %79
%81 = load i32, i32* %15
%82 = icmp slt i32 %81, 8
br i1 %82, label %83, label %126
83: ; preds = %80
%84 = load i32, i32* %13
%85 = load i32, i32* %15
%86 = ashr i32 %84, %85
%87 = and i32 %86, 1
store i32 %87, i32* %16
%88 = load i32, i32* %16
%89 = icmp ne i32 %88, 0
br i1 %89, label %90, label %110
90: ; preds = %83
%91 = load i32, i32* %7
%92 = icmp slt i32 %91, 0
br i1 %92, label %93, label %94
93: ; preds = %90
store i32 -1, i32* %5
br label %130
94: ; preds = %90
%95 = load i32, i32* %9
%96 = icmp sgt i32 %95, 0
br i1 %96, label %97, label %105
97: ; preds = %94
%98 = load i32*, i32** %10
%99 = load i32, i32* %98
%100 = load i32*, i32** %11
store i32 %99, i32* %100
%101 = load i32, i32* %9
%102 = add nsw i32 %101, -1
store i32 %102, i32* %9
%103 = load i32*, i32** %11
%104 = getelementptr inbounds i32, i32* %103, i32 1
store i32* %104, i32** %11
br label %105
105: ; preds = %97, %94
%106 = load i32*, i32** %10
%107 = getelementptr inbounds i32, i32* %106, i32 1
store i32* %107, i32** %10
%108 = load i32, i32* %7
%109 = add nsw i32 %108, -1
store i32 %109, i32* %7
br label %120
110: ; preds = %83
%111 = load i32, i32* %9
%112 = icmp sgt i32 %111, 0
br i1 %112, label %113, label %119
113: ; preds = %110
%114 = load i32*, i32** %11
store i32 0, i32* %114
%115 = load i32, i32* %9
%116 = add nsw i32 %115, -1
store i32 %116, i32* %9
%117 = load i32*, i32** %11
%118 = getelementptr inbounds i32, i32* %117, i32 1
store i32* %118, i32** %11
br label %119
119: ; preds = %113, %110
br label %120
120: ; preds = %119, %105
%121 = load i32, i32* %12
%122 = add nsw i32 %121, 1
store i32 %122, i32* %12
br label %123
123: ; preds = %120
%124 = load i32, i32* %15
%125 = add nsw i32 %124, 1
store i32 %125, i32* %15
br label %80
126: ; preds = %80
br label %127
127: ; preds = %126, %64
br label %21
128: ; preds = %21
%129 = load i32, i32* %12
store i32 %129, i32* %5
br label %130
130: ; preds = %128, %93, %48, %37
%131 = load i32, i32* %5
ret i32 %131
}

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