#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 int u_int32_t;
struct tm {
  int tm_year;
  int tm_mon;
  int tm_mday;
  int tm_hour;
  int tm_min;
  int tm_sec;
};

/* Variables and functions */
void *datepart(char const *, int, int, int, int *);
int /*<<< orphan*/ memset(struct tm *, int /*<<< orphan*/, int);
unsigned int strlen(char const *);
u_int32_t ns_datetosecs(const char *cp, int *errp) {
  struct tm time;
  u_int32_t result;
  int mdays, i;
  static const int days_per_month[12] = {31, 28, 31, 30, 31, 30,
                                         31, 31, 30, 31, 30, 31};
  if (strlen(cp) != 14U) {
    *errp = 1;
    return (0);
  }
  *errp = 0;
  memset(&time, 0, sizeof time);
  time.tm_year = datepart(cp + 0, 4, 1990, 9999, errp) - 1900;
  time.tm_mon = datepart(cp + 4, 2, 01, 12, errp) - 1;
  time.tm_mday = datepart(cp + 6, 2, 01, 31, errp);
  time.tm_hour = datepart(cp + 8, 2, 00, 23, errp);
  time.tm_min = datepart(cp + 10, 2, 00, 59, errp);
  time.tm_sec = datepart(cp + 12, 2, 00, 59, errp);
  if (*errp)
    return (0);
  result = time.tm_sec;
  result += time.tm_min * 60;
  result += time.tm_hour * (60 * 60);
  result += (time.tm_mday - 1) * ((u_int32_t)24 * 60 * 60);
  mdays = 0;
  for (i = 0; i < time.tm_mon; i++)
    mdays += days_per_month[i];
  result += mdays * ((u_int32_t)24 * 60 * 60);
  if (time.tm_mon > 1 && ((((1900 + time.tm_year) % 4) == 0 &&
                           ((1900 + time.tm_year) % 100) != 0) ||
                          ((1900 + time.tm_year) % 400) == 0))
    result += ((u_int32_t)24 * 60 * 60);
  result += (time.tm_year - 70) * (((u_int32_t)24 * 60 * 60) * 365);
  for (i = 70; i < time.tm_year; i++)
    if (((((1900 + i) % 4) == 0 && ((1900 + i) % 100) != 0) ||
         ((1900 + i) % 400) == 0))
      result += ((u_int32_t)24 * 60 * 60);
  return (result);
}


