float foo(float a, float b, float c, float d) {
  float ac, bd, ad, bc, y;
  ac = a * c;
  bd = b * d;
  ad = a * d;
  bc = b * c;
  if (__builtin_expect(
          !__builtin_expect((a) != (a), 0) &
              !__builtin_expect(
                  !__builtin_expect(((a) - (a)) != ((a) - (a)), 0), 1),
          0) ||
      __builtin_expect(
          !__builtin_expect((b) != (b), 0) &
              !__builtin_expect(
                  !__builtin_expect(((b) - (b)) != ((b) - (b)), 0), 1),
          0))
    a = __builtin_copysignf(
        __builtin_expect(
            !__builtin_expect((a) != (a), 0) &
                !__builtin_expect(
                    !__builtin_expect(((a) - (a)) != ((a) - (a)), 0), 1),
            0)
            ? 1
            : 0,
        a);
  c = __builtin_copysignf(
      __builtin_expect(
          !__builtin_expect((c) != (c), 0) &
              !__builtin_expect(
                  !__builtin_expect(((c) - (c)) != ((c) - (c)), 0), 1),
          0)
          ? 1
          : 0,
      c);
  if ((__builtin_expect(
           !__builtin_expect((ac) != (ac), 0) &
               !__builtin_expect(
                   !__builtin_expect(((ac) - (ac)) != ((ac) - (ac)), 0), 1),
           0) ||
       __builtin_expect(
           !__builtin_expect((bd) != (bd), 0) &
               !__builtin_expect(
                   !__builtin_expect(((bd) - (bd)) != ((bd) - (bd)), 0), 1),
           0) ||
       __builtin_expect(
           !__builtin_expect((bc) != (bc), 0) &
               !__builtin_expect(
                   !__builtin_expect(((bc) - (bc)) != ((bc) - (bc)), 0), 1),
           0)))
    d = __builtin_copysignf(0, d);
  y = a * d + b * c;
  return y;
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  %xmm3,-0x10(%rbp)
movss  -0x4(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x8(%rbp),%xmm0
mulss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x4(%rbp),%xmm0
mulss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x8(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x4(%rbp),%xmm0
ucomiss -0x4(%rbp),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
cltq
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
movss  -0x4(%rbp),%xmm0
subss  -0x4(%rbp),%xmm0
movss  -0x4(%rbp),%xmm1
subss  -0x4(%rbp),%xmm1
ucomiss %xmm1,%xmm0
setne  %cl
setp   %dl
or     %dl,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cltq
cmp    $0x0,%rax
jne    1252 <foo+0x152>
movss  -0x8(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
cltq
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
movss  -0x8(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
subss  -0x8(%rbp),%xmm1
ucomiss %xmm1,%xmm0
setne  %cl
setp   %dl
or     %dl,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cltq
cmp    $0x0,%rax
je     12fe <foo+0x1fe>
movss  -0x4(%rbp),%xmm0
ucomiss -0x4(%rbp),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
cltq
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
movss  -0x4(%rbp),%xmm0
subss  -0x4(%rbp),%xmm0
movss  -0x4(%rbp),%xmm1
subss  -0x4(%rbp),%xmm1
ucomiss %xmm1,%xmm0
setne  %cl
setp   %dl
or     %dl,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
movslq %eax,%rdx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%rdx
cmovne %ecx,%eax
cvtsi2ss %eax,%xmm0
movss  -0x4(%rbp),%xmm1
movaps 0xd1a(%rip),%xmm2
pand   %xmm2,%xmm1
movaps 0xd1f(%rip),%xmm2
pand   %xmm2,%xmm0
por    %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0xc(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
cltq
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
movss  -0xc(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
subss  -0xc(%rbp),%xmm1
ucomiss %xmm1,%xmm0
setne  %cl
setp   %dl
or     %dl,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
movslq %eax,%rdx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%rdx
cmovne %ecx,%eax
cvtsi2ss %eax,%xmm0
movss  -0xc(%rbp),%xmm1
movaps 0xc6e(%rip),%xmm2
pand   %xmm2,%xmm1
movaps 0xc73(%rip),%xmm2
pand   %xmm2,%xmm0
por    %xmm1,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x14(%rbp),%xmm0
ucomiss -0x14(%rbp),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
cltq
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
movss  -0x14(%rbp),%xmm0
subss  -0x14(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
subss  -0x14(%rbp),%xmm1
ucomiss %xmm1,%xmm0
setne  %cl
setp   %dl
or     %dl,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cltq
cmp    $0x0,%rax
jne    1527 <foo+0x427>
movss  -0x18(%rbp),%xmm0
ucomiss -0x18(%rbp),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
cltq
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
movss  -0x18(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
movss  -0x18(%rbp),%xmm1
subss  -0x18(%rbp),%xmm1
ucomiss %xmm1,%xmm0
setne  %cl
setp   %dl
or     %dl,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cltq
cmp    $0x0,%rax
jne    1527 <foo+0x427>
movss  -0x20(%rbp),%xmm0
ucomiss -0x20(%rbp),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
cltq
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
movss  -0x20(%rbp),%xmm0
subss  -0x20(%rbp),%xmm0
movss  -0x20(%rbp),%xmm1
subss  -0x20(%rbp),%xmm1
ucomiss %xmm1,%xmm0
setne  %cl
setp   %dl
or     %dl,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
cmp    $0x0,%rcx
setne  %cl
xor    $0xff,%cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cltq
cmp    $0x0,%rax
je     153c <foo+0x43c>
movss  -0x10(%rbp),%xmm0
movaps 0xacd(%rip),%xmm1
pand   %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x4(%rbp),%xmm0
movss  -0x10(%rbp),%xmm2
movss  -0x8(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x24(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
movaps %xmm0,%xmm4
mulss  %xmm2,%xmm4
ucomiss %xmm0,%xmm0
setnp  %cl
movaps %xmm0,%xmm5
subss  %xmm0,%xmm5
ucomiss %xmm5,%xmm5
setp   %al
and    %cl,%al
jne    11b8 <foo+0xb8>
ucomiss %xmm1,%xmm1
jp     1137 <foo+0x37>
movaps %xmm1,%xmm5
subss  %xmm1,%xmm5
ucomiss %xmm5,%xmm5
jp     11b8 <foo+0xb8>
ucomiss %xmm4,%xmm4
jp     1145 <foo+0x45>
subss  %xmm4,%xmm4
ucomiss %xmm4,%xmm4
jp     11af <foo+0xaf>
movaps %xmm1,%xmm4
mulss  %xmm3,%xmm4
ucomiss %xmm4,%xmm4
jp     115a <foo+0x5a>
subss  %xmm4,%xmm4
ucomiss %xmm4,%xmm4
jp     11af <foo+0xaf>
movaps %xmm1,%xmm4
mulss  %xmm2,%xmm4
ucomiss %xmm4,%xmm4
jp     116f <foo+0x6f>
subss  %xmm4,%xmm4
ucomiss %xmm4,%xmm4
jp     11af <foo+0xaf>
ucomiss %xmm2,%xmm2
setnp  %al
movaps %xmm2,%xmm4
subss  %xmm2,%xmm4
ucomiss %xmm4,%xmm4
setp   %cl
and    %al,%cl
movzbl %cl,%eax
xorps  %xmm4,%xmm4
cvtsi2ss %eax,%xmm4
andps  0xe7b(%rip),%xmm4
andps  0xe64(%rip),%xmm2
mulss  %xmm3,%xmm0
orps   %xmm4,%xmm2
mulss  %xmm1,%xmm2
addss  %xmm0,%xmm2
movaps %xmm2,%xmm0
ret
andps  0xe4a(%rip),%xmm3
jmp    116f <foo+0x6f>
movzbl %al,%eax
xorps  %xmm5,%xmm5
cvtsi2ss %eax,%xmm5
andps  0xe37(%rip),%xmm0
andps  0xe40(%rip),%xmm5
orps   %xmm5,%xmm0
ucomiss %xmm4,%xmm4
jnp    113c <foo+0x3c>
jmp    1145 <foo+0x45>

LLVM IR (-O0):
define float @foo(float %0, float %1, float %2, float %3) {
%5 = alloca float
%6 = alloca float
%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* %5
store float %1, float* %6
store float %2, float* %7
store float %3, float* %8
%14 = load float, float* %5
%15 = load float, float* %7
%16 = fmul float %14, %15
store float %16, float* %9
%17 = load float, float* %6
%18 = load float, float* %8
%19 = fmul float %17, %18
store float %19, float* %10
%20 = load float, float* %5
%21 = load float, float* %8
%22 = fmul float %20, %21
store float %22, float* %11
%23 = load float, float* %6
%24 = load float, float* %7
%25 = fmul float %23, %24
store float %25, float* %12
%26 = load float, float* %5
%27 = load float, float* %5
%28 = fcmp une float %26, %27
%29 = zext i1 %28 to i32
%30 = sext i32 %29 to i64
%31 = icmp ne i64 %30, 0
%32 = xor i1 %31, true
%33 = zext i1 %32 to i32
%34 = load float, float* %5
%35 = load float, float* %5
%36 = fsub float %34, %35
%37 = load float, float* %5
%38 = load float, float* %5
%39 = fsub float %37, %38
%40 = fcmp une float %36, %39
%41 = zext i1 %40 to i32
%42 = sext i32 %41 to i64
%43 = icmp ne i64 %42, 0
%44 = xor i1 %43, true
%45 = zext i1 %44 to i32
%46 = sext i32 %45 to i64
%47 = icmp ne i64 %46, 0
%48 = xor i1 %47, true
%49 = zext i1 %48 to i32
%50 = and i32 %33, %49
%51 = sext i32 %50 to i64
%52 = icmp ne i64 %51, 0
br i1 %52, label %81, label %53
53: ; preds = %4
%54 = load float, float* %6
%55 = load float, float* %6
%56 = fcmp une float %54, %55
%57 = zext i1 %56 to i32
%58 = sext i32 %57 to i64
%59 = icmp ne i64 %58, 0
%60 = xor i1 %59, true
%61 = zext i1 %60 to i32
%62 = load float, float* %6
%63 = load float, float* %6
%64 = fsub float %62, %63
%65 = load float, float* %6
%66 = load float, float* %6
%67 = fsub float %65, %66
%68 = fcmp une float %64, %67
%69 = zext i1 %68 to i32
%70 = sext i32 %69 to i64
%71 = icmp ne i64 %70, 0
%72 = xor i1 %71, true
%73 = zext i1 %72 to i32
%74 = sext i32 %73 to i64
%75 = icmp ne i64 %74, 0
%76 = xor i1 %75, true
%77 = zext i1 %76 to i32
%78 = and i32 %61, %77
%79 = sext i32 %78 to i64
%80 = icmp ne i64 %79, 0
br i1 %80, label %81, label %114
81: ; preds = %53, %4
%82 = load float, float* %5
%83 = load float, float* %5
%84 = fcmp une float %82, %83
%85 = zext i1 %84 to i32
%86 = sext i32 %85 to i64
%87 = icmp ne i64 %86, 0
%88 = xor i1 %87, true
%89 = zext i1 %88 to i32
%90 = load float, float* %5
%91 = load float, float* %5
%92 = fsub float %90, %91
%93 = load float, float* %5
%94 = load float, float* %5
%95 = fsub float %93, %94
%96 = fcmp une float %92, %95
%97 = zext i1 %96 to i32
%98 = sext i32 %97 to i64
%99 = icmp ne i64 %98, 0
%100 = xor i1 %99, true
%101 = zext i1 %100 to i32
%102 = sext i32 %101 to i64
%103 = icmp ne i64 %102, 0
%104 = xor i1 %103, true
%105 = zext i1 %104 to i32
%106 = and i32 %89, %105
%107 = sext i32 %106 to i64
%108 = icmp ne i64 %107, 0
%109 = zext i1 %108 to i64
%110 = select i1 %108, i32 1, i32 0
%111 = sitofp i32 %110 to float
%112 = load float, float* %5
%113 = call float @llvm.copysign.f32(float %111, float %112)
store float %113, float* %5
br label %114
114: ; preds = %81, %53
%115 = load float, float* %7
%116 = load float, float* %7
%117 = fcmp une float %115, %116
%118 = zext i1 %117 to i32
%119 = sext i32 %118 to i64
%120 = icmp ne i64 %119, 0
%121 = xor i1 %120, true
%122 = zext i1 %121 to i32
%123 = load float, float* %7
%124 = load float, float* %7
%125 = fsub float %123, %124
%126 = load float, float* %7
%127 = load float, float* %7
%128 = fsub float %126, %127
%129 = fcmp une float %125, %128
%130 = zext i1 %129 to i32
%131 = sext i32 %130 to i64
%132 = icmp ne i64 %131, 0
%133 = xor i1 %132, true
%134 = zext i1 %133 to i32
%135 = sext i32 %134 to i64
%136 = icmp ne i64 %135, 0
%137 = xor i1 %136, true
%138 = zext i1 %137 to i32
%139 = and i32 %122, %138
%140 = sext i32 %139 to i64
%141 = icmp ne i64 %140, 0
%142 = zext i1 %141 to i64
%143 = select i1 %141, i32 1, i32 0
%144 = sitofp i32 %143 to float
%145 = load float, float* %7
%146 = call float @llvm.copysign.f32(float %144, float %145)
store float %146, float* %7
%147 = load float, float* %9
%148 = load float, float* %9
%149 = fcmp une float %147, %148
%150 = zext i1 %149 to i32
%151 = sext i32 %150 to i64
%152 = icmp ne i64 %151, 0
%153 = xor i1 %152, true
%154 = zext i1 %153 to i32
%155 = load float, float* %9
%156 = load float, float* %9
%157 = fsub float %155, %156
%158 = load float, float* %9
%159 = load float, float* %9
%160 = fsub float %158, %159
%161 = fcmp une float %157, %160
%162 = zext i1 %161 to i32
%163 = sext i32 %162 to i64
%164 = icmp ne i64 %163, 0
%165 = xor i1 %164, true
%166 = zext i1 %165 to i32
%167 = sext i32 %166 to i64
%168 = icmp ne i64 %167, 0
%169 = xor i1 %168, true
%170 = zext i1 %169 to i32
%171 = and i32 %154, %170
%172 = sext i32 %171 to i64
%173 = icmp ne i64 %172, 0
br i1 %173, label %230, label %174
174: ; preds = %114
%175 = load float, float* %10
%176 = load float, float* %10
%177 = fcmp une float %175, %176
%178 = zext i1 %177 to i32
%179 = sext i32 %178 to i64
%180 = icmp ne i64 %179, 0
%181 = xor i1 %180, true
%182 = zext i1 %181 to i32
%183 = load float, float* %10
%184 = load float, float* %10
%185 = fsub float %183, %184
%186 = load float, float* %10
%187 = load float, float* %10
%188 = fsub float %186, %187
%189 = fcmp une float %185, %188
%190 = zext i1 %189 to i32
%191 = sext i32 %190 to i64
%192 = icmp ne i64 %191, 0
%193 = xor i1 %192, true
%194 = zext i1 %193 to i32
%195 = sext i32 %194 to i64
%196 = icmp ne i64 %195, 0
%197 = xor i1 %196, true
%198 = zext i1 %197 to i32
%199 = and i32 %182, %198
%200 = sext i32 %199 to i64
%201 = icmp ne i64 %200, 0
br i1 %201, label %230, label %202
202: ; preds = %174
%203 = load float, float* %12
%204 = load float, float* %12
%205 = fcmp une float %203, %204
%206 = zext i1 %205 to i32
%207 = sext i32 %206 to i64
%208 = icmp ne i64 %207, 0
%209 = xor i1 %208, true
%210 = zext i1 %209 to i32
%211 = load float, float* %12
%212 = load float, float* %12
%213 = fsub float %211, %212
%214 = load float, float* %12
%215 = load float, float* %12
%216 = fsub float %214, %215
%217 = fcmp une float %213, %216
%218 = zext i1 %217 to i32
%219 = sext i32 %218 to i64
%220 = icmp ne i64 %219, 0
%221 = xor i1 %220, true
%222 = zext i1 %221 to i32
%223 = sext i32 %222 to i64
%224 = icmp ne i64 %223, 0
%225 = xor i1 %224, true
%226 = zext i1 %225 to i32
%227 = and i32 %210, %226
%228 = sext i32 %227 to i64
%229 = icmp ne i64 %228, 0
br i1 %229, label %230, label %233
230: ; preds = %202, %174, %114
%231 = load float, float* %8
%232 = call float @llvm.copysign.f32(float 0.000000e+00, float %231)
store float %232, float* %8
br label %233
233: ; preds = %230, %202
%234 = load float, float* %5
%235 = load float, float* %8
%236 = load float, float* %6
%237 = load float, float* %7
%238 = fmul float %236, %237
%239 = call float @llvm.fmuladd.f32(float %234, float %235, float %238)
store float %239, float* %13
%240 = load float, float* %13
ret float %240
}

LLVM IR (-O2):
define float @foo(float %0, float %1, float %2, float %3) {
%5 = fmul float %0, %2
%6 = fmul float %1, %3
%7 = fmul float %1, %2
%8 = fcmp ord float %0, 0.000000e+00
%9 = fsub float %0, %0
%10 = fcmp uno float %9, 0.000000e+00
%11 = and i1 %8, %10
br i1 %11, label %17, label %12
12: ; preds = %4
%13 = fcmp ord float %1, 0.000000e+00
%14 = fsub float %1, %1
%15 = fcmp uno float %14, 0.000000e+00
%16 = and i1 %13, %15
br i1 %16, label %17, label %20
17: ; preds = %12, %4
%18 = uitofp i1 %11 to float
%19 = tail call float @llvm.copysign.f32(float %18, float %0)
br label %20
20: ; preds = %17, %12
%21 = phi float [ %19, %17 ], [ %0, %12 ]
%22 = fcmp ord float %5, 0.000000e+00
%23 = fsub float %5, %5
%24 = fcmp uno float %23, 0.000000e+00
%25 = and i1 %22, %24
br i1 %25, label %36, label %26
26: ; preds = %20
%27 = fcmp ord float %6, 0.000000e+00
%28 = fsub float %6, %6
%29 = fcmp uno float %28, 0.000000e+00
%30 = and i1 %27, %29
br i1 %30, label %36, label %31
31: ; preds = %26
%32 = fcmp ord float %7, 0.000000e+00
%33 = fsub float %7, %7
%34 = fcmp uno float %33, 0.000000e+00
%35 = and i1 %32, %34
br i1 %35, label %36, label %38
36: ; preds = %31, %26, %20
%37 = tail call float @llvm.copysign.f32(float 0.000000e+00, float %3)
br label %38
38: ; preds = %36, %31
%39 = phi float [ %37, %36 ], [ %3, %31 ]
%40 = fcmp ord float %2, 0.000000e+00
%41 = fsub float %2, %2
%42 = fcmp uno float %41, 0.000000e+00
%43 = and i1 %40, %42
%44 = uitofp i1 %43 to float
%45 = tail call float @llvm.copysign.f32(float %44, float %2)
%46 = fmul float %45, %1
%47 = tail call float @llvm.fmuladd.f32(float %21, float %39, float %46)
ret float %47
}