int goldensun(unsigned char *instream, int inLength, unsigned char *outstream,
              int decompressedSize) {
  int i, o = 0;
  int readBytes = 0;
  int bufferLength = 0x1000;
  unsigned char buffer[bufferLength];
  int bufferOffset = 0;
  int currentOutSize = 0;
  int currentBlock = 0;
  unsigned char expandedFlags[8];
  while (currentOutSize < decompressedSize) {
    if (currentBlock == 8) {
      if (readBytes >= inLength)
        return (-1);
      int flags = instream[readBytes++];
      if (flags < 0)
        return (-1);
      int b = 0;
      while (flags > 0) {
        int bit = (flags & 0x80) > 0;
        flags = (flags & 0x7F) << 1;
        expandedFlags[b++] = (flags == 0) || !bit;
      }
      currentBlock = 0;
    } else {
      currentBlock++;
    }
    if (expandedFlags[currentBlock]) {
      if (readBytes + 1 >= inLength) {
        return (-1);
      }
      int byte1 = instream[readBytes++];
      int byte2 = instream[readBytes++];
      if (byte2 < 0)
        return (-1);
      int disp, length;
      disp = (byte1 >> 4) + (byte2 << 4);
      if (disp > currentOutSize)
        return (-1);
      switch (byte1 & 0x0F) {
      case 0: {
        if (readBytes >= inLength)
          return (-1);
        int byte3 = instream[readBytes++];
        if (byte3 < 0)
          return (-1);
        length = byte3 + 0x10;
        break;
      }
      case 1: {
        if (readBytes + 1 >= inLength)
          return (-1);
        int byte3 = instream[readBytes++];
        int byte4 = instream[readBytes++];
        if (byte4 < 0)
          return (-1);
        length = ((byte3 << 8) + byte4) + 0x110;
        break;
      }
      default: {
        length = byte1 & 0x0F;
        break;
      }
      }
      int bufIdx = bufferOffset + bufferLength - disp;
      for (i = 0; i < length; i++) {
        unsigned char next = buffer[bufIdx % bufferLength];
        bufIdx++;
        outstream[o++] = next;
        buffer[bufferOffset] = next;
        bufferOffset = (bufferOffset + 1) % bufferLength;
      }
      currentOutSize += length;
    } else {
      if (readBytes >= inLength)
        return (-1);
      int next = instream[readBytes++];
      if (next < 0)
        return (-1);
      currentOutSize++;
      outstream[o++] = next;
      buffer[bufferOffset] = (unsigned char)next;
      bufferOffset = (bufferOffset + 1) % bufferLength;
    }
  }
  if (readBytes < inLength) {
    if ((readBytes ^ (readBytes & 3)) + 4 < inLength)
      return (-1);
  }
  return (o);
}


