float KahanSummation(int from, int to) {
  int i;
  float y, t;
  float sum = 1.0 / (float)from;
  float c = 0.0;
  for (i = from + 1; i <= to; i++) {
    y = (1.0 / (float)i) - c;
    t = sum + y;
    c = (t - sum) - y;
    sum = t;
  }
  return sum;
}


x86 assembly (clang, -O0):
<KahanSummation>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
cvtsi2ssl -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xee5(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x8(%rbp),%eax
jg     11ab <KahanSummation+0xab>
cvtsi2ssl -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xeaa(%rip),%xmm0
divsd  %xmm1,%xmm0
movss  -0x1c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x18(%rbp),%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
subss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1139 <KahanSummation+0x39>
movss  -0x18(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<KahanSummation>:
cvtsi2ss %edi,%xmm0
movss  0xef4(%rip),%xmm2
movaps %xmm2,%xmm3
divss  %xmm0,%xmm3
mov    %esi,%ecx
sub    %edi,%ecx
jle    1127 <KahanSummation+0x27>
mov    %edi,%eax
not    %eax
test   $0x1,%cl
jne    112b <KahanSummation+0x2b>
xorps  %xmm1,%xmm1
jmp    114e <KahanSummation+0x4e>
movaps %xmm3,%xmm0
ret
add    $0x1,%edi
xorps  %xmm0,%xmm0
cvtsi2ss %edi,%xmm0
divss  %xmm0,%xmm2
movaps %xmm3,%xmm0
addss  %xmm2,%xmm0
movaps %xmm0,%xmm1
subss  %xmm3,%xmm1
subss  %xmm2,%xmm1
movaps %xmm0,%xmm3
neg    %esi
cmp    %esi,%eax
je     11f0 <KahanSummation+0xf0>
add    $0x1,%edi
movsd  0xea5(%rip),%xmm2
movaps %xmm3,%xmm0
cs nopw 0x0(%rax,%rax,1)
xorps  %xmm3,%xmm3
cvtsi2ss %edi,%xmm3
cvtss2sd %xmm3,%xmm3
movapd %xmm2,%xmm4
divsd  %xmm3,%xmm4
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm4
xorps  %xmm1,%xmm1
cvtsd2ss %xmm4,%xmm1
movaps %xmm0,%xmm3
addss  %xmm1,%xmm3
movaps %xmm3,%xmm4
subss  %xmm0,%xmm4
subss  %xmm1,%xmm4
lea    0x1(%rdi),%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
cvtss2sd %xmm0,%xmm0
movapd %xmm2,%xmm1
divsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm4,%xmm0
subsd  %xmm0,%xmm1
xorps  %xmm4,%xmm4
cvtsd2ss %xmm1,%xmm4
movaps %xmm3,%xmm0
addss  %xmm4,%xmm0
movaps %xmm0,%xmm1
subss  %xmm3,%xmm1
subss  %xmm4,%xmm1
lea    (%rsi,%rdi,1),%eax
add    $0x2,%eax
mov    %edi,%ecx
add    $0x2,%ecx
mov    %ecx,%edi
cmp    $0x1,%eax
jne    1170 <KahanSummation+0x70>
ret

LLVM IR (-O0):
define float @KahanSummation(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
store i32 %0, i32* %3
store i32 %1, i32* %4
%10 = load i32, i32* %3
%11 = sitofp i32 %10 to float
%12 = fpext float %11 to double
%13 = fdiv double 1.000000e+00, %12
%14 = fptrunc double %13 to float
store float %14, float* %8
store float 0.000000e+00, float* %9
%15 = load i32, i32* %3
%16 = add nsw i32 %15, 1
store i32 %16, i32* %5
br label %17
17: ; preds = %39, %2
%18 = load i32, i32* %5
%19 = load i32, i32* %4
%20 = icmp sle i32 %18, %19
br i1 %20, label %21, label %42
21: ; preds = %17
%22 = load i32, i32* %5
%23 = sitofp i32 %22 to float
%24 = fpext float %23 to double
%25 = fdiv double 1.000000e+00, %24
%26 = load float, float* %9
%27 = fpext float %26 to double
%28 = fsub double %25, %27
%29 = fptrunc double %28 to float
store float %29, float* %6
%30 = load float, float* %8
%31 = load float, float* %6
%32 = fadd float %30, %31
store float %32, float* %7
%33 = load float, float* %7
%34 = load float, float* %8
%35 = fsub float %33, %34
%36 = load float, float* %6
%37 = fsub float %35, %36
store float %37, float* %9
%38 = load float, float* %7
store float %38, float* %8
br label %39
39: ; preds = %21
%40 = load i32, i32* %5
%41 = add nsw i32 %40, 1
store i32 %41, i32* %5
br label %17
42: ; preds = %17
%43 = load float, float* %8
ret float %43
}

LLVM IR (-O2):
define float @KahanSummation(i32 %0, i32 %1) {
%3 = sitofp i32 %0 to float
%4 = fdiv float 1.000000e+00, %3
%5 = icmp sgt i32 %1, %0
br i1 %5, label %6, label %50
6: ; preds = %2
%7 = sub i32 %1, %0
%8 = xor i32 %0, -1
%9 = and i32 %7, 1
%10 = icmp eq i32 %9, 0
br i1 %10, label %18, label %11
11: ; preds = %6
%12 = add nsw i32 %0, 1
%13 = sitofp i32 %12 to float
%14 = fdiv float 1.000000e+00, %13
%15 = fadd float %4, %14
%16 = fsub float %15, %4
%17 = fsub float %16, %14
br label %18
18: ; preds = %11, %6
%19 = phi float [ undef, %6 ], [ %15, %11 ]
%20 = phi i32 [ %0, %6 ], [ %12, %11 ]
%21 = phi float [ 0.000000e+00, %6 ], [ %17, %11 ]
%22 = phi float [ %4, %6 ], [ %15, %11 ]
%23 = sub i32 0, %1
%24 = icmp eq i32 %8, %23
br i1 %24, label %50, label %25
25: ; preds = %18, %25
%26 = phi i32 [ %39, %25 ], [ %20, %18 ]
%27 = phi float [ %48, %25 ], [ %21, %18 ]
%28 = phi float [ %46, %25 ], [ %22, %18 ]
%29 = add nsw i32 %26, 1
%30 = sitofp i32 %29 to float
%31 = fpext float %30 to double
%32 = fdiv double 1.000000e+00, %31
%33 = fpext float %27 to double
%34 = fsub double %32, %33
%35 = fptrunc double %34 to float
%36 = fadd float %28, %35
%37 = fsub float %36, %28
%38 = fsub float %37, %35
%39 = add nsw i32 %26, 2
%40 = sitofp i32 %39 to float
%41 = fpext float %40 to double
%42 = fdiv double 1.000000e+00, %41
%43 = fpext float %38 to double
%44 = fsub double %42, %43
%45 = fptrunc double %44 to float
%46 = fadd float %36, %45
%47 = fsub float %46, %36
%48 = fsub float %47, %45
%49 = icmp eq i32 %39, %1
br i1 %49, label %50, label %25
50: ; preds = %18, %25, %2
%51 = phi float [ %4, %2 ], [ %19, %18 ], [ %46, %25 ]
ret float %51
}