#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 */

/* Variables and functions */
int /*<<< orphan*/ printf(char *);
int main() {
  int i;
  double double_red;
  double_red = 3.0;
#pragma acc parallel
#pragma acc loop reduction(+ : double_red)
  for (i = 0; i < 1000000; i++) {
    double_red += 1.0;
  }
  if (double_red != 1000003) {
    return 1;
  }
  double_red = 2.0;
#pragma acc parallel
#pragma acc loop reduction(* : double_red)
  for (i = 0; i < 128; i++) {
    if (i % 8 == 0) {
      double_red *= 2.0;
    } else {
      double_red *= 1.0;
    }
  }
  if (double_red != 131072.0) {
    return 2;
  }
  double_red = 123.0;
#pragma acc parallel
#pragma acc loop reduction(max : double_red)
  for (i = 0; i < 1000000; i++) {
    if (double_red < i) {
      double_red = i;
    }
  }
  if (double_red != 999999) {
    return 3;
  }
  double_red = 33333;
#pragma acc parallel
#pragma acc loop reduction(min : double_red)
  for (i = 0; i < 1000000; i++) {
    if (double_red > i - 2) {
      double_red = i - 2.0;
    }
  }
  if (double_red != -2.0) {
    return 4;
  }
  double_red = -100;
#pragma acc parallel
#pragma acc loop reduction(max : double_red)
  for (i = -1; i > -10000; i--) {
    if (double_red < i) {
      double_red = i;
    }
  }
  if (double_red != -1) {
    return 5;
  }
  printf("PASS\n");
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movl   $0x0,-0x4(%rbp)
movsd  0xed9(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    1160 <main+0x50>
movsd  0xf08(%rip),%xmm0
addsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1133 <main+0x23>
movsd  -0x10(%rbp),%xmm0
movsd  0xe9b(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1182 <main+0x72>
jp     1182 <main+0x72>
jmp    118e <main+0x7e>
movl   $0x1,-0x4(%rbp)
jmp    13d1 <main+0x2c1>
movsd  0xe7a(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0x80,-0x8(%rbp)
jge    11ff <main+0xef>
mov    -0x8(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    11da <main+0xca>
movsd  0xe45(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    11ec <main+0xdc>
movsd  0xe6e(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    11f1 <main+0xe1>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    11a2 <main+0x92>
movsd  -0x10(%rbp),%xmm0
movsd  0xe0c(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1221 <main+0x111>
jp     1221 <main+0x111>
jmp    122d <main+0x11d>
movl   $0x2,-0x4(%rbp)
jmp    13d1 <main+0x2c1>
movsd  0xdeb(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    127f <main+0x16f>
movsd  -0x10(%rbp),%xmm1
cvtsi2sdl -0x8(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    126c <main+0x15c>
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1271 <main+0x161>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1241 <main+0x131>
movsd  -0x10(%rbp),%xmm0
movsd  0xd9c(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    12a1 <main+0x191>
jp     12a1 <main+0x191>
jmp    12ad <main+0x19d>
movl   $0x3,-0x4(%rbp)
jmp    13d1 <main+0x2c1>
movsd  0xd7b(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0xf4240,-0x8(%rbp)
jge    1310 <main+0x200>
movsd  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%eax
sub    $0x2,%eax
cvtsi2sd %eax,%xmm1
ucomisd %xmm1,%xmm0
jbe    12fd <main+0x1ed>
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  0xd1c(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1302 <main+0x1f2>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    12c1 <main+0x1b1>
movsd  -0x10(%rbp),%xmm0
movsd  0xd1b(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1332 <main+0x222>
jp     1332 <main+0x222>
jmp    133e <main+0x22e>
movl   $0x4,-0x4(%rbp)
jmp    13d1 <main+0x2c1>
movsd  0xcfa(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0xffffffff,-0x8(%rbp)
cmpl   $0xffffd8f0,-0x8(%rbp)
jle    1390 <main+0x280>
movsd  -0x10(%rbp),%xmm1
cvtsi2sdl -0x8(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    137d <main+0x26d>
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1382 <main+0x272>
mov    -0x8(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x8(%rbp)
jmp    1352 <main+0x242>
movsd  -0x10(%rbp),%xmm0
movsd  0xcab(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    13b2 <main+0x2a2>
jp     13b2 <main+0x2a2>
jmp    13be <main+0x2ae>
movl   $0x5,-0x4(%rbp)
jmp    13d1 <main+0x2c1>
lea    0xc93(%rip),%rdi
call   1030 <printf@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rax
movsd  0xee7(%rip),%xmm0
mov    $0xf4240,%eax
movsd  0xee2(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
add    $0xfffffff6,%eax
jne    1130 <main+0x20>
mov    $0x1,%eax
ucomisd 0xea6(%rip),%xmm0
jne    116e <main+0x5e>
jnp    1170 <main+0x60>
pop    %rcx
ret
xor    %eax,%eax
movsd  0xe9e(%rip),%xmm0
jmp    118a <main+0x7a>
nopl   0x0(%rax)
add    $0x4,%eax
cmp    $0x80,%eax
je     1194 <main+0x84>
test   $0x4,%al
jne    1180 <main+0x70>
addsd  %xmm0,%xmm0
jmp    1180 <main+0x70>
mov    $0x2,%eax
ucomisd 0xe7f(%rip),%xmm0
jne    116e <main+0x5e>
jp     116e <main+0x5e>
xorpd  %xmm1,%xmm1
movsd  0xe77(%rip),%xmm2
mov    $0x4,%eax
movsd  0xe72(%rip),%xmm0
xchg   %ax,%ax
movapd %xmm1,%xmm3
lea    -0x3(%rax),%ecx
xorps  %xmm4,%xmm4
cvtsi2sd %ecx,%xmm4
maxsd  %xmm2,%xmm3
lea    -0x2(%rax),%ecx
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
maxsd  %xmm3,%xmm4
lea    -0x1(%rax),%ecx
xorps  %xmm3,%xmm3
cvtsi2sd %ecx,%xmm3
maxsd  %xmm4,%xmm2
maxsd  %xmm2,%xmm3
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
maxsd  %xmm3,%xmm2
addsd  %xmm0,%xmm1
add    $0x5,%eax
cmp    $0xf4244,%eax
jne    11c0 <main+0xb0>
mov    $0x3,%eax
ucomisd 0xe20(%rip),%xmm2
jne    116e <main+0x5e>
jp     116e <main+0x5e>
xorpd  %xmm1,%xmm1
movsd  0xe10(%rip),%xmm2
mov    $0xfffffffe,%eax
cs nopw 0x0(%rax,%rax,1)
nop
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
minsd  %xmm2,%xmm3
lea    0x3(%rax),%ecx
lea    0x1(%rax),%edx
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
minsd  %xmm3,%xmm2
movapd %xmm1,%xmm3
minsd  %xmm2,%xmm3
xorps  %xmm4,%xmm4
cvtsi2sd %ecx,%xmm4
lea    0x4(%rax),%ecx
minsd  %xmm3,%xmm4
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
minsd  %xmm4,%xmm2
addsd  %xmm0,%xmm1
add    $0x5,%eax
cmp    $0xf423e,%eax
jne    1240 <main+0x130>
mov    $0x4,%eax
ucomisd 0xdb0(%rip),%xmm2
jne    116e <main+0x5e>
jp     116e <main+0x5e>
mov    $0xffffffff,%eax
movsd  0xd9f(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
lea    -0x1(%rax),%ecx
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
maxsd  %xmm0,%xmm1
lea    -0x2(%rax),%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
maxsd  %xmm1,%xmm2
maxsd  %xmm2,%xmm0
add    $0xfffffffd,%eax
cmp    $0xffffd8f0,%eax
ja     12c0 <main+0x1b0>
mov    $0x5,%eax
ucomisd 0xd5a(%rip),%xmm0
jne    116e <main+0x5e>
jp     116e <main+0x5e>
lea    0xd4f(%rip),%rdi
call   1030 <puts@plt>
xor    %eax,%eax
pop    %rcx
ret

LLVM IR (-O0):
@.str = [6 x i8] c"PASS\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca double
store i32 0, i32* %1
store double 3.000000e+00, double* %3
store i32 0, i32* %2
br label %4
4: ; preds = %10, %0
%5 = load i32, i32* %2
%6 = icmp slt i32 %5, 1000000
br i1 %6, label %7, label %13
7: ; preds = %4
%8 = load double, double* %3
%9 = fadd double %8, 1.000000e+00
store double %9, double* %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 double, double* %3
%15 = fcmp une double %14, 0x412E848600000000
br i1 %15, label %16, label %17
16: ; preds = %13
store i32 1, i32* %1
br label %103
17: ; preds = %13
store double 2.000000e+00, double* %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 double, double* %3
%27 = fmul double %26, 2.000000e+00
store double %27, double* %3
br label %31
28: ; preds = %21
%29 = load double, double* %3
%30 = fmul double %29, 1.000000e+00
store double %30, double* %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 double, double* %3
%37 = fcmp une double %36, 1.310720e+05
br i1 %37, label %38, label %39
38: ; preds = %35
store i32 2, i32* %1
br label %103
39: ; preds = %35
store double 1.230000e+02, double* %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 double, double* %3
%45 = load i32, i32* %2
%46 = sitofp i32 %45 to double
%47 = fcmp olt double %44, %46
br i1 %47, label %48, label %51
48: ; preds = %43
%49 = load i32, i32* %2
%50 = sitofp i32 %49 to double
store double %50, double* %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 double, double* %3
%57 = fcmp une double %56, 9.999990e+05
br i1 %57, label %58, label %59
58: ; preds = %55
store i32 3, i32* %1
br label %103
59: ; preds = %55
store double 3.333300e+04, double* %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 double, double* %3
%65 = load i32, i32* %2
%66 = sub nsw i32 %65, 2
%67 = sitofp i32 %66 to double
%68 = fcmp ogt double %64, %67
br i1 %68, label %69, label %73
69: ; preds = %63
%70 = load i32, i32* %2
%71 = sitofp i32 %70 to double
%72 = fsub double %71, 2.000000e+00
store double %72, double* %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 double, double* %3
%79 = fcmp une double %78, -2.000000e+00
br i1 %79, label %80, label %81
80: ; preds = %77
store i32 4, i32* %1
br label %103
81: ; preds = %77
store double -1.000000e+02, double* %3
store i32 -1, i32* %2
br label %82
82: ; preds = %94, %81
%83 = load i32, i32* %2
%84 = icmp sgt i32 %83, -10000
br i1 %84, label %85, label %97
85: ; preds = %82
%86 = load double, double* %3
%87 = load i32, i32* %2
%88 = sitofp i32 %87 to double
%89 = fcmp olt double %86, %88
br i1 %89, label %90, label %93
90: ; preds = %85
%91 = load i32, i32* %2
%92 = sitofp i32 %91 to double
store double %92, double* %3
br label %93
93: ; preds = %90, %85
br label %94
94: ; preds = %93
%95 = load i32, i32* %2
%96 = add nsw i32 %95, -1
store i32 %96, i32* %2
br label %82
97: ; preds = %82
%98 = load double, double* %3
%99 = fcmp une double %98, -1.000000e+00
br i1 %99, label %100, label %101
100: ; preds = %97
store i32 5, i32* %1
br label %103
101: ; preds = %97
%102 = call i32 @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
store i32 0, i32* %1
br label %103
103: ; preds = %101, %100, %80, %58, %38, %16
%104 = load i32, i32* %1
ret i32 %104
}

LLVM IR (-O2):
@str = [5 x i8] c"PASS\00"
define i32 @main() {
br label %1
1: ; preds = %1, %0
%2 = phi double [ 3.000000e+00, %0 ], [ %13, %1 ]
%3 = phi i32 [ 0, %0 ], [ %14, %1 ]
%4 = fadd double %2, 1.000000e+00
%5 = fadd double %4, 1.000000e+00
%6 = fadd double %5, 1.000000e+00
%7 = fadd double %6, 1.000000e+00
%8 = fadd double %7, 1.000000e+00
%9 = fadd double %8, 1.000000e+00
%10 = fadd double %9, 1.000000e+00
%11 = fadd double %10, 1.000000e+00
%12 = fadd double %11, 1.000000e+00
%13 = fadd double %12, 1.000000e+00
%14 = add nuw nsw i32 %3, 10
%15 = icmp eq i32 %14, 1000000
br i1 %15, label %16, label %1
16: ; preds = %1
%17 = fcmp une double %13, 0x412E848600000000
br i1 %17, label %101, label %18
18: ; preds = %16, %18
%19 = phi double [ %24, %18 ], [ 2.000000e+00, %16 ]
%20 = phi i32 [ %25, %18 ], [ 0, %16 ]
%21 = and i32 %20, 4
%22 = icmp eq i32 %21, 0
%23 = fmul double %19, 2.000000e+00
%24 = select i1 %22, double %23, double %19
%25 = add nuw nsw i32 %20, 4
%26 = icmp eq i32 %25, 128
br i1 %26, label %27, label %18
27: ; preds = %18
%28 = fcmp une double %24, 1.310720e+05
br i1 %28, label %101, label %29
29: ; preds = %27, %29
%30 = phi double [ %50, %29 ], [ 1.230000e+02, %27 ]
%31 = phi i32 [ %51, %29 ], [ 0, %27 ]
%32 = sitofp i32 %31 to double
%33 = fcmp olt double %30, %32
%34 = select i1 %33, double %32, double %30
%35 = add nuw nsw i32 %31, 1
%36 = sitofp i32 %35 to double
%37 = fcmp olt double %34, %36
%38 = select i1 %37, double %36, double %34
%39 = add nuw nsw i32 %31, 2
%40 = sitofp i32 %39 to double
%41 = fcmp olt double %38, %40
%42 = select i1 %41, double %40, double %38
%43 = add nuw nsw i32 %31, 3
%44 = sitofp i32 %43 to double
%45 = fcmp olt double %42, %44
%46 = select i1 %45, double %44, double %42
%47 = add nuw nsw i32 %31, 4
%48 = sitofp i32 %47 to double
%49 = fcmp olt double %46, %48
%50 = select i1 %49, double %48, double %46
%51 = add nuw nsw i32 %31, 5
%52 = icmp eq i32 %51, 1000000
br i1 %52, label %53, label %29
53: ; preds = %29
%54 = fcmp une double %50, 9.999990e+05
br i1 %54, label %101, label %55
55: ; preds = %53, %55
%56 = phi double [ %76, %55 ], [ 3.333300e+04, %53 ]
%57 = phi i32 [ %77, %55 ], [ 0, %53 ]
%58 = add nsw i32 %57, -2
%59 = sitofp i32 %58 to double
%60 = fcmp ogt double %56, %59
%61 = select i1 %60, double %59, double %56
%62 = add nuw nsw i32 %57, 1
%63 = add nsw i32 %57, -1
%64 = sitofp i32 %63 to double
%65 = fcmp ogt double %61, %64
%66 = select i1 %65, double %64, double %61
%67 = add nuw nsw i32 %57, 2
%68 = sitofp i32 %57 to double
%69 = fcmp ogt double %66, %68
%70 = select i1 %69, double %68, double %66
%71 = sitofp i32 %62 to double
%72 = fcmp ogt double %70, %71
%73 = select i1 %72, double %71, double %70
%74 = sitofp i32 %67 to double
%75 = fcmp ogt double %73, %74
%76 = select i1 %75, double %74, double %73
%77 = add nuw nsw i32 %57, 5
%78 = icmp eq i32 %77, 1000000
br i1 %78, label %79, label %55
79: ; preds = %55
%80 = fcmp une double %76, -2.000000e+00
br i1 %80, label %101, label %81
81: ; preds = %79, %81
%82 = phi double [ %94, %81 ], [ -1.000000e+02, %79 ]
%83 = phi i32 [ %95, %81 ], [ -1, %79 ]
%84 = sitofp i32 %83 to double
%85 = fcmp olt double %82, %84
%86 = select i1 %85, double %84, double %82
%87 = add nsw i32 %83, -1
%88 = sitofp i32 %87 to double
%89 = fcmp olt double %86, %88
%90 = select i1 %89, double %88, double %86
%91 = add nsw i32 %83, -2
%92 = sitofp i32 %91 to double
%93 = fcmp olt double %90, %92
%94 = select i1 %93, double %92, double %90
%95 = add nsw i32 %83, -3
%96 = icmp ugt i32 %95, -10000
br i1 %96, label %81, label %97
97: ; preds = %81
%98 = fcmp une double %94, -1.000000e+00
br i1 %98, label %101, label %99
99: ; preds = %97
%100 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @str, i64 0, i64 0))
br label %101
101: ; preds = %97, %79, %53, %27, %16, %99
%102 = phi i32 [ 0, %99 ], [ 1, %16 ], [ 2, %27 ], [ 3, %53 ], [ 4, %79 ], [ 5, %97 ]
ret i32 %102
}