float VfitMinimum(const float v[3], float *v_min, float *x_min) {
  if ((v[1] > v[0]) && (v[1] > v[2])) {
    *v_min = v[1];
    *x_min = 0;
    return 0;
  }
  float slope = v[2] - v[1];
  if ((v[2] - v[1]) < (v[0] - v[1]))
    slope = v[0] - v[1];
  *x_min = (v[0] - v[2]) / (2 * slope);
  *v_min = v[2] + (*x_min - 1) * slope;
  return *x_min;
}


x86 assembly (clang, -O0):
<VfitMinimum>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomiss (%rax),%xmm0
jbe    1166 <VfitMinimum+0x66>
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomiss 0x8(%rax),%xmm0
jbe    1166 <VfitMinimum+0x66>
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1228 <VfitMinimum+0x128>
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x4(%rax),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm1
mov    -0x10(%rbp),%rax
subss  0x4(%rax),%xmm1
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x4(%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    11bf <VfitMinimum+0xbf>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x4(%rax),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
subss  0x8(%rax),%xmm0
movss  0xe2c(%rip),%xmm1
mulss  -0x24(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm1
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
movss  0xdfe(%rip),%xmm2
subss  %xmm2,%xmm0
movss  -0x24(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<VfitMinimum>:
movss  (%rdi),%xmm0
movss  0x4(%rdi),%xmm2
ucomiss %xmm0,%xmm2
movss  0x8(%rdi),%xmm1
jbe    1126 <VfitMinimum+0x26>
ucomiss %xmm1,%xmm2
jbe    1126 <VfitMinimum+0x26>
movss  %xmm2,(%rsi)
movl   $0x0,(%rdx)
xorps  %xmm0,%xmm0
ret
movaps %xmm1,%xmm3
subss  %xmm2,%xmm3
movaps %xmm0,%xmm4
subss  %xmm2,%xmm4
maxss  %xmm3,%xmm4
subss  %xmm1,%xmm0
movaps %xmm4,%xmm1
addss  %xmm4,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,(%rdx)
addss  0xead(%rip),%xmm0
mulss  %xmm4,%xmm0
addss  0x8(%rdi),%xmm0
movss  %xmm0,(%rsi)
movss  (%rdx),%xmm0
ret

LLVM IR (-O0):
define float @VfitMinimum(float* %0, float* %1, float* %2) {
%4 = alloca float
%5 = alloca float*
%6 = alloca float*
%7 = alloca float*
%8 = alloca float
store float* %0, float** %5
store float* %1, float** %6
store float* %2, float** %7
%9 = load float*, float** %5
%10 = getelementptr inbounds float, float* %9, i64 1
%11 = load float, float* %10
%12 = load float*, float** %5
%13 = getelementptr inbounds float, float* %12, i64 0
%14 = load float, float* %13
%15 = fcmp ogt float %11, %14
br i1 %15, label %16, label %30
16: ; preds = %3
%17 = load float*, float** %5
%18 = getelementptr inbounds float, float* %17, i64 1
%19 = load float, float* %18
%20 = load float*, float** %5
%21 = getelementptr inbounds float, float* %20, i64 2
%22 = load float, float* %21
%23 = fcmp ogt float %19, %22
br i1 %23, label %24, label %30
24: ; preds = %16
%25 = load float*, float** %5
%26 = getelementptr inbounds float, float* %25, i64 1
%27 = load float, float* %26
%28 = load float*, float** %6
store float %27, float* %28
%29 = load float*, float** %7
store float 0.000000e+00, float* %29
store float 0.000000e+00, float* %4
br label %84
30: ; preds = %16, %3
%31 = load float*, float** %5
%32 = getelementptr inbounds float, float* %31, i64 2
%33 = load float, float* %32
%34 = load float*, float** %5
%35 = getelementptr inbounds float, float* %34, i64 1
%36 = load float, float* %35
%37 = fsub float %33, %36
store float %37, float* %8
%38 = load float*, float** %5
%39 = getelementptr inbounds float, float* %38, i64 2
%40 = load float, float* %39
%41 = load float*, float** %5
%42 = getelementptr inbounds float, float* %41, i64 1
%43 = load float, float* %42
%44 = fsub float %40, %43
%45 = load float*, float** %5
%46 = getelementptr inbounds float, float* %45, i64 0
%47 = load float, float* %46
%48 = load float*, float** %5
%49 = getelementptr inbounds float, float* %48, i64 1
%50 = load float, float* %49
%51 = fsub float %47, %50
%52 = fcmp olt float %44, %51
br i1 %52, label %53, label %61
53: ; preds = %30
%54 = load float*, float** %5
%55 = getelementptr inbounds float, float* %54, i64 0
%56 = load float, float* %55
%57 = load float*, float** %5
%58 = getelementptr inbounds float, float* %57, i64 1
%59 = load float, float* %58
%60 = fsub float %56, %59
store float %60, float* %8
br label %61
61: ; preds = %53, %30
%62 = load float*, float** %5
%63 = getelementptr inbounds float, float* %62, i64 0
%64 = load float, float* %63
%65 = load float*, float** %5
%66 = getelementptr inbounds float, float* %65, i64 2
%67 = load float, float* %66
%68 = fsub float %64, %67
%69 = load float, float* %8
%70 = fmul float 2.000000e+00, %69
%71 = fdiv float %68, %70
%72 = load float*, float** %7
store float %71, float* %72
%73 = load float*, float** %5
%74 = getelementptr inbounds float, float* %73, i64 2
%75 = load float, float* %74
%76 = load float*, float** %7
%77 = load float, float* %76
%78 = fsub float %77, 1.000000e+00
%79 = load float, float* %8
%80 = call float @llvm.fmuladd.f32(float %78, float %79, float %75)
%81 = load float*, float** %6
store float %80, float* %81
%82 = load float*, float** %7
%83 = load float, float* %82
store float %83, float* %4
br label %84
84: ; preds = %61, %24
%85 = load float, float* %4
ret float %85
}

LLVM IR (-O2):
define float @VfitMinimum(float* nocapture %0, float* nocapture writeonly %1, float* nocapture %2) {
%4 = getelementptr inbounds float, float* %0, i64 1
%5 = load float, float* %4
%6 = load float, float* %0
%7 = fcmp ogt float %5, %6
%8 = getelementptr inbounds float, float* %0, i64 2
%9 = load float, float* %8
%10 = fcmp ogt float %5, %9
%11 = select i1 %7, i1 %10, i1 false
br i1 %11, label %12, label %13
12: ; preds = %3
store float %5, float* %1
store float 0.000000e+00, float* %2
br label %26
13: ; preds = %3
%14 = getelementptr inbounds float, float* %0, i64 2
%15 = fsub float %9, %5
%16 = fsub float %6, %5
%17 = fcmp olt float %15, %16
%18 = select i1 %17, float %16, float %15
%19 = fsub float %6, %9
%20 = fmul float %18, 2.000000e+00
%21 = fdiv float %19, %20
store float %21, float* %2
%22 = load float, float* %14
%23 = fadd float %21, -1.000000e+00
%24 = tail call float @llvm.fmuladd.f32(float %23, float %18, float %22)
store float %24, float* %1
%25 = load float, float* %2
br label %26
26: ; preds = %13, %12
%27 = phi float [ 0.000000e+00, %12 ], [ %25, %13 ]
ret float %27
}