int rob(int *nums, int numsSize) {
  if (!numsSize)
    return (0);
  if (numsSize == 1)
    return (nums[0]);
  if (numsSize == 2)
    return (nums[0] > nums[1] ? nums[0] : nums[1]);
  int money[numsSize];
  int i, first, last, t;
  int r1, r2;
  first = last = 0;
  for (i = 0; i < numsSize; i++) {
    if (i == 0) {
      money[i] = nums[0];
      first = 1;
      continue;
    }
    if (i == 1) {
      if (nums[1] > nums[0]) {
        money[i] = nums[1];
        first = 0;
      } else {
        money[i] = money[i - 1];
      }
      continue;
    }
    t = nums[i] + money[i - 2];
    if (t > money[i - 1]) {
      money[i] = t;
      if (i == (numsSize - 1))
        last = 1;
      if ((i - 2) == 0)
        first = 1;
    } else {
      money[i] = money[i - 1];
      if (i == (numsSize - 1))
        last = 0;
    }
  }
  if (!first || !last)
    return (money[numsSize - 1]);
  first = money[numsSize - 1] - nums[0];
  last = money[numsSize - 1] - nums[numsSize - 1];
  for (i = 1; i < numsSize; i++) {
    if (i == 1) {
      money[i] = nums[i];
      continue;
    }
    if (i == 2) {
      money[i] = nums[2] > nums[1] ? nums[2] : nums[1];
      continue;
    }
    t = nums[i] + money[i - 2];
    money[i] = t > money[i - 1] ? t : money[i - 1];
  }
  r1 = money[numsSize - 1];
  for (i = 0; i < (numsSize - 1); i++) {
    if (i == 0) {
      money[i] = nums[i];
      continue;
    }
    if (i == 1) {
      money[i] = nums[1] > nums[0] ? nums[1] : nums[0];
      continue;
    }
    t = nums[i] + money[i - 2];
    money[i] = t > money[i - 1] ? t : money[i - 1];
  }
  r2 = money[numsSize - 2];
  if (last > first)
    first = last;
  if (r1 > first)
    first = r1;
  if (r2 > first)
    first = r2;
  return (first);
}


