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

/* Variables and functions */
int /*<<< orphan*/ CLOCK_REALTIME;
scalar_t__ clock_settime(int /*<<< orphan*/, struct timespec *);
int /*<<< orphan*/ errno;
int error(int, int /*<<< orphan*/);
int /*<<< orphan*/ isdigit(char);
int /*<<< orphan*/ mktime(struct tm *);
int /*<<< orphan*/ printf(char *, int, int, int, int, int, int);
int strlen(char *);
int settime(char *timestring) {
  struct tm time;
  char *dot;
  struct timespec timetoset;
  unsigned char i;
  size_t len;
  dot = NULL;
  timetoset.tv_nsec = 0;
  len = strlen(timestring);
  for (i = 0; i < len; i++) {
    if (!isdigit(timestring[i])) {
      if (timestring[i] == '.' && dot == NULL) {
        dot = timestring + i;
      } else {
        return error(4, 0);
      }
    }
  }
  if (dot != NULL) {
    *dot++ = '\0';
    if (strlen(dot) != 2) {
      return error(6, 0);
    }
    time.tm_sec = ((dot[0] - '0') * 10 + (dot[0 + 1] - '0'));
    if (time.tm_sec > 60)
      return error(6, 0);
  } else {
    time.tm_sec = 0;
  }
  len = strlen(timestring);
  switch (len) {
  case 12:
    time.tm_year =
        (((timestring[8] - '0') * 10 + (timestring[8 + 1] - '0')) * 100 +
         ((timestring[10] - '0') * 10 + (timestring[10 + 1] - '0'))) -
        1900;
  case 10:
    if (len == 10) {
      time.tm_year = ((timestring[8] - '0') * 10 + (timestring[8 + 1] - '0'));
      if (time.tm_year < 69)
        time.tm_year += 100;
    }
  case 8:
    time.tm_mon = ((timestring[0] - '0') * 10 + (timestring[0 + 1] - '0'));
    if (--(time.tm_mon) > 11)
      return error(9, 0);
    time.tm_mday = ((timestring[2] - '0') * 10 + (timestring[2 + 1] - '0'));
    if (time.tm_mday > 31 || time.tm_mday < 1)
      return error(10, 0);
    time.tm_hour = ((timestring[4] - '0') * 10 + (timestring[4 + 1] - '0'));
    if (time.tm_hour > 23)
      return error(11, 0);
    time.tm_min = ((timestring[6] - '0') * 10 + (timestring[6 + 1] - '0'));
    if (time.tm_min > 59)
      return error(12, 0);
    break;
  default:
    return error(7, 0);
  }
  if (time.tm_year < 70)
    return error(8, 0);
  time.tm_isdst = -1;
  time.tm_wday = 0;
  time.tm_yday = 0;
  printf("%d-%d-%d %d:%d:%d\n", time.tm_year + 1900, time.tm_mon + 1,
         time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec);
  timetoset.tv_sec = mktime(&time);
  if (clock_settime(CLOCK_REALTIME, &timetoset) == 0) {
    return 0;
  } else {
    return error(13, errno);
  }
}


