int main() {
  int array[2 + 3];
  if (&array != &array)
    return 1;
  if (array != array)
    return 2;
  if (&array[0] != &array[0])
    return 13;
  if (&array[0] != (void *)array)
    return 13;
  if (&array[3] != &array[0] + 3)
    return 14;
  if (&array + 1 != (void *)(&array[0] + 5))
    return 15;
  int array2[5];
  if (&array2 != &array2)
    return 3;
  if (array2 != array2)
    return 4;
  if (&array == &array2)
    return 5;
  if (array == array2)
    return 6;
  int array3[6];
  if (array == array3)
    return 7;
  if (&array == (void *)&array3)
    return 8;
  unsigned int array4[5];
  if (&array == (void *)&array4)
    return 9;
  if (array == (void *)array4)
    return 10;
  *array = 15;
  if (*array != 15)
    return 11;
  *(array + 2) = 20;
  if (*(array + 2) != 20)
    return 12;
  if (array[0] != 15)
    return 16;
  if (array[2] != 20)
    return 17;
  if ((array + 4)[-2] != 20)
    return 21;
  array[1] = 35;
  array[3] = 10;
  4 [array] = 1 [array] + array[3];
  int sum = 0, i = 0;
  while (i != 5) {
    sum = sum + array[i];
    i = i + 1;
  }
  if (sum != 15 + 35 + 20 + 10 + 35 + 10)
    return 18;
  int array5[5][6];
  array5[2][3] = 10;
  if (array5[2][3] != 10)
    return 19;
  void *void_p1, *void_p2;
  char *p1, *p2;
  void_p1 = (&array5[0] + 1);
  void_p2 = &array5[0];
  p1 = void_p1;
  p2 = void_p2;
  p2 = p2 + 6 * 4;
  if (p1 != p2) {
    return 20;
  }
  int power_of_two_arr[10][10];
  power_of_two_arr[3][4] = 10;
  if (power_of_two_arr[3][4] != 10)
    return 21;
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x230,%rsp
movl   $0x0,-0x4(%rbp)
movl   $0xf,-0x20(%rbp)
cmpl   $0xf,-0x20(%rbp)
je     112f <main+0x2f>
movl   $0xb,-0x4(%rbp)
jmp    12c5 <main+0x1c5>
movl   $0x14,-0x18(%rbp)
cmpl   $0x14,-0x18(%rbp)
je     114c <main+0x4c>
movl   $0xc,-0x4(%rbp)
jmp    12c5 <main+0x1c5>
cmpl   $0xf,-0x20(%rbp)
je     1162 <main+0x62>
movl   $0x10,-0x4(%rbp)
jmp    12c5 <main+0x1c5>
cmpl   $0x14,-0x18(%rbp)
je     1178 <main+0x78>
movl   $0x11,-0x4(%rbp)
jmp    12c5 <main+0x1c5>
cmpl   $0x14,-0x18(%rbp)
je     118e <main+0x8e>
movl   $0x15,-0x4(%rbp)
jmp    12c5 <main+0x1c5>
movl   $0x23,-0x1c(%rbp)
movl   $0xa,-0x14(%rbp)
mov    -0x1c(%rbp),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x10(%rbp)
movl   $0x0,-0x84(%rbp)
movl   $0x0,-0x88(%rbp)
cmpl   $0x5,-0x88(%rbp)
je     11f1 <main+0xf1>
mov    -0x84(%rbp),%eax
movslq -0x88(%rbp),%rcx
add    -0x20(%rbp,%rcx,4),%eax
mov    %eax,-0x84(%rbp)
mov    -0x88(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x88(%rbp)
jmp    11b9 <main+0xb9>
cmpl   $0x7d,-0x84(%rbp)
je     120a <main+0x10a>
movl   $0x12,-0x4(%rbp)
jmp    12c5 <main+0x1c5>
movl   $0xa,-0xc4(%rbp)
cmpl   $0xa,-0xc4(%rbp)
je     122d <main+0x12d>
movl   $0x13,-0x4(%rbp)
jmp    12c5 <main+0x1c5>
lea    -0x100(%rbp),%rax
add    $0x18,%rax
mov    %rax,-0x108(%rbp)
lea    -0x100(%rbp),%rax
mov    %rax,-0x110(%rbp)
mov    -0x108(%rbp),%rax
mov    %rax,-0x118(%rbp)
mov    -0x110(%rbp),%rax
mov    %rax,-0x120(%rbp)
mov    -0x120(%rbp),%rax
add    $0x18,%rax
mov    %rax,-0x120(%rbp)
mov    -0x118(%rbp),%rax
cmp    -0x120(%rbp),%rax
je     129b <main+0x19b>
movl   $0x14,-0x4(%rbp)
jmp    12c5 <main+0x1c5>
movl   $0xa,-0x228(%rbp)
cmpl   $0xa,-0x228(%rbp)
je     12be <main+0x1be>
movl   $0x15,-0x4(%rbp)
jmp    12c5 <main+0x1c5>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x230,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @main() {
ret i32 0
}