#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*/ assignment_expr();
int /*<<< orphan*/ cond_statement();
int /*<<< orphan*/ expr();
int /*<<< orphan*/ get_lexval();
int /*<<< orphan*/ gotofunc();
int /*<<< orphan*/ labeltoken();
int /*<<< orphan*/ loop_stmt();
int /*<<< orphan*/ method_call_expr();
int /*<<< orphan*/ type();
int yyselect();
statement_expr() {
  switch (yyselect()) {
  case 98: {
    assignment_expr();
    get_lexval();
  } break;
  case 99: {
    cond_statement();
  } break;
  case 100: {
    loop_stmt();
  } break;
  case 101: {
    method_call_expr();
    get_lexval();
  } break;
  case 102: {
    get_lexval();
    switch (yyselect()) {
    case 123: {
      expr();
    } break;
    default:;
    }
    get_lexval();
  } break;
  case 103: {
    gotofunc();
    get_lexval();
  } break;
  case 104: {
    labeltoken();
  } break;
  case 105: {
    get_lexval();
    get_lexval();
  } break;
  case 106: {
    get_lexval();
    get_lexval();
  } break;
  case 107: {
    get_lexval();
    get_lexval();
    type();
    get_lexval();
    get_lexval();
  } break;
  }
}


x86 assembly (clang, -O0):
<statement_expr>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
xor    %eax,%eax
call   1070 <yyselect@plt>
add    $0xffffff9e,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0x9,%eax
ja     12b8 <statement_expr+0x118>
mov    -0x10(%rbp),%rax
lea    0xe34(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    $0x0,%al
call   1060 <assignment_expr@plt>
mov    $0x0,%al
call   1080 <get_lexval@plt>
jmp    12b8 <statement_expr+0x118>
mov    $0x0,%al
call   10c0 <cond_statement@plt>
jmp    12b8 <statement_expr+0x118>
mov    $0x0,%al
call   10a0 <loop_stmt@plt>
jmp    12b8 <statement_expr+0x118>
mov    $0x0,%al
call   1040 <method_call_expr@plt>
mov    $0x0,%al
call   1080 <get_lexval@plt>
jmp    12b8 <statement_expr+0x118>
xor    %eax,%eax
mov    %al,-0x11(%rbp)
call   1080 <get_lexval@plt>
mov    -0x11(%rbp),%al
call   1070 <yyselect@plt>
sub    $0x7b,%eax
jne    123f <statement_expr+0x9f>
jmp    1233 <statement_expr+0x93>
mov    $0x0,%al
call   1090 <expr@plt>
jmp    1244 <statement_expr+0xa4>
jmp    1244 <statement_expr+0xa4>
mov    $0x0,%al
call   1080 <get_lexval@plt>
jmp    12b8 <statement_expr+0x118>
mov    $0x0,%al
call   1030 <gotofunc@plt>
mov    $0x0,%al
call   1080 <get_lexval@plt>
jmp    12b8 <statement_expr+0x118>
mov    $0x0,%al
call   10b0 <labeltoken@plt>
jmp    12b8 <statement_expr+0x118>
mov    $0x0,%al
call   1080 <get_lexval@plt>
mov    $0x0,%al
call   1080 <get_lexval@plt>
jmp    12b8 <statement_expr+0x118>
mov    $0x0,%al
call   1080 <get_lexval@plt>
mov    $0x0,%al
call   1080 <get_lexval@plt>
jmp    12b8 <statement_expr+0x118>
mov    $0x0,%al
call   1080 <get_lexval@plt>
mov    $0x0,%al
call   1080 <get_lexval@plt>
mov    $0x0,%al
call   1050 <type@plt>
mov    $0x0,%al
call   1080 <get_lexval@plt>
mov    $0x0,%al
call   1080 <get_lexval@plt>
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<statement_expr>:
push   %rax
xor    %eax,%eax
call   1070 <yyselect@plt>
add    $0xffffff9e,%eax
cmp    $0x9,%eax
ja     1239 <statement_expr+0x99>
lea    0xe45(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
xor    %eax,%eax
call   1060 <assignment_expr@plt>
jmp    1232 <statement_expr+0x92>
xor    %eax,%eax
call   1080 <get_lexval@plt>
xor    %eax,%eax
call   1070 <yyselect@plt>
cmp    $0x7b,%eax
jne    1232 <statement_expr+0x92>
xor    %eax,%eax
call   1090 <expr@plt>
jmp    1232 <statement_expr+0x92>
xor    %eax,%eax
call   10c0 <cond_statement@plt>
pop    %rcx
ret
xor    %eax,%eax
call   10a0 <loop_stmt@plt>
pop    %rcx
ret
xor    %eax,%eax
call   1040 <method_call_expr@plt>
jmp    1232 <statement_expr+0x92>
xor    %eax,%eax
call   1030 <gotofunc@plt>
jmp    1232 <statement_expr+0x92>
xor    %eax,%eax
call   10b0 <labeltoken@plt>
pop    %rcx
ret
xor    %eax,%eax
call   1080 <get_lexval@plt>
xor    %eax,%eax
call   1080 <get_lexval@plt>
xor    %eax,%eax
call   1050 <type@plt>
xor    %eax,%eax
call   1080 <get_lexval@plt>
xor    %eax,%eax
call   1080 <get_lexval@plt>
pop    %rcx
ret

LLVM IR (-O0):
define i32 @statement_expr() {
%1 = alloca i32
%2 = call i32 (...) @yyselect()
switch i32 %2, label %38 [
i32 98, label %3
i32 99, label %6
i32 100, label %8
i32 101, label %10
i32 102, label %13
i32 103, label %21
i32 104, label %24
i32 105, label %26
i32 106, label %29
i32 107, label %32
]
3: ; preds = %0
%4 = call i32 (...) @assignment_expr()
%5 = call i32 (...) @get_lexval()
br label %38
6: ; preds = %0
%7 = call i32 (...) @cond_statement()
br label %38
8: ; preds = %0
%9 = call i32 (...) @loop_stmt()
br label %38
10: ; preds = %0
%11 = call i32 (...) @method_call_expr()
%12 = call i32 (...) @get_lexval()
br label %38
13: ; preds = %0
%14 = call i32 (...) @get_lexval()
%15 = call i32 (...) @yyselect()
switch i32 %15, label %18 [
i32 123, label %16
]
16: ; preds = %13
%17 = call i32 (...) @expr()
br label %19
18: ; preds = %13
br label %19
19: ; preds = %18, %16
%20 = call i32 (...) @get_lexval()
br label %38
21: ; preds = %0
%22 = call i32 (...) @gotofunc()
%23 = call i32 (...) @get_lexval()
br label %38
24: ; preds = %0
%25 = call i32 (...) @labeltoken()
br label %38
26: ; preds = %0
%27 = call i32 (...) @get_lexval()
%28 = call i32 (...) @get_lexval()
br label %38
29: ; preds = %0
%30 = call i32 (...) @get_lexval()
%31 = call i32 (...) @get_lexval()
br label %38
32: ; preds = %0
%33 = call i32 (...) @get_lexval()
%34 = call i32 (...) @get_lexval()
%35 = call i32 (...) @type()
%36 = call i32 (...) @get_lexval()
%37 = call i32 (...) @get_lexval()
br label %38
38: ; preds = %0, %32, %29, %26, %24, %21, %19, %10, %8, %6, %3
%39 = load i32, i32* %1
ret i32 %39
}

LLVM IR (-O2):
define i32 @statement_expr() {
%1 = tail call i32 (...) @yyselect()
switch i32 %1, label %37 [
i32 98, label %2
i32 99, label %5
i32 100, label %7
i32 101, label %9
i32 102, label %12
i32 103, label %20
i32 104, label %23
i32 105, label %25
i32 106, label %28
i32 107, label %31
]
2: ; preds = %0
%3 = tail call i32 (...) @assignment_expr()
%4 = tail call i32 (...) @get_lexval()
br label %37
5: ; preds = %0
%6 = tail call i32 (...) @cond_statement()
br label %37
7: ; preds = %0
%8 = tail call i32 (...) @loop_stmt()
br label %37
9: ; preds = %0
%10 = tail call i32 (...) @method_call_expr()
%11 = tail call i32 (...) @get_lexval()
br label %37
12: ; preds = %0
%13 = tail call i32 (...) @get_lexval()
%14 = tail call i32 (...) @yyselect()
%15 = icmp eq i32 %14, 123
br i1 %15, label %16, label %18
16: ; preds = %12
%17 = tail call i32 (...) @expr()
br label %18
18: ; preds = %12, %16
%19 = tail call i32 (...) @get_lexval()
br label %37
20: ; preds = %0
%21 = tail call i32 (...) @gotofunc()
%22 = tail call i32 (...) @get_lexval()
br label %37
23: ; preds = %0
%24 = tail call i32 (...) @labeltoken()
br label %37
25: ; preds = %0
%26 = tail call i32 (...) @get_lexval()
%27 = tail call i32 (...) @get_lexval()
br label %37
28: ; preds = %0
%29 = tail call i32 (...) @get_lexval()
%30 = tail call i32 (...) @get_lexval()
br label %37
31: ; preds = %0
%32 = tail call i32 (...) @get_lexval()
%33 = tail call i32 (...) @get_lexval()
%34 = tail call i32 (...) @type()
%35 = tail call i32 (...) @get_lexval()
%36 = tail call i32 (...) @get_lexval()
br label %37
37: ; preds = %0, %31, %28, %25, %23, %20, %18, %9, %7, %5, %2
ret i32 undef
}