int interval_mul4(x1, x2, y1, y2, low, high)
double x1, x2, y1, y2, *low, *high;
{
  double lo, hi;
  if (((x1 == 0.0) && (x2 == 0.0)) || ((y1 == 0.0) && (y2 == 0.0))) {
    *low = 0.0;
    *high = 0.0;
    return 0;
  }
  if (x1 >= 0.0) {
    if (y1 >= 0.0) {
      *low = mul_lo(x1, y1);
      *high = mul_hi(x2, y2);
      return 0;
    }
    if (y2 <= 0.0) {
      *low = mul_lo(x2, y1);
      *high = mul_hi(x1, y2);
      return 0;
    }
    *low = mul_lo(x2, y1);
    *high = mul_hi(x2, y2);
    return 0;
  }
  if (x2 <= 0.0) {
    if (y1 >= 0.0) {
      *low = mul_lo(x1, y2);
      *high = mul_hi(x2, y1);
      return 0;
    }
    if (y2 <= 0.0) {
      *low = mul_lo(x2, y2);
      *high = mul_hi(x1, y1);
      return 0;
    }
    *low = mul_lo(x1, y2);
    *high = mul_hi(x1, y1);
    return 0;
  }
  if (y1 >= 0.0) {
    *low = mul_lo(x1, y2);
    *high = mul_hi(x2, y2);
    return 0;
  }
  if (y2 <= 0.0) {
    *low = mul_lo(x2, y1);
    *high = mul_hi(x1, y1);
    return 0;
  }
  *low = mul_lo(x2, y1);
  lo = mul_lo(x1, y2);
  *high = mul_hi(x1, y1);
  hi = mul_hi(x2, y2);
  if (lo < *low)
    *low = lo;
  if (hi > *high)
    *high = hi;
  return 0;
}


