void f(void) {
  unsigned char c, ca[15], caa[20][30];
#pragma acc data copyin(c)
  {
    c = 5;
    ca[3] = c;
    caa[3][12] = ca[3] + caa[3][12];
#pragma acc data copyin(ca [2:4])
    {
      c = 6;
      ca[4] = c;
      caa[3][12] = ca[3] + caa[3][12];
    }
#pragma acc parallel copyout(ca [3:4])
    {
      c = 7;
      ca[5] = c;
      caa[3][12] = ca[3] + caa[3][12];
    }
#pragma acc kernels copy(ca [4:4])
    {
      c = 8;
      ca[6] = c;
      caa[3][12] = ca[3] + caa[3][12];
    }
#pragma acc data pcopy(ca [5:7])
    {
      c = 15;
      ca[7] = c;
      caa[3][12] = ca[3] + caa[3][12];
#pragma acc data pcopyin(caa [3:7] [0:30])
      {
        c = 16;
        ca[8] = c;
        caa[3][12] = ca[3] + caa[3][12];
      }
#pragma acc parallel pcopyout(caa [3:7] [0:30])
      {
        c = 17;
        ca[9] = c;
        caa[3][12] = ca[3] + caa[3][12];
      }
#pragma acc kernels pcopy(caa [3:7] [0:30])
      {
        c = 18;
        ca[10] = c;
        caa[3][12] = ca[3] + caa[3][12];
      }
    }
  }
}


x86 assembly (clang, -O0):
<f>:
push   %rbp
mov    %rsp,%rbp
sub    $0x1f0,%rsp
movb   $0x5,-0x1(%rbp)
mov    -0x1(%rbp),%al
mov    %al,-0xd(%rbp)
movzbl -0xd(%rbp),%eax
movzbl -0x20a(%rbp),%ecx
add    %ecx,%eax
mov    %al,-0x20a(%rbp)
movb   $0x6,-0x1(%rbp)
mov    -0x1(%rbp),%al
mov    %al,-0xc(%rbp)
movzbl -0xd(%rbp),%eax
movzbl -0x20a(%rbp),%ecx
add    %ecx,%eax
mov    %al,-0x20a(%rbp)
movb   $0x7,-0x1(%rbp)
mov    -0x1(%rbp),%al
mov    %al,-0xb(%rbp)
movzbl -0xd(%rbp),%eax
movzbl -0x20a(%rbp),%ecx
add    %ecx,%eax
mov    %al,-0x20a(%rbp)
movb   $0x8,-0x1(%rbp)
mov    -0x1(%rbp),%al
mov    %al,-0xa(%rbp)
movzbl -0xd(%rbp),%eax
movzbl -0x20a(%rbp),%ecx
add    %ecx,%eax
mov    %al,-0x20a(%rbp)
movb   $0xf,-0x1(%rbp)
mov    -0x1(%rbp),%al
mov    %al,-0x9(%rbp)
movzbl -0xd(%rbp),%eax
movzbl -0x20a(%rbp),%ecx
add    %ecx,%eax
mov    %al,-0x20a(%rbp)
movb   $0x10,-0x1(%rbp)
mov    -0x1(%rbp),%al
mov    %al,-0x8(%rbp)
movzbl -0xd(%rbp),%eax
movzbl -0x20a(%rbp),%ecx
add    %ecx,%eax
mov    %al,-0x20a(%rbp)
movb   $0x11,-0x1(%rbp)
mov    -0x1(%rbp),%al
mov    %al,-0x7(%rbp)
movzbl -0xd(%rbp),%eax
movzbl -0x20a(%rbp),%ecx
add    %ecx,%eax
mov    %al,-0x20a(%rbp)
movb   $0x12,-0x1(%rbp)
mov    -0x1(%rbp),%al
mov    %al,-0x6(%rbp)
movzbl -0xd(%rbp),%eax
movzbl -0x20a(%rbp),%ecx
add    %ecx,%eax
mov    %al,-0x20a(%rbp)
add    $0x1f0,%rsp
pop    %rbp
ret

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

