void init_array(int ni, int nj, int nk, double *alpha, double *beta,
                double C[1000 + 0][1100 + 0], double A[1000 + 0][1200 + 0],
                double B[1200 + 0][1100 + 0]) {
  int i, j;
  *alpha = 1.5;
  *beta = 1.2;
  for (i = 0; i < ni; i++)
    for (j = 0; j < nj; j++)
      C[i][j] = (double)(i * j % ni) / ni;
  for (i = 0; i < ni; i++)
    for (j = 0; j < nk; j++)
      A[i][j] = (double)(i * (j + 1) % nk) / nk;
  for (i = 0; i < nk; i++)
    for (j = 0; j < nj; j++)
      B[i][j] = (double)(i * (j + 2) % nj) / nj;
}


x86 assembly (clang, -O0):
<init_array>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x18(%rbp),%rax
movsd  0xedb(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movsd  0xec3(%rip),%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11bb <init_array+0xbb>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    11a8 <init_array+0xa8>
mov    -0x2c(%rbp),%eax
imul   -0x30(%rbp),%eax
cltd
idivl  -0x4(%rbp)
cvtsi2sd %edx,%xmm0
cvtsi2sdl -0x4(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x2260,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    115b <init_array+0x5b>
jmp    11ad <init_array+0xad>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1148 <init_array+0x48>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    123a <init_array+0x13a>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1227 <init_array+0x127>
mov    -0x2c(%rbp),%eax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
cltd
idivl  -0xc(%rbp)
cvtsi2sd %edx,%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x2580,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    11d5 <init_array+0xd5>
jmp    122c <init_array+0x12c>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11c2 <init_array+0xc2>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12b9 <init_array+0x1b9>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    12a6 <init_array+0x1a6>
mov    -0x2c(%rbp),%eax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
imul   %ecx,%eax
cltd
idivl  -0x8(%rbp)
cvtsi2sd %edx,%xmm0
cvtsi2sdl -0x8(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x2260,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1254 <init_array+0x154>
jmp    12ab <init_array+0x1ab>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1241 <init_array+0x141>
pop    %rbp
ret

x86 assembly (clang, -O2):
<init_array>:
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %edx,%r10d
movabs $0x3ff8000000000000,%rax
mov    %rax,(%rcx)
movabs $0x3ff3333333333333,%rax
33 f3 3f
mov    %rax,(%r8)
mov    %esi,%r8d
mov    %edx,%r11d
test   %edi,%edi
jle    11f7 <init_array+0xf7>
mov    0x28(%rsp),%r15
cvtsi2sd %edi,%xmm0
mov    %edi,%r14d
xor    %r12d,%r12d
jmp    1160 <init_array+0x60>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%r12
add    $0x2260,%r9
cmp    %r14,%r12
je     1194 <init_array+0x94>
test   %esi,%esi
jle    1150 <init_array+0x50>
xor    %ecx,%ecx
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
mov    %ecx,%eax
cltd
idiv   %edi
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%r9,%rbx,8)
add    $0x1,%rbx
add    %r12d,%ecx
cmp    %rbx,%r8
jne    1170 <init_array+0x70>
jmp    1150 <init_array+0x50>
test   %edi,%edi
jle    11f7 <init_array+0xf7>
xorps  %xmm0,%xmm0
cvtsi2sd %r10d,%xmm0
xor    %edi,%edi
jmp    11c0 <init_array+0xc0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rdi
add    $0x2580,%r15
cmp    %r14,%rdi
je     11f7 <init_array+0xf7>
test   %r10d,%r10d
jle    11b0 <init_array+0xb0>
mov    %edi,%ecx
xor    %ebx,%ebx
nopl   0x0(%rax)
mov    %ecx,%eax
cltd
idiv   %r11d
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%r15,%rbx,8)
lea    0x1(%rbx),%rax
add    %edi,%ecx
mov    %rax,%rbx
cmp    %rax,%r11
jne    11d0 <init_array+0xd0>
jmp    11b0 <init_array+0xb0>
test   %r10d,%r10d
jle    1254 <init_array+0x154>
mov    0x30(%rsp),%r10
xorps  %xmm0,%xmm0
cvtsi2sd %esi,%xmm0
xor    %r9d,%r9d
xor    %ebx,%ebx
jmp    1224 <init_array+0x124>
nop
add    $0x1,%rbx
add    $0x2,%r9d
add    $0x2260,%r10
cmp    %r11,%rbx
je     1254 <init_array+0x154>
test   %esi,%esi
jle    1210 <init_array+0x110>
mov    %r9d,%ecx
xor    %edi,%edi
nopl   (%rax)
mov    %ecx,%eax
cltd
idiv   %r8d
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%r10,%rdi,8)
add    $0x1,%rdi
add    %ebx,%ecx
cmp    %rdi,%r8
jne    1230 <init_array+0x130>
jmp    1210 <init_array+0x110>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

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