#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 /*<<< orphan*/ time_t;
struct tm {
  char tm_sec;
  char tm_min;
  char tm_hour;
  char tm_mday;
  char tm_mon;
  int tm_year;
};
struct timespec {
  scalar_t__ tv_nsec;
  int /*<<< orphan*/ tv_sec;
};

/* Variables and functions */
int /*<<< orphan*/ err(int, char *);
int /*<<< orphan*/ isdigit(char const);
struct tm *localtime(int /*<<< orphan*/ *);
int /*<<< orphan*/ mktime(struct tm *);
size_t strlen(char const *);
int /*<<< orphan*/ time(int /*<<< orphan*/ *);
bool parseTime(const char *str, struct timespec *ts) {
  size_t length = strlen(str);
  if (length < 8 || length == 9 || length == 14 || length > 15)
    return false;
  for (size_t i = 0; i < length; i++) {
    if (length % 2 && i == length - 3) {
      if (str[i] != '.')
        return false;
      continue;
    }
    if (!isdigit(str[i]))
      return false;
  }
  struct tm tm;
  tm.tm_sec = 0;
  if (length % 2) {
    if (str[length - 3] != '.')
      return false;
    tm.tm_sec = (str[length - 2] - '0') * 10 + str[length - 1] - '0';
    if (tm.tm_sec > 60)
      return false;
    length -= 3;
  }
  tm.tm_min = (str[length - 2] - '0') * 10 + str[length - 1] - '0';
  if (tm.tm_min > 59)
    return false;
  tm.tm_hour = (str[length - 4] - '0') * 10 + str[length - 3] - '0';
  if (tm.tm_hour > 23)
    return false;
  tm.tm_mday = (str[length - 6] - '0') * 10 + str[length - 5] - '0';
  if (tm.tm_mday == 0 || tm.tm_mday > 31)
    return false;
  tm.tm_mon = (str[length - 8] - '0') * 10 + str[length - 7] - '0' - 1;
  if (tm.tm_mon < 0 || tm.tm_mon >= 12)
    return false;
  int year;
  if (length >= 10) {
    year = (str[length - 10] - '0') * 10 + str[length - 9] - '0';
    if (length == 12) {
      year += (str[0] - '0') * 1000 + (str[1] - '0') * 100;
    } else if (year >= 69) {
      year += 1900;
    } else {
      year += 2000;
    }
  } else {
    time_t t = time(NULL);
    struct tm *now = localtime(&t);
    if (!now)
      err(1, "localtime");
    year = now->tm_year;
  }
  tm.tm_year = year - 1900;
  ts->tv_sec = mktime(&tm);
  ts->tv_nsec = 0;
  return true;
}


