#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 */
int fabs(double);
double parse_expression(char *);
int /*<<< orphan*/ printf(char *, ...);
void run_boolean_comparison_tests() {
  int result = 1;
  printf("Testing boolean comparisons:\n");
  {
    double c_value, p_value;
    c_value = (double)2.0 == 3.0;
    p_value = parse_expression("2.0 == 3.0");
    printf("  '%s'\n", "2.0 == 3.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)2.0 == 2.0;
    p_value = parse_expression("2.0 == 2.0");
    printf("  '%s'\n", "2.0 == 2.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)2.0 != 2.0;
    p_value = parse_expression("2.0 != 2.0");
    printf("  '%s'\n", "2.0 != 2.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)2.0 != 3.0;
    p_value = parse_expression("2.0 != 3.0");
    printf("  '%s'\n", "2.0 != 3.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)2.0 < 3.0;
    p_value = parse_expression("2.0 < 3.0");
    printf("  '%s'\n", "2.0 < 3.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)3.0 < 2.0;
    p_value = parse_expression("3.0 < 2.0");
    printf("  '%s'\n", "3.0 < 2.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)2.0 > 3.0;
    p_value = parse_expression("2.0 > 3.0");
    printf("  '%s'\n", "2.0 > 3.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)3.0 > 2.0;
    p_value = parse_expression("3.0 > 2.0");
    printf("  '%s'\n", "3.0 > 2.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)2.0 <= 2.0;
    p_value = parse_expression("2.0 <= 2.0");
    printf("  '%s'\n", "2.0 <= 2.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)2.0 <= 3.0;
    p_value = parse_expression("2.0 <= 3.0");
    printf("  '%s'\n", "2.0 <= 3.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)3.0 <= 2.0;
    p_value = parse_expression("3.0 <= 2.0");
    printf("  '%s'\n", "3.0 <= 2.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)2.0 >= 2.0;
    p_value = parse_expression("2.0 >= 2.0");
    printf("  '%s'\n", "2.0 >= 2.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)2.0 >= 3.0;
    p_value = parse_expression("2.0 >= 3.0");
    printf("  '%s'\n", "2.0 >= 3.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  {
    double c_value, p_value;
    c_value = (double)3.0 >= 2.0;
    p_value = parse_expression("3.0 >= 2.0");
    printf("  '%s'\n", "3.0 >= 2.0");
    if (fabs(c_value - p_value) > (1e-10)) {
      *&result = 0;
      printf("         C: %f\n", c_value);
      printf("    Parsed: %f\n", p_value);
    }
  };
  printf("%s\n\n", result ? "passed" : "failed");
}


x86 assembly (clang, -O0):
<run_boolean_comparison_tests>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
movl   $0x1,-0x4(%rbp)
lea    0xec7(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
lea    0xecf(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0x18(%rbp)
lea    0xec9(%rip),%rdi
lea    0xeb7(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0x10(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xe67(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11d0 <run_boolean_comparison_tests+0xa0>
movl   $0x0,-0x4(%rbp)
movsd  -0x10(%rbp),%xmm0
lea    0xe8b(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0x18(%rbp),%xmm0
lea    0xe88(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  0xe30(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
lea    0xe7d(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0x28(%rbp)
lea    0xe44(%rip),%rdi
lea    0xe65(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0x20(%rbp),%xmm0
subsd  -0x28(%rbp),%xmm0
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xde2(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1255 <run_boolean_comparison_tests+0x125>
movl   $0x0,-0x4(%rbp)
movsd  -0x20(%rbp),%xmm0
lea    0xe06(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0x28(%rbp),%xmm0
lea    0xe03(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
lea    0xe08(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0x38(%rbp)
lea    0xdc4(%rip),%rdi
lea    0xdf0(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0x30(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xd62(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    12d5 <run_boolean_comparison_tests+0x1a5>
movl   $0x0,-0x4(%rbp)
movsd  -0x30(%rbp),%xmm0
lea    0xd86(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0x38(%rbp),%xmm0
lea    0xd83(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  0xd2b(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
lea    0xd8e(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0x48(%rbp)
lea    0xd3f(%rip),%rdi
lea    0xd76(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0x40(%rbp),%xmm0
subsd  -0x48(%rbp),%xmm0
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xcdd(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    135a <run_boolean_comparison_tests+0x22a>
movl   $0x0,-0x4(%rbp)
movsd  -0x40(%rbp),%xmm0
lea    0xd01(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0x48(%rbp),%xmm0
lea    0xcfe(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  0xca6(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
lea    0xd14(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0x58(%rbp)
lea    0xcba(%rip),%rdi
lea    0xcfc(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0x50(%rbp),%xmm0
subsd  -0x58(%rbp),%xmm0
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xc58(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    13df <run_boolean_comparison_tests+0x2af>
movl   $0x0,-0x4(%rbp)
movsd  -0x50(%rbp),%xmm0
lea    0xc7c(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0x58(%rbp),%xmm0
lea    0xc79(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
lea    0xc9e(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0x68(%rbp)
lea    0xc3a(%rip),%rdi
lea    0xc86(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0x60(%rbp),%xmm0
subsd  -0x68(%rbp),%xmm0
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xbd8(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    145f <run_boolean_comparison_tests+0x32f>
movl   $0x0,-0x4(%rbp)
movsd  -0x60(%rbp),%xmm0
lea    0xbfc(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0x68(%rbp),%xmm0
lea    0xbf9(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
lea    0xc28(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0x78(%rbp)
lea    0xbba(%rip),%rdi
lea    0xc10(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0x70(%rbp),%xmm0
subsd  -0x78(%rbp),%xmm0
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xb58(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    14df <run_boolean_comparison_tests+0x3af>
movl   $0x0,-0x4(%rbp)
movsd  -0x70(%rbp),%xmm0
lea    0xb7c(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0x78(%rbp),%xmm0
lea    0xb79(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  0xb21(%rip),%xmm0
movsd  %xmm0,-0x80(%rbp)
lea    0xbad(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0x88(%rbp)
ff
lea    0xb32(%rip),%rdi
lea    0xb92(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0x80(%rbp),%xmm0
subsd  -0x88(%rbp),%xmm0
ff
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xacd(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    156d <run_boolean_comparison_tests+0x43d>
movl   $0x0,-0x4(%rbp)
movsd  -0x80(%rbp),%xmm0
lea    0xaf1(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0x88(%rbp),%xmm0
ff
lea    0xaeb(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  0xa93(%rip),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
lea    0xb26(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0x98(%rbp)
ff
lea    0xaa1(%rip),%rdi
lea    0xb0b(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0x90(%rbp),%xmm0
ff
subsd  -0x98(%rbp),%xmm0
ff
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xa39(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1604 <run_boolean_comparison_tests+0x4d4>
movl   $0x0,-0x4(%rbp)
movsd  -0x90(%rbp),%xmm0
ff
lea    0xa5a(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0x98(%rbp),%xmm0
ff
lea    0xa54(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  0x9fc(%rip),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
lea    0xa9a(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0xa8(%rbp)
ff
lea    0xa0a(%rip),%rdi
lea    0xa7f(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0xa0(%rbp),%xmm0
ff
subsd  -0xa8(%rbp),%xmm0
ff
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0x9a2(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    169b <run_boolean_comparison_tests+0x56b>
movl   $0x0,-0x4(%rbp)
movsd  -0xa0(%rbp),%xmm0
ff
lea    0x9c3(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0xa8(%rbp),%xmm0
ff
lea    0x9bd(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
lea    0xa13(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0xb8(%rbp)
ff
lea    0x978(%rip),%rdi
lea    0x9f8(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0xb0(%rbp),%xmm0
ff
subsd  -0xb8(%rbp),%xmm0
ff
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0x910(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    172d <run_boolean_comparison_tests+0x5fd>
movl   $0x0,-0x4(%rbp)
movsd  -0xb0(%rbp),%xmm0
ff
lea    0x931(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0xb8(%rbp),%xmm0
ff
lea    0x92b(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  0x8d3(%rip),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
lea    0x987(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0xc8(%rbp)
ff
lea    0x8e1(%rip),%rdi
lea    0x96c(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0xc0(%rbp),%xmm0
ff
subsd  -0xc8(%rbp),%xmm0
ff
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0x879(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    17c4 <run_boolean_comparison_tests+0x694>
movl   $0x0,-0x4(%rbp)
movsd  -0xc0(%rbp),%xmm0
ff
lea    0x89a(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0xc8(%rbp),%xmm0
ff
lea    0x894(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
lea    0x900(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0xd8(%rbp)
ff
lea    0x84f(%rip),%rdi
lea    0x8e5(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0xd0(%rbp),%xmm0
ff
subsd  -0xd8(%rbp),%xmm0
ff
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0x7e7(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1856 <run_boolean_comparison_tests+0x726>
movl   $0x0,-0x4(%rbp)
movsd  -0xd0(%rbp),%xmm0
ff
lea    0x808(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0xd8(%rbp),%xmm0
ff
lea    0x802(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  0x7aa(%rip),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
lea    0x874(%rip),%rdi
call   1050 <parse_expression@plt>
movsd  %xmm0,-0xe8(%rbp)
ff
lea    0x7b8(%rip),%rdi
lea    0x859(%rip),%rsi
mov    $0x0,%al
call   1030 <printf@plt>
movsd  -0xe0(%rbp),%xmm0
ff
subsd  -0xe8(%rbp),%xmm0
ff
call   1040 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0x750(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    18ed <run_boolean_comparison_tests+0x7bd>
movl   $0x0,-0x4(%rbp)
movsd  -0xe0(%rbp),%xmm0
ff
lea    0x771(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsd  -0xe8(%rbp),%xmm0
ff
lea    0x76b(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
mov    -0x4(%rbp),%ecx
lea    0x801(%rip),%rsi
lea    0x7f3(%rip),%rax
cmp    $0x0,%ecx
cmovne %rax,%rsi
lea    0x7e0(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<run_boolean_comparison_tests>:
push   %rbp
push   %rbx
push   %rax
lea    0xf8f(%rip),%rdi
call   1030 <puts@plt>
lea    0xeb2(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xea9(%rip),%rdi
xor    %ebp,%ebp
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
xorpd  %xmm0,%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    11af <run_boolean_comparison_tests+0x6f>
lea    0xe8c(%rip),%rdi
xorpd  %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xe8a(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
jmp    11b4 <run_boolean_comparison_tests+0x74>
mov    $0x1,%ebp
lea    0xe80(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xe44(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
movsd  0xe1f(%rip),%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    121a <run_boolean_comparison_tests+0xda>
lea    0xe25(%rip),%rdi
movsd  0xe02(%rip),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xe1f(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xe25(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xdde(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
xorpd  %xmm0,%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    1278 <run_boolean_comparison_tests+0x138>
lea    0xdc3(%rip),%rdi
xorpd  %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xdc1(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xdd2(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xd80(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
movsd  0xd5b(%rip),%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    12de <run_boolean_comparison_tests+0x19e>
lea    0xd61(%rip),%rdi
movsd  0xd3e(%rip),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xd5b(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xd77(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xd1a(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
movsd  0xcf5(%rip),%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    1344 <run_boolean_comparison_tests+0x204>
lea    0xcfb(%rip),%rdi
movsd  0xcd8(%rip),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xcf5(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xd1b(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xcb4(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
xorpd  %xmm0,%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    13a2 <run_boolean_comparison_tests+0x262>
lea    0xc99(%rip),%rdi
xorpd  %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xc97(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xcc7(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xc56(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
xorpd  %xmm0,%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    1400 <run_boolean_comparison_tests+0x2c0>
lea    0xc3b(%rip),%rdi
xorpd  %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xc39(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xc73(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xbf8(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
movsd  0xbd3(%rip),%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    1466 <run_boolean_comparison_tests+0x326>
lea    0xbd9(%rip),%rdi
movsd  0xbb6(%rip),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xbd3(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xc17(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xb92(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
movsd  0xb6d(%rip),%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    14cc <run_boolean_comparison_tests+0x38c>
lea    0xb73(%rip),%rdi
movsd  0xb50(%rip),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xb6d(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xbbc(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xb2c(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
movsd  0xb07(%rip),%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    1532 <run_boolean_comparison_tests+0x3f2>
lea    0xb0d(%rip),%rdi
movsd  0xaea(%rip),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xb07(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xb61(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xac6(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
xorpd  %xmm0,%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    1590 <run_boolean_comparison_tests+0x450>
lea    0xaab(%rip),%rdi
xorpd  %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xaa9(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xb0e(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xa68(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
movsd  0xa43(%rip),%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    15f6 <run_boolean_comparison_tests+0x4b6>
lea    0xa49(%rip),%rdi
movsd  0xa26(%rip),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xa43(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xab3(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0xa02(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
xorpd  %xmm0,%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    1654 <run_boolean_comparison_tests+0x514>
lea    0x9e7(%rip),%rdi
xorpd  %xmm0,%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0x9e5(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
xor    %ebp,%ebp
lea    0xa60(%rip),%rbx
mov    %rbx,%rdi
call   1060 <parse_expression@plt>
movsd  %xmm0,(%rsp)
lea    0x9a4(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
movsd  0x97f(%rip),%xmm0
subsd  (%rsp),%xmm0
call   1050 <fabs@plt>
test   %eax,%eax
jle    16c1 <run_boolean_comparison_tests+0x581>
lea    0x985(%rip),%rdi
movsd  0x962(%rip),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0x97f(%rip),%rdi
movsd  (%rsp),%xmm0
mov    $0x1,%al
call   1040 <printf@plt>
lea    0xa13(%rip),%rsi
jmp    16cc <run_boolean_comparison_tests+0x58c>
test   %ebp,%ebp
je     16b8 <run_boolean_comparison_tests+0x578>
lea    0x9ff(%rip),%rsi
lea    0x9f3(%rip),%rdi
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
jmp    1040 <printf@plt>

LLVM IR (-O0):
@.str = [30 x i8] c"Testing boolean comparisons:\0A\00"
@.str.1 = [11 x i8] c"2.0 == 3.0\00"
@.str.2 = [8 x i8] c" '%s'\0A\00"
@.str.3 = [16 x i8] c" C: %f\0A\00"
@.str.4 = [16 x i8] c" Parsed: %f\0A\00"
@.str.5 = [11 x i8] c"2.0 == 2.0\00"
@.str.6 = [11 x i8] c"2.0 != 2.0\00"
@.str.7 = [11 x i8] c"2.0 != 3.0\00"
@.str.8 = [10 x i8] c"2.0 < 3.0\00"
@.str.9 = [10 x i8] c"3.0 < 2.0\00"
@.str.10 = [10 x i8] c"2.0 > 3.0\00"
@.str.11 = [10 x i8] c"3.0 > 2.0\00"
@.str.12 = [11 x i8] c"2.0 <= 2.0\00"
@.str.13 = [11 x i8] c"2.0 <= 3.0\00"
@.str.14 = [11 x i8] c"3.0 <= 2.0\00"
@.str.15 = [11 x i8] c"2.0 >= 2.0\00"
@.str.16 = [11 x i8] c"2.0 >= 3.0\00"
@.str.17 = [11 x i8] c"3.0 >= 2.0\00"
@.str.18 = [5 x i8] c"%s\0A\0A\00"
@.str.19 = [7 x i8] c"passed\00"
@.str.20 = [7 x i8] c"failed\00"
define void @run_boolean_comparison_tests() {
%1 = alloca i32
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
store i32 1, i32* %1
%30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str, i64 0, i64 0))
store double 0.000000e+00, double* %2
%31 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0))
store double %31, double* %3
%32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0))
%33 = load double, double* %2
%34 = load double, double* %3
%35 = fsub double %33, %34
%36 = call i32 @fabs(double %35)
%37 = sitofp i32 %36 to double
%38 = fcmp ogt double %37, 1.000000e-10
br i1 %38, label %39, label %44
39: ; preds = %0
store i32 0, i32* %1
%40 = load double, double* %2
%41 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %40)
%42 = load double, double* %3
%43 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %42)
br label %44
44: ; preds = %39, %0
store double 1.000000e+00, double* %4
%45 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i64 0, i64 0))
store double %45, double* %5
%46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i64 0, i64 0))
%47 = load double, double* %4
%48 = load double, double* %5
%49 = fsub double %47, %48
%50 = call i32 @fabs(double %49)
%51 = sitofp i32 %50 to double
%52 = fcmp ogt double %51, 1.000000e-10
br i1 %52, label %53, label %58
53: ; preds = %44
store i32 0, i32* %1
%54 = load double, double* %4
%55 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %54)
%56 = load double, double* %5
%57 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %56)
br label %58
58: ; preds = %53, %44
store double 0.000000e+00, double* %6
%59 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i64 0, i64 0))
store double %59, double* %7
%60 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i64 0, i64 0))
%61 = load double, double* %6
%62 = load double, double* %7
%63 = fsub double %61, %62
%64 = call i32 @fabs(double %63)
%65 = sitofp i32 %64 to double
%66 = fcmp ogt double %65, 1.000000e-10
br i1 %66, label %67, label %72
67: ; preds = %58
store i32 0, i32* %1
%68 = load double, double* %6
%69 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %68)
%70 = load double, double* %7
%71 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %70)
br label %72
72: ; preds = %67, %58
store double 1.000000e+00, double* %8
%73 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i64 0, i64 0))
store double %73, double* %9
%74 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i64 0, i64 0))
%75 = load double, double* %8
%76 = load double, double* %9
%77 = fsub double %75, %76
%78 = call i32 @fabs(double %77)
%79 = sitofp i32 %78 to double
%80 = fcmp ogt double %79, 1.000000e-10
br i1 %80, label %81, label %86
81: ; preds = %72
store i32 0, i32* %1
%82 = load double, double* %8
%83 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %82)
%84 = load double, double* %9
%85 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %84)
br label %86
86: ; preds = %81, %72
store double 1.000000e+00, double* %10
%87 = call double @parse_expression(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.8, i64 0, i64 0))
store double %87, double* %11
%88 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.8, i64 0, i64 0))
%89 = load double, double* %10
%90 = load double, double* %11
%91 = fsub double %89, %90
%92 = call i32 @fabs(double %91)
%93 = sitofp i32 %92 to double
%94 = fcmp ogt double %93, 1.000000e-10
br i1 %94, label %95, label %100
95: ; preds = %86
store i32 0, i32* %1
%96 = load double, double* %10
%97 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %96)
%98 = load double, double* %11
%99 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %98)
br label %100
100: ; preds = %95, %86
store double 0.000000e+00, double* %12
%101 = call double @parse_expression(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i64 0, i64 0))
store double %101, double* %13
%102 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i64 0, i64 0))
%103 = load double, double* %12
%104 = load double, double* %13
%105 = fsub double %103, %104
%106 = call i32 @fabs(double %105)
%107 = sitofp i32 %106 to double
%108 = fcmp ogt double %107, 1.000000e-10
br i1 %108, label %109, label %114
109: ; preds = %100
store i32 0, i32* %1
%110 = load double, double* %12
%111 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %110)
%112 = load double, double* %13
%113 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %112)
br label %114
114: ; preds = %109, %100
store double 0.000000e+00, double* %14
%115 = call double @parse_expression(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.10, i64 0, i64 0))
store double %115, double* %15
%116 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.10, i64 0, i64 0))
%117 = load double, double* %14
%118 = load double, double* %15
%119 = fsub double %117, %118
%120 = call i32 @fabs(double %119)
%121 = sitofp i32 %120 to double
%122 = fcmp ogt double %121, 1.000000e-10
br i1 %122, label %123, label %128
123: ; preds = %114
store i32 0, i32* %1
%124 = load double, double* %14
%125 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %124)
%126 = load double, double* %15
%127 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %126)
br label %128
128: ; preds = %123, %114
store double 1.000000e+00, double* %16
%129 = call double @parse_expression(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i64 0, i64 0))
store double %129, double* %17
%130 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i64 0, i64 0))
%131 = load double, double* %16
%132 = load double, double* %17
%133 = fsub double %131, %132
%134 = call i32 @fabs(double %133)
%135 = sitofp i32 %134 to double
%136 = fcmp ogt double %135, 1.000000e-10
br i1 %136, label %137, label %142
137: ; preds = %128
store i32 0, i32* %1
%138 = load double, double* %16
%139 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %138)
%140 = load double, double* %17
%141 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %140)
br label %142
142: ; preds = %137, %128
store double 1.000000e+00, double* %18
%143 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.12, i64 0, i64 0))
store double %143, double* %19
%144 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.12, i64 0, i64 0))
%145 = load double, double* %18
%146 = load double, double* %19
%147 = fsub double %145, %146
%148 = call i32 @fabs(double %147)
%149 = sitofp i32 %148 to double
%150 = fcmp ogt double %149, 1.000000e-10
br i1 %150, label %151, label %156
151: ; preds = %142
store i32 0, i32* %1
%152 = load double, double* %18
%153 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %152)
%154 = load double, double* %19
%155 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %154)
br label %156
156: ; preds = %151, %142
store double 1.000000e+00, double* %20
%157 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.13, i64 0, i64 0))
store double %157, double* %21
%158 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.13, i64 0, i64 0))
%159 = load double, double* %20
%160 = load double, double* %21
%161 = fsub double %159, %160
%162 = call i32 @fabs(double %161)
%163 = sitofp i32 %162 to double
%164 = fcmp ogt double %163, 1.000000e-10
br i1 %164, label %165, label %170
165: ; preds = %156
store i32 0, i32* %1
%166 = load double, double* %20
%167 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %166)
%168 = load double, double* %21
%169 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %168)
br label %170
170: ; preds = %165, %156
store double 0.000000e+00, double* %22
%171 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.14, i64 0, i64 0))
store double %171, double* %23
%172 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.14, i64 0, i64 0))
%173 = load double, double* %22
%174 = load double, double* %23
%175 = fsub double %173, %174
%176 = call i32 @fabs(double %175)
%177 = sitofp i32 %176 to double
%178 = fcmp ogt double %177, 1.000000e-10
br i1 %178, label %179, label %184
179: ; preds = %170
store i32 0, i32* %1
%180 = load double, double* %22
%181 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %180)
%182 = load double, double* %23
%183 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %182)
br label %184
184: ; preds = %179, %170
store double 1.000000e+00, double* %24
%185 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.15, i64 0, i64 0))
store double %185, double* %25
%186 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.15, i64 0, i64 0))
%187 = load double, double* %24
%188 = load double, double* %25
%189 = fsub double %187, %188
%190 = call i32 @fabs(double %189)
%191 = sitofp i32 %190 to double
%192 = fcmp ogt double %191, 1.000000e-10
br i1 %192, label %193, label %198
193: ; preds = %184
store i32 0, i32* %1
%194 = load double, double* %24
%195 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %194)
%196 = load double, double* %25
%197 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %196)
br label %198
198: ; preds = %193, %184
store double 0.000000e+00, double* %26
%199 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.16, i64 0, i64 0))
store double %199, double* %27
%200 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.16, i64 0, i64 0))
%201 = load double, double* %26
%202 = load double, double* %27
%203 = fsub double %201, %202
%204 = call i32 @fabs(double %203)
%205 = sitofp i32 %204 to double
%206 = fcmp ogt double %205, 1.000000e-10
br i1 %206, label %207, label %212
207: ; preds = %198
store i32 0, i32* %1
%208 = load double, double* %26
%209 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %208)
%210 = load double, double* %27
%211 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %210)
br label %212
212: ; preds = %207, %198
store double 1.000000e+00, double* %28
%213 = call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.17, i64 0, i64 0))
store double %213, double* %29
%214 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.17, i64 0, i64 0))
%215 = load double, double* %28
%216 = load double, double* %29
%217 = fsub double %215, %216
%218 = call i32 @fabs(double %217)
%219 = sitofp i32 %218 to double
%220 = fcmp ogt double %219, 1.000000e-10
br i1 %220, label %221, label %226
221: ; preds = %212
store i32 0, i32* %1
%222 = load double, double* %28
%223 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double %222)
%224 = load double, double* %29
%225 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %224)
br label %226
226: ; preds = %221, %212
%227 = load i32, i32* %1
%228 = icmp ne i32 %227, 0
%229 = zext i1 %228 to i64
%230 = select i1 %228, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.19, i64 0, i64 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.20, i64 0, i64 0)
%231 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.18, i64 0, i64 0), i8* %230)
ret void
}

LLVM IR (-O2):
@.str.1 = [11 x i8] c"2.0 == 3.0\00"
@.str.2 = [8 x i8] c" '%s'\0A\00"
@.str.3 = [16 x i8] c" C: %f\0A\00"
@.str.4 = [16 x i8] c" Parsed: %f\0A\00"
@.str.5 = [11 x i8] c"2.0 == 2.0\00"
@.str.6 = [11 x i8] c"2.0 != 2.0\00"
@.str.7 = [11 x i8] c"2.0 != 3.0\00"
@.str.8 = [10 x i8] c"2.0 < 3.0\00"
@.str.9 = [10 x i8] c"3.0 < 2.0\00"
@.str.10 = [10 x i8] c"2.0 > 3.0\00"
@.str.11 = [10 x i8] c"3.0 > 2.0\00"
@.str.12 = [11 x i8] c"2.0 <= 2.0\00"
@.str.13 = [11 x i8] c"2.0 <= 3.0\00"
@.str.14 = [11 x i8] c"3.0 <= 2.0\00"
@.str.15 = [11 x i8] c"2.0 >= 2.0\00"
@.str.16 = [11 x i8] c"2.0 >= 3.0\00"
@.str.17 = [11 x i8] c"3.0 >= 2.0\00"
@.str.18 = [5 x i8] c"%s\0A\0A\00"
@.str.19 = [7 x i8] c"passed\00"
@.str.20 = [7 x i8] c"failed\00"
@str = [29 x i8] c"Testing boolean comparisons:\00"
define void @run_boolean_comparison_tests() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([29 x i8], [29 x i8]* @str, i64 0, i64 0))
%2 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0))
%3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0))
%4 = fsub double 0.000000e+00, %2
%5 = tail call i32 @fabs(double %4)
%6 = icmp sgt i32 %5, 0
br i1 %6, label %7, label %10
7: ; preds = %0
%8 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 0.000000e+00)
%9 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %2)
br label %10
10: ; preds = %7, %0
%11 = phi i32 [ 0, %7 ], [ 1, %0 ]
%12 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i64 0, i64 0))
%13 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i64 0, i64 0))
%14 = fsub double 1.000000e+00, %12
%15 = tail call i32 @fabs(double %14)
%16 = icmp sgt i32 %15, 0
br i1 %16, label %17, label %20
17: ; preds = %10
%18 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 1.000000e+00)
%19 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %12)
br label %20
20: ; preds = %17, %10
%21 = phi i32 [ 0, %17 ], [ %11, %10 ]
%22 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i64 0, i64 0))
%23 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i64 0, i64 0))
%24 = fsub double 0.000000e+00, %22
%25 = tail call i32 @fabs(double %24)
%26 = icmp sgt i32 %25, 0
br i1 %26, label %27, label %30
27: ; preds = %20
%28 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 0.000000e+00)
%29 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %22)
br label %30
30: ; preds = %27, %20
%31 = phi i32 [ 0, %27 ], [ %21, %20 ]
%32 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i64 0, i64 0))
%33 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i64 0, i64 0))
%34 = fsub double 1.000000e+00, %32
%35 = tail call i32 @fabs(double %34)
%36 = icmp sgt i32 %35, 0
br i1 %36, label %37, label %40
37: ; preds = %30
%38 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 1.000000e+00)
%39 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %32)
br label %40
40: ; preds = %37, %30
%41 = phi i32 [ 0, %37 ], [ %31, %30 ]
%42 = tail call double @parse_expression(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.8, i64 0, i64 0))
%43 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.8, i64 0, i64 0))
%44 = fsub double 1.000000e+00, %42
%45 = tail call i32 @fabs(double %44)
%46 = icmp sgt i32 %45, 0
br i1 %46, label %47, label %50
47: ; preds = %40
%48 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 1.000000e+00)
%49 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %42)
br label %50
50: ; preds = %47, %40
%51 = phi i32 [ 0, %47 ], [ %41, %40 ]
%52 = tail call double @parse_expression(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i64 0, i64 0))
%53 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i64 0, i64 0))
%54 = fsub double 0.000000e+00, %52
%55 = tail call i32 @fabs(double %54)
%56 = icmp sgt i32 %55, 0
br i1 %56, label %57, label %60
57: ; preds = %50
%58 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 0.000000e+00)
%59 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %52)
br label %60
60: ; preds = %57, %50
%61 = phi i32 [ 0, %57 ], [ %51, %50 ]
%62 = tail call double @parse_expression(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.10, i64 0, i64 0))
%63 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.10, i64 0, i64 0))
%64 = fsub double 0.000000e+00, %62
%65 = tail call i32 @fabs(double %64)
%66 = icmp sgt i32 %65, 0
br i1 %66, label %67, label %70
67: ; preds = %60
%68 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 0.000000e+00)
%69 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %62)
br label %70
70: ; preds = %67, %60
%71 = phi i32 [ 0, %67 ], [ %61, %60 ]
%72 = tail call double @parse_expression(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i64 0, i64 0))
%73 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i64 0, i64 0))
%74 = fsub double 1.000000e+00, %72
%75 = tail call i32 @fabs(double %74)
%76 = icmp sgt i32 %75, 0
br i1 %76, label %77, label %80
77: ; preds = %70
%78 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 1.000000e+00)
%79 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %72)
br label %80
80: ; preds = %77, %70
%81 = phi i32 [ 0, %77 ], [ %71, %70 ]
%82 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.12, i64 0, i64 0))
%83 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.12, i64 0, i64 0))
%84 = fsub double 1.000000e+00, %82
%85 = tail call i32 @fabs(double %84)
%86 = icmp sgt i32 %85, 0
br i1 %86, label %87, label %90
87: ; preds = %80
%88 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 1.000000e+00)
%89 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %82)
br label %90
90: ; preds = %87, %80
%91 = phi i32 [ 0, %87 ], [ %81, %80 ]
%92 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.13, i64 0, i64 0))
%93 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.13, i64 0, i64 0))
%94 = fsub double 1.000000e+00, %92
%95 = tail call i32 @fabs(double %94)
%96 = icmp sgt i32 %95, 0
br i1 %96, label %97, label %100
97: ; preds = %90
%98 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 1.000000e+00)
%99 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %92)
br label %100
100: ; preds = %97, %90
%101 = phi i32 [ 0, %97 ], [ %91, %90 ]
%102 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.14, i64 0, i64 0))
%103 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.14, i64 0, i64 0))
%104 = fsub double 0.000000e+00, %102
%105 = tail call i32 @fabs(double %104)
%106 = icmp sgt i32 %105, 0
br i1 %106, label %107, label %110
107: ; preds = %100
%108 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 0.000000e+00)
%109 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %102)
br label %110
110: ; preds = %107, %100
%111 = phi i32 [ 0, %107 ], [ %101, %100 ]
%112 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.15, i64 0, i64 0))
%113 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.15, i64 0, i64 0))
%114 = fsub double 1.000000e+00, %112
%115 = tail call i32 @fabs(double %114)
%116 = icmp sgt i32 %115, 0
br i1 %116, label %117, label %120
117: ; preds = %110
%118 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 1.000000e+00)
%119 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %112)
br label %120
120: ; preds = %117, %110
%121 = phi i32 [ 0, %117 ], [ %111, %110 ]
%122 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.16, i64 0, i64 0))
%123 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.16, i64 0, i64 0))
%124 = fsub double 0.000000e+00, %122
%125 = tail call i32 @fabs(double %124)
%126 = icmp sgt i32 %125, 0
br i1 %126, label %127, label %130
127: ; preds = %120
%128 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 0.000000e+00)
%129 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %122)
br label %130
130: ; preds = %127, %120
%131 = phi i32 [ 0, %127 ], [ %121, %120 ]
%132 = tail call double @parse_expression(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.17, i64 0, i64 0))
%133 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.17, i64 0, i64 0))
%134 = fsub double 1.000000e+00, %132
%135 = tail call i32 @fabs(double %134)
%136 = icmp sgt i32 %135, 0
br i1 %136, label %137, label %140
137: ; preds = %130
%138 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.3, i64 0, i64 0), double 1.000000e+00)
%139 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), double %132)
br label %142
140: ; preds = %130
%141 = icmp eq i32 %131, 0
br i1 %141, label %142, label %143
142: ; preds = %137, %140
br label %143
143: ; preds = %140, %142
%144 = phi i8* [ getelementptr inbounds ([7 x i8], [7 x i8]* @.str.20, i64 0, i64 0), %142 ], [ getelementptr inbounds ([7 x i8], [7 x i8]* @.str.19, i64 0, i64 0), %140 ]
%145 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.18, i64 0, i64 0), i8* %144)
ret void
}