re PR tree-optimization/53163 (crash due to null ptr deref)

PR tree-optimization/53163
	* tree-ssa-phiopt.c (cond_if_else_store_replacement): Don't ignore
	return value from compute_all_dependences.

	* gcc.c-torture/compile/pr53163.c: New test.

From-SVN: r187039
This commit is contained in:
Jakub Jelinek 2012-05-02 11:56:39 +02:00 committed by Jakub Jelinek
parent e81686ec0b
commit bc7d2862bb
4 changed files with 52 additions and 2 deletions

View File

@ -1,5 +1,9 @@
2012-05-02 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/53163
* tree-ssa-phiopt.c (cond_if_else_store_replacement): Don't ignore
return value from compute_all_dependences.
PR rtl-optimization/53160
* ree.c (combine_reaching_defs): Handle the case where cand->insn
has been modified by ree pass already.

View File

@ -1,5 +1,8 @@
2012-05-02 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/53163
* gcc.c-torture/compile/pr53163.c: New test.
PR rtl-optimization/53160
* gcc.c-torture/execute/pr53160.c: New test.

View File

@ -0,0 +1,34 @@
/* PR tree-optimization/53163 */
struct S { int s; } b, f;
int a, c;
void
foo (void)
{
int d, e;
for (d = 4; d < 19; ++d)
for (e = 2; e >= 0; e--)
{
a = 0;
a = 1;
}
}
void
bar (void)
{
int g, h, i;
for (i = 1; i >= 0; i--)
{
b = f;
for (g = 0; g <= 1; g++)
{
if (c)
break;
for (h = 0; h <= 1; h++)
foo ();
foo ();
}
}
}

View File

@ -1556,8 +1556,17 @@ cond_if_else_store_replacement (basic_block then_bb, basic_block else_bb,
/* Compute and check data dependencies in both basic blocks. */
then_ddrs = VEC_alloc (ddr_p, heap, 1);
else_ddrs = VEC_alloc (ddr_p, heap, 1);
compute_all_dependences (then_datarefs, &then_ddrs, NULL, false);
compute_all_dependences (else_datarefs, &else_ddrs, NULL, false);
if (!compute_all_dependences (then_datarefs, &then_ddrs, NULL, false)
|| !compute_all_dependences (else_datarefs, &else_ddrs, NULL, false))
{
free_dependence_relations (then_ddrs);
free_dependence_relations (else_ddrs);
free_data_refs (then_datarefs);
free_data_refs (else_datarefs);
VEC_free (gimple, heap, then_stores);
VEC_free (gimple, heap, else_stores);
return false;
}
blocks[0] = then_bb;
blocks[1] = else_bb;
blocks[2] = join_bb;