int main() {
  int i;
  long long red;
  red = -10000;
#pragma acc parallel
#pragma acc loop reduction(+ : red)
  for (i = 0; i < 20000; i++) {
    red += 1;
  }
  if (red != 10000) {
    return 1;
  }
  red = 2;
#pragma acc parallel
#pragma acc loop reduction(* : red)
  for (i = 0; i < 128; i++) {
    if (i % 8 == 0) {
      red *= 2;
    } else {
      red *= 1;
    }
  }
  if (red != 131072) {
    return 2;
  }
  red = 123;
#pragma acc parallel
#pragma acc loop reduction(max : red)
  for (i = 0; i < 1000000; i++) {
    if (red < i) {
      red = (long long)i;
    }
  }
  if (red != 999999) {
    return 3;
  }
  red = 33333;
#pragma acc parallel
#pragma acc loop reduction(min : red)
  for (i = 0; i < 1000000; i++) {
    if (red > (long long)i - 2) {
      red = (long long)i - 2;
    }
  }
  if (red != -2) {
    return 4;
  }
  red = 123456789;
#pragma acc parallel
#pragma acc loop reduction(& : red)
  for (i = 0; i < 1000000; i++) {
    red &= (((long long)i << 5) + 21);
  }
  if (red != 21) {
    return 5;
  }
  red = 1065536;
#pragma acc parallel
#pragma acc loop reduction(| : red)
  for (i = 0; i < 1000000; i++) {
    red |= (long long)i;
  }
  if (red != 2097151) {
    return 6;
  }
  red = 123456;
#pragma acc parallel
#pragma acc loop reduction(^ : red)
  for (i = 0; i < 1000000; i++) {
    red ^= (long long)i + 1;
  }
  if (red != 958464) {
    return 7;
  }
  red = 0;
#pragma acc parallel
#pragma acc loop reduction(&& : red)
  for (i = 0; i < 1000000; i++) {
    red = red && 1;
  }
  if (red) {
    return 8;
  }
  red = 1;
#pragma acc parallel
#pragma acc loop reduction(|| : red)
  for (i = 0; i < 1000000; i++) {
    red = red || 0;
  }
  if (!red) {
    return 9;
  }
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
movl   $0x0,-0x4(%rbp)
movq   $0xffffffffffffd8f0,-0x10(%rbp)
ff
movl   $0x0,-0x8(%rbp)
cmpl   $0x4e20,-0x8(%rbp)
jge    1141 <main+0x41>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    111a <main+0x1a>
cmpq   $0x2710,-0x10(%rbp)
je     115b <main+0x5b>
movl   $0x1,-0x4(%rbp)
jmp    1470 <main+0x370>
movq   $0x2,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0x80,-0x8(%rbp)
jge    11bb <main+0xbb>
mov    -0x8(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    119c <main+0x9c>
mov    -0x10(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11a8 <main+0xa8>
mov    -0x10(%rbp),%rax
shl    $0x0,%rax
mov    %rax,-0x10(%rbp)
jmp    11ad <main+0xad>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    116a <main+0x6a>
cmpq   $0x20000,-0x10(%rbp)
je     11d5 <main+0xd5>
movl   $0x2,-0x4(%rbp)
jmp    1470 <main+0x370>
movq   $0x7b,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    121d <main+0x11d>
mov    -0x10(%rbp),%rax
movslq -0x8(%rbp),%rcx
cmp    %rcx,%rax
jge    120a <main+0x10a>
movslq -0x8(%rbp),%rax
mov    %rax,-0x10(%rbp)
jmp    120f <main+0x10f>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    11e4 <main+0xe4>
cmpq   $0xf423f,-0x10(%rbp)
je     1237 <main+0x137>
movl   $0x3,-0x4(%rbp)
jmp    1470 <main+0x370>
movq   $0x8235,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    1287 <main+0x187>
mov    -0x10(%rbp),%rax
movslq -0x8(%rbp),%rcx
sub    $0x2,%rcx
cmp    %rcx,%rax
jle    1274 <main+0x174>
movslq -0x8(%rbp),%rax
sub    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    1279 <main+0x179>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1246 <main+0x146>
cmpq   $0xfffffffffffffffe,-0x10(%rbp)
je     129e <main+0x19e>
movl   $0x4,-0x4(%rbp)
jmp    1470 <main+0x370>
movq   $0x75bcd15,-0x10(%rbp)
07
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    12dc <main+0x1dc>
movslq -0x8(%rbp),%rax
shl    $0x5,%rax
add    $0x15,%rax
and    -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    12ad <main+0x1ad>
cmpq   $0x15,-0x10(%rbp)
je     12f3 <main+0x1f3>
movl   $0x5,-0x4(%rbp)
jmp    1470 <main+0x370>
movq   $0x104240,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    1329 <main+0x229>
movslq -0x8(%rbp),%rax
or     -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1302 <main+0x202>
cmpq   $0x1fffff,-0x10(%rbp)
je     1343 <main+0x243>
movl   $0x6,-0x4(%rbp)
jmp    1470 <main+0x370>
movq   $0x1e240,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    137d <main+0x27d>
movslq -0x8(%rbp),%rax
add    $0x1,%rax
xor    -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1352 <main+0x252>
cmpq   $0xea000,-0x10(%rbp)
je     1397 <main+0x297>
movl   $0x7,-0x4(%rbp)
jmp    1470 <main+0x370>
movq   $0x0,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    13e9 <main+0x2e9>
xor    %eax,%eax
cmpq   $0x0,-0x10(%rbp)
mov    %al,-0x11(%rbp)
je     13cd <main+0x2cd>
mov    $0x1,%al
mov    %al,-0x11(%rbp)
jmp    13cd <main+0x2cd>
mov    -0x11(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
cltq
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    13a6 <main+0x2a6>
cmpq   $0x0,-0x10(%rbp)
je     1400 <main+0x300>
movl   $0x8,-0x4(%rbp)
jmp    1470 <main+0x370>
movq   $0x1,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    1452 <main+0x352>
mov    $0x1,%al
cmpq   $0x0,-0x10(%rbp)
mov    %al,-0x12(%rbp)
jne    1436 <main+0x336>
xor    %eax,%eax
mov    %al,-0x12(%rbp)
jmp    1436 <main+0x336>
mov    -0x12(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
cltq
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    140f <main+0x30f>
cmpq   $0x0,-0x10(%rbp)
jne    1469 <main+0x369>
movl   $0x9,-0x4(%rbp)
jmp    1470 <main+0x370>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
mov    $0x2,%edx
xor    %eax,%eax
mov    $0x80,%esi
nopl   0x0(%rax)
mov    %eax,%ecx
not    %cl
and    $0x1,%cl
shl    %cl,%rdx
add    $0x1,%eax
add    $0xfffffffc,%esi
jne    1110 <main+0x10>
mov    $0x2,%eax
cmp    $0x20000,%rdx
jne    14e3 <main+0x3e3>
mov    $0x7b,%ecx
xor    %eax,%eax
jmp    114c <main+0x4c>
nopl   (%rax)
add    $0x8,%rax
cmp    $0xf4240,%rax
je     11ad <main+0xad>
mov    %rax,%rdx
cmp    %rax,%rcx
jb     1157 <main+0x57>
mov    %rcx,%rdx
lea    0x1(%rax),%rcx
cmp    %rcx,%rdx
jb     1163 <main+0x63>
mov    %rdx,%rcx
lea    0x2(%rax),%rdx
cmp    %rdx,%rcx
jb     116f <main+0x6f>
mov    %rcx,%rdx
lea    0x3(%rax),%rcx
cmp    %rcx,%rdx
jb     117b <main+0x7b>
mov    %rdx,%rcx
lea    0x4(%rax),%rdx
cmp    %rdx,%rcx
jb     1187 <main+0x87>
mov    %rcx,%rdx
lea    0x5(%rax),%rcx
cmp    %rcx,%rdx
jb     1193 <main+0x93>
mov    %rdx,%rcx
lea    0x6(%rax),%rdx
cmp    %rdx,%rcx
jb     119f <main+0x9f>
mov    %rcx,%rdx
lea    0x7(%rax),%rcx
cmp    %rcx,%rdx
jb     1140 <main+0x40>
mov    %rdx,%rcx
jmp    1140 <main+0x40>
mov    $0x3,%eax
cmp    $0xf423f,%rcx
jne    14e3 <main+0x3e3>
mov    $0x8235,%ecx
mov    $0xfffffffffffffffe,%rax
jmp    11dc <main+0xdc>
nopl   (%rax)
add    $0x5,%rax
cmp    $0xf423e,%rax
je     1219 <main+0x119>
mov    %rax,%rsi
cmp    %rax,%rcx
jg     11e7 <main+0xe7>
mov    %rcx,%rsi
lea    0x2(%rax),%rdx
lea    0x1(%rax),%rcx
cmp    %rcx,%rsi
jg     11f7 <main+0xf7>
mov    %rsi,%rcx
lea    0x3(%rax),%rsi
cmp    %rdx,%rcx
jg     1203 <main+0x103>
mov    %rcx,%rdx
lea    0x4(%rax),%rcx
cmp    %rsi,%rdx
jg     120f <main+0x10f>
mov    %rdx,%rsi
cmp    %rcx,%rsi
jg     11d0 <main+0xd0>
mov    %rsi,%rcx
jmp    11d0 <main+0xd0>
mov    $0x4,%eax
cmp    $0xfffffffffffffffe,%rcx
jne    14e3 <main+0x3e3>
pcmpeqd %xmm0,%xmm0
movdqa 0xdcc(%rip),%xmm3
movdqa 0xdd4(%rip),%xmm1
mov    $0xf4240,%eax
movdqa 0xdd6(%rip),%xmm8
movdqa 0xddd(%rip),%xmm9
movdqa 0xde5(%rip),%xmm6
movdqa 0xded(%rip),%xmm7
movdqa 0xdf4(%rip),%xmm13
nopl   0x0(%rax)
movdqa %xmm1,%xmm2
psllq  $0x5,%xmm2
movdqa %xmm2,%xmm4
por    %xmm8,%xmm4
pand   %xmm3,%xmm4
movdqa %xmm2,%xmm5
paddq  %xmm9,%xmm5
pand   %xmm0,%xmm5
movdqa %xmm2,%xmm3
paddq  %xmm6,%xmm3
pand   %xmm4,%xmm3
paddq  %xmm7,%xmm2
movdqa %xmm2,%xmm0
pand   %xmm5,%xmm0
paddq  %xmm13,%xmm1
add    $0xfffffffffffffff8,%rax
jne    1270 <main+0x170>
pand   %xmm3,%xmm0
pshufd $0xee,%xmm0,%xmm1
pand   %xmm0,%xmm1
movq   %xmm1,%rcx
mov    $0x5,%eax
cmp    $0x15,%rcx
jne    14e3 <main+0x3e3>
pxor   %xmm5,%xmm5
movdqa 0xd8d(%rip),%xmm2
movdqa 0xd25(%rip),%xmm6
mov    $0xf4240,%eax
movdqa 0xd87(%rip),%xmm9
movdqa 0xd8e(%rip),%xmm10
movdqa 0xd95(%rip),%xmm11
movdqa 0xd9c(%rip),%xmm12
movdqa 0xda3(%rip),%xmm14
movdqa 0xdaa(%rip),%xmm15
movdqa 0xdb1(%rip),%xmm8
movdqa 0xdb9(%rip),%xmm3
movdqa 0xdc1(%rip),%xmm4
nop
movdqa %xmm6,%xmm1
paddq  %xmm9,%xmm1
por    %xmm5,%xmm1
por    %xmm6,%xmm2
movdqa %xmm6,%xmm5
paddq  %xmm10,%xmm5
por    %xmm2,%xmm5
movdqa %xmm6,%xmm2
paddq  %xmm11,%xmm2
movdqa %xmm6,%xmm7
paddq  %xmm13,%xmm7
movdqa %xmm6,%xmm0
paddq  %xmm12,%xmm0
por    %xmm2,%xmm0
por    %xmm1,%xmm0
movdqa %xmm6,%xmm1
paddq  %xmm14,%xmm1
por    %xmm7,%xmm1
por    %xmm5,%xmm1
movdqa %xmm6,%xmm7
paddq  %xmm15,%xmm7
movdqa %xmm6,%xmm2
paddq  %xmm8,%xmm2
por    %xmm1,%xmm2
movdqa %xmm6,%xmm5
paddq  %xmm3,%xmm5
por    %xmm7,%xmm5
por    %xmm0,%xmm5
paddq  %xmm4,%xmm6
add    $0xffffffffffffffec,%rax
jne    1340 <main+0x240>
por    %xmm2,%xmm5
pshufd $0xee,%xmm5,%xmm0
por    %xmm5,%xmm0
movq   %xmm0,%rcx
mov    $0x6,%eax
cmp    $0x1fffff,%rcx
jne    14e3 <main+0x3e3>
pxor   %xmm0,%xmm0
movdqa 0xd1a(%rip),%xmm2
movdqa 0xc12(%rip),%xmm5
mov    $0xf4240,%eax
pcmpeqd %xmm9,%xmm9
movdqa 0xd0f(%rip),%xmm10
movdqa 0xd16(%rip),%xmm11
movdqa 0xd1d(%rip),%xmm12
movdqa 0xd24(%rip),%xmm13
movdqa 0xd2b(%rip),%xmm14
movdqa 0xd33(%rip),%xmm7
movdqa 0xd3b(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
movdqa %xmm5,%xmm3
psubq  %xmm9,%xmm3
pxor   %xmm2,%xmm3
movdqa %xmm5,%xmm2
paddq  %xmm10,%xmm2
pxor   %xmm0,%xmm2
movdqa %xmm5,%xmm0
paddq  %xmm11,%xmm0
pxor   %xmm3,%xmm0
movdqa %xmm5,%xmm3
paddq  %xmm12,%xmm3
movdqa %xmm5,%xmm6
paddq  %xmm13,%xmm6
movdqa %xmm5,%xmm4
paddq  %xmm14,%xmm4
pxor   %xmm3,%xmm4
pxor   %xmm2,%xmm4
movdqa %xmm5,%xmm2
paddq  %xmm7,%xmm2
pxor   %xmm6,%xmm2
pxor   %xmm0,%xmm2
movdqa %xmm5,%xmm0
paddq  %xmm1,%xmm0
pxor   %xmm4,%xmm0
paddq  %xmm8,%xmm5
add    $0xfffffffffffffff0,%rax
jne    1450 <main+0x350>
pxor   %xmm2,%xmm0
pshufd $0xee,%xmm0,%xmm1
pxor   %xmm0,%xmm1
movq   %xmm1,%rax
xor    %ecx,%ecx
cmp    $0xea000,%rax
mov    $0x7,%eax
cmove  %ecx,%eax
ret

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca i64
store i32 0, i32* %1
store i64 -10000, i64* %3
store i32 0, i32* %2
br label %4
4: ; preds = %10, %0
%5 = load i32, i32* %2
%6 = icmp slt i32 %5, 20000
br i1 %6, label %7, label %13
7: ; preds = %4
%8 = load i64, i64* %3
%9 = add nsw i64 %8, 1
store i64 %9, i64* %3
br label %10
10: ; preds = %7
%11 = load i32, i32* %2
%12 = add nsw i32 %11, 1
store i32 %12, i32* %2
br label %4
13: ; preds = %4
%14 = load i64, i64* %3
%15 = icmp ne i64 %14, 10000
br i1 %15, label %16, label %17
16: ; preds = %13
store i32 1, i32* %1
br label %171
17: ; preds = %13
store i64 2, i64* %3
store i32 0, i32* %2
br label %18
18: ; preds = %32, %17
%19 = load i32, i32* %2
%20 = icmp slt i32 %19, 128
br i1 %20, label %21, label %35
21: ; preds = %18
%22 = load i32, i32* %2
%23 = srem i32 %22, 8
%24 = icmp eq i32 %23, 0
br i1 %24, label %25, label %28
25: ; preds = %21
%26 = load i64, i64* %3
%27 = mul nsw i64 %26, 2
store i64 %27, i64* %3
br label %31
28: ; preds = %21
%29 = load i64, i64* %3
%30 = mul nsw i64 %29, 1
store i64 %30, i64* %3
br label %31
31: ; preds = %28, %25
br label %32
32: ; preds = %31
%33 = load i32, i32* %2
%34 = add nsw i32 %33, 1
store i32 %34, i32* %2
br label %18
35: ; preds = %18
%36 = load i64, i64* %3
%37 = icmp ne i64 %36, 131072
br i1 %37, label %38, label %39
38: ; preds = %35
store i32 2, i32* %1
br label %171
39: ; preds = %35
store i64 123, i64* %3
store i32 0, i32* %2
br label %40
40: ; preds = %52, %39
%41 = load i32, i32* %2
%42 = icmp slt i32 %41, 1000000
br i1 %42, label %43, label %55
43: ; preds = %40
%44 = load i64, i64* %3
%45 = load i32, i32* %2
%46 = sext i32 %45 to i64
%47 = icmp slt i64 %44, %46
br i1 %47, label %48, label %51
48: ; preds = %43
%49 = load i32, i32* %2
%50 = sext i32 %49 to i64
store i64 %50, i64* %3
br label %51
51: ; preds = %48, %43
br label %52
52: ; preds = %51
%53 = load i32, i32* %2
%54 = add nsw i32 %53, 1
store i32 %54, i32* %2
br label %40
55: ; preds = %40
%56 = load i64, i64* %3
%57 = icmp ne i64 %56, 999999
br i1 %57, label %58, label %59
58: ; preds = %55
store i32 3, i32* %1
br label %171
59: ; preds = %55
store i64 33333, i64* %3
store i32 0, i32* %2
br label %60
60: ; preds = %74, %59
%61 = load i32, i32* %2
%62 = icmp slt i32 %61, 1000000
br i1 %62, label %63, label %77
63: ; preds = %60
%64 = load i64, i64* %3
%65 = load i32, i32* %2
%66 = sext i32 %65 to i64
%67 = sub nsw i64 %66, 2
%68 = icmp sgt i64 %64, %67
br i1 %68, label %69, label %73
69: ; preds = %63
%70 = load i32, i32* %2
%71 = sext i32 %70 to i64
%72 = sub nsw i64 %71, 2
store i64 %72, i64* %3
br label %73
73: ; preds = %69, %63
br label %74
74: ; preds = %73
%75 = load i32, i32* %2
%76 = add nsw i32 %75, 1
store i32 %76, i32* %2
br label %60
77: ; preds = %60
%78 = load i64, i64* %3
%79 = icmp ne i64 %78, -2
br i1 %79, label %80, label %81
80: ; preds = %77
store i32 4, i32* %1
br label %171
81: ; preds = %77
store i64 123456789, i64* %3
store i32 0, i32* %2
br label %82
82: ; preds = %92, %81
%83 = load i32, i32* %2
%84 = icmp slt i32 %83, 1000000
br i1 %84, label %85, label %95
85: ; preds = %82
%86 = load i32, i32* %2
%87 = sext i32 %86 to i64
%88 = shl i64 %87, 5
%89 = add nsw i64 %88, 21
%90 = load i64, i64* %3
%91 = and i64 %90, %89
store i64 %91, i64* %3
br label %92
92: ; preds = %85
%93 = load i32, i32* %2
%94 = add nsw i32 %93, 1
store i32 %94, i32* %2
br label %82
95: ; preds = %82
%96 = load i64, i64* %3
%97 = icmp ne i64 %96, 21
br i1 %97, label %98, label %99
98: ; preds = %95
store i32 5, i32* %1
br label %171
99: ; preds = %95
store i64 1065536, i64* %3
store i32 0, i32* %2
br label %100
100: ; preds = %108, %99
%101 = load i32, i32* %2
%102 = icmp slt i32 %101, 1000000
br i1 %102, label %103, label %111
103: ; preds = %100
%104 = load i32, i32* %2
%105 = sext i32 %104 to i64
%106 = load i64, i64* %3
%107 = or i64 %106, %105
store i64 %107, i64* %3
br label %108
108: ; preds = %103
%109 = load i32, i32* %2
%110 = add nsw i32 %109, 1
store i32 %110, i32* %2
br label %100
111: ; preds = %100
%112 = load i64, i64* %3
%113 = icmp ne i64 %112, 2097151
br i1 %113, label %114, label %115
114: ; preds = %111
store i32 6, i32* %1
br label %171
115: ; preds = %111
store i64 123456, i64* %3
store i32 0, i32* %2
br label %116
116: ; preds = %125, %115
%117 = load i32, i32* %2
%118 = icmp slt i32 %117, 1000000
br i1 %118, label %119, label %128
119: ; preds = %116
%120 = load i32, i32* %2
%121 = sext i32 %120 to i64
%122 = add nsw i64 %121, 1
%123 = load i64, i64* %3
%124 = xor i64 %123, %122
store i64 %124, i64* %3
br label %125
125: ; preds = %119
%126 = load i32, i32* %2
%127 = add nsw i32 %126, 1
store i32 %127, i32* %2
br label %116
128: ; preds = %116
%129 = load i64, i64* %3
%130 = icmp ne i64 %129, 958464
br i1 %130, label %131, label %132
131: ; preds = %128
store i32 7, i32* %1
br label %171
132: ; preds = %128
store i64 0, i64* %3
store i32 0, i32* %2
br label %133
133: ; preds = %144, %132
%134 = load i32, i32* %2
%135 = icmp slt i32 %134, 1000000
br i1 %135, label %136, label %147
136: ; preds = %133
%137 = load i64, i64* %3
%138 = icmp ne i64 %137, 0
br i1 %138, label %139, label %140
139: ; preds = %136
br label %140
140: ; preds = %139, %136
%141 = phi i1 [ false, %136 ], [ true, %139 ]
%142 = zext i1 %141 to i32
%143 = sext i32 %142 to i64
store i64 %143, i64* %3
br label %144
144: ; preds = %140
%145 = load i32, i32* %2
%146 = add nsw i32 %145, 1
store i32 %146, i32* %2
br label %133
147: ; preds = %133
%148 = load i64, i64* %3
%149 = icmp ne i64 %148, 0
br i1 %149, label %150, label %151
150: ; preds = %147
store i32 8, i32* %1
br label %171
151: ; preds = %147
store i64 1, i64* %3
store i32 0, i32* %2
br label %152
152: ; preds = %163, %151
%153 = load i32, i32* %2
%154 = icmp slt i32 %153, 1000000
br i1 %154, label %155, label %166
155: ; preds = %152
%156 = load i64, i64* %3
%157 = icmp ne i64 %156, 0
br i1 %157, label %159, label %158
158: ; preds = %155
br label %159
159: ; preds = %158, %155
%160 = phi i1 [ true, %155 ], [ false, %158 ]
%161 = zext i1 %160 to i32
%162 = sext i32 %161 to i64
store i64 %162, i64* %3
br label %163
163: ; preds = %159
%164 = load i32, i32* %2
%165 = add nsw i32 %164, 1
store i32 %165, i32* %2
br label %152
166: ; preds = %152
%167 = load i64, i64* %3
%168 = icmp ne i64 %167, 0
br i1 %168, label %170, label %169
169: ; preds = %166
store i32 9, i32* %1
br label %171
170: ; preds = %166
store i32 0, i32* %1
br label %171
171: ; preds = %170, %169, %150, %131, %114, %98, %80, %58, %38, %16
%172 = load i32, i32* %1
ret i32 %172
}

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