#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*/ DoAlias();
int /*<<< orphan*/ DoAllot();
int /*<<< orphan*/ DoCode();
int /*<<< orphan*/ DoColonDefinition();
int /*<<< orphan*/ DoCompOnly();
int /*<<< orphan*/ DoConst();
int /*<<< orphan*/ DoDefer();
int /*<<< orphan*/ DoImmediate();
int /*<<< orphan*/ DoNoname();
int /*<<< orphan*/ DoRefers();
int /*<<< orphan*/ DoStore();
int /*<<< orphan*/ DoUser();
int /*<<< orphan*/ DoVariable();
int /*<<< orphan*/ LineTerminate(char *);
scalar_t__ strcmp(char *, char *);
void DoCommand(char *command) {
  if (strcmp(command, "_:") == 0)
    DoColonDefinition();
  else if (strcmp(command, "_:NONAME") == 0)
    DoNoname();
  else if (strcmp(command, "_CODE") == 0)
    DoCode();
  else if (strcmp(command, "_CONST") == 0)
    DoConst();
  else if (strcmp(command, "_VARIABLE") == 0)
    DoVariable();
  else if (strcmp(command, "_USER") == 0)
    DoUser();
  else if (strcmp(command, "_ALIAS") == 0)
    DoAlias();
  else if (strcmp(command, "_DEFER") == 0)
    DoDefer();
  else if (strcmp(command, "_REFERS") == 0)
    DoRefers();
  else if (strcmp(command, "_IMMEDIATE") == 0)
    DoImmediate();
  else if (strcmp(command, "_COMPILE-ONLY") == 0)
    DoCompOnly();
  else if (strcmp(command, "_STORE") == 0)
    DoStore();
  else if (strcmp(command, "_ALLOT") == 0)
    DoAllot();
  else
    LineTerminate("Unrecognized metacompiler command");
}


