#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 /*<<< orphan*/ stack;

/* Variables and functions */
short xgetc(unsigned char **, unsigned char *);
int bpe_expand(unsigned char *in, int insz, unsigned char *out, int outsz) {
  unsigned char left[256], right[256], stack[30];
  short int c, count, i, size, n;
  unsigned char *inl, *o, *outl;
  inl = in + insz;
  o = out;
  outl = out + outsz;
  while ((count = xgetc(&in, inl)) >= 0) {
    for (i = 0; i < 256; i++) {
      left[i] = i;
    }
    for (c = 0;;) {
      if (count > 127) {
        c += count - 127;
        count = 0;
      }
      if (c >= 256)
        break;
      for (i = 0; i <= count; i++, c++) {
        if ((n = xgetc(&in, inl)) < 0)
          break;
        if (c >= 256)
          return (-1);
        left[c] = n;
        if (c != left[c]) {
          if ((n = xgetc(&in, inl)) < 0)
            break;
          if (c >= 256)
            return (-1);
          right[c] = n;
        }
      }
      if (c >= 256)
        break;
      count = xgetc(&in, inl);
      if (count < 0)
        break;
    }
    if ((n = xgetc(&in, inl)) < 0)
      break;
    size = n << 8;
    if ((n = xgetc(&in, inl)) < 0)
      break;
    size |= n;
    for (i = 0;;) {
      if (i) {
        c = stack[--i];
      } else {
        if (!size--)
          break;
        c = xgetc(&in, inl);
        if (c < 0)
          break;
      }
      if (c >= 256)
        return (-1);
      if (c == left[c]) {
        if (o >= outl)
          return (-1);
        *o++ = c;
      } else {
        if ((i + 2) > sizeof(stack))
          return (-1);
        if (c >= 256)
          return (-1);
        stack[i++] = right[c];
        stack[i++] = left[c];
      }
    }
  }
  return (o - out);
}


