float proximaApolice(float apolice, int idade, int n_acidentes) {
  if (idade >= 25) {
    if (n_acidentes < 2) {
      if (n_acidentes == 1)
        return apolice;
      else if (n_acidentes == 0)
        return apolice * 0.8;
    } else if (n_acidentes < 5)
      return apolice * 1.3;
  } else if (idade < 25) {
    if (n_acidentes < 2) {
      if (n_acidentes == 1)
        return apolice * 1.05;
      else if (n_acidentes == 0)
        return apolice * 0.85;
    } else if (n_acidentes < 5)
      return apolice * 1.5;
  }
  return 0;
}


x86 assembly (clang, -O0):
<proximaApolice>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
cmpl   $0x19,-0xc(%rbp)
jl     11aa <proximaApolice+0xaa>
cmpl   $0x2,-0x10(%rbp)
jge    1173 <proximaApolice+0x73>
cmpl   $0x1,-0x10(%rbp)
jne    113c <proximaApolice+0x3c>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1266 <proximaApolice+0x166>
cmpl   $0x0,-0x10(%rbp)
jne    1169 <proximaApolice+0x69>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xec9(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1266 <proximaApolice+0x166>
jmp    116e <proximaApolice+0x6e>
jmp    11a5 <proximaApolice+0xa5>
cmpl   $0x5,-0x10(%rbp)
jge    11a0 <proximaApolice+0xa0>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe8a(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1266 <proximaApolice+0x166>
jmp    11a5 <proximaApolice+0xa5>
jmp    125e <proximaApolice+0x15e>
cmpl   $0x19,-0xc(%rbp)
jge    1259 <proximaApolice+0x159>
cmpl   $0x2,-0x10(%rbp)
jge    1222 <proximaApolice+0x122>
cmpl   $0x1,-0x10(%rbp)
jne    11eb <proximaApolice+0xeb>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe37(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1266 <proximaApolice+0x166>
cmpl   $0x0,-0x10(%rbp)
jne    1218 <proximaApolice+0x118>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe02(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1266 <proximaApolice+0x166>
jmp    121d <proximaApolice+0x11d>
jmp    1254 <proximaApolice+0x154>
cmpl   $0x5,-0x10(%rbp)
jge    124f <proximaApolice+0x14f>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdc3(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1266 <proximaApolice+0x166>
jmp    1254 <proximaApolice+0x154>
jmp    1259 <proximaApolice+0x159>
jmp    125e <proximaApolice+0x15e>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<proximaApolice>:
cmp    $0x19,%edi
jl     1121 <proximaApolice+0x21>
cmp    $0x1,%esi
jg     1140 <proximaApolice+0x40>
je     1167 <proximaApolice+0x67>
test   %esi,%esi
jne    1164 <proximaApolice+0x64>
cvtss2sd %xmm0,%xmm0
mulsd  0xf04(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret
cmp    $0x1,%esi
jg     1156 <proximaApolice+0x56>
test   %esi,%esi
je     1168 <proximaApolice+0x68>
cmp    $0x1,%esi
jne    1164 <proximaApolice+0x64>
cvtss2sd %xmm0,%xmm0
mulsd  0xed5(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret
cmp    $0x4,%esi
ja     1164 <proximaApolice+0x64>
cvtss2sd %xmm0,%xmm0
mulsd  0xec7(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret
cmp    $0x4,%esi
ja     1164 <proximaApolice+0x64>
mulss  0xe9d(%rip),%xmm0
ret
xorps  %xmm0,%xmm0
ret
cvtss2sd %xmm0,%xmm0
mulsd  0xe94(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret

LLVM IR (-O0):
define float @proximaApolice(float %0, i32 %1, i32 %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca i32
%7 = alloca i32
store float %0, float* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%8 = load i32, i32* %6
%9 = icmp sge i32 %8, 25
br i1 %9, label %10, label %38
10: ; preds = %3
%11 = load i32, i32* %7
%12 = icmp slt i32 %11, 2
br i1 %12, label %13, label %28
13: ; preds = %10
%14 = load i32, i32* %7
%15 = icmp eq i32 %14, 1
br i1 %15, label %16, label %18
16: ; preds = %13
%17 = load float, float* %5
store float %17, float* %4
br label %74
18: ; preds = %13
%19 = load i32, i32* %7
%20 = icmp eq i32 %19, 0
br i1 %20, label %21, label %26
21: ; preds = %18
%22 = load float, float* %5
%23 = fpext float %22 to double
%24 = fmul double %23, 8.000000e-01
%25 = fptrunc double %24 to float
store float %25, float* %4
br label %74
26: ; preds = %18
br label %27
27: ; preds = %26
br label %37
28: ; preds = %10
%29 = load i32, i32* %7
%30 = icmp slt i32 %29, 5
br i1 %30, label %31, label %36
31: ; preds = %28
%32 = load float, float* %5
%33 = fpext float %32 to double
%34 = fmul double %33, 1.300000e+00
%35 = fptrunc double %34 to float
store float %35, float* %4
br label %74
36: ; preds = %28
br label %37
37: ; preds = %36, %27
br label %73
38: ; preds = %3
%39 = load i32, i32* %6
%40 = icmp slt i32 %39, 25
br i1 %40, label %41, label %72
41: ; preds = %38
%42 = load i32, i32* %7
%43 = icmp slt i32 %42, 2
br i1 %43, label %44, label %62
44: ; preds = %41
%45 = load i32, i32* %7
%46 = icmp eq i32 %45, 1
br i1 %46, label %47, label %52
47: ; preds = %44
%48 = load float, float* %5
%49 = fpext float %48 to double
%50 = fmul double %49, 1.050000e+00
%51 = fptrunc double %50 to float
store float %51, float* %4
br label %74
52: ; preds = %44
%53 = load i32, i32* %7
%54 = icmp eq i32 %53, 0
br i1 %54, label %55, label %60
55: ; preds = %52
%56 = load float, float* %5
%57 = fpext float %56 to double
%58 = fmul double %57, 8.500000e-01
%59 = fptrunc double %58 to float
store float %59, float* %4
br label %74
60: ; preds = %52
br label %61
61: ; preds = %60
br label %71
62: ; preds = %41
%63 = load i32, i32* %7
%64 = icmp slt i32 %63, 5
br i1 %64, label %65, label %70
65: ; preds = %62
%66 = load float, float* %5
%67 = fpext float %66 to double
%68 = fmul double %67, 1.500000e+00
%69 = fptrunc double %68 to float
store float %69, float* %4
br label %74
70: ; preds = %62
br label %71
71: ; preds = %70, %61
br label %72
72: ; preds = %71, %38
br label %73
73: ; preds = %72, %37
store float 0.000000e+00, float* %4
br label %74
74: ; preds = %73, %65, %55, %47, %31, %21, %16
%75 = load float, float* %4
ret float %75
}

LLVM IR (-O2):
define float @proximaApolice(float %0, i32 %1, i32 %2) {
%4 = icmp sgt i32 %1, 24
%5 = icmp slt i32 %2, 2
br i1 %4, label %6, label %18
6: ; preds = %3
br i1 %5, label %7, label %12
7: ; preds = %6
switch i32 %2, label %32 [
i32 1, label %33
i32 0, label %8
]
8: ; preds = %7
%9 = fpext float %0 to double
%10 = fmul double %9, 8.000000e-01
%11 = fptrunc double %10 to float
br label %33
12: ; preds = %6
%13 = icmp ult i32 %2, 5
br i1 %13, label %14, label %32
14: ; preds = %12
%15 = fpext float %0 to double
%16 = fmul double %15, 1.300000e+00
%17 = fptrunc double %16 to float
br label %33
18: ; preds = %3
br i1 %5, label %19, label %28
19: ; preds = %18
switch i32 %2, label %32 [
i32 1, label %20
i32 0, label %24
]
20: ; preds = %19
%21 = fpext float %0 to double
%22 = fmul double %21, 1.050000e+00
%23 = fptrunc double %22 to float
br label %33
24: ; preds = %19
%25 = fpext float %0 to double
%26 = fmul double %25, 8.500000e-01
%27 = fptrunc double %26 to float
br label %33
28: ; preds = %18
%29 = icmp ult i32 %2, 5
br i1 %29, label %30, label %32
30: ; preds = %28
%31 = fmul float %0, 1.500000e+00
br label %33
32: ; preds = %19, %7, %28, %12
br label %33
33: ; preds = %7, %32, %30, %24, %20, %14, %8
%34 = phi float [ %11, %8 ], [ 0.000000e+00, %32 ], [ %17, %14 ], [ %23, %20 ], [ %27, %24 ], [ %31, %30 ], [ %0, %7 ]
ret float %34
}