x86 assembly (clang, -O0):
<DoCommand>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rdi
lea    0xdf9(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    1222 <DoCommand+0x32>
mov    $0x0,%al
call   10e0 <DoColonDefinition@plt>
jmp    1432 <DoCommand+0x242>
mov    -0x8(%rbp),%rdi
lea    0xdd6(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    1248 <DoCommand+0x58>
mov    $0x0,%al
call   1030 <DoNoname@plt>
jmp    142d <DoCommand+0x23d>
mov    -0x8(%rbp),%rdi
lea    0xdb9(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    126e <DoCommand+0x7e>
mov    $0x0,%al
call   1090 <DoCode@plt>
jmp    1428 <DoCommand+0x238>
mov    -0x8(%rbp),%rdi
lea    0xd99(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    1294 <DoCommand+0xa4>
mov    $0x0,%al
call   10f0 <DoConst@plt>
jmp    1423 <DoCommand+0x233>
mov    -0x8(%rbp),%rdi
lea    0xd7a(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    12ba <DoCommand+0xca>
mov    $0x0,%al
call   10b0 <DoVariable@plt>
jmp    141e <DoCommand+0x22e>
mov    -0x8(%rbp),%rdi
lea    0xd5e(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    12e0 <DoCommand+0xf0>
mov    $0x0,%al
call   10c0 <DoUser@plt>
jmp    1419 <DoCommand+0x229>
mov    -0x8(%rbp),%rdi
lea    0xd3e(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    1306 <DoCommand+0x116>
mov    $0x0,%al
call   1050 <DoAlias@plt>
jmp    1414 <DoCommand+0x224>
mov    -0x8(%rbp),%rdi
lea    0xd1f(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    132c <DoCommand+0x13c>
mov    $0x0,%al
call   10a0 <DoDefer@plt>
jmp    140f <DoCommand+0x21f>
mov    -0x8(%rbp),%rdi
lea    0xd00(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    1352 <DoCommand+0x162>
mov    $0x0,%al
call   1100 <DoRefers@plt>
jmp    140a <DoCommand+0x21a>
mov    -0x8(%rbp),%rdi
lea    0xce2(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    1378 <DoCommand+0x188>
mov    $0x0,%al
call   1040 <DoImmediate@plt>
jmp    1405 <DoCommand+0x215>
mov    -0x8(%rbp),%rdi
lea    0xcc7(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    139e <DoCommand+0x1ae>
mov    $0x0,%al
call   1110 <DoCompOnly@plt>
jmp    1400 <DoCommand+0x210>
mov    -0x8(%rbp),%rdi
lea    0xcaf(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    13c4 <DoCommand+0x1d4>
mov    $0x0,%al
call   1080 <DoStore@plt>
jmp    13fb <DoCommand+0x20b>
mov    -0x8(%rbp),%rdi
lea    0xc90(%rip),%rsi
call   10d0 <strcmp@plt>
cmp    $0x0,%rax
jne    13ea <DoCommand+0x1fa>
mov    $0x0,%al
call   1060 <DoAllot@plt>
jmp    13f6 <DoCommand+0x206>
lea    0xc75(%rip),%rdi
call   1070 <LineTerminate@plt>
jmp    13fb <DoCommand+0x20b>
jmp    1400 <DoCommand+0x210>
jmp    1405 <DoCommand+0x215>
jmp    140a <DoCommand+0x21a>
jmp    140f <DoCommand+0x21f>
jmp    1414 <DoCommand+0x224>
jmp    1419 <DoCommand+0x229>
jmp    141e <DoCommand+0x22e>
jmp    1423 <DoCommand+0x233>
jmp    1428 <DoCommand+0x238>
jmp    142d <DoCommand+0x23d>
jmp    1432 <DoCommand+0x242>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<DoCommand>:
push   %rbx
mov    %rdi,%rbx
lea    0xe05(%rip),%rsi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     132e <DoCommand+0x13e>
lea    0xdf3(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     1336 <DoCommand+0x146>
lea    0xde4(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     133e <DoCommand+0x14e>
lea    0xdd2(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     1346 <DoCommand+0x156>
lea    0xdc1(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     134e <DoCommand+0x15e>
lea    0xdb3(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     1356 <DoCommand+0x166>
lea    0xda1(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     135e <DoCommand+0x16e>
lea    0xd90(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     1366 <DoCommand+0x176>
lea    0xd7f(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     136e <DoCommand+0x17e>
lea    0xd6f(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     1376 <DoCommand+0x186>
lea    0xd62(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     137e <DoCommand+0x18e>
lea    0xd58(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     1386 <DoCommand+0x196>
lea    0xd4b(%rip),%rsi
mov    %rbx,%rdi
call   10d0 <strcmp@plt>
test   %rax,%rax
je     138e <DoCommand+0x19e>
lea    0xd3e(%rip),%rdi
pop    %rbx
jmp    1070 <LineTerminate@plt>
xor    %eax,%eax
pop    %rbx
jmp    10e0 <DoColonDefinition@plt>
xor    %eax,%eax
pop    %rbx
jmp    1030 <DoNoname@plt>
xor    %eax,%eax
pop    %rbx
jmp    1090 <DoCode@plt>
xor    %eax,%eax
pop    %rbx
jmp    10f0 <DoConst@plt>
xor    %eax,%eax
pop    %rbx
jmp    10b0 <DoVariable@plt>
xor    %eax,%eax
pop    %rbx
jmp    10c0 <DoUser@plt>
xor    %eax,%eax
pop    %rbx
jmp    1050 <DoAlias@plt>
xor    %eax,%eax
pop    %rbx
jmp    10a0 <DoDefer@plt>
xor    %eax,%eax
pop    %rbx
jmp    1100 <DoRefers@plt>
xor    %eax,%eax
pop    %rbx
jmp    1040 <DoImmediate@plt>
xor    %eax,%eax
pop    %rbx
jmp    1110 <DoCompOnly@plt>
xor    %eax,%eax
pop    %rbx
jmp    1080 <DoStore@plt>
xor    %eax,%eax
pop    %rbx
jmp    1060 <DoAllot@plt>

LLVM IR (-O0):
@.str = [3 x i8] c"_:\00"
@.str.1 = [9 x i8] c"_:NONAME\00"
@.str.2 = [6 x i8] c"_CODE\00"
@.str.3 = [7 x i8] c"_CONST\00"
@.str.4 = [10 x i8] c"_VARIABLE\00"
@.str.5 = [6 x i8] c"_USER\00"
@.str.6 = [7 x i8] c"_ALIAS\00"
@.str.7 = [7 x i8] c"_DEFER\00"
@.str.8 = [8 x i8] c"_REFERS\00"
@.str.9 = [11 x i8] c"_IMMEDIATE\00"
@.str.10 = [14 x i8] c"_COMPILE-ONLY\00"
@.str.11 = [7 x i8] c"_STORE\00"
@.str.12 = [7 x i8] c"_ALLOT\00"
@.str.13 = [34 x i8] c"Unrecognized metacompiler command\00"
define void @DoCommand(i8* %0) {
%2 = alloca i8*
store i8* %0, i8** %2
%3 = load i8*, i8** %2
%4 = call i64 @strcmp(i8* %3, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0))
%5 = icmp eq i64 %4, 0
br i1 %5, label %6, label %8
6: ; preds = %1
%7 = call i32 (...) @DoColonDefinition()
br label %94
8: ; preds = %1
%9 = load i8*, i8** %2
%10 = call i64 @strcmp(i8* %9, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i64 0, i64 0))
%11 = icmp eq i64 %10, 0
br i1 %11, label %12, label %14
12: ; preds = %8
%13 = call i32 (...) @DoNoname()
br label %93
14: ; preds = %8
%15 = load i8*, i8** %2
%16 = call i64 @strcmp(i8* %15, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i64 0, i64 0))
%17 = icmp eq i64 %16, 0
br i1 %17, label %18, label %20
18: ; preds = %14
%19 = call i32 (...) @DoCode()
br label %92
20: ; preds = %14
%21 = load i8*, i8** %2
%22 = call i64 @strcmp(i8* %21, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.3, i64 0, i64 0))
%23 = icmp eq i64 %22, 0
br i1 %23, label %24, label %26
24: ; preds = %20
%25 = call i32 (...) @DoConst()
br label %91
26: ; preds = %20
%27 = load i8*, i8** %2
%28 = call i64 @strcmp(i8* %27, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.4, i64 0, i64 0))
%29 = icmp eq i64 %28, 0
br i1 %29, label %30, label %32
30: ; preds = %26
%31 = call i32 (...) @DoVariable()
br label %90
32: ; preds = %26
%33 = load i8*, i8** %2
%34 = call i64 @strcmp(i8* %33, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.5, i64 0, i64 0))
%35 = icmp eq i64 %34, 0
br i1 %35, label %36, label %38
36: ; preds = %32
%37 = call i32 (...) @DoUser()
br label %89
38: ; preds = %32
%39 = load i8*, i8** %2
%40 = call i64 @strcmp(i8* %39, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.6, i64 0, i64 0))
%41 = icmp eq i64 %40, 0
br i1 %41, label %42, label %44
42: ; preds = %38
%43 = call i32 (...) @DoAlias()
br label %88
44: ; preds = %38
%45 = load i8*, i8** %2
%46 = call i64 @strcmp(i8* %45, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.7, i64 0, i64 0))
%47 = icmp eq i64 %46, 0
br i1 %47, label %48, label %50
48: ; preds = %44
%49 = call i32 (...) @DoDefer()
br label %87
50: ; preds = %44
%51 = load i8*, i8** %2
%52 = call i64 @strcmp(i8* %51, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i64 0, i64 0))
%53 = icmp eq i64 %52, 0
br i1 %53, label %54, label %56
54: ; preds = %50
%55 = call i32 (...) @DoRefers()
br label %86
56: ; preds = %50
%57 = load i8*, i8** %2
%58 = call i64 @strcmp(i8* %57, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.9, i64 0, i64 0))
%59 = icmp eq i64 %58, 0
br i1 %59, label %60, label %62
60: ; preds = %56
%61 = call i32 (...) @DoImmediate()
br label %85
62: ; preds = %56
%63 = load i8*, i8** %2
%64 = call i64 @strcmp(i8* %63, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.10, i64 0, i64 0))
%65 = icmp eq i64 %64, 0
br i1 %65, label %66, label %68
66: ; preds = %62
%67 = call i32 (...) @DoCompOnly()
br label %84
68: ; preds = %62
%69 = load i8*, i8** %2
%70 = call i64 @strcmp(i8* %69, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.11, i64 0, i64 0))
%71 = icmp eq i64 %70, 0
br i1 %71, label %72, label %74
72: ; preds = %68
%73 = call i32 (...) @DoStore()
br label %83
74: ; preds = %68
%75 = load i8*, i8** %2
%76 = call i64 @strcmp(i8* %75, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.12, i64 0, i64 0))
%77 = icmp eq i64 %76, 0
br i1 %77, label %78, label %80
78: ; preds = %74
%79 = call i32 (...) @DoAllot()
br label %82
80: ; preds = %74
%81 = call i32 @LineTerminate(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.13, i64 0, i64 0))
br label %82
82: ; preds = %80, %78
br label %83
83: ; preds = %82, %72
br label %84
84: ; preds = %83, %66
br label %85
85: ; preds = %84, %60
br label %86
86: ; preds = %85, %54
br label %87
87: ; preds = %86, %48
br label %88
88: ; preds = %87, %42
br label %89
89: ; preds = %88, %36
br label %90
90: ; preds = %89, %30
br label %91
91: ; preds = %90, %24
br label %92
92: ; preds = %91, %18
br label %93
93: ; preds = %92, %12
br label %94
94: ; preds = %93, %6
ret void
}

LLVM IR (-O2):
@.str = [3 x i8] c"_:\00"
@.str.1 = [9 x i8] c"_:NONAME\00"
@.str.2 = [6 x i8] c"_CODE\00"
@.str.3 = [7 x i8] c"_CONST\00"
@.str.4 = [10 x i8] c"_VARIABLE\00"
@.str.5 = [6 x i8] c"_USER\00"
@.str.6 = [7 x i8] c"_ALIAS\00"
@.str.7 = [7 x i8] c"_DEFER\00"
@.str.8 = [8 x i8] c"_REFERS\00"
@.str.9 = [11 x i8] c"_IMMEDIATE\00"
@.str.10 = [14 x i8] c"_COMPILE-ONLY\00"
@.str.11 = [7 x i8] c"_STORE\00"
@.str.12 = [7 x i8] c"_ALLOT\00"
@.str.13 = [34 x i8] c"Unrecognized metacompiler command\00"
define void @DoCommand(i8* %0) {
%2 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0))
%3 = icmp eq i64 %2, 0
br i1 %3, label %4, label %6
4: ; preds = %1
%5 = tail call i32 (...) @DoColonDefinition()
br label %68
6: ; preds = %1
%7 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i64 0, i64 0))
%8 = icmp eq i64 %7, 0
br i1 %8, label %9, label %11
9: ; preds = %6
%10 = tail call i32 (...) @DoNoname()
br label %68
11: ; preds = %6
%12 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i64 0, i64 0))
%13 = icmp eq i64 %12, 0
br i1 %13, label %14, label %16
14: ; preds = %11
%15 = tail call i32 (...) @DoCode()
br label %68
16: ; preds = %11
%17 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.3, i64 0, i64 0))
%18 = icmp eq i64 %17, 0
br i1 %18, label %19, label %21
19: ; preds = %16
%20 = tail call i32 (...) @DoConst()
br label %68
21: ; preds = %16
%22 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.4, i64 0, i64 0))
%23 = icmp eq i64 %22, 0
br i1 %23, label %24, label %26
24: ; preds = %21
%25 = tail call i32 (...) @DoVariable()
br label %68
26: ; preds = %21
%27 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.5, i64 0, i64 0))
%28 = icmp eq i64 %27, 0
br i1 %28, label %29, label %31
29: ; preds = %26
%30 = tail call i32 (...) @DoUser()
br label %68
31: ; preds = %26
%32 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.6, i64 0, i64 0))
%33 = icmp eq i64 %32, 0
br i1 %33, label %34, label %36
34: ; preds = %31
%35 = tail call i32 (...) @DoAlias()
br label %68
36: ; preds = %31
%37 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.7, i64 0, i64 0))
%38 = icmp eq i64 %37, 0
br i1 %38, label %39, label %41
39: ; preds = %36
%40 = tail call i32 (...) @DoDefer()
br label %68
41: ; preds = %36
%42 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i64 0, i64 0))
%43 = icmp eq i64 %42, 0
br i1 %43, label %44, label %46
44: ; preds = %41
%45 = tail call i32 (...) @DoRefers()
br label %68
46: ; preds = %41
%47 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.9, i64 0, i64 0))
%48 = icmp eq i64 %47, 0
br i1 %48, label %49, label %51
49: ; preds = %46
%50 = tail call i32 (...) @DoImmediate()
br label %68
51: ; preds = %46
%52 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.10, i64 0, i64 0))
%53 = icmp eq i64 %52, 0
br i1 %53, label %54, label %56
54: ; preds = %51
%55 = tail call i32 (...) @DoCompOnly()
br label %68
56: ; preds = %51
%57 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.11, i64 0, i64 0))
%58 = icmp eq i64 %57, 0
br i1 %58, label %59, label %61
59: ; preds = %56
%60 = tail call i32 (...) @DoStore()
br label %68
61: ; preds = %56
%62 = tail call i64 @strcmp(i8* %0, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.12, i64 0, i64 0))
%63 = icmp eq i64 %62, 0
br i1 %63, label %64, label %66
64: ; preds = %61
%65 = tail call i32 (...) @DoAllot()
br label %68
66: ; preds = %61
%67 = tail call i32 @LineTerminate(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.13, i64 0, i64 0))
br label %68
68: ; preds = %9, %19, %29, %39, %49, %59, %66, %64, %54, %44, %34, %24, %14, %4
ret void
}