int check_date(char serial_number[12]) {
  int date;
  int month;
  int year;
  int max_date = 31;
  date = (serial_number[4] - '0') * 10 + (serial_number[5] - '0');
  month = (serial_number[2] - '0') * 10 + (serial_number[3] - '0');
  year = (serial_number[0] - '0') * 10 + (serial_number[1] - '0');
  if (!((month >= 1 && month <= 12) || (month >= 21 && month <= 32) ||
        (month >= 41 && month <= 52))) {
    return 0;
  }
  switch (month) {
  case 1:
    max_date = 31;
    break;
  case 2:
    if (year % 4 == 0) {
      max_date = 29;
    } else {
      max_date = 28;
    }
    break;
  case 3:
    max_date = 31;
    break;
  case 4:
    max_date = 30;
    break;
  case 5:
    max_date = 31;
    break;
  case 6:
    max_date = 30;
    break;
  case 7:
    max_date = 31;
    break;
  case 8:
    max_date = 31;
    break;
  case 9:
    max_date = 30;
    break;
  case 10:
    max_date = 31;
    break;
  case 11:
    max_date = 30;
    break;
  case 12:
    max_date = 31;
    break;
  case 21:
    max_date = 31;
    break;
  case 22:
    if (year % 4 == 0) {
      max_date = 29;
    } else {
      max_date = 28;
    }
    break;
  case 23:
    max_date = 31;
    break;
  case 24:
    max_date = 30;
    break;
  case 25:
    max_date = 31;
    break;
  case 26:
    max_date = 30;
    break;
  case 27:
    max_date = 31;
    break;
  case 28:
    max_date = 31;
    break;
  case 29:
    max_date = 30;
    break;
  case 30:
    max_date = 31;
    break;
  case 31:
    max_date = 30;
    break;
  case 32:
    max_date = 31;
    break;
  case 41:
    max_date = 31;
    break;
  case 42:
    if (year % 4 == 0) {
      max_date = 29;
    } else {
      max_date = 28;
    }
    break;
  case 43:
    max_date = 31;
    break;
  case 44:
    max_date = 30;
    break;
  case 45:
    max_date = 31;
    break;
  case 46:
    max_date = 30;
    break;
  case 47:
    max_date = 31;
    break;
  case 48:
    max_date = 31;
    break;
  case 49:
    max_date = 30;
    break;
  case 50:
    max_date = 31;
    break;
  case 51:
    max_date = 30;
    break;
  case 52:
    max_date = 31;
    break;
  }
  if ((1 <= date) && (date <= max_date)) {
    return 1;
  }
  return 0;
}


