#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 */

/* Variables and functions */
double fabs(double);
int compareTimes(int iy1, int iy2, int im1, int im2, int id1, int id2, int ih1,
                 int ih2, int imn1, int imn2, double s1, double s2,
                 double tolerance) {
  double time1, time2;
  if (iy1 != iy2)
    return (iy1 < iy2 ? -1 : 1);
  if (im1 != im2)
    return (im1 < im2 ? -1 : 1);
  if (id1 != id2)
    return (id1 < id2 ? -1 : 1);
  time1 = 60.0 * (60.0 * (double)ih1 + (double)imn1) + s1;
  time2 = 60.0 * (60.0 * (double)ih2 + (double)imn2) + s2;
  if (fabs(time1 - time2) > tolerance)
    return (time1 < time2 ? -1 : 1);
  return (0);
}


x86 assembly (clang, -O0):
<compareTimes>:
push   %rbp
mov    %rsp,%rbp
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9d,-0x1c(%rbp)
movsd  %xmm0,-0x28(%rbp)
movsd  %xmm1,-0x30(%rbp)
movsd  %xmm2,-0x38(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0xc(%rbp),%eax
je     115c <compareTimes+0x5c>
mov    -0x8(%rbp),%edx
mov    -0xc(%rbp),%esi
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    %esi,%edx
cmovl  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1260 <compareTimes+0x160>
mov    -0x10(%rbp),%eax
cmp    -0x14(%rbp),%eax
je     1185 <compareTimes+0x85>
mov    -0x10(%rbp),%edx
mov    -0x14(%rbp),%esi
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    %esi,%edx
cmovl  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1260 <compareTimes+0x160>
mov    -0x18(%rbp),%eax
cmp    -0x1c(%rbp),%eax
je     11ae <compareTimes+0xae>
mov    -0x18(%rbp),%edx
mov    -0x1c(%rbp),%esi
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    %esi,%edx
cmovl  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1260 <compareTimes+0x160>
cvtsi2sdl 0x10(%rbp),%xmm0
cvtsi2sdl 0x20(%rbp),%xmm1
movsd  0xe50(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
movsd  0xe3b(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
cvtsi2sdl 0x18(%rbp),%xmm0
cvtsi2sdl 0x28(%rbp),%xmm1
movsd  0xe1c(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x30(%rbp),%xmm1
movsd  0xe07(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
subsd  -0x48(%rbp),%xmm0
movaps 0xdd9(%rip),%xmm1
pand   %xmm1,%xmm0
ucomisd -0x38(%rbp),%xmm0
jbe    1259 <compareTimes+0x159>
movsd  -0x40(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm0
mov    $0x1,%eax
mov    $0xffffffff,%ecx
ucomisd %xmm1,%xmm0
cmova  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1260 <compareTimes+0x160>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<compareTimes>:
cmp    %esi,%edi
jne    117a <compareTimes+0x7a>
cmp    %ecx,%edx
jne    117a <compareTimes+0x7a>
cmp    %r9d,%r8d
jne    117a <compareTimes+0x7a>
movss  0x10(%rsp),%xmm3
movss  0x8(%rsp),%xmm4
unpcklps %xmm3,%xmm4
cvtdq2pd %xmm4,%xmm3
movss  0x20(%rsp),%xmm4
movss  0x18(%rsp),%xmm5
unpcklps %xmm4,%xmm5
cvtdq2pd %xmm5,%xmm4
movapd 0xec5(%rip),%xmm5
mulpd  %xmm5,%xmm3
addpd  %xmm4,%xmm3
unpcklpd %xmm1,%xmm0
mulpd  %xmm5,%xmm3
addpd  %xmm0,%xmm3
movapd %xmm3,%xmm0
unpckhpd %xmm3,%xmm0
movapd %xmm3,%xmm1
subsd  %xmm0,%xmm1
andpd  0xea9(%rip),%xmm1
xor    %eax,%eax
ucomisd %xmm2,%xmm1
jbe    1185 <compareTimes+0x85>
xor    %eax,%eax
ucomisd %xmm3,%xmm0
setbe  %al
jmp    1180 <compareTimes+0x80>
setge  %al
movzbl %al,%eax
add    %eax,%eax
add    $0xffffffff,%eax
ret

LLVM IR (-O0):
define i32 @compareTimes(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, double %10, double %11, double %12) {
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
store i32 %0, i32* %15
store i32 %1, i32* %16
store i32 %2, i32* %17
store i32 %3, i32* %18
store i32 %4, i32* %19
store i32 %5, i32* %20
store i32 %6, i32* %21
store i32 %7, i32* %22
store i32 %8, i32* %23
store i32 %9, i32* %24
store double %10, double* %25
store double %11, double* %26
store double %12, double* %27
%30 = load i32, i32* %15
%31 = load i32, i32* %16
%32 = icmp ne i32 %30, %31
br i1 %32, label %33, label %39
33: ; preds = %13
%34 = load i32, i32* %15
%35 = load i32, i32* %16
%36 = icmp slt i32 %34, %35
%37 = zext i1 %36 to i64
%38 = select i1 %36, i32 -1, i32 1
store i32 %38, i32* %14
br label %87
39: ; preds = %13
%40 = load i32, i32* %17
%41 = load i32, i32* %18
%42 = icmp ne i32 %40, %41
br i1 %42, label %43, label %49
43: ; preds = %39
%44 = load i32, i32* %17
%45 = load i32, i32* %18
%46 = icmp slt i32 %44, %45
%47 = zext i1 %46 to i64
%48 = select i1 %46, i32 -1, i32 1
store i32 %48, i32* %14
br label %87
49: ; preds = %39
%50 = load i32, i32* %19
%51 = load i32, i32* %20
%52 = icmp ne i32 %50, %51
br i1 %52, label %53, label %59
53: ; preds = %49
%54 = load i32, i32* %19
%55 = load i32, i32* %20
%56 = icmp slt i32 %54, %55
%57 = zext i1 %56 to i64
%58 = select i1 %56, i32 -1, i32 1
store i32 %58, i32* %14
br label %87
59: ; preds = %49
%60 = load i32, i32* %21
%61 = sitofp i32 %60 to double
%62 = load i32, i32* %23
%63 = sitofp i32 %62 to double
%64 = call double @llvm.fmuladd.f64(double 6.000000e+01, double %61, double %63)
%65 = load double, double* %25
%66 = call double @llvm.fmuladd.f64(double 6.000000e+01, double %64, double %65)
store double %66, double* %28
%67 = load i32, i32* %22
%68 = sitofp i32 %67 to double
%69 = load i32, i32* %24
%70 = sitofp i32 %69 to double
%71 = call double @llvm.fmuladd.f64(double 6.000000e+01, double %68, double %70)
%72 = load double, double* %26
%73 = call double @llvm.fmuladd.f64(double 6.000000e+01, double %71, double %72)
store double %73, double* %29
%74 = load double, double* %28
%75 = load double, double* %29
%76 = fsub double %74, %75
%77 = call double @llvm.fabs.f64(double %76)
%78 = load double, double* %27
%79 = fcmp ogt double %77, %78
br i1 %79, label %80, label %86
80: ; preds = %59
%81 = load double, double* %28
%82 = load double, double* %29
%83 = fcmp olt double %81, %82
%84 = zext i1 %83 to i64
%85 = select i1 %83, i32 -1, i32 1
store i32 %85, i32* %14
br label %87
86: ; preds = %59
store i32 0, i32* %14
br label %87
87: ; preds = %86, %80, %53, %43, %33
%88 = load i32, i32* %14
ret i32 %88
}

LLVM IR (-O2):
define i32 @compareTimes(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, double %10, double %11, double %12) {
%14 = icmp eq i32 %0, %1
br i1 %14, label %18, label %15
15: ; preds = %13
%16 = icmp slt i32 %0, %1
%17 = select i1 %16, i32 -1, i32 1
br label %47
18: ; preds = %13
%19 = icmp eq i32 %2, %3
br i1 %19, label %23, label %20
20: ; preds = %18
%21 = icmp slt i32 %2, %3
%22 = select i1 %21, i32 -1, i32 1
br label %47
23: ; preds = %18
%24 = icmp eq i32 %4, %5
br i1 %24, label %28, label %25
25: ; preds = %23
%26 = icmp slt i32 %4, %5
%27 = select i1 %26, i32 -1, i32 1
br label %47
28: ; preds = %23
%29 = insertelement <2 x i32> poison, i32 %6, i64 0
%30 = insertelement <2 x i32> %29, i32 %7, i64 1
%31 = sitofp <2 x i32> %30 to <2 x double>
%32 = insertelement <2 x i32> poison, i32 %8, i64 0
%33 = insertelement <2 x i32> %32, i32 %9, i64 1
%34 = sitofp <2 x i32> %33 to <2 x double>
%35 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %31, <2 x double> <double 6.000000e+01, double 6.000000e+01>, <2 x double> %34)
%36 = insertelement <2 x double> poison, double %10, i64 0
%37 = insertelement <2 x double> %36, double %11, i64 1
%38 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %35, <2 x double> <double 6.000000e+01, double 6.000000e+01>, <2 x double> %37)
%39 = extractelement <2 x double> %38, i64 0
%40 = extractelement <2 x double> %38, i64 1
%41 = fsub double %39, %40
%42 = tail call double @llvm.fabs.f64(double %41)
%43 = fcmp ogt double %42, %12
br i1 %43, label %44, label %47
44: ; preds = %28
%45 = fcmp olt double %39, %40
%46 = select i1 %45, i32 -1, i32 1
br label %47
47: ; preds = %28, %44, %25, %20, %15
%48 = phi i32 [ %17, %15 ], [ %22, %20 ], [ %27, %25 ], [ %46, %44 ], [ 0, %28 ]
ret i32 %48
}