x86 assembly (clang, -O0):
<parseTime>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,-0x20(%rbp)
cmpq   $0x8,-0x20(%rbp)
jb     11a9 <parseTime+0x49>
cmpq   $0x9,-0x20(%rbp)
je     11a9 <parseTime+0x49>
cmpq   $0xe,-0x20(%rbp)
je     11a9 <parseTime+0x49>
cmpq   $0xf,-0x20(%rbp)
jbe    11b5 <parseTime+0x55>
movl   $0x0,-0x4(%rbp)
jmp    1527 <parseTime+0x3c7>
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    1254 <parseTime+0xf4>
mov    -0x20(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     1218 <parseTime+0xb8>
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x3,%rcx
cmp    %rcx,%rax
jne    1218 <parseTime+0xb8>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
je     1213 <parseTime+0xb3>
movl   $0x0,-0x4(%rbp)
jmp    1527 <parseTime+0x3c7>
jmp    1243 <parseTime+0xe3>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%eax
jne    123e <parseTime+0xde>
movl   $0x0,-0x4(%rbp)
jmp    1527 <parseTime+0x3c7>
jmp    1243 <parseTime+0xe3>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    11bd <parseTime+0x5d>
movb   $0x0,-0x38(%rbp)
mov    -0x20(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     12e2 <parseTime+0x182>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x3,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
je     128f <parseTime+0x12f>
movl   $0x0,-0x4(%rbp)
jmp    1527 <parseTime+0x3c7>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x2,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rdx
sub    $0x1,%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %al,-0x38(%rbp)
movsbl -0x38(%rbp),%eax
cmp    $0x3c,%eax
jle    12d6 <parseTime+0x176>
movl   $0x0,-0x4(%rbp)
jmp    1527 <parseTime+0x3c7>
mov    -0x20(%rbp),%rax
sub    $0x3,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x2,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rdx
sub    $0x1,%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %al,-0x37(%rbp)
movsbl -0x37(%rbp),%eax
cmp    $0x3b,%eax
jle    1329 <parseTime+0x1c9>
movl   $0x0,-0x4(%rbp)
jmp    1527 <parseTime+0x3c7>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x4,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rdx
sub    $0x3,%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %al,-0x36(%rbp)
movsbl -0x36(%rbp),%eax
cmp    $0x17,%eax
jle    1370 <parseTime+0x210>
movl   $0x0,-0x4(%rbp)
jmp    1527 <parseTime+0x3c7>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x6,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rdx
sub    $0x5,%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %al,-0x35(%rbp)
movsbl -0x35(%rbp),%eax
cmp    $0x0,%eax
je     13b8 <parseTime+0x258>
movsbl -0x35(%rbp),%eax
cmp    $0x1f,%eax
jle    13c4 <parseTime+0x264>
movl   $0x0,-0x4(%rbp)
jmp    1527 <parseTime+0x3c7>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x8,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rdx
sub    $0x7,%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
sub    $0x1,%eax
mov    %al,-0x34(%rbp)
movsbl -0x34(%rbp),%eax
cmp    $0x0,%eax
jl     140f <parseTime+0x2af>
movsbl -0x34(%rbp),%eax
cmp    $0xc,%eax
jl     141b <parseTime+0x2bb>
movl   $0x0,-0x4(%rbp)
jmp    1527 <parseTime+0x3c7>
cmpq   $0xa,-0x20(%rbp)
jb     14b9 <parseTime+0x359>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0xa,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rdx
sub    $0x9,%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x3c(%rbp)
cmpq   $0xc,-0x20(%rbp)
jne    148a <parseTime+0x32a>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
imul   $0x3e8,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
sub    $0x30,%ecx
imul   $0x64,%ecx,%ecx
add    %ecx,%eax
add    -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    14b4 <parseTime+0x354>
cmpl   $0x45,-0x3c(%rbp)
jl     14a4 <parseTime+0x344>
mov    -0x3c(%rbp),%eax
add    $0x76c,%eax
mov    %eax,-0x3c(%rbp)
jmp    14af <parseTime+0x34f>
mov    -0x3c(%rbp),%eax
add    $0x7d0,%eax
mov    %eax,-0x3c(%rbp)
jmp    14b4 <parseTime+0x354>
jmp    14f8 <parseTime+0x398>
xor    %eax,%eax
mov    %eax,%edi
call   1060 <time@plt>
mov    %eax,-0x40(%rbp)
lea    -0x40(%rbp),%rdi
call   1030 <localtime@plt>
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x48(%rbp)
jne    14ee <parseTime+0x38e>
mov    $0x1,%edi
lea    0xb17(%rip),%rsi
call   1070 <err@plt>
mov    -0x48(%rbp),%rax
mov    0x8(%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
sub    $0x76c,%eax
mov    %eax,-0x30(%rbp)
lea    -0x38(%rbp),%rdi
call   1080 <mktime@plt>
mov    %eax,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x18(%rbp),%rax
movq   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<parseTime>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    %rsi,%r14
mov    %rdi,%r15
call   1050 <strlen@plt>
mov    %rax,%r13
xor    %eax,%eax
cmp    $0xf,%r13
ja     133a <parseTime+0x1da>
je     1198 <parseTime+0x38>
mov    $0x42ff,%ecx
bt     %r13d,%ecx
jb     133a <parseTime+0x1da>
lea    -0x3(%r13),%r12
xor    %ebx,%ebx
jmp    11b7 <parseTime+0x57>
movsbl (%r15,%rbx,1),%edi
call   1040 <isdigit@plt>
test   %eax,%eax
je     11ca <parseTime+0x6a>
add    $0x1,%rbx
cmp    %rbx,%r13
je     11d1 <parseTime+0x71>
test   $0x1,%r13b
je     11a0 <parseTime+0x40>
cmp    %rbx,%r12
jne    11a0 <parseTime+0x40>
cmpb   $0x2e,-0x3(%r15,%r13,1)
je     11ae <parseTime+0x4e>
xor    %eax,%eax
jmp    133a <parseTime+0x1da>
movb   $0x0,(%rsp)
test   $0x1,%r13b
jne    11e0 <parseTime+0x80>
mov    %r13,%r12
jmp    120d <parseTime+0xad>
xor    %eax,%eax
cmpb   $0x2e,-0x3(%r15,%r13,1)
jne    133a <parseTime+0x1da>
movzbl -0x2(%r13,%r15,1),%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
add    -0x1(%r13,%r15,1),%cl
add    $0xf0,%cl
mov    %cl,(%rsp)
cmp    $0x3c,%cl
jg     133a <parseTime+0x1da>
movzbl -0x2(%r12,%r15,1),%eax
add    %eax,%eax
lea    (%rax,%rax,4),%ecx
add    -0x1(%r12,%r15,1),%cl
add    $0xf0,%cl
mov    %cl,0x1(%rsp)
xor    %eax,%eax
cmp    $0x3b,%cl
jg     133a <parseTime+0x1da>
movzbl -0x4(%r12,%r15,1),%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
add    -0x3(%r12,%r15,1),%cl
add    $0xf0,%cl
mov    %cl,0x2(%rsp)
cmp    $0x17,%cl
jg     133a <parseTime+0x1da>
movzbl -0x6(%r12,%r15,1),%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
add    -0x5(%r12,%r15,1),%cl
add    $0xf0,%cl
mov    %cl,0x3(%rsp)
je     133a <parseTime+0x1da>
cmp    $0x1f,%cl
jg     133a <parseTime+0x1da>
movzbl -0x8(%r12,%r15,1),%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
add    -0x7(%r12,%r15,1),%cl
add    $0xef,%cl
mov    %cl,0x4(%rsp)
cmp    $0xb,%cl
ja     133a <parseTime+0x1da>
cmp    $0xa,%r12
jb     12d5 <parseTime+0x175>
movsbl -0xa(%r12,%r15,1),%eax
lea    (%rax,%rax,4),%eax
movsbl -0x9(%r12,%r15,1),%ecx
lea    (%rcx,%rax,2),%eax
add    $0xfffffe20,%eax
cmp    $0xc,%r12
jne    1308 <parseTime+0x1a8>
movsbl (%r15),%ecx
imul   $0x3e8,%ecx,%ecx
movsbl 0x1(%r15),%edx
imul   $0x64,%edx,%edx
add    %ecx,%eax
add    %edx,%eax
add    $0xffff3190,%eax
jmp    1319 <parseTime+0x1b9>
xor    %edi,%edi
call   1060 <time@plt>
mov    %eax,0xc(%rsp)
lea    0xc(%rsp),%rdi
call   1030 <localtime@plt>
mov    %rax,%rbx
test   %rax,%rax
jne    1303 <parseTime+0x1a3>
lea    0xd07(%rip),%rsi
mov    $0x1,%edi
call   1070 <err@plt>
mov    0x8(%rbx),%eax
jmp    1319 <parseTime+0x1b9>
cmp    $0x75,%eax
jl     1314 <parseTime+0x1b4>
add    $0x73c,%eax
jmp    1319 <parseTime+0x1b9>
add    $0x7a0,%eax
add    $0xfffff894,%eax
mov    %eax,0x8(%rsp)
mov    %rsp,%rdi
call   1080 <mktime@plt>
mov    %eax,0x8(%r14)
movq   $0x0,(%r14)
mov    $0x1,%eax
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
%struct.timespec = type { i64, i32 }
%struct.tm = type { i8, i8, i8, i8, i8, i32 }
@.str = [10 x i8] c"localtime\00"
define i32 @parseTime(i8* %0, %struct.timespec* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca %struct.timespec*
%6 = alloca i64
%7 = alloca i64
%8 = alloca %struct.tm
%9 = alloca i32
%10 = alloca i32
%11 = alloca %struct.tm*
store i8* %0, i8** %4
store %struct.timespec* %1, %struct.timespec** %5
%12 = load i8*, i8** %4
%13 = call i64 @strlen(i8* %12)
store i64 %13, i64* %6
%14 = load i64, i64* %6
%15 = icmp ult i64 %14, 8
br i1 %15, label %25, label %16
16: ; preds = %2
%17 = load i64, i64* %6
%18 = icmp eq i64 %17, 9
br i1 %18, label %25, label %19
19: ; preds = %16
%20 = load i64, i64* %6
%21 = icmp eq i64 %20, 14
br i1 %21, label %25, label %22
22: ; preds = %19
%23 = load i64, i64* %6
%24 = icmp ugt i64 %23, 15
br i1 %24, label %25, label %26
25: ; preds = %22, %19, %16, %2
store i32 0, i32* %3
br label %278
26: ; preds = %22
store i64 0, i64* %7
br label %27
27: ; preds = %58, %26
%28 = load i64, i64* %7
%29 = load i64, i64* %6
%30 = icmp ult i64 %28, %29
br i1 %30, label %31, label %61
31: ; preds = %27
%32 = load i64, i64* %6
%33 = urem i64 %32, 2
%34 = icmp ne i64 %33, 0
br i1 %34, label %35, label %49
35: ; preds = %31
%36 = load i64, i64* %7
%37 = load i64, i64* %6
%38 = sub i64 %37, 3
%39 = icmp eq i64 %36, %38
br i1 %39, label %40, label %49
40: ; preds = %35
%41 = load i8*, i8** %4
%42 = load i64, i64* %7
%43 = getelementptr inbounds i8, i8* %41, i64 %42
%44 = load i8, i8* %43
%45 = sext i8 %44 to i32
%46 = icmp ne i32 %45, 46
br i1 %46, label %47, label %48
47: ; preds = %40
store i32 0, i32* %3
br label %278
48: ; preds = %40
br label %58
49: ; preds = %35, %31
%50 = load i8*, i8** %4
%51 = load i64, i64* %7
%52 = getelementptr inbounds i8, i8* %50, i64 %51
%53 = load i8, i8* %52
%54 = call i32 @isdigit(i8 signext %53)
%55 = icmp ne i32 %54, 0
br i1 %55, label %57, label %56
56: ; preds = %49
store i32 0, i32* %3
br label %278
57: ; preds = %49
br label %58
58: ; preds = %57, %48
%59 = load i64, i64* %7
%60 = add i64 %59, 1
store i64 %60, i64* %7
br label %27
61: ; preds = %27
%62 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 0
store i8 0, i8* %62
%63 = load i64, i64* %6
%64 = urem i64 %63, 2
%65 = icmp ne i64 %64, 0
br i1 %65, label %66, label %102
66: ; preds = %61
%67 = load i8*, i8** %4
%68 = load i64, i64* %6
%69 = sub i64 %68, 3
%70 = getelementptr inbounds i8, i8* %67, i64 %69
%71 = load i8, i8* %70
%72 = sext i8 %71 to i32
%73 = icmp ne i32 %72, 46
br i1 %73, label %74, label %75
74: ; preds = %66
store i32 0, i32* %3
br label %278
75: ; preds = %66
%76 = load i8*, i8** %4
%77 = load i64, i64* %6
%78 = sub i64 %77, 2
%79 = getelementptr inbounds i8, i8* %76, i64 %78
%80 = load i8, i8* %79
%81 = sext i8 %80 to i32
%82 = sub nsw i32 %81, 48
%83 = mul nsw i32 %82, 10
%84 = load i8*, i8** %4
%85 = load i64, i64* %6
%86 = sub i64 %85, 1
%87 = getelementptr inbounds i8, i8* %84, i64 %86
%88 = load i8, i8* %87
%89 = sext i8 %88 to i32
%90 = add nsw i32 %83, %89
%91 = sub nsw i32 %90, 48
%92 = trunc i32 %91 to i8
%93 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 0
store i8 %92, i8* %93
%94 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 0
%95 = load i8, i8* %94
%96 = sext i8 %95 to i32
%97 = icmp sgt i32 %96, 60
br i1 %97, label %98, label %99
98: ; preds = %75
store i32 0, i32* %3
br label %278
99: ; preds = %75
%100 = load i64, i64* %6
%101 = sub i64 %100, 3
store i64 %101, i64* %6
br label %102
102: ; preds = %99, %61
%103 = load i8*, i8** %4
%104 = load i64, i64* %6
%105 = sub i64 %104, 2
%106 = getelementptr inbounds i8, i8* %103, i64 %105
%107 = load i8, i8* %106
%108 = sext i8 %107 to i32
%109 = sub nsw i32 %108, 48
%110 = mul nsw i32 %109, 10
%111 = load i8*, i8** %4
%112 = load i64, i64* %6
%113 = sub i64 %112, 1
%114 = getelementptr inbounds i8, i8* %111, i64 %113
%115 = load i8, i8* %114
%116 = sext i8 %115 to i32
%117 = add nsw i32 %110, %116
%118 = sub nsw i32 %117, 48
%119 = trunc i32 %118 to i8
%120 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 1
store i8 %119, i8* %120
%121 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 1
%122 = load i8, i8* %121
%123 = sext i8 %122 to i32
%124 = icmp sgt i32 %123, 59
br i1 %124, label %125, label %126
125: ; preds = %102
store i32 0, i32* %3
br label %278
126: ; preds = %102
%127 = load i8*, i8** %4
%128 = load i64, i64* %6
%129 = sub i64 %128, 4
%130 = getelementptr inbounds i8, i8* %127, i64 %129
%131 = load i8, i8* %130
%132 = sext i8 %131 to i32
%133 = sub nsw i32 %132, 48
%134 = mul nsw i32 %133, 10
%135 = load i8*, i8** %4
%136 = load i64, i64* %6
%137 = sub i64 %136, 3
%138 = getelementptr inbounds i8, i8* %135, i64 %137
%139 = load i8, i8* %138
%140 = sext i8 %139 to i32
%141 = add nsw i32 %134, %140
%142 = sub nsw i32 %141, 48
%143 = trunc i32 %142 to i8
%144 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 2
store i8 %143, i8* %144
%145 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 2
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp sgt i32 %147, 23
br i1 %148, label %149, label %150
149: ; preds = %126
store i32 0, i32* %3
br label %278
150: ; preds = %126
%151 = load i8*, i8** %4
%152 = load i64, i64* %6
%153 = sub i64 %152, 6
%154 = getelementptr inbounds i8, i8* %151, i64 %153
%155 = load i8, i8* %154
%156 = sext i8 %155 to i32
%157 = sub nsw i32 %156, 48
%158 = mul nsw i32 %157, 10
%159 = load i8*, i8** %4
%160 = load i64, i64* %6
%161 = sub i64 %160, 5
%162 = getelementptr inbounds i8, i8* %159, i64 %161
%163 = load i8, i8* %162
%164 = sext i8 %163 to i32
%165 = add nsw i32 %158, %164
%166 = sub nsw i32 %165, 48
%167 = trunc i32 %166 to i8
%168 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 3
store i8 %167, i8* %168
%169 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 3
%170 = load i8, i8* %169
%171 = sext i8 %170 to i32
%172 = icmp eq i32 %171, 0
br i1 %172, label %178, label %173
173: ; preds = %150
%174 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 3
%175 = load i8, i8* %174
%176 = sext i8 %175 to i32
%177 = icmp sgt i32 %176, 31
br i1 %177, label %178, label %179
178: ; preds = %173, %150
store i32 0, i32* %3
br label %278
179: ; preds = %173
%180 = load i8*, i8** %4
%181 = load i64, i64* %6
%182 = sub i64 %181, 8
%183 = getelementptr inbounds i8, i8* %180, i64 %182
%184 = load i8, i8* %183
%185 = sext i8 %184 to i32
%186 = sub nsw i32 %185, 48
%187 = mul nsw i32 %186, 10
%188 = load i8*, i8** %4
%189 = load i64, i64* %6
%190 = sub i64 %189, 7
%191 = getelementptr inbounds i8, i8* %188, i64 %190
%192 = load i8, i8* %191
%193 = sext i8 %192 to i32
%194 = add nsw i32 %187, %193
%195 = sub nsw i32 %194, 48
%196 = sub nsw i32 %195, 1
%197 = trunc i32 %196 to i8
%198 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 4
store i8 %197, i8* %198
%199 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 4
%200 = load i8, i8* %199
%201 = sext i8 %200 to i32
%202 = icmp slt i32 %201, 0
br i1 %202, label %208, label %203
203: ; preds = %179
%204 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 4
%205 = load i8, i8* %204
%206 = sext i8 %205 to i32
%207 = icmp sge i32 %206, 12
br i1 %207, label %208, label %209
208: ; preds = %203, %179
store i32 0, i32* %3
br label %278
209: ; preds = %203
%210 = load i64, i64* %6
%211 = icmp uge i64 %210, 10
br i1 %211, label %212, label %258
212: ; preds = %209
%213 = load i8*, i8** %4
%214 = load i64, i64* %6
%215 = sub i64 %214, 10
%216 = getelementptr inbounds i8, i8* %213, i64 %215
%217 = load i8, i8* %216
%218 = sext i8 %217 to i32
%219 = sub nsw i32 %218, 48
%220 = mul nsw i32 %219, 10
%221 = load i8*, i8** %4
%222 = load i64, i64* %6
%223 = sub i64 %222, 9
%224 = getelementptr inbounds i8, i8* %221, i64 %223
%225 = load i8, i8* %224
%226 = sext i8 %225 to i32
%227 = add nsw i32 %220, %226
%228 = sub nsw i32 %227, 48
store i32 %228, i32* %9
%229 = load i64, i64* %6
%230 = icmp eq i64 %229, 12
br i1 %230, label %231, label %247
231: ; preds = %212
%232 = load i8*, i8** %4
%233 = getelementptr inbounds i8, i8* %232, i64 0
%234 = load i8, i8* %233
%235 = sext i8 %234 to i32
%236 = sub nsw i32 %235, 48
%237 = mul nsw i32 %236, 1000
%238 = load i8*, i8** %4
%239 = getelementptr inbounds i8, i8* %238, i64 1
%240 = load i8, i8* %239
%241 = sext i8 %240 to i32
%242 = sub nsw i32 %241, 48
%243 = mul nsw i32 %242, 100
%244 = add nsw i32 %237, %243
%245 = load i32, i32* %9
%246 = add nsw i32 %245, %244
store i32 %246, i32* %9
br label %257
247: ; preds = %212
%248 = load i32, i32* %9
%249 = icmp sge i32 %248, 69
br i1 %249, label %250, label %253
250: ; preds = %247
%251 = load i32, i32* %9
%252 = add nsw i32 %251, 1900
store i32 %252, i32* %9
br label %256
253: ; preds = %247
%254 = load i32, i32* %9
%255 = add nsw i32 %254, 2000
store i32 %255, i32* %9
br label %256
256: ; preds = %253, %250
br label %257
257: ; preds = %256, %231
br label %269
258: ; preds = %209
%259 = call i32 @time(i32* null)
store i32 %259, i32* %10
%260 = call %struct.tm* @localtime(i32* %10)
store %struct.tm* %260, %struct.tm** %11
%261 = load %struct.tm*, %struct.tm** %11
%262 = icmp ne %struct.tm* %261, null
br i1 %262, label %265, label %263
263: ; preds = %258
%264 = call i32 @err(i32 1, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i64 0, i64 0))
br label %265
265: ; preds = %263, %258
%266 = load %struct.tm*, %struct.tm** %11
%267 = getelementptr inbounds %struct.tm, %struct.tm* %266, i32 0, i32 5
%268 = load i32, i32* %267
store i32 %268, i32* %9
br label %269
269: ; preds = %265, %257
%270 = load i32, i32* %9
%271 = sub nsw i32 %270, 1900
%272 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 5
store i32 %271, i32* %272
%273 = call i32 @mktime(%struct.tm* %8)
%274 = load %struct.timespec*, %struct.timespec** %5
%275 = getelementptr inbounds %struct.timespec, %struct.timespec* %274, i32 0, i32 1
store i32 %273, i32* %275
%276 = load %struct.timespec*, %struct.timespec** %5
%277 = getelementptr inbounds %struct.timespec, %struct.timespec* %276, i32 0, i32 0
store i64 0, i64* %277
store i32 1, i32* %3
br label %278
278: ; preds = %269, %208, %178, %149, %125, %98, %74, %56, %47, %25
%279 = load i32, i32* %3
ret i32 %279
}

LLVM IR (-O2):
%struct.timespec = type { i64, i32 }
%struct.tm = type { i8, i8, i8, i8, i8, i32 }
@.str = [10 x i8] c"localtime\00"
define i32 @parseTime(i8* nocapture %0, %struct.timespec* nocapture writeonly %1) {
%3 = alloca %struct.tm
%4 = alloca i32
%5 = tail call i64 @strlen(i8* dereferenceable(1) %0)
%6 = freeze i64 %5
%7 = icmp ugt i64 %6, 15
br i1 %7, label %156, label %8
8: ; preds = %2
%9 = icmp eq i64 %6, 15
br i1 %9, label %10, label %151
10: ; preds = %151, %8
%11 = and i64 %6, 1
%12 = icmp ne i64 %11, 0
%13 = add nsw i64 %6, -3
%14 = getelementptr inbounds i8, i8* %0, i64 %13
br label %15
15: ; preds = %10, %27
%16 = phi i64 [ 0, %10 ], [ %28, %27 ]
%17 = icmp eq i64 %16, %13
%18 = select i1 %12, i1 %17, i1 false
br i1 %18, label %19, label %22
19: ; preds = %15
%20 = load i8, i8* %14
%21 = icmp eq i8 %20, 46
br i1 %21, label %27, label %156
22: ; preds = %15
%23 = getelementptr inbounds i8, i8* %0, i64 %16
%24 = load i8, i8* %23
%25 = tail call i32 @isdigit(i8 signext %24)
%26 = icmp eq i32 %25, 0
br i1 %26, label %156, label %27
27: ; preds = %22, %19
%28 = add nuw i64 %16, 1
%29 = icmp eq i64 %28, %6
br i1 %29, label %30, label %15
30: ; preds = %27
%31 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 0
store i8 0, i8* %31
%32 = icmp eq i64 %11, 0
br i1 %32, label %49, label %33
33: ; preds = %30
%34 = add i64 %6, -3
%35 = getelementptr inbounds i8, i8* %0, i64 %34
%36 = load i8, i8* %35
%37 = icmp eq i8 %36, 46
br i1 %37, label %38, label %149
38: ; preds = %33
%39 = add i64 %6, -2
%40 = getelementptr inbounds i8, i8* %0, i64 %39
%41 = load i8, i8* %40
%42 = mul i8 %41, 10
%43 = add i64 %6, -1
%44 = getelementptr inbounds i8, i8* %0, i64 %43
%45 = load i8, i8* %44
%46 = add i8 %42, -16
%47 = add i8 %46, %45
store i8 %47, i8* %31
%48 = icmp sgt i8 %47, 60
br i1 %48, label %149, label %49
49: ; preds = %38, %30
%50 = phi i64 [ %6, %30 ], [ %34, %38 ]
%51 = add i64 %50, -2
%52 = getelementptr inbounds i8, i8* %0, i64 %51
%53 = load i8, i8* %52
%54 = mul i8 %53, 10
%55 = add i64 %50, -1
%56 = getelementptr inbounds i8, i8* %0, i64 %55
%57 = load i8, i8* %56
%58 = add i8 %54, -16
%59 = add i8 %58, %57
%60 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 1
store i8 %59, i8* %60
%61 = icmp sgt i8 %59, 59
br i1 %61, label %149, label %62
62: ; preds = %49
%63 = add i64 %50, -4
%64 = getelementptr inbounds i8, i8* %0, i64 %63
%65 = load i8, i8* %64
%66 = mul i8 %65, 10
%67 = add i64 %50, -3
%68 = getelementptr inbounds i8, i8* %0, i64 %67
%69 = load i8, i8* %68
%70 = add i8 %66, -16
%71 = add i8 %70, %69
%72 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 2
store i8 %71, i8* %72
%73 = icmp sgt i8 %71, 23
br i1 %73, label %149, label %74
74: ; preds = %62
%75 = add i64 %50, -6
%76 = getelementptr inbounds i8, i8* %0, i64 %75
%77 = load i8, i8* %76
%78 = mul i8 %77, 10
%79 = add i64 %50, -5
%80 = getelementptr inbounds i8, i8* %0, i64 %79
%81 = load i8, i8* %80
%82 = add i8 %78, -16
%83 = add i8 %82, %81
%84 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 3
store i8 %83, i8* %84
%85 = icmp eq i8 %83, 0
%86 = icmp sgt i8 %83, 31
%87 = or i1 %85, %86
br i1 %87, label %149, label %88
88: ; preds = %74
%89 = add i64 %50, -8
%90 = getelementptr inbounds i8, i8* %0, i64 %89
%91 = load i8, i8* %90
%92 = mul i8 %91, 10
%93 = add i64 %50, -7
%94 = getelementptr inbounds i8, i8* %0, i64 %93
%95 = load i8, i8* %94
%96 = add i8 %92, -17
%97 = add i8 %96, %95
%98 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 4
store i8 %97, i8* %98
%99 = icmp ugt i8 %97, 11
br i1 %99, label %149, label %100
100: ; preds = %88
%101 = icmp ugt i64 %50, 9
br i1 %101, label %102, label %132
102: ; preds = %100
%103 = add i64 %50, -10
%104 = getelementptr inbounds i8, i8* %0, i64 %103
%105 = load i8, i8* %104
%106 = sext i8 %105 to i32
%107 = mul nsw i32 %106, 10
%108 = add nsw i32 %107, -480
%109 = add i64 %50, -9
%110 = getelementptr inbounds i8, i8* %0, i64 %109
%111 = load i8, i8* %110
%112 = sext i8 %111 to i32
%113 = add nsw i32 %108, %112
%114 = icmp eq i64 %50, 12
br i1 %114, label %115, label %126
115: ; preds = %102
%116 = load i8, i8* %0
%117 = sext i8 %116 to i32
%118 = mul nsw i32 %117, 1000
%119 = getelementptr inbounds i8, i8* %0, i64 1
%120 = load i8, i8* %119
%121 = sext i8 %120 to i32
%122 = mul nsw i32 %121, 100
%123 = add nsw i32 %113, -52848
%124 = add nsw i32 %123, %118
%125 = add nsw i32 %124, %122
br label %142
126: ; preds = %102
%127 = icmp sgt i32 %113, 116
br i1 %127, label %128, label %130
128: ; preds = %126
%129 = add nuw nsw i32 %113, 1852
br label %142
130: ; preds = %126
%131 = add nsw i32 %113, 1952
br label %142
132: ; preds = %100
%133 = bitcast i32* %4 to i8*
%134 = tail call i32 @time(i32* null)
store i32 %134, i32* %4
%135 = call %struct.tm* @localtime(i32* %4)
%136 = icmp eq %struct.tm* %135, null
br i1 %136, label %137, label %139
137: ; preds = %132
%138 = call i32 @err(i32 1, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i64 0, i64 0))
br label %139
139: ; preds = %137, %132
%140 = getelementptr inbounds %struct.tm, %struct.tm* %135, i64 0, i32 5
%141 = load i32, i32* %140
br label %142
142: ; preds = %115, %130, %128, %139
%143 = phi i32 [ %125, %115 ], [ %129, %128 ], [ %131, %130 ], [ %141, %139 ]
%144 = add nsw i32 %143, -1900
%145 = getelementptr inbounds %struct.tm, %struct.tm* %3, i64 0, i32 5
store i32 %144, i32* %145
%146 = call i32 @mktime(%struct.tm* %3)
%147 = getelementptr inbounds %struct.timespec, %struct.timespec* %1, i64 0, i32 1
store i32 %146, i32* %147
%148 = getelementptr inbounds %struct.timespec, %struct.timespec* %1, i64 0, i32 0
store i64 0, i64* %148
br label %149
149: ; preds = %88, %74, %62, %49, %38, %33, %142
%150 = phi i32 [ 1, %142 ], [ 0, %33 ], [ 0, %38 ], [ 0, %49 ], [ 0, %62 ], [ 0, %74 ], [ 0, %88 ]
br label %156
151: ; preds = %8
%152 = trunc i64 %6 to i16
%153 = lshr i16 17151, %152
%154 = and i16 %153, 1
%155 = icmp eq i16 %154, 0
br i1 %155, label %10, label %156
156: ; preds = %19, %22, %151, %2, %149
%157 = phi i32 [ %150, %149 ], [ 0, %2 ], [ 0, %151 ], [ 0, %22 ], [ 0, %19 ]
ret i32 %157
}