tree-optimization/96349 - avoid abnormal coalescing issues in loop split

This avoids splitting a loop when the entry value of a loop PHI is
involved with abnormal coalescing.

2020-07-28  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/96349
	* tree-ssa-loop-split.c (stmt_semi_invariant_p_1): When the
	condition runs into a loop PHI with an abnormal entry value give up.

	* gcc.dg/torture/pr96349.c: New testcase.
This commit is contained in:
Richard Biener 2020-07-28 09:45:52 +02:00
parent 883eec6653
commit 2b2f3867c0
2 changed files with 35 additions and 0 deletions

View File

@ -0,0 +1,25 @@
/* { dg-do compile } */
void __attribute__ ((returns_twice))
gr (void);
void
ib (void);
void
zg (void);
void
yw (int uz)
{
gr ();
for (;;)
if (uz != 0)
{
uz = 0;
ib ();
}
else
zg ();
}

View File

@ -1145,6 +1145,16 @@ stmt_semi_invariant_p_1 (struct loop *loop, gimple *stmt,
if (gimple_bb (stmt) == loop->header)
{
/* If the entry value is subject to abnormal coalescing
avoid the transform since we're going to duplicate the
loop header and thus likely introduce overlapping life-ranges
between the PHI def and the entry on the path when the
first loop is skipped. */
tree entry_def
= PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop));
if (TREE_CODE (entry_def) == SSA_NAME
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (entry_def))
return false;
invar = loop_iter_phi_semi_invariant_p (loop, phi, skip_head);
return invar;
}