#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 {
  scalar_t__ tm_sec;
  scalar_t__ tm_min;
  scalar_t__ tm_hour;
  scalar_t__ tm_mday;
  scalar_t__ tm_mon;
  scalar_t__ tm_year;
  scalar_t__ tm_wday;
  scalar_t__ tm_yday;
  scalar_t__ tm_isdst;
};

/* Variables and functions */
char diff_tm(struct tm *f, struct tm *s) {
  return s->tm_sec != f->tm_sec || s->tm_min != f->tm_min ||
         s->tm_hour != f->tm_hour || s->tm_mday != f->tm_mday ||
         s->tm_mon != f->tm_mon || s->tm_year != f->tm_year ||
         s->tm_wday != f->tm_wday || s->tm_yday != f->tm_yday ||
         s->tm_isdst != f->tm_isdst;
}


x86 assembly (clang, -O0):
<diff_tm>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rcx
mov    -0x8(%rbp),%rdx
mov    $0x1,%al
cmp    (%rdx),%rcx
mov    %al,-0x11(%rbp)
jne    11f8 <diff_tm+0xf8>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rcx
mov    -0x8(%rbp),%rdx
mov    $0x1,%al
cmp    0x8(%rdx),%rcx
mov    %al,-0x11(%rbp)
jne    11f8 <diff_tm+0xf8>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rcx
mov    -0x8(%rbp),%rdx
mov    $0x1,%al
cmp    0x10(%rdx),%rcx
mov    %al,-0x11(%rbp)
jne    11f8 <diff_tm+0xf8>
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rcx
mov    -0x8(%rbp),%rdx
mov    $0x1,%al
cmp    0x18(%rdx),%rcx
mov    %al,-0x11(%rbp)
jne    11f8 <diff_tm+0xf8>
mov    -0x10(%rbp),%rax
mov    0x20(%rax),%rcx
mov    -0x8(%rbp),%rdx
mov    $0x1,%al
cmp    0x20(%rdx),%rcx
mov    %al,-0x11(%rbp)
jne    11f8 <diff_tm+0xf8>
mov    -0x10(%rbp),%rax
mov    0x28(%rax),%rcx
mov    -0x8(%rbp),%rdx
mov    $0x1,%al
cmp    0x28(%rdx),%rcx
mov    %al,-0x11(%rbp)
jne    11f8 <diff_tm+0xf8>
mov    -0x10(%rbp),%rax
mov    0x30(%rax),%rcx
mov    -0x8(%rbp),%rdx
mov    $0x1,%al
cmp    0x30(%rdx),%rcx
mov    %al,-0x11(%rbp)
jne    11f8 <diff_tm+0xf8>
mov    -0x10(%rbp),%rax
mov    0x38(%rax),%rcx
mov    -0x8(%rbp),%rdx
mov    $0x1,%al
cmp    0x38(%rdx),%rcx
mov    %al,-0x11(%rbp)
jne    11f8 <diff_tm+0xf8>
mov    -0x10(%rbp),%rax
mov    0x40(%rax),%rax
mov    -0x8(%rbp),%rcx
cmp    0x40(%rcx),%rax
setne  %al
mov    %al,-0x11(%rbp)
mov    -0x11(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
movsbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<diff_tm>:
mov    (%rsi),%rcx
mov    $0x1,%al
cmp    (%rdi),%rcx
jne    115b <diff_tm+0x5b>
mov    0x8(%rsi),%rcx
cmp    0x8(%rdi),%rcx
jne    115b <diff_tm+0x5b>
mov    0x10(%rsi),%rcx
cmp    0x10(%rdi),%rcx
jne    115b <diff_tm+0x5b>
mov    0x18(%rsi),%rcx
cmp    0x18(%rdi),%rcx
jne    115b <diff_tm+0x5b>
mov    0x20(%rsi),%rcx
cmp    0x20(%rdi),%rcx
jne    115b <diff_tm+0x5b>
mov    0x28(%rsi),%rcx
cmp    0x28(%rdi),%rcx
jne    115b <diff_tm+0x5b>
mov    0x30(%rsi),%rcx
cmp    0x30(%rdi),%rcx
jne    115b <diff_tm+0x5b>
mov    0x38(%rsi),%rcx
cmp    0x38(%rdi),%rcx
jne    115b <diff_tm+0x5b>
mov    0x40(%rsi),%rax
cmp    0x40(%rdi),%rax
setne  %al
ret

LLVM IR (-O0):
%struct.tm = type { i64, i64, i64, i64, i64, i64, i64, i64, i64 }
define signext i8 @diff_tm(%struct.tm* %0, %struct.tm* %1) {
%3 = alloca %struct.tm*
%4 = alloca %struct.tm*
store %struct.tm* %0, %struct.tm** %3
store %struct.tm* %1, %struct.tm** %4
%5 = load %struct.tm*, %struct.tm** %4
%6 = getelementptr inbounds %struct.tm, %struct.tm* %5, i32 0, i32 0
%7 = load i64, i64* %6
%8 = load %struct.tm*, %struct.tm** %3
%9 = getelementptr inbounds %struct.tm, %struct.tm* %8, i32 0, i32 0
%10 = load i64, i64* %9
%11 = icmp ne i64 %7, %10
br i1 %11, label %76, label %12
12: ; preds = %2
%13 = load %struct.tm*, %struct.tm** %4
%14 = getelementptr inbounds %struct.tm, %struct.tm* %13, i32 0, i32 1
%15 = load i64, i64* %14
%16 = load %struct.tm*, %struct.tm** %3
%17 = getelementptr inbounds %struct.tm, %struct.tm* %16, i32 0, i32 1
%18 = load i64, i64* %17
%19 = icmp ne i64 %15, %18
br i1 %19, label %76, label %20
20: ; preds = %12
%21 = load %struct.tm*, %struct.tm** %4
%22 = getelementptr inbounds %struct.tm, %struct.tm* %21, i32 0, i32 2
%23 = load i64, i64* %22
%24 = load %struct.tm*, %struct.tm** %3
%25 = getelementptr inbounds %struct.tm, %struct.tm* %24, i32 0, i32 2
%26 = load i64, i64* %25
%27 = icmp ne i64 %23, %26
br i1 %27, label %76, label %28
28: ; preds = %20
%29 = load %struct.tm*, %struct.tm** %4
%30 = getelementptr inbounds %struct.tm, %struct.tm* %29, i32 0, i32 3
%31 = load i64, i64* %30
%32 = load %struct.tm*, %struct.tm** %3
%33 = getelementptr inbounds %struct.tm, %struct.tm* %32, i32 0, i32 3
%34 = load i64, i64* %33
%35 = icmp ne i64 %31, %34
br i1 %35, label %76, label %36
36: ; preds = %28
%37 = load %struct.tm*, %struct.tm** %4
%38 = getelementptr inbounds %struct.tm, %struct.tm* %37, i32 0, i32 4
%39 = load i64, i64* %38
%40 = load %struct.tm*, %struct.tm** %3
%41 = getelementptr inbounds %struct.tm, %struct.tm* %40, i32 0, i32 4
%42 = load i64, i64* %41
%43 = icmp ne i64 %39, %42
br i1 %43, label %76, label %44
44: ; preds = %36
%45 = load %struct.tm*, %struct.tm** %4
%46 = getelementptr inbounds %struct.tm, %struct.tm* %45, i32 0, i32 5
%47 = load i64, i64* %46
%48 = load %struct.tm*, %struct.tm** %3
%49 = getelementptr inbounds %struct.tm, %struct.tm* %48, i32 0, i32 5
%50 = load i64, i64* %49
%51 = icmp ne i64 %47, %50
br i1 %51, label %76, label %52
52: ; preds = %44
%53 = load %struct.tm*, %struct.tm** %4
%54 = getelementptr inbounds %struct.tm, %struct.tm* %53, i32 0, i32 6
%55 = load i64, i64* %54
%56 = load %struct.tm*, %struct.tm** %3
%57 = getelementptr inbounds %struct.tm, %struct.tm* %56, i32 0, i32 6
%58 = load i64, i64* %57
%59 = icmp ne i64 %55, %58
br i1 %59, label %76, label %60
60: ; preds = %52
%61 = load %struct.tm*, %struct.tm** %4
%62 = getelementptr inbounds %struct.tm, %struct.tm* %61, i32 0, i32 7
%63 = load i64, i64* %62
%64 = load %struct.tm*, %struct.tm** %3
%65 = getelementptr inbounds %struct.tm, %struct.tm* %64, i32 0, i32 7
%66 = load i64, i64* %65
%67 = icmp ne i64 %63, %66
br i1 %67, label %76, label %68
68: ; preds = %60
%69 = load %struct.tm*, %struct.tm** %4
%70 = getelementptr inbounds %struct.tm, %struct.tm* %69, i32 0, i32 8
%71 = load i64, i64* %70
%72 = load %struct.tm*, %struct.tm** %3
%73 = getelementptr inbounds %struct.tm, %struct.tm* %72, i32 0, i32 8
%74 = load i64, i64* %73
%75 = icmp ne i64 %71, %74
br label %76
76: ; preds = %68, %60, %52, %44, %36, %28, %20, %12, %2
%77 = phi i1 [ true, %60 ], [ true, %52 ], [ true, %44 ], [ true, %36 ], [ true, %28 ], [ true, %20 ], [ true, %12 ], [ true, %2 ], [ %75, %68 ]
%78 = zext i1 %77 to i32
%79 = trunc i32 %78 to i8
ret i8 %79
}

LLVM IR (-O2):
%struct.tm = type { i64, i64, i64, i64, i64, i64, i64, i64, i64 }
define signext i8 @diff_tm(%struct.tm* nocapture %0, %struct.tm* nocapture %1) {
%3 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 0
%4 = load i64, i64* %3
%5 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 0
%6 = load i64, i64* %5
%7 = icmp eq i64 %4, %6
br i1 %7, label %8, label %57
8: ; preds = %2
%9 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 1
%10 = load i64, i64* %9
%11 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 1
%12 = load i64, i64* %11
%13 = icmp eq i64 %10, %12
br i1 %13, label %14, label %57
14: ; preds = %8
%15 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 2
%16 = load i64, i64* %15
%17 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 2
%18 = load i64, i64* %17
%19 = icmp eq i64 %16, %18
br i1 %19, label %20, label %57
20: ; preds = %14
%21 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 3
%22 = load i64, i64* %21
%23 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 3
%24 = load i64, i64* %23
%25 = icmp eq i64 %22, %24
br i1 %25, label %26, label %57
26: ; preds = %20
%27 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 4
%28 = load i64, i64* %27
%29 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 4
%30 = load i64, i64* %29
%31 = icmp eq i64 %28, %30
br i1 %31, label %32, label %57
32: ; preds = %26
%33 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 5
%34 = load i64, i64* %33
%35 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 5
%36 = load i64, i64* %35
%37 = icmp eq i64 %34, %36
br i1 %37, label %38, label %57
38: ; preds = %32
%39 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 6
%40 = load i64, i64* %39
%41 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 6
%42 = load i64, i64* %41
%43 = icmp eq i64 %40, %42
br i1 %43, label %44, label %57
44: ; preds = %38
%45 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 7
%46 = load i64, i64* %45
%47 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 7
%48 = load i64, i64* %47
%49 = icmp eq i64 %46, %48
br i1 %49, label %50, label %57
50: ; preds = %44
%51 = getelementptr inbounds %struct.tm, %struct.tm* %1, i64 0, i32 8
%52 = load i64, i64* %51
%53 = getelementptr inbounds %struct.tm, %struct.tm* %0, i64 0, i32 8
%54 = load i64, i64* %53
%55 = icmp ne i64 %52, %54
%56 = zext i1 %55 to i8
br label %57
57: ; preds = %50, %44, %38, %32, %26, %20, %14, %8, %2
%58 = phi i8 [ 1, %44 ], [ 1, %38 ], [ 1, %32 ], [ 1, %26 ], [ 1, %20 ], [ 1, %14 ], [ 1, %8 ], [ 1, %2 ], [ %56, %50 ]
ret i8 %58
}