Mercurial > hg > CbC > CbC_gcc
diff gcc/bb-reorder.c @ 67:f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 22 Mar 2011 17:18:12 +0900 |
parents | b7f97abdc517 |
children | 04ced10e8804 |
line wrap: on
line diff
--- a/gcc/bb-reorder.c Tue May 25 18:58:51 2010 +0900 +++ b/gcc/bb-reorder.c Tue Mar 22 17:18:12 2011 +0900 @@ -82,9 +82,11 @@ #include "obstack.h" #include "expr.h" #include "params.h" -#include "toplev.h" +#include "diagnostic-core.h" +#include "toplev.h" /* user_defined_section_attribute */ #include "tree-pass.h" #include "df.h" +#include "bb-reorder.h" /* The number of rounds. In most cases there will only be 4 rounds, but when partitioning hot and cold basic blocks into separate sections of @@ -100,6 +102,14 @@ #endif +struct target_bb_reorder default_target_bb_reorder; +#if SWITCHABLE_TARGET +struct target_bb_reorder *this_target_bb_reorder = &default_target_bb_reorder; +#endif + +#define uncond_jump_length \ + (this_target_bb_reorder->x_uncond_jump_length) + /* Branch thresholds in thousandths (per mille) of the REG_BR_PROB_BASE. */ static int branch_threshold[N_ROUNDS] = {400, 200, 100, 0, 0}; @@ -110,9 +120,6 @@ block the edge destination is not duplicated while connecting traces. */ #define DUPLICATION_THRESHOLD 100 -/* Length of unconditional jump instruction. */ -static int uncond_jump_length; - /* Structure to hold needed information for each basic block. */ typedef struct bbro_basic_block_data_def { @@ -1292,7 +1299,9 @@ if (src && (src != ENTRY_BLOCK_PTR)) { - if (!JUMP_P (BB_END (src)) && !block_ends_with_call_p (src)) + if (!JUMP_P (BB_END (src)) + && !block_ends_with_call_p (src) + && !can_throw_internal (BB_END (src))) /* bb just falls through. */ { /* make sure there's only one successor */ @@ -1309,9 +1318,9 @@ src->il.rtl->footer = unlink_insn_chain (barrier, barrier); /* Mark edge as non-fallthru. */ crossing_edges[i]->flags &= ~EDGE_FALLTHRU; - } /* end: 'if (GET_CODE ... ' */ - } /* end: 'if (src && src->index...' */ - } /* end: 'if (dest && dest->index...' */ + } /* end: 'if (!JUMP_P ... ' */ + } /* end: 'if (src && src !=...' */ + } /* end: 'if (dest && dest !=...' */ } /* end: 'if (crossing_edges[i]...' */ } /* end for loop */ } @@ -1368,19 +1377,21 @@ fall_thru = succ2; cond_jump = succ1; } - else if (!fall_thru && succ1 && block_ends_with_call_p (cur_bb)) - { - edge e; - edge_iterator ei; + else if (succ1 + && (block_ends_with_call_p (cur_bb) + || can_throw_internal (BB_END (cur_bb)))) + { + edge e; + edge_iterator ei; - /* Find EDGE_CAN_FALLTHRU edge. */ - FOR_EACH_EDGE (e, ei, cur_bb->succs) - if (e->flags & EDGE_CAN_FALLTHRU) - { - fall_thru = e; - break; - } - } + /* Find EDGE_CAN_FALLTHRU edge. */ + FOR_EACH_EDGE (e, ei, cur_bb->succs) + if (e->flags & EDGE_CAN_FALLTHRU) + { + fall_thru = e; + break; + } + } if (fall_thru && (fall_thru->dest != EXIT_BLOCK_PTR)) {