On June 27, 2017 4:52:28 PM GMT+02:00, Tamar Christina <tamar.christ...@arm.com> wrote: >> >> +(for cmp (gt ge lt le) >> >> + outp (convert convert negate negate) >> >> + outn (negate negate convert convert) >> >> + /* Transform (X > 0.0 ? 1.0 : -1.0) into copysign(1, X). */ >> >> + /* Transform (X >= 0.0 ? 1.0 : -1.0) into copysign(1, X). */ >> >> + /* Transform (X < 0.0 ? 1.0 : -1.0) into copysign(1,-X). */ >> >> + /* Transform (X <= 0.0 ? 1.0 : -1.0) into copysign(1,-X). */ >> >> +(simplify >> >> + (cond (cmp @0 real_zerop) real_onep real_minus_onep) >> >> + (if (!HONOR_NANS (type) && !HONOR_SIGNED_ZEROS (type) >> >> + && types_match (type, TREE_TYPE (@0))) >> >> + (switch >> >> + (if (types_match (type, float_type_node)) >> >> + (BUILT_IN_COPYSIGNF { build_one_cst (type); } (outp @0))) >> >> + (if (types_match (type, double_type_node)) >> >> + (BUILT_IN_COPYSIGN { build_one_cst (type); } (outp @0))) >> >> + (if (types_match (type, long_double_type_node)) >> >> + (BUILT_IN_COPYSIGNL { build_one_cst (type); } (outp @0)))))) >> >> > >Hi, > >Out of curiosity is there any reason why this transformation can't be >more general? > >e.g. Transform (X > 0.0 ? CST : -CST) into copysign(CST, X).
That's also possible, yes. >we would at the very least avoid a csel or a branch then. > >Regards, >Tamar