int PDJHUFF_BalanceTree_r(short *nodes, short *nlen, int root, int h, int ml) {
  int h0, h1, h2, h3;
  int l0, l1, l2;
  if (root < 0)
    return (0);
  h1 = PDJHUFF_BalanceTree_r(nodes, nlen, nodes[root * 2 + 0], h + 1, ml);
  h2 = PDJHUFF_BalanceTree_r(nodes, nlen, nodes[root * 2 + 1], h + 1, ml);
  h0 = ((h1 > h2) ? h1 : h2) + 1;
  nlen[root] = h0;
  if ((h + h0) <= ml)
    return (h0);
  if ((h1 + 1) < h2) {
    l0 = nodes[root * 2 + 1];
    l1 = nodes[l0 * 2 + 1];
    nodes[l0 * 2 + 1] = nodes[l0 * 2 + 0];
    nodes[l0 * 2 + 0] = nodes[root * 2 + 0];
    nodes[root * 2 + 0] = l0;
    nodes[root * 2 + 1] = l1;
  } else if ((h2 + 1) < h1) {
    l0 = nodes[root * 2 + 0];
    l1 = nodes[l0 * 2 + 0];
    nodes[l0 * 2 + 0] = nodes[l0 * 2 + 1];
    nodes[l0 * 2 + 1] = nodes[root * 2 + 1];
    nodes[root * 2 + 0] = l1;
    nodes[root * 2 + 1] = l0;
  } else {
    return (h0);
  }
  l1 = nodes[l0 * 2 + 0];
  l2 = nodes[l0 * 2 + 1];
  h1 = (l1 < 0) ? 0 : nlen[l1];
  h2 = (l2 < 0) ? 0 : nlen[l2];
  h3 = ((h1 > h2) ? h1 : h2) + 1;
  nlen[l0] = h3;
  l1 = nodes[root * 2 + 0];
  l2 = nodes[root * 2 + 1];
  h1 = (l1 < 0) ? 0 : nlen[l1];
  h2 = (l2 < 0) ? 0 : nlen[l2];
  h0 = ((h1 > h2) ? h1 : h2) + 1;
  nlen[root] = h0;
  return (h0);
}


