void dtrsm_l_u_n_n_3l(int m, int n, double *A, int lda, double *B, int ldb) {
  if (m == 0 || n == 0)
    return;
  int i, j, k;
  for (j = 0; j < n; j++) {
    for (k = m - 1; k >= 0; k--) {
      B[k + ldb * j] /= A[k + lda * k];
      for (i = 0; i < k; i++) {
        B[i + ldb * j] -= B[k + ldb * j] * A[i + lda * k];
      }
    }
  }
  return;
}


x86 assembly (clang, -O0):
<dtrsm_l_u_n_n_3l>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
cmpl   $0x0,-0x4(%rbp)
je     112d <dtrsm_l_u_n_n_3l+0x2d>
cmpl   $0x0,-0x8(%rbp)
jne    1132 <dtrsm_l_u_n_n_3l+0x32>
jmp    1249 <dtrsm_l_u_n_n_3l+0x149>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1244 <dtrsm_l_u_n_n_3l+0x144>
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x30(%rbp)
cmpl   $0x0,-0x30(%rbp)
jl     1231 <dtrsm_l_u_n_n_3l+0x131>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    -0x14(%rbp),%edx
imul   -0x30(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    -0x24(%rbp),%edx
imul   -0x2c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    121e <dtrsm_l_u_n_n_3l+0x11e>
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    -0x24(%rbp),%edx
imul   -0x2c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    -0x14(%rbp),%edx
imul   -0x30(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    -0x24(%rbp),%edx
imul   -0x2c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
movq   %xmm0,%rdx
movabs $0x8000000000000000,%rsi
xor    %rsi,%rdx
movq   %rdx,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1198 <dtrsm_l_u_n_n_3l+0x98>
jmp    1223 <dtrsm_l_u_n_n_3l+0x123>
mov    -0x30(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x30(%rbp)
jmp    114e <dtrsm_l_u_n_n_3l+0x4e>
jmp    1236 <dtrsm_l_u_n_n_3l+0x136>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1139 <dtrsm_l_u_n_n_3l+0x39>
jmp    1249 <dtrsm_l_u_n_n_3l+0x149>
pop    %rbp
ret

x86 assembly (clang, -O2):
<dtrsm_l_u_n_n_3l>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdi,-0x38(%rsp)
test   %edi,%edi
je     125a <dtrsm_l_u_n_n_3l+0x15a>
test   %esi,%esi
jle    125a <dtrsm_l_u_n_n_3l+0x15a>
mov    -0x38(%rsp),%rax
lea    -0x1(%rax),%edi
mov    %rdi,-0x18(%rsp)
movslq %eax,%rdi
movslq %ecx,%rax
movslq %r9d,%rbp
mov    %esi,%esi
mov    %rsi,-0x8(%rsp)
mov    %rdi,-0x20(%rsp)
lea    -0x1(%rdi),%rsi
imul   %rax,%rsi
lea    (%rdx,%rsi,8),%rsi
mov    %rsi,-0x30(%rsp)
lea    0x0(,%rax,8),%rbx
neg    %rbx
mov    %rbp,-0x28(%rsp)
lea    0x0(,%rbp,8),%rsi
mov    %rsi,-0x10(%rsp)
xor    %r13d,%r13d
mov    %r8,%rsi
jmp    1194 <dtrsm_l_u_n_n_3l+0x94>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r13
add    -0x10(%rsp),%rsi
cmp    -0x8(%rsp),%r13
je     125a <dtrsm_l_u_n_n_3l+0x15a>
cmpl   $0x0,-0x38(%rsp)
jle    1180 <dtrsm_l_u_n_n_3l+0x80>
mov    %r13,%rbp
imul   -0x28(%rsp),%rbp
mov    -0x30(%rsp),%r14
mov    -0x20(%rsp),%r10
mov    -0x18(%rsp),%r11
jmp    11cd <dtrsm_l_u_n_n_3l+0xcd>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0xffffffffffffffff,%r11
add    %rbx,%r14
cmp    $0x2,%r9
jl     1180 <dtrsm_l_u_n_n_3l+0x80>
mov    %r10,%r9
add    $0xffffffffffffffff,%r10
mov    %r10d,%edi
imul   %ecx,%edi
movslq %edi,%rdi
add    %r9,%rdi
add    $0xffffffffffffffff,%rdi
lea    -0x1(%r9,%rbp,1),%r15
movsd  (%r8,%r15,8),%xmm0
divsd  (%rdx,%rdi,8),%xmm0
movsd  %xmm0,(%r8,%r15,8)
cmp    $0x2,%r9
jl     1180 <dtrsm_l_u_n_n_3l+0x80>
mov    %r10,%rdi
imul   %rax,%rdi
mulsd  (%rdx,%rdi,8),%xmm0
movsd  (%r8,%rbp,8),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,(%r8,%rbp,8)
cmp    $0x1,%r11
je     11c0 <dtrsm_l_u_n_n_3l+0xc0>
mov    $0x1,%r12d
nopl   0x0(%rax,%rax,1)
movsd  (%r8,%r15,8),%xmm0
movsd  (%rsi,%r12,8),%xmm1
mulsd  (%r14,%r12,8),%xmm0
subsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi,%r12,8)
add    $0x1,%r12
cmp    %r12,%r11
jne    1230 <dtrsm_l_u_n_n_3l+0x130>
jmp    11c0 <dtrsm_l_u_n_n_3l+0xc0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @dtrsm_l_u_n_n_3l(i32 %0, i32 %1, double* %2, i32 %3, double* %4, i32 %5) {
%7 = alloca i32
%8 = alloca i32
%9 = alloca double*
%10 = alloca i32
%11 = alloca double*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
store i32 %0, i32* %7
store i32 %1, i32* %8
store double* %2, double** %9
store i32 %3, i32* %10
store double* %4, double** %11
store i32 %5, i32* %12
%16 = load i32, i32* %7
%17 = icmp eq i32 %16, 0
br i1 %17, label %21, label %18
18: ; preds = %6
%19 = load i32, i32* %8
%20 = icmp eq i32 %19, 0
br i1 %20, label %21, label %22
21: ; preds = %18, %6
br label %99
22: ; preds = %18
store i32 0, i32* %14
br label %23
23: ; preds = %95, %22
%24 = load i32, i32* %14
%25 = load i32, i32* %8
%26 = icmp slt i32 %24, %25
br i1 %26, label %27, label %98
27: ; preds = %23
%28 = load i32, i32* %7
%29 = sub nsw i32 %28, 1
store i32 %29, i32* %15
br label %30
30: ; preds = %91, %27
%31 = load i32, i32* %15
%32 = icmp sge i32 %31, 0
br i1 %32, label %33, label %94
33: ; preds = %30
%34 = load double*, double** %9
%35 = load i32, i32* %15
%36 = load i32, i32* %10
%37 = load i32, i32* %15
%38 = mul nsw i32 %36, %37
%39 = add nsw i32 %35, %38
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds double, double* %34, i64 %40
%42 = load double, double* %41
%43 = load double*, double** %11
%44 = load i32, i32* %15
%45 = load i32, i32* %12
%46 = load i32, i32* %14
%47 = mul nsw i32 %45, %46
%48 = add nsw i32 %44, %47
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds double, double* %43, i64 %49
%51 = load double, double* %50
%52 = fdiv double %51, %42
store double %52, double* %50
store i32 0, i32* %13
br label %53
53: ; preds = %87, %33
%54 = load i32, i32* %13
%55 = load i32, i32* %15
%56 = icmp slt i32 %54, %55
br i1 %56, label %57, label %90
57: ; preds = %53
%58 = load double*, double** %11
%59 = load i32, i32* %15
%60 = load i32, i32* %12
%61 = load i32, i32* %14
%62 = mul nsw i32 %60, %61
%63 = add nsw i32 %59, %62
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds double, double* %58, i64 %64
%66 = load double, double* %65
%67 = load double*, double** %9
%68 = load i32, i32* %13
%69 = load i32, i32* %10
%70 = load i32, i32* %15
%71 = mul nsw i32 %69, %70
%72 = add nsw i32 %68, %71
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds double, double* %67, i64 %73
%75 = load double, double* %74
%76 = load double*, double** %11
%77 = load i32, i32* %13
%78 = load i32, i32* %12
%79 = load i32, i32* %14
%80 = mul nsw i32 %78, %79
%81 = add nsw i32 %77, %80
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds double, double* %76, i64 %82
%84 = load double, double* %83
%85 = fneg double %66
%86 = call double @llvm.fmuladd.f64(double %85, double %75, double %84)
store double %86, double* %83
br label %87
87: ; preds = %57
%88 = load i32, i32* %13
%89 = add nsw i32 %88, 1
store i32 %89, i32* %13
br label %53
90: ; preds = %53
br label %91
91: ; preds = %90
%92 = load i32, i32* %15
%93 = add nsw i32 %92, -1
store i32 %93, i32* %15
br label %30
94: ; preds = %30
br label %95
95: ; preds = %94
%96 = load i32, i32* %14
%97 = add nsw i32 %96, 1
store i32 %97, i32* %14
br label %23
98: ; preds = %23
br label %99
99: ; preds = %98, %21
ret void
}

LLVM IR (-O2):
define void @dtrsm_l_u_n_n_3l(i32 %0, i32 %1, double* nocapture %2, i32 %3, double* nocapture %4, i32 %5) {
%7 = icmp ne i32 %0, 0
%8 = icmp sgt i32 %1, 0
%9 = and i1 %7, %8
br i1 %9, label %10, label %64
10: ; preds = %6
%11 = icmp sgt i32 %0, 0
%12 = add i32 %0, -1
%13 = zext i32 %12 to i64
%14 = sext i32 %0 to i64
%15 = sext i32 %3 to i64
%16 = sext i32 %5 to i64
%17 = zext i32 %1 to i64
br label %18
18: ; preds = %10, %61
%19 = phi i64 [ 0, %10 ], [ %62, %61 ]
br i1 %11, label %20, label %61
20: ; preds = %18
%21 = mul nsw i64 %19, %16
%22 = getelementptr inbounds double, double* %4, i64 %21
br label %25
23: ; preds = %48, %41
%24 = add nsw i64 %27, -1
br i1 %40, label %25, label %61
25: ; preds = %20, %23
%26 = phi i64 [ %14, %20 ], [ %28, %23 ]
%27 = phi i64 [ %13, %20 ], [ %24, %23 ]
%28 = add nsw i64 %26, -1
%29 = trunc i64 %28 to i32
%30 = mul nsw i64 %28, %15
%31 = mul nsw i32 %29, %3
%32 = sext i32 %31 to i64
%33 = add nsw i64 %28, %32
%34 = getelementptr inbounds double, double* %2, i64 %33
%35 = load double, double* %34
%36 = add nsw i64 %28, %21
%37 = getelementptr inbounds double, double* %4, i64 %36
%38 = load double, double* %37
%39 = fdiv double %38, %35
store double %39, double* %37
%40 = icmp sgt i64 %26, 1
br i1 %40, label %41, label %61
41: ; preds = %25
%42 = getelementptr inbounds double, double* %2, i64 %30
%43 = load double, double* %42
%44 = load double, double* %22
%45 = fneg double %39
%46 = tail call double @llvm.fmuladd.f64(double %45, double %43, double %44)
store double %46, double* %22
%47 = icmp eq i64 %27, 1
br i1 %47, label %23, label %48
48: ; preds = %41, %48
%49 = phi i64 [ %59, %48 ], [ 1, %41 ]
%50 = load double, double* %37
%51 = add nsw i64 %49, %30
%52 = getelementptr inbounds double, double* %2, i64 %51
%53 = load double, double* %52
%54 = add nsw i64 %49, %21
%55 = getelementptr inbounds double, double* %4, i64 %54
%56 = load double, double* %55
%57 = fneg double %50
%58 = tail call double @llvm.fmuladd.f64(double %57, double %53, double %56)
store double %58, double* %55
%59 = add nuw nsw i64 %49, 1
%60 = icmp eq i64 %59, %27
br i1 %60, label %23, label %48
61: ; preds = %23, %25, %18
%62 = add nuw nsw i64 %19, 1
%63 = icmp eq i64 %62, %17
br i1 %63, label %64, label %18
64: ; preds = %61, %6
ret void
}