void foo(int x) {
  char *parallel;
  struct S {
    int i;
    int j;
  } s;
  char a[32];
  double d;
  int i;
  const int c = 8;
#pragma omp p shared(x, x)
  ;
#pragma omp p private(x) private(x)
  ;
#pragma omp p shared(x) firstprivate(x)
  ;
#pragma omp p firstprivate(x, x)
  ;
#pragma omp p for shared(x) lastprivate(x)
  for (i = 0; i < 10; i++)
    ;
#pragma omp p for private(x) lastprivate(x)
  for (i = 0; i < 10; i++)
    ;
#pragma omp p for lastprivate(x, x)
  for (i = 0; i < 10; i++)
    ;
#pragma omp single private(x) copyprivate(x)
  ;
#pragma omp p shared(bar)
  ;
#pragma omp p private(bar)
  ;
#pragma omp p firstprivate(bar)
  ;
#pragma omp p reduction(+ : p)
  ;
#pragma omp p reduction(* : s)
  ;
#pragma omp p reduction(- : a)
  ;
  d = 0;
#pragma omp p reduction(* : d)
  ;
#pragma omp p reduction(| : d)
  ;
#pragma omp p reduction(&& : d)
  ;
#pragma omp p copyin(d)
  ;
#pragma omp p copyin(x)
  ;
#pragma omp p for firstprivate(x) lastprivate(x)
  for (i = 0; i < 10; i++)
    ;
#pragma omp p private(q)
  ;
#pragma omp p firstprivate(q)
  ;
#pragma omp p for lastprivate(q)
  for (i = 0; i < 10; i++)
    ;
#pragma omp p shared(t)
  ;
#pragma omp p private(t)
  ;
#pragma omp p firstprivate(t)
  ;
#pragma omp p for lastprivate(t)
  for (i = 0; i < 10; i++)
    ;
#pragma omp p reduction(* : t)
  ;
#pragma omp p shared(c)
  ;
#pragma omp p private(c)
  ;
#pragma omp p firstprivate(c)
  ;
#pragma omp p for lastprivate(c)
  for (i = 0; i < 10; i++)
    ;
#pragma omp p reduction(* : c)
  ;
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x8,-0x50(%rbp)
movl   $0x0,-0x4c(%rbp)
cmpl   $0xa,-0x4c(%rbp)
jge    1132 <foo+0x32>
jmp    1124 <foo+0x24>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1115 <foo+0x15>
movl   $0x0,-0x4c(%rbp)
cmpl   $0xa,-0x4c(%rbp)
jge    1156 <foo+0x56>
jmp    1148 <foo+0x48>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1139 <foo+0x39>
movl   $0x0,-0x4c(%rbp)
cmpl   $0xa,-0x4c(%rbp)
jge    117a <foo+0x7a>
jmp    116c <foo+0x6c>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    115d <foo+0x5d>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
cmpl   $0xa,-0x4c(%rbp)
jge    11a6 <foo+0xa6>
jmp    1198 <foo+0x98>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1189 <foo+0x89>
movl   $0x0,-0x4c(%rbp)
cmpl   $0xa,-0x4c(%rbp)
jge    11ca <foo+0xca>
jmp    11bc <foo+0xbc>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    11ad <foo+0xad>
movl   $0x0,-0x4c(%rbp)
cmpl   $0xa,-0x4c(%rbp)
jge    11ee <foo+0xee>
jmp    11e0 <foo+0xe0>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    11d1 <foo+0xd1>
movl   $0x0,-0x4c(%rbp)
cmpl   $0xa,-0x4c(%rbp)
jge    1212 <foo+0x112>
jmp    1204 <foo+0x104>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    11f5 <foo+0xf5>
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
ret

LLVM IR (-O0):
%struct.S = type { i32, i32 }
define void @foo(i32 %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca %struct.S
%5 = alloca [32 x i8]
%6 = alloca double
%7 = alloca i32
%8 = alloca i32
store i32 %0, i32* %2
store i32 8, i32* %8
store i32 0, i32* %7
br label %9
9: ; preds = %13, %1
%10 = load i32, i32* %7
%11 = icmp slt i32 %10, 10
br i1 %11, label %12, label %16
12: ; preds = %9
br label %13
13: ; preds = %12
%14 = load i32, i32* %7
%15 = add nsw i32 %14, 1
store i32 %15, i32* %7
br label %9
16: ; preds = %9
store i32 0, i32* %7
br label %17
17: ; preds = %21, %16
%18 = load i32, i32* %7
%19 = icmp slt i32 %18, 10
br i1 %19, label %20, label %24
20: ; preds = %17
br label %21
21: ; preds = %20
%22 = load i32, i32* %7
%23 = add nsw i32 %22, 1
store i32 %23, i32* %7
br label %17
24: ; preds = %17
store i32 0, i32* %7
br label %25
25: ; preds = %29, %24
%26 = load i32, i32* %7
%27 = icmp slt i32 %26, 10
br i1 %27, label %28, label %32
28: ; preds = %25
br label %29
29: ; preds = %28
%30 = load i32, i32* %7
%31 = add nsw i32 %30, 1
store i32 %31, i32* %7
br label %25
32: ; preds = %25
store double 0.000000e+00, double* %6
store i32 0, i32* %7
br label %33
33: ; preds = %37, %32
%34 = load i32, i32* %7
%35 = icmp slt i32 %34, 10
br i1 %35, label %36, label %40
36: ; preds = %33
br label %37
37: ; preds = %36
%38 = load i32, i32* %7
%39 = add nsw i32 %38, 1
store i32 %39, i32* %7
br label %33
40: ; preds = %33
store i32 0, i32* %7
br label %41
41: ; preds = %45, %40
%42 = load i32, i32* %7
%43 = icmp slt i32 %42, 10
br i1 %43, label %44, label %48
44: ; preds = %41
br label %45
45: ; preds = %44
%46 = load i32, i32* %7
%47 = add nsw i32 %46, 1
store i32 %47, i32* %7
br label %41
48: ; preds = %41
store i32 0, i32* %7
br label %49
49: ; preds = %53, %48
%50 = load i32, i32* %7
%51 = icmp slt i32 %50, 10
br i1 %51, label %52, label %56
52: ; preds = %49
br label %53
53: ; preds = %52
%54 = load i32, i32* %7
%55 = add nsw i32 %54, 1
store i32 %55, i32* %7
br label %49
56: ; preds = %49
store i32 0, i32* %7
br label %57
57: ; preds = %61, %56
%58 = load i32, i32* %7
%59 = icmp slt i32 %58, 10
br i1 %59, label %60, label %64
60: ; preds = %57
br label %61
61: ; preds = %60
%62 = load i32, i32* %7
%63 = add nsw i32 %62, 1
store i32 %63, i32* %7
br label %57
64: ; preds = %57
ret void
}

LLVM IR (-O2):
%struct.S = type { i32, i32 }
define void @foo(i32 %0) {
ret void
}