LLVM IR (-O0):
define void @f() {
%1 = alloca i8
%2 = alloca [15 x i8]
%3 = alloca [20 x [30 x i8]]
store i8 5, i8* %1
%4 = load i8, i8* %1
%5 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 3
store i8 %4, i8* %5
%6 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 3
%7 = load i8, i8* %6
%8 = zext i8 %7 to i32
%9 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%10 = getelementptr inbounds [30 x i8], [30 x i8]* %9, i64 0, i64 12
%11 = load i8, i8* %10
%12 = zext i8 %11 to i32
%13 = add nsw i32 %8, %12
%14 = trunc i32 %13 to i8
%15 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%16 = getelementptr inbounds [30 x i8], [30 x i8]* %15, i64 0, i64 12
store i8 %14, i8* %16
store i8 6, i8* %1
%17 = load i8, i8* %1
%18 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 4
store i8 %17, i8* %18
%19 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 3
%20 = load i8, i8* %19
%21 = zext i8 %20 to i32
%22 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%23 = getelementptr inbounds [30 x i8], [30 x i8]* %22, i64 0, i64 12
%24 = load i8, i8* %23
%25 = zext i8 %24 to i32
%26 = add nsw i32 %21, %25
%27 = trunc i32 %26 to i8
%28 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%29 = getelementptr inbounds [30 x i8], [30 x i8]* %28, i64 0, i64 12
store i8 %27, i8* %29
store i8 7, i8* %1
%30 = load i8, i8* %1
%31 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 5
store i8 %30, i8* %31
%32 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 3
%33 = load i8, i8* %32
%34 = zext i8 %33 to i32
%35 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%36 = getelementptr inbounds [30 x i8], [30 x i8]* %35, i64 0, i64 12
%37 = load i8, i8* %36
%38 = zext i8 %37 to i32
%39 = add nsw i32 %34, %38
%40 = trunc i32 %39 to i8
%41 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%42 = getelementptr inbounds [30 x i8], [30 x i8]* %41, i64 0, i64 12
store i8 %40, i8* %42
store i8 8, i8* %1
%43 = load i8, i8* %1
%44 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 6
store i8 %43, i8* %44
%45 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 3
%46 = load i8, i8* %45
%47 = zext i8 %46 to i32
%48 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%49 = getelementptr inbounds [30 x i8], [30 x i8]* %48, i64 0, i64 12
%50 = load i8, i8* %49
%51 = zext i8 %50 to i32
%52 = add nsw i32 %47, %51
%53 = trunc i32 %52 to i8
%54 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%55 = getelementptr inbounds [30 x i8], [30 x i8]* %54, i64 0, i64 12
store i8 %53, i8* %55
store i8 15, i8* %1
%56 = load i8, i8* %1
%57 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 7
store i8 %56, i8* %57
%58 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 3
%59 = load i8, i8* %58
%60 = zext i8 %59 to i32
%61 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%62 = getelementptr inbounds [30 x i8], [30 x i8]* %61, i64 0, i64 12
%63 = load i8, i8* %62
%64 = zext i8 %63 to i32
%65 = add nsw i32 %60, %64
%66 = trunc i32 %65 to i8
%67 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%68 = getelementptr inbounds [30 x i8], [30 x i8]* %67, i64 0, i64 12
store i8 %66, i8* %68
store i8 16, i8* %1
%69 = load i8, i8* %1
%70 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 8
store i8 %69, i8* %70
%71 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 3
%72 = load i8, i8* %71
%73 = zext i8 %72 to i32
%74 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%75 = getelementptr inbounds [30 x i8], [30 x i8]* %74, i64 0, i64 12
%76 = load i8, i8* %75
%77 = zext i8 %76 to i32
%78 = add nsw i32 %73, %77
%79 = trunc i32 %78 to i8
%80 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%81 = getelementptr inbounds [30 x i8], [30 x i8]* %80, i64 0, i64 12
store i8 %79, i8* %81
store i8 17, i8* %1
%82 = load i8, i8* %1
%83 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 9
store i8 %82, i8* %83
%84 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 3
%85 = load i8, i8* %84
%86 = zext i8 %85 to i32
%87 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%88 = getelementptr inbounds [30 x i8], [30 x i8]* %87, i64 0, i64 12
%89 = load i8, i8* %88
%90 = zext i8 %89 to i32
%91 = add nsw i32 %86, %90
%92 = trunc i32 %91 to i8
%93 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%94 = getelementptr inbounds [30 x i8], [30 x i8]* %93, i64 0, i64 12
store i8 %92, i8* %94
store i8 18, i8* %1
%95 = load i8, i8* %1
%96 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 10
store i8 %95, i8* %96
%97 = getelementptr inbounds [15 x i8], [15 x i8]* %2, i64 0, i64 3
%98 = load i8, i8* %97
%99 = zext i8 %98 to i32
%100 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%101 = getelementptr inbounds [30 x i8], [30 x i8]* %100, i64 0, i64 12
%102 = load i8, i8* %101
%103 = zext i8 %102 to i32
%104 = add nsw i32 %99, %103
%105 = trunc i32 %104 to i8
%106 = getelementptr inbounds [20 x [30 x i8]], [20 x [30 x i8]]* %3, i64 0, i64 3
%107 = getelementptr inbounds [30 x i8], [30 x i8]* %106, i64 0, i64 12
store i8 %105, i8* %107
ret void
}

LLVM IR (-O2):
define void @f() {
ret void
}