#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef scalar_t__ time_t;
struct tm {
  int tm_year;
  int tm_mon;
  int tm_mday;
};

/* Variables and functions */
scalar_t__ c_timegm(struct tm *);
scalar_t__ get_int(char *, int *);
unsigned int strlen(char *);
unsigned int get_unix_datetime(char *s, time_t *datetime) {
  unsigned int len = strlen(s);
  int month = 0, year;
  if (len == 4) {
    if (get_int(s, &year))
      return 1;
  } else if (len == 7) {
    if (s[2] != '/' && s[2] != '-' && s[2] != '.')
      return 1;
    char s_month[3];
    char s_year[5];
    if (s[0] == '0') {
      s_month[0] = s[1];
      s_month[1] = 0;
    } else {
      s_month[0] = s[0];
      s_month[1] = s[1];
      s_month[2] = 0;
    }
    s_year[0] = s[3];
    s_year[1] = s[4];
    s_year[2] = s[5];
    s_year[3] = s[6];
    s_year[4] = 0;
    if (get_int(s_month, &month) || get_int(s_year, &year))
      return 1;
    if (year < 1970 || year > 2038 || month < 1 || month > 12 ||
        (month > 2 && year == 2038))
      return 1;
  } else {
    return 1;
  }
  if (year == 2038 && month == 2) {
    *datetime = (time_t)0x7fffffff;
  } else {
    struct tm t = {.tm_year = year - 1900, .tm_mon = month - 1, .tm_mday = 1};
    *datetime = c_timegm(&t);
    if (*datetime < 0)
      return 1;
  }
  return 0;
}


