re PR tree-optimization/57993 (ICE: verify_ssa failed (definition in block n does not dominate use in block m))

gcc:

2013-07-29  Bill Schmidt  <wschmidt@vnet.linux.ibm.com>

	PR tree-optimization/57993
	* gimple-ssa-strength-reduction.c (replace_mult_candidate): Record
	replaced statement in the candidate table.
	(phi_add_costs): Return infinite cost when the hidden basis does
	not dominate all phis on which the candidate is dependent.
	(replace_one_candidate): Record replaced statement in the
	candidate table.

gcc/testsuite:

2013-07-29  Bill Schmidt  <wschmidt@vnet.linux.ibm.com>

	PR tree-optimization/57993
	* gcc.dg/torture/pr57993.c: New test.

From-SVN: r201325
This commit is contained in:
Bill Schmidt 2013-07-30 01:01:35 +00:00 committed by William Schmidt
parent ac60ce1da6
commit 0100cd3f7e
4 changed files with 60 additions and 0 deletions

View File

@ -1,3 +1,13 @@
2013-07-29 Bill Schmidt <wschmidt@vnet.linux.ibm.com>
PR tree-optimization/57993
* gimple-ssa-strength-reduction.c (replace_mult_candidate): Record
replaced statement in the candidate table.
(phi_add_costs): Return infinite cost when the hidden basis does
not dominate all phis on which the candidate is dependent.
(replace_one_candidate): Record replaced statement in the
candidate table.
2013-07-29 Joern Rennecke <joern.rennecke@embecosm.com>
* config/epiphany/epiphany.md (*isub_i+2): New peephole.

View File

@ -1882,6 +1882,7 @@ replace_mult_candidate (slsr_cand_t c, tree basis_name, double_int bump)
gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
gimple_set_location (copy_stmt, gimple_location (c->cand_stmt));
gsi_replace (&gsi, copy_stmt, false);
c->cand_stmt = copy_stmt;
if (dump_file && (dump_flags & TDF_DETAILS))
stmt_to_print = copy_stmt;
}
@ -2179,6 +2180,18 @@ phi_add_costs (gimple phi, slsr_cand_t c, int one_add_cost)
int cost = 0;
slsr_cand_t phi_cand = base_cand_from_table (gimple_phi_result (phi));
/* If we work our way back to a phi that isn't dominated by the hidden
basis, this isn't a candidate for replacement. Indicate this by
returning an unreasonably high cost. It's not easy to detect
these situations when determining the basis, so we defer the
decision until now. */
basic_block phi_bb = gimple_bb (phi);
slsr_cand_t basis = lookup_cand (c->basis);
basic_block basis_bb = gimple_bb (basis->cand_stmt);
if (phi_bb == basis_bb || !dominated_by_p (CDI_DOMINATORS, phi_bb, basis_bb))
return COST_INFINITE;
for (i = 0; i < gimple_phi_num_args (phi); i++)
{
tree arg = gimple_phi_arg_def (phi, i);
@ -3226,6 +3239,7 @@ replace_one_candidate (slsr_cand_t c, unsigned i, tree basis_name)
gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
gimple_set_location (copy_stmt, gimple_location (c->cand_stmt));
gsi_replace (&gsi, copy_stmt, false);
c->cand_stmt = copy_stmt;
if (dump_file && (dump_flags & TDF_DETAILS))
stmt_to_print = copy_stmt;
@ -3238,6 +3252,7 @@ replace_one_candidate (slsr_cand_t c, unsigned i, tree basis_name)
NULL_TREE);
gimple_set_location (cast_stmt, gimple_location (c->cand_stmt));
gsi_replace (&gsi, cast_stmt, false);
c->cand_stmt = cast_stmt;
if (dump_file && (dump_flags & TDF_DETAILS))
stmt_to_print = cast_stmt;

View File

@ -1,3 +1,8 @@
2013-07-29 Bill Schmidt <wschmidt@vnet.linux.ibm.com>
PR tree-optimization/57993
* gcc.dg/torture/pr57993.c: New test.
2013-07-29 Joern Rennecke <joern.rennecke@embecosm.com>
* gcc.dg/tree-ssa/pr44258.c: Disable scan test for Epiphany.

View File

@ -0,0 +1,30 @@
/* This ICEd prior to fixing PR57993. */
/* { dg-do compile } */
int a, b, c, d;
char e;
unsigned g;
void f(void)
{
int h;
for(; d; d++)
if(d)
lbl:
g + a || (d = 0);
b && (a = e);
for(h = 0; h < 1; ++h)
{
h = c ? : (d = 0);
g = a = (e | 0);
}
if(a)
goto lbl;
a = e = 0;
goto lbl;
}