#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 strlen(char *);
int valid_email(char *email_address) {
  int i, state = 0;
  for (i = 0; i < strlen(email_address); i++) {
    switch (state) {
    case 0: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 1: {
      if (email_address[i] == ' ') {
        state++;
      }
      break;
    }
    case 2: {
      if (email_address[i] == '<') {
        state++;
      }
      break;
    }
    case 3: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 4: {
      if (email_address[i] == '@') {
        state++;
      }
      break;
    }
    case 5: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 6: {
      if (email_address[i] == '.') {
        state++;
      }
      break;
    }
    case 7: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 8: {
      if (email_address[i] == '>') {
        state++;
      }
      break;
    }
    }
  }
  if (state == 9)
    return 1;
  return 0;
}


x86 assembly (clang, -O0):
<valid_email>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,%ecx
mov    -0x1c(%rbp),%eax
cmp    %ecx,%eax
jge    130d <valid_email+0x1fd>
mov    -0x18(%rbp),%eax
mov    %rax,-0x28(%rbp)
sub    $0x8,%rax
ja     12fa <valid_email+0x1ea>
mov    -0x28(%rbp),%rax
lea    0xe9e(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     119e <valid_email+0x8e>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jg     119e <valid_email+0x8e>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fa <valid_email+0x1ea>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jne    11c1 <valid_email+0xb1>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fa <valid_email+0x1ea>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3c,%eax
jne    11e4 <valid_email+0xd4>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fa <valid_email+0x1ea>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     121c <valid_email+0x10c>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jg     121c <valid_email+0x10c>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fa <valid_email+0x1ea>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x40,%eax
jne    123f <valid_email+0x12f>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fa <valid_email+0x1ea>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1277 <valid_email+0x167>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jg     1277 <valid_email+0x167>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fa <valid_email+0x1ea>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    129a <valid_email+0x18a>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fa <valid_email+0x1ea>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     12d2 <valid_email+0x1c2>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jg     12d2 <valid_email+0x1c2>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fa <valid_email+0x1ea>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3e,%eax
jne    12f5 <valid_email+0x1e5>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fa <valid_email+0x1ea>
jmp    12ff <valid_email+0x1ef>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    112a <valid_email+0x1a>
cmpl   $0x9,-0x18(%rbp)
jne    1323 <valid_email+0x213>
movl   $0x1,-0x4(%rbp)
jmp    132a <valid_email+0x21a>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<valid_email>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %rdi,%r14
call   1030 <strlen@plt>
test   %eax,%eax
jle    120a <valid_email+0xfa>
xor    %ebx,%ebx
lea    0xed0(%rip),%r15
xor    %ebp,%ebp
jmp    1167 <valid_email+0x57>
xor    %ebp,%ebp
cmpb   $0x3e,(%r14,%rbx,1)
sete   %bpl
or     $0x8,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%rbx
mov    %r14,%rdi
call   1030 <strlen@plt>
cltq
cmp    %rax,%rbx
jge    120c <valid_email+0xfc>
cmp    $0x8,%ebp
ja     1150 <valid_email+0x40>
mov    %ebp,%eax
movslq (%r15,%rax,4),%rax
add    %r15,%rax
jmp    *%rax
movzbl (%r14,%rbx,1),%eax
add    $0x9f,%al
xor    %ebp,%ebp
cmp    $0x1a,%al
setb   %bpl
jmp    1150 <valid_email+0x40>
xor    %ebp,%ebp
cmpb   $0x20,(%r14,%rbx,1)
sete   %bpl
add    $0x1,%ebp
jmp    1150 <valid_email+0x40>
xor    %ebp,%ebp
cmpb   $0x3c,(%r14,%rbx,1)
sete   %bpl
or     $0x2,%ebp
jmp    1150 <valid_email+0x40>
movzbl (%r14,%rbx,1),%eax
add    $0x9f,%al
cmp    $0x1a,%al
mov    $0x3,%ebp
adc    $0x0,%ebp
jmp    1150 <valid_email+0x40>
xor    %ebp,%ebp
cmpb   $0x40,(%r14,%rbx,1)
sete   %bpl
or     $0x4,%ebp
jmp    1150 <valid_email+0x40>
movzbl (%r14,%rbx,1),%eax
add    $0x9f,%al
cmp    $0x1a,%al
mov    $0x5,%ebp
adc    $0x0,%ebp
jmp    1150 <valid_email+0x40>
xor    %ebp,%ebp
cmpb   $0x2e,(%r14,%rbx,1)
sete   %bpl
or     $0x6,%ebp
jmp    1150 <valid_email+0x40>
movzbl (%r14,%rbx,1),%eax
add    $0x9f,%al
cmp    $0x1a,%al
mov    $0x7,%ebp
adc    $0x0,%ebp
jmp    1150 <valid_email+0x40>
xor    %ebp,%ebp
xor    %eax,%eax
cmp    $0x9,%ebp
sete   %al
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @valid_email(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
store i8* %0, i8** %3
store i32 0, i32* %5
store i32 0, i32* %4
br label %6
6: ; preds = %154, %1
%7 = load i32, i32* %4
%8 = load i8*, i8** %3
%9 = call i32 @strlen(i8* %8)
%10 = icmp slt i32 %7, %9
br i1 %10, label %11, label %157
11: ; preds = %6
%12 = load i32, i32* %5
switch i32 %12, label %153 [
i32 0, label %13
i32 1, label %33
i32 2, label %45
i32 3, label %57
i32 4, label %77
i32 5, label %89
i32 6, label %109
i32 7, label %121
i32 8, label %141
]
13: ; preds = %11
%14 = load i8*, i8** %3
%15 = load i32, i32* %4
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds i8, i8* %14, i64 %16
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = icmp sge i32 %19, 97
br i1 %20, label %21, label %32
21: ; preds = %13
%22 = load i8*, i8** %3
%23 = load i32, i32* %4
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %22, i64 %24
%26 = load i8, i8* %25
%27 = sext i8 %26 to i32
%28 = icmp sle i32 %27, 122
br i1 %28, label %29, label %32
29: ; preds = %21
%30 = load i32, i32* %5
%31 = add nsw i32 %30, 1
store i32 %31, i32* %5
br label %32
32: ; preds = %29, %21, %13
br label %153
33: ; preds = %11
%34 = load i8*, i8** %3
%35 = load i32, i32* %4
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %34, i64 %36
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp eq i32 %39, 32
br i1 %40, label %41, label %44
41: ; preds = %33
%42 = load i32, i32* %5
%43 = add nsw i32 %42, 1
store i32 %43, i32* %5
br label %44
44: ; preds = %41, %33
br label %153
45: ; preds = %11
%46 = load i8*, i8** %3
%47 = load i32, i32* %4
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %46, i64 %48
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %51, 60
br i1 %52, label %53, label %56
53: ; preds = %45
%54 = load i32, i32* %5
%55 = add nsw i32 %54, 1
store i32 %55, i32* %5
br label %56
56: ; preds = %53, %45
br label %153
57: ; preds = %11
%58 = load i8*, i8** %3
%59 = load i32, i32* %4
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i8, i8* %58, i64 %60
%62 = load i8, i8* %61
%63 = sext i8 %62 to i32
%64 = icmp sge i32 %63, 97
br i1 %64, label %65, label %76
65: ; preds = %57
%66 = load i8*, i8** %3
%67 = load i32, i32* %4
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds i8, i8* %66, i64 %68
%70 = load i8, i8* %69
%71 = sext i8 %70 to i32
%72 = icmp sle i32 %71, 122
br i1 %72, label %73, label %76
73: ; preds = %65
%74 = load i32, i32* %5
%75 = add nsw i32 %74, 1
store i32 %75, i32* %5
br label %76
76: ; preds = %73, %65, %57
br label %153
77: ; preds = %11
%78 = load i8*, i8** %3
%79 = load i32, i32* %4
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds i8, i8* %78, i64 %80
%82 = load i8, i8* %81
%83 = sext i8 %82 to i32
%84 = icmp eq i32 %83, 64
br i1 %84, label %85, label %88
85: ; preds = %77
%86 = load i32, i32* %5
%87 = add nsw i32 %86, 1
store i32 %87, i32* %5
br label %88
88: ; preds = %85, %77
br label %153
89: ; preds = %11
%90 = load i8*, i8** %3
%91 = load i32, i32* %4
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds i8, i8* %90, i64 %92
%94 = load i8, i8* %93
%95 = sext i8 %94 to i32
%96 = icmp sge i32 %95, 97
br i1 %96, label %97, label %108
97: ; preds = %89
%98 = load i8*, i8** %3
%99 = load i32, i32* %4
%100 = sext i32 %99 to i64
%101 = getelementptr inbounds i8, i8* %98, i64 %100
%102 = load i8, i8* %101
%103 = sext i8 %102 to i32
%104 = icmp sle i32 %103, 122
br i1 %104, label %105, label %108
105: ; preds = %97
%106 = load i32, i32* %5
%107 = add nsw i32 %106, 1
store i32 %107, i32* %5
br label %108
108: ; preds = %105, %97, %89
br label %153
109: ; preds = %11
%110 = load i8*, i8** %3
%111 = load i32, i32* %4
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds i8, i8* %110, i64 %112
%114 = load i8, i8* %113
%115 = sext i8 %114 to i32
%116 = icmp eq i32 %115, 46
br i1 %116, label %117, label %120
117: ; preds = %109
%118 = load i32, i32* %5
%119 = add nsw i32 %118, 1
store i32 %119, i32* %5
br label %120
120: ; preds = %117, %109
br label %153
121: ; preds = %11
%122 = load i8*, i8** %3
%123 = load i32, i32* %4
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds i8, i8* %122, i64 %124
%126 = load i8, i8* %125
%127 = sext i8 %126 to i32
%128 = icmp sge i32 %127, 97
br i1 %128, label %129, label %140
129: ; preds = %121
%130 = load i8*, i8** %3
%131 = load i32, i32* %4
%132 = sext i32 %131 to i64
%133 = getelementptr inbounds i8, i8* %130, i64 %132
%134 = load i8, i8* %133
%135 = sext i8 %134 to i32
%136 = icmp sle i32 %135, 122
br i1 %136, label %137, label %140
137: ; preds = %129
%138 = load i32, i32* %5
%139 = add nsw i32 %138, 1
store i32 %139, i32* %5
br label %140
140: ; preds = %137, %129, %121
br label %153
141: ; preds = %11
%142 = load i8*, i8** %3
%143 = load i32, i32* %4
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i8, i8* %142, i64 %144
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp eq i32 %147, 62
br i1 %148, label %149, label %152
149: ; preds = %141
%150 = load i32, i32* %5
%151 = add nsw i32 %150, 1
store i32 %151, i32* %5
br label %152
152: ; preds = %149, %141
br label %153
153: ; preds = %11, %152, %140, %120, %108, %88, %76, %56, %44, %32
br label %154
154: ; preds = %153
%155 = load i32, i32* %4
%156 = add nsw i32 %155, 1
store i32 %156, i32* %4
br label %6
157: ; preds = %6
%158 = load i32, i32* %5
%159 = icmp eq i32 %158, 9
br i1 %159, label %160, label %161
160: ; preds = %157
store i32 1, i32* %2
br label %162
161: ; preds = %157
store i32 0, i32* %2
br label %162
162: ; preds = %161, %160
%163 = load i32, i32* %2
ret i32 %163
}

LLVM IR (-O2):
define i32 @valid_email(i8* %0) {
%2 = tail call i32 @strlen(i8* %0)
%3 = icmp sgt i32 %2, 0
br i1 %3, label %4, label %62
4: ; preds = %1, %56
%5 = phi i64 [ %58, %56 ], [ 0, %1 ]
%6 = phi i32 [ %57, %56 ], [ 0, %1 ]
switch i32 %6, label %56 [
i32 0, label %7
i32 1, label %13
i32 2, label %18
i32 3, label %23
i32 4, label %29
i32 5, label %34
i32 6, label %40
i32 7, label %45
i32 8, label %51
]
7: ; preds = %4
%8 = getelementptr inbounds i8, i8* %0, i64 %5
%9 = load i8, i8* %8
%10 = add i8 %9, -97
%11 = icmp ult i8 %10, 26
%12 = zext i1 %11 to i32
br label %56
13: ; preds = %4
%14 = getelementptr inbounds i8, i8* %0, i64 %5
%15 = load i8, i8* %14
%16 = icmp eq i8 %15, 32
%17 = select i1 %16, i32 2, i32 1
br label %56
18: ; preds = %4
%19 = getelementptr inbounds i8, i8* %0, i64 %5
%20 = load i8, i8* %19
%21 = icmp eq i8 %20, 60
%22 = select i1 %21, i32 3, i32 2
br label %56
23: ; preds = %4
%24 = getelementptr inbounds i8, i8* %0, i64 %5
%25 = load i8, i8* %24
%26 = add i8 %25, -97
%27 = icmp ult i8 %26, 26
%28 = select i1 %27, i32 4, i32 3
br label %56
29: ; preds = %4
%30 = getelementptr inbounds i8, i8* %0, i64 %5
%31 = load i8, i8* %30
%32 = icmp eq i8 %31, 64
%33 = select i1 %32, i32 5, i32 4
br label %56
34: ; preds = %4
%35 = getelementptr inbounds i8, i8* %0, i64 %5
%36 = load i8, i8* %35
%37 = add i8 %36, -97
%38 = icmp ult i8 %37, 26
%39 = select i1 %38, i32 6, i32 5
br label %56
40: ; preds = %4
%41 = getelementptr inbounds i8, i8* %0, i64 %5
%42 = load i8, i8* %41
%43 = icmp eq i8 %42, 46
%44 = select i1 %43, i32 7, i32 6
br label %56
45: ; preds = %4
%46 = getelementptr inbounds i8, i8* %0, i64 %5
%47 = load i8, i8* %46
%48 = add i8 %47, -97
%49 = icmp ult i8 %48, 26
%50 = select i1 %49, i32 8, i32 7
br label %56
51: ; preds = %4
%52 = getelementptr inbounds i8, i8* %0, i64 %5
%53 = load i8, i8* %52
%54 = icmp eq i8 %53, 62
%55 = select i1 %54, i32 9, i32 8
br label %56
56: ; preds = %45, %34, %23, %7, %51, %40, %29, %18, %13, %4
%57 = phi i32 [ %6, %4 ], [ %17, %13 ], [ %22, %18 ], [ %33, %29 ], [ %44, %40 ], [ %55, %51 ], [ %12, %7 ], [ %28, %23 ], [ %39, %34 ], [ %50, %45 ]
%58 = add nuw nsw i64 %5, 1
%59 = tail call i32 @strlen(i8* %0)
%60 = sext i32 %59 to i64
%61 = icmp slt i64 %58, %60
br i1 %61, label %4, label %62
62: ; preds = %56, %1
%63 = phi i32 [ 0, %1 ], [ %57, %56 ]
%64 = icmp eq i32 %63, 9
%65 = zext i1 %64 to i32
ret i32 %65
}