double nearestBox(const double *bmin, const double *bmax, const double *F,
                  const double *invD, double tmin, double tmax) {
  double tnear, tfar;
  double t1, t2;
  unsigned int i;
  tnear = tmin;
  tfar = tmax;
  for (i = 0; i < 3; i++) {
    t1 = (double)((bmin[i] - F[i]) * invD[i]);
    t2 = (double)((bmax[i] - F[i]) * invD[i]);
    if (t1 < t2) {
      if (t1 > tnear)
        tnear = t1;
      if (t2 < tfar)
        tfar = t2;
    } else {
      if (t2 > tnear)
        tnear = t2;
      if (t1 < tfar)
        tfar = t1;
    }
    if (tnear > tfar)
      return 1e30f;
  }
  return (double)tnear;
}


x86 assembly (clang, -O0):
<nearestBox>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
movsd  %xmm0,-0x30(%rbp)
movsd  %xmm1,-0x38(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x5c(%rbp)
cmpl   $0x3,-0x5c(%rbp)
jae    1258 <nearestBox+0x158>
mov    -0x10(%rbp),%rax
mov    -0x5c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x5c(%rbp),%ecx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x5c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x5c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x5c(%rbp),%ecx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x5c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x50(%rbp),%xmm1
movsd  -0x58(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11e6 <nearestBox+0xe6>
movsd  -0x50(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    11c3 <nearestBox+0xc3>
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x58(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11e1 <nearestBox+0xe1>
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    1223 <nearestBox+0x123>
movsd  -0x58(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    1200 <nearestBox+0x100>
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x50(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    121e <nearestBox+0x11e>
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    1223 <nearestBox+0x123>
movsd  -0x40(%rbp),%xmm0
ucomisd -0x48(%rbp),%xmm0
jbe    1245 <nearestBox+0x145>
movsd  0xdc5(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1262 <nearestBox+0x162>
jmp    124a <nearestBox+0x14a>
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1139 <nearestBox+0x39>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<nearestBox>:
movsd  (%rdi),%xmm2
movsd  (%rdx),%xmm4
subsd  %xmm4,%xmm2
movsd  (%rcx),%xmm5
mulsd  %xmm5,%xmm2
movsd  (%rsi),%xmm3
subsd  %xmm4,%xmm3
mulsd  %xmm5,%xmm3
ucomisd %xmm2,%xmm3
jbe    1136 <nearestBox+0x36>
maxsd  %xmm0,%xmm2
ucomisd %xmm3,%xmm1
jbe    1148 <nearestBox+0x48>
movapd %xmm3,%xmm1
jmp    1148 <nearestBox+0x48>
maxsd  %xmm0,%xmm3
ucomisd %xmm2,%xmm1
jbe    1144 <nearestBox+0x44>
movapd %xmm2,%xmm1
movapd %xmm3,%xmm2
movsd  0xeb0(%rip),%xmm0
ucomisd %xmm1,%xmm2
ja     11fe <nearestBox+0xfe>
movsd  0x8(%rdi),%xmm4
movsd  0x8(%rdx),%xmm5
subsd  %xmm5,%xmm4
movsd  0x8(%rcx),%xmm6
mulsd  %xmm6,%xmm4
movsd  0x8(%rsi),%xmm3
subsd  %xmm5,%xmm3
mulsd  %xmm6,%xmm3
ucomisd %xmm4,%xmm3
jbe    1198 <nearestBox+0x98>
maxsd  %xmm2,%xmm4
ucomisd %xmm3,%xmm1
jbe    1192 <nearestBox+0x92>
movapd %xmm3,%xmm1
movapd %xmm4,%xmm3
jmp    11a6 <nearestBox+0xa6>
maxsd  %xmm2,%xmm3
ucomisd %xmm4,%xmm1
jbe    11a6 <nearestBox+0xa6>
movapd %xmm4,%xmm1
ucomisd %xmm1,%xmm3
ja     11fe <nearestBox+0xfe>
movsd  0x10(%rdi),%xmm4
movsd  0x10(%rdx),%xmm5
subsd  %xmm5,%xmm4
movsd  0x10(%rcx),%xmm6
mulsd  %xmm6,%xmm4
movsd  0x10(%rsi),%xmm2
subsd  %xmm5,%xmm2
mulsd  %xmm6,%xmm2
ucomisd %xmm4,%xmm2
jbe    11ea <nearestBox+0xea>
maxsd  %xmm3,%xmm4
ucomisd %xmm2,%xmm1
jbe    11e4 <nearestBox+0xe4>
movapd %xmm2,%xmm1
movapd %xmm4,%xmm2
jmp    11f8 <nearestBox+0xf8>
maxsd  %xmm3,%xmm2
ucomisd %xmm4,%xmm1
jbe    11f8 <nearestBox+0xf8>
movapd %xmm4,%xmm1
ucomisd %xmm1,%xmm2
jbe    11ff <nearestBox+0xff>
ret
movapd %xmm2,%xmm0
ret

LLVM IR (-O0):
define double @nearestBox(double* %0, double* %1, double* %2, double* %3, double %4, double %5) {
%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 i32
store double* %0, double** %8
store double* %1, double** %9
store double* %2, double** %10
store double* %3, double** %11
store double %4, double* %12
store double %5, double* %13
%19 = load double, double* %12
store double %19, double* %14
%20 = load double, double* %13
store double %20, double* %15
store i32 0, i32* %18
br label %21
21: ; preds = %94, %6
%22 = load i32, i32* %18
%23 = icmp ult i32 %22, 3
br i1 %23, label %24, label %97
24: ; preds = %21
%25 = load double*, double** %8
%26 = load i32, i32* %18
%27 = zext i32 %26 to i64
%28 = getelementptr inbounds double, double* %25, i64 %27
%29 = load double, double* %28
%30 = load double*, double** %10
%31 = load i32, i32* %18
%32 = zext i32 %31 to i64
%33 = getelementptr inbounds double, double* %30, i64 %32
%34 = load double, double* %33
%35 = fsub double %29, %34
%36 = load double*, double** %11
%37 = load i32, i32* %18
%38 = zext i32 %37 to i64
%39 = getelementptr inbounds double, double* %36, i64 %38
%40 = load double, double* %39
%41 = fmul double %35, %40
store double %41, double* %16
%42 = load double*, double** %9
%43 = load i32, i32* %18
%44 = zext i32 %43 to i64
%45 = getelementptr inbounds double, double* %42, i64 %44
%46 = load double, double* %45
%47 = load double*, double** %10
%48 = load i32, i32* %18
%49 = zext i32 %48 to i64
%50 = getelementptr inbounds double, double* %47, i64 %49
%51 = load double, double* %50
%52 = fsub double %46, %51
%53 = load double*, double** %11
%54 = load i32, i32* %18
%55 = zext i32 %54 to i64
%56 = getelementptr inbounds double, double* %53, i64 %55
%57 = load double, double* %56
%58 = fmul double %52, %57
store double %58, double* %17
%59 = load double, double* %16
%60 = load double, double* %17
%61 = fcmp olt double %59, %60
br i1 %61, label %62, label %75
62: ; preds = %24
%63 = load double, double* %16
%64 = load double, double* %14
%65 = fcmp ogt double %63, %64
br i1 %65, label %66, label %68
66: ; preds = %62
%67 = load double, double* %16
store double %67, double* %14
br label %68
68: ; preds = %66, %62
%69 = load double, double* %17
%70 = load double, double* %15
%71 = fcmp olt double %69, %70
br i1 %71, label %72, label %74
72: ; preds = %68
%73 = load double, double* %17
store double %73, double* %15
br label %74
74: ; preds = %72, %68
br label %88
75: ; preds = %24
%76 = load double, double* %17
%77 = load double, double* %14
%78 = fcmp ogt double %76, %77
br i1 %78, label %79, label %81
79: ; preds = %75
%80 = load double, double* %17
store double %80, double* %14
br label %81
81: ; preds = %79, %75
%82 = load double, double* %16
%83 = load double, double* %15
%84 = fcmp olt double %82, %83
br i1 %84, label %85, label %87
85: ; preds = %81
%86 = load double, double* %16
store double %86, double* %15
br label %87
87: ; preds = %85, %81
br label %88
88: ; preds = %87, %74
%89 = load double, double* %14
%90 = load double, double* %15
%91 = fcmp ogt double %89, %90
br i1 %91, label %92, label %93
92: ; preds = %88
store double 0x46293E5940000000, double* %7
br label %99
93: ; preds = %88
br label %94
94: ; preds = %93
%95 = load i32, i32* %18
%96 = add i32 %95, 1
store i32 %96, i32* %18
br label %21
97: ; preds = %21
%98 = load double, double* %14
store double %98, double* %7
br label %99
99: ; preds = %97, %92
%100 = load double, double* %7
ret double %100
}

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