Mercurial > hg > CbC > CbC_gcc
diff gcc/cfgloop.c @ 132:d34655255c78
update gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 10:21:07 +0900 |
parents | 84e7813d76e9 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/cfgloop.c Thu Oct 25 08:08:40 2018 +0900 +++ b/gcc/cfgloop.c Thu Oct 25 10:21:07 2018 +0900 @@ -1,5 +1,5 @@ /* Natural loop discovery code for GNU compiler. - Copyright (C) 2000-2017 Free Software Foundation, Inc. + Copyright (C) 2000-2018 Free Software Foundation, Inc. This file is part of GCC. @@ -296,13 +296,25 @@ /* Add LOOP to the loop hierarchy tree where FATHER is father of the added loop. If LOOP has some children, take care of that their - pred field will be initialized correctly. */ + pred field will be initialized correctly. If AFTER is non-null + then it's expected it's a pointer into FATHERs inner sibling + list and LOOP is added behind AFTER, otherwise it's added in front + of FATHERs siblings. */ void -flow_loop_tree_node_add (struct loop *father, struct loop *loop) +flow_loop_tree_node_add (struct loop *father, struct loop *loop, + struct loop *after) { - loop->next = father->inner; - father->inner = loop; + if (after) + { + loop->next = after->next; + after->next = loop; + } + else + { + loop->next = father->inner; + father->inner = loop; + } establish_preds (loop, father); } @@ -607,7 +619,7 @@ tcount += e->count(); } - if (!tcount.initialized_p () || tcount < HEAVY_EDGE_MIN_SAMPLES + if (!tcount.initialized_p () || !(tcount.ipa () > HEAVY_EDGE_MIN_SAMPLES) || (tcount - mcount).apply_scale (HEAVY_EDGE_RATIO, 1) > tcount) return NULL; @@ -1527,6 +1539,7 @@ /* Check irreducible loops. */ if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)) { + auto_edge_flag saved_irr_mask (cfun); /* Record old info. */ auto_sbitmap irreds (last_basic_block_for_fn (cfun)); FOR_EACH_BB_FN (bb, cfun) @@ -1538,7 +1551,7 @@ bitmap_clear_bit (irreds, bb->index); FOR_EACH_EDGE (e, ei, bb->succs) if (e->flags & EDGE_IRREDUCIBLE_LOOP) - e->flags |= EDGE_ALL_FLAGS + 1; + e->flags |= saved_irr_mask; } /* Recount it. */ @@ -1564,20 +1577,20 @@ FOR_EACH_EDGE (e, ei, bb->succs) { if ((e->flags & EDGE_IRREDUCIBLE_LOOP) - && !(e->flags & (EDGE_ALL_FLAGS + 1))) + && !(e->flags & saved_irr_mask)) { error ("edge from %d to %d should be marked irreducible", e->src->index, e->dest->index); err = 1; } else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP) - && (e->flags & (EDGE_ALL_FLAGS + 1))) + && (e->flags & saved_irr_mask)) { error ("edge from %d to %d should not be marked irreducible", e->src->index, e->dest->index); err = 1; } - e->flags &= ~(EDGE_ALL_FLAGS + 1); + e->flags &= ~saved_irr_mask; } } } @@ -1788,7 +1801,7 @@ /* Return location corresponding to the loop control condition if possible. */ -location_t +dump_user_location_t get_loop_location (struct loop *loop) { rtx_insn *insn = NULL; @@ -1807,7 +1820,7 @@ FOR_BB_INSNS_REVERSE (desc->in_edge->src, insn) { if (INSN_P (insn) && INSN_HAS_LOCATION (insn)) - return INSN_LOCATION (insn); + return insn; } } /* If loop has a single exit, then the loop control branch @@ -1817,24 +1830,24 @@ FOR_BB_INSNS_REVERSE (exit->src, insn) { if (INSN_P (insn) && INSN_HAS_LOCATION (insn)) - return INSN_LOCATION (insn); + return insn; } } /* Next check the latch, to see if it is non-empty. */ FOR_BB_INSNS_REVERSE (loop->latch, insn) { if (INSN_P (insn) && INSN_HAS_LOCATION (insn)) - return INSN_LOCATION (insn); + return insn; } /* Finally, if none of the above identifies the loop control branch, return the first location in the loop header. */ FOR_BB_INSNS (loop->header, insn) { if (INSN_P (insn) && INSN_HAS_LOCATION (insn)) - return INSN_LOCATION (insn); + return insn; } /* If all else fails, simply return the current function location. */ - return DECL_SOURCE_LOCATION (current_function_decl); + return dump_user_location_t::from_function_decl (current_function_decl); } /* Records that every statement in LOOP is executed I_BOUND times.