x86 assembly (clang, -O0):
<bpe_expand>:
push   %rbp
mov    %rsp,%rbp
sub    $0x280,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x268(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x270(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x278(%rbp)
mov    -0x268(%rbp),%rsi
lea    -0x10(%rbp),%rdi
call   1030 <xgetc@plt>
mov    %ax,-0x254(%rbp)
cwtl
cmp    $0x0,%eax
jl     15b6 <bpe_expand+0x4a6>
movw   $0x0,-0x256(%rbp)
movswl -0x256(%rbp),%eax
cmp    $0x100,%eax
jge    11c3 <bpe_expand+0xb3>
mov    -0x256(%rbp),%ax
mov    %al,%cl
movswq -0x256(%rbp),%rax
ff
mov    %cl,-0x130(%rbp,%rax,1)
mov    -0x256(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x256(%rbp)
jmp    1182 <bpe_expand+0x72>
movw   $0x0,-0x252(%rbp)
movswl -0x254(%rbp),%eax
cmp    $0x7f,%eax
jle    11ff <bpe_expand+0xef>
movswl -0x254(%rbp),%ecx
sub    $0x7f,%ecx
movswl -0x252(%rbp),%eax
add    %ecx,%eax
mov    %ax,-0x252(%rbp)
movw   $0x0,-0x254(%rbp)
movswl -0x252(%rbp),%eax
cmp    $0x100,%eax
jl     1216 <bpe_expand+0x106>
jmp    1382 <bpe_expand+0x272>
movw   $0x0,-0x256(%rbp)
movswl -0x256(%rbp),%eax
movswl -0x254(%rbp),%ecx
cmp    %ecx,%eax
jg     133a <bpe_expand+0x22a>
mov    -0x268(%rbp),%rsi
lea    -0x10(%rbp),%rdi
call   1030 <xgetc@plt>
mov    %ax,-0x25a(%rbp)
cwtl
cmp    $0x0,%eax
jge    125b <bpe_expand+0x14b>
jmp    133a <bpe_expand+0x22a>
movswl -0x252(%rbp),%eax
cmp    $0x100,%eax
jl     1279 <bpe_expand+0x169>
movl   $0xffffffff,-0x4(%rbp)
jmp    15c7 <bpe_expand+0x4b7>
mov    -0x25a(%rbp),%ax
mov    %al,%cl
movswq -0x252(%rbp),%rax
ff
mov    %cl,-0x130(%rbp,%rax,1)
movswl -0x252(%rbp),%eax
movswq -0x252(%rbp),%rcx
ff
movzbl -0x130(%rbp,%rcx,1),%ecx
ff
cmp    %ecx,%eax
je     130c <bpe_expand+0x1fc>
mov    -0x268(%rbp),%rsi
lea    -0x10(%rbp),%rdi
call   1030 <xgetc@plt>
mov    %ax,-0x25a(%rbp)
cwtl
cmp    $0x0,%eax
jge    12d6 <bpe_expand+0x1c6>
jmp    133a <bpe_expand+0x22a>
movswl -0x252(%rbp),%eax
cmp    $0x100,%eax
jl     12f4 <bpe_expand+0x1e4>
movl   $0xffffffff,-0x4(%rbp)
jmp    15c7 <bpe_expand+0x4b7>
mov    -0x25a(%rbp),%ax
mov    %al,%cl
movswq -0x252(%rbp),%rax
ff
mov    %cl,-0x230(%rbp,%rax,1)
jmp    1311 <bpe_expand+0x201>
mov    -0x256(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x256(%rbp)
mov    -0x252(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x252(%rbp)
jmp    121f <bpe_expand+0x10f>
movswl -0x252(%rbp),%eax
cmp    $0x100,%eax
jl     1351 <bpe_expand+0x241>
jmp    1382 <bpe_expand+0x272>
mov    -0x268(%rbp),%rsi
lea    -0x10(%rbp),%rdi
call   1030 <xgetc@plt>
mov    %ax,-0x254(%rbp)
movswl -0x254(%rbp),%eax
cmp    $0x0,%eax
jge    137d <bpe_expand+0x26d>
jmp    1382 <bpe_expand+0x272>
jmp    11cc <bpe_expand+0xbc>
mov    -0x268(%rbp),%rsi
lea    -0x10(%rbp),%rdi
call   1030 <xgetc@plt>
mov    %ax,-0x25a(%rbp)
cwtl
cmp    $0x0,%eax
jge    13a8 <bpe_expand+0x298>
jmp    15b6 <bpe_expand+0x4a6>
movswl -0x25a(%rbp),%eax
shl    $0x8,%eax
mov    %ax,-0x258(%rbp)
mov    -0x268(%rbp),%rsi
lea    -0x10(%rbp),%rdi
call   1030 <xgetc@plt>
mov    %ax,-0x25a(%rbp)
cwtl
cmp    $0x0,%eax
jge    13df <bpe_expand+0x2cf>
jmp    15b6 <bpe_expand+0x4a6>
movswl -0x25a(%rbp),%ecx
movswl -0x258(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x258(%rbp)
movw   $0x0,-0x256(%rbp)
cmpw   $0x0,-0x256(%rbp)
je     1437 <bpe_expand+0x327>
mov    -0x256(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x256(%rbp)
movswq %ax,%rax
movzbl -0x250(%rbp,%rax,1),%eax
ff
mov    %ax,-0x252(%rbp)
jmp    148c <bpe_expand+0x37c>
mov    -0x258(%rbp),%ax
mov    %ax,%cx
add    $0xffff,%cx
mov    %cx,-0x258(%rbp)
cmp    $0x0,%ax
jne    145b <bpe_expand+0x34b>
jmp    15b1 <bpe_expand+0x4a1>
mov    -0x268(%rbp),%rsi
lea    -0x10(%rbp),%rdi
call   1030 <xgetc@plt>
mov    %ax,-0x252(%rbp)
movswl -0x252(%rbp),%eax
cmp    $0x0,%eax
jge    1487 <bpe_expand+0x377>
jmp    15b1 <bpe_expand+0x4a1>
jmp    148c <bpe_expand+0x37c>
movswl -0x252(%rbp),%eax
cmp    $0x100,%eax
jl     14aa <bpe_expand+0x39a>
movl   $0xffffffff,-0x4(%rbp)
jmp    15c7 <bpe_expand+0x4b7>
movswl -0x252(%rbp),%eax
movswq -0x252(%rbp),%rcx
ff
movzbl -0x130(%rbp,%rcx,1),%ecx
ff
cmp    %ecx,%eax
jne    150e <bpe_expand+0x3fe>
mov    -0x270(%rbp),%rax
cmp    -0x278(%rbp),%rax
jb     14e9 <bpe_expand+0x3d9>
movl   $0xffffffff,-0x4(%rbp)
jmp    15c7 <bpe_expand+0x4b7>
mov    -0x252(%rbp),%ax
mov    %al,%cl
mov    -0x270(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x270(%rbp)
mov    %cl,(%rax)
jmp    15ac <bpe_expand+0x49c>
movswl -0x256(%rbp),%eax
add    $0x2,%eax
cltq
cmp    $0x1e,%rax
jbe    1530 <bpe_expand+0x420>
movl   $0xffffffff,-0x4(%rbp)
jmp    15c7 <bpe_expand+0x4b7>
movswl -0x252(%rbp),%eax
cmp    $0x100,%eax
jl     154e <bpe_expand+0x43e>
movl   $0xffffffff,-0x4(%rbp)
jmp    15c7 <bpe_expand+0x4b7>
movswq -0x252(%rbp),%rax
ff
mov    -0x230(%rbp,%rax,1),%cl
mov    -0x256(%rbp),%ax
mov    %ax,%dx
add    $0x1,%dx
mov    %dx,-0x256(%rbp)
movswq %ax,%rax
mov    %cl,-0x250(%rbp,%rax,1)
movswq -0x252(%rbp),%rax
ff
mov    -0x130(%rbp,%rax,1),%cl
mov    -0x256(%rbp),%ax
mov    %ax,%dx
add    $0x1,%dx
mov    %dx,-0x256(%rbp)
movswq %ax,%rax
mov    %cl,-0x250(%rbp,%rax,1)
jmp    13ff <bpe_expand+0x2ef>
jmp    1158 <bpe_expand+0x48>
mov    -0x270(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x280,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<bpe_expand>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x258,%rsp
mov    %ecx,%ebp
mov    %rdx,%r14
mov    %rdi,(%rsp)
movslq %esi,%r15
add    %rdi,%r15
mov    %rsp,%rdi
mov    %r15,%rsi
call   1030 <xgetc@plt>
mov    %r14,%r12
test   %ax,%ax
js     1514 <bpe_expand+0x404>
mov    %eax,%ebx
movslq %ebp,%rax
add    %r14,%rax
mov    %rax,0x20(%rsp)
movaps 0xea4(%rip),%xmm8
movaps 0xeac(%rip),%xmm9
movaps 0xeb5(%rip),%xmm2
movaps 0xebe(%rip),%xmm3
movaps 0xec7(%rip),%xmm4
movaps 0xed0(%rip),%xmm5
movaps 0xed9(%rip),%xmm6
movaps 0xee2(%rip),%xmm7
movaps 0xeeb(%rip),%xmm0
movaps 0xef4(%rip),%xmm1
movaps 0xefc(%rip),%xmm10
movaps 0xf04(%rip),%xmm11
movaps 0xf0c(%rip),%xmm12
movaps 0xf14(%rip),%xmm13
movaps 0xf1c(%rip),%xmm14
movaps 0xf24(%rip),%xmm15
xor    %r13d,%r13d
mov    %rsp,%rbp
mov    %r14,%r12
mov    %r14,0x8(%rsp)
mov    %r12,0x10(%rsp)
movaps %xmm8,0x50(%rsp)
movaps %xmm9,0x60(%rsp)
movaps %xmm2,0x70(%rsp)
movaps %xmm3,0x80(%rsp)
movaps %xmm4,0x90(%rsp)
movaps %xmm5,0xa0(%rsp)
movaps %xmm6,0xb0(%rsp)
movaps %xmm7,0xc0(%rsp)
movaps %xmm0,0xd0(%rsp)
movaps %xmm1,0xe0(%rsp)
movaps %xmm10,0xf0(%rsp)
movaps %xmm11,0x100(%rsp)
movaps %xmm12,0x110(%rsp)
movaps %xmm13,0x120(%rsp)
movaps %xmm14,0x130(%rsp)
movaps %xmm15,0x140(%rsp)
xor    %eax,%eax
jmp    12ac <bpe_expand+0x19c>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    0x18(%rsp),%r12
add    %r15,%r12
movswl %r12w,%eax
cmp    $0xff,%eax
mov    %rbp,%r15
mov    $0x0,%r13d
mov    %rsp,%rbp
jg     1384 <bpe_expand+0x274>
mov    %rbp,%rdi
mov    %r15,%rsi
call   1030 <xgetc@plt>
mov    %eax,%ebx
mov    %r12d,%eax
test   %bx,%bx
js     1384 <bpe_expand+0x274>
lea    -0x7f(%rbx),%ecx
cmp    $0x7f,%bx
cmovg  %r13d,%ebx
cmovle %r13d,%ecx
lea    (%rax,%rcx,1),%r12d
movswl %r12w,%r14d
cmp    $0xff,%r14d
jg     1384 <bpe_expand+0x274>
test   %bx,%bx
js     1293 <bpe_expand+0x183>
mov    %r15,%rbp
movswq %r14w,%rdx
add    %ecx,%eax
add    $0x7f,%eax
lea    0x50(%rsp,%rdx,1),%r13
mov    %rdx,0x18(%rsp)
lea    (%rsp,%rdx,1),%rcx
add    $0x150,%rcx
mov    %rcx,0x28(%rsp)
movzwl %ax,%r12d
xor    %r15d,%r15d
jmp    1327 <bpe_expand+0x217>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    0x28(%rsp),%rcx
mov    %al,(%rcx,%r15,1)
add    $0x1,%r15
cmp    %bx,%r15w
jg     1270 <bpe_expand+0x160>
mov    %rsp,%rdi
mov    %rbp,%rsi
call   1030 <xgetc@plt>
test   %ax,%ax
js     1270 <bpe_expand+0x160>
lea    (%r12,%r15,1),%rcx
add    $0xfffffffffffffe81,%rcx
test   %cx,%cx
je     1502 <bpe_expand+0x3f2>
lea    (%r14,%r15,1),%ecx
mov    %al,0x0(%r13,%r15,1)
movzbl %al,%eax
cmp    %eax,%ecx
je     1319 <bpe_expand+0x209>
mov    %rsp,%rdi
mov    %rbp,%rsi
call   1030 <xgetc@plt>
test   %ax,%ax
jns    1310 <bpe_expand+0x200>
add    %r15d,%r12d
add    $0xffffff81,%r12d
mov    %rbp,%r15
xor    %r13d,%r13d
mov    %rsp,%rbp
jmp    1293 <bpe_expand+0x183>
mov    %rbp,%rdi
mov    %r15,%rsi
call   1030 <xgetc@plt>
test   %ax,%ax
js     150a <bpe_expand+0x3fa>
mov    %eax,%ebx
mov    %rbp,%rdi
mov    %r15,%rsi
call   1030 <xgetc@plt>
test   %ax,%ax
mov    0x8(%rsp),%r14
mov    0x10(%rsp),%r12
js     1514 <bpe_expand+0x404>
mov    %eax,%ebp
shl    $0x8,%ebx
or     %ebx,%ebp
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
test   %cx,%cx
je     13f0 <bpe_expand+0x2e0>
add    $0xffffffff,%ecx
movswq %cx,%rax
movzbl 0x30(%rsp,%rax,1),%eax
jmp    1419 <bpe_expand+0x309>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
test   %bp,%bp
je     146f <bpe_expand+0x35f>
mov    %rsp,%rdi
mov    %r15,%rsi
call   1030 <xgetc@plt>
test   %ax,%ax
js     146f <bpe_expand+0x35f>
movzwl %ax,%ecx
cmp    $0xff,%ecx
ja     1502 <bpe_expand+0x3f2>
add    $0xffffffff,%ebp
xor    %ecx,%ecx
movzwl %ax,%edx
movzbl 0x50(%rsp,%rdx,1),%eax
cmp    %ax,%dx
je     1457 <bpe_expand+0x347>
movswq %cx,%rcx
lea    -0x1d(%rcx),%rsi
cmp    $0xffffffffffffffe1,%rsi
jb     1502 <bpe_expand+0x3f2>
movzbl 0x150(%rsp,%rdx,1),%edx
lea    0x1(%rcx),%esi
mov    %dl,0x30(%rsp,%rcx,1)
add    $0x2,%ecx
movswq %si,%rdx
mov    %al,0x30(%rsp,%rdx,1)
jmp    13d0 <bpe_expand+0x2c0>
cmp    0x20(%rsp),%r12
jae    1502 <bpe_expand+0x3f2>
mov    %dl,(%r12)
add    $0x1,%r12
jmp    13d0 <bpe_expand+0x2c0>
mov    %rsp,%rbp
mov    %rbp,%rdi
mov    %r15,%rsi
call   1030 <xgetc@plt>
mov    %eax,%ebx
test   %ax,%ax
movaps 0xb76(%rip),%xmm8
movaps 0xb7e(%rip),%xmm9
movaps 0xb87(%rip),%xmm2
movaps 0xb90(%rip),%xmm3
movaps 0xb99(%rip),%xmm4
movaps 0xba2(%rip),%xmm5
movaps 0xbab(%rip),%xmm6
movaps 0xbb4(%rip),%xmm7
movaps 0xbbd(%rip),%xmm0
movaps 0xbc6(%rip),%xmm1
movaps 0xbce(%rip),%xmm10
movaps 0xbd6(%rip),%xmm11
movaps 0xbde(%rip),%xmm12
movaps 0xbe6(%rip),%xmm13
movaps 0xbee(%rip),%xmm14
movaps 0xbf6(%rip),%xmm15
jns    11da <bpe_expand+0xca>
jmp    1514 <bpe_expand+0x404>
mov    $0xffffffff,%r12d
jmp    1517 <bpe_expand+0x407>
mov    0x8(%rsp),%r14
mov    0x10(%rsp),%r12
sub    %r14d,%r12d
mov    %r12d,%eax
add    $0x258,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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