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.
--- /dev/null
+/* { 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 ();
+}
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;
}