void foo(double Ke[2], int i, double ds[], int column) {
  double tt, ts;
  int j;
  for (j = 0; j < 2; j++) {
    ++column;
    ts = ds[i];
    if (i == j)
      tt = 123;
    else
      tt = 0;
    Ke[column] = Ke[column] + ts + tt;
  }
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movl   $0x0,-0x34(%rbp)
cmpl   $0x2,-0x34(%rbp)
jge    1196 <foo+0x96>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x34(%rbp),%eax
jne    115c <foo+0x5c>
movsd  0xeae(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    1164 <foo+0x64>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x30(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1119 <foo+0x19>
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
movslq %esi,%rsi
movslq %ecx,%rax
movsd  (%rdx,%rsi,8),%xmm1
movsd  0xeed(%rip),%xmm0
movapd %xmm0,%xmm2
test   %esi,%esi
je     111f <foo+0x1f>
xorpd  %xmm2,%xmm2
addsd  0x8(%rdi,%rax,8),%xmm1
addsd  %xmm2,%xmm1
movsd  %xmm1,0x8(%rdi,%rax,8)
movsd  (%rdx,%rsi,8),%xmm1
cmp    $0x1,%esi
je     113d <foo+0x3d>
xorpd  %xmm0,%xmm0
addsd  0x10(%rdi,%rax,8),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x10(%rdi,%rax,8)
ret

LLVM IR (-O0):
define void @foo(double* %0, i32 %1, double* %2, i32 %3) {
%5 = alloca double*
%6 = alloca i32
%7 = alloca double*
%8 = alloca i32
%9 = alloca double
%10 = alloca double
%11 = alloca i32
store double* %0, double** %5
store i32 %1, i32* %6
store double* %2, double** %7
store i32 %3, i32* %8
store i32 0, i32* %11
br label %12
12: ; preds = %42, %4
%13 = load i32, i32* %11
%14 = icmp slt i32 %13, 2
br i1 %14, label %15, label %45
15: ; preds = %12
%16 = load i32, i32* %8
%17 = add nsw i32 %16, 1
store i32 %17, i32* %8
%18 = load double*, double** %7
%19 = load i32, i32* %6
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds double, double* %18, i64 %20
%22 = load double, double* %21
store double %22, double* %10
%23 = load i32, i32* %6
%24 = load i32, i32* %11
%25 = icmp eq i32 %23, %24
br i1 %25, label %26, label %27
26: ; preds = %15
store double 1.230000e+02, double* %9
br label %28
27: ; preds = %15
store double 0.000000e+00, double* %9
br label %28
28: ; preds = %27, %26
%29 = load double*, double** %5
%30 = load i32, i32* %8
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds double, double* %29, i64 %31
%33 = load double, double* %32
%34 = load double, double* %10
%35 = fadd double %33, %34
%36 = load double, double* %9
%37 = fadd double %35, %36
%38 = load double*, double** %5
%39 = load i32, i32* %8
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds double, double* %38, i64 %40
store double %37, double* %41
br label %42
42: ; preds = %28
%43 = load i32, i32* %11
%44 = add nsw i32 %43, 1
store i32 %44, i32* %11
br label %12
45: ; preds = %12
ret void
}

LLVM IR (-O2):
define void @foo(double* nocapture %0, i32 %1, double* nocapture %2, i32 %3) {
%5 = sext i32 %1 to i64
%6 = getelementptr inbounds double, double* %2, i64 %5
%7 = sext i32 %3 to i64
%8 = add nsw i64 %7, 1
%9 = load double, double* %6
%10 = icmp eq i32 %1, 0
%11 = select i1 %10, double 1.230000e+02, double 0.000000e+00
%12 = getelementptr inbounds double, double* %0, i64 %8
%13 = load double, double* %12
%14 = fadd double %9, %13
%15 = fadd double %11, %14
store double %15, double* %12
%16 = add nsw i64 %7, 2
%17 = load double, double* %6
%18 = icmp eq i32 %1, 1
%19 = select i1 %18, double 1.230000e+02, double 0.000000e+00
%20 = getelementptr inbounds double, double* %0, i64 %16
%21 = load double, double* %20
%22 = fadd double %17, %21
%23 = fadd double %19, %22
store double %23, double* %20
ret void
}