double ***mult_vec_r_3(double ***res, double ***vec1, double ***vec2, int lo1,
                       int hi1, int lo2, int hi2, int lo3, int hi3) {
  int i, j, k;
  double sum = 0;
  for (i = 0; i <= hi1 - lo1; i++)
    for (j = 0; j <= hi2 - lo2; j++) {
      for (k = 0; k <= hi3 - lo3; k++) {
        res[i][j][k] = vec1[i][j][k] * vec2[i][j][k];
        sum += res[i][j][k];
      }
      res[i][j][hi3 - lo3 + 1] = sum;
      sum = 0;
    }
  return res;
}


x86 assembly (clang, -O0):
<mult_vec_r_3>:
push   %rbp
mov    %rsp,%rbp
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x20(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
cmp    %ecx,%eax
jg     1253 <mult_vec_r_3+0x153>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    0x10(%rbp),%ecx
sub    -0x24(%rbp),%ecx
cmp    %ecx,%eax
jg     1240 <mult_vec_r_3+0x140>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    0x20(%rbp),%ecx
sub    0x18(%rbp),%ecx
cmp    %ecx,%eax
jg     1200 <mult_vec_r_3+0x100>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1163 <mult_vec_r_3+0x63>
movsd  -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    0x20(%rbp),%ecx
sub    0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    114b <mult_vec_r_3+0x4b>
jmp    1245 <mult_vec_r_3+0x145>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1133 <mult_vec_r_3+0x33>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<mult_vec_r_3>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r9d,-0xc(%rsp)
mov    %rdi,-0x8(%rsp)
sub    %ecx,%r8d
jge    1129 <mult_vec_r_3+0x29>
mov    -0x8(%rsp),%rax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    0x48(%rsp),%r9d
sub    0x40(%rsp),%r9d
mov    0x38(%rsp),%eax
lea    0x1(%r9),%r12d
movslq %r12d,%r14
mov    %eax,%r15d
sub    -0xc(%rsp),%r15d
add    $0x1,%r15d
add    $0x1,%r8d
mov    %r12d,%edi
and    $0xfffffffe,%edi
xor    %ebx,%ebx
jmp    1169 <mult_vec_r_3+0x69>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rbx
cmp    %r8,%rbx
je     1119 <mult_vec_r_3+0x19>
mov    0x38(%rsp),%eax
cmp    -0xc(%rsp),%eax
jl     1160 <mult_vec_r_3+0x60>
mov    -0x8(%rsp),%rax
mov    (%rax,%rbx,8),%r13
xor    %ecx,%ecx
jmp    1199 <mult_vec_r_3+0x99>
mov    0x0(%r13,%rcx,8),%rbp
xorpd  %xmm0,%xmm0
movsd  %xmm0,0x0(%rbp,%r14,8)
add    $0x1,%rcx
cmp    %r15,%rcx
je     1160 <mult_vec_r_3+0x60>
test   %r9d,%r9d
js     1180 <mult_vec_r_3+0x80>
mov    (%rsi,%rbx,8),%rax
mov    (%rax,%rcx,8),%r10
mov    (%rdx,%rbx,8),%rax
mov    (%rax,%rcx,8),%r11
mov    0x0(%r13,%rcx,8),%rbp
xorpd  %xmm0,%xmm0
xor    %eax,%eax
cmp    $0x1,%r12d
je     11f7 <mult_vec_r_3+0xf7>
nop
movsd  (%r10,%rax,8),%xmm1
mulsd  (%r11,%rax,8),%xmm1
movsd  %xmm1,0x0(%rbp,%rax,8)
addsd  %xmm0,%xmm1
movsd  0x8(%r10,%rax,8),%xmm0
mulsd  0x8(%r11,%rax,8),%xmm0
movsd  %xmm0,0x8(%rbp,%rax,8)
addsd  %xmm1,%xmm0
add    $0x2,%rax
cmp    %rax,%rdi
jne    11c0 <mult_vec_r_3+0xc0>
test   $0x1,%r12b
je     1189 <mult_vec_r_3+0x89>
movsd  (%r10,%rax,8),%xmm1
mulsd  (%r11,%rax,8),%xmm1
movsd  %xmm1,0x0(%rbp,%rax,8)
addsd  %xmm1,%xmm0
jmp    1189 <mult_vec_r_3+0x89>

LLVM IR (-O0):
define double*** @mult_vec_r_3(double*** %0, double*** %1, double*** %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8) {
%10 = alloca double***
%11 = alloca double***
%12 = alloca double***
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca double
store double*** %0, double**** %10
store double*** %1, double**** %11
store double*** %2, double**** %12
store i32 %3, i32* %13
store i32 %4, i32* %14
store i32 %5, i32* %15
store i32 %6, i32* %16
store i32 %7, i32* %17
store i32 %8, i32* %18
store double 0.000000e+00, double* %22
store i32 0, i32* %19
br label %23
23: ; preds = %122, %9
%24 = load i32, i32* %19
%25 = load i32, i32* %14
%26 = load i32, i32* %13
%27 = sub nsw i32 %25, %26
%28 = icmp sle i32 %24, %27
br i1 %28, label %29, label %125
29: ; preds = %23
store i32 0, i32* %20
br label %30
30: ; preds = %118, %29
%31 = load i32, i32* %20
%32 = load i32, i32* %16
%33 = load i32, i32* %15
%34 = sub nsw i32 %32, %33
%35 = icmp sle i32 %31, %34
br i1 %35, label %36, label %121
36: ; preds = %30
store i32 0, i32* %21
br label %37
37: ; preds = %98, %36
%38 = load i32, i32* %21
%39 = load i32, i32* %18
%40 = load i32, i32* %17
%41 = sub nsw i32 %39, %40
%42 = icmp sle i32 %38, %41
br i1 %42, label %43, label %101
43: ; preds = %37
%44 = load double***, double**** %11
%45 = load i32, i32* %19
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds double**, double*** %44, i64 %46
%48 = load double**, double*** %47
%49 = load i32, i32* %20
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds double*, double** %48, i64 %50
%52 = load double*, double** %51
%53 = load i32, i32* %21
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds double, double* %52, i64 %54
%56 = load double, double* %55
%57 = load double***, double**** %12
%58 = load i32, i32* %19
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds double**, double*** %57, i64 %59
%61 = load double**, double*** %60
%62 = load i32, i32* %20
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds double*, double** %61, i64 %63
%65 = load double*, double** %64
%66 = load i32, i32* %21
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds double, double* %65, i64 %67
%69 = load double, double* %68
%70 = fmul double %56, %69
%71 = load double***, double**** %10
%72 = load i32, i32* %19
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds double**, double*** %71, i64 %73
%75 = load double**, double*** %74
%76 = load i32, i32* %20
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds double*, double** %75, i64 %77
%79 = load double*, double** %78
%80 = load i32, i32* %21
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds double, double* %79, i64 %81
store double %70, double* %82
%83 = load double***, double**** %10
%84 = load i32, i32* %19
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds double**, double*** %83, i64 %85
%87 = load double**, double*** %86
%88 = load i32, i32* %20
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds double*, double** %87, i64 %89
%91 = load double*, double** %90
%92 = load i32, i32* %21
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds double, double* %91, i64 %93
%95 = load double, double* %94
%96 = load double, double* %22
%97 = fadd double %96, %95
store double %97, double* %22
br label %98
98: ; preds = %43
%99 = load i32, i32* %21
%100 = add nsw i32 %99, 1
store i32 %100, i32* %21
br label %37
101: ; preds = %37
%102 = load double, double* %22
%103 = load double***, double**** %10
%104 = load i32, i32* %19
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds double**, double*** %103, i64 %105
%107 = load double**, double*** %106
%108 = load i32, i32* %20
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds double*, double** %107, i64 %109
%111 = load double*, double** %110
%112 = load i32, i32* %18
%113 = load i32, i32* %17
%114 = sub nsw i32 %112, %113
%115 = add nsw i32 %114, 1
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds double, double* %111, i64 %116
store double %102, double* %117
store double 0.000000e+00, double* %22
br label %118
118: ; preds = %101
%119 = load i32, i32* %20
%120 = add nsw i32 %119, 1
store i32 %120, i32* %20
br label %30
121: ; preds = %30
br label %122
122: ; preds = %121
%123 = load i32, i32* %19
%124 = add nsw i32 %123, 1
store i32 %124, i32* %19
br label %23
125: ; preds = %23
%126 = load double***, double**** %10
ret double*** %126
}

LLVM IR (-O2):
define double*** @mult_vec_r_3(double*** returned %0, double*** nocapture %1, double*** nocapture %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8) {
%10 = icmp slt i32 %4, %3
br i1 %10, label %94, label %11
11: ; preds = %9
%12 = icmp slt i32 %6, %5
%13 = sub nsw i32 %8, %7
%14 = icmp slt i32 %13, 0
%15 = add nsw i32 %13, 1
%16 = sext i32 %15 to i64
%17 = add i32 %8, 1
%18 = sub i32 %17, %7
%19 = add i32 %6, 1
%20 = sub i32 %19, %5
%21 = add i32 %4, 1
%22 = sub i32 %21, %3
%23 = zext i32 %22 to i64
%24 = zext i32 %20 to i64
%25 = zext i32 %18 to i64
%26 = and i64 %25, 1
%27 = icmp eq i32 %18, 1
%28 = and i64 %25, 4294967294
%29 = icmp eq i64 %26, 0
br label %30
30: ; preds = %11, %91
%31 = phi i64 [ 0, %11 ], [ %92, %91 ]
br i1 %12, label %91, label %32
32: ; preds = %30
%33 = getelementptr inbounds double**, double*** %1, i64 %31
%34 = getelementptr inbounds double**, double*** %2, i64 %31
%35 = getelementptr inbounds double**, double*** %0, i64 %31
%36 = load double**, double*** %35
br label %37
37: ; preds = %32, %85
%38 = phi i64 [ 0, %32 ], [ %89, %85 ]
br i1 %14, label %39, label %42
39: ; preds = %37
%40 = getelementptr inbounds double*, double** %36, i64 %38
%41 = load double*, double** %40
br label %85
42: ; preds = %37
%43 = load double**, double*** %33
%44 = getelementptr inbounds double*, double** %43, i64 %38
%45 = load double*, double** %44
%46 = load double**, double*** %34
%47 = getelementptr inbounds double*, double** %46, i64 %38
%48 = load double*, double** %47
%49 = getelementptr inbounds double*, double** %36, i64 %38
%50 = load double*, double** %49
br i1 %27, label %73, label %51
51: ; preds = %42, %51
%52 = phi i64 [ %70, %51 ], [ 0, %42 ]
%53 = phi double [ %69, %51 ], [ 0.000000e+00, %42 ]
%54 = phi i64 [ %71, %51 ], [ 0, %42 ]
%55 = getelementptr inbounds double, double* %45, i64 %52
%56 = load double, double* %55
%57 = getelementptr inbounds double, double* %48, i64 %52
%58 = load double, double* %57
%59 = fmul double %56, %58
%60 = getelementptr inbounds double, double* %50, i64 %52
store double %59, double* %60
%61 = fadd double %53, %59
%62 = or i64 %52, 1
%63 = getelementptr inbounds double, double* %45, i64 %62
%64 = load double, double* %63
%65 = getelementptr inbounds double, double* %48, i64 %62
%66 = load double, double* %65
%67 = fmul double %64, %66
%68 = getelementptr inbounds double, double* %50, i64 %62
store double %67, double* %68
%69 = fadd double %61, %67
%70 = add nuw nsw i64 %52, 2
%71 = add i64 %54, 2
%72 = icmp eq i64 %71, %28
br i1 %72, label %73, label %51
73: ; preds = %51, %42
%74 = phi double [ undef, %42 ], [ %69, %51 ]
%75 = phi i64 [ 0, %42 ], [ %70, %51 ]
%76 = phi double [ 0.000000e+00, %42 ], [ %69, %51 ]
br i1 %29, label %85, label %77
77: ; preds = %73
%78 = getelementptr inbounds double, double* %45, i64 %75
%79 = load double, double* %78
%80 = getelementptr inbounds double, double* %48, i64 %75
%81 = load double, double* %80
%82 = fmul double %79, %81
%83 = getelementptr inbounds double, double* %50, i64 %75
store double %82, double* %83
%84 = fadd double %76, %82
br label %85
85: ; preds = %77, %73, %39
%86 = phi double* [ %41, %39 ], [ %50, %73 ], [ %50, %77 ]
%87 = phi double [ 0.000000e+00, %39 ], [ %74, %73 ], [ %84, %77 ]
%88 = getelementptr inbounds double, double* %86, i64 %16
store double %87, double* %88
%89 = add nuw nsw i64 %38, 1
%90 = icmp eq i64 %89, %24
br i1 %90, label %91, label %37
91: ; preds = %85, %30
%92 = add nuw nsw i64 %31, 1
%93 = icmp eq i64 %92, %23
br i1 %93, label %94, label %30
94: ; preds = %91, %9
ret double*** %0
}