#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 isDifferentPeriods(double period1, double period2, double T) {
  int a, b;
  double period1mul;
  if (T * fabs(period2 - period1) < period2 * period1)
    return (0);
  for (a = 1; a < 5; a++)
    for (b = a + 1; b <= 5; b++) {
      period1mul = period1 * b / a;
      if (T * fabs(period2 - period1mul) < period2 * period1mul)
        return (0);
    }
  return (1);
}


x86 assembly (clang, -O0):
<isDifferentPeriods>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movaps 0xed7(%rip),%xmm2
pand   %xmm2,%xmm0
mulsd  %xmm0,%xmm1
movsd  -0x18(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1151 <isDifferentPeriods+0x51>
movl   $0x0,-0x4(%rbp)
jmp    11fc <isDifferentPeriods+0xfc>
movl   $0x1,-0x24(%rbp)
cmpl   $0x5,-0x24(%rbp)
jge    11f5 <isDifferentPeriods+0xf5>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x5,-0x28(%rbp)
jg     11e2 <isDifferentPeriods+0xe2>
movsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x28(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x24(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
subsd  -0x30(%rbp),%xmm0
movaps 0xe59(%rip),%xmm2
pand   %xmm2,%xmm0
mulsd  %xmm0,%xmm1
movsd  -0x18(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11cf <isDifferentPeriods+0xcf>
movl   $0x0,-0x4(%rbp)
jmp    11fc <isDifferentPeriods+0xfc>
jmp    11d4 <isDifferentPeriods+0xd4>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    116b <isDifferentPeriods+0x6b>
jmp    11e7 <isDifferentPeriods+0xe7>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1158 <isDifferentPeriods+0x58>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<isDifferentPeriods>:
movapd %xmm1,%xmm3
subsd  %xmm0,%xmm3
andpd  0xef0(%rip),%xmm3
mulsd  %xmm2,%xmm3
movapd %xmm0,%xmm4
mulsd  %xmm1,%xmm4
xor    %eax,%eax
ucomisd %xmm3,%xmm4
ja     12e3 <isDifferentPeriods+0x1e3>
movapd %xmm0,%xmm3
addsd  %xmm0,%xmm3
movapd %xmm1,%xmm4
subsd  %xmm3,%xmm4
andpd  0xec0(%rip),%xmm4
mulsd  %xmm2,%xmm4
mulsd  %xmm1,%xmm3
ucomisd %xmm4,%xmm3
ja     12e1 <isDifferentPeriods+0x1e1>
movsd  0xeb6(%rip),%xmm4
mulsd  %xmm0,%xmm4
movapd %xmm1,%xmm3
subsd  %xmm4,%xmm3
andpd  0xe92(%rip),%xmm3
mulsd  %xmm2,%xmm3
movapd %xmm4,%xmm5
mulsd  %xmm1,%xmm5
ucomisd %xmm3,%xmm5
ja     12e1 <isDifferentPeriods+0x1e1>
movsd  0xe8c(%rip),%xmm3
mulsd  %xmm0,%xmm3
movapd %xmm1,%xmm5
subsd  %xmm3,%xmm5
andpd  0xe60(%rip),%xmm5
mulsd  %xmm2,%xmm5
movapd %xmm3,%xmm6
mulsd  %xmm1,%xmm6
ucomisd %xmm5,%xmm6
ja     12e1 <isDifferentPeriods+0x1e1>
mulsd  0xe62(%rip),%xmm0
movapd %xmm1,%xmm5
subsd  %xmm0,%xmm5
andpd  0xe32(%rip),%xmm5
mulsd  %xmm2,%xmm5
movapd %xmm0,%xmm6
mulsd  %xmm1,%xmm6
ucomisd %xmm5,%xmm6
ja     12e1 <isDifferentPeriods+0x1e1>
mulsd  0xe3c(%rip),%xmm4
movapd %xmm1,%xmm5
subsd  %xmm4,%xmm5
andpd  0xe04(%rip),%xmm5
mulsd  %xmm2,%xmm5
mulsd  %xmm1,%xmm4
ucomisd %xmm5,%xmm4
ja     12e1 <isDifferentPeriods+0x1e1>
movsd  0xe12(%rip),%xmm4
mulsd  %xmm3,%xmm4
movapd %xmm1,%xmm5
subsd  %xmm4,%xmm5
andpd  0xdd6(%rip),%xmm5
mulsd  %xmm2,%xmm5
mulsd  %xmm1,%xmm4
ucomisd %xmm5,%xmm4
ja     12e1 <isDifferentPeriods+0x1e1>
movsd  0xde4(%rip),%xmm4
mulsd  %xmm0,%xmm4
movapd %xmm1,%xmm5
subsd  %xmm4,%xmm5
andpd  0xda8(%rip),%xmm5
mulsd  %xmm2,%xmm5
mulsd  %xmm1,%xmm4
ucomisd %xmm5,%xmm4
ja     12e1 <isDifferentPeriods+0x1e1>
divsd  0xda2(%rip),%xmm3
movapd %xmm1,%xmm4
subsd  %xmm3,%xmm4
andpd  0xd82(%rip),%xmm4
mulsd  %xmm2,%xmm4
mulsd  %xmm1,%xmm3
ucomisd %xmm4,%xmm3
ja     12e1 <isDifferentPeriods+0x1e1>
movapd %xmm0,%xmm3
divsd  0xd78(%rip),%xmm3
movapd %xmm1,%xmm4
subsd  %xmm3,%xmm4
andpd  0xd58(%rip),%xmm4
mulsd  %xmm2,%xmm4
mulsd  %xmm1,%xmm3
ucomisd %xmm4,%xmm3
ja     12e1 <isDifferentPeriods+0x1e1>
mulsd  0xd72(%rip),%xmm0
movapd %xmm1,%xmm3
subsd  %xmm0,%xmm3
andpd  0xd32(%rip),%xmm3
mulsd  %xmm2,%xmm3
mulsd  %xmm1,%xmm0
mov    $0x1,%eax
ucomisd %xmm3,%xmm0
jbe    12e3 <isDifferentPeriods+0x1e3>
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @isDifferentPeriods(double %0, double %1, double %2) {
%4 = alloca i32
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca i32
%9 = alloca i32
%10 = alloca double
store double %0, double* %5
store double %1, double* %6
store double %2, double* %7
%11 = load double, double* %7
%12 = load double, double* %6
%13 = load double, double* %5
%14 = fsub double %12, %13
%15 = call double @llvm.fabs.f64(double %14)
%16 = fmul double %11, %15
%17 = load double, double* %6
%18 = load double, double* %5
%19 = fmul double %17, %18
%20 = fcmp olt double %16, %19
br i1 %20, label %21, label %22
21: ; preds = %3
store i32 0, i32* %4
br label %60
22: ; preds = %3
store i32 1, i32* %8
br label %23
23: ; preds = %56, %22
%24 = load i32, i32* %8
%25 = icmp slt i32 %24, 5
br i1 %25, label %26, label %59
26: ; preds = %23
%27 = load i32, i32* %8
%28 = add nsw i32 %27, 1
store i32 %28, i32* %9
br label %29
29: ; preds = %52, %26
%30 = load i32, i32* %9
%31 = icmp sle i32 %30, 5
br i1 %31, label %32, label %55
32: ; preds = %29
%33 = load double, double* %5
%34 = load i32, i32* %9
%35 = sitofp i32 %34 to double
%36 = fmul double %33, %35
%37 = load i32, i32* %8
%38 = sitofp i32 %37 to double
%39 = fdiv double %36, %38
store double %39, double* %10
%40 = load double, double* %7
%41 = load double, double* %6
%42 = load double, double* %10
%43 = fsub double %41, %42
%44 = call double @llvm.fabs.f64(double %43)
%45 = fmul double %40, %44
%46 = load double, double* %6
%47 = load double, double* %10
%48 = fmul double %46, %47
%49 = fcmp olt double %45, %48
br i1 %49, label %50, label %51
50: ; preds = %32
store i32 0, i32* %4
br label %60
51: ; preds = %32
br label %52
52: ; preds = %51
%53 = load i32, i32* %9
%54 = add nsw i32 %53, 1
store i32 %54, i32* %9
br label %29
55: ; preds = %29
br label %56
56: ; preds = %55
%57 = load i32, i32* %8
%58 = add nsw i32 %57, 1
store i32 %58, i32* %8
br label %23
59: ; preds = %23
store i32 1, i32* %4
br label %60
60: ; preds = %59, %50, %21
%61 = load i32, i32* %4
ret i32 %61
}

LLVM IR (-O2):
define i32 @isDifferentPeriods(double %0, double %1, double %2) {
%4 = fsub double %1, %0
%5 = tail call double @llvm.fabs.f64(double %4)
%6 = fmul double %5, %2
%7 = fmul double %0, %1
%8 = fcmp olt double %6, %7
br i1 %8, label %86, label %57
9: ; preds = %78
%10 = fmul double %0, 3.000000e+00
%11 = fmul double %10, 5.000000e-01
%12 = fsub double %1, %11
%13 = tail call double @llvm.fabs.f64(double %12)
%14 = fmul double %13, %2
%15 = fmul double %11, %1
%16 = fcmp olt double %14, %15
br i1 %16, label %85, label %17
17: ; preds = %9
%18 = fmul double %0, 4.000000e+00
%19 = fmul double %18, 5.000000e-01
%20 = fsub double %1, %19
%21 = tail call double @llvm.fabs.f64(double %20)
%22 = fmul double %21, %2
%23 = fmul double %19, %1
%24 = fcmp olt double %22, %23
br i1 %24, label %85, label %25
25: ; preds = %17
%26 = fmul double %0, 5.000000e+00
%27 = fmul double %26, 5.000000e-01
%28 = fsub double %1, %27
%29 = tail call double @llvm.fabs.f64(double %28)
%30 = fmul double %29, %2
%31 = fmul double %27, %1
%32 = fcmp olt double %30, %31
br i1 %32, label %85, label %33
33: ; preds = %25
%34 = fmul double %0, 4.000000e+00
%35 = fdiv double %34, 3.000000e+00
%36 = fsub double %1, %35
%37 = tail call double @llvm.fabs.f64(double %36)
%38 = fmul double %37, %2
%39 = fmul double %35, %1
%40 = fcmp olt double %38, %39
br i1 %40, label %85, label %41
41: ; preds = %33
%42 = fmul double %0, 5.000000e+00
%43 = fdiv double %42, 3.000000e+00
%44 = fsub double %1, %43
%45 = tail call double @llvm.fabs.f64(double %44)
%46 = fmul double %45, %2
%47 = fmul double %43, %1
%48 = fcmp olt double %46, %47
br i1 %48, label %85, label %49
49: ; preds = %41
%50 = fmul double %0, 5.000000e+00
%51 = fmul double %50, 2.500000e-01
%52 = fsub double %1, %51
%53 = tail call double @llvm.fabs.f64(double %52)
%54 = fmul double %53, %2
%55 = fmul double %51, %1
%56 = fcmp olt double %54, %55
br i1 %56, label %85, label %86
57: ; preds = %3
%58 = fmul double %0, 2.000000e+00
%59 = fsub double %1, %58
%60 = tail call double @llvm.fabs.f64(double %59)
%61 = fmul double %60, %2
%62 = fmul double %58, %1
%63 = fcmp olt double %61, %62
br i1 %63, label %85, label %64
64: ; preds = %57
%65 = fmul double %0, 3.000000e+00
%66 = fsub double %1, %65
%67 = tail call double @llvm.fabs.f64(double %66)
%68 = fmul double %67, %2
%69 = fmul double %65, %1
%70 = fcmp olt double %68, %69
br i1 %70, label %85, label %71
71: ; preds = %64
%72 = fmul double %0, 4.000000e+00
%73 = fsub double %1, %72
%74 = tail call double @llvm.fabs.f64(double %73)
%75 = fmul double %74, %2
%76 = fmul double %72, %1
%77 = fcmp olt double %75, %76
br i1 %77, label %85, label %78
78: ; preds = %71
%79 = fmul double %0, 5.000000e+00
%80 = fsub double %1, %79
%81 = tail call double @llvm.fabs.f64(double %80)
%82 = fmul double %81, %2
%83 = fmul double %79, %1
%84 = fcmp olt double %82, %83
br i1 %84, label %85, label %9
85: ; preds = %49, %33, %41, %9, %17, %25, %57, %64, %71, %78
br label %86
86: ; preds = %49, %85, %3
%87 = phi i32 [ 0, %3 ], [ 0, %85 ], [ 1, %49 ]
ret i32 %87
}