aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIra Rosen <irar@il.ibm.com>2008-08-23 10:42:34 +0000
committerIra Rosen <irar@gcc.gnu.org>2008-08-23 10:42:34 +0000
commitf5d3c7e14eabffeeab1bf68eadaf4cd41c781c95 (patch)
tree0c0c6b8de3e63a75580ba19a61a28e2b88532885 /gcc
parentae96d86a558d34895062072eb64fdce930d385b8 (diff)
downloadgcc-f5d3c7e14eabffeeab1bf68eadaf4cd41c781c95.zip
gcc-f5d3c7e14eabffeeab1bf68eadaf4cd41c781c95.tar.gz
gcc-f5d3c7e14eabffeeab1bf68eadaf4cd41c781c95.tar.bz2
re PR middle-end/37174 (ICE: in vinfo_for_stmt, at tree-vectorizer.h:546)
PR tree-optimization/37174 * tree-vect-analyze.c (vect_get_and_check_slp_defs): Check that the def stmt is a part of the loop before accessing its stmt_vec_info. From-SVN: r139508
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/vect/pr37174.cc23
-rw-r--r--gcc/tree-vect-analyze.c5
4 files changed, 38 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6922792..06707dd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-08-23 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/37174
+ * tree-vect-analyze.c (vect_get_and_check_slp_defs): Check that the
+ def stmt is a part of the loop before accessing its stmt_vec_info.
+
2008-08-22 Anatoly Sokolov <aesok@post.ru>
PR target/11259
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index aca1340..38b9dab 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-08-23 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/37174
+ * g++.dg/vect/pr37174.cc: New test.
+
2008-08-22 Richard Guenther <rguenther@suse.de>
PR tree-optimization/37078
diff --git a/gcc/testsuite/g++.dg/vect/pr37174.cc b/gcc/testsuite/g++.dg/vect/pr37174.cc
new file mode 100644
index 0000000..d720e4b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr37174.cc
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+int* getFoo();
+struct Bar {
+ Bar();
+ int* foo1;
+ int* foo2;
+ int* table[4][4][4];
+};
+Bar::Bar() {
+ foo1 = getFoo();
+ foo2 = getFoo();
+ for (int a = 0; a < 4; ++a) {
+ for (int b = 0; b < 4; ++b) {
+ for (int c = 0; c < 4; ++c) {
+ table[a][b][c] = foo1;
+ }
+ }
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/tree-vect-analyze.c b/gcc/tree-vect-analyze.c
index fcb9cbd..0f2efd8 100644
--- a/gcc/tree-vect-analyze.c
+++ b/gcc/tree-vect-analyze.c
@@ -2508,6 +2508,7 @@ vect_get_and_check_slp_defs (loop_vec_info loop_vinfo, slp_tree slp_node,
stmt_vec_info stmt_info =
vinfo_for_stmt (VEC_index (gimple, SLP_TREE_SCALAR_STMTS (slp_node), 0));
enum gimple_rhs_class rhs_class;
+ struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
rhs_class = get_gimple_rhs_class (gimple_assign_rhs_code (stmt));
number_of_oprnds = gimple_num_ops (stmt) - 1; /* RHS only */
@@ -2531,7 +2532,9 @@ vect_get_and_check_slp_defs (loop_vec_info loop_vinfo, slp_tree slp_node,
/* Check if DEF_STMT is a part of a pattern and get the def stmt from
the pattern. Check that all the stmts of the node are in the
pattern. */
- if (def_stmt && vinfo_for_stmt (def_stmt)
+ if (def_stmt && gimple_bb (def_stmt)
+ && flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))
+ && vinfo_for_stmt (def_stmt)
&& STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (def_stmt)))
{
if (!*first_stmt_dt0)