#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 */
float fabs(float);
float stub1(float);
float stub2(float);
float stub3(float);
float stub4(float);
float golden(float ax, float bx, float cx, float (*f)(float), float tol,
             float *xmin) {
  float f1, f2, x0, x1, x2, x3;
  x0 = ax;
  x3 = cx;
  if (fabs(cx - bx) > fabs(bx - ax)) {
    x1 = bx;
    x2 = bx + (1.0 - 0.61803399) * (cx - bx);
  } else {
    x2 = bx;
    x1 = bx - (1.0 - 0.61803399) * (bx - ax);
  }
  f1 = (*f)(x1);
  f2 = (*f)(x2);
  while (fabs(x3 - x0) > tol * (fabs(x1) + fabs(x2))) {
    if (f2 < f1) {
      (x0) = (x1);
      (x1) = (x2);
      (x2) = (0.61803399 * x1 + (1.0 - 0.61803399) * x3);
      (f1) = (f2);
      (f2) = ((*f)(x2));
    } else {
      (x3) = (x2);
      (x2) = (x1);
      (x1) = (0.61803399 * x2 + (1.0 - 0.61803399) * x0);
      (f2) = (f1);
      (f1) = ((*f)(x1));
    }
  }
  if (f1 < f2) {
    *xmin = x1;
    return f1;
  } else {
    *xmin = x2;
    return f2;
  }
}


