int multiply(int array1[1][2], int array2[2][1]) {
  int i, j, k, final[1][1];
  for (i = 0; i < 1; i++) {
    for (j = 0; j < 1; j++) {
      for (k = 0; k < 2; k++) {
        final[i][j] += array1[i][k] * array2[k][j];
      }
    }
  }
  return final[1][1];
}


x86 assembly (clang, -O0):
<multiply>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x1,-0x14(%rbp)
jge    11b9 <multiply+0xb9>
movl   $0x0,-0x18(%rbp)
cmpl   $0x1,-0x18(%rbp)
jge    11a6 <multiply+0xa6>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x2,-0x1c(%rbp)
jge    1193 <multiply+0x93>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
imul   (%rax,%rcx,4),%edx
movslq -0x14(%rbp),%rcx
lea    -0x20(%rbp),%rax
shl    $0x2,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
add    (%rax,%rcx,4),%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1135 <multiply+0x35>
jmp    1198 <multiply+0x98>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1124 <multiply+0x24>
jmp    11ab <multiply+0xab>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1113 <multiply+0x13>
mov    -0x18(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<multiply>:
ret

LLVM IR (-O0):
define i32 @multiply([2 x i32]* %0, [1 x i32]* %1) {
%3 = alloca [2 x i32]*
%4 = alloca [1 x i32]*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca [1 x [1 x i32]]
store [2 x i32]* %0, [2 x i32]** %3
store [1 x i32]* %1, [1 x i32]** %4
store i32 0, i32* %5
br label %9
9: ; preds = %54, %2
%10 = load i32, i32* %5
%11 = icmp slt i32 %10, 1
br i1 %11, label %12, label %57
12: ; preds = %9
store i32 0, i32* %6
br label %13
13: ; preds = %50, %12
%14 = load i32, i32* %6
%15 = icmp slt i32 %14, 1
br i1 %15, label %16, label %53
16: ; preds = %13
store i32 0, i32* %7
br label %17
17: ; preds = %46, %16
%18 = load i32, i32* %7
%19 = icmp slt i32 %18, 2
br i1 %19, label %20, label %49
20: ; preds = %17
%21 = load [2 x i32]*, [2 x i32]** %3
%22 = load i32, i32* %5
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds [2 x i32], [2 x i32]* %21, i64 %23
%25 = load i32, i32* %7
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds [2 x i32], [2 x i32]* %24, i64 0, i64 %26
%28 = load i32, i32* %27
%29 = load [1 x i32]*, [1 x i32]** %4
%30 = load i32, i32* %7
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [1 x i32], [1 x i32]* %29, i64 %31
%33 = load i32, i32* %6
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds [1 x i32], [1 x i32]* %32, i64 0, i64 %34
%36 = load i32, i32* %35
%37 = mul nsw i32 %28, %36
%38 = load i32, i32* %5
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds [1 x [1 x i32]], [1 x [1 x i32]]* %8, i64 0, i64 %39
%41 = load i32, i32* %6
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds [1 x i32], [1 x i32]* %40, i64 0, i64 %42
%44 = load i32, i32* %43
%45 = add nsw i32 %44, %37
store i32 %45, i32* %43
br label %46
46: ; preds = %20
%47 = load i32, i32* %7
%48 = add nsw i32 %47, 1
store i32 %48, i32* %7
br label %17
49: ; preds = %17
br label %50
50: ; preds = %49
%51 = load i32, i32* %6
%52 = add nsw i32 %51, 1
store i32 %52, i32* %6
br label %13
53: ; preds = %13
br label %54
54: ; preds = %53
%55 = load i32, i32* %5
%56 = add nsw i32 %55, 1
store i32 %56, i32* %5
br label %9
57: ; preds = %9
%58 = getelementptr inbounds [1 x [1 x i32]], [1 x [1 x i32]]* %8, i64 0, i64 1
%59 = getelementptr inbounds [1 x i32], [1 x i32]* %58, i64 0, i64 1
%60 = load i32, i32* %59
ret i32 %60
}

LLVM IR (-O2):
define i32 @multiply([2 x i32]* nocapture %0, [1 x i32]* nocapture %1) {
ret i32 poison
}