#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 get_value();
int /*<<< orphan*/ parse_value(char *);
int /*<<< orphan*/ printf(char *);
void parse_iof(char *name) {
  int val = get_value();
  parse_value(name);
  if (val & 0x01)
    (printf(" "), printf("Cons"));
  else
    (printf(" "), printf("Data"));
  if (val & 0x02)
    (printf(" "), printf("Var"));
  else
    (printf(" "), printf("Array"));
  if (val & 0x04)
    (printf(" "), printf("Rel"));
  else
    (printf(" "), printf("Abs"));
  if (val & 0x08)
    (printf(" "), printf("Wrap"));
  if (val & 0x10)
    (printf(" "), printf("NonLin"));
  if (val & 0x20)
    (printf(" "), printf("NonPref"));
  if (val & 0x40)
    (printf(" "), printf("Null"));
  if (val & 0x80)
    (printf(" "), printf("Vol"));
  if (val & 0x0100)
    (printf(" "), printf("BufferedBytes"));
}


x86 assembly (clang, -O0):
<parse_iof>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    $0x0,%al
call   1050 <get_value@plt>
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <parse_value@plt>
mov    -0xc(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     117b <parse_iof+0x4b>
lea    0xe9b(%rip),%rdi
call   1040 <printf@plt>
lea    0xe91(%rip),%rdi
call   1040 <printf@plt>
jmp    1193 <parse_iof+0x63>
lea    0xe7e(%rip),%rdi
call   1040 <printf@plt>
lea    0xe79(%rip),%rdi
call   1040 <printf@plt>
mov    -0xc(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     11bf <parse_iof+0x8f>
lea    0xe57(%rip),%rdi
call   1040 <printf@plt>
lea    0xe57(%rip),%rdi
call   1040 <printf@plt>
jmp    11d7 <parse_iof+0xa7>
lea    0xe3a(%rip),%rdi
call   1040 <printf@plt>
lea    0xe3e(%rip),%rdi
call   1040 <printf@plt>
mov    -0xc(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     1203 <parse_iof+0xd3>
lea    0xe13(%rip),%rdi
call   1040 <printf@plt>
lea    0xe1d(%rip),%rdi
call   1040 <printf@plt>
jmp    121b <parse_iof+0xeb>
lea    0xdf6(%rip),%rdi
call   1040 <printf@plt>
lea    0xe04(%rip),%rdi
call   1040 <printf@plt>
mov    -0xc(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     1242 <parse_iof+0x112>
lea    0xdcf(%rip),%rdi
call   1040 <printf@plt>
lea    0xde1(%rip),%rdi
call   1040 <printf@plt>
mov    -0xc(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1269 <parse_iof+0x139>
lea    0xda8(%rip),%rdi
call   1040 <printf@plt>
lea    0xdbf(%rip),%rdi
call   1040 <printf@plt>
mov    -0xc(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     1290 <parse_iof+0x160>
lea    0xd81(%rip),%rdi
call   1040 <printf@plt>
lea    0xd9f(%rip),%rdi
call   1040 <printf@plt>
mov    -0xc(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     12b7 <parse_iof+0x187>
lea    0xd5a(%rip),%rdi
call   1040 <printf@plt>
lea    0xd80(%rip),%rdi
call   1040 <printf@plt>
mov    -0xc(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     12e0 <parse_iof+0x1b0>
lea    0xd31(%rip),%rdi
call   1040 <printf@plt>
lea    0xd5c(%rip),%rdi
call   1040 <printf@plt>
mov    -0xc(%rbp),%eax
and    $0x100,%eax
cmp    $0x0,%eax
je     1309 <parse_iof+0x1d9>
lea    0xd08(%rip),%rdi
call   1040 <printf@plt>
lea    0xd37(%rip),%rdi
call   1040 <printf@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<parse_iof>:
push   %rbp
push   %r14
push   %rbx
mov    %rdi,%r14
xor    %eax,%eax
call   1060 <get_value@plt>
mov    %eax,%ebp
mov    %r14,%rdi
call   1040 <parse_value@plt>
mov    $0x20,%edi
call   1030 <putchar@plt>
test   $0x1,%bpl
lea    0xe98(%rip),%rax
lea    0xe8c(%rip),%rdi
cmove  %rax,%rdi
call   1050 <printf@plt>
test   $0x2,%bpl
lea    0xe86(%rip),%rax
lea    0xe7b(%rip),%rbx
cmove  %rax,%rbx
mov    $0x20,%edi
call   1030 <putchar@plt>
mov    %rbx,%rdi
call   1050 <printf@plt>
test   $0x4,%bpl
lea    0xe68(%rip),%rax
lea    0xe5d(%rip),%rbx
cmove  %rax,%rbx
mov    $0x20,%edi
call   1030 <putchar@plt>
mov    %rbx,%rdi
call   1050 <printf@plt>
test   $0x8,%bpl
jne    1200 <parse_iof+0xc0>
test   $0x10,%bpl
jne    121c <parse_iof+0xdc>
test   $0x20,%bpl
jne    1238 <parse_iof+0xf8>
test   $0x40,%bpl
jne    1254 <parse_iof+0x114>
test   $0x80,%bpl
jne    1274 <parse_iof+0x134>
test   $0x100,%ebp
jne    1296 <parse_iof+0x156>
pop    %rbx
pop    %r14
pop    %rbp
ret
mov    $0x20,%edi
call   1030 <putchar@plt>
lea    0xe0b(%rip),%rdi
call   1050 <printf@plt>
test   $0x10,%bpl
je     11d9 <parse_iof+0x99>
mov    $0x20,%edi
call   1030 <putchar@plt>
lea    0xdf4(%rip),%rdi
call   1050 <printf@plt>
test   $0x20,%bpl
je     11df <parse_iof+0x9f>
mov    $0x20,%edi
call   1030 <putchar@plt>
lea    0xddf(%rip),%rdi
call   1050 <printf@plt>
test   $0x40,%bpl
je     11e5 <parse_iof+0xa5>
mov    $0x20,%edi
call   1030 <putchar@plt>
lea    0xdcb(%rip),%rdi
call   1050 <printf@plt>
test   $0x80,%bpl
je     11ef <parse_iof+0xaf>
mov    $0x20,%edi
call   1030 <putchar@plt>
lea    0xdb0(%rip),%rdi
call   1050 <printf@plt>
test   $0x100,%ebp
je     11fb <parse_iof+0xbb>
mov    $0x20,%edi
call   1030 <putchar@plt>
lea    0xd92(%rip),%rdi
pop    %rbx
pop    %r14
pop    %rbp
jmp    1050 <printf@plt>

LLVM IR (-O0):
@.str = [2 x i8] c" \00"
@.str.1 = [5 x i8] c"Cons\00"
@.str.2 = [5 x i8] c"Data\00"
@.str.3 = [4 x i8] c"Var\00"
@.str.4 = [6 x i8] c"Array\00"
@.str.5 = [4 x i8] c"Rel\00"
@.str.6 = [4 x i8] c"Abs\00"
@.str.7 = [5 x i8] c"Wrap\00"
@.str.8 = [7 x i8] c"NonLin\00"
@.str.9 = [8 x i8] c"NonPref\00"
@.str.10 = [5 x i8] c"Null\00"
@.str.11 = [4 x i8] c"Vol\00"
@.str.12 = [14 x i8] c"BufferedBytes\00"
define void @parse_iof(i8* %0) {
%2 = alloca i8*
%3 = alloca i32
store i8* %0, i8** %2
%4 = call i32 (...) @get_value()
store i32 %4, i32* %3
%5 = load i8*, i8** %2
%6 = call i32 @parse_value(i8* %5)
%7 = load i32, i32* %3
%8 = and i32 %7, 1
%9 = icmp ne i32 %8, 0
br i1 %9, label %10, label %13
10: ; preds = %1
%11 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%12 = call i32 @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0))
br label %16
13: ; preds = %1
%14 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%15 = call i32 @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0))
br label %16
16: ; preds = %13, %10
%17 = load i32, i32* %3
%18 = and i32 %17, 2
%19 = icmp ne i32 %18, 0
br i1 %19, label %20, label %23
20: ; preds = %16
%21 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%22 = call i32 @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i64 0, i64 0))
br label %26
23: ; preds = %16
%24 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%25 = call i32 @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i64 0, i64 0))
br label %26
26: ; preds = %23, %20
%27 = load i32, i32* %3
%28 = and i32 %27, 4
%29 = icmp ne i32 %28, 0
br i1 %29, label %30, label %33
30: ; preds = %26
%31 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%32 = call i32 @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i64 0, i64 0))
br label %36
33: ; preds = %26
%34 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%35 = call i32 @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.6, i64 0, i64 0))
br label %36
36: ; preds = %33, %30
%37 = load i32, i32* %3
%38 = and i32 %37, 8
%39 = icmp ne i32 %38, 0
br i1 %39, label %40, label %43
40: ; preds = %36
%41 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%42 = call i32 @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.7, i64 0, i64 0))
br label %43
43: ; preds = %40, %36
%44 = load i32, i32* %3
%45 = and i32 %44, 16
%46 = icmp ne i32 %45, 0
br i1 %46, label %47, label %50
47: ; preds = %43
%48 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%49 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.8, i64 0, i64 0))
br label %50
50: ; preds = %47, %43
%51 = load i32, i32* %3
%52 = and i32 %51, 32
%53 = icmp ne i32 %52, 0
br i1 %53, label %54, label %57
54: ; preds = %50
%55 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%56 = call i32 @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.9, i64 0, i64 0))
br label %57
57: ; preds = %54, %50
%58 = load i32, i32* %3
%59 = and i32 %58, 64
%60 = icmp ne i32 %59, 0
br i1 %60, label %61, label %64
61: ; preds = %57
%62 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%63 = call i32 @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.10, i64 0, i64 0))
br label %64
64: ; preds = %61, %57
%65 = load i32, i32* %3
%66 = and i32 %65, 128
%67 = icmp ne i32 %66, 0
br i1 %67, label %68, label %71
68: ; preds = %64
%69 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%70 = call i32 @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i64 0, i64 0))
br label %71
71: ; preds = %68, %64
%72 = load i32, i32* %3
%73 = and i32 %72, 256
%74 = icmp ne i32 %73, 0
br i1 %74, label %75, label %78
75: ; preds = %71
%76 = call i32 @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%77 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.12, i64 0, i64 0))
br label %78
78: ; preds = %75, %71
ret void
}