x86 assembly (clang, -O0):
<golden>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  %xmm2,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
movss  %xmm3,-0x1c(%rbp)
mov    %rsi,-0x28(%rbp)
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x10(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0x44(%rbp)
movss  -0xc(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
call   1030 <fabs@plt>
movaps %xmm0,%xmm1
movss  -0x44(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    11bb <golden+0xab>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0x10(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe63(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
jmp    11f5 <golden+0xe5>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe1c(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movss  -0x38(%rbp),%xmm0
call   *%rax
movss  %xmm0,-0x2c(%rbp)
mov    -0x18(%rbp),%rax
movss  -0x3c(%rbp),%xmm0
call   *%rax
movss  %xmm0,-0x30(%rbp)
movss  -0x40(%rbp),%xmm0
subss  -0x34(%rbp),%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0x48(%rbp)
movss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x38(%rbp),%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0x50(%rbp)
movss  -0x3c(%rbp),%xmm0
call   1030 <fabs@plt>
movss  -0x50(%rbp),%xmm2
movss  -0x4c(%rbp),%xmm1
movaps %xmm0,%xmm3
movss  -0x48(%rbp),%xmm0
addss  %xmm3,%xmm2
mulss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jbe    1356 <golden+0x246>
movss  -0x30(%rbp),%xmm1
movss  -0x2c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12ec <golden+0x1dc>
movss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x38(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x40(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd58(%rip),%xmm1
mulsd  %xmm2,%xmm1
movsd  0xd54(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
mov    -0x18(%rbp),%rax
movss  -0x3c(%rbp),%xmm0
call   *%rax
movss  %xmm0,-0x30(%rbp)
jmp    1351 <golden+0x241>
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x34(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xcee(%rip),%xmm1
mulsd  %xmm2,%xmm1
movsd  0xcea(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movss  -0x38(%rbp),%xmm0
call   *%rax
movss  %xmm0,-0x2c(%rbp)
jmp    1215 <golden+0x105>
movss  -0x2c(%rbp),%xmm1
movss  -0x30(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1385 <golden+0x275>
movss  -0x38(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    139c <golden+0x28c>
movss  -0x3c(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<golden>:
push   %r14
push   %rbx
sub    $0x48,%rsp
mov    %rsi,%r14
movss  %xmm3,0xc(%rsp)
mov    %rdi,%rbx
movaps %xmm2,%xmm6
subss  %xmm1,%xmm6
movaps 0xedf(%rip),%xmm5
movaps %xmm6,%xmm4
andps  %xmm5,%xmm4
movaps %xmm1,%xmm7
subss  %xmm0,%xmm7
movaps %xmm7,%xmm3
andps  %xmm5,%xmm3
ucomiss %xmm3,%xmm4
xorps  %xmm3,%xmm3
cvtss2sd %xmm1,%xmm3
movss  %xmm0,0x8(%rsp)
movss  %xmm2,0x20(%rsp)
jbe    116b <golden+0x6b>
xorps  %xmm2,%xmm2
cvtss2sd %xmm6,%xmm2
mulsd  0xebd(%rip),%xmm2
addsd  %xmm3,%xmm2
movaps %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm1
jmp    1182 <golden+0x82>
xorps  %xmm0,%xmm0
cvtss2sd %xmm7,%xmm0
mulsd  0xe96(%rip),%xmm0
addsd  %xmm3,%xmm0
cvtsd2ss %xmm0,%xmm0
movaps %xmm1,0x10(%rsp)
movaps %xmm0,0x30(%rsp)
call   *%rbx
movss  %xmm0,0x4(%rsp)
movaps 0x10(%rsp),%xmm0
call   *%rbx
movaps 0x30(%rsp),%xmm5
movaps %xmm0,%xmm3
movss  0x20(%rsp),%xmm9
movaps %xmm9,%xmm0
movss  0x8(%rsp),%xmm8
subss  %xmm8,%xmm0
movaps 0xe3f(%rip),%xmm4
andps  %xmm4,%xmm0
movaps %xmm5,%xmm1
andps  %xmm4,%xmm1
movaps 0x10(%rsp),%xmm6
movaps %xmm6,%xmm2
andps  %xmm4,%xmm2
addss  %xmm1,%xmm2
mulss  0xc(%rsp),%xmm2
ucomiss %xmm2,%xmm0
movaps %xmm6,%xmm4
jbe    130b <golden+0x20b>
movss  0x4(%rsp),%xmm6
jmp    1296 <golden+0x196>
cs nopw 0x0(%rax,%rax,1)
xorps  %xmm0,%xmm0
cvtss2sd %xmm5,%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm8,%xmm1
mulsd  0xe01(%rip),%xmm1
mulsd  0xe01(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movaps %xmm0,0x20(%rsp)
movss  %xmm8,0x8(%rsp)
movss  %xmm6,0x4(%rsp)
call   *%rbx
movaps 0x20(%rsp),%xmm7
movaps 0x30(%rsp),%xmm4
movss  0x4(%rsp),%xmm1
movss  0x8(%rsp),%xmm8
movaps %xmm0,%xmm6
movaps 0x10(%rsp),%xmm9
movaps %xmm1,%xmm0
movaps %xmm9,%xmm1
subss  %xmm8,%xmm1
movaps 0xd92(%rip),%xmm5
andps  %xmm5,%xmm1
movaps %xmm7,%xmm2
andps  %xmm5,%xmm2
movaps %xmm4,%xmm3
andps  %xmm5,%xmm3
addss  %xmm2,%xmm3
mulss  0xc(%rsp),%xmm3
ucomiss %xmm3,%xmm1
movaps %xmm7,%xmm5
movaps %xmm0,%xmm3
jbe    1317 <golden+0x217>
ucomiss %xmm3,%xmm6
movaps %xmm5,0x30(%rsp)
movaps %xmm4,0x10(%rsp)
jbe    1200 <golden+0x100>
xorps  %xmm0,%xmm0
cvtss2sd %xmm4,%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm9,%xmm1
mulsd  0xd58(%rip),%xmm1
mulsd  0xd58(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%rsp)
movss  %xmm9,0x20(%rsp)
movss  %xmm3,0x8(%rsp)
call   *%rbx
movss  0x8(%rsp),%xmm6
movss  0x20(%rsp),%xmm9
movaps %xmm0,%xmm1
movaps 0x30(%rsp),%xmm8
movaps 0x10(%rsp),%xmm7
movss  0x4(%rsp),%xmm4
jmp    125b <golden+0x15b>
movaps %xmm3,%xmm0
movaps %xmm5,%xmm7
movss  0x4(%rsp),%xmm6
movaps %xmm6,%xmm1
cmpltss %xmm0,%xmm1
andps  %xmm1,%xmm7
andnps %xmm4,%xmm1
orps   %xmm7,%xmm1
minss  %xmm0,%xmm6
movss  %xmm1,(%r14)
movaps %xmm6,%xmm0
add    $0x48,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define float @golden(float %0, float %1, float %2, float (float)* %3, float %4, float* %5) {
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float (float)*
%12 = alloca float
%13 = alloca float*
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
%19 = alloca float
store float %0, float* %8
store float %1, float* %9
store float %2, float* %10
store float (float)* %3, float (float)** %11
store float %4, float* %12
store float* %5, float** %13
%20 = load float, float* %8
store float %20, float* %16
%21 = load float, float* %10
store float %21, float* %19
%22 = load float, float* %10
%23 = load float, float* %9
%24 = fsub float %22, %23
%25 = call float @fabs(float %24)
%26 = load float, float* %9
%27 = load float, float* %8
%28 = fsub float %26, %27
%29 = call float @fabs(float %28)
%30 = fcmp ogt float %25, %29
br i1 %30, label %31, label %41
31: ; preds = %6
%32 = load float, float* %9
store float %32, float* %17
%33 = load float, float* %9
%34 = fpext float %33 to double
%35 = load float, float* %10
%36 = load float, float* %9
%37 = fsub float %35, %36
%38 = fpext float %37 to double
%39 = call double @llvm.fmuladd.f64(double 0x3FD8722190488D0C, double %38, double %34)
%40 = fptrunc double %39 to float
store float %40, float* %18
br label %51
41: ; preds = %6
%42 = load float, float* %9
store float %42, float* %18
%43 = load float, float* %9
%44 = fpext float %43 to double
%45 = load float, float* %9
%46 = load float, float* %8
%47 = fsub float %45, %46
%48 = fpext float %47 to double
%49 = call double @llvm.fmuladd.f64(double 0xBFD8722190488D0C, double %48, double %44)
%50 = fptrunc double %49 to float
store float %50, float* %17
br label %51
51: ; preds = %41, %31
%52 = load float (float)*, float (float)** %11
%53 = load float, float* %17
%54 = call float %52(float %53)
store float %54, float* %14
%55 = load float (float)*, float (float)** %11
%56 = load float, float* %18
%57 = call float %55(float %56)
store float %57, float* %15
br label %58
58: ; preds = %103, %51
%59 = load float, float* %19
%60 = load float, float* %16
%61 = fsub float %59, %60
%62 = call float @fabs(float %61)
%63 = load float, float* %12
%64 = load float, float* %17
%65 = call float @fabs(float %64)
%66 = load float, float* %18
%67 = call float @fabs(float %66)
%68 = fadd float %65, %67
%69 = fmul float %63, %68
%70 = fcmp ogt float %62, %69
br i1 %70, label %71, label %104
71: ; preds = %58
%72 = load float, float* %15
%73 = load float, float* %14
%74 = fcmp olt float %72, %73
br i1 %74, label %75, label %89
75: ; preds = %71
%76 = load float, float* %17
store float %76, float* %16
%77 = load float, float* %18
store float %77, float* %17
%78 = load float, float* %17
%79 = fpext float %78 to double
%80 = load float, float* %19
%81 = fpext float %80 to double
%82 = fmul double 0x3FD8722190488D0C, %81
%83 = call double @llvm.fmuladd.f64(double 0x3FE3C6EF37DBB97A, double %79, double %82)
%84 = fptrunc double %83 to float
store float %84, float* %18
%85 = load float, float* %15
store float %85, float* %14
%86 = load float (float)*, float (float)** %11
%87 = load float, float* %18
%88 = call float %86(float %87)
store float %88, float* %15
br label %103
89: ; preds = %71
%90 = load float, float* %18
store float %90, float* %19
%91 = load float, float* %17
store float %91, float* %18
%92 = load float, float* %18
%93 = fpext float %92 to double
%94 = load float, float* %16
%95 = fpext float %94 to double
%96 = fmul double 0x3FD8722190488D0C, %95
%97 = call double @llvm.fmuladd.f64(double 0x3FE3C6EF37DBB97A, double %93, double %96)
%98 = fptrunc double %97 to float
store float %98, float* %17
%99 = load float, float* %14
store float %99, float* %15
%100 = load float (float)*, float (float)** %11
%101 = load float, float* %17
%102 = call float %100(float %101)
store float %102, float* %14
br label %103
103: ; preds = %89, %75
br label %58
104: ; preds = %58
%105 = load float, float* %14
%106 = load float, float* %15
%107 = fcmp olt float %105, %106
br i1 %107, label %108, label %112
108: ; preds = %104
%109 = load float, float* %17
%110 = load float*, float** %13
store float %109, float* %110
%111 = load float, float* %14
store float %111, float* %7
br label %116
112: ; preds = %104
%113 = load float, float* %18
%114 = load float*, float** %13
store float %113, float* %114
%115 = load float, float* %15
store float %115, float* %7
br label %116
116: ; preds = %112, %108
%117 = load float, float* %7
ret float %117
}

LLVM IR (-O2):
define float @golden(float %0, float %1, float %2, float (float)* nocapture %3, float %4, float* nocapture writeonly %5) {
%7 = fsub float %2, %1
%8 = tail call float @llvm.fabs.f32(float %7)
%9 = fsub float %1, %0
%10 = tail call float @llvm.fabs.f32(float %9)
%11 = fcmp ogt float %8, %10
%12 = fpext float %1 to double
br i1 %11, label %13, label %17
13: ; preds = %6
%14 = fpext float %7 to double
%15 = tail call double @llvm.fmuladd.f64(double %14, double 0x3FD8722190488D0C, double %12)
%16 = fptrunc double %15 to float
br label %21
17: ; preds = %6
%18 = fpext float %9 to double
%19 = tail call double @llvm.fmuladd.f64(double %18, double 0xBFD8722190488D0C, double %12)
%20 = fptrunc double %19 to float
br label %21
21: ; preds = %17, %13
%22 = phi float [ %1, %13 ], [ %20, %17 ]
%23 = phi float [ %16, %13 ], [ %1, %17 ]
%24 = tail call float %3(float %22)
%25 = tail call float %3(float %23)
%26 = fsub float %2, %0
%27 = tail call float @llvm.fabs.f32(float %26)
%28 = tail call float @llvm.fabs.f32(float %22)
%29 = tail call float @llvm.fabs.f32(float %23)
%30 = fadd float %28, %29
%31 = fmul float %30, %4
%32 = fcmp ogt float %27, %31
br i1 %32, label %33, label %69
33: ; preds = %21, %55
%34 = phi float [ %61, %55 ], [ %2, %21 ]
%35 = phi float [ %60, %55 ], [ %23, %21 ]
%36 = phi float [ %59, %55 ], [ %22, %21 ]
%37 = phi float [ %58, %55 ], [ %0, %21 ]
%38 = phi float [ %57, %55 ], [ %25, %21 ]
%39 = phi float [ %56, %55 ], [ %24, %21 ]
%40 = fcmp olt float %38, %39
br i1 %40, label %41, label %48
41: ; preds = %33
%42 = fpext float %35 to double
%43 = fpext float %34 to double
%44 = fmul double %43, 0x3FD8722190488D0C
%45 = tail call double @llvm.fmuladd.f64(double %42, double 0x3FE3C6EF37DBB97A, double %44)
%46 = fptrunc double %45 to float
%47 = tail call float %3(float %46)
br label %55
48: ; preds = %33
%49 = fpext float %36 to double
%50 = fpext float %37 to double
%51 = fmul double %50, 0x3FD8722190488D0C
%52 = tail call double @llvm.fmuladd.f64(double %49, double 0x3FE3C6EF37DBB97A, double %51)
%53 = fptrunc double %52 to float
%54 = tail call float %3(float %53)
br label %55
55: ; preds = %48, %41
%56 = phi float [ %38, %41 ], [ %54, %48 ]
%57 = phi float [ %47, %41 ], [ %39, %48 ]
%58 = phi float [ %36, %41 ], [ %37, %48 ]
%59 = phi float [ %35, %41 ], [ %53, %48 ]
%60 = phi float [ %46, %41 ], [ %36, %48 ]
%61 = phi float [ %34, %41 ], [ %35, %48 ]
%62 = fsub float %61, %58
%63 = tail call float @llvm.fabs.f32(float %62)
%64 = tail call float @llvm.fabs.f32(float %59)
%65 = tail call float @llvm.fabs.f32(float %60)
%66 = fadd float %64, %65
%67 = fmul float %66, %4
%68 = fcmp ogt float %63, %67
br i1 %68, label %33, label %69
69: ; preds = %55, %21
%70 = phi float [ %24, %21 ], [ %56, %55 ]
%71 = phi float [ %25, %21 ], [ %57, %55 ]
%72 = phi float [ %22, %21 ], [ %59, %55 ]
%73 = phi float [ %23, %21 ], [ %60, %55 ]
%74 = fcmp olt float %70, %71
%75 = select i1 %74, float %72, float %73
%76 = select i1 %74, float %70, float %71
store float %75, float* %5
ret float %76
}