#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();
void foo(int n) {
  int a[n], i, err;
  for (i = 0; i < n; i++)
    a[i] = 7 * i;
#pragma omp target firstprivate(a) map(from : err) private(i)
  {
    err = 0;
    for (i = 0; i < n; i++)
      if (a[i] != 7 * i)
        err = 1;
  }
  if (err)
    abort();
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%eax
mov    %rsp,%rcx
mov    %rcx,-0x10(%rbp)
lea    0xf(,%rax,4),%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0x28(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1172 <foo+0x62>
mov    -0x28(%rbp),%rax
imul   $0x7,-0x1c(%rbp),%edx
movslq -0x1c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1149 <foo+0x39>
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11bd <foo+0xad>
mov    -0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
imul   $0x7,-0x1c(%rbp),%ecx
cmp    %ecx,%eax
je     11aa <foo+0x9a>
movl   $0x1,-0x20(%rbp)
jmp    11af <foo+0x9f>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1180 <foo+0x70>
cmpl   $0x0,-0x20(%rbp)
je     11ce <foo+0xbe>
mov    $0x0,%al
call   1030 <abort@plt>
mov    -0x10(%rbp),%rax
mov    %rax,%rsp
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,%r9d
mov    %rsp,%rcx
lea    0xf(,%r9,4),%rax
and    $0xfffffffffffffff0,%rax
sub    %rax,%rcx
mov    %rcx,%rsp
test   %edi,%edi
jle    13b6 <foo+0x2a6>
cmp    $0x8,%edi
jae    1140 <foo+0x30>
xor    %edx,%edx
jmp    120e <foo+0xfe>
mov    %r9d,%edx
and    $0xfffffff8,%edx
lea    -0x8(%rdx),%rax
mov    %rax,%r8
shr    $0x3,%r8
add    $0x1,%r8
test   %rax,%rax
je     13bb <foo+0x2ab>
mov    %r8,%rax
and    $0xfffffffffffffffe,%rax
movdqa 0xe93(%rip),%xmm0
xor    %esi,%esi
movdqa 0xe99(%rip),%xmm1
movdqa 0xea1(%rip),%xmm2
movdqa 0xea9(%rip),%xmm3
nopw   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm4
pslld  $0x3,%xmm4
psubd  %xmm0,%xmm4
movdqa %xmm4,(%rcx,%rsi,4)
paddd  %xmm1,%xmm4
movdqa %xmm4,0x10(%rcx,%rsi,4)
movdqa %xmm0,%xmm4
paddd  %xmm2,%xmm4
movdqa %xmm4,%xmm5
pslld  $0x3,%xmm5
psubd  %xmm4,%xmm5
movdqa %xmm5,0x20(%rcx,%rsi,4)
paddd  %xmm1,%xmm5
movdqa %xmm5,0x30(%rcx,%rsi,4)
add    $0x10,%rsi
paddd  %xmm3,%xmm0
add    $0xfffffffffffffffe,%rax
jne    1190 <foo+0x80>
test   $0x1,%r8b
je     1209 <foo+0xf9>
movdqa %xmm0,%xmm1
pslld  $0x3,%xmm1
psubd  %xmm0,%xmm1
movdqa 0xe16(%rip),%xmm0
paddd  %xmm1,%xmm0
movdqa %xmm1,(%rcx,%rsi,4)
movdqa %xmm0,0x10(%rcx,%rsi,4)
cmp    %r9,%rdx
je     122f <foo+0x11f>
lea    0x0(,%rdx,8),%eax
sub    %edx,%eax
nopw   0x0(%rax,%rax,1)
mov    %eax,(%rcx,%rdx,4)
add    $0x1,%rdx
add    $0x7,%eax
cmp    %rdx,%r9
jne    1220 <foo+0x110>
test   %edi,%edi
jle    13b6 <foo+0x2a6>
cmp    $0x8,%edi
jae    1245 <foo+0x135>
xor    %edx,%edx
xor    %eax,%eax
jmp    138d <foo+0x27d>
mov    %r9d,%edx
and    $0xfffffff8,%edx
lea    -0x8(%rdx),%rax
mov    %rax,%r8
shr    $0x3,%r8
add    $0x1,%r8
test   %rax,%rax
je     13d4 <foo+0x2c4>
mov    %r8,%rdi
and    $0xfffffffffffffffe,%rdi
movdqa 0xd8e(%rip),%xmm3
pxor   %xmm0,%xmm0
xor    %esi,%esi
movdqa 0xd8f(%rip),%xmm10
movdqa 0xd96(%rip),%xmm8
pcmpeqd %xmm5,%xmm5
movdqa 0xd99(%rip),%xmm9
pxor   %xmm1,%xmm1
nopl   0x0(%rax,%rax,1)
movdqa %xmm3,%xmm7
pslld  $0x3,%xmm7
psubd  %xmm3,%xmm7
movdqa %xmm7,%xmm4
paddd  %xmm10,%xmm4
pcmpeqd (%rcx,%rsi,4),%xmm7
pcmpeqd 0x10(%rcx,%rsi,4),%xmm4
movdqa %xmm3,%xmm6
paddd  %xmm8,%xmm6
movdqa %xmm6,%xmm2
pslld  $0x3,%xmm2
psubd  %xmm6,%xmm2
movdqa %xmm2,%xmm6
paddd  %xmm10,%xmm6
pcmpeqd 0x20(%rcx,%rsi,4),%xmm2
pand   %xmm7,%xmm2
pcmpeqd 0x30(%rcx,%rsi,4),%xmm6
pand   %xmm4,%xmm6
pand   %xmm2,%xmm0
paddd  %xmm2,%xmm0
psubd  %xmm5,%xmm0
pand   %xmm6,%xmm1
paddd  %xmm6,%xmm1
psubd  %xmm5,%xmm1
add    $0x10,%rsi
paddd  %xmm9,%xmm3
add    $0xfffffffffffffffe,%rdi
jne    12a0 <foo+0x190>
test   $0x1,%r8b
je     1361 <foo+0x251>
movdqa %xmm3,%xmm2
pslld  $0x3,%xmm2
psubd  %xmm3,%xmm2
movdqa 0xcda(%rip),%xmm3
paddd  %xmm2,%xmm3
pcmpeqd (%rcx,%rsi,4),%xmm2
pcmpeqd 0x10(%rcx,%rsi,4),%xmm3
pand   %xmm2,%xmm0
paddd  %xmm2,%xmm0
pcmpeqd %xmm2,%xmm2
psubd  %xmm2,%xmm0
pand   %xmm3,%xmm1
paddd  %xmm3,%xmm1
psubd  %xmm2,%xmm1
pxor   %xmm2,%xmm2
movdqa %xmm0,%xmm3
pcmpeqd %xmm2,%xmm3
pand   %xmm3,%xmm1
pandn  %xmm0,%xmm3
por    %xmm1,%xmm3
pcmpeqd %xmm2,%xmm3
movmskps %xmm3,%esi
xor    %eax,%eax
cmp    $0xf,%esi
setne  %al
cmp    %r9,%rdx
je     13b2 <foo+0x2a2>
lea    0x0(,%rdx,8),%esi
sub    %edx,%esi
mov    $0x1,%edi
nopl   0x0(%rax,%rax,1)
cmp    (%rcx,%rdx,4),%esi
cmovne %edi,%eax
add    $0x1,%rdx
add    $0x7,%esi
cmp    %rdx,%r9
jne    13a0 <foo+0x290>
test   %eax,%eax
jne    13f5 <foo+0x2e5>
mov    %rbp,%rsp
pop    %rbp
ret
movdqa 0xc3d(%rip),%xmm0
xor    %esi,%esi
test   $0x1,%r8b
jne    11e5 <foo+0xd5>
jmp    1209 <foo+0xf9>
movdqa 0xc24(%rip),%xmm3
pxor   %xmm0,%xmm0
xor    %esi,%esi
pxor   %xmm1,%xmm1
test   $0x1,%r8b
jne    1321 <foo+0x211>
jmp    1361 <foo+0x251>
xor    %eax,%eax
call   1030 <abort@plt>

LLVM IR (-O0):
define void @foo(i32 %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i64
%5 = alloca i32
%6 = alloca i32
store i32 %0, i32* %2
%7 = load i32, i32* %2
%8 = zext i32 %7 to i64
%9 = call i8* @llvm.stacksave()
store i8* %9, i8** %3
%10 = alloca i32, i64 %8
store i64 %8, i64* %4
store i32 0, i32* %5
br label %11
11: ; preds = %21, %1
%12 = load i32, i32* %5
%13 = load i32, i32* %2
%14 = icmp slt i32 %12, %13
br i1 %14, label %15, label %24
15: ; preds = %11
%16 = load i32, i32* %5
%17 = mul nsw i32 7, %16
%18 = load i32, i32* %5
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i32, i32* %10, i64 %19
store i32 %17, i32* %20
br label %21
21: ; preds = %15
%22 = load i32, i32* %5
%23 = add nsw i32 %22, 1
store i32 %23, i32* %5
br label %11
24: ; preds = %11
store i32 0, i32* %6
store i32 0, i32* %5
br label %25
25: ; preds = %39, %24
%26 = load i32, i32* %5
%27 = load i32, i32* %2
%28 = icmp slt i32 %26, %27
br i1 %28, label %29, label %42
29: ; preds = %25
%30 = load i32, i32* %5
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i32, i32* %10, i64 %31
%33 = load i32, i32* %32
%34 = load i32, i32* %5
%35 = mul nsw i32 7, %34
%36 = icmp ne i32 %33, %35
br i1 %36, label %37, label %38
37: ; preds = %29
store i32 1, i32* %6
br label %38
38: ; preds = %37, %29
br label %39
39: ; preds = %38
%40 = load i32, i32* %5
%41 = add nsw i32 %40, 1
store i32 %41, i32* %5
br label %25
42: ; preds = %25
%43 = load i32, i32* %6
%44 = icmp ne i32 %43, 0
br i1 %44, label %45, label %47
45: ; preds = %42
%46 = call i32 (...) @abort()
unreachable
47: ; preds = %42
%48 = load i8*, i8** %3
ret void
}

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