#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 */
char antwort_ja_oder_nein(int, int);
char erfasse_ganze_zahl(int, int);
float gib_durchschnittsverbrauch_l_pro_100km();
float gib_durchschnittsverbrauch_us_mi_pro_gal();
int /*<<< orphan*/ printf(char *, ...);
float umrechnung_durchschnittsverbrauch(float);
int main(void) {
  signed char auswahl_der_eingabeart = 1;
  signed char berechnung_neustarten = 110;
  float durchschnittsverbrauch_l_pro_100km = 0.0;
  float durchschnittsverbrauch_us_mi_pro_gal = 0.0;
  printf("Dieses Programm berechnet den durchschnitt Benzinverbrauch und gibt "
         "diesen aus. "
         "Dabei wird die gefahrene Entfernung (in Kilometer oder "
         "amerikanischen Mailen) und "
         "der erzielter Verbrauch (in Liter oder amerikanischen Gallonen) auf "
         "dieser Strecke "
         "durch Benutzer eingegebenen.\n");
  do {
    printf("\nWie möchten Sie die Eingabe tätigen?\n"
           "1) in l/100km\n"
           "2) in mi/gal\n"
           "\nIhre Wahl bitte:");
    auswahl_der_eingabeart = erfasse_ganze_zahl(1, 2);
    if (auswahl_der_eingabeart == 1) {
      durchschnittsverbrauch_l_pro_100km =
          gib_durchschnittsverbrauch_l_pro_100km();
      durchschnittsverbrauch_us_mi_pro_gal =
          umrechnung_durchschnittsverbrauch(durchschnittsverbrauch_l_pro_100km);
    } else {
      durchschnittsverbrauch_us_mi_pro_gal =
          gib_durchschnittsverbrauch_us_mi_pro_gal();
      durchschnittsverbrauch_l_pro_100km = umrechnung_durchschnittsverbrauch(
          durchschnittsverbrauch_us_mi_pro_gal);
    }
    printf("\nAufgrund Ihrer Eingaben habe ich folgende Daten berechnet:\n");
    printf("\nSie haben %5.2f Liter Benzin pro 100 Kilometer verbraucht.\n",
           durchschnittsverbrauch_l_pro_100km);
    printf("Dem entsprechen %5.2f gefahrene Meilen pro Gallone Benzin.\n",
           durchschnittsverbrauch_us_mi_pro_gal);
    printf("\nMöchten Sie eine neue Berechnung durchführen (j/n)?");
    berechnung_neustarten = antwort_ja_oder_nein(106, 110);
  } while (berechnung_neustarten == 106);
  printf("\nDanke, dass Sie dieses Tool genutzt haben!\n"
         "Bis zum nächsten mal!\n");
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movl   $0x0,-0x4(%rbp)
movb   $0x1,-0x5(%rbp)
movb   $0x6e,-0x6(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
lea    0xe72(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xf77(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    $0x1,%edi
mov    $0x2,%esi
call   1080 <erfasse_ganze_zahl@plt>
mov    %al,-0x5(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x1,%eax
jne    11e2 <main+0x82>
mov    $0x0,%al
call   1060 <gib_durchschnittsverbrauch_l_pro_100km@plt>
movss  %xmm0,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
call   1030 <umrechnung_durchschnittsverbrauch@plt>
movss  %xmm0,-0x10(%rbp)
jmp    11fd <main+0x9d>
mov    $0x0,%al
call   1040 <gib_durchschnittsverbrauch_us_mi_pro_gal@plt>
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
call   1030 <umrechnung_durchschnittsverbrauch@plt>
movss  %xmm0,-0xc(%rbp)
lea    0xf64(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xf8a(%rip),%rdi
mov    $0x1,%al
call   1050 <printf@plt>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xfb0(%rip),%rdi
mov    $0x1,%al
call   1050 <printf@plt>
lea    0xfde(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    $0x6a,%edi
mov    $0x6e,%esi
call   1070 <antwort_ja_oder_nein@plt>
mov    %al,-0x6(%rbp)
movsbl -0x6(%rbp),%eax
cmp    $0x6a,%eax
je     1195 <main+0x35>
lea    0xfe8(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x4(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x10,%rsp
lea    0xf81(%rip),%rdi
call   1040 <puts@plt>
lea    0xe70(%rip),%r14
lea    0x1080(%rip),%r15
lea    0xeb7(%rip),%r12
lea    0xeed(%rip),%r13
lea    0xf22(%rip),%rbx
jmp    1215 <main+0xa5>
xchg   %ax,%ax
xor    %eax,%eax
call   1050 <gib_durchschnittsverbrauch_us_mi_pro_gal@plt>
movss  %xmm0,0xc(%rsp)
call   1030 <umrechnung_durchschnittsverbrauch@plt>
movss  %xmm0,0x8(%rsp)
mov    %r15,%rdi
call   1040 <puts@plt>
movss  0x8(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    %r12,%rdi
mov    $0x1,%al
call   1060 <printf@plt>
movss  0xc(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    %r13,%rdi
mov    $0x1,%al
call   1060 <printf@plt>
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <printf@plt>
mov    $0x6a,%edi
mov    $0x6e,%esi
call   1080 <antwort_ja_oder_nein@plt>
cmp    $0x6a,%al
jne    1253 <main+0xe3>
mov    %r14,%rdi
xor    %eax,%eax
call   1060 <printf@plt>
mov    $0x1,%edi
mov    $0x2,%esi
call   1090 <erfasse_ganze_zahl@plt>
cmp    $0x1,%al
jne    11b0 <main+0x40>
xor    %eax,%eax
call   1070 <gib_durchschnittsverbrauch_l_pro_100km@plt>
movss  %xmm0,0x8(%rsp)
call   1030 <umrechnung_durchschnittsverbrauch@plt>
movss  %xmm0,0xc(%rsp)
jmp    11c8 <main+0x58>
lea    0xff9(%rip),%rdi
call   1040 <puts@plt>
xor    %eax,%eax
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
@.str = [275 x i8] c"Dieses Programm berechnet den durchschnitt Benzinverbrauch und gibt diesen aus. Dabei wird die gefahrene Entfernung (in Kilometer oder amerikanischen Mailen) und der erzielter Verbrauch (in Liter oder amerikanischen Gallonen) auf dieser Strecke durch Benutzer eingegebenen.\0A\00"
@.str.1 = [85 x i8] c"\0AWie m\C3\B6chten Sie die Eingabe t\C3\A4tigen?\0A1) in l/100km\0A2) in mi/gal\0A\0AIhre Wahl bitte:\00"
@.str.2 = [61 x i8] c"\0AAufgrund Ihrer Eingaben habe ich folgende Daten berechnet:\0A\00"
@.str.3 = [61 x i8] c"\0ASie haben %5.2f Liter Benzin pro 100 Kilometer verbraucht.\0A\00"
@.str.4 = [60 x i8] c"Dem entsprechen %5.2f gefahrene Meilen pro Gallone Benzin.\0A\00"
@.str.5 = [55 x i8] c"\0AM\C3\B6chten Sie eine neue Berechnung durchf\C3\BChren (j/n)?\00"
@.str.6 = [68 x i8] c"\0ADanke, dass Sie dieses Tool genutzt haben!\0ABis zum n\C3\A4chsten mal!\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i8
%3 = alloca i8
%4 = alloca float
%5 = alloca float
store i32 0, i32* %1
store i8 1, i8* %2
store i8 110, i8* %3
store float 0.000000e+00, float* %4
store float 0.000000e+00, float* %5
%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([275 x i8], [275 x i8]* @.str, i64 0, i64 0))
br label %7
7: ; preds = %31, %0
%8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([85 x i8], [85 x i8]* @.str.1, i64 0, i64 0))
%9 = call signext i8 @erfasse_ganze_zahl(i32 1, i32 2)
store i8 %9, i8* %2
%10 = load i8, i8* %2
%11 = sext i8 %10 to i32
%12 = icmp eq i32 %11, 1
br i1 %12, label %13, label %17
13: ; preds = %7
%14 = call float (...) @gib_durchschnittsverbrauch_l_pro_100km()
store float %14, float* %4
%15 = load float, float* %4
%16 = call float @umrechnung_durchschnittsverbrauch(float %15)
store float %16, float* %5
br label %21
17: ; preds = %7
%18 = call float (...) @gib_durchschnittsverbrauch_us_mi_pro_gal()
store float %18, float* %5
%19 = load float, float* %5
%20 = call float @umrechnung_durchschnittsverbrauch(float %19)
store float %20, float* %4
br label %21
21: ; preds = %17, %13
%22 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.2, i64 0, i64 0))
%23 = load float, float* %4
%24 = fpext float %23 to double
%25 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.3, i64 0, i64 0), double %24)
%26 = load float, float* %5
%27 = fpext float %26 to double
%28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @.str.4, i64 0, i64 0), double %27)
%29 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([55 x i8], [55 x i8]* @.str.5, i64 0, i64 0))
%30 = call signext i8 @antwort_ja_oder_nein(i32 106, i32 110)
store i8 %30, i8* %3
br label %31
31: ; preds = %21
%32 = load i8, i8* %3
%33 = sext i8 %32 to i32
%34 = icmp eq i32 %33, 106
br i1 %34, label %7, label %35
35: ; preds = %31
%36 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([68 x i8], [68 x i8]* @.str.6, i64 0, i64 0))
%37 = load i32, i32* %1
ret i32 %37
}

