From: Tamar Christina Date: Thu, 9 Nov 2023 13:58:59 +0000 (+0000) Subject: middle-end: expand copysign handling from lockstep to nested iters X-Git-Tag: basepoints/gcc-15~4856 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d44ab221f64f01fc676be0da1a6774740d713c6;p=thirdparty%2Fgcc.git middle-end: expand copysign handling from lockstep to nested iters 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. gcc/ChangeLog: PR tree-optimization/109154 * match.pd: expand existing copysign optimizations. --- diff --git a/gcc/match.pd b/gcc/match.pd index dbc811b2b38f..68a1587ea246 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1086,37 +1086,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)