aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-09-20 08:35:59 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-09-20 08:35:59 +0000
commit6e222b2a3aede20f3093802d1649e75848e3bd2b (patch)
treed92612a64f3df35647f3c751c13aed50c425544b
parentd865ed7227a98bc1229d6e42bca35f605d6f4f75 (diff)
downloadgcc-6e222b2a3aede20f3093802d1649e75848e3bd2b.zip
gcc-6e222b2a3aede20f3093802d1649e75848e3bd2b.tar.gz
gcc-6e222b2a3aede20f3093802d1649e75848e3bd2b.tar.bz2
re PR tree-optimization/91822 (FAIL: gcc.dg/pr88031.c (internal compiler error))
2019-09-20 Richard Biener <rguenther@suse.de> PR tree-optimization/91822 * tree-vectorizer.h (vectorizable_condition): Restore for_reduction parameter. * tree-vect-loop.c (vectorizable_reduction): Adjust asserts for reduc_index in nested cycles, adjust vectorizable_condition calls. * tree-vect-stmts.c (vectorizable_condition): Restore for_reduction parameter. (vect_analyze_stmt): Adjust. (vect_transform_stmt): Likewise. From-SVN: r275990
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/tree-vect-loop.c11
-rw-r--r--gcc/tree-vect-stmts.c10
-rw-r--r--gcc/tree-vectorizer.h2
4 files changed, 25 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 31dd206..bda334b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,18 @@
2019-09-20 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/91822
+ * tree-vectorizer.h (vectorizable_condition): Restore for_reduction
+ parameter.
+ * tree-vect-loop.c (vectorizable_reduction): Adjust asserts
+ for reduc_index in nested cycles, adjust vectorizable_condition
+ calls.
+ * tree-vect-stmts.c (vectorizable_condition): Restore for_reduction
+ parameter.
+ (vect_analyze_stmt): Adjust.
+ (vect_transform_stmt): Likewise.
+
+2019-09-20 Richard Biener <rguenther@suse.de>
+
PR target/91767
* config/i386/i386-features.c (general_scalar_chain::convert_registers):
Ensure there's a sequence point between allocating the new register
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 9a4d960d..7e13986 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -6534,9 +6534,10 @@ vectorizable_reduction (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
{
/* Only call during the analysis stage, otherwise we'll lose
STMT_VINFO_TYPE. */
- gcc_assert (reduc_index > 0);
+ gcc_assert (nested_cycle || reduc_index > 0);
if (!vec_stmt && !vectorizable_condition (stmt_info, gsi, NULL,
- reduc_index, NULL, cost_vec))
+ true, reduc_index,
+ NULL, cost_vec))
{
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
@@ -6991,7 +6992,7 @@ vectorizable_reduction (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
{
gcc_assert (!slp_node && reduc_index > 0);
return vectorizable_condition (stmt_info, gsi, vec_stmt,
- reduc_index, NULL, NULL);
+ true, reduc_index, NULL, NULL);
}
/* Create the destination vector */
@@ -7021,8 +7022,8 @@ vectorizable_reduction (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
{
if (code == COND_EXPR)
{
- gcc_assert (!slp_node && reduc_index > 0);
- vectorizable_condition (stmt_info, gsi, vec_stmt,
+ gcc_assert (!slp_node && (nested_cycle || reduc_index > 0));
+ vectorizable_condition (stmt_info, gsi, vec_stmt, true,
reduc_index, NULL, NULL);
break;
}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 0636e5c..b1e97f8 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -9778,7 +9778,8 @@ vect_is_simple_cond (tree cond, vec_info *vinfo,
bool
vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
- stmt_vec_info *vec_stmt, int reduc_index,
+ stmt_vec_info *vec_stmt, bool for_reduction,
+ int reduc_index,
slp_tree slp_node, stmt_vector_for_cost *cost_vec)
{
vec_info *vinfo = stmt_info->vinfo;
@@ -9807,7 +9808,6 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
vec<tree> vec_oprnds3 = vNULL;
tree vec_cmp_type;
bool masked = false;
- bool for_reduction = (reduc_index > 0);
if (for_reduction && STMT_SLP_TYPE (stmt_info))
return false;
@@ -10668,7 +10668,7 @@ vect_analyze_stmt (stmt_vec_info stmt_info, bool *need_to_vectorize,
node_instance, cost_vec)
|| vectorizable_induction (stmt_info, NULL, NULL, node, cost_vec)
|| vectorizable_shift (stmt_info, NULL, NULL, node, cost_vec)
- || vectorizable_condition (stmt_info, NULL, NULL, 0, node,
+ || vectorizable_condition (stmt_info, NULL, NULL, false, -1, node,
cost_vec)
|| vectorizable_comparison (stmt_info, NULL, NULL, node,
cost_vec));
@@ -10687,7 +10687,7 @@ vect_analyze_stmt (stmt_vec_info stmt_info, bool *need_to_vectorize,
|| vectorizable_load (stmt_info, NULL, NULL, node, node_instance,
cost_vec)
|| vectorizable_store (stmt_info, NULL, NULL, node, cost_vec)
- || vectorizable_condition (stmt_info, NULL, NULL, 0, node,
+ || vectorizable_condition (stmt_info, NULL, NULL, false, -1, node,
cost_vec)
|| vectorizable_comparison (stmt_info, NULL, NULL, node,
cost_vec));
@@ -10792,7 +10792,7 @@ vect_transform_stmt (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
break;
case condition_vec_info_type:
- done = vectorizable_condition (stmt_info, gsi, &vec_stmt, 0,
+ done = vectorizable_condition (stmt_info, gsi, &vec_stmt, false, -1,
slp_node, NULL);
gcc_assert (done);
break;
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index aef0ff8..a514c77 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -1534,7 +1534,7 @@ extern void vect_remove_stores (stmt_vec_info);
extern opt_result vect_analyze_stmt (stmt_vec_info, bool *, slp_tree,
slp_instance, stmt_vector_for_cost *);
extern bool vectorizable_condition (stmt_vec_info, gimple_stmt_iterator *,
- stmt_vec_info *, int, slp_tree,
+ stmt_vec_info *, bool, int, slp_tree,
stmt_vector_for_cost *);
extern bool vectorizable_shift (stmt_vec_info, gimple_stmt_iterator *,
stmt_vec_info *, slp_tree,