On Sat, Jun 24, 2017 at 4:53 PM, Andrew Pinski wrote: > On Mon, Jun 12, 2017 at 12:56 AM, Tamar Christina > wrote: >> Hi All, >> >> this patch implements a optimization rewriting >> >> x * copysign (1.0, y) and >> x * copysign (-1.0, y) > > > This reminds me: > copysign(-1.0, y) can be just optimized to: > copysign(1.0, y) > > I did that in my patch here: > https://gcc.gnu.org/ml/gcc-patches/2017-06/msg01860.html I updated the patch to handle all constants and not just -1.0. > > This should allow you to reduce the number of patterns needed to match here. > Note I still think we could do this in expand without a new > builtin/internal function. > I might go and code that up soonish. Also something like attached (NOTE this is NOT a full patch and needs the xorsign optabs part of your patch) should work for the expand side rather than creating a new builtin. There still needs to handling of the vector based copysign. But you should get the general idea. I would like to see more of these special expand patterns really. NOTE you can remove the target hook part and just check if xorsign optab is there. I don't know if that is what we want to do if not allow for generic expanding of this. Thanks, Andrew Pinski > > Thanks, > Andrew > >> >> to: >> >> x ^ (y & (1 << sign_bit_position)) >> >> This is done by creating a special builtin during matching and generate the >> appropriate instructions during expand. This new builtin is called XORSIGN. >> >> The expansion of xorsign depends on if the backend has an appropriate optab >> available. If this is not the case then we use a modified version of the existing >> copysign which does not take the abs value of the first argument as a fall back. >> >> This patch is a revival of a previous patch >> https://gcc.gnu.org/ml/gcc-patches/2015-10/msg00069.html >> >> Bootstrapped on both aarch64-none-linux-gnu and x86_64 with no issues. >> Regression done on aarch64-none-linux-gnu and no regressions. >> >> Ok for trunk? >> >> gcc/ >> 2017-06-07 Tamar Christina >> >> * builtins.def (BUILT_IN_XORSIGN, BUILT_IN_XORSIGNF): New. >> (BUILT_IN_XORSIGNL, BUILT_IN_XORSIGN_FLOAT_NX): Likewise. >> * match.pd (mult (COPYSIGN:s real_onep @0) @1): New simplifier. >> (mult (COPYSIGN:s real_mus_onep @0) @1): Likewise. >> (copysigns @0 (negate @1)): Likewise. >> * builtins.c (expand_builtin_copysign): Promoted local to argument. >> (expand_builtin): Added CASE_FLT_FN_FLOATN_NX (BUILT_IN_XORSIGN) and >> CASE_FLT_FN (BUILT_IN_XORSIGN). >> (BUILT_IN_COPYSIGN): Updated function call. >> * optabs.h (expand_copysign): New bool. >> (expand_xorsign): New. >> * optabs.def (xorsign_optab): New. >> * optabs.c (expand_copysign): New parameter. >> * fortran/f95-lang.c (xorsignl, xorsign, xorsignf): New. >> * fortran/mathbuiltins.def (XORSIGN): New. >> >> gcc/testsuite/ >> 2017-06-07 Tamar Christina >> >> * gcc.dg/tree-ssa/xorsign.c: New. >> * gcc.dg/xorsign_exec.c: New. >> * gcc.dg/vec-xorsign_exec.c: New. >> * gcc.dg/tree-ssa/reassoc-39.c (f2, f3): Updated constant to 2.