void correct_month(char *EGN, int *valid) {
  int number = (EGN[3] - 48) * 10 + EGN[4] - 48;
  if (EGN[2] == '4' || EGN[2] == '0' || EGN[2] == '2') {
    switch (EGN[3]) {
    case '1':
      if (number > 31) {
        *valid = 0;
        break;
      }
    case '2':
      if (number > 29) {
        *valid = 0;
        break;
      }
    case '3':
      if (number > 31) {
        *valid = 0;
        break;
      }
    case '4':
      if (number > 30) {
        *valid = 0;
        break;
      }
    case '5':
      if (number > 31) {
        *valid = 0;
        break;
      }
    case '6':
      if (number > 30) {
        *valid = 0;
        break;
      }
    case '7':
      if (number > 31) {
        *valid = 0;
        break;
      }
    case '8':
      if (number > 31) {
        *valid = 0;
        break;
      }
    case '9':
      if (number > 30) {
        *valid = 0;
        break;
      }
    }
  } else {
    if (EGN[2] == '3' || EGN[2] == '5' || EGN[2] == '1') {
      switch (EGN[3]) {
      case '0':
        if (number > 31) {
          *valid = 0;
          break;
        }
      case '1':
        if (number > 30) {
          *valid = 0;
          break;
        }
      case '2':
        if (number > 31) {
          *valid = 0;
          break;
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<correct_month>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movsbl 0x3(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x8(%rbp),%rcx
movsbl 0x4(%rcx),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x34,%eax
je     115d <correct_month+0x5d>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x30,%eax
je     115d <correct_month+0x5d>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x32,%eax
jne    129e <correct_month+0x19e>
mov    -0x8(%rbp),%rax
movsbl 0x3(%rax),%eax
add    $0xffffffcf,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x8,%eax
ja     1299 <correct_month+0x199>
mov    -0x20(%rbp),%rax
lea    0xe7e(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
cmpl   $0x1f,-0x14(%rbp)
jle    11a4 <correct_month+0xa4>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1299 <correct_month+0x199>
jmp    11a9 <correct_month+0xa9>
cmpl   $0x1d,-0x14(%rbp)
jle    11c2 <correct_month+0xc2>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1299 <correct_month+0x199>
jmp    11c7 <correct_month+0xc7>
cmpl   $0x1f,-0x14(%rbp)
jle    11e0 <correct_month+0xe0>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1299 <correct_month+0x199>
jmp    11e5 <correct_month+0xe5>
cmpl   $0x1e,-0x14(%rbp)
jle    11fe <correct_month+0xfe>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1299 <correct_month+0x199>
jmp    1203 <correct_month+0x103>
cmpl   $0x1f,-0x14(%rbp)
jle    121c <correct_month+0x11c>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1299 <correct_month+0x199>
jmp    1221 <correct_month+0x121>
cmpl   $0x1e,-0x14(%rbp)
jle    123a <correct_month+0x13a>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1299 <correct_month+0x199>
jmp    123f <correct_month+0x13f>
cmpl   $0x1f,-0x14(%rbp)
jle    1258 <correct_month+0x158>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1299 <correct_month+0x199>
jmp    125d <correct_month+0x15d>
cmpl   $0x1f,-0x14(%rbp)
jle    1276 <correct_month+0x176>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1299 <correct_month+0x199>
jmp    127b <correct_month+0x17b>
cmpl   $0x1e,-0x14(%rbp)
jle    1294 <correct_month+0x194>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1299 <correct_month+0x199>
jmp    1299 <correct_month+0x199>
jmp    1370 <correct_month+0x270>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x33,%eax
je     12d1 <correct_month+0x1d1>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x35,%eax
je     12d1 <correct_month+0x1d1>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x31,%eax
jne    136b <correct_month+0x26b>
mov    -0x8(%rbp),%rax
movsbl 0x3(%rax),%eax
mov    %eax,-0x24(%rbp)
sub    $0x30,%eax
je     130c <correct_month+0x20c>
jmp    12ea <correct_month+0x1ea>
mov    -0x24(%rbp),%eax
sub    $0x31,%eax
je     132a <correct_month+0x22a>
jmp    12fb <correct_month+0x1fb>
mov    -0x24(%rbp),%eax
sub    $0x32,%eax
je     1348 <correct_month+0x248>
jmp    1366 <correct_month+0x266>
cmpl   $0x1f,-0x14(%rbp)
jle    1325 <correct_month+0x225>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1366 <correct_month+0x266>
jmp    132a <correct_month+0x22a>
cmpl   $0x1e,-0x14(%rbp)
jle    1343 <correct_month+0x243>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1366 <correct_month+0x266>
jmp    1348 <correct_month+0x248>
cmpl   $0x1f,-0x14(%rbp)
jle    1361 <correct_month+0x261>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1366 <correct_month+0x266>
jmp    1366 <correct_month+0x266>
jmp    136b <correct_month+0x26b>
jmp    1370 <correct_month+0x270>
pop    %rbp
ret

x86 assembly (clang, -O2):
<correct_month>:
movzbl 0x2(%rdi),%edx
cmp    $0x35,%rdx
ja     114c <correct_month+0x4c>
movsbl 0x3(%rdi),%ecx
lea    (%rcx,%rcx,4),%eax
movsbl 0x4(%rdi),%edi
lea    (%rdi,%rax,2),%eax
add    $0xfffffe20,%eax
movabs $0x15000000000000,%rdi
bt     %rdx,%rdi
jb     114d <correct_month+0x4d>
movabs $0x2a000000000000,%rdi
bt     %rdx,%rdi
jae    114c <correct_month+0x4c>
cmp    $0x32,%ecx
je     1171 <correct_month+0x71>
cmp    $0x31,%ecx
je     1165 <correct_month+0x65>
cmp    $0x30,%ecx
je     1165 <correct_month+0x65>
ret
add    $0xffffffcf,%ecx
cmp    $0x8,%ecx
ja     114c <correct_month+0x4c>
lea    0xea4(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
cmp    $0x4e,%eax
jle    114c <correct_month+0x4c>
movl   $0x0,(%rsi)
ret
cmp    $0x50,%eax
jl     114c <correct_month+0x4c>
jmp    116a <correct_month+0x6a>
cmp    $0x4d,%eax
jle    114c <correct_month+0x4c>
jmp    116a <correct_month+0x6a>

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

LLVM IR (-O2):
define void @correct_month(i8* nocapture %0, i32* nocapture writeonly %1) {
%3 = getelementptr inbounds i8, i8* %0, i64 3
%4 = load i8, i8* %3
%5 = sext i8 %4 to i32
%6 = mul nsw i32 %5, 10
%7 = add nsw i32 %6, -480
%8 = getelementptr inbounds i8, i8* %0, i64 4
%9 = load i8, i8* %8
%10 = sext i8 %9 to i32
%11 = add nsw i32 %7, %10
%12 = getelementptr inbounds i8, i8* %0, i64 2
%13 = load i8, i8* %12
switch i8 %13, label %41 [
i8 52, label %14
i8 48, label %14
i8 50, label %14
i8 51, label %33
i8 53, label %33
i8 49, label %33
]
14: ; preds = %2, %2, %2
switch i32 %5, label %41 [
i32 49, label %15
i32 50, label %17
i32 51, label %19
i32 52, label %21
i32 53, label %23
i32 54, label %25
i32 55, label %27
i32 56, label %29
i32 57, label %31
]
15: ; preds = %14
%16 = icmp sgt i32 %11, 77
br i1 %16, label %40, label %41
17: ; preds = %14
%18 = icmp sgt i32 %11, 77
br i1 %18, label %40, label %41
19: ; preds = %14
%20 = icmp sgt i32 %11, 78
br i1 %20, label %40, label %41
21: ; preds = %14
%22 = icmp sgt i32 %11, 78
br i1 %22, label %40, label %41
23: ; preds = %14
%24 = icmp sgt i32 %11, 78
br i1 %24, label %40, label %41
25: ; preds = %14
%26 = icmp sgt i32 %11, 78
br i1 %26, label %40, label %41
27: ; preds = %14
%28 = icmp sgt i32 %11, 78
br i1 %28, label %40, label %41
29: ; preds = %14
%30 = icmp sgt i32 %11, 78
br i1 %30, label %40, label %41
31: ; preds = %14
%32 = icmp sgt i32 %11, 78
br i1 %32, label %40, label %41
33: ; preds = %2, %2, %2
switch i32 %5, label %41 [
i32 48, label %34
i32 49, label %36
i32 50, label %38
]
34: ; preds = %33
%35 = icmp sgt i32 %11, 78
br i1 %35, label %40, label %41
36: ; preds = %33
%37 = icmp sgt i32 %11, 78
br i1 %37, label %40, label %41
38: ; preds = %33
%39 = icmp sgt i32 %11, 79
br i1 %39, label %40, label %41
40: ; preds = %38, %36, %34, %31, %29, %27, %25, %23, %21, %19, %17, %15
store i32 0, i32* %1
br label %41
41: ; preds = %34, %29, %27, %23, %19, %15, %40, %25, %17, %21, %36, %2, %38, %33, %14, %31
ret void
}