x86 assembly (clang, -O0):
<settime>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x10(%rbp)
movq   $0x0,-0x38(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
cltq
mov    %rax,-0x58(%rbp)
movb   $0x0,-0x49(%rbp)
movzbl -0x49(%rbp),%eax
cmp    -0x58(%rbp),%rax
jae    1219 <settime+0xb9>
mov    -0x10(%rbp),%rax
movzbl -0x49(%rbp),%ecx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
jne    1207 <settime+0xa7>
mov    -0x10(%rbp),%rax
movzbl -0x49(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    11ee <settime+0x8e>
cmpq   $0x0,-0x38(%rbp)
jne    11ee <settime+0x8e>
mov    -0x10(%rbp),%rax
movzbl -0x49(%rbp),%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
jmp    1202 <settime+0xa2>
mov    $0x4,%edi
xor    %esi,%esi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
jmp    1207 <settime+0xa7>
jmp    120c <settime+0xac>
mov    -0x49(%rbp),%al
add    $0x1,%al
mov    %al,-0x49(%rbp)
jmp    118f <settime+0x2f>
cmpq   $0x0,-0x38(%rbp)
je     129f <settime+0x13f>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
movb   $0x0,(%rax)
mov    -0x38(%rbp),%rdi
call   1040 <strlen@plt>
cmp    $0x2,%eax
je     125c <settime+0xfc>
mov    $0x6,%edi
xor    %esi,%esi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x38(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,-0x30(%rbp)
movsbl -0x30(%rbp),%eax
cmp    $0x3c,%eax
jle    129a <settime+0x13a>
mov    $0x6,%edi
xor    %esi,%esi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
jmp    12a3 <settime+0x143>
movb   $0x0,-0x30(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
cltq
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rax
mov    %rax,-0x60(%rbp)
sub    $0x8,%rax
je     137c <settime+0x21c>
jmp    12c9 <settime+0x169>
mov    -0x60(%rbp),%rax
sub    $0xa,%rax
je     1332 <settime+0x1d2>
jmp    12dc <settime+0x17c>
mov    -0x60(%rbp),%rax
sub    $0xc,%rax
jne    1490 <settime+0x330>
jmp    12ef <settime+0x18f>
mov    -0x10(%rbp),%rax
movsbl 0x8(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x9(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
imul   $0x64,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0xa(%rcx),%ecx
sub    $0x30,%ecx
imul   $0xa,%ecx,%ecx
mov    -0x10(%rbp),%rdx
movsbl 0xb(%rdx),%edx
sub    $0x30,%edx
add    %edx,%ecx
add    %ecx,%eax
sub    $0x76c,%eax
mov    %al,-0x2f(%rbp)
cmpq   $0xa,-0x58(%rbp)
jne    1377 <settime+0x217>
mov    -0x10(%rbp),%rax
movsbl 0x8(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x9(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,-0x2f(%rbp)
movsbl -0x2f(%rbp),%eax
cmp    $0x45,%eax
jge    1372 <settime+0x212>
movsbl -0x2f(%rbp),%eax
add    $0x64,%eax
mov    %al,-0x2f(%rbp)
jmp    1377 <settime+0x217>
jmp    137c <settime+0x21c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,-0x2e(%rbp)
mov    -0x2e(%rbp),%al
add    $0xff,%al
mov    %al,-0x2e(%rbp)
movsbl %al,%eax
cmp    $0xb,%eax
jle    13c1 <settime+0x261>
mov    $0x9,%edi
xor    %esi,%esi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x3(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,-0x2d(%rbp)
movsbl -0x2d(%rbp),%eax
cmp    $0x1f,%eax
jg     13f9 <settime+0x299>
movsbl -0x2d(%rbp),%eax
cmp    $0x1,%eax
jge    140d <settime+0x2ad>
mov    $0xa,%edi
xor    %esi,%esi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x5(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,-0x2c(%rbp)
movsbl -0x2c(%rbp),%eax
cmp    $0x17,%eax
jle    144c <settime+0x2ec>
mov    $0xb,%edi
xor    %esi,%esi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x7(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,-0x2b(%rbp)
movsbl -0x2b(%rbp),%eax
cmp    $0x3b,%eax
jle    148b <settime+0x32b>
mov    $0xc,%edi
xor    %esi,%esi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
jmp    14a4 <settime+0x344>
mov    $0x7,%edi
xor    %esi,%esi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
movsbl -0x2f(%rbp),%eax
cmp    $0x46,%eax
jge    14c5 <settime+0x365>
mov    $0x8,%edi
xor    %esi,%esi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
movl   $0xffffffff,-0x28(%rbp)
movq   $0x0,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
movsbl -0x2f(%rbp),%esi
add    $0x76c,%esi
movsbl -0x2e(%rbp),%edx
add    $0x1,%edx
movsbl -0x2d(%rbp),%ecx
movsbl -0x2c(%rbp),%r8d
movsbl -0x2b(%rbp),%r9d
movsbl -0x30(%rbp),%eax
lea    0xafa(%rip),%rdi
mov    %eax,(%rsp)
call   1050 <printf@plt>
lea    -0x30(%rbp),%rdi
call   1070 <mktime@plt>
mov    %eax,-0x48(%rbp)
mov    0x2ab7(%rip),%rax
mov    (%rax),%edi
lea    -0x48(%rbp),%rsi
call   1060 <clock_settime@plt>
cmp    $0x0,%rax
jne    1542 <settime+0x3e2>
movl   $0x0,-0x4(%rbp)
jmp    1558 <settime+0x3f8>
mov    0x2a97(%rip),%rax
mov    (%rax),%esi
mov    $0xd,%edi
call   1080 <error@plt>
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<settime>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x38,%rsp
mov    %rdi,%r15
movq   $0x0,0x30(%rsp)
call   1040 <strlen@plt>
test   %eax,%eax
je     1202 <settime+0xa2>
movslq %eax,%r14
xor    %ebx,%ebx
xor    %ebp,%ebp
jmp    119b <settime+0x3b>
nopl   0x0(%rax)
add    $0x1,%ebx
movzbl %bl,%ebx
cmp    %r14,%rbx
jae    11c4 <settime+0x64>
movsbl (%r15,%rbx,1),%edi
call   1030 <isdigit@plt>
test   %eax,%eax
jne    1190 <settime+0x30>
lea    (%r15,%rbx,1),%rax
cmpb   $0x2e,(%rax)
jne    11ba <settime+0x5a>
test   %rbp,%rbp
mov    %rax,%rbp
je     1190 <settime+0x30>
mov    $0x4,%edi
jmp    131f <settime+0x1bf>
test   %rbp,%rbp
je     1202 <settime+0xa2>
lea    0x1(%rbp),%rdi
movb   $0x0,0x0(%rbp)
call   1040 <strlen@plt>
cmp    $0x2,%eax
jne    11f8 <settime+0x98>
movzbl 0x1(%rbp),%eax
add    %eax,%eax
lea    (%rax,%rax,4),%r14d
add    0x2(%rbp),%r14b
add    $0xf0,%r14b
mov    %r14b,0x8(%rsp)
cmp    $0x3d,%r14b
jl     120a <settime+0xaa>
mov    $0x6,%edi
jmp    131f <settime+0x1bf>
movb   $0x0,0x8(%rsp)
xor    %r14d,%r14d
mov    %r15,%rdi
call   1040 <strlen@plt>
movslq %eax,%rcx
cmp    $0x8,%rcx
je     127b <settime+0x11b>
cmp    $0xa,%rcx
je     1256 <settime+0xf6>
cmp    $0xc,%rcx
jne    12c0 <settime+0x160>
movzbl 0x8(%r15),%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
add    0x9(%r15),%cl
movzbl %cl,%ecx
movzbl 0xa(%r15),%edx
add    %edx,%edx
lea    (%rdx,%rdx,4),%edx
add    0xb(%r15),%dl
imul   $0x64,%ecx,%ecx
add    %cl,%dl
add    $0x44,%dl
mov    %dl,0x9(%rsp)
cmp    $0xa,%eax
jne    127b <settime+0x11b>
movzbl 0x8(%r15),%eax
add    %eax,%eax
lea    (%rax,%rax,4),%eax
add    0x9(%r15),%al
lea    -0x10(%rax),%ecx
mov    %cl,0x9(%rsp)
cmp    $0x44,%cl
jg     127b <settime+0x11b>
add    $0x54,%al
mov    %al,0x9(%rsp)
movzbl (%r15),%eax
add    %eax,%eax
lea    (%rax,%rax,4),%eax
add    0x1(%r15),%al
add    $0xef,%al
mov    %al,0xa(%rsp)
cmp    $0xc,%al
jl     129c <settime+0x13c>
mov    $0x9,%edi
jmp    131f <settime+0x1bf>
movzbl 0x2(%r15),%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%edx
add    0x3(%r15),%dl
lea    -0x10(%rdx),%ecx
mov    %cl,0xb(%rsp)
add    $0xd0,%dl
cmp    $0xe0,%dl
ja     12c7 <settime+0x167>
mov    $0xa,%edi
jmp    131f <settime+0x1bf>
mov    $0x7,%edi
jmp    131f <settime+0x1bf>
movzbl 0x4(%r15),%edx
add    %edx,%edx
lea    (%rdx,%rdx,4),%edi
add    0x5(%r15),%dil
add    $0xf0,%dil
mov    %dil,0xc(%rsp)
cmp    $0x18,%dil
jl     12eb <settime+0x18b>
mov    $0xb,%edi
jmp    131f <settime+0x1bf>
movzbl 0x6(%r15),%edx
add    %edx,%edx
lea    (%rdx,%rdx,4),%ebp
add    0x7(%r15),%bpl
add    $0xf0,%bpl
mov    %bpl,0xd(%rsp)
cmp    $0x3c,%bpl
jl     130f <settime+0x1af>
mov    $0xc,%edi
jmp    131f <settime+0x1bf>
movzbl 0x9(%rsp),%esi
cmp    $0x45,%sil
jg     1330 <settime+0x1d0>
mov    $0x8,%edi
xor    %esi,%esi
add    $0x38,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
jmp    1080 <error@plt>
movl   $0xffffffff,0x10(%rsp)
ff
add    $0x76c,%esi
movsbl %al,%edx
add    $0x1,%edx
movsbl %cl,%ecx
movsbl %dil,%r8d
movsbl %bpl,%r9d
movsbl %r14b,%eax
xorps  %xmm0,%xmm0
movups %xmm0,0x18(%rsp)
mov    %eax,(%rsp)
lea    0xc9b(%rip),%rdi
call   1050 <printf@plt>
lea    0x8(%rsp),%rdi
call   1070 <mktime@plt>
mov    %eax,0x28(%rsp)
mov    0x2c59(%rip),%rax
mov    (%rax),%edi
lea    0x28(%rsp),%rsi
call   1060 <clock_settime@plt>
test   %rax,%rax
je     13a5 <settime+0x245>
mov    0x2c49(%rip),%rax
mov    (%rax),%esi
mov    $0xd,%edi
call   1080 <error@plt>
jmp    13a7 <settime+0x247>
xor    %eax,%eax
add    $0x38,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

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