#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 id(int);
int /*<<< orphan*/ print_int(int);
int /*<<< orphan*/ print_string(char *);
void main(void) {
  int x[10];
  int i;
  int res;
  for (i = 0; i < 10; i = i + 1)
    x[i] = i;
  res = x[id(x[id(x[id(x[id(5)])])])];
  x[id(x[id(x[id(x[id(0) + 1] + 1) + 1] + 1) + 1] + 1) + 1] = res + 1;
  res = x[id(x[id(x[id(x[id(0) + 1] + 1) + 1] + 1) + 1] + 1) + 1];
  print_int(res);
  print_string("\n");
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movl   $0x0,-0x34(%rbp)
cmpl   $0xa,-0x34(%rbp)
jge    1162 <main+0x32>
mov    -0x34(%rbp),%ecx
movslq -0x34(%rbp),%rax
mov    %ecx,-0x30(%rbp,%rax,4)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    113f <main+0xf>
mov    $0x5,%edi
call   1050 <id@plt>
cltq
mov    -0x30(%rbp,%rax,4),%edi
call   1050 <id@plt>
cltq
mov    -0x30(%rbp,%rax,4),%edi
call   1050 <id@plt>
cltq
mov    -0x30(%rbp,%rax,4),%edi
call   1050 <id@plt>
cltq
mov    -0x30(%rbp,%rax,4),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
xor    %edi,%edi
call   1050 <id@plt>
add    $0x1,%eax
cltq
mov    -0x30(%rbp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
add    $0x1,%eax
cltq
mov    -0x30(%rbp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
add    $0x1,%eax
cltq
mov    -0x30(%rbp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
mov    -0x3c(%rbp),%ecx
add    $0x1,%eax
cltq
mov    %ecx,-0x30(%rbp,%rax,4)
xor    %edi,%edi
call   1050 <id@plt>
add    $0x1,%eax
cltq
mov    -0x30(%rbp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
add    $0x1,%eax
cltq
mov    -0x30(%rbp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
add    $0x1,%eax
cltq
mov    -0x30(%rbp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
add    $0x1,%eax
cltq
mov    -0x30(%rbp,%rax,4),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%edi
call   1040 <print_int@plt>
lea    0xdc6(%rip),%rdi
call   1030 <print_string@plt>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
sub    $0x30,%rsp
movaps 0xec4(%rip),%xmm0
movaps %xmm0,(%rsp)
movaps 0xec9(%rip),%xmm0
movaps %xmm0,0x10(%rsp)
movabs $0x900000008,%rax
mov    %rax,0x20(%rsp)
mov    $0x5,%edi
call   1050 <id@plt>
cltq
mov    (%rsp,%rax,4),%edi
call   1050 <id@plt>
cltq
mov    (%rsp,%rax,4),%edi
call   1050 <id@plt>
cltq
mov    (%rsp,%rax,4),%edi
call   1050 <id@plt>
cltq
mov    (%rsp,%rax,4),%ebx
add    $0x1,%ebx
xor    %edi,%edi
call   1050 <id@plt>
cltq
mov    0x4(%rsp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
cltq
mov    0x4(%rsp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
cltq
mov    0x4(%rsp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
cltq
mov    %ebx,0x4(%rsp,%rax,4)
xor    %edi,%edi
call   1050 <id@plt>
cltq
mov    0x4(%rsp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
cltq
mov    0x4(%rsp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
cltq
mov    0x4(%rsp,%rax,4),%edi
add    $0x1,%edi
call   1050 <id@plt>
cltq
mov    0x4(%rsp,%rax,4),%edi
call   1040 <print_int@plt>
lea    0xe1b(%rip),%rdi
add    $0x30,%rsp
pop    %rbx
jmp    1030 <print_string@plt>

LLVM IR (-O0):
@.str = [2 x i8] c"\0A\00"
define void @main() {
%1 = alloca [10 x i32]
%2 = alloca i32
%3 = alloca i32
store i32 0, i32* %2
br label %4
4: ; preds = %12, %0
%5 = load i32, i32* %2
%6 = icmp slt i32 %5, 10
br i1 %6, label %7, label %15
7: ; preds = %4
%8 = load i32, i32* %2
%9 = load i32, i32* %2
%10 = sext i32 %9 to i64
%11 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %10
store i32 %8, i32* %11
br label %12
12: ; preds = %7
%13 = load i32, i32* %2
%14 = add nsw i32 %13, 1
store i32 %14, i32* %2
br label %4
15: ; preds = %4
%16 = call i32 @id(i32 5)
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %17
%19 = load i32, i32* %18
%20 = call i32 @id(i32 %19)
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %21
%23 = load i32, i32* %22
%24 = call i32 @id(i32 %23)
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %25
%27 = load i32, i32* %26
%28 = call i32 @id(i32 %27)
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %29
%31 = load i32, i32* %30
store i32 %31, i32* %3
%32 = load i32, i32* %3
%33 = add nsw i32 %32, 1
%34 = call i32 @id(i32 0)
%35 = add nsw i32 %34, 1
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %36
%38 = load i32, i32* %37
%39 = add nsw i32 %38, 1
%40 = call i32 @id(i32 %39)
%41 = add nsw i32 %40, 1
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %42
%44 = load i32, i32* %43
%45 = add nsw i32 %44, 1
%46 = call i32 @id(i32 %45)
%47 = add nsw i32 %46, 1
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %48
%50 = load i32, i32* %49
%51 = add nsw i32 %50, 1
%52 = call i32 @id(i32 %51)
%53 = add nsw i32 %52, 1
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %54
store i32 %33, i32* %55
%56 = call i32 @id(i32 0)
%57 = add nsw i32 %56, 1
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %58
%60 = load i32, i32* %59
%61 = add nsw i32 %60, 1
%62 = call i32 @id(i32 %61)
%63 = add nsw i32 %62, 1
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %64
%66 = load i32, i32* %65
%67 = add nsw i32 %66, 1
%68 = call i32 @id(i32 %67)
%69 = add nsw i32 %68, 1
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %70
%72 = load i32, i32* %71
%73 = add nsw i32 %72, 1
%74 = call i32 @id(i32 %73)
%75 = add nsw i32 %74, 1
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %76
%78 = load i32, i32* %77
store i32 %78, i32* %3
%79 = load i32, i32* %3
%80 = call i32 @print_int(i32 %79)
%81 = call i32 @print_string(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
ret void
}

LLVM IR (-O2):
@.str = [2 x i8] c"\0A\00"
define void @main() {
%1 = alloca [10 x i32]
%2 = bitcast [10 x i32]* %1 to i8*
%3 = bitcast [10 x i32]* %1 to <4 x i32>*
store <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32>* %3
%4 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 4
%5 = bitcast i32* %4 to <4 x i32>*
store <4 x i32> <i32 4, i32 5, i32 6, i32 7>, <4 x i32>* %5
%6 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 8
store i32 8, i32* %6
%7 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 9
store i32 9, i32* %7
%8 = tail call i32 @id(i32 5)
%9 = sext i32 %8 to i64
%10 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %9
%11 = load i32, i32* %10
%12 = tail call i32 @id(i32 %11)
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %13
%15 = load i32, i32* %14
%16 = tail call i32 @id(i32 %15)
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %17
%19 = load i32, i32* %18
%20 = tail call i32 @id(i32 %19)
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %21
%23 = load i32, i32* %22
%24 = add nsw i32 %23, 1
%25 = tail call i32 @id(i32 0)
%26 = add nsw i32 %25, 1
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %27
%29 = load i32, i32* %28
%30 = add nsw i32 %29, 1
%31 = tail call i32 @id(i32 %30)
%32 = add nsw i32 %31, 1
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %33
%35 = load i32, i32* %34
%36 = add nsw i32 %35, 1
%37 = tail call i32 @id(i32 %36)
%38 = add nsw i32 %37, 1
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %39
%41 = load i32, i32* %40
%42 = add nsw i32 %41, 1
%43 = tail call i32 @id(i32 %42)
%44 = add nsw i32 %43, 1
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %45
store i32 %24, i32* %46
%47 = tail call i32 @id(i32 0)
%48 = add nsw i32 %47, 1
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %49
%51 = load i32, i32* %50
%52 = add nsw i32 %51, 1
%53 = tail call i32 @id(i32 %52)
%54 = add nsw i32 %53, 1
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %55
%57 = load i32, i32* %56
%58 = add nsw i32 %57, 1
%59 = tail call i32 @id(i32 %58)
%60 = add nsw i32 %59, 1
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %61
%63 = load i32, i32* %62
%64 = add nsw i32 %63, 1
%65 = tail call i32 @id(i32 %64)
%66 = add nsw i32 %65, 1
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds [10 x i32], [10 x i32]* %1, i64 0, i64 %67
%69 = load i32, i32* %68
%70 = tail call i32 @print_int(i32 %69)
%71 = tail call i32 @print_string(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
ret void
}