x86 assembly (clang, -O0):
<goldensun>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x1000,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %rsp,%rcx
mov    %rcx,-0x40(%rbp)
mov    %rax,%rdx
add    $0xf,%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0xa0(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    158c <goldensun+0x48c>
cmpl   $0x8,-0x54(%rbp)
jne    125a <goldensun+0x15a>
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     11a1 <goldensun+0xa1>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x30(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x64(%rbp)
cmpl   $0x0,-0x64(%rbp)
jge    11d7 <goldensun+0xd7>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
movl   $0x0,-0x68(%rbp)
cmpl   $0x0,-0x64(%rbp)
jle    124e <goldensun+0x14e>
mov    -0x64(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
setg   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x64(%rbp),%eax
and    $0x7f,%eax
shl    $0x1,%eax
mov    %eax,-0x64(%rbp)
mov    $0x1,%al
cmpl   $0x0,-0x64(%rbp)
mov    %al,-0xa1(%rbp)
je     122b <goldensun+0x12b>
cmpl   $0x0,-0x6c(%rbp)
setne  %al
xor    $0xff,%al
mov    %al,-0xa1(%rbp)
mov    -0xa1(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %al,%cl
mov    -0x68(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x68(%rbp)
cltq
mov    %cl,-0x5c(%rbp,%rax,1)
jmp    11de <goldensun+0xde>
movl   $0x0,-0x54(%rbp)
jmp    1263 <goldensun+0x163>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
movslq -0x54(%rbp),%rax
cmpb   $0x0,-0x5c(%rbp,%rax,1)
je     14e1 <goldensun+0x3e1>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
cmp    -0x14(%rbp),%eax
jl     1294 <goldensun+0x194>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x30(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x70(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x30(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x74(%rbp)
cmpl   $0x0,-0x74(%rbp)
jge    12e3 <goldensun+0x1e3>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0x70(%rbp),%eax
sar    $0x4,%eax
mov    -0x74(%rbp),%ecx
shl    $0x4,%ecx
add    %ecx,%eax
mov    %eax,-0x78(%rbp)
mov    -0x78(%rbp),%eax
cmp    -0x50(%rbp),%eax
jle    1313 <goldensun+0x213>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0x70(%rbp),%eax
and    $0xf,%eax
mov    %eax,-0xa8(%rbp)
je     133e <goldensun+0x23e>
jmp    132a <goldensun+0x22a>
mov    -0xa8(%rbp),%eax
sub    $0x1,%eax
je     13a1 <goldensun+0x2a1>
jmp    1437 <goldensun+0x337>
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     135d <goldensun+0x25d>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x30(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x80(%rbp)
cmpl   $0x0,-0x80(%rbp)
jge    1393 <goldensun+0x293>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0x80(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x7c(%rbp)
jmp    1440 <goldensun+0x340>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
cmp    -0x14(%rbp),%eax
jl     13c3 <goldensun+0x2c3>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x30(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x84(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x30(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x88(%rbp)
cmpl   $0x0,-0x88(%rbp)
jge    141b <goldensun+0x31b>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0x84(%rbp),%eax
shl    $0x8,%eax
add    -0x88(%rbp),%eax
add    $0x110,%eax
mov    %eax,-0x7c(%rbp)
jmp    1440 <goldensun+0x340>
mov    -0x70(%rbp),%eax
and    $0xf,%eax
mov    %eax,-0x7c(%rbp)
mov    -0x4c(%rbp),%eax
add    -0x34(%rbp),%eax
sub    -0x78(%rbp),%eax
mov    %eax,-0x8c(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x7c(%rbp),%eax
jge    14d3 <goldensun+0x3d3>
mov    -0x8c(%rbp),%eax
cltd
idivl  -0x34(%rbp)
mov    -0xa0(%rbp),%rax
movslq %edx,%rcx
mov    (%rax,%rcx,1),%cl
mov    %cl,-0x8d(%rbp)
mov    -0x8c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x8c(%rbp)
mov    -0x8d(%rbp),%sil
mov    -0x20(%rbp),%rcx
mov    -0x2c(%rbp),%edx
mov    %edx,%edi
add    $0x1,%edi
mov    %edi,-0x2c(%rbp)
movslq %edx,%rdx
mov    %sil,(%rcx,%rdx,1)
mov    -0x8d(%rbp),%dl
movslq -0x4c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
cltd
idivl  -0x34(%rbp)
mov    %edx,-0x4c(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1456 <goldensun+0x356>
mov    -0x7c(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    1587 <goldensun+0x487>
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     1500 <goldensun+0x400>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x30(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x94(%rbp)
cmpl   $0x0,-0x94(%rbp)
jge    153c <goldensun+0x43c>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
mov    -0xa0(%rbp),%rax
mov    -0x50(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x50(%rbp)
mov    -0x94(%rbp),%ecx
mov    %cl,%sil
mov    -0x20(%rbp),%rcx
mov    -0x2c(%rbp),%edx
mov    %edx,%edi
add    $0x1,%edi
mov    %edi,-0x2c(%rbp)
movslq %edx,%rdx
mov    %sil,(%rcx,%rdx,1)
mov    -0x94(%rbp),%ecx
mov    %cl,%dl
movslq -0x4c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
cltd
idivl  -0x34(%rbp)
mov    %edx,-0x4c(%rbp)
jmp    116c <goldensun+0x6c>
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    15c7 <goldensun+0x4c7>
mov    -0x30(%rbp),%eax
mov    -0x30(%rbp),%ecx
and    $0x3,%ecx
xor    %ecx,%eax
add    $0x4,%eax
cmp    -0x14(%rbp),%eax
jge    15c2 <goldensun+0x4c2>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
jmp    15d4 <goldensun+0x4d4>
jmp    15c7 <goldensun+0x4c7>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
movl   $0x1,-0x60(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,%rsp
mov    -0x4(%rbp),%eax
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<goldensun>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xfa8,%rsp
mov    %rdx,-0x78(%rsp)
mov    %ecx,-0x7c(%rsp)
test   %ecx,%ecx
jle    132c <goldensun+0x22c>
xor    %r12d,%r12d
xor    %r15d,%r15d
xor    %r8d,%r8d
xor    %r10d,%r10d
xor    %r11d,%r11d
mov    %esi,-0x80(%rsp)
mov    %rdi,-0x70(%rsp)
jmp    1156 <goldensun+0x56>
nopl   0x0(%rax)
add    %r13d,%r10d
mov    %r14d,%r15d
cmp    -0x7c(%rsp),%r10d
mov    -0x70(%rsp),%rdi
jge    1332 <goldensun+0x232>
cmp    $0x8,%r11d
jne    11b0 <goldensun+0xb0>
cmp    %esi,%r15d
jge    134e <goldensun+0x24e>
movslq %r15d,%rax
add    $0x1,%r15d
movzbl (%rdi,%rax,1),%ebp
xor    %r11d,%r11d
test   %ebp,%ebp
je     11b4 <goldensun+0xb4>
lea    -0x68(%rsp),%rbx
nopl   0x0(%rax)
test   $0x80,%bpl
sete   %r9b
add    %ebp,%ebp
mov    %ebp,%eax
and    $0xff,%eax
sete   %al
or     %r9b,%al
mov    %al,(%rbx)
add    $0x1,%rbx
and    $0xff,%ebp
jne    1180 <goldensun+0x80>
jmp    11b4 <goldensun+0xb4>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r11d
movslq %r11d,%rax
cmpb   $0x0,-0x68(%rsp,%rax,1)
je     1230 <goldensun+0x130>
movslq %r15d,%r13
lea    0x1(%r13),%rbx
mov    $0xffffffff,%eax
cmp    %esi,%ebx
jge    1353 <goldensun+0x253>
mov    %r12,%rcx
movzbl (%rdi,%r13,1),%r9d
movzbl (%rdi,%rbx,1),%r12d
mov    %r9d,%ebx
shr    $0x4,%ebx
shl    $0x4,%r12d
or     %ebx,%r12d
cmp    %r10d,%r12d
jg     1353 <goldensun+0x253>
lea    0x2(%r13),%r14
and    $0xf,%r9d
cmp    $0x1,%r9d
je     1286 <goldensun+0x186>
test   %r9d,%r9d
jne    12b2 <goldensun+0x1b2>
cmp    %esi,%r14d
jge    1353 <goldensun+0x253>
add    $0x3,%r15d
movzbl (%rdi,%r14,1),%r9d
add    $0x10,%r9d
jmp    12af <goldensun+0x1af>
nopl   0x0(%rax,%rax,1)
cmp    %esi,%r15d
jge    134e <goldensun+0x24e>
movslq %r15d,%rax
add    $0x1,%r15d
mov    (%rdi,%rax,1),%al
movslq %r12d,%rcx
mov    -0x78(%rsp),%rdx
mov    %al,(%rdx,%rcx,1)
movslq %r8d,%rcx
mov    %al,-0x60(%rsp,%rcx,1)
lea    0x1(%r8),%eax
lea    0x1000(%r8),%ecx
test   %eax,%eax
cmovns %eax,%ecx
and    $0xfffff000,%ecx
neg    %ecx
add    %ecx,%r8d
add    $0x1,%r8d
add    $0x1,%r12d
mov    $0x1,%r13d
mov    %r15d,%r14d
jmp    1140 <goldensun+0x40>
add    $0x3,%r13
cmp    %esi,%r13d
jge    1353 <goldensun+0x253>
add    $0x4,%r15d
movzbl (%rdi,%r14,1),%eax
shl    $0x8,%eax
movzbl (%rdi,%r13,1),%ebp
lea    (%rax,%rbp,1),%r9d
add    $0x110,%r9d
mov    %r15d,%r14d
mov    %r9d,%r13d
mov    %r8d,%ebx
sub    %r12d,%ebx
add    $0x1000,%ebx
mov    %rcx,%r12
movslq %r12d,%r15
add    -0x78(%rsp),%r15
xor    %eax,%eax
xchg   %ax,%ax
mov    %ebx,%ebp
add    %eax,%ebp
lea    0xfff(%rbx,%rax,1),%edx
cmovns %ebp,%edx
and    $0xfffff000,%edx
sub    %edx,%ebp
movslq %ebp,%rdx
movzbl -0x60(%rsp,%rdx,1),%edx
mov    %dl,(%r15,%rax,1)
movslq %r8d,%rbp
mov    %dl,-0x60(%rsp,%rbp,1)
lea    0x1(%rbp),%edx
lea    0x1000(%rbp),%ecx
test   %edx,%edx
cmovns %edx,%ecx
and    $0xfffff000,%ecx
neg    %ecx
lea    (%rcx,%rbp,1),%r8d
add    $0x1,%r8d
add    $0x1,%rax
cmp    %eax,%r13d
jne    12d0 <goldensun+0x1d0>
add    %eax,%r12d
mov    -0x80(%rsp),%esi
jmp    1140 <goldensun+0x40>
xor    %r14d,%r14d
xor    %r12d,%r12d
cmp    %esi,%r14d
jge    1349 <goldensun+0x249>
add    $0x4,%r14d
and    $0xfffffffc,%r14d
mov    $0xffffffff,%eax
cmp    %esi,%r14d
jl     1353 <goldensun+0x253>
mov    %r12d,%eax
jmp    1353 <goldensun+0x253>
mov    $0xffffffff,%eax
add    $0xfa8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @goldensun(i8* nocapture %0, i32 %1, i8* nocapture writeonly %2, i32 %3) {
%5 = alloca [8 x i8]
%6 = alloca [4096 x i8]
%7 = getelementptr inbounds [8 x i8], [8 x i8]* %5, i64 0, i64 0
%8 = icmp sgt i32 %3, 0
br i1 %8, label %9, label %138
9: ; preds = %4, %131
%10 = phi i32 [ %135, %131 ], [ 0, %4 ]
%11 = phi i32 [ %134, %131 ], [ 0, %4 ]
%12 = phi i32 [ %133, %131 ], [ 0, %4 ]
%13 = phi i32 [ %136, %131 ], [ 0, %4 ]
%14 = phi i32 [ %41, %131 ], [ 0, %4 ]
%15 = icmp eq i32 %14, 8
br i1 %15, label %16, label %38
16: ; preds = %9
%17 = icmp slt i32 %11, %1
br i1 %17, label %18, label %147
18: ; preds = %16
%19 = add nsw i32 %11, 1
%20 = sext i32 %11 to i64
%21 = getelementptr inbounds i8, i8* %0, i64 %20
%22 = load i8, i8* %21
%23 = icmp eq i8 %22, 0
br i1 %23, label %40, label %24
24: ; preds = %18
%25 = zext i8 %22 to i32
br label %26
26: ; preds = %24, %26
%27 = phi i64 [ 0, %24 ], [ %36, %26 ]
%28 = phi i32 [ %25, %24 ], [ %32, %26 ]
%29 = and i32 %28, 128
%30 = icmp eq i32 %29, 0
%31 = shl nuw nsw i32 %28, 1
%32 = and i32 %31, 254
%33 = icmp eq i32 %32, 0
%34 = select i1 %33, i1 true, i1 %30
%35 = zext i1 %34 to i8
%36 = add nuw i64 %27, 1
%37 = getelementptr inbounds [8 x i8], [8 x i8]* %5, i64 0, i64 %27
store i8 %35, i8* %37
br i1 %33, label %40, label %26
38: ; preds = %9
%39 = add nsw i32 %14, 1
br label %40
40: ; preds = %26, %18, %38
%41 = phi i32 [ %39, %38 ], [ 0, %18 ], [ 0, %26 ]
%42 = phi i32 [ %11, %38 ], [ %19, %18 ], [ %19, %26 ]
%43 = sext i32 %41 to i64
%44 = getelementptr inbounds [8 x i8], [8 x i8]* %5, i64 0, i64 %43
%45 = load i8, i8* %44
%46 = icmp eq i8 %45, 0
br i1 %46, label %115, label %47
47: ; preds = %40
%48 = add nsw i32 %42, 1
%49 = icmp slt i32 %48, %1
br i1 %49, label %50, label %147
50: ; preds = %47
%51 = sext i32 %42 to i64
%52 = getelementptr inbounds i8, i8* %0, i64 %51
%53 = load i8, i8* %52
%54 = zext i8 %53 to i32
%55 = add nsw i32 %42, 2
%56 = sext i32 %48 to i64
%57 = getelementptr inbounds i8, i8* %0, i64 %56
%58 = load i8, i8* %57
%59 = zext i8 %58 to i32
%60 = lshr i32 %54, 4
%61 = shl nuw nsw i32 %59, 4
%62 = or i32 %61, %60
%63 = icmp sgt i32 %62, %13
br i1 %63, label %147, label %64
64: ; preds = %50
%65 = and i32 %54, 15
switch i32 %65, label %91 [
i32 0, label %66
i32 1, label %75
]
66: ; preds = %64
%67 = icmp slt i32 %55, %1
br i1 %67, label %68, label %147
68: ; preds = %66
%69 = add nsw i32 %42, 3
%70 = sext i32 %55 to i64
%71 = getelementptr inbounds i8, i8* %0, i64 %70
%72 = load i8, i8* %71
%73 = zext i8 %72 to i32
%74 = add nuw nsw i32 %73, 16
br label %91
75: ; preds = %64
%76 = add nsw i32 %42, 3
%77 = icmp slt i32 %76, %1
br i1 %77, label %78, label %147
78: ; preds = %75
%79 = add nsw i32 %42, 4
%80 = sext i32 %55 to i64
%81 = getelementptr inbounds i8, i8* %0, i64 %80
%82 = load i8, i8* %81
%83 = zext i8 %82 to i32
%84 = shl nuw nsw i32 %83, 8
%85 = sext i32 %76 to i64
%86 = getelementptr inbounds i8, i8* %0, i64 %85
%87 = load i8, i8* %86
%88 = zext i8 %87 to i32
%89 = or i32 %84, %88
%90 = add nuw nsw i32 %89, 272
br label %91
91: ; preds = %68, %78, %64
%92 = phi i32 [ %90, %78 ], [ %74, %68 ], [ %65, %64 ]
%93 = phi i32 [ %79, %78 ], [ %69, %68 ], [ %55, %64 ]
%94 = add nsw i32 %12, 4096
%95 = sub nsw i32 %94, %62
%96 = sext i32 %10 to i64
br label %97
97: ; preds = %91, %97
%98 = phi i64 [ %96, %91 ], [ %107, %97 ]
%99 = phi i32 [ 0, %91 ], [ %113, %97 ]
%100 = phi i32 [ %95, %91 ], [ %106, %97 ]
%101 = phi i32 [ %12, %91 ], [ %112, %97 ]
%102 = srem i32 %100, 4096
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds [4096 x i8], [4096 x i8]* %6, i64 0, i64 %103
%105 = load i8, i8* %104
%106 = add nsw i32 %100, 1
%107 = add nsw i64 %98, 1
%108 = getelementptr inbounds i8, i8* %2, i64 %98
store i8 %105, i8* %108
%109 = sext i32 %101 to i64
%110 = getelementptr inbounds [4096 x i8], [4096 x i8]* %6, i64 0, i64 %109
store i8 %105, i8* %110
%111 = add nsw i32 %101, 1
%112 = srem i32 %111, 4096
%113 = add nuw nsw i32 %99, 1
%114 = icmp eq i32 %113, %92
br i1 %114, label %129, label %97
115: ; preds = %40
%116 = icmp slt i32 %42, %1
br i1 %116, label %117, label %147
117: ; preds = %115
%118 = add nsw i32 %42, 1
%119 = sext i32 %42 to i64
%120 = getelementptr inbounds i8, i8* %0, i64 %119
%121 = load i8, i8* %120
%122 = sext i32 %10 to i64
%123 = getelementptr inbounds i8, i8* %2, i64 %122
store i8 %121, i8* %123
%124 = sext i32 %12 to i64
%125 = getelementptr inbounds [4096 x i8], [4096 x i8]* %6, i64 0, i64 %124
store i8 %121, i8* %125
%126 = add nsw i32 %12, 1
%127 = srem i32 %126, 4096
%128 = add nsw i32 %10, 1
br label %131
129: ; preds = %97
%130 = trunc i64 %107 to i32
br label %131
131: ; preds = %129, %117
%132 = phi i32 [ 1, %117 ], [ %92, %129 ]
%133 = phi i32 [ %127, %117 ], [ %112, %129 ]
%134 = phi i32 [ %118, %117 ], [ %93, %129 ]
%135 = phi i32 [ %128, %117 ], [ %130, %129 ]
%136 = add nsw i32 %132, %13
%137 = icmp slt i32 %136, %3
br i1 %137, label %9, label %138
138: ; preds = %131, %4
%139 = phi i32 [ 0, %4 ], [ %134, %131 ]
%140 = phi i32 [ 0, %4 ], [ %135, %131 ]
%141 = icmp slt i32 %139, %1
br i1 %141, label %142, label %146
142: ; preds = %138
%143 = add i32 %139, 4
%144 = and i32 %143, -4
%145 = icmp slt i32 %144, %1
br i1 %145, label %147, label %146
146: ; preds = %142, %138
br label %147
147: ; preds = %75, %66, %50, %115, %47, %16, %142, %146
%148 = phi i32 [ %140, %146 ], [ -1, %142 ], [ -1, %16 ], [ -1, %47 ], [ -1, %115 ], [ -1, %50 ], [ -1, %66 ], [ -1, %75 ]
ret i32 %148
}