unsigned short valid_data(yr, mo, da)
unsigned short yr, mo, da;
{
  if (yr < 100)
    yr += 1900;
  if (yr < 1000)
    yr += 2000;
  if (mo < 1 || mo > 12)
    return (1);
  if (da < 1 || da > 31)
    return (4);
  if (da > 30 && (mo == 9 || mo == 4 || mo == 6 || mo == 11)) {
    return (4);
  }
  if (mo == 2 && da > 28) {
    if (!leapyear(yr))
      return (4);
    else if (da > 29)
      return (4);
  }
  return (0);
}


x86 assembly (clang, -O0):
<valid_data>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edx,%eax
mov    %di,%dx
mov    %si,%cx
mov    %dx,-0x4(%rbp)
mov    %cx,-0x6(%rbp)
mov    %ax,-0x8(%rbp)
movzwl -0x4(%rbp),%eax
cmp    $0x64,%eax
jge    1146 <valid_data+0x36>
movzwl -0x4(%rbp),%eax
add    $0x76c,%eax
mov    %ax,-0x4(%rbp)
movzwl -0x4(%rbp),%eax
cmp    $0x3e8,%eax
jge    1162 <valid_data+0x52>
movzwl -0x4(%rbp),%eax
add    $0x7d0,%eax
mov    %ax,-0x4(%rbp)
movzwl -0x6(%rbp),%eax
cmp    $0x1,%eax
jl     117c <valid_data+0x6c>
movzwl -0x6(%rbp),%eax
cmp    $0xc,%eax
jle    1187 <valid_data+0x77>
movw   $0x1,-0x2(%rbp)
jmp    1259 <valid_data+0x149>
movzwl -0x8(%rbp),%eax
cmp    $0x1,%eax
jl     11a1 <valid_data+0x91>
movzwl -0x8(%rbp),%eax
cmp    $0x1f,%eax
jle    11ac <valid_data+0x9c>
movw   $0x4,-0x2(%rbp)
jmp    1259 <valid_data+0x149>
movzwl -0x8(%rbp),%eax
cmp    $0x1e,%eax
jle    11f8 <valid_data+0xe8>
movzwl -0x6(%rbp),%eax
cmp    $0x9,%eax
je     11ed <valid_data+0xdd>
movzwl -0x6(%rbp),%eax
cmp    $0x4,%eax
je     11ed <valid_data+0xdd>
movzwl -0x6(%rbp),%eax
cmp    $0x6,%eax
je     11ed <valid_data+0xdd>
movzwl -0x6(%rbp),%eax
cmp    $0xb,%eax
jne    11f8 <valid_data+0xe8>
movw   $0x4,-0x2(%rbp)
jmp    1259 <valid_data+0x149>
movzwl -0x6(%rbp),%eax
cmp    $0x2,%eax
jne    1253 <valid_data+0x143>
movzwl -0x8(%rbp),%eax
cmp    $0x1c,%eax
jle    1253 <valid_data+0x143>
movzwl -0x4(%rbp),%edi
mov    $0x0,%al
call   1030 <leapyear@plt>
cmp    $0x0,%eax
jne    1231 <valid_data+0x121>
movw   $0x4,-0x2(%rbp)
jmp    1259 <valid_data+0x149>
movzwl -0x8(%rbp),%eax
cmp    $0x1d,%eax
jle    1249 <valid_data+0x139>
movw   $0x4,-0x2(%rbp)
jmp    1259 <valid_data+0x149>
jmp    124e <valid_data+0x13e>
jmp    1253 <valid_data+0x143>
movw   $0x0,-0x2(%rbp)
movzwl -0x2(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<valid_data>:
push   %r14
push   %rbx
push   %rax
movzwl %di,%eax
lea    0x76c(%rax),%ecx
cmp    $0x64,%eax
cmovae %edi,%ecx
mov    %ecx,%edi
and    $0xfff8,%edi
lea    0x7d0(%rcx),%eax
cmp    $0x3e8,%edi
cmovae %ecx,%eax
movzwl %si,%ecx
lea    -0xd(%rcx),%edi
mov    $0x1,%bx
cmp    $0xfffffff4,%edi
jb     1193 <valid_data+0x83>
movzwl %dx,%r14d
lea    -0x20(%r14),%edx
mov    $0x4,%bx
cmp    $0xffffffe1,%edx
jb     1193 <valid_data+0x83>
cmp    $0x1f,%r14d
jb     1172 <valid_data+0x62>
and    $0xfffd,%esi
cmp    $0x4,%si
je     1193 <valid_data+0x83>
cmp    $0x9,%si
je     1193 <valid_data+0x83>
cmp    $0x2,%ecx
jne    1191 <valid_data+0x81>
cmp    $0x1d,%r14d
jb     1191 <valid_data+0x81>
movzwl %ax,%edi
xor    %eax,%eax
call   1030 <leapyear@plt>
cmp    $0x1d,%r14d
ja     1193 <valid_data+0x83>
test   %eax,%eax
je     1193 <valid_data+0x83>
xor    %ebx,%ebx
mov    %ebx,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define zeroext i16 @valid_data(i32 %0, i32 %1, i32 %2) {
%4 = and i32 %0, 65535
%5 = icmp ult i32 %4, 100
%6 = add nuw nsw i32 %4, 1900
%7 = select i1 %5, i32 %6, i32 %0
%8 = and i32 %7, 65528
%9 = icmp ult i32 %8, 1000
%10 = add i32 %7, 2000
%11 = select i1 %9, i32 %10, i32 %7
%12 = and i32 %1, 65535
%13 = add nsw i32 %12, -13
%14 = icmp ult i32 %13, -12
br i1 %14, label %35, label %15
15: ; preds = %3
%16 = and i32 %2, 65535
%17 = add nsw i32 %16, -32
%18 = icmp ult i32 %17, -31
br i1 %18, label %35, label %19
19: ; preds = %15
%20 = icmp ugt i32 %16, 30
br i1 %20, label %21, label %24
21: ; preds = %19
%22 = trunc i32 %1 to i16
%23 = and i16 %22, -3
switch i16 %23, label %24 [
i16 9, label %35
i16 4, label %35
]
24: ; preds = %21, %19
%25 = icmp eq i32 %12, 2
%26 = icmp ugt i32 %16, 28
%27 = and i1 %25, %26
br i1 %27, label %28, label %34
28: ; preds = %24
%29 = and i32 %11, 65535
%30 = tail call i32 (i32, ...) bitcast (i32 (...)* @leapyear to i32 (i32, ...)*)(i32 %29)
%31 = icmp eq i32 %30, 0
%32 = icmp ugt i32 %16, 29
%33 = or i1 %32, %31
br i1 %33, label %35, label %34
34: ; preds = %28, %24
br label %35
35: ; preds = %21, %21, %28, %15, %3, %34
%36 = phi i16 [ 0, %34 ], [ 1, %3 ], [ 4, %15 ], [ 4, %21 ], [ 4, %28 ], [ 4, %21 ]
ret i16 %36
}