tree-optimization/100566 - fix another predication issue in VN

This amends the fix for PR100053 where I failed to amend all edge
tests in dominated_by_p_w_unex.

2021-05-12  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/100566
	* tree-ssa-sccvn.c (dominated_by_p_w_unex): Properly handle
	allow_back for all edge queries.

	* gcc.dg/torture/pr100566.c: New testcase.
This commit is contained in:
Richard Biener 2021-05-12 15:39:52 +02:00
parent d1adbe5c1b
commit 097fde5e75
2 changed files with 40 additions and 2 deletions

View file

@ -0,0 +1,36 @@
/* { dg-do run } */
volatile int s, c;
__attribute__((noipa)) void
foo (void)
{
if (c++ > 1)
__builtin_abort ();
}
__attribute__((noipa)) int
bar (void)
{
int i = 0, j = s;
if (j == 0)
goto lab;
for (i = 0; i < j; i++)
{
lab:
foo ();
if (!j)
goto lab;
}
return 0;
}
int
main ()
{
s = 1;
bar ();
if (c != 1)
__builtin_abort ();
return 0;
}

View file

@ -4529,7 +4529,8 @@ dominated_by_p_w_unex (basic_block bb1, basic_block bb2, bool allow_back)
/* Iterate to the single executable bb2 successor. */
edge succe = NULL;
FOR_EACH_EDGE (e, ei, bb2->succs)
if (e->flags & EDGE_EXECUTABLE)
if ((e->flags & EDGE_EXECUTABLE)
|| (!allow_back && (e->flags & EDGE_DFS_BACK)))
{
if (succe)
{
@ -4547,7 +4548,8 @@ dominated_by_p_w_unex (basic_block bb1, basic_block bb2, bool allow_back)
{
FOR_EACH_EDGE (e, ei, succe->dest->preds)
if (e != succe
&& (e->flags & EDGE_EXECUTABLE))
&& ((e->flags & EDGE_EXECUTABLE)
|| (!allow_back && (e->flags & EDGE_DFS_BACK))))
{
succe = NULL;
break;