summaryrefslogtreecommitdiff
path: root/gcc/tree-tailcall.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-06-02 12:34:32 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-06-02 12:34:32 +0000
commitbd53b2574d0326d23e0dde6eb5e31bf4e952ccf1 (patch)
treeddb8ef57988bcac9a5731d81e7195e3aad87d8b0 /gcc/tree-tailcall.c
parentef3985dbd11d8faa1e4202b727aff6654ec96272 (diff)
re PR tree-optimization/80948 (test case gcc.dg/torture/pr68017.c fails with ICE starting with r248771)
2017-06-02 Richard Biener <rguenther@suse.de> PR tree-optimization/80948 * tree-tailcall.c (find_tail_calls): Track stmts to move in stmt order as well. From-SVN: r248824
Diffstat (limited to 'gcc/tree-tailcall.c')
-rw-r--r--gcc/tree-tailcall.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c
index f6cfce52287..bc370af610f 100644
--- a/gcc/tree-tailcall.c
+++ b/gcc/tree-tailcall.c
@@ -531,7 +531,8 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
since we are running after dce. */
m = NULL_TREE;
a = NULL_TREE;
- auto_bitmap to_move;
+ auto_bitmap to_move_defs;
+ auto_vec<gimple *> to_move_stmts;
abb = bb;
agsi = gsi;
@@ -563,7 +564,7 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
/* This is a gimple assign. */
par ret = process_assignment (as_a <gassign *> (stmt), gsi,
- &tmp_m, &tmp_a, &ass_var, to_move);
+ &tmp_m, &tmp_a, &ass_var, to_move_defs);
if (ret == FAIL)
return;
else if (ret == TRY_MOVE)
@@ -573,10 +574,12 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
for (unsigned opno = 1; opno < gimple_num_ops (stmt); ++opno)
{
tree op = gimple_op (stmt, opno);
- if (independent_of_stmt_p (op, stmt, gsi, to_move) != op)
+ if (independent_of_stmt_p (op, stmt, gsi, to_move_defs) != op)
return;
}
- bitmap_set_bit (to_move, SSA_NAME_VERSION (gimple_assign_lhs (stmt)));
+ bitmap_set_bit (to_move_defs,
+ SSA_NAME_VERSION (gimple_assign_lhs (stmt)));
+ to_move_stmts.safe_push (stmt);
continue;
}
@@ -622,11 +625,9 @@ find_tail_calls (basic_block bb, struct tailcall **ret)
/* Move queued defs. */
if (tail_recursion)
{
- bitmap_iterator bi;
unsigned i;
- EXECUTE_IF_SET_IN_BITMAP (to_move, 0, i, bi)
+ FOR_EACH_VEC_ELT (to_move_stmts, i, stmt)
{
- stmt = SSA_NAME_DEF_STMT (ssa_name (i));
gimple_stmt_iterator mgsi = gsi_for_stmt (stmt);
gsi_move_before (&mgsi, &gsi);
}