#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*/ free(int **);
int /*<<< orphan*/ fulfil2DArray(int **, int, int);
int **make2DArray(int, int);
int /*<<< orphan*/ matrixMulti(int **, int **, int **, int, int, int, int);
int /*<<< orphan*/ matrixSum(int **, int **, int **, int, int);
int /*<<< orphan*/ matrixTranspose(int **, int **, int, int);
int /*<<< orphan*/ print2DArray(int **, int, int);
int /*<<< orphan*/ puts(char *);
int main(void) {
  int **test1A, **test1B, **test1Result;
  test1A = make2DArray(1, 1);
  test1B = make2DArray(1, 1);
  test1Result = make2DArray(1, 1);
  fulfil2DArray(test1A, 1, 1);
  fulfil2DArray(test1B, 1, 1);
  fulfil2DArray(test1Result, 1, 1);
  matrixSum(test1Result, test1A, test1B, 1, 1);
  print2DArray(test1Result, 1, 1);
  puts("--------");
  test1A[0][0] = -1;
  matrixSum(test1Result, test1A, test1B, 1, 1);
  print2DArray(test1Result, 1, 1);
  puts("--------");
  free(test1A);
  free(test1B);
  free(test1Result);
  int **test2A, **test2B, **test2Result;
  test2A = make2DArray(1, 2);
  test2B = make2DArray(1, 2);
  test2Result = make2DArray(1, 2);
  fulfil2DArray(test2A, 1, 2);
  fulfil2DArray(test2B, 1, 2);
  fulfil2DArray(test2Result, 1, 2);
  matrixSum(test2Result, test2A, test2B, 1, 2);
  print2DArray(test2Result, 1, 2);
  puts("--------");
  free(test2A);
  free(test2B);
  free(test2Result);
  int **test3A, **test3B, **test3Result;
  test3A = make2DArray(2, 1);
  test3B = make2DArray(2, 1);
  test3Result = make2DArray(2, 1);
  fulfil2DArray(test3A, 2, 1);
  fulfil2DArray(test3B, 2, 1);
  fulfil2DArray(test3Result, 2, 1);
  matrixSum(test3Result, test3A, test3B, 2, 1);
  print2DArray(test3Result, 2, 1);
  puts("--------");
  free(test3A);
  free(test3B);
  free(test3Result);
  test1A = make2DArray(1, 1);
  test1B = make2DArray(1, 1);
  test1Result = make2DArray(1, 1);
  fulfil2DArray(test1A, 1, 1);
  fulfil2DArray(test1B, 1, 1);
  fulfil2DArray(test1Result, 1, 1);
  matrixMulti(test1Result, test1A, test1B, 1, 1, 1, 1);
  print2DArray(test1Result, 1, 1);
  puts("--------");
  test1A[0][0] = -1;
  matrixMulti(test1Result, test1A, test1B, 1, 1, 1, 1);
  print2DArray(test1Result, 1, 1);
  puts("--------");
  free(test1A);
  free(test1B);
  free(test1Result);
  test1A = make2DArray(1, 1);
  test1B = make2DArray(1, 1);
  test1Result = make2DArray(1, 3);
  fulfil2DArray(test1A, 1, 1);
  fulfil2DArray(test1B, 1, 3);
  fulfil2DArray(test1Result, 1, 3);
  matrixMulti(test1Result, test1A, test1B, 1, 1, 1, 3);
  print2DArray(test1Result, 1, 3);
  puts("--------");
  test1A[0][0] = -1;
  matrixMulti(test1Result, test1A, test1B, 1, 1, 1, 3);
  print2DArray(test1Result, 1, 3);
  puts("--------");
  free(test1A);
  free(test1B);
  free(test1Result);
  test1A = make2DArray(3, 1);
  test1B = make2DArray(1, 1);
  test1Result = make2DArray(3, 1);
  fulfil2DArray(test1A, 3, 1);
  fulfil2DArray(test1B, 1, 1);
  fulfil2DArray(test1Result, 3, 1);
  matrixMulti(test1Result, test1A, test1B, 3, 1, 1, 1);
  print2DArray(test1Result, 3, 1);
  puts("--------");
  test1A[0][0] = -1;
  matrixMulti(test1Result, test1A, test1B, 3, 1, 1, 1);
  print2DArray(test1Result, 3, 1);
  puts("--------");
  free(test1A);
  free(test1B);
  free(test1Result);
  int **matrix, **matrix_T;
  matrix = make2DArray(1, 1);
  matrix_T = make2DArray(1, 1);
  fulfil2DArray(matrix, 1, 1);
  fulfil2DArray(matrix_T, 1, 1);
  matrixTranspose(matrix_T, matrix, 1, 1);
  print2DArray(matrix_T, 1, 1);
  puts("--------");
  free(matrix);
  free(matrix_T);
  matrix = make2DArray(2, 2);
  matrix_T = make2DArray(2, 2);
  fulfil2DArray(matrix, 2, 2);
  fulfil2DArray(matrix_T, 2, 2);
  matrixTranspose(matrix_T, matrix, 2, 2);
  print2DArray(matrix_T, 2, 2);
  puts("--------");
  free(matrix);
  free(matrix_T);
  matrix = make2DArray(3, 5);
  matrix_T = make2DArray(5, 3);
  fulfil2DArray(matrix, 3, 5);
  fulfil2DArray(matrix_T, 5, 3);
  matrixTranspose(matrix_T, matrix, 3, 5);
  print2DArray(matrix_T, 5, 3);
  puts("--------");
  free(matrix);
  free(matrix_T);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
movl   $0x0,-0x4(%rbp)
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x10(%rbp)
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x18(%rbp)
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x18(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x20(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x1,%r8d
mov    %r8d,%ecx
call   1080 <matrixSum@plt>
mov    -0x20(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1060 <print2DArray@plt>
lea    0xde0(%rip),%rdi
call   1050 <puts@plt>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movl   $0xffffffff,(%rax)
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x1,%r8d
mov    %r8d,%ecx
call   1080 <matrixSum@plt>
mov    -0x20(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1060 <print2DArray@plt>
lea    0xd9d(%rip),%rdi
call   1050 <puts@plt>
mov    -0x10(%rbp),%rdi
call   1040 <free@plt>
mov    -0x18(%rbp),%rdi
call   1040 <free@plt>
mov    -0x20(%rbp),%rdi
call   1040 <free@plt>
mov    $0x1,%edi
mov    $0x2,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x28(%rbp)
mov    $0x1,%edi
mov    $0x2,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x30(%rbp)
mov    $0x1,%edi
mov    $0x2,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%rdi
mov    $0x1,%esi
mov    $0x2,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x30(%rbp),%rdi
mov    $0x1,%esi
mov    $0x2,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x38(%rbp),%rdi
mov    $0x1,%esi
mov    $0x2,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x38(%rbp),%rdi
mov    -0x28(%rbp),%rsi
mov    -0x30(%rbp),%rdx
mov    $0x1,%ecx
mov    $0x2,%r8d
call   1080 <matrixSum@plt>
mov    -0x38(%rbp),%rdi
mov    $0x1,%esi
mov    $0x2,%edx
call   1060 <print2DArray@plt>
lea    0xcd5(%rip),%rdi
call   1050 <puts@plt>
mov    -0x28(%rbp),%rdi
call   1040 <free@plt>
mov    -0x30(%rbp),%rdi
call   1040 <free@plt>
mov    -0x38(%rbp),%rdi
call   1040 <free@plt>
mov    $0x2,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x40(%rbp)
mov    $0x2,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x48(%rbp)
mov    $0x2,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rdi
mov    $0x2,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x48(%rbp),%rdi
mov    $0x2,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x50(%rbp),%rdi
mov    $0x2,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x50(%rbp),%rdi
mov    -0x40(%rbp),%rsi
mov    -0x48(%rbp),%rdx
mov    $0x2,%ecx
mov    $0x1,%r8d
call   1080 <matrixSum@plt>
mov    -0x50(%rbp),%rdi
mov    $0x2,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
lea    0xc0d(%rip),%rdi
call   1050 <puts@plt>
mov    -0x40(%rbp),%rdi
call   1040 <free@plt>
mov    -0x48(%rbp),%rdi
call   1040 <free@plt>
mov    -0x50(%rbp),%rdi
call   1040 <free@plt>
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x10(%rbp)
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x18(%rbp)
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x18(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x20(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x1,%r9d
mov    %r9d,%ecx
mov    %r9d,%r8d
movl   $0x1,(%rsp)
call   10a0 <matrixMulti@plt>
mov    -0x20(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1060 <print2DArray@plt>
lea    0xb52(%rip),%rdi
call   1050 <puts@plt>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movl   $0xffffffff,(%rax)
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x1,%r9d
mov    %r9d,%ecx
mov    %r9d,%r8d
movl   $0x1,(%rsp)
call   10a0 <matrixMulti@plt>
mov    -0x20(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1060 <print2DArray@plt>
lea    0xb05(%rip),%rdi
call   1050 <puts@plt>
mov    -0x10(%rbp),%rdi
call   1040 <free@plt>
mov    -0x18(%rbp),%rdi
call   1040 <free@plt>
mov    -0x20(%rbp),%rdi
call   1040 <free@plt>
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x10(%rbp)
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x18(%rbp)
mov    $0x1,%edi
mov    $0x3,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x18(%rbp),%rdi
mov    $0x1,%esi
mov    $0x3,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x20(%rbp),%rdi
mov    $0x1,%esi
mov    $0x3,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x1,%r9d
mov    %r9d,%ecx
mov    %r9d,%r8d
movl   $0x3,(%rsp)
call   10a0 <matrixMulti@plt>
mov    -0x20(%rbp),%rdi
mov    $0x1,%esi
mov    $0x3,%edx
call   1060 <print2DArray@plt>
lea    0xa3e(%rip),%rdi
call   1050 <puts@plt>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movl   $0xffffffff,(%rax)
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x1,%r9d
mov    %r9d,%ecx
mov    %r9d,%r8d
movl   $0x3,(%rsp)
call   10a0 <matrixMulti@plt>
mov    -0x20(%rbp),%rdi
mov    $0x1,%esi
mov    $0x3,%edx
call   1060 <print2DArray@plt>
lea    0x9ee(%rip),%rdi
call   1050 <puts@plt>
mov    -0x10(%rbp),%rdi
call   1040 <free@plt>
mov    -0x18(%rbp),%rdi
call   1040 <free@plt>
mov    -0x20(%rbp),%rdi
call   1040 <free@plt>
mov    $0x3,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x10(%rbp)
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x18(%rbp)
mov    $0x3,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x3,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x18(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x20(%rbp),%rdi
mov    $0x3,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x3,%ecx
mov    $0x1,%r9d
mov    %r9d,%r8d
movl   $0x1,(%rsp)
call   10a0 <matrixMulti@plt>
mov    -0x20(%rbp),%rdi
mov    $0x3,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
lea    0x922(%rip),%rdi
call   1050 <puts@plt>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movl   $0xffffffff,(%rax)
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x3,%ecx
mov    $0x1,%r9d
mov    %r9d,%r8d
movl   $0x1,(%rsp)
call   10a0 <matrixMulti@plt>
mov    -0x20(%rbp),%rdi
mov    $0x3,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
lea    0x8d0(%rip),%rdi
call   1050 <puts@plt>
mov    -0x10(%rbp),%rdi
call   1040 <free@plt>
mov    -0x18(%rbp),%rdi
call   1040 <free@plt>
mov    -0x20(%rbp),%rdi
call   1040 <free@plt>
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x58(%rbp)
mov    $0x1,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x60(%rbp)
mov    -0x58(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x60(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x60(%rbp),%rdi
mov    -0x58(%rbp),%rsi
mov    $0x1,%ecx
mov    %ecx,%edx
call   1070 <matrixTranspose@plt>
mov    -0x60(%rbp),%rdi
mov    $0x1,%edx
mov    %edx,%esi
call   1060 <print2DArray@plt>
lea    0x845(%rip),%rdi
call   1050 <puts@plt>
mov    -0x58(%rbp),%rdi
call   1040 <free@plt>
mov    -0x60(%rbp),%rdi
call   1040 <free@plt>
mov    $0x2,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x58(%rbp)
mov    $0x2,%esi
mov    %esi,%edi
call   1090 <make2DArray@plt>
mov    %rax,-0x60(%rbp)
mov    -0x58(%rbp),%rdi
mov    $0x2,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x60(%rbp),%rdi
mov    $0x2,%edx
mov    %edx,%esi
call   1030 <fulfil2DArray@plt>
mov    -0x60(%rbp),%rdi
mov    -0x58(%rbp),%rsi
mov    $0x2,%ecx
mov    %ecx,%edx
call   1070 <matrixTranspose@plt>
mov    -0x60(%rbp),%rdi
mov    $0x2,%edx
mov    %edx,%esi
call   1060 <print2DArray@plt>
lea    0x7c3(%rip),%rdi
call   1050 <puts@plt>
mov    -0x58(%rbp),%rdi
call   1040 <free@plt>
mov    -0x60(%rbp),%rdi
call   1040 <free@plt>
mov    $0x3,%edi
mov    $0x5,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x58(%rbp)
mov    $0x5,%edi
mov    $0x3,%esi
call   1090 <make2DArray@plt>
mov    %rax,-0x60(%rbp)
mov    -0x58(%rbp),%rdi
mov    $0x3,%esi
mov    $0x5,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x60(%rbp),%rdi
mov    $0x5,%esi
mov    $0x3,%edx
call   1030 <fulfil2DArray@plt>
mov    -0x60(%rbp),%rdi
mov    -0x58(%rbp),%rsi
mov    $0x3,%edx
mov    $0x5,%ecx
call   1070 <matrixTranspose@plt>
mov    -0x60(%rbp),%rdi
mov    $0x5,%esi
mov    $0x3,%edx
call   1060 <print2DArray@plt>
lea    0x72f(%rip),%rdi
call   1050 <puts@plt>
mov    -0x58(%rbp),%rdi
call   1040 <free@plt>
mov    -0x60(%rbp),%rdi
call   1040 <free@plt>
xor    %eax,%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r12
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r15
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%rbx
mov    %r12,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %r15,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %r15,%rdx
mov    $0x1,%ecx
mov    $0x1,%r8d
call   1080 <matrixSum@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
lea    0xdda(%rip),%r14
mov    %r14,%rdi
call   1050 <puts@plt>
mov    (%r12),%rax
movl   $0xffffffff,(%rax)
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %r15,%rdx
mov    $0x1,%ecx
mov    $0x1,%r8d
call   1080 <matrixSum@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    %r12,%rdi
call   1040 <free@plt>
mov    %r15,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
mov    $0x1,%edi
mov    $0x2,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r15
mov    $0x1,%edi
mov    $0x2,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r12
mov    $0x1,%edi
mov    $0x2,%esi
call   1090 <make2DArray@plt>
mov    %rax,%rbx
mov    %r15,%rdi
mov    $0x1,%esi
mov    $0x2,%edx
call   1030 <fulfil2DArray@plt>
mov    %r12,%rdi
mov    $0x1,%esi
mov    $0x2,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x2,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    %r15,%rsi
mov    %r12,%rdx
mov    $0x1,%ecx
mov    $0x2,%r8d
call   1080 <matrixSum@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x2,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    %r15,%rdi
call   1040 <free@plt>
mov    %r12,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
mov    $0x2,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r15
mov    $0x2,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r12
mov    $0x2,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%rbx
mov    %r15,%rdi
mov    $0x2,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %r12,%rdi
mov    $0x2,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    $0x2,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    %r15,%rsi
mov    %r12,%rdx
mov    $0x2,%ecx
mov    $0x1,%r8d
call   1080 <matrixSum@plt>
mov    %rbx,%rdi
mov    $0x2,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    %r15,%rdi
call   1040 <free@plt>
mov    %r12,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r12
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r15
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%rbx
mov    %r12,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %r15,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
movl   $0x1,(%rsp)
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %r15,%rdx
mov    $0x1,%ecx
mov    $0x1,%r8d
mov    $0x1,%r9d
call   10a0 <matrixMulti@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    (%r12),%rax
movl   $0xffffffff,(%rax)
movl   $0x1,(%rsp)
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %r15,%rdx
mov    $0x1,%ecx
mov    $0x1,%r8d
mov    $0x1,%r9d
call   10a0 <matrixMulti@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    %r12,%rdi
call   1040 <free@plt>
mov    %r15,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r12
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r15
mov    $0x1,%edi
mov    $0x3,%esi
call   1090 <make2DArray@plt>
mov    %rax,%rbx
mov    %r12,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %r15,%rdi
mov    $0x1,%esi
mov    $0x3,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x3,%edx
call   1030 <fulfil2DArray@plt>
movl   $0x3,(%rsp)
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %r15,%rdx
mov    $0x1,%ecx
mov    $0x1,%r8d
mov    $0x1,%r9d
call   10a0 <matrixMulti@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x3,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    (%r12),%rax
movl   $0xffffffff,(%rax)
movl   $0x3,(%rsp)
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %r15,%rdx
mov    $0x1,%ecx
mov    $0x1,%r8d
mov    $0x1,%r9d
call   10a0 <matrixMulti@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x3,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    %r12,%rdi
call   1040 <free@plt>
mov    %r15,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
mov    $0x3,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r12
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r15
mov    $0x3,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%rbx
mov    %r12,%rdi
mov    $0x3,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %r15,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    $0x3,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
movl   $0x1,(%rsp)
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %r15,%rdx
mov    $0x3,%ecx
mov    $0x1,%r8d
mov    $0x1,%r9d
call   10a0 <matrixMulti@plt>
mov    %rbx,%rdi
mov    $0x3,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    (%r12),%rax
movl   $0xffffffff,(%rax)
movl   $0x1,(%rsp)
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %r15,%rdx
mov    $0x3,%ecx
mov    $0x1,%r8d
mov    $0x1,%r9d
call   10a0 <matrixMulti@plt>
mov    %rbx,%rdi
mov    $0x3,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    %r12,%rdi
call   1040 <free@plt>
mov    %r15,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r15
mov    $0x1,%edi
mov    $0x1,%esi
call   1090 <make2DArray@plt>
mov    %rax,%rbx
mov    %r15,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    %r15,%rsi
mov    $0x1,%edx
mov    $0x1,%ecx
call   1070 <matrixTranspose@plt>
mov    %rbx,%rdi
mov    $0x1,%esi
mov    $0x1,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    %r15,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
mov    $0x2,%edi
mov    $0x2,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r15
mov    $0x2,%edi
mov    $0x2,%esi
call   1090 <make2DArray@plt>
mov    %rax,%rbx
mov    %r15,%rdi
mov    $0x2,%esi
mov    $0x2,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    $0x2,%esi
mov    $0x2,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    %r15,%rsi
mov    $0x2,%edx
mov    $0x2,%ecx
call   1070 <matrixTranspose@plt>
mov    %rbx,%rdi
mov    $0x2,%esi
mov    $0x2,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    %r15,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
mov    $0x3,%edi
mov    $0x5,%esi
call   1090 <make2DArray@plt>
mov    %rax,%r15
mov    $0x5,%edi
mov    $0x3,%esi
call   1090 <make2DArray@plt>
mov    %rax,%rbx
mov    %r15,%rdi
mov    $0x3,%esi
mov    $0x5,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    $0x5,%esi
mov    $0x3,%edx
call   1030 <fulfil2DArray@plt>
mov    %rbx,%rdi
mov    %r15,%rsi
mov    $0x3,%edx
mov    $0x5,%ecx
call   1070 <matrixTranspose@plt>
mov    %rbx,%rdi
mov    $0x5,%esi
mov    $0x3,%edx
call   1060 <print2DArray@plt>
mov    %r14,%rdi
call   1050 <puts@plt>
mov    %r15,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
@.str = [9 x i8] c"--------\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i32**
%3 = alloca i32**
%4 = alloca i32**
%5 = alloca i32**
%6 = alloca i32**
%7 = alloca i32**
%8 = alloca i32**
%9 = alloca i32**
%10 = alloca i32**
%11 = alloca i32**
%12 = alloca i32**
store i32 0, i32* %1
%13 = call i32** @make2DArray(i32 1, i32 1)
store i32** %13, i32*** %2
%14 = call i32** @make2DArray(i32 1, i32 1)
store i32** %14, i32*** %3
%15 = call i32** @make2DArray(i32 1, i32 1)
store i32** %15, i32*** %4
%16 = load i32**, i32*** %2
%17 = call i32 @fulfil2DArray(i32** %16, i32 1, i32 1)
%18 = load i32**, i32*** %3
%19 = call i32 @fulfil2DArray(i32** %18, i32 1, i32 1)
%20 = load i32**, i32*** %4
%21 = call i32 @fulfil2DArray(i32** %20, i32 1, i32 1)
%22 = load i32**, i32*** %4
%23 = load i32**, i32*** %2
%24 = load i32**, i32*** %3
%25 = call i32 @matrixSum(i32** %22, i32** %23, i32** %24, i32 1, i32 1)
%26 = load i32**, i32*** %4
%27 = call i32 @print2DArray(i32** %26, i32 1, i32 1)
%28 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%29 = load i32**, i32*** %2
%30 = getelementptr inbounds i32*, i32** %29, i64 0
%31 = load i32*, i32** %30
%32 = getelementptr inbounds i32, i32* %31, i64 0
store i32 -1, i32* %32
%33 = load i32**, i32*** %4
%34 = load i32**, i32*** %2
%35 = load i32**, i32*** %3
%36 = call i32 @matrixSum(i32** %33, i32** %34, i32** %35, i32 1, i32 1)
%37 = load i32**, i32*** %4
%38 = call i32 @print2DArray(i32** %37, i32 1, i32 1)
%39 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%40 = load i32**, i32*** %2
%41 = call i32 @free(i32** %40)
%42 = load i32**, i32*** %3
%43 = call i32 @free(i32** %42)
%44 = load i32**, i32*** %4
%45 = call i32 @free(i32** %44)
%46 = call i32** @make2DArray(i32 1, i32 2)
store i32** %46, i32*** %5
%47 = call i32** @make2DArray(i32 1, i32 2)
store i32** %47, i32*** %6
%48 = call i32** @make2DArray(i32 1, i32 2)
store i32** %48, i32*** %7
%49 = load i32**, i32*** %5
%50 = call i32 @fulfil2DArray(i32** %49, i32 1, i32 2)
%51 = load i32**, i32*** %6
%52 = call i32 @fulfil2DArray(i32** %51, i32 1, i32 2)
%53 = load i32**, i32*** %7
%54 = call i32 @fulfil2DArray(i32** %53, i32 1, i32 2)
%55 = load i32**, i32*** %7
%56 = load i32**, i32*** %5
%57 = load i32**, i32*** %6
%58 = call i32 @matrixSum(i32** %55, i32** %56, i32** %57, i32 1, i32 2)
%59 = load i32**, i32*** %7
%60 = call i32 @print2DArray(i32** %59, i32 1, i32 2)
%61 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%62 = load i32**, i32*** %5
%63 = call i32 @free(i32** %62)
%64 = load i32**, i32*** %6
%65 = call i32 @free(i32** %64)
%66 = load i32**, i32*** %7
%67 = call i32 @free(i32** %66)
%68 = call i32** @make2DArray(i32 2, i32 1)
store i32** %68, i32*** %8
%69 = call i32** @make2DArray(i32 2, i32 1)
store i32** %69, i32*** %9
%70 = call i32** @make2DArray(i32 2, i32 1)
store i32** %70, i32*** %10
%71 = load i32**, i32*** %8
%72 = call i32 @fulfil2DArray(i32** %71, i32 2, i32 1)
%73 = load i32**, i32*** %9
%74 = call i32 @fulfil2DArray(i32** %73, i32 2, i32 1)
%75 = load i32**, i32*** %10
%76 = call i32 @fulfil2DArray(i32** %75, i32 2, i32 1)
%77 = load i32**, i32*** %10
%78 = load i32**, i32*** %8
%79 = load i32**, i32*** %9
%80 = call i32 @matrixSum(i32** %77, i32** %78, i32** %79, i32 2, i32 1)
%81 = load i32**, i32*** %10
%82 = call i32 @print2DArray(i32** %81, i32 2, i32 1)
%83 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%84 = load i32**, i32*** %8
%85 = call i32 @free(i32** %84)
%86 = load i32**, i32*** %9
%87 = call i32 @free(i32** %86)
%88 = load i32**, i32*** %10
%89 = call i32 @free(i32** %88)
%90 = call i32** @make2DArray(i32 1, i32 1)
store i32** %90, i32*** %2
%91 = call i32** @make2DArray(i32 1, i32 1)
store i32** %91, i32*** %3
%92 = call i32** @make2DArray(i32 1, i32 1)
store i32** %92, i32*** %4
%93 = load i32**, i32*** %2
%94 = call i32 @fulfil2DArray(i32** %93, i32 1, i32 1)
%95 = load i32**, i32*** %3
%96 = call i32 @fulfil2DArray(i32** %95, i32 1, i32 1)
%97 = load i32**, i32*** %4
%98 = call i32 @fulfil2DArray(i32** %97, i32 1, i32 1)
%99 = load i32**, i32*** %4
%100 = load i32**, i32*** %2
%101 = load i32**, i32*** %3
%102 = call i32 @matrixMulti(i32** %99, i32** %100, i32** %101, i32 1, i32 1, i32 1, i32 1)
%103 = load i32**, i32*** %4
%104 = call i32 @print2DArray(i32** %103, i32 1, i32 1)
%105 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%106 = load i32**, i32*** %2
%107 = getelementptr inbounds i32*, i32** %106, i64 0
%108 = load i32*, i32** %107
%109 = getelementptr inbounds i32, i32* %108, i64 0
store i32 -1, i32* %109
%110 = load i32**, i32*** %4
%111 = load i32**, i32*** %2
%112 = load i32**, i32*** %3
%113 = call i32 @matrixMulti(i32** %110, i32** %111, i32** %112, i32 1, i32 1, i32 1, i32 1)
%114 = load i32**, i32*** %4
%115 = call i32 @print2DArray(i32** %114, i32 1, i32 1)
%116 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%117 = load i32**, i32*** %2
%118 = call i32 @free(i32** %117)
%119 = load i32**, i32*** %3
%120 = call i32 @free(i32** %119)
%121 = load i32**, i32*** %4
%122 = call i32 @free(i32** %121)
%123 = call i32** @make2DArray(i32 1, i32 1)
store i32** %123, i32*** %2
%124 = call i32** @make2DArray(i32 1, i32 1)
store i32** %124, i32*** %3
%125 = call i32** @make2DArray(i32 1, i32 3)
store i32** %125, i32*** %4
%126 = load i32**, i32*** %2
%127 = call i32 @fulfil2DArray(i32** %126, i32 1, i32 1)
%128 = load i32**, i32*** %3
%129 = call i32 @fulfil2DArray(i32** %128, i32 1, i32 3)
%130 = load i32**, i32*** %4
%131 = call i32 @fulfil2DArray(i32** %130, i32 1, i32 3)
%132 = load i32**, i32*** %4
%133 = load i32**, i32*** %2
%134 = load i32**, i32*** %3
%135 = call i32 @matrixMulti(i32** %132, i32** %133, i32** %134, i32 1, i32 1, i32 1, i32 3)
%136 = load i32**, i32*** %4
%137 = call i32 @print2DArray(i32** %136, i32 1, i32 3)
%138 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%139 = load i32**, i32*** %2
%140 = getelementptr inbounds i32*, i32** %139, i64 0
%141 = load i32*, i32** %140
%142 = getelementptr inbounds i32, i32* %141, i64 0
store i32 -1, i32* %142
%143 = load i32**, i32*** %4
%144 = load i32**, i32*** %2
%145 = load i32**, i32*** %3
%146 = call i32 @matrixMulti(i32** %143, i32** %144, i32** %145, i32 1, i32 1, i32 1, i32 3)
%147 = load i32**, i32*** %4
%148 = call i32 @print2DArray(i32** %147, i32 1, i32 3)
%149 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%150 = load i32**, i32*** %2
%151 = call i32 @free(i32** %150)
%152 = load i32**, i32*** %3
%153 = call i32 @free(i32** %152)
%154 = load i32**, i32*** %4
%155 = call i32 @free(i32** %154)
%156 = call i32** @make2DArray(i32 3, i32 1)
store i32** %156, i32*** %2
%157 = call i32** @make2DArray(i32 1, i32 1)
store i32** %157, i32*** %3
%158 = call i32** @make2DArray(i32 3, i32 1)
store i32** %158, i32*** %4
%159 = load i32**, i32*** %2
%160 = call i32 @fulfil2DArray(i32** %159, i32 3, i32 1)
%161 = load i32**, i32*** %3
%162 = call i32 @fulfil2DArray(i32** %161, i32 1, i32 1)
%163 = load i32**, i32*** %4
%164 = call i32 @fulfil2DArray(i32** %163, i32 3, i32 1)
%165 = load i32**, i32*** %4
%166 = load i32**, i32*** %2
%167 = load i32**, i32*** %3
%168 = call i32 @matrixMulti(i32** %165, i32** %166, i32** %167, i32 3, i32 1, i32 1, i32 1)
%169 = load i32**, i32*** %4
%170 = call i32 @print2DArray(i32** %169, i32 3, i32 1)
%171 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%172 = load i32**, i32*** %2
%173 = getelementptr inbounds i32*, i32** %172, i64 0
%174 = load i32*, i32** %173
%175 = getelementptr inbounds i32, i32* %174, i64 0
store i32 -1, i32* %175
%176 = load i32**, i32*** %4
%177 = load i32**, i32*** %2
%178 = load i32**, i32*** %3
%179 = call i32 @matrixMulti(i32** %176, i32** %177, i32** %178, i32 3, i32 1, i32 1, i32 1)
%180 = load i32**, i32*** %4
%181 = call i32 @print2DArray(i32** %180, i32 3, i32 1)
%182 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%183 = load i32**, i32*** %2
%184 = call i32 @free(i32** %183)
%185 = load i32**, i32*** %3
%186 = call i32 @free(i32** %185)
%187 = load i32**, i32*** %4
%188 = call i32 @free(i32** %187)
%189 = call i32** @make2DArray(i32 1, i32 1)
store i32** %189, i32*** %11
%190 = call i32** @make2DArray(i32 1, i32 1)
store i32** %190, i32*** %12
%191 = load i32**, i32*** %11
%192 = call i32 @fulfil2DArray(i32** %191, i32 1, i32 1)
%193 = load i32**, i32*** %12
%194 = call i32 @fulfil2DArray(i32** %193, i32 1, i32 1)
%195 = load i32**, i32*** %12
%196 = load i32**, i32*** %11
%197 = call i32 @matrixTranspose(i32** %195, i32** %196, i32 1, i32 1)
%198 = load i32**, i32*** %12
%199 = call i32 @print2DArray(i32** %198, i32 1, i32 1)
%200 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%201 = load i32**, i32*** %11
%202 = call i32 @free(i32** %201)
%203 = load i32**, i32*** %12
%204 = call i32 @free(i32** %203)
%205 = call i32** @make2DArray(i32 2, i32 2)
store i32** %205, i32*** %11
%206 = call i32** @make2DArray(i32 2, i32 2)
store i32** %206, i32*** %12
%207 = load i32**, i32*** %11
%208 = call i32 @fulfil2DArray(i32** %207, i32 2, i32 2)
%209 = load i32**, i32*** %12
%210 = call i32 @fulfil2DArray(i32** %209, i32 2, i32 2)
%211 = load i32**, i32*** %12
%212 = load i32**, i32*** %11
%213 = call i32 @matrixTranspose(i32** %211, i32** %212, i32 2, i32 2)
%214 = load i32**, i32*** %12
%215 = call i32 @print2DArray(i32** %214, i32 2, i32 2)
%216 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%217 = load i32**, i32*** %11
%218 = call i32 @free(i32** %217)
%219 = load i32**, i32*** %12
%220 = call i32 @free(i32** %219)
%221 = call i32** @make2DArray(i32 3, i32 5)
store i32** %221, i32*** %11
%222 = call i32** @make2DArray(i32 5, i32 3)
store i32** %222, i32*** %12
%223 = load i32**, i32*** %11
%224 = call i32 @fulfil2DArray(i32** %223, i32 3, i32 5)
%225 = load i32**, i32*** %12
%226 = call i32 @fulfil2DArray(i32** %225, i32 5, i32 3)
%227 = load i32**, i32*** %12
%228 = load i32**, i32*** %11
%229 = call i32 @matrixTranspose(i32** %227, i32** %228, i32 3, i32 5)
%230 = load i32**, i32*** %12
%231 = call i32 @print2DArray(i32** %230, i32 5, i32 3)
%232 = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%233 = load i32**, i32*** %11
%234 = call i32 @free(i32** %233)
%235 = load i32**, i32*** %12
%236 = call i32 @free(i32** %235)
ret i32 0
}

LLVM IR (-O2):
@.str = [9 x i8] c"--------\00"
define i32 @main() {
%1 = tail call i32** @make2DArray(i32 1, i32 1)
%2 = tail call i32** @make2DArray(i32 1, i32 1)
%3 = tail call i32** @make2DArray(i32 1, i32 1)
%4 = tail call i32 @fulfil2DArray(i32** %1, i32 1, i32 1)
%5 = tail call i32 @fulfil2DArray(i32** %2, i32 1, i32 1)
%6 = tail call i32 @fulfil2DArray(i32** %3, i32 1, i32 1)
%7 = tail call i32 @matrixSum(i32** %3, i32** %1, i32** %2, i32 1, i32 1)
%8 = tail call i32 @print2DArray(i32** %3, i32 1, i32 1)
%9 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%10 = load i32*, i32** %1
store i32 -1, i32* %10
%11 = tail call i32 @matrixSum(i32** %3, i32** %1, i32** %2, i32 1, i32 1)
%12 = tail call i32 @print2DArray(i32** %3, i32 1, i32 1)
%13 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%14 = tail call i32 @free(i32** %1)
%15 = tail call i32 @free(i32** %2)
%16 = tail call i32 @free(i32** %3)
%17 = tail call i32** @make2DArray(i32 1, i32 2)
%18 = tail call i32** @make2DArray(i32 1, i32 2)
%19 = tail call i32** @make2DArray(i32 1, i32 2)
%20 = tail call i32 @fulfil2DArray(i32** %17, i32 1, i32 2)
%21 = tail call i32 @fulfil2DArray(i32** %18, i32 1, i32 2)
%22 = tail call i32 @fulfil2DArray(i32** %19, i32 1, i32 2)
%23 = tail call i32 @matrixSum(i32** %19, i32** %17, i32** %18, i32 1, i32 2)
%24 = tail call i32 @print2DArray(i32** %19, i32 1, i32 2)
%25 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%26 = tail call i32 @free(i32** %17)
%27 = tail call i32 @free(i32** %18)
%28 = tail call i32 @free(i32** %19)
%29 = tail call i32** @make2DArray(i32 2, i32 1)
%30 = tail call i32** @make2DArray(i32 2, i32 1)
%31 = tail call i32** @make2DArray(i32 2, i32 1)
%32 = tail call i32 @fulfil2DArray(i32** %29, i32 2, i32 1)
%33 = tail call i32 @fulfil2DArray(i32** %30, i32 2, i32 1)
%34 = tail call i32 @fulfil2DArray(i32** %31, i32 2, i32 1)
%35 = tail call i32 @matrixSum(i32** %31, i32** %29, i32** %30, i32 2, i32 1)
%36 = tail call i32 @print2DArray(i32** %31, i32 2, i32 1)
%37 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%38 = tail call i32 @free(i32** %29)
%39 = tail call i32 @free(i32** %30)
%40 = tail call i32 @free(i32** %31)
%41 = tail call i32** @make2DArray(i32 1, i32 1)
%42 = tail call i32** @make2DArray(i32 1, i32 1)
%43 = tail call i32** @make2DArray(i32 1, i32 1)
%44 = tail call i32 @fulfil2DArray(i32** %41, i32 1, i32 1)
%45 = tail call i32 @fulfil2DArray(i32** %42, i32 1, i32 1)
%46 = tail call i32 @fulfil2DArray(i32** %43, i32 1, i32 1)
%47 = tail call i32 @matrixMulti(i32** %43, i32** %41, i32** %42, i32 1, i32 1, i32 1, i32 1)
%48 = tail call i32 @print2DArray(i32** %43, i32 1, i32 1)
%49 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%50 = load i32*, i32** %41
store i32 -1, i32* %50
%51 = tail call i32 @matrixMulti(i32** %43, i32** %41, i32** %42, i32 1, i32 1, i32 1, i32 1)
%52 = tail call i32 @print2DArray(i32** %43, i32 1, i32 1)
%53 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%54 = tail call i32 @free(i32** %41)
%55 = tail call i32 @free(i32** %42)
%56 = tail call i32 @free(i32** %43)
%57 = tail call i32** @make2DArray(i32 1, i32 1)
%58 = tail call i32** @make2DArray(i32 1, i32 1)
%59 = tail call i32** @make2DArray(i32 1, i32 3)
%60 = tail call i32 @fulfil2DArray(i32** %57, i32 1, i32 1)
%61 = tail call i32 @fulfil2DArray(i32** %58, i32 1, i32 3)
%62 = tail call i32 @fulfil2DArray(i32** %59, i32 1, i32 3)
%63 = tail call i32 @matrixMulti(i32** %59, i32** %57, i32** %58, i32 1, i32 1, i32 1, i32 3)
%64 = tail call i32 @print2DArray(i32** %59, i32 1, i32 3)
%65 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%66 = load i32*, i32** %57
store i32 -1, i32* %66
%67 = tail call i32 @matrixMulti(i32** %59, i32** %57, i32** %58, i32 1, i32 1, i32 1, i32 3)
%68 = tail call i32 @print2DArray(i32** %59, i32 1, i32 3)
%69 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%70 = tail call i32 @free(i32** %57)
%71 = tail call i32 @free(i32** %58)
%72 = tail call i32 @free(i32** %59)
%73 = tail call i32** @make2DArray(i32 3, i32 1)
%74 = tail call i32** @make2DArray(i32 1, i32 1)
%75 = tail call i32** @make2DArray(i32 3, i32 1)
%76 = tail call i32 @fulfil2DArray(i32** %73, i32 3, i32 1)
%77 = tail call i32 @fulfil2DArray(i32** %74, i32 1, i32 1)
%78 = tail call i32 @fulfil2DArray(i32** %75, i32 3, i32 1)
%79 = tail call i32 @matrixMulti(i32** %75, i32** %73, i32** %74, i32 3, i32 1, i32 1, i32 1)
%80 = tail call i32 @print2DArray(i32** %75, i32 3, i32 1)
%81 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%82 = load i32*, i32** %73
store i32 -1, i32* %82
%83 = tail call i32 @matrixMulti(i32** %75, i32** %73, i32** %74, i32 3, i32 1, i32 1, i32 1)
%84 = tail call i32 @print2DArray(i32** %75, i32 3, i32 1)
%85 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%86 = tail call i32 @free(i32** %73)
%87 = tail call i32 @free(i32** %74)
%88 = tail call i32 @free(i32** %75)
%89 = tail call i32** @make2DArray(i32 1, i32 1)
%90 = tail call i32** @make2DArray(i32 1, i32 1)
%91 = tail call i32 @fulfil2DArray(i32** %89, i32 1, i32 1)
%92 = tail call i32 @fulfil2DArray(i32** %90, i32 1, i32 1)
%93 = tail call i32 @matrixTranspose(i32** %90, i32** %89, i32 1, i32 1)
%94 = tail call i32 @print2DArray(i32** %90, i32 1, i32 1)
%95 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%96 = tail call i32 @free(i32** %89)
%97 = tail call i32 @free(i32** %90)
%98 = tail call i32** @make2DArray(i32 2, i32 2)
%99 = tail call i32** @make2DArray(i32 2, i32 2)
%100 = tail call i32 @fulfil2DArray(i32** %98, i32 2, i32 2)
%101 = tail call i32 @fulfil2DArray(i32** %99, i32 2, i32 2)
%102 = tail call i32 @matrixTranspose(i32** %99, i32** %98, i32 2, i32 2)
%103 = tail call i32 @print2DArray(i32** %99, i32 2, i32 2)
%104 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%105 = tail call i32 @free(i32** %98)
%106 = tail call i32 @free(i32** %99)
%107 = tail call i32** @make2DArray(i32 3, i32 5)
%108 = tail call i32** @make2DArray(i32 5, i32 3)
%109 = tail call i32 @fulfil2DArray(i32** %107, i32 3, i32 5)
%110 = tail call i32 @fulfil2DArray(i32** %108, i32 5, i32 3)
%111 = tail call i32 @matrixTranspose(i32** %108, i32** %107, i32 3, i32 5)
%112 = tail call i32 @print2DArray(i32** %108, i32 5, i32 3)
%113 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0))
%114 = tail call i32 @free(i32** %107)
%115 = tail call i32 @free(i32** %108)
ret i32 0
}