x86 assembly (clang, -O0):
<ns_datetosecs>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0xe,%eax
je     1168 <ns_datetosecs+0x38>
mov    -0x18(%rbp),%rax
movl   $0x1,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    13d6 <ns_datetosecs+0x2a6>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
lea    -0x30(%rbp),%rdi
xor    %esi,%esi
mov    $0x18,%edx
call   1050 <memset@plt>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%r8
mov    $0x4,%esi
mov    $0x7c6,%edx
mov    $0x270f,%ecx
call   1040 <datepart@plt>
add    $0xfffffffffffff894,%rax
mov    %eax,-0x30(%rbp)
mov    -0x10(%rbp),%rdi
add    $0x4,%rdi
mov    -0x18(%rbp),%r8
mov    $0x2,%esi
mov    $0x1,%edx
mov    $0xc,%ecx
call   1040 <datepart@plt>
add    $0xffffffffffffffff,%rax
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%rdi
add    $0x6,%rdi
mov    -0x18(%rbp),%r8
mov    $0x2,%esi
mov    $0x1,%edx
mov    $0x1f,%ecx
call   1040 <datepart@plt>
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rdi
add    $0x8,%rdi
mov    -0x18(%rbp),%r8
mov    $0x2,%esi
xor    %edx,%edx
mov    $0x17,%ecx
call   1040 <datepart@plt>
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rdi
add    $0xa,%rdi
mov    -0x18(%rbp),%r8
mov    $0x2,%esi
xor    %edx,%edx
mov    $0x3b,%ecx
call   1040 <datepart@plt>
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
add    $0xc,%rdi
mov    -0x18(%rbp),%r8
mov    $0x2,%esi
xor    %edx,%edx
mov    $0x3b,%ecx
call   1040 <datepart@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
cmpl   $0x0,(%rax)
je     126a <ns_datetosecs+0x13a>
movl   $0x0,-0x4(%rbp)
jmp    13d6 <ns_datetosecs+0x2a6>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x34(%rbp)
imul   $0x3c,-0x20(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
imul   $0xe10,-0x24(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%eax
sub    $0x1,%eax
imul   $0x15180,%eax,%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    12d5 <ns_datetosecs+0x1a5>
movslq -0x3c(%rbp),%rcx
lea    0xd42(%rip),%rax
mov    (%rax,%rcx,4),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    12a7 <ns_datetosecs+0x177>
imul   $0x15180,-0x38(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x1,-0x2c(%rbp)
jle    1342 <ns_datetosecs+0x212>
mov    -0x30(%rbp),%eax
add    $0x76c,%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    131e <ns_datetosecs+0x1ee>
mov    -0x30(%rbp),%eax
add    $0x76c,%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1337 <ns_datetosecs+0x207>
mov    -0x30(%rbp),%eax
add    $0x76c,%eax
mov    $0x190,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1342 <ns_datetosecs+0x212>
mov    -0x34(%rbp),%eax
add    $0x15180,%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%eax
sub    $0x46,%eax
imul   $0x1e13380,%eax,%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
movl   $0x46,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    13d0 <ns_datetosecs+0x2a0>
mov    -0x3c(%rbp),%eax
add    $0x76c,%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1399 <ns_datetosecs+0x269>
mov    -0x3c(%rbp),%eax
add    $0x76c,%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    13b2 <ns_datetosecs+0x282>
mov    -0x3c(%rbp),%eax
add    $0x76c,%eax
mov    $0x190,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    13bd <ns_datetosecs+0x28d>
mov    -0x34(%rbp),%eax
add    $0x15180,%eax
mov    %eax,-0x34(%rbp)
jmp    13c2 <ns_datetosecs+0x292>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    135b <ns_datetosecs+0x22b>
mov    -0x34(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ns_datetosecs>:
push   %r15
push   %r14
push   %rbx
sub    $0x20,%rsp
mov    %rsi,%r14
mov    %rdi,%r15
call   1030 <strlen@plt>
cmp    $0xe,%eax
jne    124f <ns_datetosecs+0x11f>
movl   $0x0,(%r14)
lea    0x8(%rsp),%rdi
xor    %ebx,%ebx
xor    %esi,%esi
mov    $0x18,%edx
call   1050 <memset@plt>
mov    %r15,%rdi
mov    $0x4,%esi
mov    $0x7c6,%edx
mov    $0x270f,%ecx
mov    %r14,%r8
call   1040 <datepart@plt>
add    $0xfffff894,%eax
mov    %eax,0x8(%rsp)
lea    0x4(%r15),%rdi
mov    $0x2,%esi
mov    $0x1,%edx
mov    $0xc,%ecx
mov    %r14,%r8
call   1040 <datepart@plt>
add    $0xffffffff,%eax
mov    %eax,0xc(%rsp)
lea    0x6(%r15),%rdi
mov    $0x2,%esi
mov    $0x1,%edx
mov    $0x1f,%ecx
mov    %r14,%r8
call   1040 <datepart@plt>
mov    %eax,0x10(%rsp)
lea    0x8(%r15),%rdi
mov    $0x2,%esi
xor    %edx,%edx
mov    $0x17,%ecx
mov    %r14,%r8
call   1040 <datepart@plt>
mov    %eax,0x14(%rsp)
lea    0xa(%r15),%rdi
mov    $0x2,%esi
xor    %edx,%edx
mov    $0x3b,%ecx
mov    %r14,%r8
call   1040 <datepart@plt>
mov    %eax,0x18(%rsp)
add    $0xc,%r15
mov    %r15,%rdi
mov    $0x2,%esi
xor    %edx,%edx
mov    $0x3b,%ecx
mov    %r14,%r8
call   1040 <datepart@plt>
cmpl   $0x0,(%r14)
jne    1258 <ns_datetosecs+0x128>
imul   $0x3c,0x18(%rsp),%r9d
imul   $0xe10,0x14(%rsp),%r8d
mov    0xc(%rsp),%ecx
mov    0x10(%rsp),%r10d
test   %ecx,%ecx
jle    1264 <ns_datetosecs+0x134>
cmp    $0x8,%ecx
jae    126b <ns_datetosecs+0x13b>
xor    %r11d,%r11d
xor    %edx,%edx
jmp    1343 <ns_datetosecs+0x213>
movl   $0x1,(%r14)
xor    %ebx,%ebx
mov    %ebx,%eax
add    $0x20,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret
xor    %edx,%edx
jmp    136c <ns_datetosecs+0x23c>
mov    %ecx,%r11d
and    $0xfffffff8,%r11d
lea    -0x8(%r11),%rsi
mov    %rsi,%rdx
shr    $0x3,%rdx
add    $0x1,%rdx
mov    %edx,%edi
and    $0x3,%edi
cmp    $0x18,%rsi
jae    1298 <ns_datetosecs+0x168>
pxor   %xmm0,%xmm0
xor    %esi,%esi
pxor   %xmm1,%xmm1
jmp    12e9 <ns_datetosecs+0x1b9>
and    $0xfffffffffffffffc,%rdx
pxor   %xmm0,%xmm0
xor    %esi,%esi
lea    0xd57(%rip),%rbx
pxor   %xmm1,%xmm1
nopl   (%rax)
paddd  (%rbx,%rsi,4),%xmm0
paddd  0x10(%rbx,%rsi,4),%xmm1
paddd  0x20(%rbx,%rsi,4),%xmm0
paddd  0x30(%rbx,%rsi,4),%xmm1
paddd  0x40(%rbx,%rsi,4),%xmm0
paddd  0x50(%rbx,%rsi,4),%xmm1
paddd  0x60(%rbx,%rsi,4),%xmm0
paddd  0x70(%rbx,%rsi,4),%xmm1
add    $0x20,%rsi
add    $0xfffffffffffffffc,%rdx
jne    12b0 <ns_datetosecs+0x180>
test   %rdi,%rdi
je     1324 <ns_datetosecs+0x1f4>
lea    0xd0b(%rip),%rdx
lea    (%rdx,%rsi,4),%rdx
add    $0x10,%rdx
shl    $0x5,%rdi
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
paddd  -0x10(%rdx,%rsi,1),%xmm0
paddd  (%rdx,%rsi,1),%xmm1
add    $0x20,%rsi
cmp    %rsi,%rdi
jne    1310 <ns_datetosecs+0x1e0>
paddd  %xmm1,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddd  %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
paddd  %xmm1,%xmm0
movd   %xmm0,%edx
cmp    %rcx,%r11
je     136c <ns_datetosecs+0x23c>
lea    0xcb6(%rip),%rsi
lea    (%rsi,%r11,4),%rsi
mov    %rcx,%rdi
sub    %r11,%rdi
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
add    (%rsi,%rbx,4),%edx
add    $0x1,%rbx
cmp    %rbx,%rdi
jne    1360 <ns_datetosecs+0x230>
add    %r10d,%edx
imul   $0x15180,%edx,%edx
add    %r9d,%eax
add    %r8d,%eax
add    %eax,%edx
add    $0xfffeae80,%edx
mov    0x8(%rsp),%r8d
cmp    $0x2,%ecx
jl     13c3 <ns_datetosecs+0x293>
imul   $0xc28f5c29,%r8d,%ecx
add    $0x51eb89c,%ecx
mov    %ecx,%esi
ror    $0x2,%esi
ror    $0x4,%ecx
lea    0x15180(%rdx),%edi
cmp    $0xa3d70b,%ecx
cmovb  %edi,%edx
cmp    $0x28f5c29,%esi
cmovb  %edx,%edi
test   $0x3,%r8b
cmovne %edx,%edi
mov    %edi,%edx
imul   $0x1e13380,%r8d,%ecx
lea    (%rdx,%rcx,1),%edi
add    $0x7c6beb00,%edi
cmp    $0x47,%r8d
jl     143a <ns_datetosecs+0x30a>
mov    $0x46,%ecx
mov    $0xfffff84e,%edx
mov    $0x7b2,%esi
nopl   0x0(%rax,%rax,1)
mov    %esi,%ebx
imul   $0x51eb851f,%rbx,%rax
mov    %rax,%rbx
shr    $0x27,%rbx
imul   $0x190,%ebx,%r9d
shr    $0x25,%rax
imul   $0x64,%eax,%eax
lea    0x15180(%rdi),%ebx
add    %edx,%r9d
cmove  %ebx,%edi
add    %edx,%eax
cmove  %edi,%ebx
test   $0x3,%cl
cmovne %edi,%ebx
add    $0x1,%ecx
add    $0xffffffff,%edx
add    $0x1,%esi
mov    %ebx,%edi
cmp    %ecx,%r8d
jne    13f0 <ns_datetosecs+0x2c0>
jmp    1258 <ns_datetosecs+0x128>
mov    %edi,%ebx
jmp    1258 <ns_datetosecs+0x128>

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

LLVM IR (-O2):
%struct.tm = type { i32, i32, i32, i32, i32, i32 }
@ns_datetosecs.days_per_month = internal unnamed_addr constant [12 x i32] [i32 31, i32 28, i32 31, i32 30, i32 31, i32 30, i32 31, i32 31, i32 30, i32 31, i32 30, i32 31]
define i32 @ns_datetosecs(i8* %0, i32* %1) {
%3 = alloca %struct.tm
%4 = bitcast %struct.tm* %3 to i8*
%5 = tail call i32 @strlen(i8* %0)
%6 = icmp eq i32 %5, 14
br i1 %6, label %8, label %7
7: ; preds = %2
store i32 1, i32* %1
br label %189
8: ; preds = %2
store i32 0, i32* %1
%9 = call i32 @memset(%struct.tm* %3, i32 0, i32 24)
%10 = call i8* @datepart(i8* %0, i32 4, i32 1990, i32 9999, i32* %1)
%11 = getelementptr i8, i8* %10, i64 -1900
%12 = ptrtoint i8* %11 to i64
%13 = trunc i64 %12 to i32
%14 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 0
store i32 %13, i32* %14
%15 = getelementptr inbounds i8, i8* %0, i64 4
%16 = call i8* @datepart(i8* %15, i32 2, i32 1, i32 12, i32* %1)
%17 = getelementptr i8, i8* %16, i64 -1
%18 = ptrtoint i8* %17 to i64
%19 = trunc i64 %18 to i32
%20 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 1
store i32 %19, i32* %20
%21 = getelementptr inbounds i8, i8* %0, i64 6
%22 = call i8* @datepart(i8* %21, i32 2, i32 1, i32 31, i32* %1)
%23 = ptrtoint i8* %22 to i64
%24 = trunc i64 %23 to i32
%25 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 2
store i32 %24, i32* %25
%26 = getelementptr inbounds i8, i8* %0, i64 8
%27 = call i8* @datepart(i8* %26, i32 2, i32 0, i32 23, i32* %1)
%28 = ptrtoint i8* %27 to i64
%29 = trunc i64 %28 to i32
%30 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 3
store i32 %29, i32* %30
%31 = getelementptr inbounds i8, i8* %0, i64 10
%32 = call i8* @datepart(i8* %31, i32 2, i32 0, i32 59, i32* %1)
%33 = ptrtoint i8* %32 to i64
%34 = trunc i64 %33 to i32
%35 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 4
store i32 %34, i32* %35
%36 = getelementptr inbounds i8, i8* %0, i64 12
%37 = call i8* @datepart(i8* %36, i32 2, i32 0, i32 59, i32* %1)
%38 = ptrtoint i8* %37 to i64
%39 = trunc i64 %38 to i32
%40 = load i32, i32* %1
%41 = icmp eq i32 %40, 0
br i1 %41, label %42, label %189
42: ; preds = %8
%43 = load i32, i32* %35
%44 = mul nsw i32 %43, 60
%45 = load i32, i32* %30
%46 = mul nsw i32 %45, 3600
%47 = load i32, i32* %25
%48 = load i32, i32* %20
%49 = icmp sgt i32 %48, 0
br i1 %49, label %50, label %145
50: ; preds = %42
%51 = zext i32 %48 to i64
%52 = icmp ult i32 %48, 8
br i1 %52, label %134, label %53
53: ; preds = %50
%54 = and i64 %51, 4294967288
%55 = add nsw i64 %54, -8
%56 = lshr exact i64 %55, 3
%57 = add nuw nsw i64 %56, 1
%58 = and i64 %57, 3
%59 = icmp ult i64 %55, 24
br i1 %59, label %105, label %60
60: ; preds = %53
%61 = and i64 %57, 4611686018427387900
br label %62
62: ; preds = %62, %60
%63 = phi i64 [ 0, %60 ], [ %102, %62 ]
%64 = phi <4 x i32> [ zeroinitializer, %60 ], [ %100, %62 ]
%65 = phi <4 x i32> [ zeroinitializer, %60 ], [ %101, %62 ]
%66 = phi i64 [ 0, %60 ], [ %103, %62 ]
%67 = getelementptr inbounds [12 x i32], [12 x i32]* @ns_datetosecs.days_per_month, i64 0, i64 %63
%68 = bitcast i32* %67 to <4 x i32>*
%69 = load <4 x i32>, <4 x i32>* %68
%70 = getelementptr inbounds i32, i32* %67, i64 4
%71 = bitcast i32* %70 to <4 x i32>*
%72 = load <4 x i32>, <4 x i32>* %71
%73 = add <4 x i32> %69, %64
%74 = add <4 x i32> %72, %65
%75 = or i64 %63, 8
%76 = getelementptr inbounds [12 x i32], [12 x i32]* @ns_datetosecs.days_per_month, i64 0, i64 %75
%77 = bitcast i32* %76 to <4 x i32>*
%78 = load <4 x i32>, <4 x i32>* %77
%79 = getelementptr inbounds i32, i32* %76, i64 4
%80 = bitcast i32* %79 to <4 x i32>*
%81 = load <4 x i32>, <4 x i32>* %80
%82 = add <4 x i32> %78, %73
%83 = add <4 x i32> %81, %74
%84 = or i64 %63, 16
%85 = getelementptr inbounds [12 x i32], [12 x i32]* @ns_datetosecs.days_per_month, i64 0, i64 %84
%86 = bitcast i32* %85 to <4 x i32>*
%87 = load <4 x i32>, <4 x i32>* %86
%88 = getelementptr inbounds i32, i32* %85, i64 4
%89 = bitcast i32* %88 to <4 x i32>*
%90 = load <4 x i32>, <4 x i32>* %89
%91 = add <4 x i32> %87, %82
%92 = add <4 x i32> %90, %83
%93 = or i64 %63, 24
%94 = getelementptr inbounds [12 x i32], [12 x i32]* @ns_datetosecs.days_per_month, i64 0, i64 %93
%95 = bitcast i32* %94 to <4 x i32>*
%96 = load <4 x i32>, <4 x i32>* %95
%97 = getelementptr inbounds i32, i32* %94, i64 4
%98 = bitcast i32* %97 to <4 x i32>*
%99 = load <4 x i32>, <4 x i32>* %98
%100 = add <4 x i32> %96, %91
%101 = add <4 x i32> %99, %92
%102 = add nuw i64 %63, 32
%103 = add i64 %66, 4
%104 = icmp eq i64 %103, %61
br i1 %104, label %105, label %62
105: ; preds = %62, %53
%106 = phi <4 x i32> [ undef, %53 ], [ %100, %62 ]
%107 = phi <4 x i32> [ undef, %53 ], [ %101, %62 ]
%108 = phi i64 [ 0, %53 ], [ %102, %62 ]
%109 = phi <4 x i32> [ zeroinitializer, %53 ], [ %100, %62 ]
%110 = phi <4 x i32> [ zeroinitializer, %53 ], [ %101, %62 ]
%111 = icmp eq i64 %58, 0
br i1 %111, label %128, label %112
112: ; preds = %105, %112
%113 = phi i64 [ %125, %112 ], [ %108, %105 ]
%114 = phi <4 x i32> [ %123, %112 ], [ %109, %105 ]
%115 = phi <4 x i32> [ %124, %112 ], [ %110, %105 ]
%116 = phi i64 [ %126, %112 ], [ 0, %105 ]
%117 = getelementptr inbounds [12 x i32], [12 x i32]* @ns_datetosecs.days_per_month, i64 0, i64 %113
%118 = bitcast i32* %117 to <4 x i32>*
%119 = load <4 x i32>, <4 x i32>* %118
%120 = getelementptr inbounds i32, i32* %117, i64 4
%121 = bitcast i32* %120 to <4 x i32>*
%122 = load <4 x i32>, <4 x i32>* %121
%123 = add <4 x i32> %119, %114
%124 = add <4 x i32> %122, %115
%125 = add nuw i64 %113, 8
%126 = add i64 %116, 1
%127 = icmp eq i64 %126, %58
br i1 %127, label %128, label %112
128: ; preds = %112, %105
%129 = phi <4 x i32> [ %106, %105 ], [ %123, %112 ]
%130 = phi <4 x i32> [ %107, %105 ], [ %124, %112 ]
%131 = add <4 x i32> %130, %129
%132 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %131)
%133 = icmp eq i64 %54, %51
br i1 %133, label %145, label %134
134: ; preds = %50, %128
%135 = phi i64 [ 0, %50 ], [ %54, %128 ]
%136 = phi i32 [ 0, %50 ], [ %132, %128 ]
br label %137
137: ; preds = %134, %137
%138 = phi i64 [ %143, %137 ], [ %135, %134 ]
%139 = phi i32 [ %142, %137 ], [ %136, %134 ]
%140 = getelementptr inbounds [12 x i32], [12 x i32]* @ns_datetosecs.days_per_month, i64 0, i64 %138
%141 = load i32, i32* %140
%142 = add nsw i32 %141, %139
%143 = add nuw nsw i64 %138, 1
%144 = icmp eq i64 %143, %51
br i1 %144, label %145, label %137
145: ; preds = %137, %128, %42
%146 = phi i32 [ 0, %42 ], [ %132, %128 ], [ %142, %137 ]
%147 = add i32 %146, %47
%148 = mul i32 %147, 86400
%149 = add i32 %39, -86400
%150 = add i32 %149, %44
%151 = add i32 %150, %46
%152 = add i32 %151, %148
%153 = icmp sgt i32 %48, 1
%154 = load i32, i32* %14
br i1 %153, label %155, label %167
155: ; preds = %145
%156 = and i32 %154, 3
%157 = icmp eq i32 %156, 0
%158 = add nsw i32 %154, 1900
%159 = srem i32 %158, 100
%160 = icmp ne i32 %159, 0
%161 = select i1 %157, i1 %160, i1 false
%162 = srem i32 %158, 400
%163 = icmp eq i32 %162, 0
%164 = select i1 %161, i1 true, i1 %163
%165 = add nsw i32 %152, 86400
%166 = select i1 %164, i32 %165, i32 %152
br label %167
167: ; preds = %155, %145
%168 = phi i32 [ %152, %145 ], [ %166, %155 ]
%169 = mul i32 %154, 31536000
%170 = add i32 %168, 2087447296
%171 = add i32 %170, %169
%172 = icmp sgt i32 %154, 70
br i1 %172, label %173, label %189
173: ; preds = %167, %173
%174 = phi i32 [ %187, %173 ], [ 70, %167 ]
%175 = phi i32 [ %186, %173 ], [ %171, %167 ]
%176 = add nuw nsw i32 %174, 1900
%177 = and i32 %174, 3
%178 = icmp eq i32 %177, 0
%179 = urem i32 %176, 100
%180 = icmp ne i32 %179, 0
%181 = select i1 %178, i1 %180, i1 false
%182 = urem i32 %176, 400
%183 = icmp eq i32 %182, 0
%184 = select i1 %181, i1 true, i1 %183
%185 = add nsw i32 %175, 86400
%186 = select i1 %184, i32 %185, i32 %175
%187 = add nuw nsw i32 %174, 1
%188 = icmp eq i32 %187, %154
br i1 %188, label %189, label %173
189: ; preds = %173, %167, %8, %7
%190 = phi i32 [ 0, %7 ], [ 0, %8 ], [ %171, %167 ], [ %186, %173 ]
ret i32 %190
}