main() {
  char alunos[6][50] = {"Luiz", "Paulo", "Maria", "Luiza", "Felipe", "Fabiana"};
  int mat[6][3] = {{5, 7, 4}, {5, 6, 7}, {3, 5, 2},
                   {4, 5, 6}, {8, 9, 7}, {2, 6, 4}};
  mediaAluno(&alunos, mat);
  mediaTurma(mat);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x180,%rsp
lea    -0x130(%rbp),%rdi
lea    0xeb7(%rip),%rsi
mov    $0x12c,%edx
call   1040 <memcpy@plt>
lea    -0x180(%rbp),%rdi
lea    0xfcf(%rip),%rsi
mov    $0x48,%edx
call   1040 <memcpy@plt>
lea    -0x180(%rbp),%rsi
lea    -0x130(%rbp),%rdi
mov    $0x0,%al
call   1050 <mediaAluno@plt>
lea    -0x180(%rbp),%rdi
mov    $0x0,%al
call   1030 <mediaTurma@plt>
xor    %eax,%eax
add    $0x180,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r14
push   %rbx
sub    $0x188,%rsp
lea    0xebf(%rip),%rsi
lea    0x50(%rsp),%r14
mov    $0x12c,%edx
mov    %r14,%rdi
call   1040 <memcpy@plt>
mov    0x1016(%rip),%rax
mov    %rax,0x40(%rsp)
movaps 0xffa(%rip),%xmm0
movaps %xmm0,0x30(%rsp)
movaps 0xfde(%rip),%xmm0
movaps %xmm0,0x20(%rsp)
movaps 0xfc2(%rip),%xmm0
movaps %xmm0,0x10(%rsp)
movaps 0xfa6(%rip),%xmm0
movaps %xmm0,(%rsp)
mov    %rsp,%rbx
mov    %r14,%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1050 <mediaAluno@plt>
mov    %rbx,%rdi
xor    %eax,%eax
call   1030 <mediaTurma@plt>
xor    %eax,%eax
add    $0x188,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
@__const.main.alunos = [6 x [50 x i8]] [[50 x i8] c"Luiz\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Paulo\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Maria\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Luiza\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Felipe\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Fabiana\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00"]
@__const.main.mat = [6 x [3 x i32]] [[3 x i32] [i32 5, i32 7, i32 4], [3 x i32] [i32 5, i32 6, i32 7], [3 x i32] [i32 3, i32 5, i32 2], [3 x i32] [i32 4, i32 5, i32 6], [3 x i32] [i32 8, i32 9, i32 7], [3 x i32] [i32 2, i32 6, i32 4]]
define i32 @main() {
%1 = alloca [6 x [50 x i8]]
%2 = alloca [6 x [3 x i32]]
%3 = bitcast [6 x [50 x i8]]* %1 to i8*
%4 = bitcast [6 x [3 x i32]]* %2 to i8*
%5 = getelementptr inbounds [6 x [3 x i32]], [6 x [3 x i32]]* %2, i64 0, i64 0
%6 = call i32 ([6 x [50 x i8]]*, [3 x i32]*, ...) bitcast (i32 (...)* @mediaAluno to i32 ([6 x [50 x i8]]*, [3 x i32]*, ...)*)([6 x [50 x i8]]* %1, [3 x i32]* %5)
%7 = getelementptr inbounds [6 x [3 x i32]], [6 x [3 x i32]]* %2, i64 0, i64 0
%8 = call i32 ([3 x i32]*, ...) bitcast (i32 (...)* @mediaTurma to i32 ([3 x i32]*, ...)*)([3 x i32]* %7)
ret i32 0
}

LLVM IR (-O2):
@__const.main.alunos = [6 x [50 x i8]] [[50 x i8] c"Luiz\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Paulo\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Maria\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Luiza\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Felipe\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", [50 x i8] c"Fabiana\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00"]
@__const.main.mat = [6 x [3 x i32]] [[3 x i32] [i32 5, i32 7, i32 4], [3 x i32] [i32 5, i32 6, i32 7], [3 x i32] [i32 3, i32 5, i32 2], [3 x i32] [i32 4, i32 5, i32 6], [3 x i32] [i32 8, i32 9, i32 7], [3 x i32] [i32 2, i32 6, i32 4]]
define i32 @main() {
%1 = alloca [6 x [50 x i8]]
%2 = alloca [6 x [3 x i32]]
%3 = getelementptr inbounds [6 x [50 x i8]], [6 x [50 x i8]]* %1, i64 0, i64 0, i64 0
%4 = bitcast [6 x [3 x i32]]* %2 to i8*
%5 = getelementptr inbounds [6 x [3 x i32]], [6 x [3 x i32]]* %2, i64 0, i64 0
%6 = call i32 ([6 x [50 x i8]]*, [3 x i32]*, ...) bitcast (i32 (...)* @mediaAluno to i32 ([6 x [50 x i8]]*, [3 x i32]*, ...)*)([6 x [50 x i8]]* %1, [3 x i32]* %5)
%7 = call i32 ([3 x i32]*, ...) bitcast (i32 (...)* @mediaTurma to i32 ([3 x i32]*, ...)*)([3 x i32]* %5)
ret i32 0
}