aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-01-16 15:13:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-01-16 15:13:05 +0000
commite57d9a82996838e73cc5470a1f3367e9c616b947 (patch)
treeac5e50f963ca3c0b277556059348b35b981bc261
parent38943500babbfda935c1108a16ecbb03cb1a33e8 (diff)
downloadgcc-e57d9a82996838e73cc5470a1f3367e9c616b947.zip
gcc-e57d9a82996838e73cc5470a1f3367e9c616b947.tar.gz
gcc-e57d9a82996838e73cc5470a1f3367e9c616b947.tar.bz2
re PR tree-optimization/83867 (ICE: Segmentation fault in nested_in_vect_loop_p)
2018-01-16 Richard Biener <rguenther@suse.de> PR tree-optimization/83867 * tree-vect-stmts.c (vect_transform_stmt): Precompute nested_in_vect_loop_p since the scalar stmt may get invalidated. * gcc.dg/vect/pr83867.c: New testcase. From-SVN: r256746
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr83867.c20
-rw-r--r--gcc/tree-vect-stmts.c9
4 files changed, 37 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b7bf83..055e924 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-01-16 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/83867
+ * tree-vect-stmts.c (vect_transform_stmt): Precompute
+ nested_in_vect_loop_p since the scalar stmt may get invalidated.
+
2018-01-16 Jakub Jelinek <jakub@redhat.com>
PR c/83844
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ec9f469..ae57828 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-01-16 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/83867
+ * gcc.dg/vect/pr83867.c: New testcase.
+
2018-01-16 Jakub Jelinek <jakub@redhat.com>
PR c/83844
diff --git a/gcc/testsuite/gcc.dg/vect/pr83867.c b/gcc/testsuite/gcc.dg/vect/pr83867.c
new file mode 100644
index 0000000..aab5bb7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr83867.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O -ftrapv" } */
+
+int
+k5 (int u5, int aw)
+{
+ int v6;
+
+ while (u5 < 1)
+ {
+ while (v6 < 4)
+ ++v6;
+
+ v6 = 0;
+ aw += u5 > 0;
+ ++u5;
+ }
+
+ return aw;
+}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 0f74772..3f8eb92 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -9426,6 +9426,11 @@ vect_transform_stmt (gimple *stmt, gimple_stmt_iterator *gsi,
gcc_assert (slp_node || !PURE_SLP_STMT (stmt_info));
gimple *old_vec_stmt = STMT_VINFO_VEC_STMT (stmt_info);
+ bool nested_p = (STMT_VINFO_LOOP_VINFO (stmt_info)
+ && nested_in_vect_loop_p
+ (LOOP_VINFO_LOOP (STMT_VINFO_LOOP_VINFO (stmt_info)),
+ stmt));
+
switch (STMT_VINFO_TYPE (stmt_info))
{
case type_demotion_vec_info_type:
@@ -9525,9 +9530,7 @@ vect_transform_stmt (gimple *stmt, gimple_stmt_iterator *gsi,
/* Handle inner-loop stmts whose DEF is used in the loop-nest that
is being vectorized, but outside the immediately enclosing loop. */
if (vec_stmt
- && STMT_VINFO_LOOP_VINFO (stmt_info)
- && nested_in_vect_loop_p (LOOP_VINFO_LOOP (
- STMT_VINFO_LOOP_VINFO (stmt_info)), stmt)
+ && nested_p
&& STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type
&& (STMT_VINFO_RELEVANT (stmt_info) == vect_used_in_outer
|| STMT_VINFO_RELEVANT (stmt_info) ==