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

/* Variables and functions */
scalar_t__ is_leap_year(int);
time_t timegm(struct tm *tm) {
  static const unsigned ydays[12 + 1] = {0,   31,  59,  90,  120, 151,
                                         181, 212, 243, 273, 304, 334};
  if (tm->tm_year < 70 || tm->tm_mon < 0 || tm->tm_mon > 11 ||
      tm->tm_mday < 1 || tm->tm_mday > 31 || tm->tm_hour < 0 ||
      tm->tm_hour > 23 || tm->tm_min < 0 || tm->tm_min > 59 || tm->tm_sec < 0 ||
      tm->tm_sec > 60)
    return -1;
  unsigned t = 365 * (tm->tm_year - 70) + ydays[tm->tm_mon] + (tm->tm_mday - 1);
  for (int i = 70; i < tm->tm_year; i++)
    t += is_leap_year(1900 + i);
  if (tm->tm_mon > 1)
    t += is_leap_year(1900 + tm->tm_year);
  t *= 24;
  t += tm->tm_hour;
  t *= 60;
  t += tm->tm_min;
  t *= 60;
  t += tm->tm_sec;
  return t;
}


x86 assembly (clang, -O0):
<timegm>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmpl   $0x46,(%rax)
jl     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0x0,0x4(%rax)
jl     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0xb,0x4(%rax)
jg     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0x1,0x8(%rax)
jl     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0x1f,0x8(%rax)
jg     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0x0,0xc(%rax)
jl     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0x17,0xc(%rax)
jg     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0x0,0x10(%rax)
jl     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0x3b,0x10(%rax)
jg     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0x0,0x14(%rax)
jl     11b5 <timegm+0xa5>
mov    -0x10(%rbp),%rax
cmpl   $0x3c,0x14(%rax)
jle    11c1 <timegm+0xb1>
movl   $0xffffffff,-0x4(%rbp)
jmp    129c <timegm+0x18c>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
sub    $0x46,%eax
imul   $0x16d,%eax,%eax
mov    -0x10(%rbp),%rcx
movslq 0x4(%rcx),%rdx
lea    0xe21(%rip),%rcx
add    (%rcx,%rdx,4),%eax
mov    -0x10(%rbp),%rcx
mov    0x8(%rcx),%ecx
sub    $0x1,%ecx
add    %ecx,%eax
mov    %eax,-0x14(%rbp)
movl   $0x46,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jge    122f <timegm+0x11f>
mov    -0x18(%rbp),%edi
add    $0x76c,%edi
call   1030 <is_leap_year@plt>
mov    %rax,%rcx
mov    -0x14(%rbp),%eax
add    %rcx,%rax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    11f8 <timegm+0xe8>
mov    -0x10(%rbp),%rax
cmpl   $0x1,0x4(%rax)
jle    125a <timegm+0x14a>
mov    -0x10(%rbp),%rax
mov    (%rax),%edi
add    $0x76c,%edi
call   1030 <is_leap_year@plt>
mov    %rax,%rcx
mov    -0x14(%rbp),%eax
add    %rcx,%rax
mov    %eax,-0x14(%rbp)
imul   $0x18,-0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    0xc(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
imul   $0x3c,-0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
imul   $0x3c,-0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    0x14(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<timegm>:
push   %r15
push   %r14
push   %rbx
mov    (%rdi),%edx
mov    $0xffffffff,%eax
cmp    $0x46,%edx
jl     11e3 <timegm+0xd3>
mov    %rdi,%r14
mov    0x4(%rdi),%ecx
cmp    $0xb,%rcx
ja     11e3 <timegm+0xd3>
mov    0x8(%r14),%esi
lea    -0x20(%rsi),%edi
cmp    $0xffffffe1,%edi
jb     11e3 <timegm+0xd3>
cmpl   $0x17,0xc(%r14)
ja     11e3 <timegm+0xd3>
cmpl   $0x3b,0x10(%r14)
ja     11e3 <timegm+0xd3>
cmpl   $0x3c,0x14(%r14)
ja     11e3 <timegm+0xd3>
imul   $0x16d,%edx,%eax
lea    0xe8d(%rip),%rdi
mov    (%rdi,%rcx,4),%edi
add    %esi,%eax
lea    (%rdi,%rax,1),%r15d
add    $0xffff9c31,%r15d
cmp    $0x47,%edx
jb     11b8 <timegm+0xa8>
mov    $0x7b2,%ebx
nopl   (%rax)
mov    %ebx,%edi
call   1030 <is_leap_year@plt>
add    %eax,%r15d
mov    (%r14),%edi
lea    0x1(%rbx),%eax
add    $0xfffff895,%ebx
cmp    %edi,%ebx
mov    %eax,%ebx
jl     1190 <timegm+0x80>
mov    0x4(%r14),%ecx
add    $0x76c,%edi
jmp    11bd <timegm+0xad>
mov    $0x7b2,%edi
cmp    $0x1,%ecx
jle    11ca <timegm+0xba>
call   1030 <is_leap_year@plt>
add    %eax,%r15d
lea    (%r15,%r15,2),%eax
shl    $0x3,%eax
add    0xc(%r14),%eax
imul   $0x3c,%eax,%eax
add    0x10(%r14),%eax
imul   $0x3c,%eax,%eax
add    0x14(%r14),%eax
pop    %rbx
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
%struct.tm = type { i32, i32, i32, i32, i32, i32 }
@timegm.ydays = internal unnamed_addr constant [13 x i32] [i32 0, i32 31, i32 59, i32 90, i32 120, i32 151, i32 181, i32 212, i32 243, i32 273, i32 304, i32 334, i32 0]
define i32 @timegm(%struct.tm* nocapture %0) {
%2 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 0
%3 = load i32, i32* %2
%4 = icmp slt i32 %3, 70
br i1 %4, label %68, label %5
5: ; preds = %1
%6 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 1
%7 = load i32, i32* %6
%8 = icmp ugt i32 %7, 11
br i1 %8, label %68, label %9
9: ; preds = %5
%10 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 2
%11 = load i32, i32* %10
%12 = add i32 %11, -32
%13 = icmp ult i32 %12, -31
br i1 %13, label %68, label %14
14: ; preds = %9
%15 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 3
%16 = load i32, i32* %15
%17 = icmp ugt i32 %16, 23
br i1 %17, label %68, label %18
18: ; preds = %14
%19 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 4
%20 = load i32, i32* %19
%21 = icmp ugt i32 %20, 59
br i1 %21, label %68, label %22
22: ; preds = %18
%23 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 5
%24 = load i32, i32* %23
%25 = icmp ugt i32 %24, 60
br i1 %25, label %68, label %26
26: ; preds = %22
%27 = mul i32 %3, 365
%28 = zext i32 %7 to i64
%29 = getelementptr inbounds [13 x i32], [13 x i32]* @timegm.ydays, i64 0, i64 %28
%30 = load i32, i32* %29
%31 = add i32 %27, -25551
%32 = add i32 %31, %11
%33 = add i32 %32, %30
%34 = icmp ugt i32 %3, 70
br i1 %34, label %43, label %38
35: ; preds = %43
%36 = load i32, i32* %6
%37 = add i32 %51, 1900
br label %38
38: ; preds = %35, %26
%39 = phi i32 [ %7, %26 ], [ %36, %35 ]
%40 = phi i32 [ %33, %26 ], [ %49, %35 ]
%41 = phi i32 [ 1970, %26 ], [ %37, %35 ]
%42 = icmp sgt i32 %39, 1
br i1 %42, label %53, label %57
43: ; preds = %26, %43
%44 = phi i32 [ %50, %43 ], [ 70, %26 ]
%45 = phi i32 [ %49, %43 ], [ %33, %26 ]
%46 = add nuw nsw i32 %44, 1900
%47 = tail call i64 @is_leap_year(i32 %46)
%48 = trunc i64 %47 to i32
%49 = add i32 %45, %48
%50 = add nuw nsw i32 %44, 1
%51 = load i32, i32* %2
%52 = icmp slt i32 %50, %51
br i1 %52, label %43, label %35
53: ; preds = %38
%54 = tail call i64 @is_leap_year(i32 %41)
%55 = trunc i64 %54 to i32
%56 = add i32 %40, %55
br label %57
57: ; preds = %53, %38
%58 = phi i32 [ %56, %53 ], [ %40, %38 ]
%59 = mul i32 %58, 24
%60 = load i32, i32* %15
%61 = add i32 %59, %60
%62 = mul i32 %61, 60
%63 = load i32, i32* %19
%64 = add i32 %62, %63
%65 = mul i32 %64, 60
%66 = load i32, i32* %23
%67 = add i32 %65, %66
br label %68
68: ; preds = %1, %5, %9, %14, %18, %22, %57
%69 = phi i32 [ %67, %57 ], [ -1, %22 ], [ -1, %18 ], [ -1, %14 ], [ -1, %9 ], [ -1, %5 ], [ -1, %1 ]
ret i32 %69
}