float calcolo(float consumi_unita[], unsigned int numero_unita,
              unsigned int unita) {
  float importo_unita = 0;
  unita -= 1;
  if (consumi_unita[unita] >= 0 && consumi_unita[unita] <= 73) {
    importo_unita = (consumi_unita[unita] * 0.460468);
  } else if (consumi_unita[unita] >= 73.01 && consumi_unita[unita] <= 110) {
    importo_unita = (consumi_unita[unita] * 0.604245);
  } else if (consumi_unita[unita] >= 110.01 && consumi_unita[unita] <= 146) {
    importo_unita = (consumi_unita[unita] * 0.994113);
  } else if (consumi_unita[unita] >= 146.01 && consumi_unita[unita] <= 256) {
    importo_unita = (consumi_unita[unita] * 1.487911);
  } else {
    importo_unita = (consumi_unita[unita] * 1.825007);
  }
  importo_unita += 12.55;
  importo_unita += (12.55 / numero_unita);
  importo_unita += (0.116788 * consumi_unita[unita]);
  importo_unita += (0.335273 * consumi_unita[unita]);
  return (importo_unita);
}


x86 assembly (clang, -O0):
<calcolo>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     117a <calcolo+0x7a>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  0xeba(%rip),%xmm0
ucomiss (%rax,%rcx,4),%xmm0
jb     117a <calcolo+0x7a>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xee0(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    12dd <calcolo+0x1dd>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe7e(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     11df <calcolo+0xdf>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  0xe59(%rip),%xmm0
ucomiss (%rax,%rcx,4),%xmm0
jb     11df <calcolo+0xdf>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe73(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    12d8 <calcolo+0x1d8>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe21(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1244 <calcolo+0x144>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  0xdf8(%rip),%xmm0
ucomiss (%rax,%rcx,4),%xmm0
jb     1244 <calcolo+0x144>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe06(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    12d3 <calcolo+0x1d3>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdc4(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     12a9 <calcolo+0x1a9>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  0xd97(%rip),%xmm0
ucomiss (%rax,%rcx,4),%xmm0
jb     12a9 <calcolo+0x1a9>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd99(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    12ce <calcolo+0x1ce>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd67(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    12d3 <calcolo+0x1d3>
jmp    12d8 <calcolo+0x1d8>
jmp    12dd <calcolo+0x1dd>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd72(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0xc(%rbp),%eax
cvtsi2sd %rax,%xmm0
movsd  0xd55(%rip),%xmm1
divsd  %xmm0,%xmm1
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xd12(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xcd8(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<calcolo>:
add    $0xffffffff,%edx
movss  (%rdi,%rdx,4),%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
jb     112e <calcolo+0x2e>
movss  0xf31(%rip),%xmm2
ucomiss %xmm1,%xmm2
jb     112e <calcolo+0x2e>
movsd  0xed4(%rip),%xmm1
jmp    11a2 <calcolo+0xa2>
movss  0xf1e(%rip),%xmm2
ucomiss %xmm1,%xmm2
jb     114f <calcolo+0x4f>
ucomisd 0xecd(%rip),%xmm0
jb     114f <calcolo+0x4f>
movsd  0xebb(%rip),%xmm1
jmp    11a2 <calcolo+0xa2>
movss  0xf01(%rip),%xmm2
ucomiss %xmm1,%xmm2
jb     1170 <calcolo+0x70>
ucomisd 0xebc(%rip),%xmm0
jb     1170 <calcolo+0x70>
movsd  0xeaa(%rip),%xmm1
jmp    11a2 <calcolo+0xa2>
xor    %eax,%eax
ucomisd 0xeae(%rip),%xmm0
setb   %cl
movss  0xed7(%rip),%xmm2
ucomiss %xmm1,%xmm2
jb     119a <calcolo+0x9a>
mov    %cl,%al
lea    0xecd(%rip),%rcx
movsd  (%rcx,%rax,8),%xmm1
jmp    11a2 <calcolo+0xa2>
movsd  0xe8e(%rip),%xmm1
mulsd  %xmm0,%xmm1
cvtsd2ss %xmm1,%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe82(%rip),%xmm2
addsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm1
mov    %esi,%eax
cvtsi2sd %rax,%xmm3
divsd  %xmm3,%xmm2
cvtss2sd %xmm1,%xmm1
addsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe5f(%rip),%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm1
mulsd  0xe50(%rip),%xmm0
cvtss2sd %xmm1,%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
ret

LLVM IR (-O0):
define float @calcolo(float* %0, i32 %1, i32 %2) {
%4 = alloca float*
%5 = alloca i32
%6 = alloca i32
%7 = alloca float
store float* %0, float** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
store float 0.000000e+00, float* %7
%8 = load i32, i32* %6
%9 = sub i32 %8, 1
store i32 %9, i32* %6
%10 = load float*, float** %4
%11 = load i32, i32* %6
%12 = zext i32 %11 to i64
%13 = getelementptr inbounds float, float* %10, i64 %12
%14 = load float, float* %13
%15 = fcmp oge float %14, 0.000000e+00
br i1 %15, label %16, label %32
16: ; preds = %3
%17 = load float*, float** %4
%18 = load i32, i32* %6
%19 = zext i32 %18 to i64
%20 = getelementptr inbounds float, float* %17, i64 %19
%21 = load float, float* %20
%22 = fcmp ole float %21, 7.300000e+01
br i1 %22, label %23, label %32
23: ; preds = %16
%24 = load float*, float** %4
%25 = load i32, i32* %6
%26 = zext i32 %25 to i64
%27 = getelementptr inbounds float, float* %24, i64 %26
%28 = load float, float* %27
%29 = fpext float %28 to double
%30 = fmul double %29, 4.604680e-01
%31 = fptrunc double %30 to float
store float %31, float* %7
br label %116
32: ; preds = %16, %3
%33 = load float*, float** %4
%34 = load i32, i32* %6
%35 = zext i32 %34 to i64
%36 = getelementptr inbounds float, float* %33, i64 %35
%37 = load float, float* %36
%38 = fpext float %37 to double
%39 = fcmp oge double %38, 7.301000e+01
br i1 %39, label %40, label %56
40: ; preds = %32
%41 = load float*, float** %4
%42 = load i32, i32* %6
%43 = zext i32 %42 to i64
%44 = getelementptr inbounds float, float* %41, i64 %43
%45 = load float, float* %44
%46 = fcmp ole float %45, 1.100000e+02
br i1 %46, label %47, label %56
47: ; preds = %40
%48 = load float*, float** %4
%49 = load i32, i32* %6
%50 = zext i32 %49 to i64
%51 = getelementptr inbounds float, float* %48, i64 %50
%52 = load float, float* %51
%53 = fpext float %52 to double
%54 = fmul double %53, 6.042450e-01
%55 = fptrunc double %54 to float
store float %55, float* %7
br label %115
56: ; preds = %40, %32
%57 = load float*, float** %4
%58 = load i32, i32* %6
%59 = zext i32 %58 to i64
%60 = getelementptr inbounds float, float* %57, i64 %59
%61 = load float, float* %60
%62 = fpext float %61 to double
%63 = fcmp oge double %62, 1.100100e+02
br i1 %63, label %64, label %80
64: ; preds = %56
%65 = load float*, float** %4
%66 = load i32, i32* %6
%67 = zext i32 %66 to i64
%68 = getelementptr inbounds float, float* %65, i64 %67
%69 = load float, float* %68
%70 = fcmp ole float %69, 1.460000e+02
br i1 %70, label %71, label %80
71: ; preds = %64
%72 = load float*, float** %4
%73 = load i32, i32* %6
%74 = zext i32 %73 to i64
%75 = getelementptr inbounds float, float* %72, i64 %74
%76 = load float, float* %75
%77 = fpext float %76 to double
%78 = fmul double %77, 9.941130e-01
%79 = fptrunc double %78 to float
store float %79, float* %7
br label %114
80: ; preds = %64, %56
%81 = load float*, float** %4
%82 = load i32, i32* %6
%83 = zext i32 %82 to i64
%84 = getelementptr inbounds float, float* %81, i64 %83
%85 = load float, float* %84
%86 = fpext float %85 to double
%87 = fcmp oge double %86, 1.460100e+02
br i1 %87, label %88, label %104
88: ; preds = %80
%89 = load float*, float** %4
%90 = load i32, i32* %6
%91 = zext i32 %90 to i64
%92 = getelementptr inbounds float, float* %89, i64 %91
%93 = load float, float* %92
%94 = fcmp ole float %93, 2.560000e+02
br i1 %94, label %95, label %104
95: ; preds = %88
%96 = load float*, float** %4
%97 = load i32, i32* %6
%98 = zext i32 %97 to i64
%99 = getelementptr inbounds float, float* %96, i64 %98
%100 = load float, float* %99
%101 = fpext float %100 to double
%102 = fmul double %101, 0x3FF7CE7BC3C5BD0E
%103 = fptrunc double %102 to float
store float %103, float* %7
br label %113
104: ; preds = %88, %80
%105 = load float*, float** %4
%106 = load i32, i32* %6
%107 = zext i32 %106 to i64
%108 = getelementptr inbounds float, float* %105, i64 %107
%109 = load float, float* %108
%110 = fpext float %109 to double
%111 = fmul double %110, 0x3FFD333A8A3F8983
%112 = fptrunc double %111 to float
store float %112, float* %7
br label %113
113: ; preds = %104, %95
br label %114
114: ; preds = %113, %71
br label %115
115: ; preds = %114, %47
br label %116
116: ; preds = %115, %23
%117 = load float, float* %7
%118 = fpext float %117 to double
%119 = fadd double %118, 1.255000e+01
%120 = fptrunc double %119 to float
store float %120, float* %7
%121 = load i32, i32* %5
%122 = uitofp i32 %121 to double
%123 = fdiv double 1.255000e+01, %122
%124 = load float, float* %7
%125 = fpext float %124 to double
%126 = fadd double %125, %123
%127 = fptrunc double %126 to float
store float %127, float* %7
%128 = load float*, float** %4
%129 = load i32, i32* %6
%130 = zext i32 %129 to i64
%131 = getelementptr inbounds float, float* %128, i64 %130
%132 = load float, float* %131
%133 = fpext float %132 to double
%134 = load float, float* %7
%135 = fpext float %134 to double
%136 = call double @llvm.fmuladd.f64(double 1.167880e-01, double %133, double %135)
%137 = fptrunc double %136 to float
store float %137, float* %7
%138 = load float*, float** %4
%139 = load i32, i32* %6
%140 = zext i32 %139 to i64
%141 = getelementptr inbounds float, float* %138, i64 %140
%142 = load float, float* %141
%143 = fpext float %142 to double
%144 = load float, float* %7
%145 = fpext float %144 to double
%146 = call double @llvm.fmuladd.f64(double 3.352730e-01, double %143, double %145)
%147 = fptrunc double %146 to float
store float %147, float* %7
%148 = load float, float* %7
ret float %148
}

LLVM IR (-O2):
define float @calcolo(float* nocapture %0, i32 %1, i32 %2) {
%4 = add i32 %2, -1
%5 = zext i32 %4 to i64
%6 = getelementptr inbounds float, float* %0, i64 %5
%7 = load float, float* %6
%8 = fcmp ult float %7, 0.000000e+00
%9 = fcmp ugt float %7, 7.300000e+01
%10 = or i1 %8, %9
%11 = fpext float %7 to double
br i1 %10, label %12, label %25
12: ; preds = %3
%13 = fcmp ult double %11, 7.301000e+01
%14 = fcmp ugt float %7, 1.100000e+02
%15 = or i1 %14, %13
br i1 %15, label %16, label %25
16: ; preds = %12
%17 = fcmp ult double %11, 1.100100e+02
%18 = fcmp ugt float %7, 1.460000e+02
%19 = or i1 %18, %17
br i1 %19, label %20, label %25
20: ; preds = %16
%21 = fcmp ult double %11, 1.460100e+02
%22 = fcmp ugt float %7, 2.560000e+02
%23 = or i1 %22, %21
%24 = select i1 %23, double 0x3FFD333A8A3F8983, double 0x3FF7CE7BC3C5BD0E
br label %25
25: ; preds = %20, %16, %12, %3
%26 = phi double [ 4.604680e-01, %3 ], [ 6.042450e-01, %12 ], [ 9.941130e-01, %16 ], [ %24, %20 ]
%27 = fmul double %26, %11
%28 = fptrunc double %27 to float
%29 = fpext float %28 to double
%30 = fadd double %29, 1.255000e+01
%31 = fptrunc double %30 to float
%32 = uitofp i32 %1 to double
%33 = fdiv double 1.255000e+01, %32
%34 = fpext float %31 to double
%35 = fadd double %33, %34
%36 = fptrunc double %35 to float
%37 = fpext float %36 to double
%38 = tail call double @llvm.fmuladd.f64(double %11, double 1.167880e-01, double %37)
%39 = fptrunc double %38 to float
%40 = fpext float %39 to double
%41 = tail call double @llvm.fmuladd.f64(double %11, double 3.352730e-01, double %40)
%42 = fptrunc double %41 to float
ret float %42
}