int main() {
  int i = 2;
  int counter = 0;
  while (i < 100) {
    counter++;
    if (counter == 2) {
      continue;
    }
    int i2 = i;
    i = i + i2;
  }
  if (i != 128)
    return 1;
  if (counter != 7)
    return 2;
  int j = 0;
  while (1)
    if (++j == 15)
      break;
  if (j != 15)
    return 3;
  int k = 0;
  while (k++ < 10)
    ;
  if (k != 11)
    return 4;
  int zero = 0;
  while (zero != 0)
    ;
  while (zero != 0) {
  }
  int index = 0;
  int odd_numbers[20];
  while (index < 20) {
    odd_numbers[index] = 2 * index + 1;
    index++;
  }
  int index2 = 0;
  int sum = 0;
  while (index2 < 20) {
    sum += odd_numbers[index2];
    index2++;
    if (sum != index2 * index2)
      return 5;
  }
  if (index2 != 20)
    return 6;
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
movl   $0x0,-0x4(%rbp)
movl   $0x2,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x64,-0x8(%rbp)
jge    114f <main+0x4f>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
cmpl   $0x2,-0xc(%rbp)
jne    113b <main+0x3b>
jmp    1119 <main+0x19>
mov    -0x8(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x8(%rbp)
jmp    1119 <main+0x19>
cmpl   $0x80,-0x8(%rbp)
je     1168 <main+0x68>
movl   $0x1,-0x4(%rbp)
jmp    12b6 <main+0x1b6>
cmpl   $0x7,-0xc(%rbp)
je     117e <main+0x7e>
movl   $0x2,-0x4(%rbp)
jmp    12b6 <main+0x1b6>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
cmp    $0xf,%eax
jne    119c <main+0x9c>
jmp    11a1 <main+0xa1>
jmp    1185 <main+0x85>
cmpl   $0xf,-0x14(%rbp)
je     11b7 <main+0xb7>
movl   $0x3,-0x4(%rbp)
jmp    12b6 <main+0x1b6>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x18(%rbp)
cmp    $0xa,%eax
jge    11d7 <main+0xd7>
jmp    11be <main+0xbe>
cmpl   $0xb,-0x18(%rbp)
je     11ed <main+0xed>
movl   $0x4,-0x4(%rbp)
jmp    12b6 <main+0x1b6>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1203 <main+0x103>
jmp    11f4 <main+0xf4>
jmp    1208 <main+0x108>
cmpl   $0x0,-0x1c(%rbp)
je     1217 <main+0x117>
jmp    1208 <main+0x108>
movl   $0x0,-0x20(%rbp)
cmpl   $0x14,-0x20(%rbp)
jge    1247 <main+0x147>
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq -0x20(%rbp),%rax
mov    %ecx,-0x70(%rbp,%rax,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    121e <main+0x11e>
movl   $0x0,-0x74(%rbp)
movl   $0x0,-0x78(%rbp)
cmpl   $0x14,-0x74(%rbp)
jge    1299 <main+0x199>
movslq -0x74(%rbp),%rax
mov    -0x70(%rbp,%rax,4),%eax
add    -0x78(%rbp),%eax
mov    %eax,-0x78(%rbp)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
mov    -0x78(%rbp),%eax
mov    -0x74(%rbp),%ecx
imul   -0x74(%rbp),%ecx
cmp    %ecx,%eax
je     1294 <main+0x194>
movl   $0x5,-0x4(%rbp)
jmp    12b6 <main+0x1b6>
jmp    1255 <main+0x155>
cmpl   $0x14,-0x74(%rbp)
je     12af <main+0x1af>
movl   $0x6,-0x4(%rbp)
jmp    12b6 <main+0x1b6>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
mov    $0x2,%eax
mov    $0x7,%edx
nopw   0x0(%rax,%rax,1)
cmp    $0x6,%edx
setne  %cl
shl    %cl,%eax
add    $0xffffffff,%edx
cmp    $0x64,%eax
jl     1110 <main+0x10>
xor    %ecx,%ecx
test   %edx,%edx
setne  %cl
add    %ecx,%ecx
cmp    $0x80,%eax
mov    $0x1,%eax
cmove  %ecx,%eax
ret

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

LLVM IR (-O2):
define i32 @main() {
br label %1
1: ; preds = %0, %1
%2 = phi i32 [ 2, %0 ], [ %7, %1 ]
%3 = phi i32 [ 0, %0 ], [ %4, %1 ]
%4 = add nuw nsw i32 %3, 1
%5 = icmp ne i32 %4, 2
%6 = zext i1 %5 to i32
%7 = shl nsw i32 %2, %6
%8 = icmp slt i32 %7, 100
br i1 %8, label %1, label %9
9: ; preds = %1
%10 = icmp eq i32 %7, 128
%11 = icmp eq i32 %4, 7
%12 = select i1 %11, i32 0, i32 2
%13 = select i1 %10, i32 %12, i32 1
ret i32 %13
}