#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*/ putchar(int);
void f3(void) {
  typedef int a1[1];
  typedef a1 a2[2];
  typedef a2 a3[3];
  typedef a3 a4[4];
  a4 b;
  b[0][0][0][0] = 'a';
  b[0][0][1][0] = 'b';
  b[0][1][0][0] = 'c';
  b[0][1][1][0] = 'd';
  b[0][2][0][0] = 'e';
  b[0][2][1][0] = 'f';
  putchar(b[0][0][0][0]);
  putchar(b[0][0][1][0]);
  putchar(b[0][1][0][0]);
  putchar(b[0][1][1][0]);
  putchar(b[0][2][0][0]);
  putchar(b[0][2][1][0]);
}


x86 assembly (clang, -O0):
<f3>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movl   $0x61,-0x60(%rbp)
movl   $0x62,-0x5c(%rbp)
movl   $0x63,-0x58(%rbp)
movl   $0x64,-0x54(%rbp)
movl   $0x65,-0x50(%rbp)
movl   $0x66,-0x4c(%rbp)
mov    -0x60(%rbp),%edi
call   1030 <putchar@plt>
mov    -0x5c(%rbp),%edi
call   1030 <putchar@plt>
mov    -0x58(%rbp),%edi
call   1030 <putchar@plt>
mov    -0x54(%rbp),%edi
call   1030 <putchar@plt>
mov    -0x50(%rbp),%edi
call   1030 <putchar@plt>
mov    -0x4c(%rbp),%edi
call   1030 <putchar@plt>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<f3>:
push   %rax
mov    $0x61,%edi
call   1030 <putchar@plt>
mov    $0x62,%edi
call   1030 <putchar@plt>
mov    $0x63,%edi
call   1030 <putchar@plt>
mov    $0x64,%edi
call   1030 <putchar@plt>
mov    $0x65,%edi
call   1030 <putchar@plt>
mov    $0x66,%edi
pop    %rax
jmp    1030 <putchar@plt>

LLVM IR (-O0):
define void @f3() {
%1 = alloca [4 x [3 x [2 x [1 x i32]]]]
%2 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%3 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %2, i64 0, i64 0
%4 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %3, i64 0, i64 0
%5 = getelementptr inbounds [1 x i32], [1 x i32]* %4, i64 0, i64 0
store i32 97, i32* %5
%6 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%7 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %6, i64 0, i64 0
%8 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %7, i64 0, i64 1
%9 = getelementptr inbounds [1 x i32], [1 x i32]* %8, i64 0, i64 0
store i32 98, i32* %9
%10 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%11 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %10, i64 0, i64 1
%12 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %11, i64 0, i64 0
%13 = getelementptr inbounds [1 x i32], [1 x i32]* %12, i64 0, i64 0
store i32 99, i32* %13
%14 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%15 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %14, i64 0, i64 1
%16 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %15, i64 0, i64 1
%17 = getelementptr inbounds [1 x i32], [1 x i32]* %16, i64 0, i64 0
store i32 100, i32* %17
%18 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%19 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %18, i64 0, i64 2
%20 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %19, i64 0, i64 0
%21 = getelementptr inbounds [1 x i32], [1 x i32]* %20, i64 0, i64 0
store i32 101, i32* %21
%22 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%23 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %22, i64 0, i64 2
%24 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %23, i64 0, i64 1
%25 = getelementptr inbounds [1 x i32], [1 x i32]* %24, i64 0, i64 0
store i32 102, i32* %25
%26 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%27 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %26, i64 0, i64 0
%28 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %27, i64 0, i64 0
%29 = getelementptr inbounds [1 x i32], [1 x i32]* %28, i64 0, i64 0
%30 = load i32, i32* %29
%31 = call i32 @putchar(i32 %30)
%32 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%33 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %32, i64 0, i64 0
%34 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %33, i64 0, i64 1
%35 = getelementptr inbounds [1 x i32], [1 x i32]* %34, i64 0, i64 0
%36 = load i32, i32* %35
%37 = call i32 @putchar(i32 %36)
%38 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%39 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %38, i64 0, i64 1
%40 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %39, i64 0, i64 0
%41 = getelementptr inbounds [1 x i32], [1 x i32]* %40, i64 0, i64 0
%42 = load i32, i32* %41
%43 = call i32 @putchar(i32 %42)
%44 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%45 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %44, i64 0, i64 1
%46 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %45, i64 0, i64 1
%47 = getelementptr inbounds [1 x i32], [1 x i32]* %46, i64 0, i64 0
%48 = load i32, i32* %47
%49 = call i32 @putchar(i32 %48)
%50 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%51 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %50, i64 0, i64 2
%52 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %51, i64 0, i64 0
%53 = getelementptr inbounds [1 x i32], [1 x i32]* %52, i64 0, i64 0
%54 = load i32, i32* %53
%55 = call i32 @putchar(i32 %54)
%56 = getelementptr inbounds [4 x [3 x [2 x [1 x i32]]]], [4 x [3 x [2 x [1 x i32]]]]* %1, i64 0, i64 0
%57 = getelementptr inbounds [3 x [2 x [1 x i32]]], [3 x [2 x [1 x i32]]]* %56, i64 0, i64 2
%58 = getelementptr inbounds [2 x [1 x i32]], [2 x [1 x i32]]* %57, i64 0, i64 1
%59 = getelementptr inbounds [1 x i32], [1 x i32]* %58, i64 0, i64 0
%60 = load i32, i32* %59
%61 = call i32 @putchar(i32 %60)
ret void
}

LLVM IR (-O2):
define void @f3() {
%1 = tail call i32 @putchar(i32 97)
%2 = tail call i32 @putchar(i32 98)
%3 = tail call i32 @putchar(i32 99)
%4 = tail call i32 @putchar(i32 100)
%5 = tail call i32 @putchar(i32 101)
%6 = tail call i32 @putchar(i32 102)
ret void
}