float leibniz_pi_calculation(int number) {
  float denominador = 1.0f;
  float operacao = 1.0f;
  float pi = 0.0f;
  for (int i = 0; i < number; i++) {
    pi += operacao * (4.0 / denominador);
    denominador += 2.0;
    operacao = operacao * -1.0;
  }
  return pi;
}


x86 assembly (clang, -O0):
<leibniz_pi_calculation>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movss  0xef1(%rip),%xmm0
movss  %xmm0,-0x8(%rbp)
movss  0xee4(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11be <leibniz_pi_calculation+0xbe>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xec2(%rip),%xmm2
divsd  %xmm1,%xmm2
movss  -0x10(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe8b(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe65(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1130 <leibniz_pi_calculation+0x30>
movss  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<leibniz_pi_calculation>:
test   %edi,%edi
jle    1123 <leibniz_pi_calculation+0x23>
cmp    $0x1,%edi
jne    1127 <leibniz_pi_calculation+0x27>
movsd  0xeef(%rip),%xmm2
xorps  %xmm1,%xmm1
test   $0x1,%dil
jne    11a7 <leibniz_pi_calculation+0xa7>
jmp    11bb <leibniz_pi_calculation+0xbb>
xorps  %xmm0,%xmm0
ret
mov    %edi,%eax
and    $0xfffffffe,%eax
movss  0xedc(%rip),%xmm1
xorps  %xmm0,%xmm0
movsd  0xec9(%rip),%xmm2
movss  0xecd(%rip),%xmm3
nopw   0x0(%rax,%rax,1)
xorps  %xmm4,%xmm4
cvtss2sd %xmm1,%xmm4
movapd %xmm2,%xmm5
divsd  %xmm4,%xmm5
cvtss2sd %xmm0,%xmm0
addsd  %xmm5,%xmm0
cvtsd2ss %xmm0,%xmm0
addss  %xmm3,%xmm1
xorps  %xmm4,%xmm4
cvtss2sd %xmm1,%xmm4
movapd %xmm2,%xmm5
divsd  %xmm4,%xmm5
cvtss2sd %xmm0,%xmm0
subsd  %xmm5,%xmm0
cvtsd2ss %xmm0,%xmm0
addss  %xmm3,%xmm1
add    $0xfffffffe,%eax
jne    1150 <leibniz_pi_calculation+0x50>
xorps  %xmm2,%xmm2
cvtss2sd %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtss2sd %xmm0,%xmm1
test   $0x1,%dil
je     11bb <leibniz_pi_calculation+0xbb>
movsd  0xe59(%rip),%xmm0
divsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
ret

LLVM IR (-O0):
define float @leibniz_pi_calculation(i32 %0) {
%2 = alloca i32
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca i32
store i32 %0, i32* %2
store float 1.000000e+00, float* %3
store float 1.000000e+00, float* %4
store float 0.000000e+00, float* %5
store i32 0, i32* %6
br label %7
7: ; preds = %29, %1
%8 = load i32, i32* %6
%9 = load i32, i32* %2
%10 = icmp slt i32 %8, %9
br i1 %10, label %11, label %32
11: ; preds = %7
%12 = load float, float* %4
%13 = fpext float %12 to double
%14 = load float, float* %3
%15 = fpext float %14 to double
%16 = fdiv double 4.000000e+00, %15
%17 = load float, float* %5
%18 = fpext float %17 to double
%19 = call double @llvm.fmuladd.f64(double %13, double %16, double %18)
%20 = fptrunc double %19 to float
store float %20, float* %5
%21 = load float, float* %3
%22 = fpext float %21 to double
%23 = fadd double %22, 2.000000e+00
%24 = fptrunc double %23 to float
store float %24, float* %3
%25 = load float, float* %4
%26 = fpext float %25 to double
%27 = fmul double %26, -1.000000e+00
%28 = fptrunc double %27 to float
store float %28, float* %4
br label %29
29: ; preds = %11
%30 = load i32, i32* %6
%31 = add nsw i32 %30, 1
store i32 %31, i32* %6
br label %7
32: ; preds = %7
%33 = load float, float* %5
ret float %33
}

LLVM IR (-O2):
define float @leibniz_pi_calculation(i32 %0) {
%2 = icmp sgt i32 %0, 0
br i1 %2, label %3, label %20
3: ; preds = %1
%4 = and i32 %0, 1
%5 = icmp eq i32 %0, 1
br i1 %5, label %11, label %6
6: ; preds = %3
%7 = and i32 %0, -2
br label %22
8: ; preds = %22
%9 = fpext float %37 to double
%10 = fpext float %36 to double
br label %11
11: ; preds = %8, %3
%12 = phi float [ undef, %3 ], [ %36, %8 ]
%13 = phi double [ 0.000000e+00, %3 ], [ %10, %8 ]
%14 = phi double [ 1.000000e+00, %3 ], [ %9, %8 ]
%15 = icmp eq i32 %4, 0
br i1 %15, label %20, label %16
16: ; preds = %11
%17 = fdiv double 4.000000e+00, %14
%18 = fadd double %17, %13
%19 = fptrunc double %18 to float
br label %20
20: ; preds = %16, %11, %1
%21 = phi float [ 0.000000e+00, %1 ], [ %12, %11 ], [ %19, %16 ]
ret float %21
22: ; preds = %22, %6
%23 = phi float [ 0.000000e+00, %6 ], [ %36, %22 ]
%24 = phi float [ 1.000000e+00, %6 ], [ %37, %22 ]
%25 = phi i32 [ 0, %6 ], [ %38, %22 ]
%26 = fpext float %24 to double
%27 = fdiv double 4.000000e+00, %26
%28 = fpext float %23 to double
%29 = fadd double %27, %28
%30 = fptrunc double %29 to float
%31 = fadd float %24, 2.000000e+00
%32 = fpext float %31 to double
%33 = fdiv double 4.000000e+00, %32
%34 = fpext float %30 to double
%35 = tail call double @llvm.fmuladd.f64(double %33, double -1.000000e+00, double %34)
%36 = fptrunc double %35 to float
%37 = fadd float %31, 2.000000e+00
%38 = add i32 %25, 2
%39 = icmp eq i32 %38, %7
br i1 %39, label %8, label %22
}