#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;
  float float_red;
  float_red = 3.0;
#pragma acc parallel
#pragma acc loop reduction(+ : float_red)
  for (i = 0; i < 10000; i++) {
    float_red += 1.0;
  }
  if (float_red != 10003) {
    return 1;
  }
  float_red = 2.0;
#pragma acc parallel
#pragma acc loop reduction(* : float_red)
  for (i = 0; i < 128; i++) {
    if (i % 8 == 0) {
      float_red *= 2.0;
    } else {
      float_red *= 1.0;
    }
  }
  if (float_red != 131072.0) {
    return 2;
  }
  float_red = 123.0;
#pragma acc parallel
#pragma acc loop reduction(max : float_red)
  for (i = 0; i < 10000; i++) {
    if (float_red < i) {
      float_red = i;
    }
  }
  if (float_red != 9999) {
    return 3;
  }
  float_red = 33333;
#pragma acc parallel
#pragma acc loop reduction(min : float_red)
  for (i = 0; i < 10000; i++) {
    if (float_red > i - 2) {
      float_red = i - 2.0;
    }
  }
  if (float_red != -2.0) {
    return 4;
  }
  float_red = -10;
#pragma acc parallel
#pragma acc loop reduction(max : float_red)
  for (i = -1; i > -1000; i--) {
    if (float_red < i) {
      float_red = i;
    }
  }
  if (float_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)
movss  0xed9(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0x2710,-0x8(%rbp)
jge    116c <main+0x5c>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xee7(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1133 <main+0x23>
movss  -0xc(%rbp),%xmm0
movss  0xe8b(%rip),%xmm1
ucomiss %xmm1,%xmm0
jne    118d <main+0x7d>
jp     118d <main+0x7d>
jmp    1199 <main+0x89>
movl   $0x1,-0x4(%rbp)
jmp    13fb <main+0x2eb>
movss  0xe67(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0x80,-0x8(%rbp)
jge    1222 <main+0x112>
mov    -0x8(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    11f1 <main+0xe1>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe51(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    120f <main+0xff>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe36(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    1214 <main+0x104>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    11ad <main+0x9d>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xded(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1248 <main+0x138>
jp     1248 <main+0x138>
jmp    1254 <main+0x144>
movl   $0x2,-0x4(%rbp)
jmp    13fb <main+0x2eb>
movss  0xdb0(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0x2710,-0x8(%rbp)
jge    12a5 <main+0x195>
movss  -0xc(%rbp),%xmm1
cvtsi2ssl -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1292 <main+0x182>
cvtsi2ssl -0x8(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    1297 <main+0x187>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1268 <main+0x158>
movss  -0xc(%rbp),%xmm0
movss  0xd5e(%rip),%xmm1
ucomiss %xmm1,%xmm0
jne    12c6 <main+0x1b6>
jp     12c6 <main+0x1b6>
jmp    12d2 <main+0x1c2>
movl   $0x3,-0x4(%rbp)
jmp    13fb <main+0x2eb>
movss  0xd3a(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0x2710,-0x8(%rbp)
jge    1338 <main+0x228>
movss  -0xc(%rbp),%xmm0
mov    -0x8(%rbp),%eax
sub    $0x2,%eax
cvtsi2ss %eax,%xmm1
ucomiss %xmm1,%xmm0
jbe    1325 <main+0x215>
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  0xd18(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    132a <main+0x21a>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    12e6 <main+0x1d6>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xcdf(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    135e <main+0x24e>
jp     135e <main+0x24e>
jmp    136a <main+0x25a>
movl   $0x4,-0x4(%rbp)
jmp    13fb <main+0x2eb>
movss  0xca6(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movl   $0xffffffff,-0x8(%rbp)
cmpl   $0xfffffc18,-0x8(%rbp)
jle    13bb <main+0x2ab>
movss  -0xc(%rbp),%xmm1
cvtsi2ssl -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    13a8 <main+0x298>
cvtsi2ssl -0x8(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    13ad <main+0x29d>
mov    -0x8(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x8(%rbp)
jmp    137e <main+0x26e>
movss  -0xc(%rbp),%xmm0
movss  0xc54(%rip),%xmm1
ucomiss %xmm1,%xmm0
jne    13dc <main+0x2cc>
jp     13dc <main+0x2cc>
jmp    13e8 <main+0x2d8>
movl   $0x5,-0x4(%rbp)
jmp    13fb <main+0x2eb>
lea    0xc51(%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
movss  0xee7(%rip),%xmm0
mov    $0x2710,%eax
movss  0xede(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
addss  %xmm1,%xmm0
addss  %xmm1,%xmm0
addss  %xmm1,%xmm0
addss  %xmm1,%xmm0
addss  %xmm1,%xmm0
addss  %xmm1,%xmm0
addss  %xmm1,%xmm0
addss  %xmm1,%xmm0
addss  %xmm1,%xmm0
addss  %xmm1,%xmm0
add    $0xfffffff6,%eax
jne    1130 <main+0x20>
mov    $0x1,%eax
ucomiss 0xe9f(%rip),%xmm0
jne    116d <main+0x5d>
jnp    116f <main+0x5f>
pop    %rcx
ret
xor    %eax,%eax
movss  0xe93(%rip),%xmm0
jmp    118a <main+0x7a>
nopl   0x0(%rax,%rax,1)
add    $0x4,%eax
cmp    $0x80,%eax
je     1194 <main+0x84>
test   $0x4,%al
jne    1180 <main+0x70>
addss  %xmm0,%xmm0
jmp    1180 <main+0x70>
mov    $0x2,%eax
ucomiss 0xe70(%rip),%xmm0
jne    116d <main+0x5d>
jp     116d <main+0x5d>
xor    %eax,%eax
movss  0xe66(%rip),%xmm0
xchg   %ax,%ax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
lea    0x1(%rax),%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
maxss  %xmm0,%xmm1
maxss  %xmm1,%xmm2
lea    0x2(%rax),%ecx
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
maxss  %xmm2,%xmm1
lea    0x3(%rax),%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
lea    0x4(%rax),%ecx
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
maxss  %xmm1,%xmm2
maxss  %xmm2,%xmm0
add    $0x5,%eax
cmp    $0x2710,%eax
jne    11b0 <main+0xa0>
mov    $0x3,%eax
ucomiss 0xe0f(%rip),%xmm0
jne    116d <main+0x5d>
jp     116d <main+0x5d>
movss  0xdff(%rip),%xmm0
mov    $0xfffffffe,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
lea    0x2(%rax),%ecx
minss  %xmm0,%xmm1
lea    0x3(%rax),%edx
lea    0x1(%rax),%esi
xorps  %xmm0,%xmm0
cvtsi2ss %esi,%xmm0
minss  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
lea    0x4(%rax),%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %edx,%xmm2
minss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
minss  %xmm1,%xmm2
minss  %xmm2,%xmm0
add    $0x5,%eax
cmp    $0x270e,%eax
jne    1230 <main+0x120>
mov    $0x4,%eax
ucomiss 0xd97(%rip),%xmm0
jne    116d <main+0x5d>
jp     116d <main+0x5d>
mov    $0xffffffff,%eax
movss  0xd82(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
maxss  %xmm0,%xmm1
lea    -0x1(%rax),%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
lea    -0x2(%rax),%ecx
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
maxss  %xmm1,%xmm2
maxss  %xmm2,%xmm0
add    $0xfffffffd,%eax
cmp    $0xfffffc18,%eax
ja     12b0 <main+0x1a0>
mov    $0x5,%eax
ucomiss 0xd3b(%rip),%xmm0
jne    116d <main+0x5d>
jp     116d <main+0x5d>
lea    0xd2c(%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 float
store i32 0, i32* %1
store float 3.000000e+00, float* %3
store i32 0, i32* %2
br label %4
4: ; preds = %12, %0
%5 = load i32, i32* %2
%6 = icmp slt i32 %5, 10000
br i1 %6, label %7, label %15
7: ; preds = %4
%8 = load float, float* %3
%9 = fpext float %8 to double
%10 = fadd double %9, 1.000000e+00
%11 = fptrunc double %10 to float
store float %11, float* %3
br label %12
12: ; preds = %7
%13 = load i32, i32* %2
%14 = add nsw i32 %13, 1
store i32 %14, i32* %2
br label %4
15: ; preds = %4
%16 = load float, float* %3
%17 = fcmp une float %16, 1.000300e+04
br i1 %17, label %18, label %19
18: ; preds = %15
store i32 1, i32* %1
br label %112
19: ; preds = %15
store float 2.000000e+00, float* %3
store i32 0, i32* %2
br label %20
20: ; preds = %38, %19
%21 = load i32, i32* %2
%22 = icmp slt i32 %21, 128
br i1 %22, label %23, label %41
23: ; preds = %20
%24 = load i32, i32* %2
%25 = srem i32 %24, 8
%26 = icmp eq i32 %25, 0
br i1 %26, label %27, label %32
27: ; preds = %23
%28 = load float, float* %3
%29 = fpext float %28 to double
%30 = fmul double %29, 2.000000e+00
%31 = fptrunc double %30 to float
store float %31, float* %3
br label %37
32: ; preds = %23
%33 = load float, float* %3
%34 = fpext float %33 to double
%35 = fmul double %34, 1.000000e+00
%36 = fptrunc double %35 to float
store float %36, float* %3
br label %37
37: ; preds = %32, %27
br label %38
38: ; preds = %37
%39 = load i32, i32* %2
%40 = add nsw i32 %39, 1
store i32 %40, i32* %2
br label %20
41: ; preds = %20
%42 = load float, float* %3
%43 = fpext float %42 to double
%44 = fcmp une double %43, 1.310720e+05
br i1 %44, label %45, label %46
45: ; preds = %41
store i32 2, i32* %1
br label %112
46: ; preds = %41
store float 1.230000e+02, float* %3
store i32 0, i32* %2
br label %47
47: ; preds = %59, %46
%48 = load i32, i32* %2
%49 = icmp slt i32 %48, 10000
br i1 %49, label %50, label %62
50: ; preds = %47
%51 = load float, float* %3
%52 = load i32, i32* %2
%53 = sitofp i32 %52 to float
%54 = fcmp olt float %51, %53
br i1 %54, label %55, label %58
55: ; preds = %50
%56 = load i32, i32* %2
%57 = sitofp i32 %56 to float
store float %57, float* %3
br label %58
58: ; preds = %55, %50
br label %59
59: ; preds = %58
%60 = load i32, i32* %2
%61 = add nsw i32 %60, 1
store i32 %61, i32* %2
br label %47
62: ; preds = %47
%63 = load float, float* %3
%64 = fcmp une float %63, 9.999000e+03
br i1 %64, label %65, label %66
65: ; preds = %62
store i32 3, i32* %1
br label %112
66: ; preds = %62
store float 3.333300e+04, float* %3
store i32 0, i32* %2
br label %67
67: ; preds = %82, %66
%68 = load i32, i32* %2
%69 = icmp slt i32 %68, 10000
br i1 %69, label %70, label %85
70: ; preds = %67
%71 = load float, float* %3
%72 = load i32, i32* %2
%73 = sub nsw i32 %72, 2
%74 = sitofp i32 %73 to float
%75 = fcmp ogt float %71, %74
br i1 %75, label %76, label %81
76: ; preds = %70
%77 = load i32, i32* %2
%78 = sitofp i32 %77 to double
%79 = fsub double %78, 2.000000e+00
%80 = fptrunc double %79 to float
store float %80, float* %3
br label %81
81: ; preds = %76, %70
br label %82
82: ; preds = %81
%83 = load i32, i32* %2
%84 = add nsw i32 %83, 1
store i32 %84, i32* %2
br label %67
85: ; preds = %67
%86 = load float, float* %3
%87 = fpext float %86 to double
%88 = fcmp une double %87, -2.000000e+00
br i1 %88, label %89, label %90
89: ; preds = %85
store i32 4, i32* %1
br label %112
90: ; preds = %85
store float -1.000000e+01, float* %3
store i32 -1, i32* %2
br label %91
91: ; preds = %103, %90
%92 = load i32, i32* %2
%93 = icmp sgt i32 %92, -1000
br i1 %93, label %94, label %106
94: ; preds = %91
%95 = load float, float* %3
%96 = load i32, i32* %2
%97 = sitofp i32 %96 to float
%98 = fcmp olt float %95, %97
br i1 %98, label %99, label %102
99: ; preds = %94
%100 = load i32, i32* %2
%101 = sitofp i32 %100 to float
store float %101, float* %3
br label %102
102: ; preds = %99, %94
br label %103
103: ; preds = %102
%104 = load i32, i32* %2
%105 = add nsw i32 %104, -1
store i32 %105, i32* %2
br label %91
106: ; preds = %91
%107 = load float, float* %3
%108 = fcmp une float %107, -1.000000e+00
br i1 %108, label %109, label %110
109: ; preds = %106
store i32 5, i32* %1
br label %112
110: ; preds = %106
%111 = call i32 @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
store i32 0, i32* %1
br label %112
112: ; preds = %110, %109, %89, %65, %45, %18
%113 = load i32, i32* %1
ret i32 %113
}

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