#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 */
struct var {
  int dummy;
};
struct scope {
  int dummy;
};

/* Variables and functions */
int EOF;
int getchar();
int /*<<< orphan*/ vars_add_edge(struct var *, struct var *);
int /*<<< orphan*/ vars_remove_edge(struct var *, struct var *);
void dgol_lib_io_readbyte(struct scope *scope, int arg_count,
                          struct var **args) {
  int c = getchar();
  if (c == EOF) {
    if (arg_count > 1) {
      vars_add_edge(args[0], args[1]);
    }
    return;
  }
  if (arg_count > 1) {
    vars_remove_edge(args[0], args[1]);
  }
  if (arg_count > 2) {
    if (c & 1) {
      vars_add_edge(args[0], args[2]);
    } else {
      vars_remove_edge(args[0], args[2]);
    }
  }
  if (arg_count > 3) {
    if (c & 2) {
      vars_add_edge(args[0], args[3]);
    } else {
      vars_remove_edge(args[0], args[3]);
    }
  }
  if (arg_count > 4) {
    if (c & 4) {
      vars_add_edge(args[0], args[4]);
    } else {
      vars_remove_edge(args[0], args[4]);
    }
  }
  if (arg_count > 5) {
    if (c & 8) {
      vars_add_edge(args[0], args[5]);
    } else {
      vars_remove_edge(args[0], args[5]);
    }
  }
  if (arg_count > 6) {
    if (c & 16) {
      vars_add_edge(args[0], args[6]);
    } else {
      vars_remove_edge(args[0], args[6]);
    }
  }
  if (arg_count > 7) {
    if (c & 32) {
      vars_add_edge(args[0], args[7]);
    } else {
      vars_remove_edge(args[0], args[7]);
    }
  }
  if (arg_count > 8) {
    if (c & 64) {
      vars_add_edge(args[0], args[8]);
    } else {
      vars_remove_edge(args[0], args[8]);
    }
  }
  if (arg_count > 9) {
    if (c & 128) {
      vars_add_edge(args[0], args[9]);
    } else {
      vars_remove_edge(args[0], args[9]);
    }
  }
}


