X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Floop-unswitch.c;h=f307dc1a2996cf109b99cd66ed4aec29a8647291;hb=54daa60094d5125e41489c6f6fe28a6ec3302473;hp=2eb3396a759b06cd0cb8e5a6829a19a317165b3f;hpb=e12d05910eaffcc746f6f3be59df3ca511179037;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/loop-unswitch.c b/gcc/loop-unswitch.c index 2eb3396a759..f307dc1a299 100644 --- a/gcc/loop-unswitch.c +++ b/gcc/loop-unswitch.c @@ -24,6 +24,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "tm.h" #include "rtl.h" #include "hard-reg-set.h" +#include "obstack.h" #include "basic-block.h" #include "cfgloop.h" #include "cfglayout.h" @@ -180,14 +181,14 @@ may_unswitch_on (basic_block bb, struct loop *loop, rtx *cinsn) enum machine_mode mode; /* BB must end in a simple conditional jump. */ - if (!bb->succ || !bb->succ->succ_next || bb->succ->succ_next->succ_next) + if (EDGE_COUNT (bb->succs) != 2) return NULL_RTX; if (!any_condjump_p (BB_END (bb))) return NULL_RTX; /* With branches inside loop. */ - if (!flow_bb_inside_loop_p (loop, bb->succ->dest) - || !flow_bb_inside_loop_p (loop, bb->succ->succ_next->dest)) + if (!flow_bb_inside_loop_p (loop, EDGE_SUCC (bb, 0)->dest) + || !flow_bb_inside_loop_p (loop, EDGE_SUCC (bb, 1)->dest)) return NULL_RTX; /* It must be executed just once each iteration (because otherwise we @@ -414,16 +415,15 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on, /* Some sanity checking. */ if (!flow_bb_inside_loop_p (loop, unswitch_on)) abort (); - if (!unswitch_on->succ || !unswitch_on->succ->succ_next || - unswitch_on->succ->succ_next->succ_next) + if (EDGE_COUNT (unswitch_on->succs) != 2) abort (); if (!just_once_each_iteration_p (loop, unswitch_on)) abort (); if (loop->inner) abort (); - if (!flow_bb_inside_loop_p (loop, unswitch_on->succ->dest)) + if (!flow_bb_inside_loop_p (loop, EDGE_SUCC (unswitch_on, 0)->dest)) abort (); - if (!flow_bb_inside_loop_p (loop, unswitch_on->succ->succ_next->dest)) + if (!flow_bb_inside_loop_p (loop, EDGE_SUCC (unswitch_on, 1)->dest)) abort (); entry = loop_preheader_edge (loop); @@ -444,7 +444,7 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on, unswitch_on_alt = unswitch_on->rbi->copy; true_edge = BRANCH_EDGE (unswitch_on_alt); false_edge = FALLTHRU_EDGE (unswitch_on); - latch_edge = loop->latch->rbi->copy->succ; + latch_edge = EDGE_SUCC (loop->latch->rbi->copy, 0); /* Create a block with the condition. */ prob = true_edge->probability; @@ -463,19 +463,20 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on, if (irred_flag) { switch_bb->flags |= BB_IRREDUCIBLE_LOOP; - switch_bb->succ->flags |= EDGE_IRREDUCIBLE_LOOP; - switch_bb->succ->succ_next->flags |= EDGE_IRREDUCIBLE_LOOP; + EDGE_SUCC (switch_bb, 0)->flags |= EDGE_IRREDUCIBLE_LOOP; + EDGE_SUCC (switch_bb, 1)->flags |= EDGE_IRREDUCIBLE_LOOP; } else { switch_bb->flags &= ~BB_IRREDUCIBLE_LOOP; - switch_bb->succ->flags &= ~EDGE_IRREDUCIBLE_LOOP; - switch_bb->succ->succ_next->flags &= ~EDGE_IRREDUCIBLE_LOOP; + EDGE_SUCC (switch_bb, 0)->flags &= ~EDGE_IRREDUCIBLE_LOOP; + EDGE_SUCC (switch_bb, 1)->flags &= ~EDGE_IRREDUCIBLE_LOOP; } /* Loopify from the copy of LOOP body, constructing the new loop. */ nloop = loopify (loops, latch_edge, - loop->header->rbi->copy->pred, switch_bb, true); + EDGE_PRED (loop->header->rbi->copy, 0), switch_bb, + BRANCH_EDGE (switch_bb), FALLTHRU_EDGE (switch_bb), true); /* Remove branches that are now unreachable in new loops. */ remove_path (loops, true_edge);