x86 assembly (clang, -O0):
<interval_mul4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movsd  %xmm3,-0x28(%rbp)
mov    %rdi,-0x30(%rbp)
mov    %rsi,-0x38(%rbp)
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1179 <interval_mul4+0x59>
jp     1179 <interval_mul4+0x59>
movsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1179 <interval_mul4+0x59>
jp     1179 <interval_mul4+0x59>
jmp    11a9 <interval_mul4+0x89>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11cb <interval_mul4+0xab>
jp     11cb <interval_mul4+0xab>
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11cb <interval_mul4+0xab>
jp     11cb <interval_mul4+0xab>
mov    -0x30(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1534 <interval_mul4+0x414>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     12cf <interval_mul4+0x1af>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1235 <interval_mul4+0x115>
movsd  -0x10(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x18(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1534 <interval_mul4+0x414>
xorps  %xmm0,%xmm0
ucomisd -0x28(%rbp),%xmm0
jb     1289 <interval_mul4+0x169>
movsd  -0x18(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1534 <interval_mul4+0x414>
movsd  -0x18(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x18(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1534 <interval_mul4+0x414>
xorps  %xmm0,%xmm0
ucomisd -0x18(%rbp),%xmm0
jb     13cf <interval_mul4+0x2af>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1335 <interval_mul4+0x215>
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x18(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1534 <interval_mul4+0x414>
xorps  %xmm0,%xmm0
ucomisd -0x28(%rbp),%xmm0
jb     1389 <interval_mul4+0x269>
movsd  -0x18(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x10(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1534 <interval_mul4+0x414>
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x10(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1534 <interval_mul4+0x414>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1427 <interval_mul4+0x307>
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x18(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1534 <interval_mul4+0x414>
xorps  %xmm0,%xmm0
ucomisd -0x28(%rbp),%xmm0
jb     147b <interval_mul4+0x35b>
movsd  -0x18(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x10(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1534 <interval_mul4+0x414>
movsd  -0x18(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x18(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm1
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    150d <interval_mul4+0x3ed>
movsd  -0x40(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x38(%rbp),%rax
ucomisd (%rax),%xmm0
jbe    152d <interval_mul4+0x40d>
movsd  -0x48(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<interval_mul4>:
push   %r14
push   %rbx
sub    $0x28,%rsp
mov    %rsi,%r14
mov    %rdi,%rbx
movapd %xmm0,%xmm4
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm4
jne    1145 <interval_mul4+0x25>
jp     1145 <interval_mul4+0x25>
ucomisd %xmm0,%xmm1
jne    1145 <interval_mul4+0x25>
jnp    1159 <interval_mul4+0x39>
ucomisd %xmm0,%xmm2
jne    1169 <interval_mul4+0x49>
jp     1169 <interval_mul4+0x49>
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm3
jne    1169 <interval_mul4+0x49>
jp     1169 <interval_mul4+0x49>
movq   $0x0,(%rbx)
xorpd  %xmm0,%xmm0
jmp    134e <interval_mul4+0x22e>
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm4
jae    124d <interval_mul4+0x12d>
ucomisd %xmm1,%xmm0
jae    1299 <interval_mul4+0x179>
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm2
movsd  %xmm3,0x18(%rsp)
movsd  %xmm1,0x8(%rsp)
jae    12c4 <interval_mul4+0x1a4>
movsd  %xmm4,(%rsp)
movapd %xmm1,%xmm0
movapd %xmm2,%xmm1
mov    $0x2,%al
movsd  %xmm2,0x10(%rsp)
call   1030 <mul_lo@plt>
movsd  0x18(%rsp),%xmm1
xorpd  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rbx)
jae    1335 <interval_mul4+0x215>
movsd  (%rsp),%xmm0
mov    $0x2,%al
call   1030 <mul_lo@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,0x20(%rsp)
movsd  (%rsp),%xmm0
movsd  0x10(%rsp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%r14)
movsd  0x8(%rsp),%xmm0
movsd  0x18(%rsp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  (%rbx),%xmm1
movsd  0x20(%rsp),%xmm2
ucomisd %xmm2,%xmm1
jbe    123d <interval_mul4+0x11d>
movapd %xmm2,%xmm1
movsd  %xmm2,(%rbx)
ucomisd (%r14),%xmm0
ja     134e <interval_mul4+0x22e>
jmp    1353 <interval_mul4+0x233>
ucomisd %xmm0,%xmm2
movsd  %xmm3,0x18(%rsp)
movsd  %xmm1,0x8(%rsp)
jae    12ba <interval_mul4+0x19a>
movsd  %xmm4,(%rsp)
movapd %xmm1,%xmm0
movapd %xmm2,%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
movsd  0x18(%rsp),%xmm1
xorpd  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rbx)
jae    12ec <interval_mul4+0x1cc>
movsd  0x8(%rsp),%xmm0
jmp    1340 <interval_mul4+0x220>
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm2
movsd  %xmm2,0x10(%rsp)
jae    12f3 <interval_mul4+0x1d3>
ucomisd %xmm3,%xmm0
movsd  %xmm4,(%rsp)
jae    131b <interval_mul4+0x1fb>
movapd %xmm4,%xmm0
jmp    131f <interval_mul4+0x1ff>
movapd %xmm4,%xmm0
movapd %xmm2,%xmm1
jmp    12cc <interval_mul4+0x1ac>
movapd %xmm4,%xmm0
movapd %xmm3,%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rbx)
movsd  0x8(%rsp),%xmm0
movsd  0x18(%rsp),%xmm1
jmp    1340 <interval_mul4+0x220>
movsd  (%rsp),%xmm0
jmp    1340 <interval_mul4+0x220>
movapd %xmm4,%xmm0
movsd  %xmm1,0x8(%rsp)
movapd %xmm3,%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rbx)
movsd  0x8(%rsp),%xmm0
jmp    133a <interval_mul4+0x21a>
movapd %xmm1,%xmm0
movapd %xmm3,%xmm1
mov    $0x2,%al
call   1030 <mul_lo@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rbx)
movsd  (%rsp),%xmm0
movsd  0x10(%rsp),%xmm1
mov    $0x2,%al
call   1040 <mul_hi@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%r14)
xor    %eax,%eax
add    $0x28,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define i32 @interval_mul4(double %0, double %1, double %2, double %3, double* %4, double* %5) {
%7 = alloca i32
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double*
%13 = alloca double*
%14 = alloca double
%15 = alloca double
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
%16 = load double, double* %8
%17 = fcmp oeq double %16, 0.000000e+00
br i1 %17, label %18, label %21
18: ; preds = %6
%19 = load double, double* %9
%20 = fcmp oeq double %19, 0.000000e+00
br i1 %20, label %27, label %21
21: ; preds = %18, %6
%22 = load double, double* %10
%23 = fcmp oeq double %22, 0.000000e+00
br i1 %23, label %24, label %30
24: ; preds = %21
%25 = load double, double* %11
%26 = fcmp oeq double %25, 0.000000e+00
br i1 %26, label %27, label %30
27: ; preds = %24, %18
%28 = load double*, double** %12
store double 0.000000e+00, double* %28
%29 = load double*, double** %13
store double 0.000000e+00, double* %29
store i32 0, i32* %7
br label %177
30: ; preds = %24, %21
%31 = load double, double* %8
%32 = fcmp oge double %31, 0.000000e+00
br i1 %32, label %33, label %72
33: ; preds = %30
%34 = load double, double* %10
%35 = fcmp oge double %34, 0.000000e+00
br i1 %35, label %36, label %47
36: ; preds = %33
%37 = load double, double* %8
%38 = load double, double* %10
%39 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %37, double %38)
%40 = sitofp i32 %39 to double
%41 = load double*, double** %12
store double %40, double* %41
%42 = load double, double* %9
%43 = load double, double* %11
%44 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %42, double %43)
%45 = sitofp i32 %44 to double
%46 = load double*, double** %13
store double %45, double* %46
store i32 0, i32* %7
br label %177
47: ; preds = %33
%48 = load double, double* %11
%49 = fcmp ole double %48, 0.000000e+00
br i1 %49, label %50, label %61
50: ; preds = %47
%51 = load double, double* %9
%52 = load double, double* %10
%53 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %51, double %52)
%54 = sitofp i32 %53 to double
%55 = load double*, double** %12
store double %54, double* %55
%56 = load double, double* %8
%57 = load double, double* %11
%58 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %56, double %57)
%59 = sitofp i32 %58 to double
%60 = load double*, double** %13
store double %59, double* %60
store i32 0, i32* %7
br label %177
61: ; preds = %47
%62 = load double, double* %9
%63 = load double, double* %10
%64 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %62, double %63)
%65 = sitofp i32 %64 to double
%66 = load double*, double** %12
store double %65, double* %66
%67 = load double, double* %9
%68 = load double, double* %11
%69 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %67, double %68)
%70 = sitofp i32 %69 to double
%71 = load double*, double** %13
store double %70, double* %71
store i32 0, i32* %7
br label %177
72: ; preds = %30
%73 = load double, double* %9
%74 = fcmp ole double %73, 0.000000e+00
br i1 %74, label %75, label %114
75: ; preds = %72
%76 = load double, double* %10
%77 = fcmp oge double %76, 0.000000e+00
br i1 %77, label %78, label %89
78: ; preds = %75
%79 = load double, double* %8
%80 = load double, double* %11
%81 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %79, double %80)
%82 = sitofp i32 %81 to double
%83 = load double*, double** %12
store double %82, double* %83
%84 = load double, double* %9
%85 = load double, double* %10
%86 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %84, double %85)
%87 = sitofp i32 %86 to double
%88 = load double*, double** %13
store double %87, double* %88
store i32 0, i32* %7
br label %177
89: ; preds = %75
%90 = load double, double* %11
%91 = fcmp ole double %90, 0.000000e+00
br i1 %91, label %92, label %103
92: ; preds = %89
%93 = load double, double* %9
%94 = load double, double* %11
%95 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %93, double %94)
%96 = sitofp i32 %95 to double
%97 = load double*, double** %12
store double %96, double* %97
%98 = load double, double* %8
%99 = load double, double* %10
%100 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %98, double %99)
%101 = sitofp i32 %100 to double
%102 = load double*, double** %13
store double %101, double* %102
store i32 0, i32* %7
br label %177
103: ; preds = %89
%104 = load double, double* %8
%105 = load double, double* %11
%106 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %104, double %105)
%107 = sitofp i32 %106 to double
%108 = load double*, double** %12
store double %107, double* %108
%109 = load double, double* %8
%110 = load double, double* %10
%111 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %109, double %110)
%112 = sitofp i32 %111 to double
%113 = load double*, double** %13
store double %112, double* %113
store i32 0, i32* %7
br label %177
114: ; preds = %72
%115 = load double, double* %10
%116 = fcmp oge double %115, 0.000000e+00
br i1 %116, label %117, label %128
117: ; preds = %114
%118 = load double, double* %8
%119 = load double, double* %11
%120 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %118, double %119)
%121 = sitofp i32 %120 to double
%122 = load double*, double** %12
store double %121, double* %122
%123 = load double, double* %9
%124 = load double, double* %11
%125 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %123, double %124)
%126 = sitofp i32 %125 to double
%127 = load double*, double** %13
store double %126, double* %127
store i32 0, i32* %7
br label %177
128: ; preds = %114
%129 = load double, double* %11
%130 = fcmp ole double %129, 0.000000e+00
br i1 %130, label %131, label %142
131: ; preds = %128
%132 = load double, double* %9
%133 = load double, double* %10
%134 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %132, double %133)
%135 = sitofp i32 %134 to double
%136 = load double*, double** %12
store double %135, double* %136
%137 = load double, double* %8
%138 = load double, double* %10
%139 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %137, double %138)
%140 = sitofp i32 %139 to double
%141 = load double*, double** %13
store double %140, double* %141
store i32 0, i32* %7
br label %177
142: ; preds = %128
%143 = load double, double* %9
%144 = load double, double* %10
%145 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %143, double %144)
%146 = sitofp i32 %145 to double
%147 = load double*, double** %12
store double %146, double* %147
%148 = load double, double* %8
%149 = load double, double* %11
%150 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %148, double %149)
%151 = sitofp i32 %150 to double
store double %151, double* %14
%152 = load double, double* %8
%153 = load double, double* %10
%154 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %152, double %153)
%155 = sitofp i32 %154 to double
%156 = load double*, double** %13
store double %155, double* %156
%157 = load double, double* %9
%158 = load double, double* %11
%159 = call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %157, double %158)
%160 = sitofp i32 %159 to double
store double %160, double* %15
%161 = load double, double* %14
%162 = load double*, double** %12
%163 = load double, double* %162
%164 = fcmp olt double %161, %163
br i1 %164, label %165, label %168
165: ; preds = %142
%166 = load double, double* %14
%167 = load double*, double** %12
store double %166, double* %167
br label %168
168: ; preds = %165, %142
%169 = load double, double* %15
%170 = load double*, double** %13
%171 = load double, double* %170
%172 = fcmp ogt double %169, %171
br i1 %172, label %173, label %176
173: ; preds = %168
%174 = load double, double* %15
%175 = load double*, double** %13
store double %174, double* %175
br label %176
176: ; preds = %173, %168
store i32 0, i32* %7
br label %177
177: ; preds = %176, %131, %117, %103, %92, %78, %61, %50, %36, %27
%178 = load i32, i32* %7
ret i32 %178
}

