float calculatePi(int terms) {
  int i;
  float pi = 4;
  float divisor = 3;
  for (i = 0; i < terms; i++) {
    if (i % 2 == 0)
      pi -= (4.0 / divisor);
    else
      pi += (4.0 / divisor);
    divisor += 2.0;
  }
  return pi;
}


x86 assembly (clang, -O0):
<calculatePi>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movss  0xef5(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  0xee4(%rip),%xmm0
movss  %xmm0,-0x10(%rbp)
movl   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11cf <calculatePi+0xcf>
mov    -0x8(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1178 <calculatePi+0x78>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeaf(%rip),%xmm1
divsd  %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    11a3 <calculatePi+0xa3>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe7f(%rip),%xmm1
divsd  %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe5c(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1128 <calculatePi+0x28>
movss  -0xc(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<calculatePi>:
test   %edi,%edi
jle    1161 <calculatePi+0x61>
xor    %eax,%eax
movss  0xef2(%rip),%xmm0
movss  0xeee(%rip),%xmm1
movsd  0xef2(%rip),%xmm2
movapd 0xefa(%rip),%xmm3
movss  0xeda(%rip),%xmm4
jmp    1147 <calculatePi+0x47>
cvtss2sd %xmm0,%xmm0
addsd  %xmm5,%xmm0
cvtsd2ss %xmm0,%xmm0
addss  %xmm4,%xmm1
add    $0x1,%eax
cmp    %eax,%edi
je     1160 <calculatePi+0x60>
xorps  %xmm6,%xmm6
cvtss2sd %xmm1,%xmm6
movapd %xmm2,%xmm5
divsd  %xmm6,%xmm5
test   $0x1,%al
jne    1130 <calculatePi+0x30>
xorpd  %xmm3,%xmm5
jmp    1130 <calculatePi+0x30>
ret
movss  0xe97(%rip),%xmm0
ret

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

LLVM IR (-O2):
define float @calculatePi(i32 %0) {
%2 = icmp sgt i32 %0, 0
br i1 %2, label %3, label %19
3: ; preds = %1, %3
%4 = phi float [ %16, %3 ], [ 3.000000e+00, %1 ]
%5 = phi float [ %15, %3 ], [ 4.000000e+00, %1 ]
%6 = phi i32 [ %17, %3 ], [ 0, %1 ]
%7 = and i32 %6, 1
%8 = icmp eq i32 %7, 0
%9 = fpext float %4 to double
%10 = fdiv double 4.000000e+00, %9
%11 = fpext float %5 to double
%12 = fneg double %10
%13 = select i1 %8, double %12, double %10
%14 = fadd double %13, %11
%15 = fptrunc double %14 to float
%16 = fadd float %4, 2.000000e+00
%17 = add nuw nsw i32 %6, 1
%18 = icmp eq i32 %17, %0
br i1 %18, label %19, label %3
19: ; preds = %3, %1
%20 = phi float [ 4.000000e+00, %1 ], [ %15, %3 ]
ret float %20
}