#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();
double fabs(double);
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)
#pragma acc loop reduction(+ : result)
  for (i = 0; i < n; i++)
    result += array[i];
  for (i = 0; i < n; i++)
    vresult += array[i];
  if (result != vresult)
    abort();
  result = 0;
  vresult = 0;
#pragma acc parallel vector_length(vl)
#pragma acc loop reduction(* : result)
  for (i = 0; i < n; i++)
    result *= array[i];
  for (i = 0; i < n; i++)
    vresult *= array[i];
  if (fabs(result - vresult) > .0001)
    abort();
  result = 5;
  vresult = 5;
  lresult = false;
  lvresult = false;
#pragma acc parallel vector_length(vl)
#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)
#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    $0x1f80,%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    11ad <main+0x9d>
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
addsd  -0x20(%rbp),%xmm0
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    11e6 <main+0xd6>
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    11b4 <main+0xa4>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jne    1201 <main+0xf1>
jp     1201 <main+0xf1>
jmp    1208 <main+0xf8>
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    1251 <main+0x141>
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    121f <main+0x10f>
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    128a <main+0x17a>
movslq -0xc(%rbp),%rax
movsd  -0x1f70(%rbp,%rax,8),%xmm0
ff ff
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1258 <main+0x148>
movsd  -0x20(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movaps 0xd75(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  0xd59(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    12b8 <main+0x1a8>
mov    $0x0,%al
call   1030 <abort@plt>
movsd  0xd48(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xd3b(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    133d <main+0x22d>
xor    %eax,%eax
cmpl   $0x0,-0x30(%rbp)
mov    %al,-0x1f71(%rbp)
je     1321 <main+0x211>
movsd  -0x20(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
seta   %al
mov    %al,-0x1f71(%rbp)
mov    -0x1f71(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    12e7 <main+0x1d7>
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    139a <main+0x28a>
xor    %eax,%eax
cmpl   $0x0,-0x30(%rbp)
mov    %al,-0x1f72(%rbp)
je     137e <main+0x26e>
movsd  -0x20(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
seta   %al
mov    %al,-0x1f72(%rbp)
mov    -0x1f72(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1344 <main+0x234>
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
je     13ad <main+0x29d>
mov    $0x0,%al
call   1030 <abort@plt>
movsd  0xc53(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xc46(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    1432 <main+0x322>
mov    $0x1,%al
cmpl   $0x0,-0x30(%rbp)
mov    %al,-0x1f73(%rbp)
jne    1416 <main+0x306>
movsd  -0x20(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
seta   %al
mov    %al,-0x1f73(%rbp)
mov    -0x1f73(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    13dc <main+0x2cc>
movl   $0x0,-0xc(%rbp)
cmpl   $0x3e8,-0xc(%rbp)
jge    148f <main+0x37f>
mov    $0x1,%al
cmpl   $0x0,-0x30(%rbp)
mov    %al,-0x1f74(%rbp)
jne    1473 <main+0x363>
movsd  -0x20(%rbp),%xmm0
movslq -0xc(%rbp),%rax
ucomisd -0x1f70(%rbp,%rax,8),%xmm0
ff ff
seta   %al
mov    %al,-0x1f74(%rbp)
mov    -0x1f74(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1439 <main+0x329>
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
je     14a2 <main+0x392>
mov    $0x0,%al
call   1030 <abort@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rsp
mov    -0x4(%rbp),%eax
add    $0x1f80,%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    $0x7,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
addsd  -0x38(%rsp,%rax,8),%xmm0
addsd  -0x30(%rsp,%rax,8),%xmm0
addsd  -0x28(%rsp,%rax,8),%xmm0
addsd  -0x20(%rsp,%rax,8),%xmm0
addsd  -0x18(%rsp,%rax,8),%xmm0
addsd  -0x10(%rsp,%rax,8),%xmm0
addsd  -0x8(%rsp,%rax,8),%xmm0
addsd  (%rsp,%rax,8),%xmm0
add    $0x8,%rax
cmp    $0x3ef,%rax
jne    11b0 <main+0xa0>
pxor   %xmm1,%xmm1
mov    $0x7,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
addsd  -0x38(%rsp,%rax,8),%xmm1
addsd  -0x30(%rsp,%rax,8),%xmm1
addsd  -0x28(%rsp,%rax,8),%xmm1
addsd  -0x20(%rsp,%rax,8),%xmm1
addsd  -0x18(%rsp,%rax,8),%xmm1
addsd  -0x10(%rsp,%rax,8),%xmm1
addsd  -0x8(%rsp,%rax,8),%xmm1
addsd  (%rsp,%rax,8),%xmm1
add    $0x8,%rax
cmp    $0x3ef,%rax
jne    1200 <main+0xf0>
ucomisd %xmm1,%xmm0
jne    1382 <main+0x272>
jp     1382 <main+0x272>
xorpd  %xmm0,%xmm0
mov    $0x7,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mulsd  -0x38(%rsp,%rax,8),%xmm0
mulsd  -0x30(%rsp,%rax,8),%xmm0
mulsd  -0x28(%rsp,%rax,8),%xmm0
mulsd  -0x20(%rsp,%rax,8),%xmm0
mulsd  -0x18(%rsp,%rax,8),%xmm0
mulsd  -0x10(%rsp,%rax,8),%xmm0
mulsd  -0x8(%rsp,%rax,8),%xmm0
mulsd  (%rsp,%rax,8),%xmm0
add    $0x8,%rax
cmp    $0x3ef,%rax
jne    1260 <main+0x150>
xorpd  %xmm1,%xmm1
mov    $0x7,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mulsd  -0x38(%rsp,%rax,8),%xmm1
mulsd  -0x30(%rsp,%rax,8),%xmm1
mulsd  -0x28(%rsp,%rax,8),%xmm1
mulsd  -0x20(%rsp,%rax,8),%xmm1
mulsd  -0x18(%rsp,%rax,8),%xmm1
mulsd  -0x10(%rsp,%rax,8),%xmm1
mulsd  -0x8(%rsp,%rax,8),%xmm1
mulsd  (%rsp,%rax,8),%xmm1
add    $0x8,%rax
cmp    $0x3ef,%rax
jne    12b0 <main+0x1a0>
subsd  %xmm1,%xmm0
andpd  0xd59(%rip),%xmm0
ucomisd 0xd61(%rip),%xmm0
ja     1382 <main+0x272>
xor    %ecx,%ecx
mov    $0x1,%edx
movsd  0xd54(%rip),%xmm0
jmp    1330 <main+0x220>
cs nopw 0x0(%rax,%rax,1)
movzbl %al,%ecx
add    $0x2,%rdx
cmp    $0x3e9,%rdx
je     1348 <main+0x238>
mov    $0x1,%al
test   %ecx,%ecx
jne    1320 <main+0x210>
ucomisd -0x8(%rsp,%rdx,8),%xmm0
ja     1320 <main+0x210>
ucomisd (%rsp,%rdx,8),%xmm0
seta   %al
jmp    1320 <main+0x210>
xor    %edx,%edx
jmp    135d <main+0x24d>
nopl   0x0(%rax)
cmp    $0x3e7,%rdx
je     136c <main+0x25c>
add    $0x1,%rdx
test   %ecx,%ecx
je     1350 <main+0x240>
cmp    $0x3e7,%rdx
jne    1359 <main+0x249>
jmp    1378 <main+0x268>
ucomisd (%rsp,%rdx,8),%xmm0
setbe  %cl
xor    %al,%cl
je     1382 <main+0x272>
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 = %34, %23
%25 = load i32, i32* %3
%26 = icmp slt i32 %25, 1000
br i1 %26, label %27, label %37
27: ; preds = %24
%28 = load i32, i32* %3
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds double, double* %10, i64 %29
%31 = load double, double* %30
%32 = load double, double* %5
%33 = fadd double %32, %31
store double %33, double* %5
br label %34
34: ; preds = %27
%35 = load i32, i32* %3
%36 = add nsw i32 %35, 1
store i32 %36, i32* %3
br label %24
37: ; preds = %24
store i32 0, i32* %3
br label %38
38: ; preds = %48, %37
%39 = load i32, i32* %3
%40 = icmp slt i32 %39, 1000
br i1 %40, label %41, label %51
41: ; preds = %38
%42 = load i32, i32* %3
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds double, double* %10, i64 %43
%45 = load double, double* %44
%46 = load double, double* %4
%47 = fadd double %46, %45
store double %47, double* %4
br label %48
48: ; preds = %41
%49 = load i32, i32* %3
%50 = add nsw i32 %49, 1
store i32 %50, i32* %3
br label %38
51: ; preds = %38
%52 = load double, double* %5
%53 = load double, double* %4
%54 = fcmp une double %52, %53
br i1 %54, label %55, label %57
55: ; preds = %51
%56 = call i32 (...) @abort()
unreachable
57: ; preds = %51
store double 0.000000e+00, double* %5
store double 0.000000e+00, double* %4
store i32 0, i32* %3
br label %58
58: ; preds = %68, %57
%59 = load i32, i32* %3
%60 = icmp slt i32 %59, 1000
br i1 %60, label %61, label %71
61: ; preds = %58
%62 = load i32, i32* %3
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds double, double* %10, i64 %63
%65 = load double, double* %64
%66 = load double, double* %5
%67 = fmul double %66, %65
store double %67, double* %5
br label %68
68: ; preds = %61
%69 = load i32, i32* %3
%70 = add nsw i32 %69, 1
store i32 %70, i32* %3
br label %58
71: ; preds = %58
store i32 0, i32* %3
br label %72
72: ; preds = %82, %71
%73 = load i32, i32* %3
%74 = icmp slt i32 %73, 1000
br i1 %74, label %75, label %85
75: ; preds = %72
%76 = load i32, i32* %3
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds double, double* %10, i64 %77
%79 = load double, double* %78
%80 = load double, double* %4
%81 = fmul double %80, %79
store double %81, double* %4
br label %82
82: ; preds = %75
%83 = load i32, i32* %3
%84 = add nsw i32 %83, 1
store i32 %84, i32* %3
br label %72
85: ; preds = %72
%86 = load double, double* %5
%87 = load double, double* %4
%88 = fsub double %86, %87
%89 = call double @llvm.fabs.f64(double %88)
%90 = fcmp ogt double %89, 1.000000e-04
br i1 %90, label %91, label %93
91: ; preds = %85
%92 = call i32 (...) @abort()
unreachable
93: ; preds = %85
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 %94
94: ; preds = %110, %93
%95 = load i32, i32* %3
%96 = icmp slt i32 %95, 1000
br i1 %96, label %97, label %113
97: ; preds = %94
%98 = load i32, i32* %8
%99 = icmp ne i32 %98, 0
br i1 %99, label %100, label %107
100: ; preds = %97
%101 = load double, double* %5
%102 = load i32, i32* %3
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds double, double* %10, i64 %103
%105 = load double, double* %104
%106 = fcmp ogt double %101, %105
br label %107
107: ; preds = %100, %97
%108 = phi i1 [ false, %97 ], [ %106, %100 ]
%109 = zext i1 %108 to i32
store i32 %109, i32* %8
br label %110
110: ; preds = %107
%111 = load i32, i32* %3
%112 = add nsw i32 %111, 1
store i32 %112, i32* %3
br label %94
113: ; preds = %94
store i32 0, i32* %3
br label %114
114: ; preds = %130, %113
%115 = load i32, i32* %3
%116 = icmp slt i32 %115, 1000
br i1 %116, label %117, label %133
117: ; preds = %114
%118 = load i32, i32* %8
%119 = icmp ne i32 %118, 0
br i1 %119, label %120, label %127
120: ; preds = %117
%121 = load double, double* %5
%122 = load i32, i32* %3
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds double, double* %10, i64 %123
%125 = load double, double* %124
%126 = fcmp ogt double %121, %125
br label %127
127: ; preds = %120, %117
%128 = phi i1 [ false, %117 ], [ %126, %120 ]
%129 = zext i1 %128 to i32
store i32 %129, i32* %7
br label %130
130: ; preds = %127
%131 = load i32, i32* %3
%132 = add nsw i32 %131, 1
store i32 %132, i32* %3
br label %114
133: ; preds = %114
%134 = load i32, i32* %8
%135 = load i32, i32* %7
%136 = icmp ne i32 %134, %135
br i1 %136, label %137, label %139
137: ; preds = %133
%138 = call i32 (...) @abort()
unreachable
139: ; preds = %133
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 %140
140: ; preds = %156, %139
%141 = load i32, i32* %3
%142 = icmp slt i32 %141, 1000
br i1 %142, label %143, label %159
143: ; preds = %140
%144 = load i32, i32* %8
%145 = icmp ne i32 %144, 0
br i1 %145, label %153, label %146
146: ; preds = %143
%147 = load double, double* %5
%148 = load i32, i32* %3
%149 = sext i32 %148 to i64
%150 = getelementptr inbounds double, double* %10, i64 %149
%151 = load double, double* %150
%152 = fcmp ogt double %147, %151
br label %153
153: ; preds = %146, %143
%154 = phi i1 [ true, %143 ], [ %152, %146 ]
%155 = zext i1 %154 to i32
store i32 %155, i32* %8
br label %156
156: ; preds = %153
%157 = load i32, i32* %3
%158 = add nsw i32 %157, 1
store i32 %158, i32* %3
br label %140
159: ; preds = %140
store i32 0, i32* %3
br label %160
160: ; preds = %176, %159
%161 = load i32, i32* %3
%162 = icmp slt i32 %161, 1000
br i1 %162, label %163, label %179
163: ; preds = %160
%164 = load i32, i32* %8
%165 = icmp ne i32 %164, 0
br i1 %165, label %173, label %166
166: ; preds = %163
%167 = load double, double* %5
%168 = load i32, i32* %3
%169 = sext i32 %168 to i64
%170 = getelementptr inbounds double, double* %10, i64 %169
%171 = load double, double* %170
%172 = fcmp ogt double %167, %171
br label %173
173: ; preds = %166, %163
%174 = phi i1 [ true, %163 ], [ %172, %166 ]
%175 = zext i1 %174 to i32
store i32 %175, i32* %7
br label %176
176: ; preds = %173
%177 = load i32, i32* %3
%178 = add nsw i32 %177, 1
store i32 %178, i32* %3
br label %160
179: ; preds = %160
%180 = load i32, i32* %8
%181 = load i32, i32* %7
%182 = icmp ne i32 %180, %181
br i1 %182, label %183, label %185
183: ; preds = %179
%184 = call i32 (...) @abort()
unreachable
185: ; preds = %179
store i32 0, i32* %1
%186 = load i8*, i8** %6
%187 = load i32, i32* %1
ret i32 %187
}

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 [ %58, %24 ], [ 0, %2 ]
%26 = phi double [ %57, %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 = fadd double %26, %28
%30 = or i64 %25, 1
%31 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %30
%32 = load double, double* %31
%33 = fadd double %29, %32
%34 = or i64 %25, 2
%35 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %34
%36 = load double, double* %35
%37 = fadd double %33, %36
%38 = or i64 %25, 3
%39 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %38
%40 = load double, double* %39
%41 = fadd double %37, %40
%42 = or i64 %25, 4
%43 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %42
%44 = load double, double* %43
%45 = fadd double %41, %44
%46 = or i64 %25, 5
%47 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %46
%48 = load double, double* %47
%49 = fadd double %45, %48
%50 = or i64 %25, 6
%51 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %50
%52 = load double, double* %51
%53 = fadd double %49, %52
%54 = or i64 %25, 7
%55 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %54
%56 = load double, double* %55
%57 = fadd double %53, %56
%58 = add nuw nsw i64 %25, 8
%59 = icmp eq i64 %58, 1000
br i1 %59, label %60, label %24
60: ; preds = %24, %60
%61 = phi i64 [ %94, %60 ], [ 0, %24 ]
%62 = phi double [ %93, %60 ], [ 0.000000e+00, %24 ]
%63 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %61
%64 = load double, double* %63
%65 = fadd double %62, %64
%66 = or i64 %61, 1
%67 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %66
%68 = load double, double* %67
%69 = fadd double %65, %68
%70 = or i64 %61, 2
%71 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %70
%72 = load double, double* %71
%73 = fadd double %69, %72
%74 = or i64 %61, 3
%75 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %74
%76 = load double, double* %75
%77 = fadd double %73, %76
%78 = or i64 %61, 4
%79 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %78
%80 = load double, double* %79
%81 = fadd double %77, %80
%82 = or i64 %61, 5
%83 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %82
%84 = load double, double* %83
%85 = fadd double %81, %84
%86 = or i64 %61, 6
%87 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %86
%88 = load double, double* %87
%89 = fadd double %85, %88
%90 = or i64 %61, 7
%91 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %90
%92 = load double, double* %91
%93 = fadd double %89, %92
%94 = add nuw nsw i64 %61, 8
%95 = icmp eq i64 %94, 1000
br i1 %95, label %96, label %60
96: ; preds = %60
%97 = fcmp une double %57, %93
br i1 %97, label %98, label %100
98: ; preds = %96
%99 = tail call i32 (...) @abort()
unreachable
100: ; preds = %96, %100
%101 = phi i64 [ %134, %100 ], [ 0, %96 ]
%102 = phi double [ %133, %100 ], [ 0.000000e+00, %96 ]
%103 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %101
%104 = load double, double* %103
%105 = fmul double %102, %104
%106 = or i64 %101, 1
%107 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %106
%108 = load double, double* %107
%109 = fmul double %105, %108
%110 = or i64 %101, 2
%111 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %110
%112 = load double, double* %111
%113 = fmul double %109, %112
%114 = or i64 %101, 3
%115 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %114
%116 = load double, double* %115
%117 = fmul double %113, %116
%118 = or i64 %101, 4
%119 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %118
%120 = load double, double* %119
%121 = fmul double %117, %120
%122 = or i64 %101, 5
%123 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %122
%124 = load double, double* %123
%125 = fmul double %121, %124
%126 = or i64 %101, 6
%127 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %126
%128 = load double, double* %127
%129 = fmul double %125, %128
%130 = or i64 %101, 7
%131 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %130
%132 = load double, double* %131
%133 = fmul double %129, %132
%134 = add nuw nsw i64 %101, 8
%135 = icmp eq i64 %134, 1000
br i1 %135, label %136, label %100
136: ; preds = %100, %136
%137 = phi i64 [ %170, %136 ], [ 0, %100 ]
%138 = phi double [ %169, %136 ], [ 0.000000e+00, %100 ]
%139 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %137
%140 = load double, double* %139
%141 = fmul double %138, %140
%142 = or i64 %137, 1
%143 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %142
%144 = load double, double* %143
%145 = fmul double %141, %144
%146 = or i64 %137, 2
%147 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %146
%148 = load double, double* %147
%149 = fmul double %145, %148
%150 = or i64 %137, 3
%151 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %150
%152 = load double, double* %151
%153 = fmul double %149, %152
%154 = or i64 %137, 4
%155 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %154
%156 = load double, double* %155
%157 = fmul double %153, %156
%158 = or i64 %137, 5
%159 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %158
%160 = load double, double* %159
%161 = fmul double %157, %160
%162 = or i64 %137, 6
%163 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %162
%164 = load double, double* %163
%165 = fmul double %161, %164
%166 = or i64 %137, 7
%167 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %166
%168 = load double, double* %167
%169 = fmul double %165, %168
%170 = add nuw nsw i64 %137, 8
%171 = icmp eq i64 %170, 1000
br i1 %171, label %172, label %136
172: ; preds = %136
%173 = fsub double %133, %169
%174 = tail call double @llvm.fabs.f64(double %173)
%175 = fcmp ogt double %174, 1.000000e-04
br i1 %175, label %176, label %178
176: ; preds = %172
%177 = tail call i32 (...) @abort()
unreachable
178: ; preds = %172, %191
%179 = phi i64 [ %194, %191 ], [ 0, %172 ]
%180 = phi i32 [ %193, %191 ], [ 0, %172 ]
%181 = icmp eq i32 %180, 0
br i1 %181, label %182, label %191
182: ; preds = %178
%183 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %179
%184 = load double, double* %183
%185 = fcmp olt double %184, 5.000000e+00
br i1 %185, label %191, label %186
186: ; preds = %182
%187 = or i64 %179, 1
%188 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %187
%189 = load double, double* %188
%190 = fcmp olt double %189, 5.000000e+00
br label %191
191: ; preds = %178, %186, %182
%192 = phi i1 [ true, %182 ], [ %190, %186 ], [ true, %178 ]
%193 = zext i1 %192 to i32
%194 = add nuw nsw i64 %179, 2
%195 = icmp eq i64 %194, 1000
br i1 %195, label %196, label %178
196: ; preds = %191, %201
%197 = phi i64 [ %198, %201 ], [ 0, %191 ]
%198 = add nuw nsw i64 %197, 1
%199 = icmp eq i64 %198, 1000
br i1 %192, label %202, label %200
200: ; preds = %196
br i1 %199, label %203, label %201
201: ; preds = %200, %202
br label %196
202: ; preds = %196
br i1 %199, label %210, label %201
203: ; preds = %200
%204 = getelementptr inbounds [1000 x double], [1000 x double]* %1, i64 0, i64 %197
%205 = load double, double* %204
%206 = fcmp uge double %205, 5.000000e+00
%207 = xor i1 %206, %192
br i1 %207, label %210, label %208
208: ; preds = %203
%209 = tail call i32 (...) @abort()
unreachable
210: ; preds = %202, %203
ret i32 0
}