#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*/ exit(int);
int /*<<< orphan*/ get_lexval();
int /*<<< orphan*/ printf(char *);
int /*<<< orphan*/ statement_expr();
int /*<<< orphan*/ var_dcl();
int yyselect();
block() {
  switch (yyselect()) {
  case 36: {
    get_lexval();
    printf("Find");
    while (1) {
      switch (yyselect()) {
      case 117: {
        switch (yyselect()) {
        case 115: {
          var_dcl();
        } break;
        case 116: {
          statement_expr();
        } break;
        default:
          printf("???\n");
          exit(1);
        }
      } break;
      default:
        goto yy1;
      }
    }
  yy1:;
    get_lexval();
    printf("Find");
  } break;
  }
}


x86 assembly (clang, -O0):
<block>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
xor    %eax,%eax
call   1060 <yyselect@plt>
sub    $0x24,%eax
jne    1220 <block+0xc0>
jmp    117d <block+0x1d>
mov    $0x0,%al
call   1070 <get_lexval@plt>
lea    0xe75(%rip),%rdi
call   1050 <printf@plt>
xor    %eax,%eax
call   1060 <yyselect@plt>
sub    $0x75,%eax
jne    1203 <block+0xa3>
jmp    11a5 <block+0x45>
xor    %eax,%eax
call   1060 <yyselect@plt>
mov    %eax,%ecx
mov    %ecx,-0x8(%rbp)
sub    $0x73,%eax
je     11d0 <block+0x70>
jmp    11bf <block+0x5f>
mov    -0x8(%rbp),%eax
sub    $0x74,%eax
je     11dc <block+0x7c>
jmp    11e8 <block+0x88>
mov    $0x0,%al
call   1030 <var_dcl@plt>
jmp    11fe <block+0x9e>
mov    $0x0,%al
call   1040 <statement_expr@plt>
jmp    11fe <block+0x9e>
lea    0xe16(%rip),%rdi
call   1050 <printf@plt>
mov    $0x1,%edi
call   1080 <exit@plt>
jmp    1208 <block+0xa8>
jmp    120d <block+0xad>
jmp    1190 <block+0x30>
mov    $0x0,%al
call   1070 <get_lexval@plt>
lea    0xde5(%rip),%rdi
call   1050 <printf@plt>
mov    -0x4(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<block>:
push   %rax
xor    %eax,%eax
call   1070 <yyselect@plt>
cmp    $0x24,%eax
jne    11e0 <block+0x70>
xor    %eax,%eax
call   1080 <get_lexval@plt>
lea    0xe75(%rip),%rdi
call   1060 <printf@plt>
jmp    11a7 <block+0x37>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xor    %eax,%eax
call   1050 <statement_expr@plt>
xor    %eax,%eax
call   1070 <yyselect@plt>
cmp    $0x75,%eax
jne    11cd <block+0x5d>
xor    %eax,%eax
call   1070 <yyselect@plt>
cmp    $0x74,%eax
je     11a0 <block+0x30>
cmp    $0x73,%eax
jne    11e2 <block+0x72>
xor    %eax,%eax
call   1030 <var_dcl@plt>
jmp    11a7 <block+0x37>
xor    %eax,%eax
call   1080 <get_lexval@plt>
lea    0xe25(%rip),%rdi
call   1060 <printf@plt>
pop    %rcx
ret
lea    0xe1c(%rip),%rdi
call   1040 <puts@plt>
mov    $0x1,%edi
call   1090 <exit@plt>

LLVM IR (-O0):
@.str = [5 x i8] c"Find\00"
@.str.1 = [5 x i8] c"???\0A\00"
define i32 @block() {
%1 = alloca i32
%2 = call i32 (...) @yyselect()
switch i32 %2, label %23 [
i32 36, label %3
]
3: ; preds = %0
%4 = call i32 (...) @get_lexval()
%5 = call i32 @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
br label %6
6: ; preds = %3, %19
%7 = call i32 (...) @yyselect()
switch i32 %7, label %18 [
i32 117, label %8
]
8: ; preds = %6
%9 = call i32 (...) @yyselect()
switch i32 %9, label %14 [
i32 115, label %10
i32 116, label %12
]
10: ; preds = %8
%11 = call i32 (...) @var_dcl()
br label %17
12: ; preds = %8
%13 = call i32 (...) @statement_expr()
br label %17
14: ; preds = %8
%15 = call i32 @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0))
%16 = call i32 @exit(i32 1)
unreachable
17: ; preds = %12, %10
br label %19
18: ; preds = %6
br label %20
19: ; preds = %17
br label %6
20: ; preds = %18
%21 = call i32 (...) @get_lexval()
%22 = call i32 @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
br label %23
23: ; preds = %0, %20
%24 = load i32, i32* %1
ret i32 %24
}

LLVM IR (-O2):
@.str = [5 x i8] c"Find\00"
@str = [4 x i8] c"???\00"
define i32 @block() {
%1 = tail call i32 (...) @yyselect()
%2 = icmp eq i32 %1, 36
br i1 %2, label %3, label %23
3: ; preds = %0
%4 = tail call i32 (...) @get_lexval()
%5 = tail call i32 @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
%6 = tail call i32 (...) @yyselect()
%7 = icmp eq i32 %6, 117
br i1 %7, label %8, label %20
8: ; preds = %3, %17
%9 = tail call i32 (...) @yyselect()
switch i32 %9, label %14 [
i32 115, label %10
i32 116, label %12
]
10: ; preds = %8
%11 = tail call i32 (...) @var_dcl()
br label %17
12: ; preds = %8
%13 = tail call i32 (...) @statement_expr()
br label %17
14: ; preds = %8
%15 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @str, i64 0, i64 0))
%16 = tail call i32 @exit(i32 1)
unreachable
17: ; preds = %10, %12
%18 = tail call i32 (...) @yyselect()
%19 = icmp eq i32 %18, 117
br i1 %19, label %8, label %20
20: ; preds = %17, %3
%21 = tail call i32 (...) @get_lexval()
%22 = tail call i32 @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
br label %23
23: ; preds = %0, %20
ret i32 undef
}