aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2024-07-26 13:02:53 +0100
committerThomas Koenig <tkoenig@gcc.gnu.org>2024-07-28 19:05:59 +0200
commit7a9d8962288ae2ff991c56b507041cb75097a4bc (patch)
treeb7e7a28afada9255f17a759000c432710ac6023a /gcc
parent5a585d47ebe07180afae0c054a0580b78a78984e (diff)
downloadgcc-7a9d8962288ae2ff991c56b507041cb75097a4bc.zip
gcc-7a9d8962288ae2ff991c56b507041cb75097a4bc.tar.gz
gcc-7a9d8962288ae2ff991c56b507041cb75097a4bc.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.
Diffstat (limited to 'gcc')
-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;