LLVM IR (-O2):
@.str.1 = [85 x i8] c"\0AWie m\C3\B6chten Sie die Eingabe t\C3\A4tigen?\0A1) in l/100km\0A2) in mi/gal\0A\0AIhre Wahl bitte:\00"
@.str.3 = [61 x i8] c"\0ASie haben %5.2f Liter Benzin pro 100 Kilometer verbraucht.\0A\00"
@.str.4 = [60 x i8] c"Dem entsprechen %5.2f gefahrene Meilen pro Gallone Benzin.\0A\00"
@.str.5 = [55 x i8] c"\0AM\C3\B6chten Sie eine neue Berechnung durchf\C3\BChren (j/n)?\00"
@str = [274 x i8] c"Dieses Programm berechnet den durchschnitt Benzinverbrauch und gibt diesen aus. Dabei wird die gefahrene Entfernung (in Kilometer oder amerikanischen Mailen) und der erzielter Verbrauch (in Liter oder amerikanischen Gallonen) auf dieser Strecke durch Benutzer eingegebenen.\00"
@str.7 = [60 x i8] c"\0AAufgrund Ihrer Eingaben habe ich folgende Daten berechnet:\00"
@str.8 = [67 x i8] c"\0ADanke, dass Sie dieses Tool genutzt haben!\0ABis zum n\C3\A4chsten mal!\00"
define i32 @main() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([274 x i8], [274 x i8]* @str, i64 0, i64 0))
br label %2
2: ; preds = %12, %0
%3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([85 x i8], [85 x i8]* @.str.1, i64 0, i64 0))
%4 = tail call signext i8 @erfasse_ganze_zahl(i32 1, i32 2)
%5 = icmp eq i8 %4, 1
br i1 %5, label %6, label %9
6: ; preds = %2
%7 = tail call float (...) @gib_durchschnittsverbrauch_l_pro_100km()
%8 = tail call float @umrechnung_durchschnittsverbrauch(float %7)
br label %12
9: ; preds = %2
%10 = tail call float (...) @gib_durchschnittsverbrauch_us_mi_pro_gal()
%11 = tail call float @umrechnung_durchschnittsverbrauch(float %10)
br label %12
12: ; preds = %9, %6
%13 = phi float [ %7, %6 ], [ %11, %9 ]
%14 = phi float [ %8, %6 ], [ %10, %9 ]
%15 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([60 x i8], [60 x i8]* @str.7, i64 0, i64 0))
%16 = fpext float %13 to double
%17 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([61 x i8], [61 x i8]* @.str.3, i64 0, i64 0), double %16)
%18 = fpext float %14 to double
%19 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([60 x i8], [60 x i8]* @.str.4, i64 0, i64 0), double %18)
%20 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([55 x i8], [55 x i8]* @.str.5, i64 0, i64 0))
%21 = tail call signext i8 @antwort_ja_oder_nein(i32 106, i32 110)
%22 = icmp eq i8 %21, 106
br i1 %22, label %2, label %23
23: ; preds = %12
%24 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([67 x i8], [67 x i8]* @str.8, i64 0, i64 0))
ret i32 0
}