#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*/ puts(char *);
int main() {
  int variable = 10;
  if (variable == 10) {
    puts("variable == 10");
  }
  if (variable == 20) {
    puts("variable == 20");
  }
  if (variable != 12) {
    puts("variable != 12");
  }
  if (variable != 10) {
    puts("variable != 10");
  } else {
    puts("not variable != 10");
  }
  if (variable < 20) {
    puts("variable < 20");
  }
  if (variable < 2) {
    puts("variable < 2");
  }
  if (variable <= 20) {
    puts("variable <= 20");
  }
  if (variable <= 2) {
    puts("variable <= 2");
  }
  if (variable > 20) {
    puts("variable > 20");
  }
  if (variable > 2) {
    puts("variable > 2");
  }
  if (variable >= 20) {
    puts("variable >= 20");
  }
  if (variable >= 2) {
    puts("variable >= 2");
  }
  if (2 < variable) {
    puts("2 < variable");
  }
  char *string = "Hello World!";
  puts(string);
  if (string[0] == 'H') {
    puts("string[0] == 'H'");
  }
  if ('H' == string[0]) {
    puts("'H' == string[0]");
  }
  if (string[0] == 'l') {
    puts("string[0] == 'l'");
  }
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movl   $0x0,-0x4(%rbp)
movl   $0xa,-0x8(%rbp)
cmpl   $0xa,-0x8(%rbp)
jne    113c <main+0x2c>
lea    0xec9(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0x14,-0x8(%rbp)
jne    1152 <main+0x42>
lea    0xec2(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0xc,-0x8(%rbp)
je     1168 <main+0x58>
lea    0xebb(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0xa,-0x8(%rbp)
je     1183 <main+0x73>
lea    0xeb8(%rip),%rdi
call   1030 <puts@plt>
jmp    118f <main+0x7f>
lea    0xea3(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0x14,-0x8(%rbp)
jge    11a5 <main+0x95>
lea    0xea0(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0x2,-0x8(%rbp)
jge    11bb <main+0xab>
lea    0xe98(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0x14,-0x8(%rbp)
jg     11d1 <main+0xc1>
lea    0xe8f(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0x2,-0x8(%rbp)
jg     11e7 <main+0xd7>
lea    0xe88(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0x14,-0x8(%rbp)
jle    11fd <main+0xed>
lea    0xe80(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0x2,-0x8(%rbp)
jle    1213 <main+0x103>
lea    0xe78(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0x14,-0x8(%rbp)
jl     1229 <main+0x119>
lea    0xe6f(%rip),%rdi
call   1030 <puts@plt>
cmpl   $0x2,-0x8(%rbp)
jl     123f <main+0x12f>
lea    0xe68(%rip),%rdi
call   1030 <puts@plt>
mov    $0x2,%eax
cmp    -0x8(%rbp),%eax
jge    1259 <main+0x149>
lea    0xe5c(%rip),%rdi
call   1030 <puts@plt>
lea    0xe5d(%rip),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <puts@plt>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x48,%eax
jne    1289 <main+0x179>
lea    0xe46(%rip),%rdi
call   1030 <puts@plt>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x48,%eax
cmp    %ecx,%eax
jne    12a9 <main+0x199>
lea    0xe37(%rip),%rdi
call   1030 <puts@plt>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x6c,%eax
jne    12c5 <main+0x1b5>
lea    0xe2c(%rip),%rdi
call   1030 <puts@plt>
xor    %eax,%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rax
lea    0xee8(%rip),%rdi
call   1030 <puts@plt>
lea    0xeeb(%rip),%rdi
call   1030 <puts@plt>
lea    0xeee(%rip),%rdi
call   1030 <puts@plt>
lea    0xef5(%rip),%rdi
call   1030 <puts@plt>
lea    0xef7(%rip),%rdi
call   1030 <puts@plt>
lea    0xefa(%rip),%rdi
call   1030 <puts@plt>
lea    0xefb(%rip),%rdi
call   1030 <puts@plt>
lea    0xefd(%rip),%rdi
call   1030 <puts@plt>
lea    0xefe(%rip),%rdi
call   1030 <puts@plt>
lea    0xeff(%rip),%rdi
call   1030 <puts@plt>
lea    0xf04(%rip),%rdi
call   1030 <puts@plt>
xor    %eax,%eax
pop    %rcx
ret

LLVM IR (-O0):
@.str = [15 x i8] c"variable == 10\00"
@.str.1 = [15 x i8] c"variable == 20\00"
@.str.2 = [15 x i8] c"variable != 12\00"
@.str.3 = [15 x i8] c"variable != 10\00"
@.str.4 = [19 x i8] c"not variable != 10\00"
@.str.5 = [14 x i8] c"variable < 20\00"
@.str.6 = [13 x i8] c"variable < 2\00"
@.str.7 = [15 x i8] c"variable <= 20\00"
@.str.8 = [14 x i8] c"variable <= 2\00"
@.str.9 = [14 x i8] c"variable > 20\00"
@.str.10 = [13 x i8] c"variable > 2\00"
@.str.11 = [15 x i8] c"variable >= 20\00"
@.str.12 = [14 x i8] c"variable >= 2\00"
@.str.13 = [13 x i8] c"2 < variable\00"
@.str.14 = [13 x i8] c"Hello World!\00"
@.str.15 = [17 x i8] c"string[0] == 'H'\00"
@.str.16 = [17 x i8] c"'H' == string[0]\00"
@.str.17 = [17 x i8] c"string[0] == 'l'\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca i8*
store i32 0, i32* %1
store i32 10, i32* %2
%4 = load i32, i32* %2
%5 = icmp eq i32 %4, 10
br i1 %5, label %6, label %8
6: ; preds = %0
%7 = call i32 @puts(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0))
br label %8
8: ; preds = %6, %0
%9 = load i32, i32* %2
%10 = icmp eq i32 %9, 20
br i1 %10, label %11, label %13
11: ; preds = %8
%12 = call i32 @puts(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0))
br label %13
13: ; preds = %11, %8
%14 = load i32, i32* %2
%15 = icmp ne i32 %14, 12
br i1 %15, label %16, label %18
16: ; preds = %13
%17 = call i32 @puts(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i64 0, i64 0))
br label %18
18: ; preds = %16, %13
%19 = load i32, i32* %2
%20 = icmp ne i32 %19, 10
br i1 %20, label %21, label %23
21: ; preds = %18
%22 = call i32 @puts(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0))
br label %25
23: ; preds = %18
%24 = call i32 @puts(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.4, i64 0, i64 0))
br label %25
25: ; preds = %23, %21
%26 = load i32, i32* %2
%27 = icmp slt i32 %26, 20
br i1 %27, label %28, label %30
28: ; preds = %25
%29 = call i32 @puts(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.5, i64 0, i64 0))
br label %30
30: ; preds = %28, %25
%31 = load i32, i32* %2
%32 = icmp slt i32 %31, 2
br i1 %32, label %33, label %35
33: ; preds = %30
%34 = call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i64 0, i64 0))
br label %35
35: ; preds = %33, %30
%36 = load i32, i32* %2
%37 = icmp sle i32 %36, 20
br i1 %37, label %38, label %40
38: ; preds = %35
%39 = call i32 @puts(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.7, i64 0, i64 0))
br label %40
40: ; preds = %38, %35
%41 = load i32, i32* %2
%42 = icmp sle i32 %41, 2
br i1 %42, label %43, label %45
43: ; preds = %40
%44 = call i32 @puts(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.8, i64 0, i64 0))
br label %45
45: ; preds = %43, %40
%46 = load i32, i32* %2
%47 = icmp sgt i32 %46, 20
br i1 %47, label %48, label %50
48: ; preds = %45
%49 = call i32 @puts(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.9, i64 0, i64 0))
br label %50
50: ; preds = %48, %45
%51 = load i32, i32* %2
%52 = icmp sgt i32 %51, 2
br i1 %52, label %53, label %55
53: ; preds = %50
%54 = call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.10, i64 0, i64 0))
br label %55
55: ; preds = %53, %50
%56 = load i32, i32* %2
%57 = icmp sge i32 %56, 20
br i1 %57, label %58, label %60
58: ; preds = %55
%59 = call i32 @puts(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.11, i64 0, i64 0))
br label %60
60: ; preds = %58, %55
%61 = load i32, i32* %2
%62 = icmp sge i32 %61, 2
br i1 %62, label %63, label %65
63: ; preds = %60
%64 = call i32 @puts(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.12, i64 0, i64 0))
br label %65
65: ; preds = %63, %60
%66 = load i32, i32* %2
%67 = icmp slt i32 2, %66
br i1 %67, label %68, label %70
68: ; preds = %65
%69 = call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.13, i64 0, i64 0))
br label %70
70: ; preds = %68, %65
store i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.14, i64 0, i64 0), i8** %3
%71 = load i8*, i8** %3
%72 = call i32 @puts(i8* %71)
%73 = load i8*, i8** %3
%74 = getelementptr inbounds i8, i8* %73, i64 0
%75 = load i8, i8* %74
%76 = sext i8 %75 to i32
%77 = icmp eq i32 %76, 72
br i1 %77, label %78, label %80
78: ; preds = %70
%79 = call i32 @puts(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.15, i64 0, i64 0))
br label %80
80: ; preds = %78, %70
%81 = load i8*, i8** %3
%82 = getelementptr inbounds i8, i8* %81, i64 0
%83 = load i8, i8* %82
%84 = sext i8 %83 to i32
%85 = icmp eq i32 72, %84
br i1 %85, label %86, label %88
86: ; preds = %80
%87 = call i32 @puts(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.16, i64 0, i64 0))
br label %88
88: ; preds = %86, %80
%89 = load i8*, i8** %3
%90 = getelementptr inbounds i8, i8* %89, i64 0
%91 = load i8, i8* %90
%92 = sext i8 %91 to i32
%93 = icmp eq i32 %92, 108
br i1 %93, label %94, label %96
94: ; preds = %88
%95 = call i32 @puts(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.17, i64 0, i64 0))
br label %96
96: ; preds = %94, %88
ret i32 0
}

