#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 /*<<< orphan*/ putchar(int);
scalar_t__ vars_has_edge(struct var *, struct var *);
void dgol_lib_io_writebyte(struct scope *scope, int arg_count,
                           struct var **args) {
  int c = 0;
  if (arg_count > 1 && vars_has_edge(args[0], args[1])) {
    c |= 1;
  }
  if (arg_count > 2 && vars_has_edge(args[0], args[2])) {
    c |= 2;
  }
  if (arg_count > 3 && vars_has_edge(args[0], args[3])) {
    c |= 4;
  }
  if (arg_count > 4 && vars_has_edge(args[0], args[4])) {
    c |= 8;
  }
  if (arg_count > 5 && vars_has_edge(args[0], args[5])) {
    c |= 16;
  }
  if (arg_count > 6 && vars_has_edge(args[0], args[6])) {
    c |= 32;
  }
  if (arg_count > 7 && vars_has_edge(args[0], args[7])) {
    c |= 64;
  }
  if (arg_count > 8 && vars_has_edge(args[0], args[8])) {
    c |= 128;
  }
  putchar(c);
}


x86 assembly (clang, -O0):
<dgol_lib_io_writebyte>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x1,-0xc(%rbp)
jle    116b <dgol_lib_io_writebyte+0x4b>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rsi
call   1040 <vars_has_edge@plt>
cmp    $0x0,%rax
je     116b <dgol_lib_io_writebyte+0x4b>
mov    -0x1c(%rbp),%eax
or     $0x1,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x2,-0xc(%rbp)
jle    119c <dgol_lib_io_writebyte+0x7c>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%rsi
call   1040 <vars_has_edge@plt>
cmp    $0x0,%rax
je     119c <dgol_lib_io_writebyte+0x7c>
mov    -0x1c(%rbp),%eax
or     $0x2,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x3,-0xc(%rbp)
jle    11cd <dgol_lib_io_writebyte+0xad>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x18(%rax),%rsi
call   1040 <vars_has_edge@plt>
cmp    $0x0,%rax
je     11cd <dgol_lib_io_writebyte+0xad>
mov    -0x1c(%rbp),%eax
or     $0x4,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x4,-0xc(%rbp)
jle    11fe <dgol_lib_io_writebyte+0xde>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x20(%rax),%rsi
call   1040 <vars_has_edge@plt>
cmp    $0x0,%rax
je     11fe <dgol_lib_io_writebyte+0xde>
mov    -0x1c(%rbp),%eax
or     $0x8,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x5,-0xc(%rbp)
jle    122f <dgol_lib_io_writebyte+0x10f>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x28(%rax),%rsi
call   1040 <vars_has_edge@plt>
cmp    $0x0,%rax
je     122f <dgol_lib_io_writebyte+0x10f>
mov    -0x1c(%rbp),%eax
or     $0x10,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x6,-0xc(%rbp)
jle    1260 <dgol_lib_io_writebyte+0x140>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x30(%rax),%rsi
call   1040 <vars_has_edge@plt>
cmp    $0x0,%rax
je     1260 <dgol_lib_io_writebyte+0x140>
mov    -0x1c(%rbp),%eax
or     $0x20,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x7,-0xc(%rbp)
jle    1291 <dgol_lib_io_writebyte+0x171>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x38(%rax),%rsi
call   1040 <vars_has_edge@plt>
cmp    $0x0,%rax
je     1291 <dgol_lib_io_writebyte+0x171>
mov    -0x1c(%rbp),%eax
or     $0x40,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x8,-0xc(%rbp)
jle    12c4 <dgol_lib_io_writebyte+0x1a4>
mov    -0x18(%rbp),%rax
mov    (%rax),%rdi
mov    -0x18(%rbp),%rax
mov    0x40(%rax),%rsi
call   1040 <vars_has_edge@plt>
cmp    $0x0,%rax
je     12c4 <dgol_lib_io_writebyte+0x1a4>
mov    -0x1c(%rbp),%eax
or     $0x80,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%edi
call   1030 <putchar@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dgol_lib_io_writebyte>:
push   %rbp
push   %r14
push   %rbx
xor    %ebx,%ebx
cmp    $0x2,%esi
jl     120f <dgol_lib_io_writebyte+0xef>
mov    %rdx,%r14
mov    %esi,%ebp
mov    (%rdx),%rdi
mov    0x8(%rdx),%rsi
call   1040 <vars_has_edge@plt>
xor    %ebx,%ebx
test   %rax,%rax
setne  %bl
cmp    $0x2,%ebp
je     120f <dgol_lib_io_writebyte+0xef>
mov    (%r14),%rdi
mov    0x10(%r14),%rsi
call   1040 <vars_has_edge@plt>
lea    0x2(%rbx),%ecx
test   %rax,%rax
cmovne %ecx,%ebx
cmp    $0x4,%ebp
jb     120f <dgol_lib_io_writebyte+0xef>
mov    (%r14),%rdi
mov    0x18(%r14),%rsi
call   1040 <vars_has_edge@plt>
lea    0x4(%rbx),%ecx
test   %rax,%rax
cmovne %ecx,%ebx
cmp    $0x4,%ebp
je     120f <dgol_lib_io_writebyte+0xef>
mov    (%r14),%rdi
mov    0x20(%r14),%rsi
call   1040 <vars_has_edge@plt>
lea    0x8(%rbx),%ecx
test   %rax,%rax
cmovne %ecx,%ebx
cmp    $0x6,%ebp
jb     120f <dgol_lib_io_writebyte+0xef>
mov    (%r14),%rdi
mov    0x28(%r14),%rsi
call   1040 <vars_has_edge@plt>
lea    0x10(%rbx),%ecx
test   %rax,%rax
cmovne %ecx,%ebx
cmp    $0x6,%ebp
je     120f <dgol_lib_io_writebyte+0xef>
mov    (%r14),%rdi
mov    0x30(%r14),%rsi
call   1040 <vars_has_edge@plt>
lea    0x20(%rbx),%ecx
test   %rax,%rax
cmovne %ecx,%ebx
cmp    $0x8,%ebp
jb     120f <dgol_lib_io_writebyte+0xef>
mov    (%r14),%rdi
mov    0x38(%r14),%rsi
call   1040 <vars_has_edge@plt>
lea    0x40(%rbx),%ecx
test   %rax,%rax
cmovne %ecx,%ebx
cmp    $0x8,%ebp
je     120f <dgol_lib_io_writebyte+0xef>
mov    (%r14),%rdi
mov    0x40(%r14),%rsi
call   1040 <vars_has_edge@plt>
lea    0x80(%rbx),%ecx
test   %rax,%rax
cmove  %ebx,%ecx
mov    %ecx,%ebx
mov    %ebx,%edi
pop    %rbx
pop    %r14
pop    %rbp
jmp    1030 <putchar@plt>

