Hi All, various optimizations in match.pd only happened on COPYSIGN in lock step which means they exclude IFN_COPYSIGN. COPYSIGN however is restricted to only the C99 builtins and so doesn't work for vectors. The patch expands these optimizations to work as nested iters. This is needed for the second patch which will add the testcase. Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. Ok for master? Thanks, Tamar gcc/ChangeLog: PR tree-optimization/109154 * match.pd: expand existing copysign optimizations. --- inline copy of patch -- diff --git a/gcc/match.pd b/gcc/match.pd index 7d651a6582d169793cca4f9a70e334dd80014d92..db95931df0672cf4ef08cca36085c3aa6831519e 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1074,37 +1074,37 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* cos(copysign(x, y)) -> cos(x). Similarly for cosh. */ (for coss (COS COSH) - copysigns (COPYSIGN) - (simplify - (coss (copysigns @0 @1)) - (coss @0))) + (for copysigns (COPYSIGN) + (simplify + (coss (copysigns @0 @1)) + (coss @0)))) /* pow(copysign(x, y), z) -> pow(x, z) if z is an even integer. */ (for pows (POW) - copysigns (COPYSIGN) - (simplify - (pows (copysigns @0 @2) REAL_CST@1) - (with { HOST_WIDE_INT n; } - (if (real_isinteger (&TREE_REAL_CST (@1), &n) && (n & 1) == 0) - (pows @0 @1))))) + (for copysigns (COPYSIGN) + (simplify + (pows (copysigns @0 @2) REAL_CST@1) + (with { HOST_WIDE_INT n; } + (if (real_isinteger (&TREE_REAL_CST (@1), &n) && (n & 1) == 0) + (pows @0 @1)))))) /* Likewise for powi. */ (for pows (POWI) - copysigns (COPYSIGN) - (simplify - (pows (copysigns @0 @2) INTEGER_CST@1) - (if ((wi::to_wide (@1) & 1) == 0) - (pows @0 @1)))) + (for copysigns (COPYSIGN) + (simplify + (pows (copysigns @0 @2) INTEGER_CST@1) + (if ((wi::to_wide (@1) & 1) == 0) + (pows @0 @1))))) (for hypots (HYPOT) - copysigns (COPYSIGN) - /* hypot(copysign(x, y), z) -> hypot(x, z). */ - (simplify - (hypots (copysigns @0 @1) @2) - (hypots @0 @2)) - /* hypot(x, copysign(y, z)) -> hypot(x, y). */ - (simplify - (hypots @0 (copysigns @1 @2)) - (hypots @0 @1))) + (for copysigns (COPYSIGN) + /* hypot(copysign(x, y), z) -> hypot(x, z). */ + (simplify + (hypots (copysigns @0 @1) @2) + (hypots @0 @2)) + /* hypot(x, copysign(y, z)) -> hypot(x, y). */ + (simplify + (hypots @0 (copysigns @1 @2)) + (hypots @0 @1)))) /* copysign(x, CST) -> [-]abs (x). */ (for copysigns (COPYSIGN_ALL) --