LLVM IR (-O2):
@.str.1 = [5 x i8] c"Cons\00"
@.str.2 = [5 x i8] c"Data\00"
@.str.3 = [4 x i8] c"Var\00"
@.str.4 = [6 x i8] c"Array\00"
@.str.5 = [4 x i8] c"Rel\00"
@.str.6 = [4 x i8] c"Abs\00"
@.str.7 = [5 x i8] c"Wrap\00"
@.str.8 = [7 x i8] c"NonLin\00"
@.str.9 = [8 x i8] c"NonPref\00"
@.str.10 = [5 x i8] c"Null\00"
@.str.11 = [4 x i8] c"Vol\00"
@.str.12 = [14 x i8] c"BufferedBytes\00"
define void @parse_iof(i8* %0) {
%2 = tail call i32 (...) @get_value()
%3 = tail call i32 @parse_value(i8* %0)
%4 = and i32 %2, 1
%5 = icmp eq i32 %4, 0
%6 = tail call i32 @putchar(i32 32)
%7 = select i1 %5, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0)
%8 = tail call i32 @printf(i8* dereferenceable(1) %7)
%9 = and i32 %2, 2
%10 = icmp eq i32 %9, 0
%11 = select i1 %10, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i64 0, i64 0)
%12 = tail call i32 @putchar(i32 32)
%13 = tail call i32 @printf(i8* dereferenceable(1) %11)
%14 = and i32 %2, 4
%15 = icmp eq i32 %14, 0
%16 = select i1 %15, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.6, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i64 0, i64 0)
%17 = tail call i32 @putchar(i32 32)
%18 = tail call i32 @printf(i8* dereferenceable(1) %16)
%19 = and i32 %2, 8
%20 = icmp eq i32 %19, 0
br i1 %20, label %24, label %21
21: ; preds = %1
%22 = tail call i32 @putchar(i32 32)
%23 = tail call i32 @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.7, i64 0, i64 0))
br label %24
24: ; preds = %21, %1
%25 = and i32 %2, 16
%26 = icmp eq i32 %25, 0
br i1 %26, label %30, label %27
27: ; preds = %24
%28 = tail call i32 @putchar(i32 32)
%29 = tail call i32 @printf(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str.8, i64 0, i64 0))
br label %30
30: ; preds = %27, %24
%31 = and i32 %2, 32
%32 = icmp eq i32 %31, 0
br i1 %32, label %36, label %33
33: ; preds = %30
%34 = tail call i32 @putchar(i32 32)
%35 = tail call i32 @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.9, i64 0, i64 0))
br label %36
36: ; preds = %33, %30
%37 = and i32 %2, 64
%38 = icmp eq i32 %37, 0
br i1 %38, label %42, label %39
39: ; preds = %36
%40 = tail call i32 @putchar(i32 32)
%41 = tail call i32 @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.10, i64 0, i64 0))
br label %42
42: ; preds = %39, %36
%43 = and i32 %2, 128
%44 = icmp eq i32 %43, 0
br i1 %44, label %48, label %45
45: ; preds = %42
%46 = tail call i32 @putchar(i32 32)
%47 = tail call i32 @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i64 0, i64 0))
br label %48
48: ; preds = %45, %42
%49 = and i32 %2, 256
%50 = icmp eq i32 %49, 0
br i1 %50, label %54, label %51
51: ; preds = %48
%52 = tail call i32 @putchar(i32 32)
%53 = tail call i32 @printf(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str.12, i64 0, i64 0))
br label %54
54: ; preds = %51, %48
ret void
}