LLVM IR (-O0):
%struct.scope = type { i32 }
%struct.var = type { i32 }
define void @dgol_lib_io_writebyte(%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
store i32 0, i32* %7
%8 = load i32, i32* %5
%9 = icmp sgt i32 %8, 1
br i1 %9, label %10, label %22
10: ; preds = %3
%11 = load %struct.var**, %struct.var*** %6
%12 = getelementptr inbounds %struct.var*, %struct.var** %11, i64 0
%13 = load %struct.var*, %struct.var** %12
%14 = load %struct.var**, %struct.var*** %6
%15 = getelementptr inbounds %struct.var*, %struct.var** %14, i64 1
%16 = load %struct.var*, %struct.var** %15
%17 = call i64 @vars_has_edge(%struct.var* %13, %struct.var* %16)
%18 = icmp ne i64 %17, 0
br i1 %18, label %19, label %22
19: ; preds = %10
%20 = load i32, i32* %7
%21 = or i32 %20, 1
store i32 %21, i32* %7
br label %22
22: ; preds = %19, %10, %3
%23 = load i32, i32* %5
%24 = icmp sgt i32 %23, 2
br i1 %24, label %25, label %37
25: ; preds = %22
%26 = load %struct.var**, %struct.var*** %6
%27 = getelementptr inbounds %struct.var*, %struct.var** %26, i64 0
%28 = load %struct.var*, %struct.var** %27
%29 = load %struct.var**, %struct.var*** %6
%30 = getelementptr inbounds %struct.var*, %struct.var** %29, i64 2
%31 = load %struct.var*, %struct.var** %30
%32 = call i64 @vars_has_edge(%struct.var* %28, %struct.var* %31)
%33 = icmp ne i64 %32, 0
br i1 %33, label %34, label %37
34: ; preds = %25
%35 = load i32, i32* %7
%36 = or i32 %35, 2
store i32 %36, i32* %7
br label %37
37: ; preds = %34, %25, %22
%38 = load i32, i32* %5
%39 = icmp sgt i32 %38, 3
br i1 %39, label %40, label %52
40: ; preds = %37
%41 = load %struct.var**, %struct.var*** %6
%42 = getelementptr inbounds %struct.var*, %struct.var** %41, i64 0
%43 = load %struct.var*, %struct.var** %42
%44 = load %struct.var**, %struct.var*** %6
%45 = getelementptr inbounds %struct.var*, %struct.var** %44, i64 3
%46 = load %struct.var*, %struct.var** %45
%47 = call i64 @vars_has_edge(%struct.var* %43, %struct.var* %46)
%48 = icmp ne i64 %47, 0
br i1 %48, label %49, label %52
49: ; preds = %40
%50 = load i32, i32* %7
%51 = or i32 %50, 4
store i32 %51, i32* %7
br label %52
52: ; preds = %49, %40, %37
%53 = load i32, i32* %5
%54 = icmp sgt i32 %53, 4
br i1 %54, label %55, label %67
55: ; preds = %52
%56 = load %struct.var**, %struct.var*** %6
%57 = getelementptr inbounds %struct.var*, %struct.var** %56, i64 0
%58 = load %struct.var*, %struct.var** %57
%59 = load %struct.var**, %struct.var*** %6
%60 = getelementptr inbounds %struct.var*, %struct.var** %59, i64 4
%61 = load %struct.var*, %struct.var** %60
%62 = call i64 @vars_has_edge(%struct.var* %58, %struct.var* %61)
%63 = icmp ne i64 %62, 0
br i1 %63, label %64, label %67
64: ; preds = %55
%65 = load i32, i32* %7
%66 = or i32 %65, 8
store i32 %66, i32* %7
br label %67
67: ; preds = %64, %55, %52
%68 = load i32, i32* %5
%69 = icmp sgt i32 %68, 5
br i1 %69, label %70, label %82
70: ; preds = %67
%71 = load %struct.var**, %struct.var*** %6
%72 = getelementptr inbounds %struct.var*, %struct.var** %71, i64 0
%73 = load %struct.var*, %struct.var** %72
%74 = load %struct.var**, %struct.var*** %6
%75 = getelementptr inbounds %struct.var*, %struct.var** %74, i64 5
%76 = load %struct.var*, %struct.var** %75
%77 = call i64 @vars_has_edge(%struct.var* %73, %struct.var* %76)
%78 = icmp ne i64 %77, 0
br i1 %78, label %79, label %82
79: ; preds = %70
%80 = load i32, i32* %7
%81 = or i32 %80, 16
store i32 %81, i32* %7
br label %82
82: ; preds = %79, %70, %67
%83 = load i32, i32* %5
%84 = icmp sgt i32 %83, 6
br i1 %84, label %85, label %97
85: ; preds = %82
%86 = load %struct.var**, %struct.var*** %6
%87 = getelementptr inbounds %struct.var*, %struct.var** %86, i64 0
%88 = load %struct.var*, %struct.var** %87
%89 = load %struct.var**, %struct.var*** %6
%90 = getelementptr inbounds %struct.var*, %struct.var** %89, i64 6
%91 = load %struct.var*, %struct.var** %90
%92 = call i64 @vars_has_edge(%struct.var* %88, %struct.var* %91)
%93 = icmp ne i64 %92, 0
br i1 %93, label %94, label %97
94: ; preds = %85
%95 = load i32, i32* %7
%96 = or i32 %95, 32
store i32 %96, i32* %7
br label %97
97: ; preds = %94, %85, %82
%98 = load i32, i32* %5
%99 = icmp sgt i32 %98, 7
br i1 %99, label %100, label %112
100: ; preds = %97
%101 = load %struct.var**, %struct.var*** %6
%102 = getelementptr inbounds %struct.var*, %struct.var** %101, i64 0
%103 = load %struct.var*, %struct.var** %102
%104 = load %struct.var**, %struct.var*** %6
%105 = getelementptr inbounds %struct.var*, %struct.var** %104, i64 7
%106 = load %struct.var*, %struct.var** %105
%107 = call i64 @vars_has_edge(%struct.var* %103, %struct.var* %106)
%108 = icmp ne i64 %107, 0
br i1 %108, label %109, label %112
109: ; preds = %100
%110 = load i32, i32* %7
%111 = or i32 %110, 64
store i32 %111, i32* %7
br label %112
112: ; preds = %109, %100, %97
%113 = load i32, i32* %5
%114 = icmp sgt i32 %113, 8
br i1 %114, label %115, label %127
115: ; preds = %112
%116 = load %struct.var**, %struct.var*** %6
%117 = getelementptr inbounds %struct.var*, %struct.var** %116, i64 0
%118 = load %struct.var*, %struct.var** %117
%119 = load %struct.var**, %struct.var*** %6
%120 = getelementptr inbounds %struct.var*, %struct.var** %119, i64 8
%121 = load %struct.var*, %struct.var** %120
%122 = call i64 @vars_has_edge(%struct.var* %118, %struct.var* %121)
%123 = icmp ne i64 %122, 0
br i1 %123, label %124, label %127
124: ; preds = %115
%125 = load i32, i32* %7
%126 = or i32 %125, 128
store i32 %126, i32* %7
br label %127
127: ; preds = %124, %115, %112
%128 = load i32, i32* %7
%129 = call i32 @putchar(i32 %128)
ret void
}

