void clear_dmatrix3d(double ***m, int nsl, int nsh, int nrl, int nrh, int ncl,
                     int nch) {
  int i, j, k;
  for (i = nsl; i <= nsh; i++) {
    for (j = nrl; j <= nrh; j++)
      for (k = ncl; k <= nch; k++)
        m[i][j][k] = 0.0;
  }
}


x86 assembly (clang, -O0):
<clear_dmatrix3d>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9d,-0x1c(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x10(%rbp),%eax
jg     11a6 <clear_dmatrix3d+0xa6>
mov    -0x14(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x18(%rbp),%eax
jg     1193 <clear_dmatrix3d+0x93>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    0x10(%rbp),%eax
jg     1180 <clear_dmatrix3d+0x80>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1146 <clear_dmatrix3d+0x46>
jmp    1185 <clear_dmatrix3d+0x85>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1134 <clear_dmatrix3d+0x34>
jmp    1198 <clear_dmatrix3d+0x98>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1122 <clear_dmatrix3d+0x22>
pop    %rbp
ret

x86 assembly (clang, -O2):
<clear_dmatrix3d>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %r8,0x18(%rsp)
mov    %ecx,0x8(%rsp)
mov    %rdi,0x28(%rsp)
mov    %edx,0x4(%rsp)
cmp    %edx,%esi
jle    1143 <clear_dmatrix3d+0x33>
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r9d,%ebx
mov    0x70(%rsp),%ecx
movslq %r9d,%rdi
mov    %ecx,%eax
mov    %rdi,%rdx
mov    %rdi,0x20(%rsp)
sub    %edi,%eax
lea    0x8(,%rax,8),%r13
movslq 0x8(%rsp),%rax
mov    0x18(%rsp),%rdi
lea    0x1(%rdi),%edx
movslq %esi,%r14
addl   $0x1,0x4(%rsp)
mov    %rdx,0x30(%rsp)
sub    %eax,%edx
mov    %edi,%esi
mov    %rax,0x10(%rsp)
sub    %eax,%esi
mov    %esi,0xc(%rsp)
and    $0x3,%edx
mov    %edx,(%rsp)
jmp    11ab <clear_dmatrix3d+0x9b>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%r14
cmp    %r14d,0x4(%rsp)
je     1134 <clear_dmatrix3d+0x24>
mov    0x18(%rsp),%rax
cmp    0x8(%rsp),%eax
jl     11a0 <clear_dmatrix3d+0x90>
mov    0x10(%rsp),%r12
cmpl   $0x0,(%rsp)
je     1210 <clear_dmatrix3d+0x100>
mov    (%rsp),%ebp
mov    0x10(%rsp),%r12
jmp    11d9 <clear_dmatrix3d+0xc9>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r12
add    $0xffffffff,%ebp
je     1210 <clear_dmatrix3d+0x100>
cmp    %ebx,%ecx
jl     11d0 <clear_dmatrix3d+0xc0>
mov    0x28(%rsp),%rax
mov    (%rax,%r14,8),%rax
mov    0x20(%rsp),%rcx
lea    0x0(,%rcx,8),%rdi
add    (%rax,%r12,8),%rdi
xor    %esi,%esi
mov    %r13,%rdx
call   1030 <memset@plt>
mov    0x70(%rsp),%ecx
jmp    11d0 <clear_dmatrix3d+0xc0>
nopw   0x0(%rax,%rax,1)
cmpl   $0x3,0xc(%rsp)
jae    122f <clear_dmatrix3d+0x11f>
jmp    11a0 <clear_dmatrix3d+0x90>
nopl   0x0(%rax)
add    $0x4,%r12
cmp    %r12d,0x30(%rsp)
je     11a0 <clear_dmatrix3d+0x90>
cmp    %ebx,%ecx
jl     1220 <clear_dmatrix3d+0x110>
mov    0x28(%rsp),%rbp
mov    0x0(%rbp,%r14,8),%rax
mov    0x20(%rsp),%rcx
lea    0x0(,%rcx,8),%r15
mov    (%rax,%r12,8),%rdi
add    %r15,%rdi
xor    %esi,%esi
mov    %r13,%rdx
call   1030 <memset@plt>
mov    0x0(%rbp,%r14,8),%rax
mov    0x8(%rax,%r12,8),%rdi
add    %r15,%rdi
xor    %esi,%esi
mov    %r13,%rdx
call   1030 <memset@plt>
mov    0x0(%rbp,%r14,8),%rax
mov    0x10(%rax,%r12,8),%rdi
add    %r15,%rdi
xor    %esi,%esi
mov    %r13,%rdx
call   1030 <memset@plt>
mov    0x0(%rbp,%r14,8),%rax
add    0x18(%rax,%r12,8),%r15
mov    %r15,%rdi
xor    %esi,%esi
mov    %r13,%rdx
call   1030 <memset@plt>
mov    0x70(%rsp),%ecx
jmp    1220 <clear_dmatrix3d+0x110>

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

LLVM IR (-O2):
define void @clear_dmatrix3d(double*** nocapture %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6) {
%8 = icmp sgt i32 %1, %2
br i1 %8, label %79, label %9
9: ; preds = %7
%10 = icmp slt i32 %4, %3
%11 = icmp slt i32 %6, %5
%12 = sext i32 %5 to i64
%13 = sub i32 %6, %5
%14 = zext i32 %13 to i64
%15 = shl nuw nsw i64 %14, 3
%16 = add nuw nsw i64 %15, 8
%17 = sext i32 %3 to i64
%18 = add i32 %4, 1
%19 = sext i32 %1 to i64
%20 = add i32 %2, 1
%21 = sub i32 %18, %3
%22 = sub i32 %4, %3
%23 = and i32 %21, 3
%24 = icmp eq i32 %23, 0
%25 = icmp ult i32 %22, 3
br label %26
26: ; preds = %9, %75
%27 = phi i64 [ %19, %9 ], [ %76, %75 ]
br i1 %10, label %75, label %28
28: ; preds = %26
%29 = getelementptr inbounds double**, double*** %0, i64 %27
br i1 %24, label %43, label %30
30: ; preds = %28, %39
%31 = phi i64 [ %40, %39 ], [ %17, %28 ]
%32 = phi i32 [ %41, %39 ], [ 0, %28 ]
br i1 %11, label %39, label %33
33: ; preds = %30
%34 = load double**, double*** %29
%35 = getelementptr inbounds double*, double** %34, i64 %31
%36 = load double*, double** %35
%37 = getelementptr double, double* %36, i64 %12
%38 = bitcast double* %37 to i8*
br label %39
39: ; preds = %33, %30
%40 = add nsw i64 %31, 1
%41 = add i32 %32, 1
%42 = icmp eq i32 %41, %23
br i1 %42, label %43, label %30
43: ; preds = %39, %28
%44 = phi i64 [ %17, %28 ], [ %40, %39 ]
br i1 %25, label %75, label %45
45: ; preds = %43, %71
%46 = phi i64 [ %72, %71 ], [ %44, %43 ]
br i1 %11, label %71, label %47
47: ; preds = %45
%48 = load double**, double*** %29
%49 = getelementptr inbounds double*, double** %48, i64 %46
%50 = load double*, double** %49
%51 = getelementptr double, double* %50, i64 %12
%52 = bitcast double* %51 to i8*
%53 = add nsw i64 %46, 1
%54 = load double**, double*** %29
%55 = getelementptr inbounds double*, double** %54, i64 %53
%56 = load double*, double** %55
%57 = getelementptr double, double* %56, i64 %12
%58 = bitcast double* %57 to i8*
%59 = add nsw i64 %46, 2
%60 = load double**, double*** %29
%61 = getelementptr inbounds double*, double** %60, i64 %59
%62 = load double*, double** %61
%63 = getelementptr double, double* %62, i64 %12
%64 = bitcast double* %63 to i8*
%65 = add nsw i64 %46, 3
%66 = load double**, double*** %29
%67 = getelementptr inbounds double*, double** %66, i64 %65
%68 = load double*, double** %67
%69 = getelementptr double, double* %68, i64 %12
%70 = bitcast double* %69 to i8*
br label %71
71: ; preds = %45, %47
%72 = add nsw i64 %46, 4
%73 = trunc i64 %72 to i32
%74 = icmp eq i32 %18, %73
br i1 %74, label %75, label %45
75: ; preds = %43, %71, %26
%76 = add nsw i64 %27, 1
%77 = trunc i64 %76 to i32
%78 = icmp eq i32 %20, %77
br i1 %78, label %79, label %26
79: ; preds = %75, %7
ret void
}