x86 assembly (clang, -O0):
<PDJHUFF_BalanceTree_r>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jge    1140 <PDJHUFF_BalanceTree_r+0x30>
movl   $0x0,-0x4(%rbp)
jmp    1500 <PDJHUFF_BalanceTree_r+0x3f0>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%edx
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
mov    -0x24(%rbp),%r8d
call   1030 <PDJHUFF_BalanceTree_r@plt>
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%edx
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
mov    -0x24(%rbp),%r8d
call   1030 <PDJHUFF_BalanceTree_r@plt>
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jle    11b3 <PDJHUFF_BalanceTree_r+0xa3>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    11b9 <PDJHUFF_BalanceTree_r+0xa9>
mov    -0x30(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x20(%rbp),%eax
add    -0x28(%rbp),%eax
cmp    -0x24(%rbp),%eax
jg     11ee <PDJHUFF_BalanceTree_r+0xde>
mov    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1500 <PDJHUFF_BalanceTree_r+0x3f0>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
cmp    -0x30(%rbp),%eax
jge    12b4 <PDJHUFF_BalanceTree_r+0x1a4>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x38(%rbp),%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x3c(%rbp),%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
jmp    138a <PDJHUFF_BalanceTree_r+0x27a>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
cmp    -0x2c(%rbp),%eax
jge    137a <PDJHUFF_BalanceTree_r+0x26a>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x3c(%rbp),%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x38(%rbp),%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1385 <PDJHUFF_BalanceTree_r+0x275>
mov    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1500 <PDJHUFF_BalanceTree_r+0x3f0>
jmp    138a <PDJHUFF_BalanceTree_r+0x27a>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jge    13cc <PDJHUFF_BalanceTree_r+0x2bc>
xor    %eax,%eax
mov    %eax,-0x48(%rbp)
jmp    13db <PDJHUFF_BalanceTree_r+0x2cb>
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0x0,-0x40(%rbp)
jge    13f5 <PDJHUFF_BalanceTree_r+0x2e5>
xor    %eax,%eax
mov    %eax,-0x4c(%rbp)
jmp    1404 <PDJHUFF_BalanceTree_r+0x2f4>
mov    -0x18(%rbp),%rax
movslq -0x40(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jle    1421 <PDJHUFF_BalanceTree_r+0x311>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    1427 <PDJHUFF_BalanceTree_r+0x317>
mov    -0x30(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jge    1484 <PDJHUFF_BalanceTree_r+0x374>
xor    %eax,%eax
mov    %eax,-0x54(%rbp)
jmp    1493 <PDJHUFF_BalanceTree_r+0x383>
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0x0,-0x40(%rbp)
jge    14ad <PDJHUFF_BalanceTree_r+0x39d>
xor    %eax,%eax
mov    %eax,-0x58(%rbp)
jmp    14bc <PDJHUFF_BalanceTree_r+0x3ac>
mov    -0x18(%rbp),%rax
movslq -0x40(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x58(%rbp)
mov    -0x58(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jle    14d9 <PDJHUFF_BalanceTree_r+0x3c9>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
jmp    14df <PDJHUFF_BalanceTree_r+0x3cf>
mov    -0x30(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<PDJHUFF_BalanceTree_r>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
test   %edx,%edx
js     11da <PDJHUFF_BalanceTree_r+0xca>
mov    %r8d,%ebp
mov    %edx,%ebx
mov    %rsi,%r15
mov    %rdi,%r12
lea    (%rbx,%rbx,1),%eax
cltq
mov    %rax,0x8(%rsp)
movswl (%rdi,%rax,2),%edx
lea    0x1(%rcx),%r14d
mov    %rcx,0x10(%rsp)
mov    %r14d,%ecx
call   1030 <PDJHUFF_BalanceTree_r@plt>
mov    %eax,%r13d
lea    (%rbx,%rbx,1),%eax
add    $0x1,%eax
cltq
mov    %rax,(%rsp)
movswl (%r12,%rax,2),%edx
mov    %r12,%rdi
mov    %r15,%rsi
mov    %r14d,%ecx
mov    %ebp,%r8d
call   1030 <PDJHUFF_BalanceTree_r@plt>
mov    %eax,%ecx
cmp    %eax,%r13d
mov    %eax,%esi
cmovg  %r13d,%esi
lea    0x1(%rsi),%eax
mov    %ebx,%edx
mov    %ax,(%r15,%rdx,2)
mov    0x10(%rsp),%rdi
add    %edi,%esi
add    $0x1,%esi
cmp    %ebp,%esi
jle    128a <PDJHUFF_BalanceTree_r+0x17a>
mov    0x8(%rsp),%rsi
lea    (%r12,%rsi,2),%r14
mov    (%rsp),%rsi
lea    (%r12,%rsi,2),%r11
lea    0x1(%r13),%edi
cmp    %ecx,%edi
jge    11e1 <PDJHUFF_BalanceTree_r+0xd1>
movswq (%r11),%rbp
mov    %rbp,%rax
add    %rbp,%rax
lea    0x1(%rbp,%rbp,1),%r9
lea    0x2(%r12,%rax,2),%r10
movzwl 0x2(%r12,%rax,2),%ecx
mov    %r14,%rdi
mov    %rax,%rbx
mov    %ebp,%r8d
jmp    120c <PDJHUFF_BalanceTree_r+0xfc>
xor    %eax,%eax
jmp    128a <PDJHUFF_BalanceTree_r+0x17a>
add    $0x1,%ecx
cmp    %r13d,%ecx
jge    128a <PDJHUFF_BalanceTree_r+0x17a>
movswq (%r14),%rcx
lea    (%rcx,%rcx,1),%rbx
lea    (%r12,%rcx,4),%r10
movzwl (%r12,%rcx,4),%ebp
lea    0x1(%rbx),%eax
cltq
mov    %r11,%rdi
mov    %rax,%r9
mov    %ecx,%r8d
movzwl (%r12,%rax,2),%esi
mov    %si,(%r10)
movzwl (%rdi),%esi
mov    %si,(%r12,%rax,2)
mov    %bp,(%r14)
mov    %cx,(%r11)
movzwl (%r12,%rbx,2),%ebp
movzwl (%r12,%r9,2),%edi
xor    %eax,%eax
mov    $0x0,%ecx
test   %bp,%bp
js     1240 <PDJHUFF_BalanceTree_r+0x130>
movswl (%r15,%rbp,2),%ecx
test   %di,%di
js     124a <PDJHUFF_BalanceTree_r+0x13a>
movswl (%r15,%rdi,2),%eax
cmp    %eax,%ecx
cmovg  %ecx,%eax
add    $0x1,%eax
movslq %r8d,%rcx
mov    %ax,(%r15,%rcx,2)
movzwl (%r14),%edi
movzwl (%r11),%esi
xor    %eax,%eax
mov    $0x0,%ecx
test   %di,%di
js     1273 <PDJHUFF_BalanceTree_r+0x163>
movswl (%r15,%rdi,2),%ecx
test   %si,%si
js     127d <PDJHUFF_BalanceTree_r+0x16d>
movswl (%r15,%rsi,2),%eax
cmp    %eax,%ecx
cmovg  %ecx,%eax
add    $0x1,%eax
mov    %ax,(%r15,%rdx,2)
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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