From: Zdenek Dvorak Date: Thu, 7 Oct 2004 06:14:15 +0000 (+0200) Subject: re PR tree-optimization/17806 (compiler error: in verify_loop_structure, at cfgloop... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a746fd8cdd2153c67ab70e4e17a2cdaa7ca50f94;p=gcc.git re PR tree-optimization/17806 (compiler error: in verify_loop_structure, at cfgloop.c:1491 , works -O2, breaks with -O3) PR tree-optimization/17806 * cfghooks.c (split_edge): Update IRREDUCIBLE_LOOP flags. * cfgloopmanip.c (loop_split_edge_with): Updating of IRREDUCIBLE_LOOP flags moved to split_edge. From-SVN: r88665 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e43edb9646b..541807b98e9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-10-07 Zdenek Dvorak + + PR tree-optimization/17806 + * cfghooks.c (split_edge): Update IRREDUCIBLE_LOOP flags. + * cfgloopmanip.c (loop_split_edge_with): Updating of IRREDUCIBLE_LOOP + flags moved to split_edge. + 2004-10-07 Eric Botcazou PR middle-end/17285 diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index e6a624c3550..948c2b4c13d 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -389,6 +389,7 @@ split_edge (edge e) gcov_type count = e->count; int freq = EDGE_FREQUENCY (e); edge f; + bool irr = (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0; if (!cfg_hooks->split_edge) internal_error ("%s does not support split_edge.", cfg_hooks->name); @@ -399,6 +400,13 @@ split_edge (edge e) EDGE_SUCC (ret, 0)->probability = REG_BR_PROB_BASE; EDGE_SUCC (ret, 0)->count = count; + if (irr) + { + ret->flags |= BB_IRREDUCIBLE_LOOP; + EDGE_PRED (ret, 0)->flags |= EDGE_IRREDUCIBLE_LOOP; + EDGE_SUCC (ret, 0)->flags |= EDGE_IRREDUCIBLE_LOOP; + } + if (dom_computed[CDI_DOMINATORS]) set_immediate_dominator (CDI_DOMINATORS, ret, EDGE_PRED (ret, 0)->src); diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index e5ec7bddaab..6d47756f588 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -1241,7 +1241,6 @@ loop_split_edge_with (edge e, rtx insns) { basic_block src, dest, new_bb; struct loop *loop_c; - edge new_e; src = e->src; dest = e->dest; @@ -1252,14 +1251,7 @@ loop_split_edge_with (edge e, rtx insns) new_bb = split_edge (e); add_bb_to_loop (new_bb, loop_c); - new_bb->flags = insns ? BB_SUPERBLOCK : 0; - - new_e = EDGE_SUCC (new_bb, 0); - if (e->flags & EDGE_IRREDUCIBLE_LOOP) - { - new_bb->flags |= BB_IRREDUCIBLE_LOOP; - new_e->flags |= EDGE_IRREDUCIBLE_LOOP; - } + new_bb->flags |= (insns ? BB_SUPERBLOCK : 0); if (insns) emit_insn_after (insns, BB_END (new_bb));