diff options
author | Richard Biener <rguenther@suse.de> | 2012-12-21 14:33:59 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-12-21 14:33:59 +0000 |
commit | 811ee85b3097a8d71c76136c9b5ef339dc7ded6b (patch) | |
tree | a0311866d7a6d0fe5779fa170592e64b5731a793 /gcc/cprop.c | |
parent | d106911b0d8a0575daba3c7097c2c2d8878da8c7 (diff) | |
download | gcc-811ee85b3097a8d71c76136c9b5ef339dc7ded6b.zip gcc-811ee85b3097a8d71c76136c9b5ef339dc7ded6b.tar.gz gcc-811ee85b3097a8d71c76136c9b5ef339dc7ded6b.tar.bz2 |
re PR middle-end/52996 (ice in verify_loop_structure, at cfgloop.c:1567)
2012-12-21 Richard Biener <rguenther@suse.de>
PR rtl-optimization/52996
* cprop.c (bypass_block): When loops are to be preserved
do not bypass loop headers. Revert earlier kludge to remove
loops when doing that.
From-SVN: r194666
Diffstat (limited to 'gcc/cprop.c')
-rw-r--r-- | gcc/cprop.c | 34 |
1 files changed, 9 insertions, 25 deletions
diff --git a/gcc/cprop.c b/gcc/cprop.c index ec896a4..463f81f 100644 --- a/gcc/cprop.c +++ b/gcc/cprop.c @@ -1496,7 +1496,7 @@ bypass_block (basic_block bb, rtx setcc, rtx jump) rtx insn, note; edge e, edest; int change; - int may_be_loop_header; + int may_be_loop_header = false; unsigned removed_p; unsigned i; edge_iterator ei; @@ -1510,27 +1510,22 @@ bypass_block (basic_block bb, rtx setcc, rtx jump) if (note) find_used_regs (&XEXP (note, 0), NULL); - /* Determine whether there are more latch edges. Threading through - a loop header with more than one latch is delicate, see e.g. - tree-ssa-threadupdate.c:thread_through_loop_header. */ if (current_loops) { - may_be_loop_header = bb == bb->loop_father->header; - if (may_be_loop_header - && bb->loop_father->latch == NULL) + /* If we are to preserve loop structure then do not bypass + a loop header. This will either rotate the loop, create + multiple entry loops or even irreducible regions. */ + if (bb == bb->loop_father->header) return 0; } else { - unsigned n_back_edges = 0; FOR_EACH_EDGE (e, ei, bb->preds) if (e->flags & EDGE_DFS_BACK) - n_back_edges++; - - may_be_loop_header = n_back_edges > 0; - - if (n_back_edges > 1) - return 0; + { + may_be_loop_header = true; + break; + } } change = 0; @@ -1619,17 +1614,6 @@ bypass_block (basic_block bb, rtx setcc, rtx jump) && dest != old_dest && dest != EXIT_BLOCK_PTR) { - if (current_loops != NULL - && e->src->loop_father->latch == e->src) - { - /* ??? Now we are creating (or may create) a loop - with multiple entries. Simply mark it for - removal. Alternatively we could not do this - threading. */ - e->src->loop_father->header = NULL; - e->src->loop_father->latch = NULL; - } - redirect_edge_and_branch_force (e, dest); /* Copy the register setter to the redirected edge. |