#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 */
typedef struct TYPE_3__ TYPE_1__;

/* Type definitions */
struct tm {
  int tm_year;
  int tm_mon;
  int tm_mday;
  int tm_hour;
  int tm_min;
  int tm_sec;
};
struct TYPE_3__ {
  int type;
  scalar_t__ data;
};
typedef TYPE_1__ ASN1_TIME;

/* Variables and functions */
#define V_ASN1_GENERALIZEDTIME 129
#define V_ASN1_UTCTIME 128
int /*<<< orphan*/ memset(struct tm *, int /*<<< orphan*/, int);
int /*<<< orphan*/ sscanf(char const *, char *, ...);
int strtol(char *, int /*<<< orphan*/ *, int);
int parse_asn1_time(const ASN1_TIME *atp, struct tm *tsp) {
  const char *str;
  unsigned offset;
  int val;
  char buff[5];
  if ((atp->type != V_ASN1_GENERALIZEDTIME) && (atp->type != V_ASN1_UTCTIME))
    return (1);
  memset(tsp, 0, sizeof(struct tm));
  str = (const char *)atp->data;
  offset = 0;
  switch (atp->type) {
  case V_ASN1_GENERALIZEDTIME:
    sscanf(&str[offset], "%04i", &val);
    val -= 1900;
    tsp->tm_year = val;
    offset += 4;
    break;
  case V_ASN1_UTCTIME:
    sscanf(&str[offset], "%02i", &val);
    if (val < 50)
      val += 2000 - 1900;
    tsp->tm_year = val;
    offset += 2;
    break;
  default:
    return (1);
  };
  sscanf(&str[offset], "%02s", buff);
  buff[2] = '\0';
  val = strtol(buff, NULL, 10) - 1;
  tsp->tm_mon = val;
  offset += 2;
  sscanf(&str[offset], "%02s", buff);
  buff[2] = '\0';
  val = strtol(buff, NULL, 10);
  tsp->tm_mday = val;
  offset += 2;
  sscanf(&str[offset], "%02s", buff);
  buff[2] = '\0';
  val = strtol(buff, NULL, 10);
  tsp->tm_hour = val;
  offset += 2;
  sscanf(&str[offset], "%02s", buff);
  buff[2] = '\0';
  val = strtol(buff, NULL, 10);
  tsp->tm_min = val;
  offset += 2;
  sscanf(&str[offset], "%02s", buff);
  buff[2] = '\0';
  val = strtol(buff, NULL, 10);
  tsp->tm_sec = val;
  return (0);
}