x86 assembly (clang, -O0):
<check_date>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x1f,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x5(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x3(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x1,-0x18(%rbp)
jl     117c <check_date+0x7c>
cmpl   $0xc,-0x18(%rbp)
jle    11b0 <check_date+0xb0>
cmpl   $0x15,-0x18(%rbp)
jl     1190 <check_date+0x90>
cmpl   $0x20,-0x18(%rbp)
jle    11b0 <check_date+0xb0>
cmpl   $0x29,-0x18(%rbp)
jl     11a4 <check_date+0xa4>
cmpl   $0x34,-0x18(%rbp)
jle    11b0 <check_date+0xb0>
movl   $0x0,-0x4(%rbp)
jmp    1411 <check_date+0x311>
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x28(%rbp)
sub    $0x33,%eax
ja     13e4 <check_date+0x2e4>
mov    -0x28(%rbp),%rax
lea    0xe30(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
mov    -0x1c(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1205 <check_date+0x105>
movl   $0x1d,-0x20(%rbp)
jmp    120c <check_date+0x10c>
movl   $0x1c,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
mov    -0x1c(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    12b5 <check_date+0x1b5>
movl   $0x1d,-0x20(%rbp)
jmp    12bc <check_date+0x1bc>
movl   $0x1c,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
mov    -0x1c(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1365 <check_date+0x265>
movl   $0x1d,-0x20(%rbp)
jmp    136c <check_date+0x26c>
movl   $0x1c,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1e,-0x20(%rbp)
jmp    13e4 <check_date+0x2e4>
movl   $0x1f,-0x20(%rbp)
mov    $0x1,%eax
cmp    -0x14(%rbp),%eax
jg     140a <check_date+0x30a>
mov    -0x14(%rbp),%eax
cmp    -0x20(%rbp),%eax
jg     140a <check_date+0x30a>
movl   $0x1,-0x4(%rbp)
jmp    1411 <check_date+0x311>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_date>:
movsbl 0x4(%rdi),%r8d
movsbl 0x5(%rdi),%edx
movsbl 0x2(%rdi),%eax
lea    (%rax,%rax,4),%esi
movsbl 0x3(%rdi),%ecx
movzbl (%rdi),%r9d
movzbl 0x1(%rdi),%r10d
lea    (%rcx,%rsi,2),%eax
add    $0xfffffdef,%eax
cmp    $0xc,%eax
jb     1148 <check_date+0x48>
lea    (%rcx,%rsi,2),%eax
add    $0xfffffddb,%eax
cmp    $0xc,%eax
jb     1148 <check_date+0x48>
xor    %eax,%eax
lea    (%rcx,%rsi,2),%edi
add    $0xfffffdc7,%edi
cmp    $0xb,%edi
jbe    1148 <check_date+0x48>
ret
lea    (%r8,%r8,4),%edi
lea    (%rdx,%rdi,2),%eax
lea    (%rdx,%rdi,2),%r8d
add    $0xfffffdf0,%r8d
lea    (%rcx,%rsi,2),%esi
mov    $0x1f,%edx
add    $0xfffffdee,%esi
cmp    $0x31,%esi
ja     1197 <check_date+0x97>
lea    (%r9,%r9,4),%ecx
lea    (%r10,%rcx,2),%ecx
lea    0xe84(%rip),%rdi
movslq (%rdi,%rsi,4),%rsi
add    %rdi,%rsi
jmp    *%rsi
mov    $0x1e,%edx
jmp    1197 <check_date+0x97>
xor    %edx,%edx
test   $0x3,%cl
sete   %dl
or     $0x1c,%edx
cmp    $0x211,%eax
setge  %al
cmp    %edx,%r8d
setle  %cl
and    %al,%cl
movzbl %cl,%eax
ret

LLVM IR (-O0):
define i32 @check_date(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i8* %0, i8** %3
store i32 31, i32* %7
%8 = load i8*, i8** %3
%9 = getelementptr inbounds i8, i8* %8, i64 4
%10 = load i8, i8* %9
%11 = sext i8 %10 to i32
%12 = sub nsw i32 %11, 48
%13 = mul nsw i32 %12, 10
%14 = load i8*, i8** %3
%15 = getelementptr inbounds i8, i8* %14, i64 5
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = sub nsw i32 %17, 48
%19 = add nsw i32 %13, %18
store i32 %19, i32* %4
%20 = load i8*, i8** %3
%21 = getelementptr inbounds i8, i8* %20, i64 2
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
%24 = sub nsw i32 %23, 48
%25 = mul nsw i32 %24, 10
%26 = load i8*, i8** %3
%27 = getelementptr inbounds i8, i8* %26, i64 3
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = sub nsw i32 %29, 48
%31 = add nsw i32 %25, %30
store i32 %31, i32* %5
%32 = load i8*, i8** %3
%33 = getelementptr inbounds i8, i8* %32, i64 0
%34 = load i8, i8* %33
%35 = sext i8 %34 to i32
%36 = sub nsw i32 %35, 48
%37 = mul nsw i32 %36, 10
%38 = load i8*, i8** %3
%39 = getelementptr inbounds i8, i8* %38, i64 1
%40 = load i8, i8* %39
%41 = sext i8 %40 to i32
%42 = sub nsw i32 %41, 48
%43 = add nsw i32 %37, %42
store i32 %43, i32* %6
%44 = load i32, i32* %5
%45 = icmp sge i32 %44, 1
br i1 %45, label %46, label %49
46: ; preds = %1
%47 = load i32, i32* %5
%48 = icmp sle i32 %47, 12
br i1 %48, label %62, label %49
49: ; preds = %46, %1
%50 = load i32, i32* %5
%51 = icmp sge i32 %50, 21
br i1 %51, label %52, label %55
52: ; preds = %49
%53 = load i32, i32* %5
%54 = icmp sle i32 %53, 32
br i1 %54, label %62, label %55
55: ; preds = %52, %49
%56 = load i32, i32* %5
%57 = icmp sge i32 %56, 41
br i1 %57, label %58, label %61
58: ; preds = %55
%59 = load i32, i32* %5
%60 = icmp sle i32 %59, 52
br i1 %60, label %62, label %61
61: ; preds = %58, %55
store i32 0, i32* %2
br label %127
62: ; preds = %58, %52, %46
%63 = load i32, i32* %5
switch i32 %63, label %118 [
i32 1, label %64
i32 2, label %65
i32 3, label %72
i32 4, label %73
i32 5, label %74
i32 6, label %75
i32 7, label %76
i32 8, label %77
i32 9, label %78
i32 10, label %79
i32 11, label %80
i32 12, label %81
i32 21, label %82
i32 22, label %83
i32 23, label %90
i32 24, label %91
i32 25, label %92
i32 26, label %93
i32 27, label %94
i32 28, label %95
i32 29, label %96
i32 30, label %97
i32 31, label %98
i32 32, label %99
i32 41, label %100
i32 42, label %101
i32 43, label %108
i32 44, label %109
i32 45, label %110
i32 46, label %111
i32 47, label %112
i32 48, label %113
i32 49, label %114
i32 50, label %115
i32 51, label %116
i32 52, label %117
]
64: ; preds = %62
store i32 31, i32* %7
br label %118
65: ; preds = %62
%66 = load i32, i32* %6
%67 = srem i32 %66, 4
%68 = icmp eq i32 %67, 0
br i1 %68, label %69, label %70
69: ; preds = %65
store i32 29, i32* %7
br label %71
70: ; preds = %65
store i32 28, i32* %7
br label %71
71: ; preds = %70, %69
br label %118
72: ; preds = %62
store i32 31, i32* %7
br label %118
73: ; preds = %62
store i32 30, i32* %7
br label %118
74: ; preds = %62
store i32 31, i32* %7
br label %118
75: ; preds = %62
store i32 30, i32* %7
br label %118
76: ; preds = %62
store i32 31, i32* %7
br label %118
77: ; preds = %62
store i32 31, i32* %7
br label %118
78: ; preds = %62
store i32 30, i32* %7
br label %118
79: ; preds = %62
store i32 31, i32* %7
br label %118
80: ; preds = %62
store i32 30, i32* %7
br label %118
81: ; preds = %62
store i32 31, i32* %7
br label %118
82: ; preds = %62
store i32 31, i32* %7
br label %118
83: ; preds = %62
%84 = load i32, i32* %6
%85 = srem i32 %84, 4
%86 = icmp eq i32 %85, 0
br i1 %86, label %87, label %88
87: ; preds = %83
store i32 29, i32* %7
br label %89
88: ; preds = %83
store i32 28, i32* %7
br label %89
89: ; preds = %88, %87
br label %118
90: ; preds = %62
store i32 31, i32* %7
br label %118
91: ; preds = %62
store i32 30, i32* %7
br label %118
92: ; preds = %62
store i32 31, i32* %7
br label %118
93: ; preds = %62
store i32 30, i32* %7
br label %118
94: ; preds = %62
store i32 31, i32* %7
br label %118
95: ; preds = %62
store i32 31, i32* %7
br label %118
96: ; preds = %62
store i32 30, i32* %7
br label %118
97: ; preds = %62
store i32 31, i32* %7
br label %118
98: ; preds = %62
store i32 30, i32* %7
br label %118
99: ; preds = %62
store i32 31, i32* %7
br label %118
100: ; preds = %62
store i32 31, i32* %7
br label %118
101: ; preds = %62
%102 = load i32, i32* %6
%103 = srem i32 %102, 4
%104 = icmp eq i32 %103, 0
br i1 %104, label %105, label %106
105: ; preds = %101
store i32 29, i32* %7
br label %107
106: ; preds = %101
store i32 28, i32* %7
br label %107
107: ; preds = %106, %105
br label %118
108: ; preds = %62
store i32 31, i32* %7
br label %118
109: ; preds = %62
store i32 30, i32* %7
br label %118
110: ; preds = %62
store i32 31, i32* %7
br label %118
111: ; preds = %62
store i32 30, i32* %7
br label %118
112: ; preds = %62
store i32 31, i32* %7
br label %118
113: ; preds = %62
store i32 31, i32* %7
br label %118
114: ; preds = %62
store i32 30, i32* %7
br label %118
115: ; preds = %62
store i32 31, i32* %7
br label %118
116: ; preds = %62
store i32 30, i32* %7
br label %118
117: ; preds = %62
store i32 31, i32* %7
br label %118
118: ; preds = %62, %117, %116, %115, %114, %113, %112, %111, %110, %109, %108, %107, %100, %99, %98, %97, %96, %95, %94, %93, %92, %91, %90, %89, %82, %81, %80, %79, %78, %77, %76, %75, %74, %73, %72, %71, %64
%119 = load i32, i32* %4
%120 = icmp sle i32 1, %119
br i1 %120, label %121, label %126
121: ; preds = %118
%122 = load i32, i32* %4
%123 = load i32, i32* %7
%124 = icmp sle i32 %122, %123
br i1 %124, label %125, label %126
125: ; preds = %121
store i32 1, i32* %2
br label %127
126: ; preds = %121, %118
store i32 0, i32* %2
br label %127
127: ; preds = %126, %125, %61
%128 = load i32, i32* %2
ret i32 %128
}

LLVM IR (-O2):
define i32 @check_date(i8* nocapture %0) {
%2 = getelementptr inbounds i8, i8* %0, i64 4
%3 = load i8, i8* %2
%4 = sext i8 %3 to i32
%5 = mul nsw i32 %4, 10
%6 = getelementptr inbounds i8, i8* %0, i64 5
%7 = load i8, i8* %6
%8 = sext i8 %7 to i32
%9 = add nsw i32 %5, %8
%10 = add nsw i32 %9, -528
%11 = getelementptr inbounds i8, i8* %0, i64 2
%12 = load i8, i8* %11
%13 = sext i8 %12 to i32
%14 = mul nsw i32 %13, 10
%15 = getelementptr inbounds i8, i8* %0, i64 3
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = add nsw i32 %14, %17
%19 = load i8, i8* %0
%20 = zext i8 %19 to i32
%21 = mul nuw nsw i32 %20, 10
%22 = getelementptr inbounds i8, i8* %0, i64 1
%23 = load i8, i8* %22
%24 = zext i8 %23 to i32
%25 = add nuw nsw i32 %21, %24
%26 = add nsw i32 %18, -529
%27 = icmp ult i32 %26, 12
%28 = add nsw i32 %18, -549
%29 = icmp ult i32 %28, 12
%30 = select i1 %27, i1 true, i1 %29
%31 = add nsw i32 %18, -569
%32 = icmp ult i32 %31, 12
%33 = select i1 %30, i1 true, i1 %32
br i1 %33, label %34, label %65
34: ; preds = %1
switch i32 %18, label %59 [
i32 579, label %58
i32 530, label %35
i32 577, label %57
i32 532, label %39
i32 574, label %56
i32 534, label %40
i32 572, label %55
i32 570, label %51
i32 537, label %41
i32 559, label %50
i32 539, label %42
i32 557, label %49
i32 554, label %48
i32 550, label %43
i32 552, label %47
]
35: ; preds = %34
%36 = and i32 %25, 3
%37 = icmp eq i32 %36, 0
%38 = select i1 %37, i32 29, i32 28
br label %59
39: ; preds = %34
br label %59
40: ; preds = %34
br label %59
41: ; preds = %34
br label %59
42: ; preds = %34
br label %59
43: ; preds = %34
%44 = and i32 %25, 3
%45 = icmp eq i32 %44, 0
%46 = select i1 %45, i32 29, i32 28
br label %59
47: ; preds = %34
br label %59
48: ; preds = %34
br label %59
49: ; preds = %34
br label %59
50: ; preds = %34
br label %59
51: ; preds = %34
%52 = and i32 %25, 3
%53 = icmp eq i32 %52, 0
%54 = select i1 %53, i32 29, i32 28
br label %59
55: ; preds = %34
br label %59
56: ; preds = %34
br label %59
57: ; preds = %34
br label %59
58: ; preds = %34
br label %59
59: ; preds = %51, %43, %35, %34, %58, %57, %56, %55, %50, %49, %48, %47, %42, %41, %40, %39
%60 = phi i32 [ 30, %58 ], [ 30, %57 ], [ 30, %56 ], [ 30, %55 ], [ 30, %50 ], [ 30, %49 ], [ 30, %48 ], [ 30, %47 ], [ 30, %42 ], [ 30, %41 ], [ 30, %40 ], [ 30, %39 ], [ %38, %35 ], [ %46, %43 ], [ %54, %51 ], [ 31, %34 ]
%61 = icmp sgt i32 %9, 528
%62 = icmp sle i32 %10, %60
%63 = select i1 %61, i1 %62, i1 false
%64 = zext i1 %63 to i32
br label %65
65: ; preds = %59, %1
%66 = phi i32 [ 0, %1 ], [ %64, %59 ]
ret i32 %66
}