LLVM IR (-O2):
define i32 @interval_mul4(double %0, double %1, double %2, double %3, double* nocapture %4, double* nocapture %5) {
%7 = fcmp oeq double %0, 0.000000e+00
%8 = fcmp oeq double %1, 0.000000e+00
%9 = and i1 %7, %8
br i1 %9, label %14, label %10
10: ; preds = %6
%11 = fcmp oeq double %2, 0.000000e+00
%12 = fcmp oeq double %3, 0.000000e+00
%13 = and i1 %11, %12
br i1 %13, label %14, label %15
14: ; preds = %10, %6
store double 0.000000e+00, double* %4
br label %81
15: ; preds = %10
%16 = fcmp ult double %0, 0.000000e+00
br i1 %16, label %34, label %17
17: ; preds = %15
%18 = fcmp ult double %2, 0.000000e+00
br i1 %18, label %24, label %19
19: ; preds = %17
%20 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %0, double %2)
%21 = sitofp i32 %20 to double
store double %21, double* %4
%22 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %1, double %3)
%23 = sitofp i32 %22 to double
br label %81
24: ; preds = %17
%25 = fcmp ugt double %3, 0.000000e+00
%26 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %1, double %2)
%27 = sitofp i32 %26 to double
store double %27, double* %4
br i1 %25, label %31, label %28
28: ; preds = %24
%29 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %0, double %3)
%30 = sitofp i32 %29 to double
br label %81
31: ; preds = %24
%32 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %1, double %3)
%33 = sitofp i32 %32 to double
br label %81
34: ; preds = %15
%35 = fcmp ugt double %1, 0.000000e+00
%36 = fcmp ult double %2, 0.000000e+00
br i1 %35, label %55, label %37
37: ; preds = %34
br i1 %36, label %43, label %38
38: ; preds = %37
%39 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %0, double %3)
%40 = sitofp i32 %39 to double
store double %40, double* %4
%41 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %1, double %2)
%42 = sitofp i32 %41 to double
br label %81
43: ; preds = %37
%44 = fcmp ugt double %3, 0.000000e+00
br i1 %44, label %50, label %45
45: ; preds = %43
%46 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %1, double %3)
%47 = sitofp i32 %46 to double
store double %47, double* %4
%48 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %0, double %2)
%49 = sitofp i32 %48 to double
br label %81
50: ; preds = %43
%51 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %0, double %3)
%52 = sitofp i32 %51 to double
store double %52, double* %4
%53 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %0, double %2)
%54 = sitofp i32 %53 to double
br label %81
55: ; preds = %34
br i1 %36, label %61, label %56
56: ; preds = %55
%57 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %0, double %3)
%58 = sitofp i32 %57 to double
store double %58, double* %4
%59 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %1, double %3)
%60 = sitofp i32 %59 to double
br label %81
61: ; preds = %55
%62 = fcmp ugt double %3, 0.000000e+00
%63 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %1, double %2)
%64 = sitofp i32 %63 to double
store double %64, double* %4
br i1 %62, label %68, label %65
65: ; preds = %61
%66 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %0, double %2)
%67 = sitofp i32 %66 to double
br label %81
68: ; preds = %61
%69 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_lo to i32 (double, double, ...)*)(double %0, double %3)
%70 = sitofp i32 %69 to double
%71 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %0, double %2)
%72 = sitofp i32 %71 to double
store double %72, double* %5
%73 = tail call i32 (double, double, ...) bitcast (i32 (...)* @mul_hi to i32 (double, double, ...)*)(double %1, double %3)
%74 = sitofp i32 %73 to double
%75 = load double, double* %4
%76 = fcmp ogt double %75, %70
br i1 %76, label %77, label %78
77: ; preds = %68
store double %70, double* %4
br label %78
78: ; preds = %77, %68
%79 = load double, double* %5
%80 = fcmp olt double %79, %74
br i1 %80, label %81, label %83
81: ; preds = %78, %14, %19, %28, %31, %38, %45, %50, %56, %65
%82 = phi double [ %67, %65 ], [ %60, %56 ], [ %54, %50 ], [ %49, %45 ], [ %42, %38 ], [ %33, %31 ], [ %30, %28 ], [ %23, %19 ], [ 0.000000e+00, %14 ], [ %74, %78 ]
store double %82, double* %5
br label %83
83: ; preds = %81, %78
ret i32 0
}