https://gcc.gnu.org/g:b3527d9b213fcbe2f4550709d25220ab6ba43184

commit r17-4228-gb3527d9b213fcbe2f4550709d25220ab6ba43184
Author: Dominic P <[email protected]>
Date:   Mon Sep 14 07:24:13 2026 -0600

    [PATCH] match.pd: Restrict the X | -X range test to scalars [PR127379]
    
    The X | -X matcher of the range-test patterns has no constant operand,
    so vectors reach it and the shift form converts a scalar comparison to
    a vector type.  As Andrea Pinski suggested, limit it to integral types;
    the other matchers are already scalar through their INTEGER_CST.
    
    Bootstrapped on x86_64-pc-linux-gnu; tree-ssa, vect, dg and dg-torture
    tests show no regressions.
    
    Assisted-by: Claude Opus 5 (Anthropic)
    
            PR tree-optimization/127379
    
    gcc/ChangeLog:
    
            * match.pd (ior_range_test_0): Require an integral type.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/torture/pr127379.c: New test.
    
    Signed-off-by: Dominic P <[email protected]>

Diff:
---
 gcc/match.pd                            |  3 ++-
 gcc/testsuite/gcc.dg/torture/pr127379.c | 29 +++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index 0d2312c17f7a..4059ed787f05 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -5129,7 +5129,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
       && wi::ge_p (wi::to_wide (@1), 0, SIGNED))))
 (match (ior_range_test_0 @0)
  (bit_ior:c@1 @0 (negate @0))
- (if (single_use (@1)
+ (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
+      && single_use (@1)
       && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@0)))))
 (for cmp (lt ge)
      out (gt le)
diff --git a/gcc/testsuite/gcc.dg/torture/pr127379.c 
b/gcc/testsuite/gcc.dg/torture/pr127379.c
new file mode 100644
index 000000000000..94acd2ad04a2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr127379.c
@@ -0,0 +1,29 @@
+/* PR tree-optimization/127379 */
+/* { dg-do compile } */
+/* { dg-require-effective-target int32 } */
+/* { dg-additional-options "-Wno-psabi" } */
+
+__attribute__((vector_size (sizeof (unsigned))))
+  unsigned v1;
+int a;
+
+int
+f (void)
+{
+  return (a | (v1 | -v1) >> 31)[0];
+}
+
+typedef unsigned int vu __attribute__ ((vector_size (16)));
+typedef int vi __attribute__ ((vector_size (16)));
+
+vu
+g (vu x)
+{
+  return (x | -x) >> 31;
+}
+
+vu
+h (vi x)
+{
+  return (vu) (x | -x) >> 31;
+}

Reply via email to