#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 *, ...);
int main(void) {
  char c1, c2, c3;
  short s1, s2, s3;
  int i1, i2, i3;
  long g1, g2, g3;
  float f1, f2, f3;
  double d1, d2, d3;
  int buf = 1;
  printf("largest powers of 2\n");
  {
    int i = 0;
    c1 = 1;
    c2 = c1 * 2;
    c3 = c2 / 2;
    while (c3 == c1) {
      ++i;
      c1 = c2;
      c2 = c1 * 2;
      c3 = c2 / 2;
    }
    printf("\t%6s: 2**%d = "
           "%d"
           "\n",
           "char", i, c1);
  };
  printf("\t(char is %s)\n", (c2 < 0) ? "signed" : "unsigned");
  {
    int i = 0;
    s1 = 1;
    s2 = s1 * 2;
    s3 = s2 / 2;
    while (s3 == s1) {
      ++i;
      s1 = s2;
      s2 = s1 * 2;
      s3 = s2 / 2;
    }
    printf("\t%6s: 2**%d = "
           "%d"
           "\n",
           "short", i, s1);
  };
  {
    int i = 0;
    i1 = 1;
    i2 = i1 * 2;
    i3 = i2 / 2;
    while (i3 == i1) {
      ++i;
      i1 = i2;
      i2 = i1 * 2;
      i3 = i2 / 2;
    }
    printf("\t%6s: 2**%d = "
           "%d"
           "\n",
           "int", i, i1);
  };
  {
    int i = 0;
    g1 = 1;
    g2 = g1 * 2;
    g3 = g2 / 2;
    while (g3 == g1) {
      ++i;
      g1 = g2;
      g2 = g1 * 2;
      g3 = g2 / 2;
    }
    printf("\t%6s: 2**%d = "
           "%ld"
           "\n",
           "long", i, g1);
  };
  {
    int i = 0;
    f1 = 1;
    f2 = f1 * 2;
    f3 = f2 / 2;
    while (f3 == f1) {
      ++i;
      f1 = f2;
      f2 = f1 * 2;
      f3 = f2 / 2;
    }
    printf("\t%6s: 2**%d = "
           "%g"
           "\n",
           "float", i, f1);
  };
  {
    int i = 0;
    d1 = 1;
    d2 = d1 * 2;
    d3 = d2 / 2;
    while (d3 == d1) {
      ++i;
      d1 = d2;
      d2 = d1 * 2;
      d3 = d2 / 2;
    }
    printf("\t%6s: 2**%d = "
           "%g"
           "\n",
           "double", i, d1);
  };
  printf("smallest powers of 2\n");
  {
    int i = 0;
    f1 = 1;
    f2 = f1 / 2;
    f3 = f2 * 2;
    while (f3 == f1) {
      --i;
      f1 = f2;
      f2 = f1 / 2;
      f3 = f2 * 2;
    }
    printf("\t%6s: 2**%d = "
           "%g"
           "\n",
           "float", i, f1);
  };
  {
    int i = 0;
    d1 = 1;
    d2 = d1 / 2;
    d3 = d2 * 2;
    while (d3 == d1) {
      --i;
      d1 = d2;
      d2 = d1 / 2;
      d3 = d2 * 2;
    }
    printf("\t%6s: 2**%d = "
           "%g"
           "\n",
           "double", i, d1);
  };
  printf("machine is %s-endian\n", (*(char *)&buf == 1) ? "little" : "big");
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x64(%rbp)
lea    0xee8(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movl   $0x0,-0x68(%rbp)
movb   $0x1,-0x5(%rbp)
movsbl -0x5(%rbp),%eax
shl    $0x1,%eax
mov    %al,-0x6(%rbp)
movsbl -0x6(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %al,-0x7(%rbp)
movsbl -0x7(%rbp),%eax
movsbl -0x5(%rbp),%ecx
cmp    %ecx,%eax
jne    1198 <main+0x88>
mov    -0x68(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x68(%rbp)
mov    -0x6(%rbp),%al
mov    %al,-0x5(%rbp)
movsbl -0x5(%rbp),%eax
shl    $0x1,%eax
mov    %al,-0x6(%rbp)
movsbl -0x6(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %al,-0x7(%rbp)
jmp    115b <main+0x4b>
mov    -0x68(%rbp),%edx
movsbl -0x5(%rbp),%ecx
lea    0xe87(%rip),%rdi
lea    0xe92(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsbl -0x6(%rbp),%ecx
lea    0xe94(%rip),%rsi
lea    0xe8f(%rip),%rax
cmp    $0x0,%ecx
cmovl  %rax,%rsi
lea    0xe70(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movl   $0x0,-0x6c(%rbp)
movw   $0x1,-0xa(%rbp)
movswl -0xa(%rbp),%eax
shl    $0x1,%eax
mov    %ax,-0xc(%rbp)
movswl -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %ax,-0xe(%rbp)
movswl -0xe(%rbp),%eax
movswl -0xa(%rbp),%ecx
cmp    %ecx,%eax
jne    1244 <main+0x134>
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
mov    -0xc(%rbp),%ax
mov    %ax,-0xa(%rbp)
movswl -0xa(%rbp),%eax
shl    $0x1,%eax
mov    %ax,-0xc(%rbp)
movswl -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %ax,-0xe(%rbp)
jmp    1203 <main+0xf3>
mov    -0x6c(%rbp),%edx
movswl -0xa(%rbp),%ecx
lea    0xddb(%rip),%rdi
lea    0xe03(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movl   $0x0,-0x70(%rbp)
movl   $0x1,-0x14(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    12bc <main+0x1ac>
mov    -0x70(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x70(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x1c(%rbp)
jmp    1285 <main+0x175>
mov    -0x70(%rbp),%edx
mov    -0x14(%rbp),%ecx
lea    0xd64(%rip),%rdi
lea    0xd92(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movl   $0x0,-0x74(%rbp)
movq   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x28(%rbp),%rax
jne    1346 <main+0x236>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
mov    %rax,-0x38(%rbp)
jmp    1304 <main+0x1f4>
mov    -0x74(%rbp),%edx
mov    -0x28(%rbp),%rcx
lea    0xd12(%rip),%rdi
lea    0xd1e(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movl   $0x0,-0x78(%rbp)
movss  0xc93(%rip),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  0xc82(%rip),%xmm0
mulss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
movss  0xc6b(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x44(%rbp),%xmm0
ucomiss -0x3c(%rbp),%xmm0
jne    13f3 <main+0x2e3>
jp     13f3 <main+0x2e3>
mov    -0x78(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x78(%rbp)
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  0xc32(%rip),%xmm0
mulss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
movss  0xc1b(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
jmp    139e <main+0x28e>
mov    -0x78(%rbp),%edx
movss  -0x3c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xc78(%rip),%rdi
lea    0xc83(%rip),%rsi
mov    $0x1,%al
call   1030 <printf@plt>
movl   $0x0,-0x7c(%rbp)
movsd  0xbed(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xbd8(%rip),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  0xbc1(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
ucomisd -0x50(%rbp),%xmm0
jne    14a6 <main+0x396>
jp     14a6 <main+0x396>
mov    -0x7c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x7c(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xb87(%rip),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  0xb70(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1450 <main+0x340>
mov    -0x7c(%rbp),%edx
movsd  -0x50(%rbp),%xmm0
lea    0xbc9(%rip),%rdi
lea    0xbda(%rip),%rsi
mov    $0x1,%al
call   1030 <printf@plt>
lea    0xbd3(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movl   $0x0,-0x80(%rbp)
movss  0xb24(%rip),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
movss  0xb0e(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  0xafd(%rip),%xmm0
mulss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x44(%rbp),%xmm0
ucomiss -0x3c(%rbp),%xmm0
jne    1562 <main+0x452>
jp     1562 <main+0x452>
mov    -0x80(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x80(%rbp)
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
movss  0xabe(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  0xaad(%rip),%xmm0
mulss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
jmp    150d <main+0x3fd>
mov    -0x80(%rbp),%edx
movss  -0x3c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xb09(%rip),%rdi
lea    0xb14(%rip),%rsi
mov    $0x1,%al
call   1030 <printf@plt>
movl   $0x0,-0x84(%rbp)
movsd  0xa7b(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  0xa61(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xa50(%rip),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
ucomisd -0x50(%rbp),%xmm0
jne    161e <main+0x50e>
jp     161e <main+0x50e>
mov    -0x84(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x84(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  0xa0a(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0x9f9(%rip),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    15c2 <main+0x4b2>
mov    -0x84(%rbp),%edx
movsd  -0x50(%rbp),%xmm0
lea    0xa4e(%rip),%rdi
lea    0xa5f(%rip),%rsi
mov    $0x1,%al
call   1030 <printf@plt>
movsbl -0x64(%rbp),%ecx
lea    0xa87(%rip),%rsi
lea    0xa79(%rip),%rax
cmp    $0x1,%ecx
cmove  %rax,%rsi
lea    0xa55(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xor    %eax,%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
lea    0xf0b(%rip),%rdi
call   1030 <puts@plt>
lea    0xecc(%rip),%rbx
lea    0xed7(%rip),%rsi
mov    %rbx,%rdi
mov    $0x6,%edx
mov    $0x40,%ecx
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xec1(%rip),%rdi
lea    0xec9(%rip),%rsi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xec2(%rip),%rsi
mov    %rbx,%rdi
mov    $0xe,%edx
mov    $0x4000,%ecx
xor    %eax,%eax
call   1040 <printf@plt>

LLVM IR (-O0):
@.str = [21 x i8] c"largest powers of 2\0A\00"
@.str.1 = [18 x i8] c"\09%6s: 2**%d = %d\0A\00"
@.str.2 = [5 x i8] c"char\00"
@.str.3 = [15 x i8] c"\09(char is %s)\0A\00"
@.str.4 = [7 x i8] c"signed\00"
@.str.5 = [9 x i8] c"unsigned\00"
@.str.6 = [6 x i8] c"short\00"
@.str.7 = [4 x i8] c"int\00"
@.str.8 = [19 x i8] c"\09%6s: 2**%d = %ld\0A\00"
@.str.9 = [5 x i8] c"long\00"
@.str.10 = [18 x i8] c"\09%6s: 2**%d = %g\0A\00"
@.str.11 = [6 x i8] c"float\00"
@.str.12 = [7 x i8] c"double\00"
@.str.13 = [22 x i8] c"smallest powers of 2\0A\00"
@.str.14 = [22 x i8] c"machine is %s-endian\0A\00"
@.str.15 = [7 x i8] c"little\00"
@.str.16 = [4 x i8] c"big\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i8
%3 = alloca i8
%4 = alloca i8
%5 = alloca i16
%6 = alloca i16
%7 = alloca i16
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca i32
store i32 0, i32* %1
store i32 1, i32* %20
%29 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str, i64 0, i64 0))
store i32 0, i32* %21
store i8 1, i8* %2
%30 = load i8, i8* %2
%31 = sext i8 %30 to i32
%32 = mul nsw i32 %31, 2
%33 = trunc i32 %32 to i8
store i8 %33, i8* %3
%34 = load i8, i8* %3
%35 = sext i8 %34 to i32
%36 = sdiv i32 %35, 2
%37 = trunc i32 %36 to i8
store i8 %37, i8* %4
br label %38
38: ; preds = %44, %0
%39 = load i8, i8* %4
%40 = sext i8 %39 to i32
%41 = load i8, i8* %2
%42 = sext i8 %41 to i32
%43 = icmp eq i32 %40, %42
br i1 %43, label %44, label %56
44: ; preds = %38
%45 = load i32, i32* %21
%46 = add nsw i32 %45, 1
store i32 %46, i32* %21
%47 = load i8, i8* %3
store i8 %47, i8* %2
%48 = load i8, i8* %2
%49 = sext i8 %48 to i32
%50 = mul nsw i32 %49, 2
%51 = trunc i32 %50 to i8
store i8 %51, i8* %3
%52 = load i8, i8* %3
%53 = sext i8 %52 to i32
%54 = sdiv i32 %53, 2
%55 = trunc i32 %54 to i8
store i8 %55, i8* %4
br label %38
56: ; preds = %38
%57 = load i32, i32* %21
%58 = load i8, i8* %2
%59 = sext i8 %58 to i32
%60 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i32 %57, i32 %59)
%61 = load i8, i8* %3
%62 = sext i8 %61 to i32
%63 = icmp slt i32 %62, 0
%64 = zext i1 %63 to i64
%65 = select i1 %63, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i64 0, i64 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i64 0, i64 0)
%66 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0), i8* %65)
store i32 0, i32* %22
store i16 1, i16* %5
%67 = load i16, i16* %5
%68 = sext i16 %67 to i32
%69 = mul nsw i32 %68, 2
%70 = trunc i32 %69 to i16
store i16 %70, i16* %6
%71 = load i16, i16* %6
%72 = sext i16 %71 to i32
%73 = sdiv i32 %72, 2
%74 = trunc i32 %73 to i16
store i16 %74, i16* %7
br label %75
75: ; preds = %81, %56
%76 = load i16, i16* %7
%77 = sext i16 %76 to i32
%78 = load i16, i16* %5
%79 = sext i16 %78 to i32
%80 = icmp eq i32 %77, %79
br i1 %80, label %81, label %93
81: ; preds = %75
%82 = load i32, i32* %22
%83 = add nsw i32 %82, 1
store i32 %83, i32* %22
%84 = load i16, i16* %6
store i16 %84, i16* %5
%85 = load i16, i16* %5
%86 = sext i16 %85 to i32
%87 = mul nsw i32 %86, 2
%88 = trunc i32 %87 to i16
store i16 %88, i16* %6
%89 = load i16, i16* %6
%90 = sext i16 %89 to i32
%91 = sdiv i32 %90, 2
%92 = trunc i32 %91 to i16
store i16 %92, i16* %7
br label %75
93: ; preds = %75
%94 = load i32, i32* %22
%95 = load i16, i16* %5
%96 = sext i16 %95 to i32
%97 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0), i32 %94, i32 %96)
store i32 0, i32* %23
store i32 1, i32* %8
%98 = load i32, i32* %8
%99 = mul nsw i32 %98, 2
store i32 %99, i32* %9
%100 = load i32, i32* %9
%101 = sdiv i32 %100, 2
store i32 %101, i32* %10
br label %102
102: ; preds = %106, %93
%103 = load i32, i32* %10
%104 = load i32, i32* %8
%105 = icmp eq i32 %103, %104
br i1 %105, label %106, label %114
106: ; preds = %102
%107 = load i32, i32* %23
%108 = add nsw i32 %107, 1
store i32 %108, i32* %23
%109 = load i32, i32* %9
store i32 %109, i32* %8
%110 = load i32, i32* %8
%111 = mul nsw i32 %110, 2
store i32 %111, i32* %9
%112 = load i32, i32* %9
%113 = sdiv i32 %112, 2
store i32 %113, i32* %10
br label %102
114: ; preds = %102
%115 = load i32, i32* %23
%116 = load i32, i32* %8
%117 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0), i32 %115, i32 %116)
store i32 0, i32* %24
store i64 1, i64* %11
%118 = load i64, i64* %11
%119 = mul nsw i64 %118, 2
store i64 %119, i64* %12
%120 = load i64, i64* %12
%121 = sdiv i64 %120, 2
store i64 %121, i64* %13
br label %122
122: ; preds = %126, %114
%123 = load i64, i64* %13
%124 = load i64, i64* %11
%125 = icmp eq i64 %123, %124
br i1 %125, label %126, label %134
126: ; preds = %122
%127 = load i32, i32* %24
%128 = add nsw i32 %127, 1
store i32 %128, i32* %24
%129 = load i64, i64* %12
store i64 %129, i64* %11
%130 = load i64, i64* %11
%131 = mul nsw i64 %130, 2
store i64 %131, i64* %12
%132 = load i64, i64* %12
%133 = sdiv i64 %132, 2
store i64 %133, i64* %13
br label %122
134: ; preds = %122
%135 = load i32, i32* %24
%136 = load i64, i64* %11
%137 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.8, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.9, i64 0, i64 0), i32 %135, i64 %136)
store i32 0, i32* %25
store float 1.000000e+00, float* %14
%138 = load float, float* %14
%139 = fmul float %138, 2.000000e+00
store float %139, float* %15
%140 = load float, float* %15
%141 = fdiv float %140, 2.000000e+00
store float %141, float* %16
br label %142
142: ; preds = %146, %134
%143 = load float, float* %16
%144 = load float, float* %14
%145 = fcmp oeq float %143, %144
br i1 %145, label %146, label %154
146: ; preds = %142
%147 = load i32, i32* %25
%148 = add nsw i32 %147, 1
store i32 %148, i32* %25
%149 = load float, float* %15
store float %149, float* %14
%150 = load float, float* %14
%151 = fmul float %150, 2.000000e+00
store float %151, float* %15
%152 = load float, float* %15
%153 = fdiv float %152, 2.000000e+00
store float %153, float* %16
br label %142
154: ; preds = %142
%155 = load i32, i32* %25
%156 = load float, float* %14
%157 = fpext float %156 to double
%158 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.10, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.11, i64 0, i64 0), i32 %155, double %157)
store i32 0, i32* %26
store double 1.000000e+00, double* %17
%159 = load double, double* %17
%160 = fmul double %159, 2.000000e+00
store double %160, double* %18
%161 = load double, double* %18
%162 = fdiv double %161, 2.000000e+00
store double %162, double* %19
br label %163
163: ; preds = %167, %154
%164 = load double, double* %19
%165 = load double, double* %17
%166 = fcmp oeq double %164, %165
br i1 %166, label %167, label %175
167: ; preds = %163
%168 = load i32, i32* %26
%169 = add nsw i32 %168, 1
store i32 %169, i32* %26
%170 = load double, double* %18
store double %170, double* %17
%171 = load double, double* %17
%172 = fmul double %171, 2.000000e+00
store double %172, double* %18
%173 = load double, double* %18
%174 = fdiv double %173, 2.000000e+00
store double %174, double* %19
br label %163
175: ; preds = %163
%176 = load i32, i32* %26
%177 = load double, double* %17
%178 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.10, i64 0, i64 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.12, i64 0, i64 0), i32 %176, double %177)
%179 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.13, i64 0, i64 0))
store i32 0, i32* %27
store float 1.000000e+00, float* %14
%180 = load float, float* %14
%181 = fdiv float %180, 2.000000e+00
store float %181, float* %15
%182 = load float, float* %15
%183 = fmul float %182, 2.000000e+00
store float %183, float* %16
br label %184
184: ; preds = %188, %175
%185 = load float, float* %16
%186 = load float, float* %14
%187 = fcmp oeq float %185, %186
br i1 %187, label %188, label %196
188: ; preds = %184
%189 = load i32, i32* %27
%190 = add nsw i32 %189, -1
store i32 %190, i32* %27
%191 = load float, float* %15
store float %191, float* %14
%192 = load float, float* %14
%193 = fdiv float %192, 2.000000e+00
store float %193, float* %15
%194 = load float, float* %15
%195 = fmul float %194, 2.000000e+00
store float %195, float* %16
br label %184
196: ; preds = %184
%197 = load i32, i32* %27
%198 = load float, float* %14
%199 = fpext float %198 to double
%200 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.10, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.11, i64 0, i64 0), i32 %197, double %199)
store i32 0, i32* %28
store double 1.000000e+00, double* %17
%201 = load double, double* %17
%202 = fdiv double %201, 2.000000e+00
store double %202, double* %18
%203 = load double, double* %18
%204 = fmul double %203, 2.000000e+00
store double %204, double* %19
br label %205
205: ; preds = %209, %196
%206 = load double, double* %19
%207 = load double, double* %17
%208 = fcmp oeq double %206, %207
br i1 %208, label %209, label %217
209: ; preds = %205
%210 = load i32, i32* %28
%211 = add nsw i32 %210, -1
store i32 %211, i32* %28
%212 = load double, double* %18
store double %212, double* %17
%213 = load double, double* %17
%214 = fdiv double %213, 2.000000e+00
store double %214, double* %18
%215 = load double, double* %18
%216 = fmul double %215, 2.000000e+00
store double %216, double* %19
br label %205
217: ; preds = %205
%218 = load i32, i32* %28
%219 = load double, double* %17
%220 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.10, i64 0, i64 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.12, i64 0, i64 0), i32 %218, double %219)
%221 = bitcast i32* %20 to i8*
%222 = load i8, i8* %221
%223 = sext i8 %222 to i32
%224 = icmp eq i32 %223, 1
%225 = zext i1 %224 to i64
%226 = select i1 %224, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.15, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.16, i64 0, i64 0)
%227 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.14, i64 0, i64 0), i8* %226)
ret i32 0
}

LLVM IR (-O2):
@.str.1 = [18 x i8] c"\09%6s: 2**%d = %d\0A\00"
@.str.2 = [5 x i8] c"char\00"
@.str.3 = [15 x i8] c"\09(char is %s)\0A\00"
@.str.4 = [7 x i8] c"signed\00"
@.str.6 = [6 x i8] c"short\00"
@str = [20 x i8] c"largest powers of 2\00"
define i32 @main() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @str, i64 0, i64 0))
%2 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i32 6, i32 64)
%3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i64 0, i64 0))
%4 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0), i32 14, i32 16384)
unreachable
}