void init_array(int m, int n, double A[1900 + 0][2100 + 0],
                double x[2100 + 0]) {
  int i, j;
  double fn;
  fn = (double)n;
  for (i = 0; i < n; i++)
    x[i] = 1 + (i / fn);
  for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
      A[i][j] = (double)((i + j) % n) / (5 * m);
}


x86 assembly (clang, -O0):
<init_array>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1160 <init_array+0x60>
cvtsi2sdl -0x1c(%rbp),%xmm1
divsd  -0x28(%rbp),%xmm1
movsd  0xebf(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1123 <init_array+0x23>
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    -0x8(%rbp),%eax
jge    11c9 <init_array+0xc9>
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
cltd
idivl  -0x8(%rbp)
cvtsi2sd %edx,%xmm0
imul   $0x5,-0x4(%rbp),%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
imul   $0x41a0,%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    117a <init_array+0x7a>
jmp    11ce <init_array+0xce>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1167 <init_array+0x67>
pop    %rbp
ret

x86 assembly (clang, -O2):
<init_array>:
mov    %rdx,%r8
mov    %esi,%r9d
test   %esi,%esi
jle    11fd <init_array+0xfd>
cvtsi2sd %esi,%xmm0
cmp    $0x1,%esi
jne    111e <init_array+0x1e>
xor    %eax,%eax
jmp    11c9 <init_array+0xc9>
mov    %r9d,%eax
and    $0xfffffffe,%eax
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x2(%rax),%rdx
mov    %rdx,%r10
shr    %r10
add    $0x1,%r10
test   %rdx,%rdx
je     1264 <init_array+0x164>
mov    %r10,%r11
and    $0xfffffffffffffffe,%r11
movdqa 0xebe(%rip),%xmm2
xor    %edx,%edx
movapd 0xec4(%rip),%xmm3
movdqa 0xecc(%rip),%xmm4
movdqa 0xed4(%rip),%xmm5
nopl   0x0(%rax)
cvtdq2pd %xmm2,%xmm6
divpd  %xmm1,%xmm6
addpd  %xmm3,%xmm6
movupd %xmm6,(%rcx,%rdx,8)
movdqa %xmm2,%xmm6
paddd  %xmm4,%xmm6
cvtdq2pd %xmm6,%xmm6
divpd  %xmm1,%xmm6
addpd  %xmm3,%xmm6
movupd %xmm6,0x10(%rcx,%rdx,8)
add    $0x4,%rdx
paddd  %xmm5,%xmm2
add    $0xfffffffffffffffe,%r11
jne    1170 <init_array+0x70>
cvtdq2pd %xmm2,%xmm2
test   $0x1,%r10b
je     11c4 <init_array+0xc4>
divpd  %xmm1,%xmm2
addpd  0xe61(%rip),%xmm2
movupd %xmm2,(%rcx,%rdx,8)
cmp    %r9,%rax
je     11fd <init_array+0xfd>
movsd  0xe2f(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
divsd  %xmm0,%xmm2
addsd  %xmm1,%xmm2
movsd  %xmm2,(%rcx,%rax,8)
add    $0x1,%rax
cmp    %rax,%r9
jne    11e0 <init_array+0xe0>
test   %edi,%edi
jle    1263 <init_array+0x163>
lea    (%rdi,%rdi,4),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mov    %edi,%r10d
xor    %edi,%edi
jmp    1230 <init_array+0x130>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%rdi
add    $0x41a0,%r8
cmp    %r10,%rdi
je     1263 <init_array+0x163>
test   %esi,%esi
jle    1220 <init_array+0x120>
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
lea    (%rdi,%rcx,1),%eax
cltd
idiv   %r9d
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%r8,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%r9
jne    1240 <init_array+0x140>
jmp    1220 <init_array+0x120>
ret
xorpd  %xmm2,%xmm2
movhpd 0xd90(%rip),%xmm2
xor    %edx,%edx
test   $0x1,%r10b
jne    11b3 <init_array+0xb3>
jmp    11c4 <init_array+0xc4>

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

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