LLVM IR (-O2):
@.str = [15 x i8] c"variable == 10\00"
@.str.2 = [15 x i8] c"variable != 12\00"
@.str.4 = [19 x i8] c"not variable != 10\00"
@.str.5 = [14 x i8] c"variable < 20\00"
@.str.7 = [15 x i8] c"variable <= 20\00"
@.str.10 = [13 x i8] c"variable > 2\00"
@.str.12 = [14 x i8] c"variable >= 2\00"
@.str.13 = [13 x i8] c"2 < variable\00"
@.str.14 = [13 x i8] c"Hello World!\00"
@.str.15 = [17 x i8] c"string[0] == 'H'\00"
@.str.16 = [17 x i8] c"'H' == string[0]\00"
define i32 @main() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0))
%2 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i64 0, i64 0))
%3 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([19 x i8], [19 x i8]* @.str.4, i64 0, i64 0))
%4 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str.5, i64 0, i64 0))
%5 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @.str.7, i64 0, i64 0))
%6 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([13 x i8], [13 x i8]* @.str.10, i64 0, i64 0))
%7 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str.12, i64 0, i64 0))
%8 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([13 x i8], [13 x i8]* @.str.13, i64 0, i64 0))
%9 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([13 x i8], [13 x i8]* @.str.14, i64 0, i64 0))
%10 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([17 x i8], [17 x i8]* @.str.15, i64 0, i64 0))
%11 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([17 x i8], [17 x i8]* @.str.16, i64 0, i64 0))
ret i32 0
}