LLVM IR (-O2):
%struct.scope = type { i32 }
%struct.var = type { i32 }
define void @dgol_lib_io_writebyte(%struct.scope* nocapture readnone %0, i32 %1, %struct.var** nocapture %2) {
%4 = icmp sgt i32 %1, 1
br i1 %4, label %5, label %75
5: ; preds = %3
%6 = load %struct.var*, %struct.var** %2
%7 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 1
%8 = load %struct.var*, %struct.var** %7
%9 = tail call i64 @vars_has_edge(%struct.var* %6, %struct.var* %8)
%10 = icmp ne i64 %9, 0
%11 = zext i1 %10 to i32
%12 = icmp eq i32 %1, 2
br i1 %12, label %75, label %13
13: ; preds = %5
%14 = load %struct.var*, %struct.var** %2
%15 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 2
%16 = load %struct.var*, %struct.var** %15
%17 = tail call i64 @vars_has_edge(%struct.var* %14, %struct.var* %16)
%18 = icmp eq i64 %17, 0
%19 = or i32 %11, 2
%20 = select i1 %18, i32 %11, i32 %19
%21 = icmp ugt i32 %1, 3
br i1 %21, label %22, label %75
22: ; preds = %13
%23 = load %struct.var*, %struct.var** %2
%24 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 3
%25 = load %struct.var*, %struct.var** %24
%26 = tail call i64 @vars_has_edge(%struct.var* %23, %struct.var* %25)
%27 = icmp eq i64 %26, 0
%28 = or i32 %20, 4
%29 = select i1 %27, i32 %20, i32 %28
%30 = icmp eq i32 %1, 4
br i1 %30, label %75, label %31
31: ; preds = %22
%32 = load %struct.var*, %struct.var** %2
%33 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 4
%34 = load %struct.var*, %struct.var** %33
%35 = tail call i64 @vars_has_edge(%struct.var* %32, %struct.var* %34)
%36 = icmp eq i64 %35, 0
%37 = or i32 %29, 8
%38 = select i1 %36, i32 %29, i32 %37
%39 = icmp ugt i32 %1, 5
br i1 %39, label %40, label %75
40: ; preds = %31
%41 = load %struct.var*, %struct.var** %2
%42 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 5
%43 = load %struct.var*, %struct.var** %42
%44 = tail call i64 @vars_has_edge(%struct.var* %41, %struct.var* %43)
%45 = icmp eq i64 %44, 0
%46 = or i32 %38, 16
%47 = select i1 %45, i32 %38, i32 %46
%48 = icmp eq i32 %1, 6
br i1 %48, label %75, label %49
49: ; preds = %40
%50 = load %struct.var*, %struct.var** %2
%51 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 6
%52 = load %struct.var*, %struct.var** %51
%53 = tail call i64 @vars_has_edge(%struct.var* %50, %struct.var* %52)
%54 = icmp eq i64 %53, 0
%55 = or i32 %47, 32
%56 = select i1 %54, i32 %47, i32 %55
%57 = icmp ugt i32 %1, 7
br i1 %57, label %58, label %75
58: ; preds = %49
%59 = load %struct.var*, %struct.var** %2
%60 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 7
%61 = load %struct.var*, %struct.var** %60
%62 = tail call i64 @vars_has_edge(%struct.var* %59, %struct.var* %61)
%63 = icmp eq i64 %62, 0
%64 = or i32 %56, 64
%65 = select i1 %63, i32 %56, i32 %64
%66 = icmp eq i32 %1, 8
br i1 %66, label %75, label %67
67: ; preds = %58
%68 = load %struct.var*, %struct.var** %2
%69 = getelementptr inbounds %struct.var*, %struct.var** %2, i64 8
%70 = load %struct.var*, %struct.var** %69
%71 = tail call i64 @vars_has_edge(%struct.var* %68, %struct.var* %70)
%72 = icmp eq i64 %71, 0
%73 = or i32 %65, 128
%74 = select i1 %72, i32 %65, i32 %73
br label %75
75: ; preds = %3, %5, %13, %22, %31, %40, %49, %67, %58
%76 = phi i32 [ %65, %58 ], [ %74, %67 ], [ %56, %49 ], [ %47, %40 ], [ %38, %31 ], [ %29, %22 ], [ %20, %13 ], [ %11, %5 ], [ 0, %3 ]
%77 = tail call i32 @putchar(i32 %76)
ret void
}