re PR tree-optimization/63593 (ICE: verify_gimple failed: incompatible types in PHI argument 0 with -O3 -fno-tree-vectorize)

2015-02-16  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/63593
	* tree-predcom.c (execute_pred_commoning_chain): Delay removing
	stmts and releasing SSA names until...
	(execute_pred_commoning): ... after processing all chains.

	* gcc.dg/pr63593.c: New testcase.

From-SVN: r220734
This commit is contained in:
Richard Biener 2015-02-16 14:52:14 +00:00 committed by Richard Biener
parent 62991c35a8
commit a933d47ffa
4 changed files with 49 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2015-02-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/63593
* tree-predcom.c (execute_pred_commoning_chain): Delay removing
stmts and releasing SSA names until...
(execute_pred_commoning): ... after processing all chains.
2015-02-16 Jan Hubicka <hubicka@ucw.cz>
PR ipa/65059

View File

@ -1,3 +1,8 @@
2015-02-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/63593
* gcc.dg/pr63593.c: New testcase.
2015-02-16 Marek Polacek <polacek@redhat.com>
PR c/65066

View File

@ -0,0 +1,20 @@
/* { dg-do compile } */
/* { dg-options "-O3 -fno-tree-vectorize" } */
int in[2 * 4][4];
int out[4];
void
foo (void)
{
int sum;
int i, j, k;
for (k = 0; k < 4; k++)
{
sum = 1;
for (j = 0; j < 4; j++)
for (i = 0; i < 4; i++)
sum *= in[i + k][j];
out[k] = sum;
}
}

View File

@ -1745,9 +1745,8 @@ execute_pred_commoning_chain (struct loop *loop, chain_p chain,
if (chain->combined)
{
/* For combined chains, just remove the statements that are used to
compute the values of the expression (except for the root one). */
for (i = 1; chain->refs.iterate (i, &a); i++)
remove_stmt (a->stmt);
compute the values of the expression (except for the root one).
We delay this until after all chains are processed. */
}
else
{
@ -1811,6 +1810,21 @@ execute_pred_commoning (struct loop *loop, vec<chain_p> chains,
execute_pred_commoning_chain (loop, chain, tmp_vars);
}
FOR_EACH_VEC_ELT (chains, i, chain)
{
if (chain->type == CT_INVARIANT)
;
else if (chain->combined)
{
/* For combined chains, just remove the statements that are used to
compute the values of the expression (except for the root one). */
dref a;
unsigned j;
for (j = 1; chain->refs.iterate (j, &a); j++)
remove_stmt (a->stmt);
}
}
update_ssa (TODO_update_ssa_only_virtuals);
}