Commit 952e216e by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/62209 (ICE with LTO on valid code on x86_64-linux-gnu)

	PR tree-optimization/62209
	* tree-ssa-reassoc.c (update_range_test): If stmt is a PHI and
	op == range->exp, insert seq and gimplified code after labels
	instead of after the phi.

From-SVN: r220706
parent b671235f
2015-02-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/62209
* tree-ssa-reassoc.c (update_range_test): If stmt is a PHI and
op == range->exp, insert seq and gimplified code after labels
instead of after the phi.
2015-02-13 Jeff Law <law@redhat.com> 2015-02-13 Jeff Law <law@redhat.com>
PR bootstrap/65060 PR bootstrap/65060
......
...@@ -2177,10 +2177,18 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange, ...@@ -2177,10 +2177,18 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange,
tem = fold_convert_loc (loc, optype, tem); tem = fold_convert_loc (loc, optype, tem);
gsi = gsi_for_stmt (stmt); gsi = gsi_for_stmt (stmt);
unsigned int uid = gimple_uid (stmt);
/* In rare cases range->exp can be equal to lhs of stmt. /* In rare cases range->exp can be equal to lhs of stmt.
In that case we have to insert after the stmt rather then before In that case we have to insert after the stmt rather then before
it. */ it. If stmt is a PHI, insert it at the start of the basic block. */
if (op == range->exp) if (op != range->exp)
{
gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true,
GSI_SAME_STMT);
gsi_prev (&gsi);
}
else if (gimple_code (stmt) != GIMPLE_PHI)
{ {
gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING); gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, false, tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, false,
...@@ -2188,16 +2196,32 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange, ...@@ -2188,16 +2196,32 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange,
} }
else else
{ {
gsi = gsi_after_labels (gimple_bb (stmt));
if (!gsi_end_p (gsi))
uid = gimple_uid (gsi_stmt (gsi));
else
{
gsi = gsi_start_bb (gimple_bb (stmt));
uid = 1;
while (!gsi_end_p (gsi))
{
uid = gimple_uid (gsi_stmt (gsi));
gsi_next (&gsi);
}
}
gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT); gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true, tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true,
GSI_SAME_STMT); GSI_SAME_STMT);
gsi_prev (&gsi); if (gsi_end_p (gsi))
gsi = gsi_last_bb (gimple_bb (stmt));
else
gsi_prev (&gsi);
} }
for (; !gsi_end_p (gsi); gsi_prev (&gsi)) for (; !gsi_end_p (gsi); gsi_prev (&gsi))
if (gimple_uid (gsi_stmt (gsi))) if (gimple_uid (gsi_stmt (gsi)))
break; break;
else else
gimple_set_uid (gsi_stmt (gsi), gimple_uid (stmt)); gimple_set_uid (gsi_stmt (gsi), uid);
oe->op = tem; oe->op = tem;
range->exp = exp; range->exp = exp;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment