#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*/ abort();
int main(void) {
  const int n = 1000;
  int i;
  double vresult, result, array[n];
  bool lvresult, lresult;
  for (i = 0; i < n; i++)
    array[i] = i;
  result = 0;
  vresult = 0;
#pragma acc parallel vector_length(vl) copy(result)
#pragma acc loop reduction(max : result)
  for (i = 0; i < n; i++)
    result = result > array[i] ? result : array[i];
  for (i = 0; i < n; i++)
    vresult = vresult > array[i] ? vresult : array[i];
  if (result != vresult)
    abort();
  result = 0;
  vresult = 0;
#pragma acc parallel vector_length(vl) copy(result)
#pragma acc loop reduction(min : result)
  for (i = 0; i < n; i++)
    result = result < array[i] ? result : array[i];
  for (i = 0; i < n; i++)
    vresult = vresult < array[i] ? vresult : array[i];
  if (result != vresult)
    abort();
  result = 5;
  vresult = 5;
  lresult = false;
  lvresult = false;
#pragma acc parallel vector_length(vl) copy(lresult)
#pragma acc loop reduction(&& : lresult)
  for (i = 0; i < n; i++)
    lresult = lresult && (result > array[i]);
  for (i = 0; i < n; i++)
    lvresult = lresult && (result > array[i]);
  if (lresult != lvresult)
    abort();
  result = 5;
  vresult = 5;
  lresult = false;
  lvresult = false;
#pragma acc parallel vector_length(vl) copy(lresult)
#pragma acc loop reduction(|| : lresult)
  for (i = 0; i < n; i++)
    lresult = lresult || (result > array[i]);
  for (i = 0; i < n; i++)
    lvresult = lresult || (result > array[i]);
  if (lresult != lvresult)
    abort();
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x1fa0,%rsp
movl   $0x0,-0x4(%rbp)
movl   $0x3e8,-0x8(%rbp)
mov    %rsp,%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    1164 <main+0x54>
cvtsi2sdl -0xc(%rbp),%xmm0
movslq -0xc(%rbp),%rax
movsd  %xmm0,-0x1f70(%rbp,%rax,8)
ff ff
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1137 <main+0x27>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    11e2 <main+0xd2>
movsd  -0x20(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
jbe    11b2 <main+0xa2>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x1f78(%rbp)
ff
jmp    11c7 <main+0xb7>
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x1f78(%rbp)
ff
movsd  -0x1f78(%rbp),%xmm0
ff
movsd  %xmm0,-0x20(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    117b <main+0x6b>
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    1250 <main+0x140>
movsd  -0x18(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
jbe    1220 <main+0x110>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x1f80(%rbp)
ff
jmp    1235 <main+0x125>
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x1f80(%rbp)
ff
movsd  -0x1f80(%rbp),%xmm0
ff
movsd  %xmm0,-0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    11e9 <main+0xd9>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jne    126b <main+0x15b>
jp     126b <main+0x15b>
jmp    1272 <main+0x162>
mov    $0x0,%al
call   1030 <abort@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    12f4 <main+0x1e4>
movsd  -0x20(%rbp),%xmm1
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
ucomisd %xmm1,%xmm0
jbe    12c4 <main+0x1b4>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x1f88(%rbp)
ff
jmp    12d9 <main+0x1c9>
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x1f88(%rbp)
ff
movsd  -0x1f88(%rbp),%xmm0
ff
movsd  %xmm0,-0x20(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1289 <main+0x179>
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    1366 <main+0x256>
movsd  -0x18(%rbp),%xmm1
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
ucomisd %xmm1,%xmm0
jbe    1336 <main+0x226>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x1f90(%rbp)
ff
jmp    134b <main+0x23b>
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x1f90(%rbp)
ff
movsd  -0x1f90(%rbp),%xmm0
ff
movsd  %xmm0,-0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    12fb <main+0x1eb>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jne    1381 <main+0x271>
jp     1381 <main+0x271>
jmp    1388 <main+0x278>
mov    $0x0,%al
call   1030 <abort@plt>
movsd  0xc70(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xc63(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    140d <main+0x2fd>
xor    %eax,%eax
cmpl   $0x0,-0x30(%rbp)
mov    %al,-0x1f91(%rbp)
je     13f1 <main+0x2e1>
movsd  -0x20(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
seta   %al
mov    %al,-0x1f91(%rbp)
mov    -0x1f91(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    13b7 <main+0x2a7>
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    146a <main+0x35a>
xor    %eax,%eax
cmpl   $0x0,-0x30(%rbp)
mov    %al,-0x1f92(%rbp)
je     144e <main+0x33e>
movsd  -0x20(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
seta   %al
mov    %al,-0x1f92(%rbp)
mov    -0x1f92(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1414 <main+0x304>
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
je     147d <main+0x36d>
mov    $0x0,%al
call   1030 <abort@plt>
movsd  0xb7b(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xb6e(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    1502 <main+0x3f2>
mov    $0x1,%al
cmpl   $0x0,-0x30(%rbp)
mov    %al,-0x1f93(%rbp)
jne    14e6 <main+0x3d6>
movsd  -0x20(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
seta   %al
mov    %al,-0x1f93(%rbp)
mov    -0x1f93(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    14ac <main+0x39c>
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    155f <main+0x44f>
mov    $0x1,%al
cmpl   $0x0,-0x30(%rbp)
mov    %al,-0x1f94(%rbp)
jne    1543 <main+0x433>
movsd  -0x20(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
seta   %al
mov    %al,-0x1f94(%rbp)
mov    -0x1f94(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1509 <main+0x3f9>
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
je     1572 <main+0x462>
mov    $0x0,%al
call   1030 <abort@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rsp
mov    -0x4(%rbp),%eax
add    $0x1fa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
sub    $0x1f48,%rsp
movdqa 0xee1(%rip),%xmm0
mov    $0x6,%eax
movdqa 0xee4(%rip),%xmm1
movdqa 0xeec(%rip),%xmm2
movdqa 0xef4(%rip),%xmm3
movdqa 0xefc(%rip),%xmm4
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqa %xmm0,%xmm5
cvtdq2pd %xmm0,%xmm6
paddd  %xmm1,%xmm5
cvtdq2pd %xmm5,%xmm5
movaps %xmm6,-0x30(%rsp,%rax,8)
movaps %xmm5,-0x20(%rsp,%rax,8)
movdqa %xmm0,%xmm5
paddd  %xmm2,%xmm5
movdqa %xmm0,%xmm6
cvtdq2pd %xmm5,%xmm5
paddd  %xmm3,%xmm6
cvtdq2pd %xmm6,%xmm6
movaps %xmm5,-0x10(%rsp,%rax,8)
movaps %xmm6,(%rsp,%rax,8)
paddd  %xmm4,%xmm0
add    $0x8,%rax
cmp    $0x3ee,%rax
jne    1150 <main+0x40>
pxor   %xmm0,%xmm0
mov    $0x4,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
maxsd  -0x20(%rsp,%rax,8),%xmm0
maxsd  -0x18(%rsp,%rax,8),%xmm0
maxsd  -0x10(%rsp,%rax,8),%xmm0
maxsd  -0x8(%rsp,%rax,8),%xmm0
maxsd  (%rsp,%rax,8),%xmm0
add    $0x5,%rax
cmp    $0x3ec,%rax
jne    11b0 <main+0xa0>
pxor   %xmm1,%xmm1
mov    $0x4,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
maxsd  -0x20(%rsp,%rax,8),%xmm1
maxsd  -0x18(%rsp,%rax,8),%xmm1
maxsd  -0x10(%rsp,%rax,8),%xmm1
maxsd  -0x8(%rsp,%rax,8),%xmm1
maxsd  (%rsp,%rax,8),%xmm1
add    $0x5,%rax
cmp    $0x3ec,%rax
jne    11f0 <main+0xe0>
ucomisd %xmm1,%xmm0
jne    1332 <main+0x222>
jp     1332 <main+0x222>
xorpd  %xmm0,%xmm0
mov    $0x4,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
minsd  -0x20(%rsp,%rax,8),%xmm0
minsd  -0x18(%rsp,%rax,8),%xmm0
minsd  -0x10(%rsp,%rax,8),%xmm0
minsd  -0x8(%rsp,%rax,8),%xmm0
minsd  (%rsp,%rax,8),%xmm0
add    $0x5,%rax
cmp    $0x3ec,%rax
jne    1240 <main+0x130>
xorpd  %xmm1,%xmm1
mov    $0x4,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
minsd  -0x20(%rsp,%rax,8),%xmm1
minsd  -0x18(%rsp,%rax,8),%xmm1
minsd  -0x10(%rsp,%rax,8),%xmm1
minsd  -0x8(%rsp,%rax,8),%xmm1
minsd  (%rsp,%rax,8),%xmm1
add    $0x5,%rax
cmp    $0x3ec,%rax
jne    1280 <main+0x170>
ucomisd %xmm1,%xmm0
jne    1332 <main+0x222>
jp     1332 <main+0x222>
xor    %ecx,%ecx
mov    $0x1,%edx
movsd  0xd88(%rip),%xmm0
jmp    12e0 <main+0x1d0>
nopw   0x0(%rax,%rax,1)
movzbl %al,%ecx
add    $0x2,%rdx
cmp    $0x3e9,%rdx
je     12f8 <main+0x1e8>
mov    $0x1,%al
test   %ecx,%ecx
jne    12d0 <main+0x1c0>
ucomisd -0x8(%rsp,%rdx,8),%xmm0
ja     12d0 <main+0x1c0>
ucomisd (%rsp,%rdx,8),%xmm0
seta   %al
jmp    12d0 <main+0x1c0>
xor    %edx,%edx
jmp    130d <main+0x1fd>
nopl   0x0(%rax)
cmp    $0x3e7,%rdx
je     131c <main+0x20c>
add    $0x1,%rdx
test   %ecx,%ecx
je     1300 <main+0x1f0>
cmp    $0x3e7,%rdx
jne    1309 <main+0x1f9>
jmp    1328 <main+0x218>
ucomisd (%rsp,%rdx,8),%xmm0
setbe  %cl
xor    %al,%cl
je     1332 <main+0x222>
xor    %eax,%eax
add    $0x1f48,%rsp
ret
xor    %eax,%eax
call   1030 <abort@plt>

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca i32
%4 = alloca double
%5 = alloca double
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
store i32 0, i32* %1
store i32 1000, i32* %2
%9 = call i8* @llvm.stacksave()
store i8* %9, i8** %6
%10 = alloca double, i64 1000
store i32 0, i32* %3
br label %11
11: ; preds = %20, %0
%12 = load i32, i32* %3
%13 = icmp slt i32 %12, 1000
br i1 %13, label %14, label %23
14: ; preds = %11
%15 = load i32, i32* %3
%16 = sitofp i32 %15 to double
%17 = load i32, i32* %3
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds double, double* %10, i64 %18
store double %16, double* %19
br label %20
20: ; preds = %14
%21 = load i32, i32* %3
%22 = add nsw i32 %21, 1
store i32 %22, i32* %3
br label %11
23: ; preds = %11
store double 0.000000e+00, double* %5
store double 0.000000e+00, double* %4
store i32 0, i32* %3
br label %24
24: ; preds = %43, %23
%25 = load i32, i32* %3
%26 = icmp slt i32 %25, 1000
br i1 %26, label %27, label %46
27: ; preds = %24
%28 = load double, double* %5
%29 = load i32, i32* %3
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds double, double* %10, i64 %30
%32 = load double, double* %31
%33 = fcmp ogt double %28, %32
br i1 %33, label %34, label %36
34: ; preds = %27
%35 = load double, double* %5
br label %41
36: ; preds = %27
%37 = load i32, i32* %3
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds double, double* %10, i64 %38
%40 = load double, double* %39
br label %41
41: ; preds = %36, %34
%42 = phi double [ %35, %34 ], [ %40, %36 ]
store double %42, double* %5
br label %43
43: ; preds = %41
%44 = load i32, i32* %3
%45 = add nsw i32 %44, 1
store i32 %45, i32* %3
br label %24
46: ; preds = %24
store i32 0, i32* %3
br label %47
47: ; preds = %66, %46
%48 = load i32, i32* %3
%49 = icmp slt i32 %48, 1000
br i1 %49, label %50, label %69
50: ; preds = %47
%51 = load double, double* %4
%52 = load i32, i32* %3
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds double, double* %10, i64 %53
%55 = load double, double* %54
%56 = fcmp ogt double %51, %55
br i1 %56, label %57, label %59
57: ; preds = %50
%58 = load double, double* %4
br label %64
59: ; preds = %50
%60 = load i32, i32* %3
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds double, double* %10, i64 %61
%63 = load double, double* %62
br label %64
64: ; preds = %59, %57
%65 = phi double [ %58, %57 ], [ %63, %59 ]
store double %65, double* %4
br label %66
66: ; preds = %64
%67 = load i32, i32* %3
%68 = add nsw i32 %67, 1
store i32 %68, i32* %3
br label %47
69: ; preds = %47
%70 = load double, double* %5
%71 = load double, double* %4
%72 = fcmp une double %70, %71
br i1 %72, label %73, label %75
73: ; preds = %69
%74 = call i32 (...) @abort()
unreachable
75: ; preds = %69
store double 0.000000e+00, double* %5
store double 0.000000e+00, double* %4
store i32 0, i32* %3
br label %76
76: ; preds = %95, %75
%77 = load i32, i32* %3
%78 = icmp slt i32 %77, 1000
br i1 %78, label %79, label %98
79: ; preds = %76
%80 = load double, double* %5
%81 = load i32, i32* %3
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds double, double* %10, i64 %82
%84 = load double, double* %83
%85 = fcmp olt double %80, %84
br i1 %85, label %86, label %88
86: ; preds = %79
%87 = load double, double* %5
br label %93
88: ; preds = %79
%89 = load i32, i32* %3
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds double, double* %10, i64 %90
%92 = load double, double* %91
br label %93
93: ; preds = %88, %86
%94 = phi double [ %87, %86 ], [ %92, %88 ]
store double %94, double* %5
br label %95
95: ; preds = %93
%96 = load i32, i32* %3
%97 = add nsw i32 %96, 1
store i32 %97, i32* %3
br label %76
98: ; preds = %76
store i32 0, i32* %3
br label %99
99: ; preds = %118, %98
%100 = load i32, i32* %3
%101 = icmp slt i32 %100, 1000
br i1 %101, label %102, label %121
102: ; preds = %99
%103 = load double, double* %4
%104 = load i32, i32* %3
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds double, double* %10, i64 %105
%107 = load double, double* %106
%108 = fcmp olt double %103, %107
br i1 %108, label %109, label %111
109: ; preds = %102
%110 = load double, double* %4
br label %116
111: ; preds = %102
%112 = load i32, i32* %3
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds double, double* %10, i64 %113
%115 = load double, double* %114
br label %116
116: ; preds = %111, %109
%117 = phi double [ %110, %109 ], [ %115, %111 ]
store double %117, double* %4
br label %118
118: ; preds = %116
%119 = load i32, i32* %3
%120 = add nsw i32 %119, 1
store i32 %120, i32* %3
br label %99
121: ; preds = %99
%122 = load double, double* %5
%123 = load double, double* %4
%124 = fcmp une double %122, %123
br i1 %124, label %125, label %127
125: ; preds = %121
%126 = call i32 (...) @abort()
unreachable
127: ; preds = %121
store double 5.000000e+00, double* %5
store double 5.000000e+00, double* %4
store i32 0, i32* %8
store i32 0, i32* %7
store i32 0, i32* %3
br label %128
128: ; preds = %144, %127
%129 = load i32, i32* %3
%130 = icmp slt i32 %129, 1000
br i1 %130, label %131, label %147
131: ; preds = %128
%132 = load i32, i32* %8
%133 = icmp ne i32 %132, 0
br i1 %133, label %134, label %141
134: ; preds = %131
%135 = load double, double* %5
%136 = load i32, i32* %3
%137 = sext i32 %136 to i64
%138 = getelementptr inbounds double, double* %10, i64 %137
%139 = load double, double* %138
%140 = fcmp ogt double %135, %139
br label %141
141: ; preds = %134, %131
%142 = phi i1 [ false, %131 ], [ %140, %134 ]
%143 = zext i1 %142 to i32
store i32 %143, i32* %8
br label %144
144: ; preds = %141
%145 = load i32, i32* %3
%146 = add nsw i32 %145, 1
store i32 %146, i32* %3
br label %128
147: ; preds = %128
store i32 0, i32* %3
br label %148
148: ; preds = %164, %147
%149 = load i32, i32* %3
%150 = icmp slt i32 %149, 1000
br i1 %150, label %151, label %167
151: ; preds = %148
%152 = load i32, i32* %8
%153 = icmp ne i32 %152, 0
br i1 %153, label %154, label %161
154: ; preds = %151
%155 = load double, double* %5
%156 = load i32, i32* %3
%157 = sext i32 %156 to i64
%158 = getelementptr inbounds double, double* %10, i64 %157
%159 = load double, double* %158
%160 = fcmp ogt double %155, %159
br label %161
161: ; preds = %154, %151
%162 = phi i1 [ false, %151 ], [ %160, %154 ]
%163 = zext i1 %162 to i32
store i32 %163, i32* %7
br label %164
164: ; preds = %161
%165 = load i32, i32* %3
%166 = add nsw i32 %165, 1
store i32 %166, i32* %3
br label %148
167: ; preds = %148
%168 = load i32, i32* %8
%169 = load i32, i32* %7
%170 = icmp ne i32 %168, %169
br i1 %170, label %171, label %173
171: ; preds = %167
%172 = call i32 (...) @abort()
unreachable
173: ; preds = %167
store double 5.000000e+00, double* %5
store double 5.000000e+00, double* %4
store i32 0, i32* %8
store i32 0, i32* %7
store i32 0, i32* %3
br label %174
174: ; preds = %190, %173
%175 = load i32, i32* %3
%176 = icmp slt i32 %175, 1000
br i1 %176, label %177, label %193
177: ; preds = %174
%178 = load i32, i32* %8
%179 = icmp ne i32 %178, 0
br i1 %179, label %187, label %180
180: ; preds = %177
%181 = load double, double* %5
%182 = load i32, i32* %3
%183 = sext i32 %182 to i64
%184 = getelementptr inbounds double, double* %10, i64 %183
%185 = load double, double* %184
%186 = fcmp ogt double %181, %185
br label %187
187: ; preds = %180, %177
%188 = phi i1 [ true, %177 ], [ %186, %180 ]
%189 = zext i1 %188 to i32
store i32 %189, i32* %8
br label %190
190: ; preds = %187
%191 = load i32, i32* %3
%192 = add nsw i32 %191, 1
store i32 %192, i32* %3
br label %174
193: ; preds = %174
store i32 0, i32* %3
br label %194
194: ; preds = %210, %193
%195 = load i32, i32* %3
%196 = icmp slt i32 %195, 1000
br i1 %196, label %197, label %213
197: ; preds = %194
%198 = load i32, i32* %8
%199 = icmp ne i32 %198, 0
br i1 %199, label %207, label %200
200: ; preds = %197
%201 = load double, double* %5
%202 = load i32, i32* %3
%203 = sext i32 %202 to i64
%204 = getelementptr inbounds double, double* %10, i64 %203
%205 = load double, double* %204
%206 = fcmp ogt double %201, %205
br label %207
207: ; preds = %200, %197
%208 = phi i1 [ true, %197 ], [ %206, %200 ]
%209 = zext i1 %208 to i32
store i32 %209, i32* %7
br label %210
210: ; preds = %207
%211 = load i32, i32* %3
%212 = add nsw i32 %211, 1
store i32 %212, i32* %3
br label %194
213: ; preds = %194
%214 = load i32, i32* %8
%215 = load i32, i32* %7
%216 = icmp ne i32 %214, %215
br i1 %216, label %217, label %219
217: ; preds = %213
%218 = call i32 (...) @abort()
unreachable
219: ; preds = %213
store i32 0, i32* %1
%220 = load i8*, i8** %6
%221 = load i32, i32* %1
ret i32 %221
}

LLVM IR (-O2):
define i32 @main() {
%1 = alloca [1000 x double]
br label %2
2: ; preds = %2, %0
%3 = phi i64 [ 0, %0 ], [ %21, %2 ]
%4 = phi <2 x i32> [ <i32 0, i32 1>, %0 ], [ %22, %2 ]
%5 = add <2 x i32> %4, <i32 2, i32 2>
%6 = sitofp <2 x i32> %4 to <2 x double>
%7 = sitofp <2 x i32> %5 to <2 x double>
%8 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %3
%9 = bitcast double* %8 to <2 x double>*
store <2 x double> %6, <2 x double>* %9
%10 = getelementptr inbounds double, double* %8, i64 2
%11 = bitcast double* %10 to <2 x double>*
store <2 x double> %7, <2 x double>* %11
%12 = or i64 %3, 4
%13 = add <2 x i32> %4, <i32 4, i32 4>
%14 = add <2 x i32> %4, <i32 6, i32 6>
%15 = sitofp <2 x i32> %13 to <2 x double>
%16 = sitofp <2 x i32> %14 to <2 x double>
%17 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %12
%18 = bitcast double* %17 to <2 x double>*
store <2 x double> %15, <2 x double>* %18
%19 = getelementptr inbounds double, double* %17, i64 2
%20 = bitcast double* %19 to <2 x double>*
store <2 x double> %16, <2 x double>* %20
%21 = add nuw nsw i64 %3, 8
%22 = add <2 x i32> %4, <i32 8, i32 8>
%23 = icmp eq i64 %21, 1000
br i1 %23, label %24, label %2
24: ; preds = %2, %24
%25 = phi i64 [ %51, %24 ], [ 0, %2 ]
%26 = phi double [ %50, %24 ], [ 0.000000e+00, %2 ]
%27 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %25
%28 = load double, double* %27
%29 = fcmp ogt double %26, %28
%30 = select i1 %29, double %26, double %28
%31 = add nuw nsw i64 %25, 1
%32 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %31
%33 = load double, double* %32
%34 = fcmp ogt double %30, %33
%35 = select i1 %34, double %30, double %33
%36 = add nuw nsw i64 %25, 2
%37 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %36
%38 = load double, double* %37
%39 = fcmp ogt double %35, %38
%40 = select i1 %39, double %35, double %38
%41 = add nuw nsw i64 %25, 3
%42 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %41
%43 = load double, double* %42
%44 = fcmp ogt double %40, %43
%45 = select i1 %44, double %40, double %43
%46 = add nuw nsw i64 %25, 4
%47 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %46
%48 = load double, double* %47
%49 = fcmp ogt double %45, %48
%50 = select i1 %49, double %45, double %48
%51 = add nuw nsw i64 %25, 5
%52 = icmp eq i64 %51, 1000
br i1 %52, label %53, label %24
53: ; preds = %24, %53
%54 = phi i64 [ %80, %53 ], [ 0, %24 ]
%55 = phi double [ %79, %53 ], [ 0.000000e+00, %24 ]
%56 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %54
%57 = load double, double* %56
%58 = fcmp ogt double %55, %57
%59 = select i1 %58, double %55, double %57
%60 = add nuw nsw i64 %54, 1
%61 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %60
%62 = load double, double* %61
%63 = fcmp ogt double %59, %62
%64 = select i1 %63, double %59, double %62
%65 = add nuw nsw i64 %54, 2
%66 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %65
%67 = load double, double* %66
%68 = fcmp ogt double %64, %67
%69 = select i1 %68, double %64, double %67
%70 = add nuw nsw i64 %54, 3
%71 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %70
%72 = load double, double* %71
%73 = fcmp ogt double %69, %72
%74 = select i1 %73, double %69, double %72
%75 = add nuw nsw i64 %54, 4
%76 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %75
%77 = load double, double* %76
%78 = fcmp ogt double %74, %77
%79 = select i1 %78, double %74, double %77
%80 = add nuw nsw i64 %54, 5
%81 = icmp eq i64 %80, 1000
br i1 %81, label %82, label %53
82: ; preds = %53
%83 = fcmp une double %50, %79
br i1 %83, label %84, label %86
84: ; preds = %82
%85 = tail call i32 (...) @abort()
unreachable
86: ; preds = %82, %86
%87 = phi i64 [ %113, %86 ], [ 0, %82 ]
%88 = phi double [ %112, %86 ], [ 0.000000e+00, %82 ]
%89 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %87
%90 = load double, double* %89
%91 = fcmp olt double %88, %90
%92 = select i1 %91, double %88, double %90
%93 = add nuw nsw i64 %87, 1
%94 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %93
%95 = load double, double* %94
%96 = fcmp olt double %92, %95
%97 = select i1 %96, double %92, double %95
%98 = add nuw nsw i64 %87, 2
%99 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %98
%100 = load double, double* %99
%101 = fcmp olt double %97, %100
%102 = select i1 %101, double %97, double %100
%103 = add nuw nsw i64 %87, 3
%104 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %103
%105 = load double, double* %104
%106 = fcmp olt double %102, %105
%107 = select i1 %106, double %102, double %105
%108 = add nuw nsw i64 %87, 4
%109 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %108
%110 = load double, double* %109
%111 = fcmp olt double %107, %110
%112 = select i1 %111, double %107, double %110
%113 = add nuw nsw i64 %87, 5
%114 = icmp eq i64 %113, 1000
br i1 %114, label %115, label %86
115: ; preds = %86, %115
%116 = phi i64 [ %142, %115 ], [ 0, %86 ]
%117 = phi double [ %141, %115 ], [ 0.000000e+00, %86 ]
%118 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %116
%119 = load double, double* %118
%120 = fcmp olt double %117, %119
%121 = select i1 %120, double %117, double %119
%122 = add nuw nsw i64 %116, 1
%123 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %122
%124 = load double, double* %123
%125 = fcmp olt double %121, %124
%126 = select i1 %125, double %121, double %124
%127 = add nuw nsw i64 %116, 2
%128 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %127
%129 = load double, double* %128
%130 = fcmp olt double %126, %129
%131 = select i1 %130, double %126, double %129
%132 = add nuw nsw i64 %116, 3
%133 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %132
%134 = load double, double* %133
%135 = fcmp olt double %131, %134
%136 = select i1 %135, double %131, double %134
%137 = add nuw nsw i64 %116, 4
%138 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %137
%139 = load double, double* %138
%140 = fcmp olt double %136, %139
%141 = select i1 %140, double %136, double %139
%142 = add nuw nsw i64 %116, 5
%143 = icmp eq i64 %142, 1000
br i1 %143, label %144, label %115
144: ; preds = %115
%145 = fcmp une double %112, %141
br i1 %145, label %146, label %148
146: ; preds = %144
%147 = tail call i32 (...) @abort()
unreachable
148: ; preds = %144, %161
%149 = phi i64 [ %164, %161 ], [ 0, %144 ]
%150 = phi i32 [ %163, %161 ], [ 0, %144 ]
%151 = icmp eq i32 %150, 0
br i1 %151, label %152, label %161
152: ; preds = %148
%153 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %149
%154 = load double, double* %153
%155 = fcmp olt double %154, 5.000000e+00
br i1 %155, label %161, label %156
156: ; preds = %152
%157 = or i64 %149, 1
%158 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %157
%159 = load double, double* %158
%160 = fcmp olt double %159, 5.000000e+00
br label %161
161: ; preds = %148, %156, %152
%162 = phi i1 [ true, %152 ], [ %160, %156 ], [ true, %148 ]
%163 = zext i1 %162 to i32
%164 = add nuw nsw i64 %149, 2
%165 = icmp eq i64 %164, 1000
br i1 %165, label %166, label %148
166: ; preds = %161, %171
%167 = phi i64 [ %168, %171 ], [ 0, %161 ]
%168 = add nuw nsw i64 %167, 1
%169 = icmp eq i64 %168, 1000
br i1 %162, label %172, label %170
170: ; preds = %166
br i1 %169, label %173, label %171
171: ; preds = %170, %172
br label %166
172: ; preds = %166
br i1 %169, label %180, label %171
173: ; preds = %170
%174 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %167
%175 = load double, double* %174
%176 = fcmp uge double %175, 5.000000e+00
%177 = xor i1 %176, %162
br i1 %177, label %180, label %178
178: ; preds = %173
%179 = tail call i32 (...) @abort()
unreachable
180: ; preds = %172, %173
ret i32 0
}