diff options
author | Tamar Christina <tamar.christina@arm.com> | 2024-07-26 13:02:53 +0100 |
---|---|---|
committer | Tamar Christina <tamar.christina@arm.com> | 2024-07-26 13:02:53 +0100 |
commit | 29e4e4bdb674118b898d50ce7751c183aa0a44ee (patch) | |
tree | 3af9b68d2e50229a8a9ac5df80a74266c7596bcc /gcc | |
parent | f145f5411609dca5493a6709e8139609b584622f (diff) | |
download | gcc-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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/g++.target/aarch64/pr116074.C | 24 | ||||
-rw-r--r-- | gcc/tree-vect-patterns.cc | 3 |
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; |