x86 assembly (clang, -O0):
<parse_asn1_time>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
cmpl   $0x81,(%rax)
je     116c <parse_asn1_time+0x3c>
mov    -0x10(%rbp),%rax
cmpl   $0x80,(%rax)
je     116c <parse_asn1_time+0x3c>
movl   $0x1,-0x4(%rbp)
jmp    13b4 <parse_asn1_time+0x284>
mov    -0x18(%rbp),%rdi
xor    %esi,%esi
mov    $0x18,%edx
call   1030 <memset@plt>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x34(%rbp)
sub    $0x80,%eax
je     11f9 <parse_asn1_time+0xc9>
jmp    11a8 <parse_asn1_time+0x78>
mov    -0x34(%rbp),%eax
sub    $0x81,%eax
jne    123f <parse_asn1_time+0x10f>
jmp    11bb <parse_asn1_time+0x8b>
mov    -0x20(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    0xe34(%rip),%rsi
lea    -0x28(%rbp),%rdx
mov    $0x0,%al
call   1050 <sscanf@plt>
mov    -0x28(%rbp),%eax
sub    $0x76c,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x24(%rbp)
jmp    124b <parse_asn1_time+0x11b>
mov    -0x20(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    0xdfb(%rip),%rsi
lea    -0x28(%rbp),%rdx
mov    $0x0,%al
call   1050 <sscanf@plt>
cmpl   $0x32,-0x28(%rbp)
jge    1228 <parse_asn1_time+0xf8>
mov    -0x28(%rbp),%eax
add    $0x64,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    124b <parse_asn1_time+0x11b>
movl   $0x1,-0x4(%rbp)
jmp    13b4 <parse_asn1_time+0x284>
mov    -0x20(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x2d(%rbp),%rdx
lea    0xdaa(%rip),%rsi
mov    $0x0,%al
call   1050 <sscanf@plt>
movb   $0x0,-0x2b(%rbp)
lea    -0x2d(%rbp),%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x2d(%rbp),%rdx
lea    0xd5f(%rip),%rsi
mov    $0x0,%al
call   1050 <sscanf@plt>
movb   $0x0,-0x2b(%rbp)
lea    -0x2d(%rbp),%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x2d(%rbp),%rdx
lea    0xd17(%rip),%rsi
mov    $0x0,%al
call   1050 <sscanf@plt>
movb   $0x0,-0x2b(%rbp)
lea    -0x2d(%rbp),%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,0xc(%rax)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x2d(%rbp),%rdx
lea    0xccf(%rip),%rsi
mov    $0x0,%al
call   1050 <sscanf@plt>
movb   $0x0,-0x2b(%rbp)
lea    -0x2d(%rbp),%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,0x10(%rax)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x24(%rbp),%eax
add    %rax,%rdi
lea    -0x2d(%rbp),%rdx
lea    0xc87(%rip),%rsi
mov    $0x0,%al
call   1050 <sscanf@plt>
movb   $0x0,-0x2b(%rbp)
lea    -0x2d(%rbp),%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,0x14(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<parse_asn1_time>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    (%rdi),%eax
and    $0xfffffffe,%eax
mov    $0x1,%r15d
cmp    $0x80,%eax
jne    12ee <parse_asn1_time+0x1be>
mov    %rsi,%r12
mov    %rdi,%rbx
mov    %rsi,%rdi
xor    %esi,%esi
mov    $0x18,%edx
call   1030 <memset@plt>
mov    0x8(%rbx),%r14
mov    (%rbx),%eax
cmp    $0x80,%eax
je     11ab <parse_asn1_time+0x7b>
cmp    $0x81,%eax
jne    12ee <parse_asn1_time+0x1be>
lea    0xe78(%rip),%rsi
lea    0xc(%rsp),%rdx
mov    %r14,%rdi
xor    %eax,%eax
call   1050 <sscanf@plt>
mov    $0xfffff894,%eax
add    0xc(%rsp),%eax
mov    %eax,0xc(%rsp)
mov    $0x4,%ebx
jmp    11d6 <parse_asn1_time+0xa6>
lea    0xe53(%rip),%rsi
lea    0xc(%rsp),%rdx
mov    %r14,%rdi
xor    %eax,%eax
call   1050 <sscanf@plt>
mov    0xc(%rsp),%eax
mov    $0x2,%ebx
cmp    $0x31,%eax
jg     11d6 <parse_asn1_time+0xa6>
add    $0x64,%eax
mov    %eax,0xc(%rsp)
mov    %eax,(%r12)
mov    %ebx,%ebp
lea    (%r14,%rbp,1),%rdi
lea    0xe23(%rip),%rsi
xor    %r15d,%r15d
lea    0x13(%rsp),%r13
mov    %r13,%rdx
xor    %eax,%eax
call   1050 <sscanf@plt>
movb   $0x0,0x15(%rsp)
mov    %r13,%rdi
xor    %esi,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
add    $0xffffffff,%eax
mov    %eax,0xc(%rsp)
mov    %eax,0x4(%r12)
lea    (%r14,%rbp,1),%rdi
add    $0x2,%rdi
lea    0xde2(%rip),%rsi
mov    %r13,%rdx
xor    %eax,%eax
call   1050 <sscanf@plt>
movb   $0x0,0x15(%rsp)
mov    %r13,%rdi
xor    %esi,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
mov    %eax,0xc(%rsp)
mov    %eax,0x8(%r12)
lea    (%r14,%rbp,1),%rdi
add    $0x4,%rdi
lea    0xdac(%rip),%rsi
mov    %r13,%rdx
xor    %eax,%eax
call   1050 <sscanf@plt>
movb   $0x0,0x15(%rsp)
mov    %r13,%rdi
xor    %esi,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
mov    %eax,0xc(%rsp)
mov    %eax,0xc(%r12)
lea    (%r14,%rbp,1),%rdi
add    $0x6,%rdi
lea    0xd76(%rip),%rsi
mov    %r13,%rdx
xor    %eax,%eax
call   1050 <sscanf@plt>
movb   $0x0,0x15(%rsp)
mov    %r13,%rdi
xor    %esi,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
mov    %eax,0xc(%rsp)
mov    %eax,0x10(%r12)
or     $0x8,%ebx
add    %r14,%rbx
mov    %rbx,%rdi
lea    0xd3f(%rip),%rsi
mov    %r13,%rdx
xor    %eax,%eax
call   1050 <sscanf@plt>
movb   $0x0,0x15(%rsp)
mov    %r13,%rdi
xor    %esi,%esi
mov    $0xa,%edx
call   1040 <strtol@plt>
mov    %eax,0x14(%r12)
mov    %r15d,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
%struct.TYPE_3__ = type { i32, i64 }
%struct.tm = type { i32, i32, i32, i32, i32, i32 }
@.str = [5 x i8] c"%04i\00"
@.str.1 = [5 x i8] c"%02i\00"
@.str.2 = [5 x i8] c"%02s\00"
define i32 @parse_asn1_time(%struct.TYPE_3__* nocapture %0, %struct.tm* %1) {
%3 = alloca i32
%4 = alloca [5 x i8]
%5 = bitcast i32* %3 to i8*
%6 = getelementptr inbounds [5 x i8], [5 x i8]* %4, i64 0, i64 0
%7 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %0, i64 0, i32 0
%8 = load i32, i32* %7
%9 = and i32 %8, -2
%10 = icmp eq i32 %9, 128
br i1 %10, label %11, label %62
11: ; preds = %2
%12 = tail call i32 @memset(%struct.tm* %1, i32 0, i32 24)
%13 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %0, i64 0, i32 1
%14 = load i64, i64* %13
%15 = inttoptr i64 %14 to i8*
%16 = load i32, i32* %7
switch i32 %16, label %62 [
i32 129, label %17
i32 128, label %21
]
17: ; preds = %11
%18 = call i32 (i8*, i8*, ...) @sscanf(i8* %15, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i32* %3)
%19 = load i32, i32* %3
%20 = add nsw i32 %19, -1900
store i32 %20, i32* %3
br label %27
21: ; preds = %11
%22 = call i32 (i8*, i8*, ...) @sscanf(i8* %15, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0), i32* %3)
%23 = load i32, i32* %3
%24 = icmp slt i32 %23, 50
br i1 %24, label %25, label %27
25: ; preds = %21
%26 = add nsw i32 %23, 100
store i32 %26, i32* %3
br label %27
27: ; preds = %21, %25, %17
%28 = phi i32 [ %20, %17 ], [ %26, %25 ], [ %23, %21 ]
%29 = phi i32 [ 4, %17 ], [ 2, %25 ], [ 2, %21 ]
%30 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 0
store i32 %28, i32* %30
%31 = zext i32 %29 to i64
%32 = getelementptr inbounds i8, i8* %15, i64 %31
%33 = call i32 (i8*, i8*, ...) @sscanf(i8* %32, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8* %6)
%34 = getelementptr inbounds [5 x i8], [5 x i8]* %4, i64 0, i64 2
store i8 0, i8* %34
%35 = call i32 @strtol(i8* nocapture %6, i32* null, i32 10)
%36 = add nsw i32 %35, -1
store i32 %36, i32* %3
%37 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 1
store i32 %36, i32* %37
%38 = add nuw nsw i32 %29, 2
%39 = zext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %15, i64 %39
%41 = call i32 (i8*, i8*, ...) @sscanf(i8* %40, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8* %6)
store i8 0, i8* %34
%42 = call i32 @strtol(i8* nocapture %6, i32* null, i32 10)
store i32 %42, i32* %3
%43 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 2
store i32 %42, i32* %43
%44 = add nuw nsw i32 %29, 4
%45 = zext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %15, i64 %45
%47 = call i32 (i8*, i8*, ...) @sscanf(i8* %46, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8* %6)
store i8 0, i8* %34
%48 = call i32 @strtol(i8* nocapture %6, i32* null, i32 10)
store i32 %48, i32* %3
%49 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 3
store i32 %48, i32* %49
%50 = add nuw nsw i32 %29, 6
%51 = zext i32 %50 to i64
%52 = getelementptr inbounds i8, i8* %15, i64 %51
%53 = call i32 (i8*, i8*, ...) @sscanf(i8* %52, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8* %6)
store i8 0, i8* %34
%54 = call i32 @strtol(i8* nocapture %6, i32* null, i32 10)
store i32 %54, i32* %3
%55 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 4
store i32 %54, i32* %55
%56 = or i32 %29, 8
%57 = zext i32 %56 to i64
%58 = getelementptr inbounds i8, i8* %15, i64 %57
%59 = call i32 (i8*, i8*, ...) @sscanf(i8* %58, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8* %6)
store i8 0, i8* %34
%60 = call i32 @strtol(i8* nocapture %6, i32* null, i32 10)
%61 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 5
store i32 %60, i32* %61
br label %62
62: ; preds = %2, %11, %27
%63 = phi i32 [ 0, %27 ], [ 1, %2 ], [ 1, %11 ]
ret i32 %63
}