#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*/ iki_boyut(float **);
int /*<<< orphan*/ tek_boyut(float *);
int /*<<< orphan*/ uc_boyut(float ***);
main() {
  float a[] = {1.2, 3.1};
  float b[][2] = {{1.2, 3.1}, {3.5, 4.6}};
  float c[][2][3] = {{{1.2, 2.5, 4.6}, {3.1, 4.5, 4.3}}};
  tek_boyut(a);
  iki_boyut(b);
  uc_boyut(c);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movl   $0x0,-0x4(%rbp)
mov    0xeba(%rip),%rax
mov    %rax,-0xc(%rbp)
mov    0xebf(%rip),%rax
mov    %rax,-0x20(%rbp)
mov    0xebc(%rip),%rax
mov    %rax,-0x18(%rbp)
mov    0xeb9(%rip),%rax
mov    %rax,-0x40(%rbp)
mov    0xeb6(%rip),%rax
mov    %rax,-0x38(%rbp)
mov    0xeb3(%rip),%rax
mov    %rax,-0x30(%rbp)
lea    -0xc(%rbp),%rdi
call   1040 <tek_boyut@plt>
lea    -0x20(%rbp),%rdi
call   1050 <iki_boyut@plt>
lea    -0x40(%rbp),%rdi
call   1030 <uc_boyut@plt>
xor    %eax,%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
sub    $0x48,%rsp
movabs $0x404666663f99999a,%rax
66 46 40
mov    %rax,0x8(%rsp)
movaps 0xeb6(%rip),%xmm0
movaps %xmm0,0x30(%rsp)
mov    0xeca(%rip),%rax
mov    %rax,0x20(%rsp)
movaps 0xeae(%rip),%xmm0
movaps %xmm0,0x10(%rsp)
lea    0x8(%rsp),%rdi
call   1040 <tek_boyut@plt>
lea    0x30(%rsp),%rdi
call   1050 <iki_boyut@plt>
lea    0x10(%rsp),%rdi
call   1030 <uc_boyut@plt>
xor    %eax,%eax
add    $0x48,%rsp
ret

LLVM IR (-O0):
@__const.main.a = [2 x float] [float 0x3FF3333340000000, float 0x4008CCCCC0000000]
@__const.main.b = [2 x [2 x float]] [[2 x float] [float 0x3FF3333340000000, float 0x4008CCCCC0000000], [2 x float] [float 3.500000e+00, float 0x4012666660000000]]
@__const.main.c = [1 x [2 x [3 x float]]] [[2 x [3 x float]] [[3 x float] [float 0x3FF3333340000000, float 2.500000e+00, float 0x4012666660000000], [3 x float] [float 0x4008CCCCC0000000, float 4.500000e+00, float 0x4011333340000000]]]
define i32 @main() {
%1 = alloca i32
%2 = alloca [2 x float]
%3 = alloca [2 x [2 x float]]
%4 = alloca [1 x [2 x [3 x float]]]
store i32 0, i32* %1
%5 = bitcast [2 x float]* %2 to i8*
%6 = bitcast [2 x [2 x float]]* %3 to i8*
%7 = bitcast [1 x [2 x [3 x float]]]* %4 to i8*
%8 = getelementptr inbounds [2 x float], [2 x float]* %2, i64 0, i64 0
%9 = call i32 @tek_boyut(float* %8)
%10 = getelementptr inbounds [2 x [2 x float]], [2 x [2 x float]]* %3, i64 0, i64 0
%11 = bitcast [2 x float]* %10 to float**
%12 = call i32 @iki_boyut(float** %11)
%13 = getelementptr inbounds [1 x [2 x [3 x float]]], [1 x [2 x [3 x float]]]* %4, i64 0, i64 0
%14 = bitcast [2 x [3 x float]]* %13 to float***
%15 = call i32 @uc_boyut(float*** %14)
ret i32 0
}

LLVM IR (-O2):
@__const.main.b = [2 x [2 x float]] [[2 x float] [float 0x3FF3333340000000, float 0x4008CCCCC0000000], [2 x float] [float 3.500000e+00, float 0x4012666660000000]]
@__const.main.c = [1 x [2 x [3 x float]]] [[2 x [3 x float]] [[3 x float] [float 0x3FF3333340000000, float 2.500000e+00, float 0x4012666660000000], [3 x float] [float 0x4008CCCCC0000000, float 4.500000e+00, float 0x4011333340000000]]]
define i32 @main() {
%1 = alloca i64
%2 = alloca [2 x [2 x float]]
%3 = alloca [1 x [2 x [3 x float]]]
%4 = bitcast i64* %1 to i8*
store i64 4631501856136862106, i64* %1
%5 = bitcast [2 x [2 x float]]* %2 to i8*
%6 = bitcast [1 x [2 x [3 x float]]]* %3 to i8*
%7 = bitcast i64* %1 to float*
%8 = call i32 @tek_boyut(float* %7)
%9 = bitcast [2 x [2 x float]]* %2 to float**
%10 = call i32 @iki_boyut(float** %9)
%11 = bitcast [1 x [2 x [3 x float]]]* %3 to float***
%12 = call i32 @uc_boyut(float*** %11)
ret i32 0
}