float pi() {
  float ret = 0;
  int i = 1;
  while (i < 500000) {
    ret = ret + 1.0 / i / i;
    i = i + 1;
  }
  ret = ret * 6;
  float x = 0, s = 1;
  while (ret - x * x > 0.00001) {
    while (ret - (x + s) * (x + s) < 0) {
      s = s / 2;
    }
    x = x + s;
  }
  ret = x;
  return ret;
}


x86 assembly (clang, -O0):
<pi>:
push   %rbp
mov    %rsp,%rbp
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movl   $0x1,-0x8(%rbp)
cmpl   $0x7a120,-0x8(%rbp)
jge    115e <pi+0x5e>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
cvtsi2sdl -0x8(%rbp),%xmm2
movsd  0xee2(%rip),%xmm1
divsd  %xmm2,%xmm1
cvtsi2sdl -0x8(%rbp),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1113 <pi+0x13>
movss  0xe9e(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  0xe80(%rip),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x4(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe5b(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    122d <pi+0x12d>
jmp    11c4 <pi+0xc4>
movss  -0x4(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
addss  -0x10(%rbp),%xmm1
movss  -0xc(%rbp),%xmm2
addss  -0x10(%rbp),%xmm2
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm1,%xmm0
jbe    1219 <pi+0x119>
movss  -0x10(%rbp),%xmm0
movss  0xdfd(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    11c4 <pi+0xc4>
movss  -0xc(%rbp),%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    1185 <pi+0x85>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<pi>:
xorps  %xmm1,%xmm1
movsd  0xef5(%rip),%xmm0
mov    $0x2,%eax
movsd  0xef0(%rip),%xmm2
movapd %xmm0,%xmm3
nopl   0x0(%rax)
cvtss2sd %xmm1,%xmm1
movapd %xmm0,%xmm4
divsd  %xmm3,%xmm4
divsd  %xmm3,%xmm4
addsd  %xmm1,%xmm4
xorps  %xmm1,%xmm1
cvtsd2ss %xmm4,%xmm1
cmp    $0x7a120,%eax
je     116d <pi+0x6d>
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
cvtss2sd %xmm1,%xmm1
movapd %xmm0,%xmm5
divsd  %xmm4,%xmm5
divsd  %xmm4,%xmm5
addsd  %xmm1,%xmm5
xorps  %xmm1,%xmm1
cvtsd2ss %xmm5,%xmm1
addsd  %xmm2,%xmm3
add    $0x2,%eax
jmp    1120 <pi+0x20>
mulss  0xea3(%rip),%xmm1
xorps  %xmm2,%xmm2
cvtss2sd %xmm1,%xmm2
xorpd  %xmm0,%xmm0
ucomisd 0xe88(%rip),%xmm2
jbe    11df <pi+0xdf>
xorps  %xmm2,%xmm2
movss  0xe87(%rip),%xmm3
movss  0xe83(%rip),%xmm4
movsd  0xe6a(%rip),%xmm8
xorps  %xmm6,%xmm6
movaps %xmm6,%xmm0
jmp    11b7 <pi+0xb7>
xchg   %ax,%ax
mulss  %xmm4,%xmm3
movaps %xmm6,%xmm0
addss  %xmm3,%xmm0
movaps %xmm0,%xmm5
mulss  %xmm0,%xmm5
movaps %xmm1,%xmm7
subss  %xmm5,%xmm7
ucomiss %xmm7,%xmm2
ja     11b0 <pi+0xb0>
xorps  %xmm6,%xmm6
cvtss2sd %xmm7,%xmm6
ucomisd %xmm8,%xmm6
movaps %xmm0,%xmm6
ja     11b7 <pi+0xb7>
ret

LLVM IR (-O0):
define float @pi() {
%1 = alloca float
%2 = alloca i32
%3 = alloca float
%4 = alloca float
store float 0.000000e+00, float* %1
store i32 1, i32* %2
br label %5
5: ; preds = %8, %0
%6 = load i32, i32* %2
%7 = icmp slt i32 %6, 500000
br i1 %7, label %8, label %21
8: ; preds = %5
%9 = load float, float* %1
%10 = fpext float %9 to double
%11 = load i32, i32* %2
%12 = sitofp i32 %11 to double
%13 = fdiv double 1.000000e+00, %12
%14 = load i32, i32* %2
%15 = sitofp i32 %14 to double
%16 = fdiv double %13, %15
%17 = fadd double %10, %16
%18 = fptrunc double %17 to float
store float %18, float* %1
%19 = load i32, i32* %2
%20 = add nsw i32 %19, 1
store i32 %20, i32* %2
br label %5
21: ; preds = %5
%22 = load float, float* %1
%23 = fmul float %22, 6.000000e+00
store float %23, float* %1
store float 0.000000e+00, float* %3
store float 1.000000e+00, float* %4
br label %24
24: ; preds = %47, %21
%25 = load float, float* %1
%26 = load float, float* %3
%27 = load float, float* %3
%28 = fneg float %26
%29 = call float @llvm.fmuladd.f32(float %28, float %27, float %25)
%30 = fpext float %29 to double
%31 = fcmp ogt double %30, 1.000000e-05
br i1 %31, label %32, label %51
32: ; preds = %24
br label %33
33: ; preds = %44, %32
%34 = load float, float* %1
%35 = load float, float* %3
%36 = load float, float* %4
%37 = fadd float %35, %36
%38 = load float, float* %3
%39 = load float, float* %4
%40 = fadd float %38, %39
%41 = fneg float %37
%42 = call float @llvm.fmuladd.f32(float %41, float %40, float %34)
%43 = fcmp olt float %42, 0.000000e+00
br i1 %43, label %44, label %47
44: ; preds = %33
%45 = load float, float* %4
%46 = fdiv float %45, 2.000000e+00
store float %46, float* %4
br label %33
47: ; preds = %33
%48 = load float, float* %3
%49 = load float, float* %4
%50 = fadd float %48, %49
store float %50, float* %3
br label %24
51: ; preds = %24
%52 = load float, float* %3
store float %52, float* %1
%53 = load float, float* %1
ret float %53
}

LLVM IR (-O2):
define float @pi() {
br label %1
1: ; preds = %12, %0
%2 = phi i32 [ 1, %0 ], [ %19, %12 ]
%3 = phi float [ 0.000000e+00, %0 ], [ %18, %12 ]
%4 = fpext float %3 to double
%5 = sitofp i32 %2 to double
%6 = fdiv double 1.000000e+00, %5
%7 = fdiv double %6, %5
%8 = fadd double %7, %4
%9 = fptrunc double %8 to float
%10 = add nuw nsw i32 %2, 1
%11 = icmp eq i32 %10, 500000
br i1 %11, label %20, label %12
12: ; preds = %1
%13 = fpext float %9 to double
%14 = sitofp i32 %10 to double
%15 = fdiv double 1.000000e+00, %14
%16 = fdiv double %15, %14
%17 = fadd double %16, %13
%18 = fptrunc double %17 to float
%19 = add nuw nsw i32 %2, 2
br label %1
20: ; preds = %1
%21 = fmul float %9, 6.000000e+00
%22 = fpext float %21 to double
%23 = fcmp ogt double %22, 1.000000e-05
br i1 %23, label %30, label %44
24: ; preds = %37, %30
%25 = phi float [ %35, %30 ], [ %42, %37 ]
%26 = phi float [ %31, %30 ], [ %39, %37 ]
%27 = phi float [ %33, %30 ], [ %40, %37 ]
%28 = fpext float %25 to double
%29 = fcmp ogt double %28, 1.000000e-05
br i1 %29, label %30, label %44
30: ; preds = %20, %24
%31 = phi float [ %26, %24 ], [ 1.000000e+00, %20 ]
%32 = phi float [ %27, %24 ], [ 0.000000e+00, %20 ]
%33 = fadd float %32, %31
%34 = fneg float %33
%35 = tail call float @llvm.fmuladd.f32(float %34, float %33, float %21)
%36 = fcmp olt float %35, 0.000000e+00
br i1 %36, label %37, label %24
37: ; preds = %30, %37
%38 = phi float [ %39, %37 ], [ %31, %30 ]
%39 = fmul float %38, 5.000000e-01
%40 = fadd float %32, %39
%41 = fneg float %40
%42 = tail call float @llvm.fmuladd.f32(float %41, float %40, float %21)
%43 = fcmp olt float %42, 0.000000e+00
br i1 %43, label %37, label %24
44: ; preds = %24, %20
%45 = phi float [ 0.000000e+00, %20 ], [ %27, %24 ]
ret float %45
}