void init_array(int n, double A[1300 + 0][1300 + 0],
                double B[1300 + 0][1300 + 0]) {
  int i, j;
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++) {
      A[i][j] = ((double)i * (j + 2) + 2) / n;
      B[i][j] = ((double)i * (j + 3) + 3) / n;
    }
}


x86 assembly (clang, -O0):
<init_array>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11dc <init_array+0xdc>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11c9 <init_array+0xc9>
cvtsi2sdl -0x1c(%rbp),%xmm0
mov    -0x20(%rbp),%eax
add    $0x2,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xeb8(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsi2sdl -0x4(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
imul   $0x28a0,%rcx,%rcx
add    %rcx,%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
cvtsi2sdl -0x1c(%rbp),%xmm0
mov    -0x20(%rbp),%eax
add    $0x3,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe6d(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsi2sdl -0x4(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
imul   $0x28a0,%rcx,%rcx
add    %rcx,%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1129 <init_array+0x29>
jmp    11ce <init_array+0xce>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1116 <init_array+0x16>
pop    %rbp
ret

x86 assembly (clang, -O2):
<init_array>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdx,-0x8(%rsp)
mov    %rsi,-0x10(%rsp)
test   %edi,%edi
jle    12db <init_array+0x1db>
cvtsi2sd %edi,%xmm0
mov    %edi,%r10d
mov    %r10d,%esi
and    $0xfffffffe,%esi
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    0x0(,%r10,8),%r11
and    $0xfffffffffffffff0,%r11
mov    %r10,%r9
neg    %r9
xor    %r14d,%r14d
movsd  0xf01(%rip),%xmm13
movsd  0xf00(%rip),%xmm14
movdqa 0xe9f(%rip),%xmm8
movdqa 0xea6(%rip),%xmm12
movapd 0xead(%rip),%xmm9
movdqa 0xeb4(%rip),%xmm10
movapd 0xebb(%rip),%xmm11
mov    -0x8(%rsp),%r15
mov    -0x10(%rsp),%r12
jmp    11bb <init_array+0xbb>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%r14
add    $0x28a0,%r12
add    $0x28a0,%r15
cmp    %r10,%r14
je     12db <init_array+0x1db>
xorps  %xmm6,%xmm6
cvtsi2sd %r14d,%xmm6
cmp    $0x2,%edi
jb     11ee <init_array+0xee>
imul   $0x28a0,%r14,%rcx
mov    -0x8(%rsp),%rax
add    %rcx,%rax
lea    (%rax,%r10,8),%rbx
add    -0x10(%rsp),%rcx
cmp    %rbx,%rcx
jae    1260 <init_array+0x160>
lea    (%rcx,%r10,8),%rcx
cmp    %rcx,%rax
jae    1260 <init_array+0x160>
xor    %eax,%eax
lea    (%r15,%rax,8),%r13
lea    (%r12,%rax,8),%rbx
lea    (%r9,%rax,1),%rcx
xor    %ebp,%ebp
xchg   %ax,%ax
lea    (%rax,%rbp,1),%r8d
add    $0x2,%r8d
xorps  %xmm2,%xmm2
cvtsi2sd %r8d,%xmm2
mulsd  %xmm6,%xmm2
addsd  %xmm13,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%rbx,%rbp,8)
lea    0x3(%rax,%rbp,1),%edx
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
mulsd  %xmm6,%xmm2
addsd  %xmm14,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,0x0(%r13,%rbp,8)
add    $0x1,%rbp
mov    %rcx,%rdx
add    %rbp,%rdx
jne    1200 <init_array+0x100>
jmp    11a0 <init_array+0xa0>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movapd %xmm6,%xmm7
unpcklpd %xmm6,%xmm7
xor    %eax,%eax
movdqa %xmm8,%xmm4
movdqa %xmm8,%xmm3
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
paddd  %xmm12,%xmm4
cvtdq2pd %xmm4,%xmm2
mulpd  %xmm7,%xmm2
addpd  %xmm9,%xmm2
divpd  %xmm1,%xmm2
movdqa %xmm3,%xmm5
paddd  %xmm10,%xmm5
cvtdq2pd %xmm5,%xmm5
movupd %xmm2,(%r12,%rax,1)
mulpd  %xmm7,%xmm5
addpd  %xmm11,%xmm5
divpd  %xmm1,%xmm5
movupd %xmm5,(%r15,%rax,1)
paddd  %xmm12,%xmm3
add    $0x10,%rax
cmp    %rax,%r11
jne    1280 <init_array+0x180>
mov    %rsi,%rax
cmp    %r10,%rsi
je     11a0 <init_array+0xa0>
jmp    11f0 <init_array+0xf0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @init_array(i32 %0, [1300 x double]* nocapture writeonly %1, [1300 x double]* nocapture writeonly %2) {
%4 = icmp sgt i32 %0, 0
br i1 %4, label %5, label %70
5: ; preds = %3
%6 = sitofp i32 %0 to double
%7 = zext i32 %0 to i64
%8 = icmp ult i32 %0, 2
%9 = and i64 %7, 4294967294
%10 = insertelement <2 x double> poison, double %6, i64 0
%11 = shufflevector <2 x double> %10, <2 x double> poison, <2 x i32> zeroinitializer
%12 = icmp eq i64 %9, %7
br label %13
13: ; preds = %67, %5
%14 = phi i64 [ 0, %5 ], [ %68, %67 ]
%15 = trunc i64 %14 to i32
%16 = sitofp i32 %15 to double
br i1 %8, label %49, label %17
17: ; preds = %13
%18 = getelementptr [1300 x double], [1300 x double]* %2, i64 %14, i64 %7
%19 = getelementptr [1300 x double], [1300 x double]* %2, i64 %14, i64 0
%20 = getelementptr [1300 x double], [1300 x double]* %1, i64 %14, i64 %7
%21 = getelementptr [1300 x double], [1300 x double]* %1, i64 %14, i64 0
%22 = icmp ult double* %21, %18
%23 = icmp ult double* %19, %20
%24 = and i1 %22, %23
br i1 %24, label %49, label %25
25: ; preds = %17
%26 = insertelement <2 x double> poison, double %16, i64 0
%27 = shufflevector <2 x double> %26, <2 x double> poison, <2 x i32> zeroinitializer
br label %28
28: ; preds = %28, %25
%29 = phi i64 [ 0, %25 ], [ %44, %28 ]
%30 = phi <2 x i32> [ <i32 0, i32 1>, %25 ], [ %45, %28 ]
%31 = phi <2 x i32> [ <i32 0, i32 1>, %25 ], [ %46, %28 ]
%32 = add <2 x i32> %30, <i32 2, i32 2>
%33 = sitofp <2 x i32> %32 to <2 x double>
%34 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %27, <2 x double> %33, <2 x double> <double 2.000000e+00, double 2.000000e+00>)
%35 = fdiv <2 x double> %34, %11
%36 = getelementptr inbounds [1300 x double], [1300 x double]* %1, i64 %14, i64 %29
%37 = bitcast double* %36 to <2 x double>*
store <2 x double> %35, <2 x double>* %37
%38 = add <2 x i32> %31, <i32 3, i32 3>
%39 = sitofp <2 x i32> %38 to <2 x double>
%40 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %27, <2 x double> %39, <2 x double> <double 3.000000e+00, double 3.000000e+00>)
%41 = fdiv <2 x double> %40, %11
%42 = getelementptr inbounds [1300 x double], [1300 x double]* %2, i64 %14, i64 %29
%43 = bitcast double* %42 to <2 x double>*
store <2 x double> %41, <2 x double>* %43
%44 = add nuw i64 %29, 2
%45 = add <2 x i32> %30, <i32 2, i32 2>
%46 = add <2 x i32> %31, <i32 2, i32 2>
%47 = icmp eq i64 %44, %9
br i1 %47, label %48, label %28
48: ; preds = %28
br i1 %12, label %67, label %49
49: ; preds = %17, %13, %48
%50 = phi i64 [ 0, %17 ], [ 0, %13 ], [ %9, %48 ]
br label %51
51: ; preds = %49, %51
%52 = phi i64 [ %65, %51 ], [ %50, %49 ]
%53 = trunc i64 %52 to i32
%54 = add i32 %53, 2
%55 = sitofp i32 %54 to double
%56 = tail call double @llvm.fmuladd.f64(double %16, double %55, double 2.000000e+00)
%57 = fdiv double %56, %6
%58 = getelementptr inbounds [1300 x double], [1300 x double]* %1, i64 %14, i64 %52
store double %57, double* %58
%59 = trunc i64 %52 to i32
%60 = add i32 %59, 3
%61 = sitofp i32 %60 to double
%62 = tail call double @llvm.fmuladd.f64(double %16, double %61, double 3.000000e+00)
%63 = fdiv double %62, %6
%64 = getelementptr inbounds [1300 x double], [1300 x double]* %2, i64 %14, i64 %52
store double %63, double* %64
%65 = add nuw nsw i64 %52, 1
%66 = icmp eq i64 %65, %7
br i1 %66, label %67, label %51
67: ; preds = %51, %48
%68 = add nuw nsw i64 %14, 1
%69 = icmp eq i64 %68, %7
br i1 %69, label %70, label %13
70: ; preds = %67, %3
ret void
}