https://gcc.gnu.org/g:7a9d8962288ae2ff991c56b507041cb75097a4bc

commit 7a9d8962288ae2ff991c56b507041cb75097a4bc
Author: Tamar Christina <tamar.christ...@arm.com>
Date:   Fri Jul 26 13:02:53 2024 +0100

    middle-end: check for vector mode before calling get_mask_mode [PR116074]
    
    For historical reasons AArch64 has TI mode vector types but does not 
consider
    TImode a vector mode.
    
    What's happening in the PR is that get_vectype_for_scalar_type is returning
    vector(1) TImode for a TImode scalar.  This then fails when we call
    targetm.vectorize.get_mask_mode (vecmode).exists (&) on the TYPE_MODE.
    
    This checks for vector mode before using the results of
    get_vectype_for_scalar_type.
    
    gcc/ChangeLog:
    
            PR target/116074
            * tree-vect-patterns.cc (vect_recog_cond_store_pattern): Check 
vector mode.
    
    gcc/testsuite/ChangeLog:
    
            PR target/116074
            * g++.target/aarch64/pr116074.C: New test.

Diff:
---
 gcc/testsuite/g++.target/aarch64/pr116074.C | 24 ++++++++++++++++++++++++
 gcc/tree-vect-patterns.cc                   |  3 ++-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/g++.target/aarch64/pr116074.C 
b/gcc/testsuite/g++.target/aarch64/pr116074.C
new file mode 100644
index 000000000000..54cf561510c4
--- /dev/null
+++ b/gcc/testsuite/g++.target/aarch64/pr116074.C
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3" } */
+
+int m[40];
+
+template <typename k> struct j {
+  int length;
+  k *e;
+  void operator[](int) {
+    if (length)
+      __builtin___memcpy_chk(m, m+3, sizeof (k), -1);
+  }
+};
+
+j<j<int>> o;
+
+int *q;
+
+void ao(int i) {
+  for (; i > 0; i--) {
+    o[1];
+    *q = 1;
+  }
+}
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index b0821c74c1d8..5fbd1a4fa6b4 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -6624,7 +6624,8 @@ vect_recog_cond_store_pattern (vec_info *vinfo,
 
   machine_mode mask_mode;
   machine_mode vecmode = TYPE_MODE (vectype);
-  if (targetm.vectorize.conditional_operation_is_expensive (IFN_MASK_STORE)
+  if (!VECTOR_MODE_P (vecmode)
+      || targetm.vectorize.conditional_operation_is_expensive (IFN_MASK_STORE)
       || !targetm.vectorize.get_mask_mode (vecmode).exists (&mask_mode)
       || !can_vec_mask_load_store_p (vecmode, mask_mode, false))
     return NULL;

Reply via email to