https://gcc.gnu.org/g:6d5d980f76c3057cc90b1343a679e7eea3ad2a50

commit r17-2530-g6d5d980f76c3057cc90b1343a679e7eea3ad2a50
Author: Philipp Tomsich <[email protected]>
Date:   Thu Jul 16 06:45:03 2026 +0200

    match.pd: Make the (trunc)abs(extend x) guard vector-safe [PR126291]
    
    The (convert (abs (convert@1 @0))) -> (abs @0) rule added by
    r17-2276-ge2c4fc6b1cff evaluates TYPE_PRECISION on the outer and inner types
    after only types_match, so a vectorized abs-of-narrowed chain like
    
      vect_1 = (vector(2) int) vect_0;
      vect_2 = ABS_EXPR <vect_1>;
      vect_3 = (vector(2) signed long) vect_2;
    
    trips the vector_type tree check when gimple_simplify visits the
    outer conversion (ICE during fre). Use element_precision
    so the guard is evaluable for vectors, and require target support
    for ABS on the narrow vector type before enabling the transform
    there.
    
    Bootstrapped and regtested on aarch64-unknown-linux-gnu, x86_64-pc-linux-gnu
    and riscv64-unknown-linux-gnu.
    
            PR tree-optimization/126291
    
    gcc/ChangeLog:
    
            * match.pd ((trunc)abs (extend x) -> abs (x)): Use
            element_precision. Require target ABS support for the
            vector case.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/aarch64/pr126291.c: New test.

Diff:
---
 gcc/match.pd                                |  4 +++-
 gcc/testsuite/gcc.target/aarch64/pr126291.c | 20 ++++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index d750438382e9..b3738fdde1da 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -9541,7 +9541,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (if (optimize
       && !HONOR_SNANS (@1)
       && types_match (type, TREE_TYPE (@0))
-      && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (@1)))
+      && element_precision (type) < element_precision (TREE_TYPE (@1))
+      && (!VECTOR_TYPE_P (type)
+         || target_supports_op_p (type, ABS_EXPR, optab_default)))
    (abs @0)))
 
 (for froms (BUILT_IN_FMAF BUILT_IN_FMA BUILT_IN_FMAL)
diff --git a/gcc/testsuite/gcc.target/aarch64/pr126291.c 
b/gcc/testsuite/gcc.target/aarch64/pr126291.c
new file mode 100644
index 000000000000..f65fc4a0025f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr126291.c
@@ -0,0 +1,20 @@
+/* PR tree-optimization/126291 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -funsafe-math-optimizations -mcpu=ampere1a" } */
+
+double
+f (const double *p, double x, double y, long n)
+{
+  double best = 1e30;
+  for (long i = 0; i < n; i++)
+    {
+      int dx = p[2 * i] - x;
+      int dy = p[2 * i + 1] - y;
+      double ax = __builtin_abs (dx);
+      double ay = __builtin_abs (dy);
+      double d = ax * ax + ay * ay;
+      if (d < best)
+       best = d;
+    }
+  return best;
+}

Reply via email to