https://gcc.gnu.org/g:2c4438d39156493b5b382eb48b1f884ca5ab7ed4

commit r15-3518-g2c4438d39156493b5b382eb48b1f884ca5ab7ed4
Author: Tamar Christina <tamar.christ...@arm.com>
Date:   Fri Sep 6 14:05:43 2024 +0100

    middle-end: check that the lhs of a COND_EXPR is an SSA_NAME in cond_store 
recognition [PR116628]
    
    Because the vect_recog_bool_pattern can at the moment still transition
    out of GIMPLE and back into GENERIC the vect_recog_cond_store_pattern can
    end up using an expression as a mask rather than an SSA_NAME.
    
    This adds an explicit check that we have a mask and not an expression.
    
    gcc/ChangeLog:
    
            PR tree-optimization/116628
            * tree-vect-patterns.cc (vect_recog_cond_store_pattern): Add 
SSA_NAME
            check on expression.
    
    gcc/testsuite/ChangeLog:
    
            PR tree-optimization/116628
            * gcc.dg/vect/pr116628.c: New test.

Diff:
---
 gcc/testsuite/gcc.dg/vect/pr116628.c | 14 ++++++++++++++
 gcc/tree-vect-patterns.cc            |  3 +++
 2 files changed, 17 insertions(+)

diff --git a/gcc/testsuite/gcc.dg/vect/pr116628.c 
b/gcc/testsuite/gcc.dg/vect/pr116628.c
new file mode 100644
index 00000000000..4068c657ac5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr116628.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_float } */
+/* { dg-require-effective-target vect_masked_store } */
+/* { dg-additional-options "-Ofast -march=armv9-a" { target aarch64-*-* } } */
+
+typedef float c;
+c a[2000], b[0];
+void d() {
+  for (int e = 0; e < 2000; e++)
+    if (b[e])
+      a[e] = b[e];
+}
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index f7c3c623ea4..3a0d4cb7092 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -6685,6 +6685,9 @@ vect_recog_cond_store_pattern (vec_info *vinfo,
   /* Check if the else value matches the original loaded one.  */
   bool invert = false;
   tree cmp_ls = gimple_arg (cond_stmt, 0);
+  if (TREE_CODE (cmp_ls) != SSA_NAME)
+    return NULL;
+
   tree cond_arg1 = gimple_arg (cond_stmt, 1);
   tree cond_arg2 = gimple_arg (cond_stmt, 2);

Reply via email to