void correct_month(char *egn, int *helper) {
  int number = (egn[3] - 48) * 10 + egn[4] - 48;
  if (egn[2] == '0' || egn[2] == '2' || egn[2] == '4') {
    switch (egn[3]) {
    case '1':
      if (number > 31)
        *helper = 0;
      break;
    case '2':
      if (number > 29)
        *helper = 0;
      break;
    case '3':
      if (number > 31)
        *helper = 0;
      break;
    case '4':
      if (number > 30)
        *helper = 0;
      break;
    case '5':
      if (number > 31)
        *helper = 0;
      break;
    case '6':
      if (number > 30)
        *helper = 0;
      break;
    case '7':
      if (number > 31)
        *helper = 0;
      break;
    case '8':
      if (number > 31)
        *helper = 0;
      break;
    case '9':
      if (number > 30)
        *helper = 0;
      break;
    }
  } else if (egn[2] == '1' || egn[2] == '3' || egn[2] == '5') {
    switch (egn[3]) {
    case '0':
      if (number > 31)
        *helper = 0;
      break;
    case '1':
      if (number > 30)
        *helper = 0;
      break;
    case '2':
      if (number > 31)
        *helper = 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    $0x30,%eax
je     115d <correct_month+0x5d>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x32,%eax
je     115d <correct_month+0x5d>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x34,%eax
jne    1271 <correct_month+0x171>
mov    -0x8(%rbp),%rax
movsbl 0x3(%rax),%eax
add    $0xffffffcf,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x8,%eax
ja     126c <correct_month+0x16c>
mov    -0x20(%rbp),%rax
lea    0xe7e(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
cmpl   $0x1f,-0x14(%rbp)
jle    119f <correct_month+0x9f>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    126c <correct_month+0x16c>
cmpl   $0x1d,-0x14(%rbp)
jle    11b8 <correct_month+0xb8>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    126c <correct_month+0x16c>
cmpl   $0x1f,-0x14(%rbp)
jle    11d1 <correct_month+0xd1>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    126c <correct_month+0x16c>
cmpl   $0x1e,-0x14(%rbp)
jle    11ea <correct_month+0xea>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    126c <correct_month+0x16c>
cmpl   $0x1f,-0x14(%rbp)
jle    1203 <correct_month+0x103>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    126c <correct_month+0x16c>
cmpl   $0x1e,-0x14(%rbp)
jle    121c <correct_month+0x11c>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    126c <correct_month+0x16c>
cmpl   $0x1f,-0x14(%rbp)
jle    1235 <correct_month+0x135>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    126c <correct_month+0x16c>
cmpl   $0x1f,-0x14(%rbp)
jle    124e <correct_month+0x14e>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    126c <correct_month+0x16c>
cmpl   $0x1e,-0x14(%rbp)
jle    1267 <correct_month+0x167>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    126c <correct_month+0x16c>
jmp    1334 <correct_month+0x234>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x31,%eax
je     12a4 <correct_month+0x1a4>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x33,%eax
je     12a4 <correct_month+0x1a4>
mov    -0x8(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x35,%eax
jne    132f <correct_month+0x22f>
mov    -0x8(%rbp),%rax
movsbl 0x3(%rax),%eax
mov    %eax,-0x24(%rbp)
sub    $0x30,%eax
je     12df <correct_month+0x1df>
jmp    12bd <correct_month+0x1bd>
mov    -0x24(%rbp),%eax
sub    $0x31,%eax
je     12f8 <correct_month+0x1f8>
jmp    12ce <correct_month+0x1ce>
mov    -0x24(%rbp),%eax
sub    $0x32,%eax
je     1311 <correct_month+0x211>
jmp    132a <correct_month+0x22a>
cmpl   $0x1f,-0x14(%rbp)
jle    12f3 <correct_month+0x1f3>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    132a <correct_month+0x22a>
cmpl   $0x1e,-0x14(%rbp)
jle    130c <correct_month+0x20c>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    132a <correct_month+0x22a>
cmpl   $0x1f,-0x14(%rbp)
jle    1325 <correct_month+0x225>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    132a <correct_month+0x22a>
jmp    132f <correct_month+0x22f>
jmp    1334 <correct_month+0x234>
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     1173 <correct_month+0x73>
cmp    $0x31,%ecx
je     116c <correct_month+0x6c>
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    $0x4f,%eax
jle    114c <correct_month+0x4c>
jmp    117f <correct_month+0x7f>
cmp    $0x4e,%eax
jle    114c <correct_month+0x4c>
jmp    117f <correct_month+0x7f>
cmp    $0x50,%eax
jl     114c <correct_month+0x4c>
jmp    117f <correct_month+0x7f>
cmp    $0x4d,%eax
jle    114c <correct_month+0x4c>
movl   $0x0,(%rsi)
ret

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, 48
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, 50
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, 52
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 %45
45: ; preds = %43, %40
br label %94
46: ; preds = %35
%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 %51
51: ; preds = %49, %46
br label %94
52: ; preds = %35
%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 %57
57: ; preds = %55, %52
br label %94
58: ; preds = %35
%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 %63
63: ; preds = %61, %58
br label %94
64: ; preds = %35
%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 %69
69: ; preds = %67, %64
br label %94
70: ; preds = %35
%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 %75
75: ; preds = %73, %70
br label %94
76: ; preds = %35
%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 %81
81: ; preds = %79, %76
br label %94
82: ; preds = %35
%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 %87
87: ; preds = %85, %82
br label %94
88: ; preds = %35
%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 %93
93: ; preds = %91, %88
br label %94
94: ; preds = %35, %93, %87, %81, %75, %69, %63, %57, %51, %45
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, 49
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, 51
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, 53
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 %123
123: ; preds = %121, %118
br label %136
124: ; preds = %113
%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 %129
129: ; preds = %127, %124
br label %136
130: ; preds = %113
%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 %135
135: ; preds = %133, %130
br label %136
136: ; preds = %113, %135, %129, %123
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 48, label %14
i8 50, label %14
i8 52, label %14
i8 49, label %33
i8 51, label %33
i8 53, 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, 79
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, 79
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, 79
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, 79
br i1 %28, label %40, label %41
29: ; preds = %14
%30 = icmp sgt i32 %11, 79
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, 79
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 = %40, %2, %38, %36, %34, %33, %14, %15, %17, %19, %21, %23, %25, %27, %29, %31
ret void
}