From 1694aebff58ce6eefe1243a931996e44c1adb2c8 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 28 Jul 2020 09:45:52 +0200 Subject: 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 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. --- gcc/tree-ssa-loop-split.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'gcc/tree-ssa-loop-split.c') diff --git a/gcc/tree-ssa-loop-split.c b/gcc/tree-ssa-loop-split.c index 7de95b5..1eb6be5 100644 --- a/gcc/tree-ssa-loop-split.c +++ b/gcc/tree-ssa-loop-split.c @@ -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; } -- cgit v1.1