#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*/ uint8_t;
typedef int uint32_t;
typedef int uint16_t;

/* Variables and functions */
void Lvl_CarmackExpand(uint16_t *source, uint16_t *dest, uint16_t length) {
  uint32_t chhigh, offset;
  uint16_t *copyptr, *outptr;
  uint8_t *inptr;
  uint16_t ch, count;
  length /= 2;
  inptr = (uint8_t *)source;
  outptr = dest;
  while (length) {
    ch = *(uint16_t *)inptr;
    inptr += 2;
    chhigh = ch >> 8;
    if (chhigh == 0xA7) {
      count = ch & 0xff;
      if (!count) {
        ch |= *inptr++;
        *outptr++ = (uint16_t)ch;
        length--;
      } else {
        offset = *inptr++;
        copyptr = outptr - offset;
        length -= count;
        while (count--) {
          *outptr++ = *copyptr++;
        }
      }
    } else if (chhigh == 0xA8) {
      count = ch & 0xff;
      if (!count) {
        ch |= *inptr++;
        *outptr++ = ch;
        length--;
      } else {
        offset = *(uint16_t *)inptr;
        inptr += 2;
        copyptr = dest + offset;
        length -= count;
        while (count--) {
          *outptr++ = *copyptr++;
        }
      }
    } else {
      *outptr++ = ch;
      length--;
    }
  }
}