x86 assembly (clang, -O0):
<get_unix_datetime>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0x4,-0x1c(%rbp)
jne    1185 <get_unix_datetime+0x55>
mov    -0x10(%rbp),%rdi
lea    -0x24(%rbp),%rsi
call   1050 <get_int@plt>
cmp    $0x0,%rax
je     1180 <get_unix_datetime+0x50>
movl   $0x1,-0x4(%rbp)
jmp    1350 <get_unix_datetime+0x220>
jmp    12d5 <get_unix_datetime+0x1a5>
cmpl   $0x7,-0x1c(%rbp)
jne    12c4 <get_unix_datetime+0x194>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2f,%eax
je     11ce <get_unix_datetime+0x9e>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2d,%eax
je     11ce <get_unix_datetime+0x9e>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2e,%eax
je     11ce <get_unix_datetime+0x9e>
movl   $0x1,-0x4(%rbp)
jmp    1350 <get_unix_datetime+0x220>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    11f1 <get_unix_datetime+0xc1>
mov    -0x10(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x27(%rbp)
movb   $0x0,-0x26(%rbp)
jmp    1208 <get_unix_datetime+0xd8>
mov    -0x10(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x27(%rbp)
mov    -0x10(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x26(%rbp)
movb   $0x0,-0x25(%rbp)
mov    -0x10(%rbp),%rax
mov    0x3(%rax),%al
mov    %al,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%al
mov    %al,-0x2b(%rbp)
mov    -0x10(%rbp),%rax
mov    0x5(%rax),%al
mov    %al,-0x2a(%rbp)
mov    -0x10(%rbp),%rax
mov    0x6(%rax),%al
mov    %al,-0x29(%rbp)
movb   $0x0,-0x28(%rbp)
lea    -0x27(%rbp),%rdi
lea    -0x20(%rbp),%rsi
call   1050 <get_int@plt>
cmp    $0x0,%rax
jne    1262 <get_unix_datetime+0x132>
lea    -0x2c(%rbp),%rdi
lea    -0x24(%rbp),%rsi
call   1050 <get_int@plt>
cmp    $0x0,%rax
je     126e <get_unix_datetime+0x13e>
movl   $0x1,-0x4(%rbp)
jmp    1350 <get_unix_datetime+0x220>
cmpl   $0x7b2,-0x24(%rbp)
jl     12b3 <get_unix_datetime+0x183>
cmpl   $0x7f6,-0x24(%rbp)
jg     12b3 <get_unix_datetime+0x183>
cmpl   $0x1,-0x20(%rbp)
jl     12b3 <get_unix_datetime+0x183>
cmpl   $0xc,-0x20(%rbp)
jg     12b3 <get_unix_datetime+0x183>
cmpl   $0x2,-0x20(%rbp)
jle    12bf <get_unix_datetime+0x18f>
cmpl   $0x7f6,-0x24(%rbp)
jne    12bf <get_unix_datetime+0x18f>
movl   $0x1,-0x4(%rbp)
jmp    1350 <get_unix_datetime+0x220>
jmp    12d0 <get_unix_datetime+0x1a0>
movl   $0x1,-0x4(%rbp)
jmp    1350 <get_unix_datetime+0x220>
jmp    12d5 <get_unix_datetime+0x1a5>
cmpl   $0x7f6,-0x24(%rbp)
jne    12fc <get_unix_datetime+0x1cc>
cmpl   $0x2,-0x20(%rbp)
jne    12fc <get_unix_datetime+0x1cc>
mov    -0x18(%rbp),%rax
movq   $0x7fffffff,(%rax)
jmp    1349 <get_unix_datetime+0x219>
mov    -0x24(%rbp),%eax
sub    $0x76c,%eax
mov    %eax,-0x38(%rbp)
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
movl   $0x1,-0x30(%rbp)
lea    -0x38(%rbp),%rdi
call   1040 <c_timegm@plt>
mov    %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
cmpq   $0x0,(%rax)
jge    1344 <get_unix_datetime+0x214>
movl   $0x1,-0x4(%rbp)
jmp    1350 <get_unix_datetime+0x220>
jmp    1349 <get_unix_datetime+0x219>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_unix_datetime>:
push   %rbp
push   %r14
push   %rbx
sub    $0x20,%rsp
mov    %rsi,%r14
mov    %rdi,%rbx
call   1030 <strlen@plt>
movl   $0x0,0x1c(%rsp)
mov    $0x1,%ebp
cmp    $0x7,%eax
je     11a8 <get_unix_datetime+0x78>
cmp    $0x4,%eax
jne    121b <get_unix_datetime+0xeb>
lea    0xc(%rsp),%rsi
mov    %rbx,%rdi
call   1050 <get_int@plt>
test   %rax,%rax
jne    121b <get_unix_datetime+0xeb>
xor    %ecx,%ecx
mov    0xc(%rsp),%eax
add    $0xfffff894,%eax
mov    %eax,0x10(%rsp)
add    $0xffffffff,%ecx
mov    %ecx,0x14(%rsp)
movl   $0x1,0x18(%rsp)
lea    0x10(%rsp),%rdi
call   1040 <c_timegm@plt>
mov    %rax,(%r14)
test   %rax,%rax
js     121b <get_unix_datetime+0xeb>
xor    %ebp,%ebp
jmp    121b <get_unix_datetime+0xeb>
mov    0x2(%rbx),%al
add    $0xd3,%al
cmp    $0x2,%al
ja     121b <get_unix_datetime+0xeb>
mov    (%rbx),%al
cmp    $0x30,%al
jne    11c2 <get_unix_datetime+0x92>
mov    0x1(%rbx),%al
mov    %al,0x9(%rsp)
xor    %eax,%eax
jmp    11ce <get_unix_datetime+0x9e>
mov    %al,0x9(%rsp)
mov    0x1(%rbx),%al
movb   $0x0,0xb(%rsp)
mov    %al,0xa(%rsp)
mov    0x3(%rbx),%al
mov    %al,0x10(%rsp)
mov    0x4(%rbx),%al
mov    %al,0x11(%rsp)
mov    0x5(%rbx),%al
mov    %al,0x12(%rsp)
mov    0x6(%rbx),%al
mov    %al,0x13(%rsp)
movb   $0x0,0x14(%rsp)
lea    0x9(%rsp),%rdi
lea    0x1c(%rsp),%rsi
call   1050 <get_int@plt>
test   %rax,%rax
jne    121b <get_unix_datetime+0xeb>
lea    0x10(%rsp),%rdi
lea    0xc(%rsp),%rsi
call   1050 <get_int@plt>
test   %rax,%rax
je     1226 <get_unix_datetime+0xf6>
mov    %ebp,%eax
add    $0x20,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret
mov    0xc(%rsp),%eax
lea    -0x7f7(%rax),%ecx
cmp    $0xffffffbb,%ecx
jb     121b <get_unix_datetime+0xeb>
mov    0x1c(%rsp),%ecx
test   %ecx,%ecx
jle    121b <get_unix_datetime+0xeb>
cmp    $0xc,%ecx
jg     121b <get_unix_datetime+0xeb>
cmp    $0x3,%ecx
jb     124e <get_unix_datetime+0x11e>
cmp    $0x7f6,%eax
je     121b <get_unix_datetime+0xeb>
cmp    $0x7f6,%eax
jne    117a <get_unix_datetime+0x4a>
cmp    $0x2,%ecx
jne    117a <get_unix_datetime+0x4a>
movq   $0x7fffffff,(%r14)
jmp    11a4 <get_unix_datetime+0x74>

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

LLVM IR (-O2):
%struct.tm = type { i32, i32, i32 }
define i32 @get_unix_datetime(i8* %0, i64* nocapture writeonly %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca [3 x i8]
%6 = alloca [5 x i8]
%7 = alloca %struct.tm
%8 = tail call i32 @strlen(i8* %0)
%9 = bitcast i32* %3 to i8*
store i32 0, i32* %3
%10 = bitcast i32* %4 to i8*
switch i32 %8, label %84 [
i32 4, label %11
i32 7, label %16
]
11: ; preds = %2
%12 = call i64 @get_int(i8* %0, i32* %4)
%13 = icmp eq i64 %12, 0
br i1 %13, label %14, label %84
14: ; preds = %11
%15 = load i32, i32* %4
br label %72
16: ; preds = %2
%17 = getelementptr inbounds i8, i8* %0, i64 2
%18 = load i8, i8* %17
%19 = add i8 %18, -45
%20 = icmp ult i8 %19, 3
br i1 %20, label %21, label %84
21: ; preds = %16
%22 = getelementptr inbounds [3 x i8], [3 x i8]* %5, i64 0, i64 0
%23 = getelementptr inbounds [5 x i8], [5 x i8]* %6, i64 0, i64 0
%24 = load i8, i8* %0
%25 = icmp eq i8 %24, 48
br i1 %25, label %26, label %29
26: ; preds = %21
%27 = getelementptr inbounds i8, i8* %0, i64 1
%28 = load i8, i8* %27
store i8 %28, i8* %22
br label %33
29: ; preds = %21
store i8 %24, i8* %22
%30 = getelementptr inbounds i8, i8* %0, i64 1
%31 = load i8, i8* %30
%32 = getelementptr inbounds [3 x i8], [3 x i8]* %5, i64 0, i64 2
store i8 0, i8* %32
br label %33
33: ; preds = %29, %26
%34 = phi i8 [ 0, %26 ], [ %31, %29 ]
%35 = getelementptr inbounds [3 x i8], [3 x i8]* %5, i64 0, i64 1
store i8 %34, i8* %35
%36 = getelementptr inbounds i8, i8* %0, i64 3
%37 = load i8, i8* %36
store i8 %37, i8* %23
%38 = getelementptr inbounds i8, i8* %0, i64 4
%39 = load i8, i8* %38
%40 = getelementptr inbounds [5 x i8], [5 x i8]* %6, i64 0, i64 1
store i8 %39, i8* %40
%41 = getelementptr inbounds i8, i8* %0, i64 5
%42 = load i8, i8* %41
%43 = getelementptr inbounds [5 x i8], [5 x i8]* %6, i64 0, i64 2
store i8 %42, i8* %43
%44 = getelementptr inbounds i8, i8* %0, i64 6
%45 = load i8, i8* %44
%46 = getelementptr inbounds [5 x i8], [5 x i8]* %6, i64 0, i64 3
store i8 %45, i8* %46
%47 = getelementptr inbounds [5 x i8], [5 x i8]* %6, i64 0, i64 4
store i8 0, i8* %47
%48 = call i64 @get_int(i8* %22, i32* %3)
%49 = icmp eq i64 %48, 0
br i1 %49, label %50, label %66
50: ; preds = %33
%51 = call i64 @get_int(i8* %23, i32* %4)
%52 = icmp eq i64 %51, 0
br i1 %52, label %53, label %66
53: ; preds = %50
%54 = load i32, i32* %4
%55 = add i32 %54, -2039
%56 = icmp ult i32 %55, -69
%57 = load i32, i32* %3
%58 = icmp slt i32 %57, 1
%59 = select i1 %56, i1 true, i1 %58
%60 = icmp sgt i32 %57, 12
%61 = select i1 %59, i1 true, i1 %60
br i1 %61, label %66, label %62
62: ; preds = %53
%63 = icmp ugt i32 %57, 2
%64 = icmp eq i32 %54, 2038
%65 = select i1 %63, i1 %64, i1 false
br i1 %65, label %66, label %67
66: ; preds = %53, %62, %33, %50
br label %84
67: ; preds = %62
%68 = icmp eq i32 %54, 2038
%69 = icmp eq i32 %57, 2
%70 = select i1 %68, i1 %69, i1 false
br i1 %70, label %71, label %72
71: ; preds = %67
store i64 2147483647, i64* %1
br label %83
72: ; preds = %14, %67
%73 = phi i32 [ %15, %14 ], [ %54, %67 ]
%74 = phi i32 [ 0, %14 ], [ %57, %67 ]
%75 = bitcast %struct.tm* %7 to i8*
%76 = getelementptr inbounds %struct.tm, %struct.tm* %7, i64 0, i32 0
%77 = add nsw i32 %73, -1900
store i32 %77, i32* %76
%78 = getelementptr inbounds %struct.tm, %struct.tm* %7, i64 0, i32 1
%79 = add nsw i32 %74, -1
store i32 %79, i32* %78
%80 = getelementptr inbounds %struct.tm, %struct.tm* %7, i64 0, i32 2
store i32 1, i32* %80
%81 = call i64 @c_timegm(%struct.tm* %7)
store i64 %81, i64* %1
%82 = icmp slt i64 %81, 0
br i1 %82, label %84, label %83
83: ; preds = %72, %71
br label %84
84: ; preds = %16, %2, %66, %11, %72, %83
%85 = phi i32 [ 0, %83 ], [ 1, %72 ], [ 1, %66 ], [ 1, %11 ], [ 1, %16 ], [ 1, %2 ]
ret i32 %85
}