#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 EXIT_SUCCESS;
int /*<<< orphan*/ FAIL(char *);
int /*<<< orphan*/ PASS(char *);
int /*<<< orphan*/ floattest(double, double, double, double, double, double,
                             double, double, double, double, double, double,
                             double, double);
int /*<<< orphan*/ inttest(int, int, int, int, int);
int main() {
  if (!floattest(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0,
                 13.0, 14.0)) {
    FAIL("lazy-pointer-binding float parameters");
    return EXIT_SUCCESS;
  }
  if (!inttest(0x100000002, 0x300000004, 0x500000006, 0x700000008,
               0x90000000A)) {
    FAIL("lazy-pointer-binding int parameters");
    return EXIT_SUCCESS;
  }
  PASS("lazy-pointer-binding");
  return EXIT_SUCCESS;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movl   $0x0,-0x4(%rbp)
movsd  0xea9(%rip),%xmm0
movsd  0xea9(%rip),%xmm1
movsd  0xea9(%rip),%xmm2
movsd  0xea9(%rip),%xmm3
movsd  0xea9(%rip),%xmm4
movsd  0xea9(%rip),%xmm5
movsd  0xea9(%rip),%xmm6
movsd  0xea9(%rip),%xmm7
movsd  0xea8(%rip),%xmm13
movsd  0xea7(%rip),%xmm12
movsd  0xea6(%rip),%xmm11
movsd  0xea5(%rip),%xmm10
movsd  0xea4(%rip),%xmm9
movsd  0xea3(%rip),%xmm8
movsd  %xmm13,(%rsp)
movsd  %xmm12,0x8(%rsp)
movsd  %xmm11,0x10(%rsp)
movsd  %xmm10,0x18(%rsp)
movsd  %xmm9,0x20(%rsp)
movsd  %xmm8,0x28(%rsp)
call   1030 <floattest@plt>
cmp    $0x0,%eax
jne    1219 <main+0xd9>
lea    0xe6d(%rip),%rdi
call   1060 <FAIL@plt>
mov    0x2dd1(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1276 <main+0x136>
mov    $0x2,%edi
mov    $0x4,%esi
mov    $0x6,%edx
mov    $0x8,%ecx
mov    $0xa,%r8d
call   1040 <inttest@plt>
cmp    $0x0,%eax
jne    125e <main+0x11e>
lea    0xe4e(%rip),%rdi
call   1060 <FAIL@plt>
mov    0x2d8c(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1276 <main+0x136>
lea    0xe55(%rip),%rdi
call   1050 <PASS@plt>
mov    0x2d6f(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rax
movabs $0x402c000000000000,%rax
movabs $0x402a000000000000,%rcx
movabs $0x4028000000000000,%rdx
movabs $0x4026000000000000,%rsi
movabs $0x4024000000000000,%rdi
movabs $0x4022000000000000,%r8
movsd  0xe7b(%rip),%xmm0
movsd  0xe7b(%rip),%xmm1
movsd  0xe7b(%rip),%xmm2
movsd  0xe7b(%rip),%xmm3
movsd  0xe7b(%rip),%xmm4
movsd  0xe7b(%rip),%xmm5
movsd  0xe7b(%rip),%xmm6
movsd  0xe7b(%rip),%xmm7
push   %rax
push   %rcx
push   %rdx
push   %rsi
push   %rdi
push   %r8
call   1030 <floattest@plt>
add    $0x30,%rsp
test   %eax,%eax
je     1202 <main+0xc2>
mov    $0x2,%edi
mov    $0x4,%esi
mov    $0x6,%edx
mov    $0x8,%ecx
mov    $0xa,%r8d
call   1040 <inttest@plt>
test   %eax,%eax
je     120b <main+0xcb>
lea    0xe8f(%rip),%rdi
call   1050 <PASS@plt>
jmp    1217 <main+0xd7>
lea    0xe37(%rip),%rdi
jmp    1212 <main+0xd2>
lea    0xe54(%rip),%rdi
call   1060 <FAIL@plt>
mov    0x2dc2(%rip),%rax
mov    (%rax),%eax
pop    %rcx
ret

LLVM IR (-O0):
@.str = [38 x i8] c"lazy-pointer-binding float parameters\00"
@EXIT_SUCCESS = global i32 0
@.str.1 = [36 x i8] c"lazy-pointer-binding int parameters\00"
@.str.2 = [21 x i8] c"lazy-pointer-binding\00"
define i32 @main() {
%1 = alloca i32
store i32 0, i32* %1
%2 = call i32 @floattest(double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00, double 5.000000e+00, double 6.000000e+00, double 7.000000e+00, double 8.000000e+00, double 9.000000e+00, double 1.000000e+01, double 1.100000e+01, double 1.200000e+01, double 1.300000e+01, double 1.400000e+01)
%3 = icmp ne i32 %2, 0
br i1 %3, label %7, label %4
4: ; preds = %0
%5 = call i32 @FAIL(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str, i64 0, i64 0))
%6 = load i32, i32* @EXIT_SUCCESS
store i32 %6, i32* %1
br label %16
7: ; preds = %0
%8 = call i32 @inttest(i32 2, i32 4, i32 6, i32 8, i32 10)
%9 = icmp ne i32 %8, 0
br i1 %9, label %13, label %10
10: ; preds = %7
%11 = call i32 @FAIL(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.1, i64 0, i64 0))
%12 = load i32, i32* @EXIT_SUCCESS
store i32 %12, i32* %1
br label %16
13: ; preds = %7
%14 = call i32 @PASS(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.2, i64 0, i64 0))
%15 = load i32, i32* @EXIT_SUCCESS
store i32 %15, i32* %1
br label %16
16: ; preds = %13, %10, %4
%17 = load i32, i32* %1
ret i32 %17
}

LLVM IR (-O2):
@.str = [38 x i8] c"lazy-pointer-binding float parameters\00"
@EXIT_SUCCESS = global i32 0
@.str.1 = [36 x i8] c"lazy-pointer-binding int parameters\00"
@.str.2 = [21 x i8] c"lazy-pointer-binding\00"
define i32 @main() {
%1 = tail call i32 @floattest(double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00, double 5.000000e+00, double 6.000000e+00, double 7.000000e+00, double 8.000000e+00, double 9.000000e+00, double 1.000000e+01, double 1.100000e+01, double 1.200000e+01, double 1.300000e+01, double 1.400000e+01)
%2 = icmp eq i32 %1, 0
br i1 %2, label %3, label %5
3: ; preds = %0
%4 = tail call i32 @FAIL(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str, i64 0, i64 0))
br label %12
5: ; preds = %0
%6 = tail call i32 @inttest(i32 2, i32 4, i32 6, i32 8, i32 10)
%7 = icmp eq i32 %6, 0
br i1 %7, label %8, label %10
8: ; preds = %5
%9 = tail call i32 @FAIL(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.1, i64 0, i64 0))
br label %12
10: ; preds = %5
%11 = tail call i32 @PASS(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.2, i64 0, i64 0))
br label %12
12: ; preds = %10, %8, %3
%13 = load i32, i32* @EXIT_SUCCESS
ret i32 %13
}