tree-optimization/98845 - ICE with tail-merging and DCE/DSE disabled

The following shows that tail-merging will make dead SSA defs live
in paths where it wasn't before, possibly introducing UB or as
in this case, uses of abnormals that eventually fail coalescing
later.  The fix is to register such defs for stmt comparison.

	PR tree-optimization/98845
	* tree-ssa-tail-merge.cc (stmt_local_def): Consider a
	def with no uses not local.

	* gcc.dg/pr98845.c: New testcase.
	* gcc.dg/pr81192.c: Adjust.
This commit is contained in:
Richard Biener 2025-02-17 15:53:11 +01:00 committed by Richard Biener
parent b22f191b7c
commit 6b8a8c9fd6
3 changed files with 46 additions and 1 deletions

View file

@ -25,12 +25,16 @@ void __GIMPLE(ssa, startwith("pre")) fn2 ()
if (j_6(D) != _Literal (int)2147483647)
goto __BB4;
else
goto __BB5;
goto __BB9;
__BB(4):
iftmp2_8 = j_6(D) + _Literal (int)1;
goto __BB5;
__BB(9):
iftmp2_8 = j_6(D) + _Literal (int)1;
goto __BB5;
__BB(5):
b_lsm6_10 = _Literal (int)2147483647;
goto __BB6;

View file

@ -0,0 +1,33 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-dce -fno-tree-dse" } */
int n;
__attribute__ ((returns_twice)) void
foo (void);
void
bar (void);
void
quux (int x)
{
if (x)
++x;
else
{
if (n)
{
x = 1;
foo ();
}
else
bar ();
if (n)
{
++x;
++n;
}
}
}

View file

@ -336,10 +336,13 @@ stmt_local_def (gimple *stmt)
def_bb = gimple_bb (stmt);
bool any_use = false;
FOR_EACH_IMM_USE_FAST (use_p, iter, val)
{
if (is_gimple_debug (USE_STMT (use_p)))
continue;
any_use = true;
bb = gimple_bb (USE_STMT (use_p));
if (bb == def_bb)
continue;
@ -351,6 +354,11 @@ stmt_local_def (gimple *stmt)
return false;
}
/* When there is no use avoid making the stmt live on other paths.
This can happen with DCE disabled or not done as seen in PR98845. */
if (!any_use)
return false;
return true;
}