diff options
author | Richard Biener <rguenther@suse.de> | 2014-04-23 11:25:27 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-04-23 11:25:27 +0000 |
commit | 22718afe53695be38b6d9b7de6edec7c8dda734e (patch) | |
tree | 9ae08ec445ede14894095e6d590b4253594875c0 /gcc/tree-ssa-loop-im.c | |
parent | c07d7c02d7aeac5de56066286c54a137518a98d6 (diff) | |
download | gcc-22718afe53695be38b6d9b7de6edec7c8dda734e.zip gcc-22718afe53695be38b6d9b7de6edec7c8dda734e.tar.gz gcc-22718afe53695be38b6d9b7de6edec7c8dda734e.tar.bz2 |
re PR tree-optimization/60903 (ICE: in verify_loop_structure, at cfgloop.c:1647: : edge from 13 to 14 should be marked irreducible)
2014-04-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/60903
* tree-ssa-loop-im.c (analyze_memory_references): Remove
commented code block.
(execute_sm_if_changed): Properly apply IRREDUCIBLE_LOOP
loop flags to newly created BBs and edges.
* gcc.dg/torture/pr60903.c: New testcase.
From-SVN: r209694
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r-- | gcc/tree-ssa-loop-im.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 0b44c97..54156d7 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -1544,15 +1544,6 @@ analyze_memory_references (void) struct loop *loop, *outer; unsigned i, n; -#if 0 - /* Initialize bb_loop_postorder with a mapping from loop->num to - its postorder index. */ - i = 0; - bb_loop_postorder = XNEWVEC (unsigned, number_of_loops (cfun)); - FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) - bb_loop_postorder[loop->num] = i++; -#endif - /* Collect all basic-blocks in loops and sort them after their loops postorder. */ i = 0; @@ -1807,6 +1798,7 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag) gimple_stmt_iterator gsi; gimple stmt; struct prev_flag_edges *prev_edges = (struct prev_flag_edges *) ex->aux; + bool irr = ex->flags & EDGE_IRREDUCIBLE_LOOP; /* ?? Insert store after previous store if applicable. See note below. */ @@ -1821,8 +1813,9 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag) old_dest = ex->dest; new_bb = split_edge (ex); then_bb = create_empty_bb (new_bb); - if (current_loops && new_bb->loop_father) - add_bb_to_loop (then_bb, new_bb->loop_father); + if (irr) + then_bb->flags = BB_IRREDUCIBLE_LOOP; + add_bb_to_loop (then_bb, new_bb->loop_father); gsi = gsi_start_bb (new_bb); stmt = gimple_build_cond (NE_EXPR, flag, boolean_false_node, @@ -1834,9 +1827,12 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag) stmt = gimple_build_assign (unshare_expr (mem), tmp_var); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); - make_edge (new_bb, then_bb, EDGE_TRUE_VALUE); - make_edge (new_bb, old_dest, EDGE_FALSE_VALUE); - then_old_edge = make_edge (then_bb, old_dest, EDGE_FALLTHRU); + make_edge (new_bb, then_bb, + EDGE_TRUE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); + make_edge (new_bb, old_dest, + EDGE_FALSE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); + then_old_edge = make_edge (then_bb, old_dest, + EDGE_FALLTHRU | (irr ? EDGE_IRREDUCIBLE_LOOP : 0)); set_immediate_dominator (CDI_DOMINATORS, then_bb, new_bb); |