#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 /*<<< orphan*/ assert(int /*<<< orphan*/);
float single_marcho(float, float, float, float, float, float);
float marchi(float a, float b, float c, float d, float x, float y) {
  if (a <= b && a <= c && a <= d) {
    if (b <= c)
      return single_marcho(a, b, c, d, x, y);
    else
      return marchi(a, c, b, d, y, x);
  } else if (c <= a && c <= b && c <= d)
    return marchi(c, d, a, b, 1 - x, y);
  else if (b <= a && b <= c && b <= d)
    return marchi(b, a, d, c, x, 1 - y);
  else if (d <= a && d <= b && d <= c)
    return marchi(d, b, c, a, 1 - y, 1 - x);
  else
    assert(0);
  return 0;
}


x86 assembly (clang, -O0):
<marchi>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  %xmm2,-0x10(%rbp)
movss  %xmm3,-0x14(%rbp)
movss  %xmm4,-0x18(%rbp)
movss  %xmm5,-0x1c(%rbp)
movss  -0x8(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     11fc <marchi+0xcc>
movss  -0x8(%rbp),%xmm1
movss  -0x10(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     11fc <marchi+0xcc>
movss  -0x8(%rbp),%xmm1
movss  -0x14(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     11fc <marchi+0xcc>
movss  -0xc(%rbp),%xmm1
movss  -0x10(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     11cf <marchi+0x9f>
movss  -0x8(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
movss  -0x10(%rbp),%xmm2
movss  -0x14(%rbp),%xmm3
movss  -0x18(%rbp),%xmm4
movss  -0x1c(%rbp),%xmm5
call   1050 <single_marcho@plt>
movss  %xmm0,-0x4(%rbp)
jmp    136c <marchi+0x23c>
movss  -0x8(%rbp),%xmm0
movss  -0x10(%rbp),%xmm1
movss  -0xc(%rbp),%xmm2
movss  -0x14(%rbp),%xmm3
movss  -0x1c(%rbp),%xmm4
movss  -0x18(%rbp),%xmm5
call   1040 <marchi@plt>
movss  %xmm0,-0x4(%rbp)
jmp    136c <marchi+0x23c>
movss  -0x10(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     126a <marchi+0x13a>
movss  -0x10(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     126a <marchi+0x13a>
movss  -0x10(%rbp),%xmm1
movss  -0x14(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     126a <marchi+0x13a>
movss  -0x10(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
movss  -0x8(%rbp),%xmm2
movss  -0xc(%rbp),%xmm3
movss  0xdaf(%rip),%xmm4
subss  -0x18(%rbp),%xmm4
movss  -0x1c(%rbp),%xmm5
call   1040 <marchi@plt>
movss  %xmm0,-0x4(%rbp)
jmp    136c <marchi+0x23c>
movss  -0xc(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     12d8 <marchi+0x1a8>
movss  -0xc(%rbp),%xmm1
movss  -0x10(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     12d8 <marchi+0x1a8>
movss  -0xc(%rbp),%xmm1
movss  -0x14(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     12d8 <marchi+0x1a8>
movss  -0xc(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
movss  -0x14(%rbp),%xmm2
movss  -0x10(%rbp),%xmm3
movss  -0x18(%rbp),%xmm4
movss  0xd3c(%rip),%xmm5
subss  -0x1c(%rbp),%xmm5
call   1040 <marchi@plt>
movss  %xmm0,-0x4(%rbp)
jmp    136c <marchi+0x23c>
movss  -0x14(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     134e <marchi+0x21e>
movss  -0x14(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     134e <marchi+0x21e>
movss  -0x14(%rbp),%xmm1
movss  -0x10(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jb     134e <marchi+0x21e>
movss  -0x14(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
movss  -0x10(%rbp),%xmm2
movss  -0x8(%rbp),%xmm3
movss  0xcd3(%rip),%xmm4
subss  -0x1c(%rbp),%xmm4
movss  0xcc6(%rip),%xmm5
subss  -0x18(%rbp),%xmm5
call   1040 <marchi@plt>
movss  %xmm0,-0x4(%rbp)
jmp    136c <marchi+0x23c>
xor    %edi,%edi
call   1030 <assert@plt>
jmp    135a <marchi+0x22a>
jmp    135f <marchi+0x22f>
jmp    1364 <marchi+0x234>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<marchi>:
push   %rax
movaps %xmm2,%xmm7
movaps %xmm1,%xmm6
movaps %xmm0,%xmm8
movss  0xecc(%rip),%xmm9
movaps %xmm8,%xmm0
movaps %xmm7,%xmm1
movaps %xmm4,%xmm7
movaps %xmm5,%xmm4
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movaps %xmm4,%xmm5
movaps %xmm7,%xmm4
movaps %xmm1,%xmm2
movaps %xmm6,%xmm1
ucomiss %xmm0,%xmm6
jb     1180 <marchi+0x60>
ucomiss %xmm0,%xmm2
jb     1180 <marchi+0x60>
ucomiss %xmm0,%xmm3
jb     1180 <marchi+0x60>
ucomiss %xmm1,%xmm2
movaps %xmm2,%xmm6
movaps %xmm5,%xmm7
jb     1150 <marchi+0x30>
jmp    1214 <marchi+0xf4>
nopl   0x0(%rax,%rax,1)
ucomiss %xmm2,%xmm0
jb     11b0 <marchi+0x90>
ucomiss %xmm2,%xmm1
jb     11b0 <marchi+0x90>
ucomiss %xmm2,%xmm3
jb     11b0 <marchi+0x90>
movaps %xmm9,%xmm10
subss  %xmm4,%xmm10
movaps %xmm2,%xmm8
movaps %xmm3,%xmm6
movaps %xmm0,%xmm7
movaps %xmm1,%xmm3
movaps %xmm10,%xmm4
jmp    1134 <marchi+0x14>
nopl   0x0(%rax,%rax,1)
ucomiss %xmm1,%xmm0
jb     11de <marchi+0xbe>
ucomiss %xmm1,%xmm2
jb     11de <marchi+0xbe>
ucomiss %xmm1,%xmm3
jb     11de <marchi+0xbe>
movaps %xmm9,%xmm10
subss  %xmm5,%xmm10
movaps %xmm1,%xmm8
movaps %xmm0,%xmm6
movaps %xmm3,%xmm7
movaps %xmm2,%xmm3
movaps %xmm10,%xmm5
jmp    1134 <marchi+0x14>
ucomiss %xmm3,%xmm2
jb     121a <marchi+0xfa>
ucomiss %xmm3,%xmm0
jb     121a <marchi+0xfa>
ucomiss %xmm3,%xmm1
jb     121a <marchi+0xfa>
movaps %xmm9,%xmm10
subss  %xmm5,%xmm10
movaps %xmm9,%xmm5
subss  %xmm4,%xmm5
movaps %xmm3,%xmm8
movaps %xmm1,%xmm6
movaps %xmm2,%xmm7
movaps %xmm0,%xmm3
movaps %xmm10,%xmm4
jmp    1134 <marchi+0x14>
pop    %rax
jmp    1040 <single_marcho@plt>
xor    %edi,%edi
call   1030 <assert@plt>
xorps  %xmm0,%xmm0
pop    %rax
ret

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

LLVM IR (-O2):
define float @marchi(float %0, float %1, float %2, float %3, float %4, float %5) {
br label %7
7: ; preds = %36, %6
%8 = phi float [ %0, %6 ], [ %37, %36 ]
%9 = phi float [ %1, %6 ], [ %38, %36 ]
%10 = phi float [ %2, %6 ], [ %39, %36 ]
%11 = phi float [ %3, %6 ], [ %40, %36 ]
%12 = phi float [ %4, %6 ], [ %41, %36 ]
%13 = phi float [ %5, %6 ], [ %42, %36 ]
%14 = fcmp ugt float %8, %11
br label %15
15: ; preds = %7, %24
%16 = phi float [ %17, %24 ], [ %9, %7 ]
%17 = phi float [ %16, %24 ], [ %10, %7 ]
%18 = phi float [ %19, %24 ], [ %12, %7 ]
%19 = phi float [ %18, %24 ], [ %13, %7 ]
%20 = fcmp ugt float %8, %16
%21 = fcmp ugt float %8, %17
%22 = or i1 %20, %21
%23 = or i1 %22, %14
br i1 %23, label %28, label %24
24: ; preds = %15
%25 = fcmp ugt float %16, %17
br i1 %25, label %15, label %26
26: ; preds = %24
%27 = tail call float @single_marcho(float %8, float %16, float %17, float %11, float %18, float %19)
br label %62
28: ; preds = %15
%29 = fcmp ugt float %17, %8
%30 = fcmp ugt float %17, %16
%31 = or i1 %29, %30
%32 = fcmp ugt float %17, %11
%33 = or i1 %31, %32
br i1 %33, label %43, label %34
34: ; preds = %28
%35 = fsub float 1.000000e+00, %18
br label %36
36: ; preds = %34, %49, %57
%37 = phi float [ %11, %57 ], [ %16, %49 ], [ %17, %34 ]
%38 = phi float [ %16, %57 ], [ %8, %49 ], [ %11, %34 ]
%39 = phi float [ %17, %57 ], [ %11, %49 ], [ %8, %34 ]
%40 = phi float [ %8, %57 ], [ %17, %49 ], [ %16, %34 ]
%41 = phi float [ %58, %57 ], [ %18, %49 ], [ %35, %34 ]
%42 = phi float [ %59, %57 ], [ %50, %49 ], [ %19, %34 ]
br label %7
43: ; preds = %28
%44 = fcmp ugt float %16, %8
%45 = fcmp ugt float %16, %17
%46 = or i1 %44, %45
%47 = fcmp ugt float %16, %11
%48 = or i1 %46, %47
br i1 %48, label %51, label %49
49: ; preds = %43
%50 = fsub float 1.000000e+00, %19
br label %36
51: ; preds = %43
%52 = fcmp ugt float %11, %8
%53 = fcmp ugt float %11, %16
%54 = or i1 %52, %53
%55 = fcmp ugt float %11, %17
%56 = or i1 %55, %54
br i1 %56, label %60, label %57
57: ; preds = %51
%58 = fsub float 1.000000e+00, %19
%59 = fsub float 1.000000e+00, %18
br label %36
60: ; preds = %51
%61 = tail call i32 @assert(i32 0)
br label %62
62: ; preds = %60, %26
%63 = phi float [ %27, %26 ], [ 0.000000e+00, %60 ]
ret float %63
}