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

/* Variables and functions */
time_t mkgmtime(struct tm *t) {
  short month, year;
  time_t result;
  static int m_to_d[12] = {0,   31,  59,  90,  120, 151,
                           181, 212, 243, 273, 304, 334};
  month = t->tm_mon;
  year = t->tm_year + month / 12 + 1900;
  month %= 12;
  if (month < 0) {
    year -= 1;
    month += 12;
  }
  result = (year - 1970) * 365 + m_to_d[month];
  if (month <= 1)
    year -= 1;
  result += (year - 1968) / 4;
  result -= (year - 1900) / 100;
  result += (year - 1600) / 400;
  result += t->tm_mday;
  result -= 1;
  result *= 24;
  result += t->tm_hour;
  result *= 60;
  result += t->tm_min;
  result *= 60;
  result += t->tm_sec;
  return (result);
}


x86 assembly (clang, -O0):
<mkgmtime>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0xa(%rbp)
mov    -0x8(%rbp),%rax
movswl 0x2(%rax),%eax
mov    %eax,-0x14(%rbp)
movswl -0xa(%rbp),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x14(%rbp),%eax
add    %ecx,%eax
add    $0x76c,%eax
mov    %ax,-0xc(%rbp)
movswl -0xa(%rbp),%eax
mov    $0xc,%ecx
cltd
idiv   %ecx
mov    %dx,%ax
mov    %ax,-0xa(%rbp)
movswl -0xa(%rbp),%eax
cmp    $0x0,%eax
jge    1170 <mkgmtime+0x70>
movswl -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %ax,-0xc(%rbp)
movswl -0xa(%rbp),%eax
add    $0xc,%eax
mov    %ax,-0xa(%rbp)
movswl -0xc(%rbp),%eax
sub    $0x7b2,%eax
imul   $0x16d,%eax,%eax
movswq -0xa(%rbp),%rdx
lea    0x2ea5(%rip),%rcx
add    (%rcx,%rdx,4),%eax
mov    %ax,-0xe(%rbp)
movswl -0xa(%rbp),%eax
cmp    $0x1,%eax
jg     11aa <mkgmtime+0xaa>
movswl -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %ax,-0xc(%rbp)
movswl -0xc(%rbp),%eax
sub    $0x7b0,%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
movswl -0xe(%rbp),%eax
add    %ecx,%eax
mov    %ax,-0xe(%rbp)
movswl -0xc(%rbp),%eax
sub    $0x76c,%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
movswl -0xe(%rbp),%eax
sub    %ecx,%eax
mov    %ax,-0xe(%rbp)
movswl -0xc(%rbp),%eax
sub    $0x640,%eax
mov    $0x190,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
movswl -0xe(%rbp),%eax
add    %ecx,%eax
mov    %ax,-0xe(%rbp)
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%rcx
movswq -0xe(%rbp),%rax
add    %rcx,%rax
mov    %ax,-0xe(%rbp)
movswl -0xe(%rbp),%eax
sub    $0x1,%eax
mov    %ax,-0xe(%rbp)
movswl -0xe(%rbp),%eax
imul   $0x18,%eax,%eax
mov    %ax,-0xe(%rbp)
mov    -0x8(%rbp),%rax
mov    0x18(%rax),%rcx
movswq -0xe(%rbp),%rax
add    %rcx,%rax
mov    %ax,-0xe(%rbp)
movswl -0xe(%rbp),%eax
imul   $0x3c,%eax,%eax
mov    %ax,-0xe(%rbp)
mov    -0x8(%rbp),%rax
mov    0x10(%rax),%rcx
movswq -0xe(%rbp),%rax
add    %rcx,%rax
mov    %ax,-0xe(%rbp)
movswl -0xe(%rbp),%eax
imul   $0x3c,%eax,%eax
mov    %ax,-0xe(%rbp)
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%rcx
movswq -0xe(%rbp),%rax
add    %rcx,%rax
mov    %ax,-0xe(%rbp)
movswl -0xe(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<mkgmtime>:
movswl (%rdi),%eax
imul   $0x2aab,%eax,%ecx
mov    %ecx,%edx
shr    $0x1f,%edx
sar    $0x11,%ecx
add    %edx,%ecx
movzwl 0x2(%rdi),%edx
add    %cx,%dx
shl    $0x2,%ecx
lea    (%rcx,%rcx,2),%ecx
sub    %ecx,%eax
cwtl
lea    0xc(%rax),%ecx
test   %ax,%ax
cmovns %eax,%ecx
sar    $0xf,%eax
add    %eax,%edx
add    $0x76c,%edx
lea    0xec2(%rip),%rax
mov    (%rax,%rcx,4),%eax
cmp    $0x2,%ecx
movswl %dx,%ecx
sbb    $0x0,%dx
imul   $0x16d,%ecx,%r8d
movswl %dx,%ecx
lea    -0x7b0(%rcx),%esi
lea    -0x7ad(%rcx),%r9d
test   %esi,%esi
cmovns %esi,%r9d
sar    $0x2,%r9d
lea    -0x76c(%rcx),%esi
movslq %esi,%rsi
imul   $0xffffffffae147ae1,%rsi,%rsi
mov    %rsi,%rdx
shr    $0x3f,%rdx
shr    $0x20,%rsi
sar    $0x5,%esi
add    %edx,%esi
add    $0xfffff9c0,%ecx
movslq %ecx,%rcx
imul   $0x51eb851f,%rcx,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
shr    $0x20,%rcx
sar    $0x7,%ecx
add    %edx,%ecx
add    0x20(%rdi),%eax
add    %r8d,%eax
add    %r9d,%eax
add    %esi,%eax
add    %ecx,%eax
add    $0x736,%eax
lea    (%rax,%rax,2),%rcx
shl    $0x33,%rcx
movabs $0xffe8000000000000,%rax
add    %rcx,%rax
shr    $0x30,%rax
add    0x18(%rdi),%rax
movabs $0x3c000000000000,%rcx
imul   %rcx,%rax
shr    $0x30,%rax
add    0x10(%rdi),%rax
imul   %rcx,%rax
shr    $0x30,%rax
add    0x8(%rdi),%eax
ret

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

LLVM IR (-O2):
%struct.tm = type { i16, i16, i64, i64, i64, i64 }
@mkgmtime.m_to_d = 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 signext i16 @mkgmtime(%struct.tm* nocapture %0) {
%2 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 0
%3 = load i16, i16* %2
%4 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 1
%5 = load i16, i16* %4
%6 = sdiv i16 %3, 12
%7 = add i16 %5, %6
%8 = srem i16 %3, 12
%9 = sext i16 %8 to i32
%10 = icmp slt i16 %8, 0
%11 = add nsw i32 %9, 12
%12 = select i1 %10, i32 %11, i32 %9
%13 = select i1 %10, i16 1899, i16 1900
%14 = add i16 %7, %13
%15 = zext i32 %12 to i64
%16 = getelementptr inbounds [12 x i32], [12 x i32]* @mkgmtime.m_to_d, i64 0, i64 %15
%17 = load i32, i32* %16
%18 = icmp ult i32 %12, 2
%19 = sext i1 %18 to i16
%20 = add i16 %14, %19
%21 = sext i16 %14 to i32
%22 = mul nsw i32 %21, 365
%23 = sext i16 %20 to i32
%24 = add nsw i32 %23, -1968
%25 = sdiv i32 %24, 4
%26 = add nsw i32 %23, -1900
%27 = sdiv i32 %26, -100
%28 = add nsw i32 %23, -1600
%29 = sdiv i32 %28, 400
%30 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 5
%31 = load i64, i64* %30
%32 = trunc i64 %31 to i32
%33 = add i32 %17, 1846
%34 = add i32 %33, %32
%35 = add i32 %34, %22
%36 = add i32 %35, %25
%37 = add i32 %36, %27
%38 = add i32 %37, %29
%39 = zext i32 %38 to i64
%40 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 4
%41 = load i64, i64* %40
%42 = mul i64 %39, 6755399441055744
%43 = add i64 %42, -6755399441055744
%44 = lshr exact i64 %43, 48
%45 = add i64 %44, %41
%46 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 3
%47 = load i64, i64* %46
%48 = mul i64 %45, 16888498602639360
%49 = lshr exact i64 %48, 48
%50 = add i64 %49, %47
%51 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 2
%52 = load i64, i64* %51
%53 = mul i64 %50, 16888498602639360
%54 = lshr exact i64 %53, 48
%55 = add i64 %54, %52
%56 = trunc i64 %55 to i16
ret i16 %56
}