void inputation(float *R, double *U, double *V, double *C, double *beta, int *I,
                int N, int M, int K, int D) {
  int i, j, k, d;
  double tmp1, tmp2;
  for (i = 0; i < N; i++) {
    for (j = 0; j < M; j++) {
      if (!I[i * M + j]) {
        tmp1 = 0;
        for (d = 0; d < D; d++)
          tmp1 += C[i * D + d] * beta[d * M + j];
        tmp2 = 0;
        for (k = 0; k < K; k++)
          tmp2 += U[k * N + i] * V[k * M + j];
        R[i * M + j] = (float)(tmp1 + tmp2);
      }
    }
  }
}


x86 assembly (clang, -O0):
<inputation>:
push   %rbp
mov    %rsp,%rbp
mov    0x28(%rbp),%eax
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    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    1281 <inputation+0x181>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    126e <inputation+0x16e>
mov    -0x30(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   0x18(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x0,(%rax,%rcx,4)
jne    125b <inputation+0x15b>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    0x28(%rbp),%eax
jge    11d0 <inputation+0xd0>
mov    -0x20(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   0x28(%rbp),%ecx
add    -0x40(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%ecx
imul   0x18(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1178 <inputation+0x78>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    0x20(%rbp),%eax
jge    1237 <inputation+0x137>
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   0x10(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   0x18(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11df <inputation+0xdf>
movsd  -0x48(%rbp),%xmm0
addsd  -0x50(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   0x18(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    1260 <inputation+0x160>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1142 <inputation+0x42>
jmp    1273 <inputation+0x173>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    112f <inputation+0x2f>
pop    %rbp
ret

x86 assembly (clang, -O2):
<inputation>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r8,-0x58(%rsp)
mov    %rcx,-0x68(%rsp)
mov    %rdx,-0x60(%rsp)
mov    %rsi,-0x70(%rsp)
mov    %rdi,-0x18(%rsp)
mov    0x38(%rsp),%eax
test   %eax,%eax
jle    1371 <inputation+0x271>
movslq 0x40(%rsp),%rcx
mov    %eax,%r8d
movslq 0x50(%rsp),%rdx
mov    %ecx,%r14d
mov    %edx,%r12d
mov    0x48(%rsp),%r13d
mov    %r12,-0x30(%rsp)
and    $0xfffffffe,%r12d
and    $0xfffffffe,%r13d
mov    -0x68(%rsp),%rax
lea    0x8(%rax),%r11
mov    %rdx,-0x48(%rsp)
lea    0x0(,%rdx,8),%rax
mov    %rax,-0x40(%rsp)
mov    %rcx,%rbx
shl    $0x4,%rbx
mov    %r8,%rax
shl    $0x4,%rax
xor    %edx,%edx
mov    %rdx,-0x78(%rsp)
mov    -0x70(%rsp),%rdx
mov    %rdx,-0x50(%rsp)
mov    %r9,-0x28(%rsp)
mov    %r14,-0x20(%rsp)
jmp    11c5 <inputation+0xc5>
nopw   0x0(%rax,%rax,1)
mov    -0x78(%rsp),%rsi
add    $0x1,%rsi
add    -0x40(%rsp),%r11
addq   $0x8,-0x50(%rsp)
mov    %rsi,%rdx
mov    %rsi,-0x78(%rsp)
cmp    %r8,%rsi
je     1371 <inputation+0x271>
cmpl   $0x0,0x40(%rsp)
jle    11a0 <inputation+0xa0>
mov    -0x78(%rsp),%rdx
mov    %rdx,%rsi
imul   %rcx,%rsi
imul   -0x48(%rsp),%rdx
mov    %rdx,-0x38(%rsp)
mov    -0x60(%rsp),%r10
mov    -0x58(%rsp),%r15
xor    %edx,%edx
mov    %rsi,-0x10(%rsp)
jmp    1239 <inputation+0x139>
cs nopw 0x0(%rax,%rax,1)
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
mov    -0x18(%rsp),%rsi
mov    -0x8(%rsp),%rdi
movss  %xmm0,(%rsi,%rdi,4)
mov    -0x20(%rsp),%r14
mov    -0x10(%rsp),%rsi
add    $0x1,%rdx
add    $0x8,%r15
add    $0x8,%r10
cmp    %r14,%rdx
je     11a0 <inputation+0xa0>
lea    (%rdx,%rsi,1),%rdi
cmpl   $0x0,(%r9,%rdi,4)
jne    1224 <inputation+0x124>
mov    %rdi,-0x8(%rsp)
xorpd  %xmm0,%xmm0
xorpd  %xmm1,%xmm1
cmpl   $0x0,0x50(%rsp)
jle    12cd <inputation+0x1cd>
cmpl   $0x1,0x50(%rsp)
jne    1267 <inputation+0x167>
xorpd  %xmm1,%xmm1
xor    %ebp,%ebp
jmp    129e <inputation+0x19e>
xorpd  %xmm2,%xmm2
mov    %r15,%rdi
xor    %ebp,%ebp
movsd  -0x8(%r11,%rbp,8),%xmm3
mulsd  (%rdi),%xmm3
movsd  (%r11,%rbp,8),%xmm1
addsd  %xmm2,%xmm3
mulsd  (%rdi,%rcx,8),%xmm1
addsd  %xmm3,%xmm1
add    $0x2,%rbp
add    %rbx,%rdi
movapd %xmm1,%xmm2
cmp    %rbp,%r12
jne    1270 <inputation+0x170>
testb  $0x1,-0x30(%rsp)
je     12cd <inputation+0x1cd>
mov    -0x38(%rsp),%rsi
lea    (%rsi,%rbp,1),%rdi
mov    -0x68(%rsp),%rsi
movsd  (%rsi,%rdi,8),%xmm2
imul   %rcx,%rbp
add    %rdx,%rbp
mov    -0x58(%rsp),%rdi
mulsd  (%rdi,%rbp,8),%xmm2
addsd  %xmm2,%xmm1
cmpl   $0x0,0x48(%rsp)
jle    1200 <inputation+0x100>
xorpd  %xmm0,%xmm0
cmpl   $0x1,0x48(%rsp)
jne    12e8 <inputation+0x1e8>
xor    %r14d,%r14d
jmp    132d <inputation+0x22d>
mov    %r10,%rbp
mov    -0x50(%rsp),%r9
xor    %r14d,%r14d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%r9),%xmm2
mulsd  0x0(%rbp),%xmm2
addsd  %xmm0,%xmm2
movsd  (%r9,%r8,8),%xmm0
mulsd  0x0(%rbp,%rcx,8),%xmm0
addsd  %xmm2,%xmm0
add    $0x2,%r14
add    %rax,%r9
add    %rbx,%rbp
cmp    %r14,%r13
jne    1300 <inputation+0x200>
mov    0x48(%rsp),%esi
test   $0x1,%sil
mov    -0x28(%rsp),%r9
je     1200 <inputation+0x100>
mov    %r14,%rdi
imul   %r8,%rdi
add    -0x78(%rsp),%rdi
mov    -0x70(%rsp),%rsi
movsd  (%rsi,%rdi,8),%xmm2
imul   %rcx,%r14
add    %rdx,%r14
mov    -0x60(%rsp),%rsi
mulsd  (%rsi,%r14,8),%xmm2
addsd  %xmm2,%xmm0
jmp    1200 <inputation+0x100>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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