x86 assembly (clang, -O0):
<dgol_lib_io_readbyte>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    $0x0,%al
call   1030 <getchar@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    0x2e91(%rip),%rcx
cmp    (%rcx),%eax
jne    1182 <dgol_lib_io_readbyte+0x52>
cmpl   $0x1,-0xc(%rbp)
jle    117d <dgol_lib_io_readbyte+0x4d>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rsi
call   1040 <vars_add_edge@plt>
jmp    13fa <dgol_lib_io_readbyte+0x2ca>
cmpl   $0x1,-0xc(%rbp)
jle    11a0 <dgol_lib_io_readbyte+0x70>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rsi
call   1050 <vars_remove_edge@plt>
cmpl   $0x2,-0xc(%rbp)
jle    11eb <dgol_lib_io_readbyte+0xbb>
mov    -0x1c(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     11d2 <dgol_lib_io_readbyte+0xa2>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%rsi
call   1040 <vars_add_edge@plt>
jmp    11e6 <dgol_lib_io_readbyte+0xb6>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%rsi
call   1050 <vars_remove_edge@plt>
jmp    11eb <dgol_lib_io_readbyte+0xbb>
cmpl   $0x3,-0xc(%rbp)
jle    1236 <dgol_lib_io_readbyte+0x106>
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     121d <dgol_lib_io_readbyte+0xed>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x18(%rax),%rsi
call   1040 <vars_add_edge@plt>
jmp    1231 <dgol_lib_io_readbyte+0x101>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x18(%rax),%rsi
call   1050 <vars_remove_edge@plt>
jmp    1236 <dgol_lib_io_readbyte+0x106>
cmpl   $0x4,-0xc(%rbp)
jle    1281 <dgol_lib_io_readbyte+0x151>
mov    -0x1c(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     1268 <dgol_lib_io_readbyte+0x138>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x20(%rax),%rsi
call   1040 <vars_add_edge@plt>
jmp    127c <dgol_lib_io_readbyte+0x14c>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x20(%rax),%rsi
call   1050 <vars_remove_edge@plt>
jmp    1281 <dgol_lib_io_readbyte+0x151>
cmpl   $0x5,-0xc(%rbp)
jle    12cc <dgol_lib_io_readbyte+0x19c>
mov    -0x1c(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     12b3 <dgol_lib_io_readbyte+0x183>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x28(%rax),%rsi
call   1040 <vars_add_edge@plt>
jmp    12c7 <dgol_lib_io_readbyte+0x197>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x28(%rax),%rsi
call   1050 <vars_remove_edge@plt>
jmp    12cc <dgol_lib_io_readbyte+0x19c>
cmpl   $0x6,-0xc(%rbp)
jle    1317 <dgol_lib_io_readbyte+0x1e7>
mov    -0x1c(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     12fe <dgol_lib_io_readbyte+0x1ce>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x30(%rax),%rsi
call   1040 <vars_add_edge@plt>
jmp    1312 <dgol_lib_io_readbyte+0x1e2>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x30(%rax),%rsi
call   1050 <vars_remove_edge@plt>
jmp    1317 <dgol_lib_io_readbyte+0x1e7>
cmpl   $0x7,-0xc(%rbp)
jle    1362 <dgol_lib_io_readbyte+0x232>
mov    -0x1c(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     1349 <dgol_lib_io_readbyte+0x219>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x38(%rax),%rsi
call   1040 <vars_add_edge@plt>
jmp    135d <dgol_lib_io_readbyte+0x22d>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x38(%rax),%rsi
call   1050 <vars_remove_edge@plt>
jmp    1362 <dgol_lib_io_readbyte+0x232>
cmpl   $0x8,-0xc(%rbp)
jle    13ad <dgol_lib_io_readbyte+0x27d>
mov    -0x1c(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     1394 <dgol_lib_io_readbyte+0x264>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x40(%rax),%rsi
call   1040 <vars_add_edge@plt>
jmp    13a8 <dgol_lib_io_readbyte+0x278>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x40(%rax),%rsi
call   1050 <vars_remove_edge@plt>
jmp    13ad <dgol_lib_io_readbyte+0x27d>
cmpl   $0x9,-0xc(%rbp)
jle    13fa <dgol_lib_io_readbyte+0x2ca>
mov    -0x1c(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     13e1 <dgol_lib_io_readbyte+0x2b1>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x48(%rax),%rsi
call   1040 <vars_add_edge@plt>
jmp    13f5 <dgol_lib_io_readbyte+0x2c5>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x48(%rax),%rsi
call   1050 <vars_remove_edge@plt>
jmp    13fa <dgol_lib_io_readbyte+0x2ca>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dgol_lib_io_readbyte>:
push   %rbp
push   %r14
push   %rbx
mov    %rdx,%rbx
mov    %esi,%ebp
xor    %eax,%eax
call   1030 <getchar@plt>
mov    %eax,%r14d
mov    0x2e9e(%rip),%rax
cmp    (%rax),%r14d
jne    1168 <dgol_lib_io_readbyte+0x38>
cmp    $0x2,%ebp
jl     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x8(%rbx),%rsi
pop    %rbx
pop    %r14
pop    %rbp
jmp    1040 <vars_add_edge@plt>
cmp    $0x2,%ebp
jl     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x8(%rbx),%rsi
call   1050 <vars_remove_edge@plt>
cmp    $0x2,%ebp
je     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x10(%rbx),%rsi
test   $0x1,%r14b
jne    11a2 <dgol_lib_io_readbyte+0x72>
call   1050 <vars_remove_edge@plt>
cmp    $0x4,%ebp
jae    11b0 <dgol_lib_io_readbyte+0x80>
jmp    128e <dgol_lib_io_readbyte+0x15e>
call   1040 <vars_add_edge@plt>
cmp    $0x4,%ebp
jb     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x18(%rbx),%rsi
test   $0x2,%r14b
jne    11cc <dgol_lib_io_readbyte+0x9c>
call   1050 <vars_remove_edge@plt>
cmp    $0x5,%ebp
jae    11da <dgol_lib_io_readbyte+0xaa>
jmp    128e <dgol_lib_io_readbyte+0x15e>
call   1040 <vars_add_edge@plt>
cmp    $0x5,%ebp
jb     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x20(%rbx),%rsi
test   $0x4,%r14b
jne    11ee <dgol_lib_io_readbyte+0xbe>
call   1050 <vars_remove_edge@plt>
jmp    11f3 <dgol_lib_io_readbyte+0xc3>
call   1040 <vars_add_edge@plt>
cmp    $0x6,%ebp
jb     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x28(%rbx),%rsi
test   $0x8,%r14b
jne    1210 <dgol_lib_io_readbyte+0xe0>
call   1050 <vars_remove_edge@plt>
jmp    1215 <dgol_lib_io_readbyte+0xe5>
call   1040 <vars_add_edge@plt>
cmp    $0x7,%ebp
jb     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x30(%rbx),%rsi
test   $0x10,%r14b
jne    122e <dgol_lib_io_readbyte+0xfe>
call   1050 <vars_remove_edge@plt>
jmp    1233 <dgol_lib_io_readbyte+0x103>
call   1040 <vars_add_edge@plt>
cmp    $0x8,%ebp
jb     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x38(%rbx),%rsi
test   $0x20,%r14b
jne    124c <dgol_lib_io_readbyte+0x11c>
call   1050 <vars_remove_edge@plt>
jmp    1251 <dgol_lib_io_readbyte+0x121>
call   1040 <vars_add_edge@plt>
cmp    $0x9,%ebp
jb     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x40(%rbx),%rsi
test   $0x40,%r14b
jne    126a <dgol_lib_io_readbyte+0x13a>
call   1050 <vars_remove_edge@plt>
jmp    126f <dgol_lib_io_readbyte+0x13f>
call   1040 <vars_add_edge@plt>
cmp    $0xa,%ebp
jb     128e <dgol_lib_io_readbyte+0x15e>
mov    (%rbx),%rdi
mov    0x48(%rbx),%rsi
test   $0x80,%r14b
jne    115f <dgol_lib_io_readbyte+0x2f>
pop    %rbx
pop    %r14
pop    %rbp
jmp    1050 <vars_remove_edge@plt>
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
%struct.scope = type { i32 }
%struct.var = type { i32 }
@EOF = global i32 0
define void @dgol_lib_io_readbyte(%struct.scope* %0, i32 %1, %struct.var** %2) {
%4 = alloca %struct.scope*
%5 = alloca i32
%6 = alloca %struct.var**
%7 = alloca i32
store %struct.scope* %0, %struct.scope** %4
store i32 %1, i32* %5
store %struct.var** %2, %struct.var*** %6
%8 = call i32 (...) @getchar()
store i32 %8, i32* %7
%9 = load i32, i32* %7
%10 = load i32, i32* @EOF
%11 = icmp eq i32 %9, %10
br i1 %11, label %12, label %24
12: ; preds = %3
%13 = load i32, i32* %5
%14 = icmp sgt i32 %13, 1
br i1 %14, label %15, label %23
15: ; preds = %12
%16 = load %struct.var**, %struct.var*** %6
%17 = getelementptr inbounds %struct.var*, %struct.var** %16, i64 0
%18 = load %struct.var*, %struct.var** %17
%19 = load %struct.var**, %struct.var*** %6
%20 = getelementptr inbounds %struct.var*, %struct.var** %19, i64 1
%21 = load %struct.var*, %struct.var** %20
%22 = call i32 @vars_add_edge(%struct.var* %18, %struct.var* %21)
br label %23
23: ; preds = %15, %12
br label %227
24: ; preds = %3
%25 = load i32, i32* %5
%26 = icmp sgt i32 %25, 1
br i1 %26, label %27, label %35
27: ; preds = %24
%28 = load %struct.var**, %struct.var*** %6
%29 = getelementptr inbounds %struct.var*, %struct.var** %28, i64 0
%30 = load %struct.var*, %struct.var** %29
%31 = load %struct.var**, %struct.var*** %6
%32 = getelementptr inbounds %struct.var*, %struct.var** %31, i64 1
%33 = load %struct.var*, %struct.var** %32
%34 = call i32 @vars_remove_edge(%struct.var* %30, %struct.var* %33)
br label %35
35: ; preds = %27, %24
%36 = load i32, i32* %5
%37 = icmp sgt i32 %36, 2
br i1 %37, label %38, label %59
38: ; preds = %35
%39 = load i32, i32* %7
%40 = and i32 %39, 1
%41 = icmp ne i32 %40, 0
br i1 %41, label %42, label %50
42: ; preds = %38
%43 = load %struct.var**, %struct.var*** %6
%44 = getelementptr inbounds %struct.var*, %struct.var** %43, i64 0
%45 = load %struct.var*, %struct.var** %44
%46 = load %struct.var**, %struct.var*** %6
%47 = getelementptr inbounds %struct.var*, %struct.var** %46, i64 2
%48 = load %struct.var*, %struct.var** %47
%49 = call i32 @vars_add_edge(%struct.var* %45, %struct.var* %48)
br label %58
50: ; preds = %38
%51 = load %struct.var**, %struct.var*** %6
%52 = getelementptr inbounds %struct.var*, %struct.var** %51, i64 0
%53 = load %struct.var*, %struct.var** %52
%54 = load %struct.var**, %struct.var*** %6
%55 = getelementptr inbounds %struct.var*, %struct.var** %54, i64 2
%56 = load %struct.var*, %struct.var** %55
%57 = call i32 @vars_remove_edge(%struct.var* %53, %struct.var* %56)
br label %58
58: ; preds = %50, %42
br label %59
59: ; preds = %58, %35
%60 = load i32, i32* %5
%61 = icmp sgt i32 %60, 3
br i1 %61, label %62, label %83
62: ; preds = %59
%63 = load i32, i32* %7
%64 = and i32 %63, 2
%65 = icmp ne i32 %64, 0
br i1 %65, label %66, label %74
66: ; preds = %62
%67 = load %struct.var**, %struct.var*** %6
%68 = getelementptr inbounds %struct.var*, %struct.var** %67, i64 0
%69 = load %struct.var*, %struct.var** %68
%70 = load %struct.var**, %struct.var*** %6
%71 = getelementptr inbounds %struct.var*, %struct.var** %70, i64 3
%72 = load %struct.var*, %struct.var** %71
%73 = call i32 @vars_add_edge(%struct.var* %69, %struct.var* %72)
br label %82
74: ; preds = %62
%75 = load %struct.var**, %struct.var*** %6
%76 = getelementptr inbounds %struct.var*, %struct.var** %75, i64 0
%77 = load %struct.var*, %struct.var** %76
%78 = load %struct.var**, %struct.var*** %6
%79 = getelementptr inbounds %struct.var*, %struct.var** %78, i64 3
%80 = load %struct.var*, %struct.var** %79
%81 = call i32 @vars_remove_edge(%struct.var* %77, %struct.var* %80)
br label %82
82: ; preds = %74, %66
br label %83
83: ; preds = %82, %59
%84 = load i32, i32* %5
%85 = icmp sgt i32 %84, 4
br i1 %85, label %86, label %107
86: ; preds = %83
%87 = load i32, i32* %7
%88 = and i32 %87, 4
%89 = icmp ne i32 %88, 0
br i1 %89, label %90, label %98
90: ; preds = %86
%91 = load %struct.var**, %struct.var*** %6
%92 = getelementptr inbounds %struct.var*, %struct.var** %91, i64 0
%93 = load %struct.var*, %struct.var** %92
%94 = load %struct.var**, %struct.var*** %6
%95 = getelementptr inbounds %struct.var*, %struct.var** %94, i64 4
%96 = load %struct.var*, %struct.var** %95
%97 = call i32 @vars_add_edge(%struct.var* %93, %struct.var* %96)
br label %106
98: ; preds = %86
%99 = load %struct.var**, %struct.var*** %6
%100 = getelementptr inbounds %struct.var*, %struct.var** %99, i64 0
%101 = load %struct.var*, %struct.var** %100
%102 = load %struct.var**, %struct.var*** %6
%103 = getelementptr inbounds %struct.var*, %struct.var** %102, i64 4
%104 = load %struct.var*, %struct.var** %103
%105 = call i32 @vars_remove_edge(%struct.var* %101, %struct.var* %104)
br label %106
106: ; preds = %98, %90
br label %107
107: ; preds = %106, %83
%108 = load i32, i32* %5
%109 = icmp sgt i32 %108, 5
br i1 %109, label %110, label %131
110: ; preds = %107
%111 = load i32, i32* %7
%112 = and i32 %111, 8
%113 = icmp ne i32 %112, 0
br i1 %113, label %114, label %122
114: ; preds = %110
%115 = load %struct.var**, %struct.var*** %6
%116 = getelementptr inbounds %struct.var*, %struct.var** %115, i64 0
%117 = load %struct.var*, %struct.var** %116
%118 = load %struct.var**, %struct.var*** %6
%119 = getelementptr inbounds %struct.var*, %struct.var** %118, i64 5
%120 = load %struct.var*, %struct.var** %119
%121 = call i32 @vars_add_edge(%struct.var* %117, %struct.var* %120)
br label %130
122: ; preds = %110
%123 = load %struct.var**, %struct.var*** %6
%124 = getelementptr inbounds %struct.var*, %struct.var** %123, i64 0
%125 = load %struct.var*, %struct.var** %124
%126 = load %struct.var**, %struct.var*** %6
%127 = getelementptr inbounds %struct.var*, %struct.var** %126, i64 5
%128 = load %struct.var*, %struct.var** %127
%129 = call i32 @vars_remove_edge(%struct.var* %125, %struct.var* %128)
br label %130
130: ; preds = %122, %114
br label %131
131: ; preds = %130, %107
%132 = load i32, i32* %5
%133 = icmp sgt i32 %132, 6
br i1 %133, label %134, label %155
134: ; preds = %131
%135 = load i32, i32* %7
%136 = and i32 %135, 16
%137 = icmp ne i32 %136, 0
br i1 %137, label %138, label %146
138: ; preds = %134
%139 = load %struct.var**, %struct.var*** %6
%140 = getelementptr inbounds %struct.var*, %struct.var** %139, i64 0
%141 = load %struct.var*, %struct.var** %140
%142 = load %struct.var**, %struct.var*** %6
%143 = getelementptr inbounds %struct.var*, %struct.var** %142, i64 6
%144 = load %struct.var*, %struct.var** %143
%145 = call i32 @vars_add_edge(%struct.var* %141, %struct.var* %144)
br label %154
146: ; preds = %134
%147 = load %struct.var**, %struct.var*** %6
%148 = getelementptr inbounds %struct.var*, %struct.var** %147, i64 0
%149 = load %struct.var*, %struct.var** %148
%150 = load %struct.var**, %struct.var*** %6
%151 = getelementptr inbounds %struct.var*, %struct.var** %150, i64 6
%152 = load %struct.var*, %struct.var** %151
%153 = call i32 @vars_remove_edge(%struct.var* %149, %struct.var* %152)
br label %154
154: ; preds = %146, %138
br label %155
155: ; preds = %154, %131
%156 = load i32, i32* %5
%157 = icmp sgt i32 %156, 7
br i1 %157, label %158, label %179
158: ; preds = %155
%159 = load i32, i32* %7
%160 = and i32 %159, 32
%161 = icmp ne i32 %160, 0
br i1 %161, label %162, label %170
162: ; preds = %158
%163 = load %struct.var**, %struct.var*** %6
%164 = getelementptr inbounds %struct.var*, %struct.var** %163, i64 0
%165 = load %struct.var*, %struct.var** %164
%166 = load %struct.var**, %struct.var*** %6
%167 = getelementptr inbounds %struct.var*, %struct.var** %166, i64 7
%168 = load %struct.var*, %struct.var** %167
%169 = call i32 @vars_add_edge(%struct.var* %165, %struct.var* %168)
br label %178
170: ; preds = %158
%171 = load %struct.var**, %struct.var*** %6
%172 = getelementptr inbounds %struct.var*, %struct.var** %171, i64 0
%173 = load %struct.var*, %struct.var** %172
%174 = load %struct.var**, %struct.var*** %6
%175 = getelementptr inbounds %struct.var*, %struct.var** %174, i64 7
%176 = load %struct.var*, %struct.var** %175
%177 = call i32 @vars_remove_edge(%struct.var* %173, %struct.var* %176)
br label %178
178: ; preds = %170, %162
br label %179
179: ; preds = %178, %155
%180 = load i32, i32* %5
%181 = icmp sgt i32 %180, 8
br i1 %181, label %182, label %203
182: ; preds = %179
%183 = load i32, i32* %7
%184 = and i32 %183, 64
%185 = icmp ne i32 %184, 0
br i1 %185, label %186, label %194
186: ; preds = %182
%187 = load %struct.var**, %struct.var*** %6
%188 = getelementptr inbounds %struct.var*, %struct.var** %187, i64 0
%189 = load %struct.var*, %struct.var** %188
%190 = load %struct.var**, %struct.var*** %6
%191 = getelementptr inbounds %struct.var*, %struct.var** %190, i64 8
%192 = load %struct.var*, %struct.var** %191
%193 = call i32 @vars_add_edge(%struct.var* %189, %struct.var* %192)
br label %202
194: ; preds = %182
%195 = load %struct.var**, %struct.var*** %6
%196 = getelementptr inbounds %struct.var*, %struct.var** %195, i64 0
%197 = load %struct.var*, %struct.var** %196
%198 = load %struct.var**, %struct.var*** %6
%199 = getelementptr inbounds %struct.var*, %struct.var** %198, i64 8
%200 = load %struct.var*, %struct.var** %199
%201 = call i32 @vars_remove_edge(%struct.var* %197, %struct.var* %200)
br label %202
202: ; preds = %194, %186
br label %203
203: ; preds = %202, %179
%204 = load i32, i32* %5
%205 = icmp sgt i32 %204, 9
br i1 %205, label %206, label %227
206: ; preds = %203
%207 = load i32, i32* %7
%208 = and i32 %207, 128
%209 = icmp ne i32 %208, 0
br i1 %209, label %210, label %218
210: ; preds = %206
%211 = load %struct.var**, %struct.var*** %6
%212 = getelementptr inbounds %struct.var*, %struct.var** %211, i64 0
%213 = load %struct.var*, %struct.var** %212
%214 = load %struct.var**, %struct.var*** %6
%215 = getelementptr inbounds %struct.var*, %struct.var** %214, i64 9
%216 = load %struct.var*, %struct.var** %215
%217 = call i32 @vars_add_edge(%struct.var* %213, %struct.var* %216)
br label %226
218: ; preds = %206
%219 = load %struct.var**, %struct.var*** %6
%220 = getelementptr inbounds %struct.var*, %struct.var** %219, i64 0
%221 = load %struct.var*, %struct.var** %220
%222 = load %struct.var**, %struct.var*** %6
%223 = getelementptr inbounds %struct.var*, %struct.var** %222, i64 9
%224 = load %struct.var*, %struct.var** %223
%225 = call i32 @vars_remove_edge(%struct.var* %221, %struct.var* %224)
br label %226
226: ; preds = %218, %210
br label %227
227: ; preds = %23, %226, %203
ret void
}

LLVM IR (-O2):
%struct.scope = type { i32 }
%struct.var = type { i32 }
@EOF = global i32 0
define void @dgol_lib_io_readbyte(%struct.scope* nocapture readnone %0, i32 %1, %struct.var** %2) {
%4 = tail call i32 (...) @getchar()
%5 = load i32, i32* @EOF
%6 = icmp eq i32 %4, %5
%7 = icmp sgt i32 %1, 1
br i1 %6, label %8, label %14
8: ; preds = %3
br i1 %7, label %9, label %115
9: ; preds = %8
%10 = load %struct.var*, %struct.var** %2
%11 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 1
%12 = load %struct.var*, %struct.var** %11
%13 = tail call i32 @vars_add_edge(%struct.var* %10, %struct.var* %12)
br label %115
14: ; preds = %3
br i1 %7, label %15, label %115
15: ; preds = %14
%16 = load %struct.var*, %struct.var** %2
%17 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 1
%18 = load %struct.var*, %struct.var** %17
%19 = tail call i32 @vars_remove_edge(%struct.var* %16, %struct.var* %18)
%20 = icmp eq i32 %1, 2
br i1 %20, label %115, label %21
21: ; preds = %15
%22 = and i32 %4, 1
%23 = icmp eq i32 %22, 0
%24 = load %struct.var*, %struct.var** %2
%25 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 2
%26 = load %struct.var*, %struct.var** %25
br i1 %23, label %29, label %27
27: ; preds = %21
%28 = tail call i32 @vars_add_edge(%struct.var* %24, %struct.var* %26)
br label %31
29: ; preds = %21
%30 = tail call i32 @vars_remove_edge(%struct.var* %24, %struct.var* %26)
br label %31
31: ; preds = %27, %29
%32 = icmp ugt i32 %1, 3
br i1 %32, label %33, label %115
33: ; preds = %31
%34 = and i32 %4, 2
%35 = icmp eq i32 %34, 0
%36 = load %struct.var*, %struct.var** %2
%37 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 3
%38 = load %struct.var*, %struct.var** %37
br i1 %35, label %41, label %39
39: ; preds = %33
%40 = tail call i32 @vars_add_edge(%struct.var* %36, %struct.var* %38)
br label %43
41: ; preds = %33
%42 = tail call i32 @vars_remove_edge(%struct.var* %36, %struct.var* %38)
br label %43
43: ; preds = %39, %41
%44 = icmp ugt i32 %1, 4
br i1 %44, label %45, label %115
45: ; preds = %43
%46 = and i32 %4, 4
%47 = icmp eq i32 %46, 0
%48 = load %struct.var*, %struct.var** %2
%49 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 4
%50 = load %struct.var*, %struct.var** %49
br i1 %47, label %53, label %51
51: ; preds = %45
%52 = tail call i32 @vars_add_edge(%struct.var* %48, %struct.var* %50)
br label %55
53: ; preds = %45
%54 = tail call i32 @vars_remove_edge(%struct.var* %48, %struct.var* %50)
br label %55
55: ; preds = %51, %53
%56 = icmp ugt i32 %1, 5
br i1 %56, label %57, label %115
57: ; preds = %55
%58 = and i32 %4, 8
%59 = icmp eq i32 %58, 0
%60 = load %struct.var*, %struct.var** %2
%61 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 5
%62 = load %struct.var*, %struct.var** %61
br i1 %59, label %65, label %63
63: ; preds = %57
%64 = tail call i32 @vars_add_edge(%struct.var* %60, %struct.var* %62)
br label %67
65: ; preds = %57
%66 = tail call i32 @vars_remove_edge(%struct.var* %60, %struct.var* %62)
br label %67
67: ; preds = %63, %65
%68 = icmp ugt i32 %1, 6
br i1 %68, label %69, label %115
69: ; preds = %67
%70 = and i32 %4, 16
%71 = icmp eq i32 %70, 0
%72 = load %struct.var*, %struct.var** %2
%73 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 6
%74 = load %struct.var*, %struct.var** %73
br i1 %71, label %77, label %75
75: ; preds = %69
%76 = tail call i32 @vars_add_edge(%struct.var* %72, %struct.var* %74)
br label %79
77: ; preds = %69
%78 = tail call i32 @vars_remove_edge(%struct.var* %72, %struct.var* %74)
br label %79
79: ; preds = %75, %77
%80 = icmp ugt i32 %1, 7
br i1 %80, label %81, label %115
81: ; preds = %79
%82 = and i32 %4, 32
%83 = icmp eq i32 %82, 0
%84 = load %struct.var*, %struct.var** %2
%85 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 7
%86 = load %struct.var*, %struct.var** %85
br i1 %83, label %89, label %87
87: ; preds = %81
%88 = tail call i32 @vars_add_edge(%struct.var* %84, %struct.var* %86)
br label %91
89: ; preds = %81
%90 = tail call i32 @vars_remove_edge(%struct.var* %84, %struct.var* %86)
br label %91
91: ; preds = %87, %89
%92 = icmp ugt i32 %1, 8
br i1 %92, label %93, label %115
93: ; preds = %91
%94 = and i32 %4, 64
%95 = icmp eq i32 %94, 0
%96 = load %struct.var*, %struct.var** %2
%97 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 8
%98 = load %struct.var*, %struct.var** %97
br i1 %95, label %101, label %99
99: ; preds = %93
%100 = tail call i32 @vars_add_edge(%struct.var* %96, %struct.var* %98)
br label %103
101: ; preds = %93
%102 = tail call i32 @vars_remove_edge(%struct.var* %96, %struct.var* %98)
br label %103
103: ; preds = %99, %101
%104 = icmp ugt i32 %1, 9
br i1 %104, label %105, label %115
105: ; preds = %103
%106 = and i32 %4, 128
%107 = icmp eq i32 %106, 0
%108 = load %struct.var*, %struct.var** %2
%109 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 9
%110 = load %struct.var*, %struct.var** %109
br i1 %107, label %113, label %111
111: ; preds = %105
%112 = tail call i32 @vars_add_edge(%struct.var* %108, %struct.var* %110)
br label %115
113: ; preds = %105
%114 = tail call i32 @vars_remove_edge(%struct.var* %108, %struct.var* %110)
br label %115
115: ; preds = %14, %15, %31, %43, %55, %67, %79, %91, %103, %113, %111, %8, %9
ret void
}