#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 timeval {
  scalar_t__ tv_sec;
  scalar_t__ tv_usec;
};

/* Variables and functions */
int /*<<< orphan*/ printf(char *, scalar_t__);
void do_difftime(struct timeval *op1, struct timeval *op2) {
  int borrow = 0, sign = 0;
  struct timeval *temp_time, res;
  if ((op1->tv_sec < op2->tv_sec ||
       (op1->tv_sec == op2->tv_sec && op1->tv_usec < op2->tv_usec))) {
    temp_time = op1;
    op1 = op2;
    op2 = temp_time;
    sign = 1;
  }
  if (op1->tv_usec >= op2->tv_usec) {
    res.tv_usec = op1->tv_usec - op2->tv_usec;
  } else {
    res.tv_usec = (op1->tv_usec + 1000000) - op2->tv_usec;
    borrow = 1;
  }
  res.tv_sec = (op1->tv_sec - op2->tv_sec) - borrow;
  printf("%F\n", res.tv_sec + ((double)res.tv_usec) / 1000000);
}


x86 assembly (clang, -O0):
<do_difftime>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%rax
jl     116c <do_difftime+0x5c>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%rax
jne    118b <do_difftime+0x7b>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%rax
mov    -0x10(%rbp),%rcx
cmp    0x8(%rcx),%rax
jge    118b <do_difftime+0x7b>
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x10(%rbp)
movl   $0x1,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%rax
mov    -0x10(%rbp),%rcx
cmp    0x8(%rcx),%rax
jl     11ba <do_difftime+0xaa>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%rax
mov    -0x10(%rbp),%rcx
sub    0x8(%rcx),%rax
mov    %rax,-0x28(%rbp)
jmp    11db <do_difftime+0xcb>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%rax
add    $0xf4240,%rax
mov    -0x10(%rbp),%rcx
sub    0x8(%rcx),%rax
mov    %rax,-0x28(%rbp)
movl   $0x1,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x10(%rbp),%rcx
sub    (%rcx),%rax
movslq -0x14(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
cvtsi2sdq -0x30(%rbp),%xmm0
cvtsi2sdq -0x28(%rbp),%xmm1
movsd  0xdf8(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rsi
lea    0xdec(%rip),%rdi
call   1030 <printf@plt>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<do_difftime>:
mov    (%rdi),%rdx
mov    (%rsi),%rax
cmp    %rax,%rdx
jge    1123 <do_difftime+0x13>
mov    %rdx,%r8
mov    %rdi,%rdx
jmp    1140 <do_difftime+0x30>
jne    1134 <do_difftime+0x24>
mov    0x8(%rdi),%rcx
cmp    0x8(%rsi),%rcx
jl     111b <do_difftime+0xb>
mov    %rdx,%r8
jmp    1137 <do_difftime+0x27>
mov    %rax,%r8
mov    %rdx,%rax
mov    %rsi,%rdx
mov    %rdi,%rsi
mov    0x8(%rsi),%rsi
mov    0x8(%rdx),%rdx
lea    0xf4240(%rsi),%rdi
xor    %ecx,%ecx
cmp    %rdx,%rsi
setl   %cl
cmovge %rsi,%rdi
sub    %rdx,%rdi
sub    %r8,%rax
sub    %rcx,%rax
cvtsi2sd %rax,%xmm0
cvtsi2sd %rdi,%xmm1
divsd  0xe8a(%rip),%xmm1
addsd  %xmm0,%xmm1
cvttsd2si %xmm1,%rsi
lea    0xe82(%rip),%rdi
jmp    1030 <printf@plt>

LLVM IR (-O0):
%struct.timeval = type { i64, i64 }
@.str = [4 x i8] c"%F\0A\00"
define void @do_difftime(%struct.timeval* %0, %struct.timeval* %1) {
%3 = alloca %struct.timeval*
%4 = alloca %struct.timeval*
%5 = alloca i32
%6 = alloca i32
%7 = alloca %struct.timeval*
%8 = alloca %struct.timeval
store %struct.timeval* %0, %struct.timeval** %3
store %struct.timeval* %1, %struct.timeval** %4
store i32 0, i32* %5
store i32 0, i32* %6
%9 = load %struct.timeval*, %struct.timeval** %3
%10 = getelementptr inbounds %struct.timeval, %struct.timeval* %9, i32 0, i32 0
%11 = load i64, i64* %10
%12 = load %struct.timeval*, %struct.timeval** %4
%13 = getelementptr inbounds %struct.timeval, %struct.timeval* %12, i32 0, i32 0
%14 = load i64, i64* %13
%15 = icmp slt i64 %11, %14
br i1 %15, label %32, label %16
16: ; preds = %2
%17 = load %struct.timeval*, %struct.timeval** %3
%18 = getelementptr inbounds %struct.timeval, %struct.timeval* %17, i32 0, i32 0
%19 = load i64, i64* %18
%20 = load %struct.timeval*, %struct.timeval** %4
%21 = getelementptr inbounds %struct.timeval, %struct.timeval* %20, i32 0, i32 0
%22 = load i64, i64* %21
%23 = icmp eq i64 %19, %22
br i1 %23, label %24, label %36
24: ; preds = %16
%25 = load %struct.timeval*, %struct.timeval** %3
%26 = getelementptr inbounds %struct.timeval, %struct.timeval* %25, i32 0, i32 1
%27 = load i64, i64* %26
%28 = load %struct.timeval*, %struct.timeval** %4
%29 = getelementptr inbounds %struct.timeval, %struct.timeval* %28, i32 0, i32 1
%30 = load i64, i64* %29
%31 = icmp slt i64 %27, %30
br i1 %31, label %32, label %36
32: ; preds = %24, %2
%33 = load %struct.timeval*, %struct.timeval** %3
store %struct.timeval* %33, %struct.timeval** %7
%34 = load %struct.timeval*, %struct.timeval** %4
store %struct.timeval* %34, %struct.timeval** %3
%35 = load %struct.timeval*, %struct.timeval** %7
store %struct.timeval* %35, %struct.timeval** %4
store i32 1, i32* %6
br label %36
36: ; preds = %32, %24, %16
%37 = load %struct.timeval*, %struct.timeval** %3
%38 = getelementptr inbounds %struct.timeval, %struct.timeval* %37, i32 0, i32 1
%39 = load i64, i64* %38
%40 = load %struct.timeval*, %struct.timeval** %4
%41 = getelementptr inbounds %struct.timeval, %struct.timeval* %40, i32 0, i32 1
%42 = load i64, i64* %41
%43 = icmp sge i64 %39, %42
br i1 %43, label %44, label %53
44: ; preds = %36
%45 = load %struct.timeval*, %struct.timeval** %3
%46 = getelementptr inbounds %struct.timeval, %struct.timeval* %45, i32 0, i32 1
%47 = load i64, i64* %46
%48 = load %struct.timeval*, %struct.timeval** %4
%49 = getelementptr inbounds %struct.timeval, %struct.timeval* %48, i32 0, i32 1
%50 = load i64, i64* %49
%51 = sub nsw i64 %47, %50
%52 = getelementptr inbounds %struct.timeval, %struct.timeval* %8, i32 0, i32 1
store i64 %51, i64* %52
br label %63
53: ; preds = %36
%54 = load %struct.timeval*, %struct.timeval** %3
%55 = getelementptr inbounds %struct.timeval, %struct.timeval* %54, i32 0, i32 1
%56 = load i64, i64* %55
%57 = add nsw i64 %56, 1000000
%58 = load %struct.timeval*, %struct.timeval** %4
%59 = getelementptr inbounds %struct.timeval, %struct.timeval* %58, i32 0, i32 1
%60 = load i64, i64* %59
%61 = sub nsw i64 %57, %60
%62 = getelementptr inbounds %struct.timeval, %struct.timeval* %8, i32 0, i32 1
store i64 %61, i64* %62
store i32 1, i32* %5
br label %63
63: ; preds = %53, %44
%64 = load %struct.timeval*, %struct.timeval** %3
%65 = getelementptr inbounds %struct.timeval, %struct.timeval* %64, i32 0, i32 0
%66 = load i64, i64* %65
%67 = load %struct.timeval*, %struct.timeval** %4
%68 = getelementptr inbounds %struct.timeval, %struct.timeval* %67, i32 0, i32 0
%69 = load i64, i64* %68
%70 = sub nsw i64 %66, %69
%71 = load i32, i32* %5
%72 = sext i32 %71 to i64
%73 = sub nsw i64 %70, %72
%74 = getelementptr inbounds %struct.timeval, %struct.timeval* %8, i32 0, i32 0
store i64 %73, i64* %74
%75 = getelementptr inbounds %struct.timeval, %struct.timeval* %8, i32 0, i32 0
%76 = load i64, i64* %75
%77 = sitofp i64 %76 to double
%78 = getelementptr inbounds %struct.timeval, %struct.timeval* %8, i32 0, i32 1
%79 = load i64, i64* %78
%80 = sitofp i64 %79 to double
%81 = fdiv double %80, 1.000000e+06
%82 = fadd double %77, %81
%83 = fptosi double %82 to i64
%84 = call i32 @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i64 %83)
ret void
}

LLVM IR (-O2):
%struct.timeval = type { i64, i64 }
@.str = [4 x i8] c"%F\0A\00"
define void @do_difftime(%struct.timeval* nocapture %0, %struct.timeval* nocapture %1) {
%3 = getelementptr inbounds %struct.timeval, %struct.timeval* %0, i64 0, i32 0
%4 = load i64, i64* %3
%5 = getelementptr inbounds %struct.timeval, %struct.timeval* %1, i64 0, i32 0
%6 = load i64, i64* %5
%7 = icmp slt i64 %4, %6
br i1 %7, label %16, label %8
8: ; preds = %2
%9 = icmp eq i64 %4, %6
br i1 %9, label %10, label %17
10: ; preds = %8
%11 = getelementptr inbounds %struct.timeval, %struct.timeval* %0, i64 0, i32 1
%12 = load i64, i64* %11
%13 = getelementptr inbounds %struct.timeval, %struct.timeval* %1, i64 0, i32 1
%14 = load i64, i64* %13
%15 = icmp slt i64 %12, %14
br i1 %15, label %16, label %17
16: ; preds = %10, %2
br label %17
17: ; preds = %16, %10, %8
%18 = phi i64 [ %4, %16 ], [ %4, %10 ], [ %6, %8 ]
%19 = phi i64 [ %6, %16 ], [ %4, %10 ], [ %4, %8 ]
%20 = phi %struct.timeval* [ %0, %16 ], [ %1, %10 ], [ %1, %8 ]
%21 = phi %struct.timeval* [ %1, %16 ], [ %0, %10 ], [ %0, %8 ]
%22 = getelementptr inbounds %struct.timeval, %struct.timeval* %21, i64 0, i32 1
%23 = load i64, i64* %22
%24 = getelementptr inbounds %struct.timeval, %struct.timeval* %20, i64 0, i32 1
%25 = load i64, i64* %24
%26 = icmp slt i64 %23, %25
%27 = add nsw i64 %23, 1000000
%28 = sext i1 %26 to i64
%29 = select i1 %26, i64 %27, i64 %23
%30 = sub nsw i64 %29, %25
%31 = sub i64 %19, %18
%32 = add i64 %31, %28
%33 = sitofp i64 %32 to double
%34 = sitofp i64 %30 to double
%35 = fdiv double %34, 1.000000e+06
%36 = fadd double %35, %33
%37 = fptosi double %36 to i64
%38 = tail call i32 @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i64 %37)
ret void
}