aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-11-21 17:41:16 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-11-21 17:41:16 +0000
commit934f135b967c7501be6e2e10a2c3c03c54a198d3 (patch)
tree947dab70457f5282f7b8ededd8cd06d8b5493013
parent8239933547870e66ffcc7a664c271a960e3f791a (diff)
downloadgcc-934f135b967c7501be6e2e10a2c3c03c54a198d3.zip
gcc-934f135b967c7501be6e2e10a2c3c03c54a198d3.tar.gz
gcc-934f135b967c7501be6e2e10a2c3c03c54a198d3.tar.bz2
Add missing VECTOR_MODE_P checks (PR 92595)
This patch fixes some cases in which we weren't checking whether we had a vector mode before calling related_vector_mode or before making vector optab queries. 2019-11-21 Richard Sandiford <richard.sandiford@arm.com> gcc/ PR tree-optimization/92595 * tree-vect-stmts.c (get_group_load_store_type): Add a VECTOR_MODE_P check. (vectorizable_store, vectorizable_load): Likewise. gcc/testsuite/ PR tree-optimization/92595 * g++.dg/vect/pr92595.cc: New test. From-SVN: r278590
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/vect/pr92595.cc32
-rw-r--r--gcc/tree-vect-stmts.c13
4 files changed, 53 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2aa4a78..859dd71 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2019-11-21 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR tree-optimization/92595
+ * tree-vect-stmts.c (get_group_load_store_type): Add a VECTOR_MODE_P
+ check.
+ (vectorizable_store, vectorizable_load): Likewise.
+
2019-11-21 Jan Hubicka <jh@suse.cz>
* ipa-inline.c (update_callee_keys): Add parameter UPDATE_SINCE.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1ae64a6..1f69d52 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-11-21 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR tree-optimization/92595
+ * g++.dg/vect/pr92595.cc: New test.
+
2019-11-21 Srinath Parvathaneni <srinath.parvathaneni@arm.com>
* gcc.target/arm/acle/crc_hf_1.c: Modify the compiler options directive
diff --git a/gcc/testsuite/g++.dg/vect/pr92595.cc b/gcc/testsuite/g++.dg/vect/pr92595.cc
new file mode 100644
index 0000000..3d0b517
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr92595.cc
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// { dg-require-effective-target c++11 }
+// { dg-additional-options "-O3" }
+// { dg-additional-options "-O3 -m32 -mno-sse" { target { i?86-*-* x86_64-*-* } } }
+
+void *operator new(__SIZE_TYPE__, void *a) { return a; }
+class b {
+public:
+ using c = int *;
+ c e();
+ c h();
+};
+template <typename d> class j : b {
+public:
+ void l() {
+ for (auto f = h(), g = e(); f != g; ++f)
+ new (f) d();
+ }
+};
+class m {
+public:
+ enum i {};
+ struct C {
+ i : 8;
+ i k : 8;
+ };
+};
+class o {
+ j<m::C> n;
+ o();
+};
+o::o() { n.l(); }
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 951c57f..65c649d 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -2308,6 +2308,7 @@ get_group_load_store_type (stmt_vec_info stmt_info, tree vectype, bool slp,
|| alignment_support_scheme == dr_unaligned_supported)
&& known_eq (nunits, (group_size - gap) * 2)
&& known_eq (nunits, group_size)
+ && VECTOR_MODE_P (TYPE_MODE (vectype))
&& related_vector_mode (TYPE_MODE (vectype), elmode,
group_size - gap).exists (&vmode)
&& (convert_optab_handler (vec_init_optab,
@@ -7822,8 +7823,9 @@ vectorizable_store (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
of vector elts directly. */
scalar_mode elmode = SCALAR_TYPE_MODE (elem_type);
machine_mode vmode;
- if (!related_vector_mode (TYPE_MODE (vectype), elmode,
- group_size).exists (&vmode)
+ if (!VECTOR_MODE_P (TYPE_MODE (vectype))
+ || !related_vector_mode (TYPE_MODE (vectype), elmode,
+ group_size).exists (&vmode)
|| (convert_optab_handler (vec_extract_optab,
TYPE_MODE (vectype), vmode)
== CODE_FOR_nothing))
@@ -7840,6 +7842,7 @@ vectorizable_store (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
element extracts from the original vector type and
element size stores. */
if (int_mode_for_size (lsize, 0).exists (&elmode)
+ && VECTOR_MODE_P (TYPE_MODE (vectype))
&& related_vector_mode (TYPE_MODE (vectype), elmode,
lnunits).exists (&vmode)
&& (convert_optab_handler (vec_extract_optab,
@@ -8922,8 +8925,9 @@ vectorizable_load (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
vector elts directly. */
scalar_mode elmode = SCALAR_TYPE_MODE (TREE_TYPE (vectype));
machine_mode vmode;
- if (related_vector_mode (TYPE_MODE (vectype), elmode,
- group_size).exists (&vmode)
+ if (VECTOR_MODE_P (TYPE_MODE (vectype))
+ && related_vector_mode (TYPE_MODE (vectype), elmode,
+ group_size).exists (&vmode)
&& (convert_optab_handler (vec_init_optab,
TYPE_MODE (vectype), vmode)
!= CODE_FOR_nothing))
@@ -8947,6 +8951,7 @@ vectorizable_load (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
/* If we can't construct such a vector fall back to
element loads of the original vector type. */
if (int_mode_for_size (lsize, 0).exists (&elmode)
+ && VECTOR_MODE_P (TYPE_MODE (vectype))
&& related_vector_mode (TYPE_MODE (vectype), elmode,
lnunits).exists (&vmode)
&& (convert_optab_handler (vec_init_optab, vmode, elmode)