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:
parent
883eec6653
commit
2b2f3867c0
2 changed files with 35 additions and 0 deletions
25
gcc/testsuite/gcc.dg/torture/pr96349.c
Normal file
25
gcc/testsuite/gcc.dg/torture/pr96349.c
Normal 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 ();
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue