#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ printf(char *);
void Class(float a, float b, float c) {
  if (a == b && b == c)
    printf("Il triangolo è equilatero.\n");
  else if (a == b || b == c || a == c) {
    if (a * a == b * b + c * c || b * b == a * a + c * c ||
        c * c == b * b + a * a)
      printf("Il triangolo è isoscele-rettangolo.\n");
    else
      printf("Il triangolo è isoscele.\n");
  } else {
    if (a * a == b * b + c * c || b * b == a * a + c * c ||
        c * c == b * b + a * a)
      printf("Il triangolo è rettangolo.\n");
    else
      printf("Il triangolo è scaleno.\n");
  }
}


x86 assembly (clang, -O0):
<Class>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jne    1162 <Class+0x52>
jp     1162 <Class+0x52>
movss  -0x8(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jne    1162 <Class+0x52>
jp     1162 <Class+0x52>
lea    0xea8(%rip),%rdi
call   1030 <printf@plt>
jmp    1346 <Class+0x236>
movss  -0x4(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jne    117c <Class+0x6c>
jp     117c <Class+0x6c>
jmp    11ab <Class+0x9b>
movss  -0x8(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jne    1196 <Class+0x86>
jp     1196 <Class+0x86>
jmp    11ab <Class+0x9b>
movss  -0x4(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jne    1276 <Class+0x166>
jp     1276 <Class+0x166>
movss  -0x4(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movss  -0x8(%rbp),%xmm3
movss  -0xc(%rbp),%xmm2
mulss  -0xc(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jne    11e5 <Class+0xd5>
jp     11e5 <Class+0xd5>
jmp    1254 <Class+0x144>
movss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  -0x4(%rbp),%xmm1
movss  -0x4(%rbp),%xmm3
movss  -0xc(%rbp),%xmm2
mulss  -0xc(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jne    121f <Class+0x10f>
jp     121f <Class+0x10f>
jmp    1254 <Class+0x144>
movss  -0xc(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movss  -0x8(%rbp),%xmm3
movss  -0x4(%rbp),%xmm2
mulss  -0x4(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jne    1265 <Class+0x155>
jp     1265 <Class+0x155>
lea    0xdc2(%rip),%rdi
call   1030 <printf@plt>
jmp    1271 <Class+0x161>
lea    0xdd7(%rip),%rdi
call   1030 <printf@plt>
jmp    1341 <Class+0x231>
movss  -0x4(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movss  -0x8(%rbp),%xmm3
movss  -0xc(%rbp),%xmm2
mulss  -0xc(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jne    12b0 <Class+0x1a0>
jp     12b0 <Class+0x1a0>
jmp    131f <Class+0x20f>
movss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  -0x4(%rbp),%xmm1
movss  -0x4(%rbp),%xmm3
movss  -0xc(%rbp),%xmm2
mulss  -0xc(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jne    12ea <Class+0x1da>
jp     12ea <Class+0x1da>
jmp    131f <Class+0x20f>
movss  -0xc(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movss  -0x8(%rbp),%xmm3
movss  -0x4(%rbp),%xmm2
mulss  -0x4(%rbp),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jne    1330 <Class+0x220>
jp     1330 <Class+0x220>
lea    0xd38(%rip),%rdi
call   1030 <printf@plt>
jmp    133c <Class+0x22c>
lea    0xd44(%rip),%rdi
call   1030 <printf@plt>
jmp    1341 <Class+0x231>
jmp    1346 <Class+0x236>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Class>:
ucomiss %xmm1,%xmm0
jne    112a <Class+0x1a>
jp     112a <Class+0x1a>
ucomiss %xmm2,%xmm1
jne    112a <Class+0x1a>
jp     112a <Class+0x1a>
lea    0xf4f(%rip),%rdi
jmp    1030 <puts@plt>
ucomiss %xmm2,%xmm0
movaps %xmm0,%xmm3
mulss  %xmm0,%xmm3
movaps %xmm2,%xmm5
mulss  %xmm2,%xmm5
movaps %xmm1,%xmm4
mulss  %xmm1,%xmm4
movaps %xmm4,%xmm6
addss  %xmm5,%xmm6
jne    114d <Class+0x3d>
jnp    116e <Class+0x5e>
ucomiss %xmm1,%xmm0
jne    1154 <Class+0x44>
jnp    116e <Class+0x5e>
ucomiss %xmm2,%xmm1
jne    115b <Class+0x4b>
jnp    116e <Class+0x5e>
ucomiss %xmm6,%xmm3
jne    1181 <Class+0x71>
jp     1181 <Class+0x71>
lea    0xeb0(%rip),%rdi
jmp    1030 <puts@plt>
ucomiss %xmm6,%xmm3
jne    119f <Class+0x8f>
jp     119f <Class+0x8f>
lea    0xed3(%rip),%rdi
jmp    1030 <puts@plt>
movaps %xmm4,%xmm0
addss  %xmm3,%xmm0
addss  %xmm5,%xmm3
ucomiss %xmm0,%xmm5
lea    0xe6a(%rip),%rax
lea    0xe7c(%rip),%rdi
jmp    11bb <Class+0xab>
movaps %xmm4,%xmm0
addss  %xmm3,%xmm0
addss  %xmm5,%xmm3
ucomiss %xmm0,%xmm5
lea    0xe81(%rip),%rax
lea    0xe94(%rip),%rdi
mov    %rdi,%rcx
cmovne %rax,%rcx
cmovp  %rax,%rcx
ucomiss %xmm3,%xmm4
cmovne %rcx,%rdi
cmovp  %rcx,%rdi
jmp    1030 <puts@plt>

LLVM IR (-O0):
@.str = [29 x i8] c"Il triangolo \C3\A8 equilatero.\0A\00"
@.str.1 = [38 x i8] c"Il triangolo \C3\A8 isoscele-rettangolo.\0A\00"
@.str.2 = [27 x i8] c"Il triangolo \C3\A8 isoscele.\0A\00"
@.str.3 = [29 x i8] c"Il triangolo \C3\A8 rettangolo.\0A\00"
@.str.4 = [26 x i8] c"Il triangolo \C3\A8 scaleno.\0A\00"
define void @Class(float %0, float %1, float %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca float
store float %0, float* %4
store float %1, float* %5
store float %2, float* %6
%7 = load float, float* %4
%8 = load float, float* %5
%9 = fcmp oeq float %7, %8
br i1 %9, label %10, label %16
10: ; preds = %3
%11 = load float, float* %5
%12 = load float, float* %6
%13 = fcmp oeq float %11, %12
br i1 %13, label %14, label %16
14: ; preds = %10
%15 = call i32 @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str, i64 0, i64 0))
br label %105
16: ; preds = %10, %3
%17 = load float, float* %4
%18 = load float, float* %5
%19 = fcmp oeq float %17, %18
br i1 %19, label %28, label %20
20: ; preds = %16
%21 = load float, float* %5
%22 = load float, float* %6
%23 = fcmp oeq float %21, %22
br i1 %23, label %28, label %24
24: ; preds = %20
%25 = load float, float* %4
%26 = load float, float* %6
%27 = fcmp oeq float %25, %26
br i1 %27, label %28, label %66
28: ; preds = %24, %20, %16
%29 = load float, float* %4
%30 = load float, float* %4
%31 = fmul float %29, %30
%32 = load float, float* %5
%33 = load float, float* %5
%34 = load float, float* %6
%35 = load float, float* %6
%36 = fmul float %34, %35
%37 = call float @llvm.fmuladd.f32(float %32, float %33, float %36)
%38 = fcmp oeq float %31, %37
br i1 %38, label %61, label %39
39: ; preds = %28
%40 = load float, float* %5
%41 = load float, float* %5
%42 = fmul float %40, %41
%43 = load float, float* %4
%44 = load float, float* %4
%45 = load float, float* %6
%46 = load float, float* %6
%47 = fmul float %45, %46
%48 = call float @llvm.fmuladd.f32(float %43, float %44, float %47)
%49 = fcmp oeq float %42, %48
br i1 %49, label %61, label %50
50: ; preds = %39
%51 = load float, float* %6
%52 = load float, float* %6
%53 = fmul float %51, %52
%54 = load float, float* %5
%55 = load float, float* %5
%56 = load float, float* %4
%57 = load float, float* %4
%58 = fmul float %56, %57
%59 = call float @llvm.fmuladd.f32(float %54, float %55, float %58)
%60 = fcmp oeq float %53, %59
br i1 %60, label %61, label %63
61: ; preds = %50, %39, %28
%62 = call i32 @printf(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str.1, i64 0, i64 0))
br label %65
63: ; preds = %50
%64 = call i32 @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.2, i64 0, i64 0))
br label %65
65: ; preds = %63, %61
br label %104
66: ; preds = %24
%67 = load float, float* %4
%68 = load float, float* %4
%69 = fmul float %67, %68
%70 = load float, float* %5
%71 = load float, float* %5
%72 = load float, float* %6
%73 = load float, float* %6
%74 = fmul float %72, %73
%75 = call float @llvm.fmuladd.f32(float %70, float %71, float %74)
%76 = fcmp oeq float %69, %75
br i1 %76, label %99, label %77
77: ; preds = %66
%78 = load float, float* %5
%79 = load float, float* %5
%80 = fmul float %78, %79
%81 = load float, float* %4
%82 = load float, float* %4
%83 = load float, float* %6
%84 = load float, float* %6
%85 = fmul float %83, %84
%86 = call float @llvm.fmuladd.f32(float %81, float %82, float %85)
%87 = fcmp oeq float %80, %86
br i1 %87, label %99, label %88
88: ; preds = %77
%89 = load float, float* %6
%90 = load float, float* %6
%91 = fmul float %89, %90
%92 = load float, float* %5
%93 = load float, float* %5
%94 = load float, float* %4
%95 = load float, float* %4
%96 = fmul float %94, %95
%97 = call float @llvm.fmuladd.f32(float %92, float %93, float %96)
%98 = fcmp oeq float %91, %97
br i1 %98, label %99, label %101
99: ; preds = %88, %77, %66
%100 = call i32 @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.3, i64 0, i64 0))
br label %103
101: ; preds = %88
%102 = call i32 @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.4, i64 0, i64 0))
br label %103
103: ; preds = %101, %99
br label %104
104: ; preds = %103, %65
br label %105
105: ; preds = %104, %14
ret void
}

LLVM IR (-O2):
@str = [25 x i8] c"Il triangolo \C3\A8 scaleno.\00"
@str.5 = [28 x i8] c"Il triangolo \C3\A8 rettangolo.\00"
@str.6 = [26 x i8] c"Il triangolo \C3\A8 isoscele.\00"
@str.7 = [37 x i8] c"Il triangolo \C3\A8 isoscele-rettangolo.\00"
@str.8 = [28 x i8] c"Il triangolo \C3\A8 equilatero.\00"
define void @Class(float %0, float %1, float %2) {
%4 = fcmp oeq float %0, %1
%5 = fcmp oeq float %1, %2
%6 = and i1 %4, %5
br i1 %6, label %33, label %7
7: ; preds = %3
%8 = or i1 %4, %5
%9 = fcmp oeq float %0, %2
%10 = or i1 %9, %8
%11 = fmul float %0, %0
%12 = fmul float %2, %2
%13 = tail call float @llvm.fmuladd.f32(float %1, float %1, float %12)
%14 = fcmp oeq float %11, %13
br i1 %10, label %15, label %24
15: ; preds = %7
br i1 %14, label %33, label %16
16: ; preds = %15
%17 = fmul float %1, %1
%18 = tail call float @llvm.fmuladd.f32(float %0, float %0, float %12)
%19 = fcmp oeq float %17, %18
%20 = tail call float @llvm.fmuladd.f32(float %1, float %1, float %11)
%21 = fcmp oeq float %12, %20
%22 = select i1 %19, i1 true, i1 %21
%23 = select i1 %22, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @str.7, i64 0, i64 0), i8* getelementptr inbounds ([26 x i8], [26 x i8]* @str.6, i64 0, i64 0)
br label %33
24: ; preds = %7
br i1 %14, label %33, label %25
25: ; preds = %24
%26 = fmul float %1, %1
%27 = tail call float @llvm.fmuladd.f32(float %0, float %0, float %12)
%28 = fcmp oeq float %26, %27
%29 = tail call float @llvm.fmuladd.f32(float %1, float %1, float %11)
%30 = fcmp oeq float %12, %29
%31 = select i1 %28, i1 true, i1 %30
%32 = select i1 %31, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @str.5, i64 0, i64 0), i8* getelementptr inbounds ([25 x i8], [25 x i8]* @str, i64 0, i64 0)
br label %33
33: ; preds = %25, %16, %24, %15, %3
%34 = phi i8* [ getelementptr inbounds ([28 x i8], [28 x i8]* @str.8, i64 0, i64 0), %3 ], [ getelementptr inbounds ([37 x i8], [37 x i8]* @str.7, i64 0, i64 0), %15 ], [ getelementptr inbounds ([28 x i8], [28 x i8]* @str.5, i64 0, i64 0), %24 ], [ %23, %16 ], [ %32, %25 ]
%35 = tail call i32 @puts(i8* dereferenceable(1) %34)
ret void
}