unsigned short CheckDate(unsigned short m, unsigned short d, unsigned short y) {
  if (y < 1582)
    return 0;
  if (m < 1 || m > 12)
    return 0;
  if (d < 1 || d > 31)
    return 0;
  if (d == 31 && (m == 2 || m == 4 || m == 6 || m == 9 || m == 11))
    return 0;
  if (d == 30 && m == 2)
    return 0;
  if (d == 29 && m == 2) {
    if ((y % 400) == 0)
      return 1;
    if ((y % 4) == 0 && (y % 100) != 0)
      return 1;
    return 0;
  }
  return 1;
}


x86 assembly (clang, -O0):
<CheckDate>:
push   %rbp
mov    %rsp,%rbp
mov    %dx,%ax
mov    %si,%cx
mov    %di,%dx
mov    %dx,-0x4(%rbp)
mov    %cx,-0x6(%rbp)
mov    %ax,-0x8(%rbp)
movzwl -0x8(%rbp),%eax
cmp    $0x62e,%eax
jge    1133 <CheckDate+0x33>
movw   $0x0,-0x2(%rbp)
jmp    127b <CheckDate+0x17b>
movzwl -0x4(%rbp),%eax
cmp    $0x1,%eax
jl     114d <CheckDate+0x4d>
movzwl -0x4(%rbp),%eax
cmp    $0xc,%eax
jle    1158 <CheckDate+0x58>
movw   $0x0,-0x2(%rbp)
jmp    127b <CheckDate+0x17b>
movzwl -0x6(%rbp),%eax
cmp    $0x1,%eax
jl     1172 <CheckDate+0x72>
movzwl -0x6(%rbp),%eax
cmp    $0x1f,%eax
jle    117d <CheckDate+0x7d>
movw   $0x0,-0x2(%rbp)
jmp    127b <CheckDate+0x17b>
movzwl -0x6(%rbp),%eax
cmp    $0x1f,%eax
jne    11d6 <CheckDate+0xd6>
movzwl -0x4(%rbp),%eax
cmp    $0x2,%eax
je     11cb <CheckDate+0xcb>
movzwl -0x4(%rbp),%eax
cmp    $0x4,%eax
je     11cb <CheckDate+0xcb>
movzwl -0x4(%rbp),%eax
cmp    $0x6,%eax
je     11cb <CheckDate+0xcb>
movzwl -0x4(%rbp),%eax
cmp    $0x9,%eax
je     11cb <CheckDate+0xcb>
movzwl -0x4(%rbp),%eax
cmp    $0xb,%eax
jne    11d6 <CheckDate+0xd6>
movw   $0x0,-0x2(%rbp)
jmp    127b <CheckDate+0x17b>
movzwl -0x6(%rbp),%eax
cmp    $0x1e,%eax
jne    11fb <CheckDate+0xfb>
movzwl -0x4(%rbp),%eax
cmp    $0x2,%eax
jne    11fb <CheckDate+0xfb>
movw   $0x0,-0x2(%rbp)
jmp    127b <CheckDate+0x17b>
movzwl -0x6(%rbp),%eax
cmp    $0x1d,%eax
jne    1275 <CheckDate+0x175>
movzwl -0x4(%rbp),%eax
cmp    $0x2,%eax
jne    1275 <CheckDate+0x175>
movzwl -0x8(%rbp),%eax
mov    $0x190,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1235 <CheckDate+0x135>
movw   $0x1,-0x2(%rbp)
jmp    127b <CheckDate+0x17b>
movzwl -0x8(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    126a <CheckDate+0x16a>
movzwl -0x8(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     126a <CheckDate+0x16a>
movw   $0x1,-0x2(%rbp)
jmp    127b <CheckDate+0x17b>
movw   $0x0,-0x2(%rbp)
jmp    127b <CheckDate+0x17b>
movw   $0x1,-0x2(%rbp)
movzwl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<CheckDate>:
lea    -0x20(%rsi),%ecx
xor    %eax,%eax
cmp    $0xffe1,%cx
jb     11a5 <CheckDate+0xa5>
lea    -0xd(%rdi),%ecx
cmp    $0xfff4,%cx
jb     11a5 <CheckDate+0xa5>
movzwl %dx,%ecx
cmp    $0x62e,%ecx
jb     11a5 <CheckDate+0xa5>
cmp    $0x1f,%si
jne    114a <CheckDate+0x4a>
add    $0xfffffffe,%edi
mov    $0x1,%ax
cmp    $0xa,%di
jae    11a5 <CheckDate+0xa5>
movswq %di,%rax
lea    0xebb(%rip),%rcx
movzwl (%rcx,%rax,2),%eax
ret
cmp    $0x2,%di
jne    1159 <CheckDate+0x59>
cmp    $0x1e,%si
jne    1159 <CheckDate+0x59>
xor    %eax,%eax
ret
mov    $0x1,%ax
cmp    $0x2,%di
jne    11a5 <CheckDate+0xa5>
cmp    $0x1d,%si
jne    11a5 <CheckDate+0xa5>
mov    %ecx,%esi
shr    $0x4,%esi
imul   $0xa3e,%esi,%esi
shr    $0x10,%esi
imul   $0x190,%esi,%esi
sub    %esi,%ecx
test   %cx,%cx
je     11a5 <CheckDate+0xa5>
test   $0x3,%dl
sete   %al
imul   $0x5c29,%edx,%ecx
ror    $0x2,%cx
movzwl %cx,%ecx
cmp    $0x290,%ecx
setae  %cl
and    %al,%cl
movzbl %cl,%eax
ret

LLVM IR (-O0):
define zeroext i16 @CheckDate(i16 zeroext %0, i16 zeroext %1, i16 zeroext %2) {
%4 = alloca i16
%5 = alloca i16
%6 = alloca i16
%7 = alloca i16
store i16 %0, i16* %5
store i16 %1, i16* %6
store i16 %2, i16* %7
%8 = load i16, i16* %7
%9 = zext i16 %8 to i32
%10 = icmp slt i32 %9, 1582
br i1 %10, label %11, label %12
11: ; preds = %3
store i16 0, i16* %4
br label %91
12: ; preds = %3
%13 = load i16, i16* %5
%14 = zext i16 %13 to i32
%15 = icmp slt i32 %14, 1
br i1 %15, label %20, label %16
16: ; preds = %12
%17 = load i16, i16* %5
%18 = zext i16 %17 to i32
%19 = icmp sgt i32 %18, 12
br i1 %19, label %20, label %21
20: ; preds = %16, %12
store i16 0, i16* %4
br label %91
21: ; preds = %16
%22 = load i16, i16* %6
%23 = zext i16 %22 to i32
%24 = icmp slt i32 %23, 1
br i1 %24, label %29, label %25
25: ; preds = %21
%26 = load i16, i16* %6
%27 = zext i16 %26 to i32
%28 = icmp sgt i32 %27, 31
br i1 %28, label %29, label %30
29: ; preds = %25, %21
store i16 0, i16* %4
br label %91
30: ; preds = %25
%31 = load i16, i16* %6
%32 = zext i16 %31 to i32
%33 = icmp eq i32 %32, 31
br i1 %33, label %34, label %55
34: ; preds = %30
%35 = load i16, i16* %5
%36 = zext i16 %35 to i32
%37 = icmp eq i32 %36, 2
br i1 %37, label %54, label %38
38: ; preds = %34
%39 = load i16, i16* %5
%40 = zext i16 %39 to i32
%41 = icmp eq i32 %40, 4
br i1 %41, label %54, label %42
42: ; preds = %38
%43 = load i16, i16* %5
%44 = zext i16 %43 to i32
%45 = icmp eq i32 %44, 6
br i1 %45, label %54, label %46
46: ; preds = %42
%47 = load i16, i16* %5
%48 = zext i16 %47 to i32
%49 = icmp eq i32 %48, 9
br i1 %49, label %54, label %50
50: ; preds = %46
%51 = load i16, i16* %5
%52 = zext i16 %51 to i32
%53 = icmp eq i32 %52, 11
br i1 %53, label %54, label %55
54: ; preds = %50, %46, %42, %38, %34
store i16 0, i16* %4
br label %91
55: ; preds = %50, %30
%56 = load i16, i16* %6
%57 = zext i16 %56 to i32
%58 = icmp eq i32 %57, 30
br i1 %58, label %59, label %64
59: ; preds = %55
%60 = load i16, i16* %5
%61 = zext i16 %60 to i32
%62 = icmp eq i32 %61, 2
br i1 %62, label %63, label %64
63: ; preds = %59
store i16 0, i16* %4
br label %91
64: ; preds = %59, %55
%65 = load i16, i16* %6
%66 = zext i16 %65 to i32
%67 = icmp eq i32 %66, 29
br i1 %67, label %68, label %90
68: ; preds = %64
%69 = load i16, i16* %5
%70 = zext i16 %69 to i32
%71 = icmp eq i32 %70, 2
br i1 %71, label %72, label %90
72: ; preds = %68
%73 = load i16, i16* %7
%74 = zext i16 %73 to i32
%75 = srem i32 %74, 400
%76 = icmp eq i32 %75, 0
br i1 %76, label %77, label %78
77: ; preds = %72
store i16 1, i16* %4
br label %91
78: ; preds = %72
%79 = load i16, i16* %7
%80 = zext i16 %79 to i32
%81 = srem i32 %80, 4
%82 = icmp eq i32 %81, 0
br i1 %82, label %83, label %89
83: ; preds = %78
%84 = load i16, i16* %7
%85 = zext i16 %84 to i32
%86 = srem i32 %85, 100
%87 = icmp ne i32 %86, 0
br i1 %87, label %88, label %89
88: ; preds = %83
store i16 1, i16* %4
br label %91
89: ; preds = %83, %78
store i16 0, i16* %4
br label %91
90: ; preds = %68, %64
store i16 1, i16* %4
br label %91
91: ; preds = %90, %89, %88, %77, %63, %54, %29, %20, %11
%92 = load i16, i16* %4
ret i16 %92
}

LLVM IR (-O2):
@switch.table.CheckDate = [10 x i16] [i16 0, i16 1, i16 0, i16 1, i16 0, i16 1, i16 1, i16 0, i16 1, i16 0]
define zeroext i16 @CheckDate(i16 zeroext %0, i16 zeroext %1, i16 zeroext %2) {
%4 = icmp ult i16 %2, 1582
%5 = add i16 %0, -13
%6 = icmp ult i16 %5, -12
%7 = or i1 %6, %4
%8 = add i16 %1, -32
%9 = icmp ult i16 %8, -31
%10 = or i1 %9, %7
br i1 %10, label %37, label %11
11: ; preds = %3
%12 = icmp eq i16 %1, 31
br i1 %12, label %13, label %16
13: ; preds = %11
%14 = add i16 %0, -2
%15 = icmp ult i16 %14, 10
br i1 %15, label %33, label %37
16: ; preds = %11
%17 = icmp eq i16 %1, 30
%18 = icmp eq i16 %0, 2
%19 = and i1 %18, %17
br i1 %19, label %37, label %20
20: ; preds = %16
%21 = icmp eq i16 %1, 29
%22 = and i1 %18, %21
%23 = urem i16 %2, 400
%24 = icmp ne i16 %23, 0
%25 = and i1 %22, %24
br i1 %25, label %26, label %37
26: ; preds = %20
%27 = and i16 %2, 3
%28 = icmp eq i16 %27, 0
%29 = urem i16 %2, 100
%30 = icmp ne i16 %29, 0
%31 = and i1 %28, %30
%32 = zext i1 %31 to i16
br label %37
33: ; preds = %13
%34 = sext i16 %14 to i64
%35 = getelementptr inbounds [10 x i16], [10 x i16]* @switch.table.CheckDate, i64 0, i64 %34
%36 = load i16, i16* %35
br label %37
37: ; preds = %13, %33, %26, %20, %16, %3
%38 = phi i16 [ 0, %3 ], [ 0, %16 ], [ 1, %20 ], [ %32, %26 ], [ %36, %33 ], [ 1, %13 ]
ret i16 %38
}