aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2024-07-26 13:02:53 +0100
committerTamar Christina <tamar.christina@arm.com>2024-07-26 13:02:53 +0100
commit29e4e4bdb674118b898d50ce7751c183aa0a44ee (patch)
tree3af9b68d2e50229a8a9ac5df80a74266c7596bcc
parentf145f5411609dca5493a6709e8139609b584622f (diff)
downloadgcc-29e4e4bdb674118b898d50ce7751c183aa0a44ee.zip
gcc-29e4e4bdb674118b898d50ce7751c183aa0a44ee.tar.gz
gcc-29e4e4bdb674118b898d50ce7751c183aa0a44ee.tar.bz2
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.
-rw-r--r--gcc/testsuite/g++.target/aarch64/pr116074.C24
-rw-r--r--gcc/tree-vect-patterns.cc3
2 files changed, 26 insertions, 1 deletions
diff --git a/gcc/testsuite/g++.target/aarch64/pr116074.C b/gcc/testsuite/g++.target/aarch64/pr116074.C
new file mode 100644
index 0000000..54cf561
--- /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 b0821c7..5fbd1a4 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;