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

/* Variables and functions */
time_t c_timegm(register struct tm *t) {
  register long year;
  register time_t result;
  static const int cumdays[12] = {0,   31,  59,  90,  120, 151,
                                  181, 212, 243, 273, 304, 334};
  year = 1900 + t->tm_year + t->tm_mon / 12;
  result = (year - 1970) * 365 + cumdays[t->tm_mon % 12];
  result += (year - 1968) / 4;
  result -= (year - 1900) / 100;
  result += (year - 1600) / 400;
  if ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0) &&
      (t->tm_mon % 12) < 2) {
    result--;
  }
  result += t->tm_mday - 1;
  result *= 24;
  result += t->tm_hour;
  result *= 60;
  result += t->tm_min;
  result *= 60;
  result += t->tm_sec;
  if (t->tm_isdst == 1)
    result -= 3600;
  return result;
}


x86 assembly (clang, -O0):
<c_timegm>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
add    $0x76c,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x24(%rbp),%eax
add    %ecx,%eax
cltq
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
sub    $0x7b2,%rax
imul   $0x16d,%rax,%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
mov    -0x20(%rbp),%rax
movslq %edx,%rdx
lea    0xe9c(%rip),%rcx
movslq (%rcx,%rdx,4),%rcx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
sub    $0x7b0,%rax
mov    $0x4,%ecx
cqto
idiv   %rcx
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
sub    $0x76c,%rax
mov    $0x64,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x18(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
sub    $0x640,%rax
mov    $0x190,%ecx
cqto
idiv   %rcx
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    $0x4,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    1235 <c_timegm+0x135>
mov    -0x10(%rbp),%rax
mov    $0x64,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    1211 <c_timegm+0x111>
mov    -0x10(%rbp),%rax
mov    $0x190,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    1235 <c_timegm+0x135>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
cmp    $0x2,%edx
jge    1235 <c_timegm+0x135>
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%eax
sub    $0x1,%eax
cltq
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
imul   $0x18,-0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
imul   $0x3c,-0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    0x18(%rax),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
imul   $0x3c,-0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    0x10(%rax),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
cmpl   $0x1,0xc(%rax)
jne    12b0 <c_timegm+0x1b0>
mov    -0x18(%rbp),%rax
sub    $0xe10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<c_timegm>:
push   %r15
push   %r14
push   %rbx
movslq (%rdi),%r14
movslq 0x4(%rdi),%r8
imul   $0x2aaaaaab,%r8,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
sar    $0x21,%rax
add    %ecx,%eax
movslq %eax,%rcx
lea    (%r14,%rcx,1),%r10
lea    (%r14,%rcx,1),%r9
add    $0x76c,%r9
imul   $0x16d,%r9,%r11
lea    0x0(,%rcx,4),%eax
lea    (%rax,%rax,2),%eax
sub    %eax,%r8d
movslq %r8d,%rax
lea    0xeb0(%rip),%rdx
movslq (%rdx,%rax,4),%rbx
lea    (%r14,%rcx,1),%rax
add    $0xffffffffffffffbc,%rax
lea    (%r14,%rcx,1),%r15
add    $0xffffffffffffffbf,%r15
test   %rax,%rax
cmovns %rax,%r15
sar    $0x2,%r15
movabs $0x5c28f5c28f5c28f5,%rdx
f5 28 5c
mov    %r10,%rax
imul   %rdx
mov    %rdx,%rsi
sub    %r10,%rsi
mov    %rsi,%rax
shr    $0x3f,%rax
sar    $0x6,%rsi
add    %rax,%rsi
lea    (%r14,%rcx,1),%rax
add    $0x12c,%rax
movabs $0xa3d70a3d70a3d70b,%rcx
0a d7 a3
imul   %rcx
lea    (%rdx,%r10,1),%rax
add    $0x12c,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
sar    $0x8,%rax
add    %rcx,%rax
add    %r11,%rbx
add    %r15,%rbx
add    %rsi,%rbx
add    %rbx,%rax
add    $0xfffffffffff50736,%rax
test   $0x3,%r9b
jne    1220 <c_timegm+0x120>
imul   $0xc28f5c29,%r9d,%ecx
add    $0x51eb850,%ecx
ror    $0x2,%ecx
cmp    $0x28f5c28,%ecx
ja     1214 <c_timegm+0x114>
movslq %r9d,%rcx
imul   $0x51eb851f,%rcx,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x27,%rcx
add    %edx,%ecx
imul   $0x190,%ecx,%ecx
sub    %ecx,%r9d
jne    1220 <c_timegm+0x120>
xor    %ecx,%ecx
cmp    $0x2,%r8d
setl   %cl
sub    %rcx,%rax
movslq 0x8(%rdi),%rcx
add    %rax,%rcx
lea    (%rcx,%rcx,2),%rax
shl    $0x3,%rax
add    0x20(%rdi),%rax
imul   $0x3c,%rax,%rax
add    0x18(%rdi),%rax
imul   $0x3c,%rax,%rax
mov    0x10(%rdi),%rcx
cmpl   $0x1,0xc(%rdi)
lea    -0x15f90(%rax,%rcx,1),%rdx
ff
lea    -0x15180(%rax,%rcx,1),%rax
ff
cmove  %rdx,%rax
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
%struct.tm = type { i32, i32, i32, i32, i64, i64, i64 }
@c_timegm.cumdays = internal constant [12 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]
define i64 @c_timegm(%struct.tm* %0) {
%2 = alloca %struct.tm*
%3 = alloca i64
%4 = alloca i64
store %struct.tm* %0, %struct.tm** %2
%5 = load %struct.tm*, %struct.tm** %2
%6 = getelementptr inbounds %struct.tm, %struct.tm* %5, i32 0, i32 0
%7 = load i32, i32* %6
%8 = add nsw i32 1900, %7
%9 = load %struct.tm*, %struct.tm** %2
%10 = getelementptr inbounds %struct.tm, %struct.tm* %9, i32 0, i32 1
%11 = load i32, i32* %10
%12 = sdiv i32 %11, 12
%13 = add nsw i32 %8, %12
%14 = sext i32 %13 to i64
store i64 %14, i64* %3
%15 = load i64, i64* %3
%16 = sub nsw i64 %15, 1970
%17 = mul nsw i64 %16, 365
%18 = load %struct.tm*, %struct.tm** %2
%19 = getelementptr inbounds %struct.tm, %struct.tm* %18, i32 0, i32 1
%20 = load i32, i32* %19
%21 = srem i32 %20, 12
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds [12 x i32], [12 x i32]* @c_timegm.cumdays, i64 0, i64 %22
%24 = load i32, i32* %23
%25 = sext i32 %24 to i64
%26 = add nsw i64 %17, %25
store i64 %26, i64* %4
%27 = load i64, i64* %3
%28 = sub nsw i64 %27, 1968
%29 = sdiv i64 %28, 4
%30 = load i64, i64* %4
%31 = add nsw i64 %30, %29
store i64 %31, i64* %4
%32 = load i64, i64* %3
%33 = sub nsw i64 %32, 1900
%34 = sdiv i64 %33, 100
%35 = load i64, i64* %4
%36 = sub nsw i64 %35, %34
store i64 %36, i64* %4
%37 = load i64, i64* %3
%38 = sub nsw i64 %37, 1600
%39 = sdiv i64 %38, 400
%40 = load i64, i64* %4
%41 = add nsw i64 %40, %39
store i64 %41, i64* %4
%42 = load i64, i64* %3
%43 = srem i64 %42, 4
%44 = icmp eq i64 %43, 0
br i1 %44, label %45, label %62
45: ; preds = %1
%46 = load i64, i64* %3
%47 = srem i64 %46, 100
%48 = icmp ne i64 %47, 0
br i1 %48, label %53, label %49
49: ; preds = %45
%50 = load i64, i64* %3
%51 = srem i64 %50, 400
%52 = icmp eq i64 %51, 0
br i1 %52, label %53, label %62
53: ; preds = %49, %45
%54 = load %struct.tm*, %struct.tm** %2
%55 = getelementptr inbounds %struct.tm, %struct.tm* %54, i32 0, i32 1
%56 = load i32, i32* %55
%57 = srem i32 %56, 12
%58 = icmp slt i32 %57, 2
br i1 %58, label %59, label %62
59: ; preds = %53
%60 = load i64, i64* %4
%61 = add nsw i64 %60, -1
store i64 %61, i64* %4
br label %62
62: ; preds = %59, %53, %49, %1
%63 = load %struct.tm*, %struct.tm** %2
%64 = getelementptr inbounds %struct.tm, %struct.tm* %63, i32 0, i32 2
%65 = load i32, i32* %64
%66 = sub nsw i32 %65, 1
%67 = sext i32 %66 to i64
%68 = load i64, i64* %4
%69 = add nsw i64 %68, %67
store i64 %69, i64* %4
%70 = load i64, i64* %4
%71 = mul nsw i64 %70, 24
store i64 %71, i64* %4
%72 = load %struct.tm*, %struct.tm** %2
%73 = getelementptr inbounds %struct.tm, %struct.tm* %72, i32 0, i32 6
%74 = load i64, i64* %73
%75 = load i64, i64* %4
%76 = add nsw i64 %75, %74
store i64 %76, i64* %4
%77 = load i64, i64* %4
%78 = mul nsw i64 %77, 60
store i64 %78, i64* %4
%79 = load %struct.tm*, %struct.tm** %2
%80 = getelementptr inbounds %struct.tm, %struct.tm* %79, i32 0, i32 5
%81 = load i64, i64* %80
%82 = load i64, i64* %4
%83 = add nsw i64 %82, %81
store i64 %83, i64* %4
%84 = load i64, i64* %4
%85 = mul nsw i64 %84, 60
store i64 %85, i64* %4
%86 = load %struct.tm*, %struct.tm** %2
%87 = getelementptr inbounds %struct.tm, %struct.tm* %86, i32 0, i32 4
%88 = load i64, i64* %87
%89 = load i64, i64* %4
%90 = add nsw i64 %89, %88
store i64 %90, i64* %4
%91 = load %struct.tm*, %struct.tm** %2
%92 = getelementptr inbounds %struct.tm, %struct.tm* %91, i32 0, i32 3
%93 = load i32, i32* %92
%94 = icmp eq i32 %93, 1
br i1 %94, label %95, label %98
95: ; preds = %62
%96 = load i64, i64* %4
%97 = sub nsw i64 %96, 3600
store i64 %97, i64* %4
br label %98
98: ; preds = %95, %62
%99 = load i64, i64* %4
ret i64 %99
}

LLVM IR (-O2):
%struct.tm = type { i32, i32, i32, i32, i64, i64, i64 }
@c_timegm.cumdays = internal unnamed_addr constant [12 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]
define i64 @c_timegm(%struct.tm* nocapture %0) {
%2 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 0
%3 = load i32, i32* %2
%4 = add nsw i32 %3, 1900
%5 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 1
%6 = load i32, i32* %5
%7 = sdiv i32 %6, 12
%8 = add nsw i32 %4, %7
%9 = sext i32 %8 to i64
%10 = mul nsw i64 %9, 365
%11 = srem i32 %6, 12
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds [12 x i32], [12 x i32]* @c_timegm.cumdays, i64 0, i64 %12
%14 = load i32, i32* %13
%15 = sext i32 %14 to i64
%16 = add nsw i64 %9, -1968
%17 = sdiv i64 %16, 4
%18 = add nsw i64 %9, -1900
%19 = sdiv i64 %18, -100
%20 = add nsw i64 %9, -1600
%21 = sdiv i64 %20, 400
%22 = add nsw i64 %15, -719050
%23 = add nsw i64 %22, %10
%24 = add nsw i64 %23, %17
%25 = add nsw i64 %24, %19
%26 = add nsw i64 %25, %21
%27 = and i64 %9, 3
%28 = icmp eq i64 %27, 0
br i1 %28, label %29, label %39
29: ; preds = %1
%30 = srem i32 %8, 100
%31 = icmp ne i32 %30, 0
%32 = srem i32 %8, 400
%33 = icmp eq i32 %32, 0
%34 = or i1 %31, %33
br i1 %34, label %35, label %39
35: ; preds = %29
%36 = icmp slt i32 %11, 2
%37 = sext i1 %36 to i64
%38 = add nsw i64 %26, %37
br label %39
39: ; preds = %35, %29, %1
%40 = phi i64 [ %26, %1 ], [ %26, %29 ], [ %38, %35 ]
%41 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 2
%42 = load i32, i32* %41
%43 = add nsw i32 %42, -1
%44 = sext i32 %43 to i64
%45 = add nsw i64 %40, %44
%46 = mul nsw i64 %45, 24
%47 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 6
%48 = load i64, i64* %47
%49 = add nsw i64 %46, %48
%50 = mul nsw i64 %49, 60
%51 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 5
%52 = load i64, i64* %51
%53 = add nsw i64 %50, %52
%54 = mul nsw i64 %53, 60
%55 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 4
%56 = load i64, i64* %55
%57 = add nsw i64 %54, %56
%58 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 3
%59 = load i32, i32* %58
%60 = icmp eq i32 %59, 1
%61 = add nsw i64 %57, -3600
%62 = select i1 %60, i64 %61, i64 %57
ret i64 %62
}