From 02bf7e6fa219f939b3225c54fbe8bab2133b1aeb Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 5 Nov 2019 16:12:07 +0000 Subject: [PATCH] re PR tree-optimization/92371 (ICE in info_for_reduction, at tree-vect-loop.c:4106) 2019-11-05 Richard Biener PR tree-optimization/92371 * tree-vect-loop.c (vectorizable_reduction): Set STMT_VINFO_REDUC_DEF on the original stmt of live stmts in the chain. (vectorizable_live_operation): Look at the original stmt when checking STMT_VINFO_REDUC_DEF. * gcc.dg/torture/pr92371.c: New testcase. From-SVN: r277850 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr92371.c | 12 ++++++++++++ gcc/tree-vect-loop.c | 15 ++++++++------- 4 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr92371.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d5e0f6135e5..21304fdd30c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2019-11-05 Richard Biener + + PR tree-optimization/92371 + * tree-vect-loop.c (vectorizable_reduction): Set STMT_VINFO_REDUC_DEF + on the original stmt of live stmts in the chain. + (vectorizable_live_operation): Look at the original stmt when + checking STMT_VINFO_REDUC_DEF. + 2019-11-05 Aldy Hernandez * gimple-fold.c, gimple-loop-versioning.cc, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a14881611b2..725cfa52f14 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-11-05 Richard Biener + + PR tree-optimization/92371 + * gcc.dg/torture/pr92371.c: New testcase. + 2019-11-05 Martin Liska * c-c++-common/ubsan/ptr-overflow-2.c: Update based on changed diff --git a/gcc/testsuite/gcc.dg/torture/pr92371.c b/gcc/testsuite/gcc.dg/torture/pr92371.c new file mode 100644 index 00000000000..0c78d32f471 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr92371.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-ftree-vectorize" } */ + +int a, b; +void d() +{ + int c = sizeof(int); + for (; a; a++) + c *= sizeof(int); + c *= sizeof(int); + b = c; +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 3448b55fa1b..a63f8d51cc4 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -5836,21 +5836,22 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node, while (reduc_def != PHI_RESULT (reduc_def_phi)) { stmt_vec_info def = loop_vinfo->lookup_def (reduc_def); - def = vect_stmt_to_vectorize (def); - if (STMT_VINFO_REDUC_IDX (def) == -1) + stmt_vec_info vdef = vect_stmt_to_vectorize (def); + if (STMT_VINFO_REDUC_IDX (vdef) == -1) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, "reduction chain broken by patterns.\n"); return false; } - if (!REDUC_GROUP_FIRST_ELEMENT (def)) + if (!REDUC_GROUP_FIRST_ELEMENT (vdef)) only_slp_reduc_chain = false; /* ??? For epilogue generation live members of the chain need - to point back to the PHI for info_for_reduction to work. */ - if (STMT_VINFO_LIVE_P (def)) + to point back to the PHI via their original stmt for + info_for_reduction to work. */ + if (STMT_VINFO_LIVE_P (vdef)) STMT_VINFO_REDUC_DEF (def) = phi_info; - reduc_def = gimple_op (def->stmt, 1 + STMT_VINFO_REDUC_IDX (def)); + reduc_def = gimple_op (vdef->stmt, 1 + STMT_VINFO_REDUC_IDX (vdef)); reduc_chain_length++; } @@ -7554,7 +7555,7 @@ vectorizable_live_operation (stmt_vec_info stmt_info, /* If a stmt of a reduction is live, vectorize it via vect_create_epilog_for_reduction. vectorizable_reduction assessed validity so just trigger the transform here. */ - if (STMT_VINFO_REDUC_DEF (stmt_info)) + if (STMT_VINFO_REDUC_DEF (vect_orig_stmt (stmt_info))) { if (!vec_stmt_p) return true; -- 2.30.2