#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 INFINITY;
float const fabs(float const);
float cube_func(const float p[3], const float s[3], float sm) {
  int i;
  float min_v = INFINITY;
  float ret = INFINITY, v;
  if (p[0] < -s[0] - sm || p[0] >= +s[0] + sm || p[1] < -s[1] - sm ||
      p[1] >= +s[1] + sm || p[2] < -s[2] - sm || p[2] >= +s[2] + sm)
    return -INFINITY;
  if (p[0] >= -s[0] + sm && p[0] < +s[0] - sm && p[1] >= -s[1] + sm &&
      p[1] < +s[1] - sm && p[2] >= -s[2] + sm && p[2] < +s[2] - sm)
    return +INFINITY;
  for (i = 0; i < 3; i++) {
    if (p[i]) {
      v = s[i] / fabs(p[i]);
      if (v < min_v) {
        min_v = v;
        ret = s[i] - fabs(p[i]);
      }
    }
  }
  return ret;
}


x86 assembly (clang, -O0):
<cube_func>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movss  %xmm0,-0x1c(%rbp)
mov    0x2ebc(%rip),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    0x2eac(%rip),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm1
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
subss  -0x1c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
ja     1228 <cube_func+0x118>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm1
addss  -0x1c(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jae    1228 <cube_func+0x118>
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm1
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
subss  -0x1c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
ja     1228 <cube_func+0x118>
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm1
addss  -0x1c(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jae    1228 <cube_func+0x118>
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm1
mov    -0x18(%rbp),%rax
movss  0x8(%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
subss  -0x1c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
ja     1228 <cube_func+0x118>
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x18(%rbp),%rax
movss  0x8(%rax),%xmm1
addss  -0x1c(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jb     124a <cube_func+0x13a>
mov    0x2db9(%rip),%rax
movss  (%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1420 <cube_func+0x310>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
addss  -0x1c(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jb     1342 <cube_func+0x232>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm1
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
subss  -0x1c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1342 <cube_func+0x232>
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
addss  -0x1c(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jb     1342 <cube_func+0x232>
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm1
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
subss  -0x1c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1342 <cube_func+0x232>
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x18(%rbp),%rax
movss  0x8(%rax),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
addss  -0x1c(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jb     1342 <cube_func+0x232>
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm1
mov    -0x18(%rbp),%rax
movss  0x8(%rax),%xmm0
subss  -0x1c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1342 <cube_func+0x232>
mov    0x2cb4(%rip),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1420 <cube_func+0x310>
movl   $0x0,-0x20(%rbp)
cmpl   $0x3,-0x20(%rbp)
jge    1416 <cube_func+0x306>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1377 <cube_func+0x267>
jp     1377 <cube_func+0x267>
jmp    1403 <cube_func+0x2f3>
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
call   1030 <fabs@plt>
movaps %xmm0,%xmm1
movss  -0x30(%rbp),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x2c(%rbp),%xmm1
movss  -0x24(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    13fe <cube_func+0x2ee>
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
call   1030 <fabs@plt>
movaps %xmm0,%xmm1
movss  -0x34(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
jmp    1403 <cube_func+0x2f3>
jmp    1408 <cube_func+0x2f8>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1349 <cube_func+0x239>
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cube_func>:
mov    0x2ee1(%rip),%rax
movss  (%rax),%xmm1
movss  (%rdi),%xmm7
movss  (%rsi),%xmm6
movaps 0xee6(%rip),%xmm2
xorps  %xmm6,%xmm2
subss  %xmm0,%xmm2
ucomiss %xmm7,%xmm2
ja     11e1 <cube_func+0xe1>
movaps %xmm6,%xmm2
addss  %xmm0,%xmm2
ucomiss %xmm2,%xmm7
jae    11e1 <cube_func+0xe1>
movss  0x4(%rdi),%xmm5
movss  0x4(%rsi),%xmm4
movaps 0xeb5(%rip),%xmm2
xorps  %xmm4,%xmm2
subss  %xmm0,%xmm2
ucomiss %xmm5,%xmm2
ja     11e1 <cube_func+0xe1>
movaps %xmm4,%xmm2
addss  %xmm0,%xmm2
ucomiss %xmm2,%xmm5
jae    11e1 <cube_func+0xe1>
movss  0x8(%rdi),%xmm2
movss  0x8(%rsi),%xmm10
movaps 0xe87(%rip),%xmm3
xorps  %xmm10,%xmm3
subss  %xmm0,%xmm3
ucomiss %xmm2,%xmm3
ja     11e1 <cube_func+0xe1>
movaps %xmm10,%xmm3
addss  %xmm0,%xmm3
ucomiss %xmm3,%xmm2
jae    11e1 <cube_func+0xe1>
movaps %xmm0,%xmm3
subss  %xmm6,%xmm3
ucomiss %xmm3,%xmm7
jb     11ec <cube_func+0xec>
movaps %xmm6,%xmm3
subss  %xmm0,%xmm3
ucomiss %xmm7,%xmm3
jbe    11ec <cube_func+0xec>
movaps %xmm0,%xmm3
subss  %xmm4,%xmm3
ucomiss %xmm3,%xmm5
jb     11ec <cube_func+0xec>
movaps %xmm4,%xmm3
subss  %xmm0,%xmm3
ucomiss %xmm5,%xmm3
jbe    11ec <cube_func+0xec>
movaps %xmm0,%xmm3
subss  %xmm10,%xmm3
ucomiss %xmm3,%xmm2
jb     11ec <cube_func+0xec>
movaps %xmm10,%xmm3
subss  %xmm0,%xmm3
ucomiss %xmm2,%xmm3
jbe    11ec <cube_func+0xec>
movaps %xmm1,%xmm0
ret
xorps  0xe18(%rip),%xmm1
movaps %xmm1,%xmm0
ret
xorps  %xmm8,%xmm8
ucomiss %xmm8,%xmm7
jne    11f8 <cube_func+0xf8>
jnp    121e <cube_func+0x11e>
andps  0xe11(%rip),%xmm7
movaps %xmm6,%xmm9
divss  %xmm7,%xmm9
ucomiss %xmm9,%xmm1
movaps %xmm1,%xmm0
jbe    1221 <cube_func+0x121>
subss  %xmm7,%xmm6
movaps %xmm9,%xmm1
movaps %xmm6,%xmm0
jmp    1221 <cube_func+0x121>
movaps %xmm1,%xmm0
ucomiss %xmm8,%xmm5
jne    1229 <cube_func+0x129>
jnp    1246 <cube_func+0x146>
andps  0xde0(%rip),%xmm5
movaps %xmm4,%xmm6
divss  %xmm5,%xmm6
ucomiss %xmm6,%xmm1
jbe    1246 <cube_func+0x146>
subss  %xmm5,%xmm4
movaps %xmm6,%xmm1
movaps %xmm4,%xmm0
xorps  %xmm3,%xmm3
ucomiss %xmm3,%xmm2
jne    1250 <cube_func+0x150>
jnp    126d <cube_func+0x16d>
andps  0xdb9(%rip),%xmm2
movaps %xmm10,%xmm3
divss  %xmm2,%xmm3
ucomiss %xmm3,%xmm1
jbe    126d <cube_func+0x16d>
subss  %xmm2,%xmm10
movaps %xmm10,%xmm0
ret

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

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