x86 assembly (clang, -O0):
<Lvl_CarmackExpand>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     1326 <Lvl_CarmackExpand+0x226>
mov    -0x38(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
sar    $0x8,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0xa7,-0x18(%rbp)
jne    122c <Lvl_CarmackExpand+0x12c>
mov    -0x3c(%rbp),%eax
and    $0xff,%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x0,-0x40(%rbp)
jne    11b0 <Lvl_CarmackExpand+0xb0>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x38(%rbp)
mov    (%rax),%eax
or     -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%ecx
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x30(%rbp)
mov    %ecx,(%rax)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1227 <Lvl_CarmackExpand+0x127>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x38(%rbp)
mov    (%rax),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x40(%rbp),%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x40(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x40(%rbp)
cmp    $0x0,%eax
je     1222 <Lvl_CarmackExpand+0x122>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%ecx
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x30(%rbp)
mov    %ecx,(%rax)
jmp    11e7 <Lvl_CarmackExpand+0xe7>
jmp    1227 <Lvl_CarmackExpand+0x127>
jmp    1321 <Lvl_CarmackExpand+0x221>
cmpl   $0xa8,-0x18(%rbp)
jne    12ff <Lvl_CarmackExpand+0x1ff>
mov    -0x3c(%rbp),%eax
and    $0xff,%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x0,-0x40(%rbp)
jne    1287 <Lvl_CarmackExpand+0x187>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x38(%rbp)
mov    (%rax),%eax
or     -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%ecx
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x30(%rbp)
mov    %ecx,(%rax)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    12fa <Lvl_CarmackExpand+0x1fa>
mov    -0x38(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x40(%rbp),%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x40(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x40(%rbp)
cmp    $0x0,%eax
je     12f5 <Lvl_CarmackExpand+0x1f5>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%ecx
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x30(%rbp)
mov    %ecx,(%rax)
jmp    12ba <Lvl_CarmackExpand+0x1ba>
jmp    12fa <Lvl_CarmackExpand+0x1fa>
jmp    131c <Lvl_CarmackExpand+0x21c>
mov    -0x3c(%rbp),%ecx
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x30(%rbp)
mov    %ecx,(%rax)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1321 <Lvl_CarmackExpand+0x221>
jmp    112d <Lvl_CarmackExpand+0x2d>
pop    %rbp
ret

x86 assembly (clang, -O2):
<Lvl_CarmackExpand>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
lea    0x1(%rdx),%eax
cmp    $0x3,%eax
jae    111d <Lvl_CarmackExpand+0x1d>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rsi,%r11
movabs $0x1fffffff8,%r14
mov    %edx,%r13d
shr    $0x1f,%r13d
add    %edx,%r13d
sar    %r13d
lea    0x4(%rsi),%rax
mov    %rax,-0x8(%rsp)
lea    0x70(%rsi),%rax
mov    %rax,-0x20(%rsp)
lea    0x10(%rsi),%rax
mov    %rax,-0x18(%rsp)
mov    %rsi,%rcx
mov    %rsi,-0x10(%rsp)
jmp    1172 <Lvl_CarmackExpand+0x72>
nopl   0x0(%rax)
mov    %edx,(%rcx)
add    $0x4,%rcx
add    $0xffffffff,%r13d
mov    %rax,%rdi
test   %r13d,%r13d
je     1112 <Lvl_CarmackExpand+0x12>
mov    (%rdi),%edx
lea    0x8(%rdi),%rax
mov    %edx,%esi
sar    $0x8,%esi
cmp    $0xa8,%esi
je     1280 <Lvl_CarmackExpand+0x180>
cmp    $0xa7,%esi
jne    1160 <Lvl_CarmackExpand+0x60>
mov    %edx,%r10d
and    $0xff,%r10d
je     1360 <Lvl_CarmackExpand+0x260>
movslq (%rax),%r12
lea    0x0(,%r12,4),%rbx
mov    %rcx,%rdx
sub    %rbx,%rdx
lea    -0x1(%r10),%r15d
cmp    $0x7,%r15d
jb     11e4 <Lvl_CarmackExpand+0xe4>
mov    %r15,%rax
sub    %r12,%rax
lea    (%rcx,%rax,4),%rax
add    $0x4,%rax
cmp    %rax,%rcx
jae    1379 <Lvl_CarmackExpand+0x279>
lea    (%rcx,%r15,4),%rax
add    $0x4,%rax
cmp    %rax,%rdx
jae    1379 <Lvl_CarmackExpand+0x279>
mov    %r10d,%eax
lea    -0x1(%rax),%r8d
mov    %eax,%ebx
and    $0x7,%ebx
je     1215 <Lvl_CarmackExpand+0x115>
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    (%rdx),%esi
add    $0x4,%rdx
mov    %esi,(%rcx)
add    $0x4,%rcx
add    $0x1,%ebp
cmp    %ebp,%ebx
jne    1200 <Lvl_CarmackExpand+0x100>
sub    %ebp,%eax
cmp    $0x7,%r8d
jb     14d0 <Lvl_CarmackExpand+0x3d0>
mov    %eax,%eax
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%rdx,%rbp,4),%esi
mov    %esi,(%rcx)
mov    0x4(%rdx,%rbp,4),%esi
mov    %esi,0x4(%rcx)
mov    0x8(%rdx,%rbp,4),%esi
mov    %esi,0x8(%rcx)
mov    0xc(%rdx,%rbp,4),%esi
mov    %esi,0xc(%rcx)
mov    0x10(%rdx,%rbp,4),%esi
mov    %esi,0x10(%rcx)
mov    0x14(%rdx,%rbp,4),%esi
mov    %esi,0x14(%rcx)
mov    0x18(%rdx,%rbp,4),%esi
mov    %esi,0x18(%rcx)
mov    0x1c(%rdx,%rbp,4),%esi
mov    %esi,0x1c(%rcx)
add    $0x20,%rcx
add    $0x8,%rbp
cmp    %ebp,%eax
jne    1230 <Lvl_CarmackExpand+0x130>
jmp    14d0 <Lvl_CarmackExpand+0x3d0>
nopw   0x0(%rax,%rax,1)
mov    %edx,%r8d
and    $0xff,%r8d
je     1360 <Lvl_CarmackExpand+0x260>
movslq (%rax),%r12
lea    (%r11,%r12,4),%rdx
lea    -0x1(%r8),%r9d
cmp    $0x7,%r9d
jb     12c8 <Lvl_CarmackExpand+0x1c8>
lea    (%r12,%r9,1),%rax
mov    -0x8(%rsp),%rsi
lea    (%rsi,%rax,4),%rax
cmp    %rax,%rcx
jae    13a7 <Lvl_CarmackExpand+0x2a7>
lea    (%rcx,%r9,4),%rax
add    $0x4,%rax
cmp    %rax,%rdx
jae    13a7 <Lvl_CarmackExpand+0x2a7>
mov    %r8d,%eax
lea    -0x1(%rax),%r9d
mov    %eax,%ebx
and    $0x7,%ebx
je     12f5 <Lvl_CarmackExpand+0x1f5>
xor    %ebp,%ebp
nopl   0x0(%rax,%rax,1)
mov    (%rdx),%esi
add    $0x4,%rdx
mov    %esi,(%rcx)
add    $0x4,%rcx
add    $0x1,%ebp
cmp    %ebp,%ebx
jne    12e0 <Lvl_CarmackExpand+0x1e0>
sub    %ebp,%eax
cmp    $0x7,%r9d
jb     15b0 <Lvl_CarmackExpand+0x4b0>
mov    %eax,%eax
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%rdx,%rbp,4),%esi
mov    %esi,(%rcx)
mov    0x4(%rdx,%rbp,4),%esi
mov    %esi,0x4(%rcx)
mov    0x8(%rdx,%rbp,4),%esi
mov    %esi,0x8(%rcx)
mov    0xc(%rdx,%rbp,4),%esi
mov    %esi,0xc(%rcx)
mov    0x10(%rdx,%rbp,4),%esi
mov    %esi,0x10(%rcx)
mov    0x14(%rdx,%rbp,4),%esi
mov    %esi,0x14(%rcx)
mov    0x18(%rdx,%rbp,4),%esi
mov    %esi,0x18(%rcx)
mov    0x1c(%rdx,%rbp,4),%esi
mov    %esi,0x1c(%rcx)
add    $0x20,%rcx
add    $0x8,%rbp
cmp    %ebp,%eax
jne    1310 <Lvl_CarmackExpand+0x210>
jmp    15b0 <Lvl_CarmackExpand+0x4b0>
nopw   0x0(%rax,%rax,1)
or     0x8(%rdi),%edx
add    $0xc,%rdi
mov    %edx,(%rcx)
add    $0x4,%rcx
add    $0xffffffff,%r13d
mov    %rdi,%rax
jmp    116a <Lvl_CarmackExpand+0x6a>
add    $0x1,%r15
mov    %r15,%rsi
and    %r14,%rsi
lea    -0x8(%rsi),%rax
mov    %rax,%rbp
shr    $0x3,%rbp
add    $0x1,%rbp
mov    %ebp,%r8d
and    $0x3,%r8d
cmp    $0x18,%rax
jae    13d8 <Lvl_CarmackExpand+0x2d8>
xor    %r9d,%r9d
jmp    1468 <Lvl_CarmackExpand+0x368>
add    $0x1,%r9
mov    %r9,%r15
and    %r14,%r15
lea    -0x8(%r15),%rax
mov    %rax,%rbp
shr    $0x3,%rbp
add    $0x1,%rbp
mov    %ebp,%r10d
and    $0x3,%r10d
cmp    $0x18,%rax
jae    14df <Lvl_CarmackExpand+0x3df>
xor    %eax,%eax
jmp    1558 <Lvl_CarmackExpand+0x458>
movabs $0x3ffffffffffffffc,%rax
ff ff 3f
and    %rax,%rbp
lea    0x70(%rcx),%r14
mov    %r14,%r11
sub    %rbx,%r11
xor    %r9d,%r9d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups -0x70(%r11,%r9,4),%xmm0
movups -0x60(%r11,%r9,4),%xmm1
movups %xmm0,-0x70(%r14,%r9,4)
movups %xmm1,-0x60(%r14,%r9,4)
movups -0x50(%r11,%r9,4),%xmm0
movups -0x40(%r11,%r9,4),%xmm1
movups %xmm0,-0x50(%r14,%r9,4)
movups %xmm1,-0x40(%r14,%r9,4)
movups -0x30(%r11,%r9,4),%xmm0
movups -0x20(%r11,%r9,4),%xmm1
movups %xmm0,-0x30(%r14,%r9,4)
movups %xmm1,-0x20(%r14,%r9,4)
movups -0x10(%r11,%r9,4),%xmm0
movups (%r11,%r9,4),%xmm1
movups %xmm0,-0x10(%r14,%r9,4)
movups %xmm1,(%r14,%r9,4)
add    $0x20,%r9
add    $0xfffffffffffffffc,%rbp
jne    1400 <Lvl_CarmackExpand+0x300>
test   %r8,%r8
je     14ac <Lvl_CarmackExpand+0x3ac>
lea    (%rcx,%r9,4),%rbp
add    $0x10,%rbp
sub    %r12,%r9
lea    (%rcx,%r9,4),%rbx
add    $0x10,%rbx
shl    $0x5,%r8
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
movups -0x10(%rbx,%rax,1),%xmm0
movups (%rbx,%rax,1),%xmm1
movups %xmm0,-0x10(%rbp,%rax,1)
movups %xmm1,0x0(%rbp,%rax,1)
add    $0x20,%rax
cmp    %rax,%r8
jne    1490 <Lvl_CarmackExpand+0x390>
lea    (%rcx,%rsi,4),%rcx
cmp    %rsi,%r15
mov    -0x10(%rsp),%r11
movabs $0x1fffffff8,%r14
jne    15bf <Lvl_CarmackExpand+0x4bf>
nopl   0x0(%rax,%rax,1)
add    $0xc,%rdi
sub    %r10d,%r13d
mov    %rdi,%rax
jmp    116a <Lvl_CarmackExpand+0x6a>
movabs $0x3ffffffffffffffc,%rax
ff ff 3f
and    %rax,%rbp
mov    -0x20(%rsp),%rax
lea    (%rax,%r12,4),%rbx
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movups -0x70(%rbx,%rax,4),%xmm0
movups -0x60(%rbx,%rax,4),%xmm1
movups %xmm0,(%rcx,%rax,4)
movups %xmm1,0x10(%rcx,%rax,4)
movups -0x50(%rbx,%rax,4),%xmm0
movups -0x40(%rbx,%rax,4),%xmm1
movups %xmm0,0x20(%rcx,%rax,4)
movups %xmm1,0x30(%rcx,%rax,4)
movups -0x30(%rbx,%rax,4),%xmm0
movups -0x20(%rbx,%rax,4),%xmm1
movups %xmm0,0x40(%rcx,%rax,4)
movups %xmm1,0x50(%rcx,%rax,4)
movups -0x10(%rbx,%rax,4),%xmm0
movups (%rbx,%rax,4),%xmm1
movups %xmm0,0x60(%rcx,%rax,4)
movups %xmm1,0x70(%rcx,%rax,4)
add    $0x20,%rax
add    $0xfffffffffffffffc,%rbp
jne    1500 <Lvl_CarmackExpand+0x400>
test   %r10,%r10
je     159c <Lvl_CarmackExpand+0x49c>
add    %rax,%r12
mov    -0x18(%rsp),%rsi
lea    (%rsi,%r12,4),%rbp
lea    (%rcx,%rax,4),%rax
add    $0x10,%rax
shl    $0x5,%r10
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
movups -0x10(%rbp,%rsi,1),%xmm0
movups 0x0(%rbp,%rsi,1),%xmm1
movups %xmm0,-0x10(%rax,%rsi,1)
movups %xmm1,(%rax,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%r10
jne    1580 <Lvl_CarmackExpand+0x480>
lea    (%rcx,%r15,4),%rcx
cmp    %r15,%r9
jne    15cd <Lvl_CarmackExpand+0x4cd>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x10,%rdi
sub    %r8d,%r13d
mov    %rdi,%rax
jmp    116a <Lvl_CarmackExpand+0x6a>
mov    %r10d,%eax
sub    %esi,%eax
lea    (%rdx,%rsi,4),%rdx
jmp    11e7 <Lvl_CarmackExpand+0xe7>
mov    %r8d,%eax
sub    %r15d,%eax
lea    (%rdx,%r15,4),%rdx
jmp    12cb <Lvl_CarmackExpand+0x1cb>

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

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