x86 assembly (clang, -O0):
<rob>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1125 <rob+0x25>
movl   $0x0,-0x4(%rbp)
jmp    15ba <rob+0x4ba>
cmpl   $0x1,-0x14(%rbp)
jne    113d <rob+0x3d>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    15ba <rob+0x4ba>
cmpl   $0x2,-0x14(%rbp)
jne    117d <rob+0x7d>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x4(%rcx),%eax
jle    1168 <rob+0x68>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x48(%rbp)
jmp    1172 <rob+0x72>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    15ba <rob+0x4ba>
mov    -0x14(%rbp),%eax
mov    %rsp,%rcx
mov    %rcx,-0x20(%rbp)
lea    0xf(,%rax,4),%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0x50(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12fe <rob+0x1fe>
cmpl   $0x0,-0x2c(%rbp)
jne    11ec <rob+0xec>
mov    -0x50(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    (%rcx),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
movl   $0x1,-0x30(%rbp)
jmp    12f0 <rob+0x1f0>
cmpl   $0x1,-0x2c(%rbp)
jne    1243 <rob+0x143>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jle    1227 <rob+0x127>
mov    -0x50(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    0x4(%rcx),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
movl   $0x0,-0x30(%rbp)
jmp    123e <rob+0x13e>
mov    -0x50(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    12f0 <rob+0x1f0>
mov    -0x50(%rbp),%rcx
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rdx
mov    (%rax,%rdx,4),%eax
mov    -0x2c(%rbp),%edx
sub    $0x2,%edx
movslq %edx,%rdx
add    (%rcx,%rdx,4),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x2c(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
cmp    (%rcx,%rdx,4),%eax
jle    12b7 <rob+0x1b7>
mov    -0x50(%rbp),%rax
mov    -0x38(%rbp),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    129c <rob+0x19c>
movl   $0x1,-0x34(%rbp)
mov    -0x2c(%rbp),%eax
sub    $0x2,%eax
cmp    $0x0,%eax
jne    12b2 <rob+0x1b2>
movl   $0x1,-0x30(%rbp)
jmp    12eb <rob+0x1eb>
mov    -0x50(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    12e6 <rob+0x1e6>
movl   $0x0,-0x34(%rbp)
jmp    12eb <rob+0x1eb>
jmp    12f0 <rob+0x1f0>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11b9 <rob+0xb9>
cmpl   $0x0,-0x30(%rbp)
je     1312 <rob+0x212>
cmpl   $0x0,-0x34(%rbp)
jne    1331 <rob+0x231>
mov    -0x50(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x4(%rbp)
movl   $0x1,-0x44(%rbp)
jmp    15b3 <rob+0x4b3>
mov    -0x50(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x10(%rbp),%rdx
sub    (%rdx),%ecx
mov    %ecx,-0x30(%rbp)
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
mov    -0x14(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
sub    (%rcx,%rdx,4),%eax
mov    %eax,-0x34(%rbp)
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1458 <rob+0x358>
cmpl   $0x1,-0x2c(%rbp)
jne    13a1 <rob+0x2a1>
mov    -0x50(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
mov    (%rcx,%rdx,4),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    144a <rob+0x34a>
cmpl   $0x2,-0x2c(%rbp)
jne    13eb <rob+0x2eb>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    0x4(%rcx),%eax
jle    13ce <rob+0x2ce>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%eax
mov    %eax,-0x54(%rbp)
jmp    13d8 <rob+0x2d8>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x54(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x54(%rbp),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    144a <rob+0x34a>
mov    -0x50(%rbp),%rcx
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rdx
mov    (%rax,%rdx,4),%eax
mov    -0x2c(%rbp),%edx
sub    $0x2,%edx
movslq %edx,%rdx
add    (%rcx,%rdx,4),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x2c(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
cmp    (%rcx,%rdx,4),%eax
jle    1429 <rob+0x329>
mov    -0x38(%rbp),%eax
mov    %eax,-0x58(%rbp)
jmp    143c <rob+0x33c>
mov    -0x50(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x58(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x58(%rbp),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1370 <rob+0x270>
mov    -0x50(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    155d <rob+0x45d>
cmpl   $0x0,-0x2c(%rbp)
jne    14a8 <rob+0x3a8>
mov    -0x50(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
mov    (%rcx,%rdx,4),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    154f <rob+0x44f>
cmpl   $0x1,-0x2c(%rbp)
jne    14f0 <rob+0x3f0>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jle    14d4 <rob+0x3d4>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x5c(%rbp)
jmp    14dd <rob+0x3dd>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x5c(%rbp),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    154f <rob+0x44f>
mov    -0x50(%rbp),%rcx
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rdx
mov    (%rax,%rdx,4),%eax
mov    -0x2c(%rbp),%edx
sub    $0x2,%edx
movslq %edx,%rdx
add    (%rcx,%rdx,4),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x2c(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
cmp    (%rcx,%rdx,4),%eax
jle    152e <rob+0x42e>
mov    -0x38(%rbp),%eax
mov    %eax,-0x60(%rbp)
jmp    1541 <rob+0x441>
mov    -0x50(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x60(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x60(%rbp),%edx
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1472 <rob+0x372>
mov    -0x50(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x40(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x30(%rbp),%eax
jle    1582 <rob+0x482>
mov    -0x34(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jle    1594 <rob+0x494>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x30(%rbp),%eax
jle    15a6 <rob+0x4a6>
mov    -0x40(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x4(%rbp)
movl   $0x1,-0x44(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rsp
mov    -0x4(%rbp),%eax
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<rob>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %esi,%eax
test   %esi,%esi
je     12cd <rob+0x1cd>
cmp    $0x2,%eax
je     1126 <rob+0x26>
cmp    $0x1,%eax
jne    1135 <rob+0x35>
mov    (%rdi),%eax
jmp    12cd <rob+0x1cd>
mov    (%rdi),%ecx
mov    0x4(%rdi),%eax
cmp    %eax,%ecx
cmovg  %ecx,%eax
jmp    12cd <rob+0x1cd>
mov    %rsp,%r8
mov    %eax,%r15d
mov    %rsp,%rdx
lea    0xf(,%r15,4),%rcx
and    $0xfffffffffffffff0,%rcx
sub    %rcx,%rdx
mov    %rdx,%rsp
test   %eax,%eax
jle    1250 <rob+0x150>
lea    -0x1(%rax),%r9d
xor    %r10d,%r10d
mov    $0x1,%r11d
xor    %ebx,%ebx
xor    %r14d,%r14d
xor    %r12d,%r12d
jmp    1183 <rob+0x83>
nop
mov    (%rdi),%ecx
mov    %ecx,(%rdx)
mov    $0x1,%r12d
add    $0x1,%rbx
cmp    %rbx,%r15
je     11d2 <rob+0xd2>
cmp    $0x1,%ebx
je     11b0 <rob+0xb0>
test   %ebx,%ebx
je     1170 <rob+0x70>
mov    -0x8(%rdx,%rbx,4),%esi
mov    -0x4(%rdx,%rbx,4),%ecx
add    (%rdi,%rbx,4),%esi
cmp    %ecx,%esi
jle    11bf <rob+0xbf>
cmp    %rbx,%r9
cmove  %r11d,%r14d
mov    %esi,(%rdx,%rbx,4)
cmp    $0x2,%rbx
cmove  %r11d,%r12d
jmp    117a <rob+0x7a>
nop
mov    0x4(%rdi),%ecx
cmp    (%rdi),%ecx
jle    11cb <rob+0xcb>
mov    %ecx,0x4(%rdx)
xor    %r12d,%r12d
jmp    117a <rob+0x7a>
mov    %ecx,(%rdx,%rbx,4)
cmp    %rbx,%r9
cmove  %r10d,%r14d
jmp    117a <rob+0x7a>
mov    (%rdx),%ecx
mov    %ecx,0x4(%rdx)
jmp    117a <rob+0x7a>
test   %r12d,%r12d
je     1250 <rob+0x150>
test   %r14d,%r14d
je     1250 <rob+0x150>
movslq %eax,%r9
mov    -0x4(%rdx,%r9,4),%eax
mov    (%rdi),%r12d
mov    -0x4(%rdi,%r9,4),%r10d
mov    %eax,%r14d
cmp    $0x2,%r15d
jl     12af <rob+0x1af>
lea    -0x1(%r9),%r11
mov    $0x1,%ebx
jmp    122c <rob+0x12c>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    -0x8(%rdx,%rbx,4),%ecx
mov    -0x4(%rdx,%rbx,4),%esi
add    (%rdi,%rbx,4),%ecx
cmp    %esi,%ecx
cmovle %esi,%ecx
mov    %ecx,(%rdx,%rbx,4)
add    $0x1,%rbx
cmp    %rbx,%r15
je     1258 <rob+0x158>
cmp    $0x2,%ebx
je     1240 <rob+0x140>
cmp    $0x1,%ebx
jne    1210 <rob+0x110>
mov    0x4(%rdi),%esi
mov    %esi,0x4(%rdx)
jmp    1223 <rob+0x123>
xchg   %ax,%ax
mov    0x4(%rdi),%esi
mov    0x8(%rdi),%ecx
cmp    %esi,%ecx
cmovg  %ecx,%esi
mov    %esi,0x8(%rdx)
jmp    1223 <rob+0x123>
cltq
mov    -0x4(%rdx,%rax,4),%eax
jmp    12ca <rob+0x1ca>
mov    (%rdx,%r11,4),%r14d
cmp    $0x2,%r15d
jl     12af <rob+0x1af>
mov    %r11d,%r11d
xor    %ebx,%ebx
jmp    128c <rob+0x18c>
nopl   0x0(%rax)
mov    -0x8(%rdx,%rbx,4),%ecx
mov    -0x4(%rdx,%rbx,4),%esi
add    (%rdi,%rbx,4),%ecx
cmp    %esi,%ecx
cmovle %esi,%ecx
mov    %ecx,(%rdx,%rbx,4)
add    $0x1,%rbx
cmp    %rbx,%r11
je     12af <rob+0x1af>
cmp    $0x1,%ebx
je     12a0 <rob+0x1a0>
test   %ebx,%ebx
jne    1270 <rob+0x170>
mov    %r12d,(%rdx)
jmp    1283 <rob+0x183>
nopw   0x0(%rax,%rax,1)
mov    0x4(%rdi),%ecx
cmp    %r12d,%ecx
cmovle %r12d,%ecx
mov    %ecx,0x4(%rdx)
jmp    1283 <rob+0x183>
cmp    %r10d,%r12d
cmovg  %r10d,%r12d
sub    %r12d,%eax
cmp    %eax,%r14d
cmovg  %r14d,%eax
mov    -0x8(%rdx,%r9,4),%ecx
cmp    %eax,%ecx
cmovg  %ecx,%eax
mov    %r8,%rsp
lea    -0x20(%rbp),%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

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