[Bug ipa/60518] [4.9 Regression] ICE: in verify_loop_structure, at cfgloop.c:1647
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Mar 14 09:18:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60518
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ok, so it's branch_prob()s call of split_block that splits the common latch of
loops 1 and 2
<bb 3>: (header loop 1)
<bb 4>: (header loop 2, latch loop 2 and 1)
_2 = fn1 ();
if (_2 != 0)
goto <bb 4>;
else
goto <bb 3>;
the cfghook adjusts the latch of loop 2 properly (bb4s loop father is 2)
but fails to notice that bb4 is also the latch of loop 1 ... so this
CFG hook loop handling only handles this correctly if we have simple
latches (because there the latch always belongs to its loop).
Fix:
Index: gcc/cfghooks.c
===================================================================
--- gcc/cfghooks.c (revision 208536)
+++ gcc/cfghooks.c (working copy)
@@ -510,9 +510,13 @@ split_block (basic_block bb, void *i)
if (current_loops != NULL)
{
+ edge_iterator ei;
+ edge e;
add_bb_to_loop (new_bb, bb->loop_father);
- if (bb->loop_father->latch == bb)
- bb->loop_father->latch = new_bb;
+ /* Identify all loops bb may have been the latch of and adjust them. */
+ FOR_EACH_EDGE (e, ei, new_bb->succs)
+ if (e->dest->loop_father->latch == bb)
+ e->dest->loop_father->latch = new_bb;
}
res = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
More information about the Gcc-bugs
mailing list