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
|
@ -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 (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);
|
invar = loop_iter_phi_semi_invariant_p (loop, phi, skip_head);
|
||||||
return invar;
|
return invar;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue