void init_array(int n, int m, double *alpha, double *beta,
                double C[1200 + 0][1200 + 0], double A[1200 + 0][1000 + 0],
                double B[1200 + 0][1000 + 0]) {
  int i, j;
  *alpha = 1.5;
  *beta = 1.2;
  for (i = 0; i < n; i++)
    for (j = 0; j < m; j++) {
      A[i][j] = (double)(i * j % n) / n;
      B[i][j] = (double)(i * j % m) / m;
    }
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      C[i][j] = (double)(i * j % n) / m;
}


x86 assembly (clang, -O0):
<init_array>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movsd  0xede(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  0xec6(%rip),%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11eb <init_array+0xeb>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    11d8 <init_array+0xd8>
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   $0x1f40,%rcx,%rcx
add    %rcx,%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
imul   -0x30(%rbp),%eax
cltd
idivl  -0x8(%rbp)
cvtsi2sd %edx,%xmm0
cvtsi2sdl -0x8(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
imul   $0x1f40,%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    1158 <init_array+0x58>
jmp    11dd <init_array+0xdd>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1145 <init_array+0x45>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1265 <init_array+0x165>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1252 <init_array+0x152>
mov    -0x2c(%rbp),%eax
imul   -0x30(%rbp),%eax
cltd
idivl  -0x4(%rbp)
cvtsi2sd %edx,%xmm0
cvtsi2sdl -0x8(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%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    1205 <init_array+0x105>
jmp    1257 <init_array+0x157>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11f2 <init_array+0xf2>
pop    %rbp
ret

x86 assembly (clang, -O2):
<init_array>:
push   %r15
push   %r14
push   %rbx
movabs $0x3ff8000000000000,%rax
mov    %rax,(%rdx)
movabs $0x3ff3333333333333,%rax
33 f3 3f
mov    %rax,(%rcx)
test   %edi,%edi
jle    11f2 <init_array+0xf2>
mov    0x20(%rsp),%r11
mov    %edi,%r10d
cvtsi2sd %edi,%xmm1
mov    %esi,%r15d
cvtsi2sd %esi,%xmm0
xor    %r14d,%r14d
jmp    1157 <init_array+0x57>
nop
add    $0x1,%r14
add    $0x1f40,%r11
add    $0x1f40,%r9
cmp    %r10,%r14
je     119b <init_array+0x9b>
test   %esi,%esi
jle    1140 <init_array+0x40>
xor    %ecx,%ecx
xor    %ebx,%ebx
nop
mov    %ecx,%eax
cltd
idiv   %edi
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
divsd  %xmm1,%xmm2
movsd  %xmm2,(%r9,%rbx,8)
mov    %ecx,%eax
cltd
idiv   %r15d
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%r11,%rbx,8)
add    $0x1,%rbx
add    %r14d,%ecx
cmp    %rbx,%r15
jne    1160 <init_array+0x60>
jmp    1140 <init_array+0x40>
test   %edi,%edi
jle    11f2 <init_array+0xf2>
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xor    %ecx,%ecx
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %ecx,%eax
cltd
idiv   %r10d
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%r8,%rdi,8)
add    $0x1,%rdi
add    %esi,%ecx
cmp    %rdi,%r10
jne    11c0 <init_array+0xc0>
add    $0x1,%rsi
add    $0x2580,%r8
cmp    %r10,%rsi
jne    11b0 <init_array+0xb0>
pop    %rbx
pop    %r14
pop    %r15
ret

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

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