diff options
-rw-r--r-- | gcc/bb-reorder.c | 9 | ||||
-rw-r--r-- | gcc/flow.c | 16 | ||||
-rw-r--r-- | gcc/gcse.c | 3 | ||||
-rw-r--r-- | gcc/reg-stack.c | 3 | ||||
-rw-r--r-- | gcc/rtl.h | 5 | ||||
-rw-r--r-- | gcc/ssa.c | 95 |
6 files changed, 72 insertions, 59 deletions
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c index f3b72b80695..bd23e129e25 100644 --- a/gcc/bb-reorder.c +++ b/gcc/bb-reorder.c @@ -777,8 +777,7 @@ get_next_bb_note (x) { while (x) { - if (GET_CODE (x) == NOTE - && NOTE_LINE_NUMBER (x) == NOTE_INSN_BASIC_BLOCK) + if (NOTE_INSN_BASIC_BLOCK_P (x)) return x; x = NEXT_INSN (x); } @@ -792,8 +791,7 @@ get_prev_bb_note (x) { while (x) { - if (GET_CODE (x) == NOTE - && NOTE_LINE_NUMBER (x) == NOTE_INSN_BASIC_BLOCK) + if (NOTE_INSN_BASIC_BLOCK_P (x)) return x; x = PREV_INSN (x); } @@ -1050,8 +1048,7 @@ remove_scope_notes () for (x = get_insns (); x; x = next) { next = NEXT_INSN (x); - if (GET_CODE (x) == NOTE - && NOTE_LINE_NUMBER (x) == NOTE_INSN_BASIC_BLOCK) + if (NOTE_INSN_BASIC_BLOCK_P (x)) currbb = NOTE_BASIC_BLOCK (x); if (GET_CODE (x) == NOTE diff --git a/gcc/flow.c b/gcc/flow.c index 7bebfa80340..a8f6061aedf 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -1673,8 +1673,7 @@ commit_one_edge_insertion (e) tmp = bb->head; if (GET_CODE (tmp) == CODE_LABEL) tmp = NEXT_INSN (tmp); - if (GET_CODE (tmp) == NOTE - && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_BASIC_BLOCK) + if (NOTE_INSN_BASIC_BLOCK_P (tmp)) tmp = NEXT_INSN (tmp); if (tmp == bb->head) before = tmp; @@ -2164,8 +2163,7 @@ merge_blocks_nomove (a, b) } /* Delete the basic block note. */ - if (GET_CODE (b_head) == NOTE - && NOTE_LINE_NUMBER (b_head) == NOTE_INSN_BASIC_BLOCK) + if (NOTE_INSN_BASIC_BLOCK_P (b_head)) { if (b_head == b_end) b_empty = 1; @@ -6471,9 +6469,7 @@ verify_flow_info () } x = NEXT_INSN (x); } - if (GET_CODE (x) != NOTE - || NOTE_LINE_NUMBER (x) != NOTE_INSN_BASIC_BLOCK - || NOTE_BASIC_BLOCK (x) != bb) + if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb) { error ("NOTE_INSN_BASIC_BLOCK is missing for block %d\n", bb->index); @@ -6489,8 +6485,7 @@ verify_flow_info () x = NEXT_INSN (x); while (x) { - if (GET_CODE (x) == NOTE - && NOTE_LINE_NUMBER (x) == NOTE_INSN_BASIC_BLOCK) + if (NOTE_INSN_BASIC_BLOCK_P (x)) { error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d", INSN_UID (x), bb->index); @@ -6518,8 +6513,7 @@ verify_flow_info () x = rtx_first; while (x) { - if (GET_CODE (x) == NOTE - && NOTE_LINE_NUMBER (x) == NOTE_INSN_BASIC_BLOCK) + if (NOTE_INSN_BASIC_BLOCK_P (x)) { basic_block bb = NOTE_BASIC_BLOCK (x); num_bb_notes++; diff --git a/gcc/gcse.c b/gcc/gcse.c index 2b30ee9dcb0..ad475eeaf66 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -4331,8 +4331,7 @@ insert_insn_end_bb (expr, bb, pre) the insn in the wrong basic block. In that case, put the insn after the CODE_LABEL. Also, respect NOTE_INSN_BASIC_BLOCK. */ while (GET_CODE (insn) == CODE_LABEL - || (GET_CODE (insn) == NOTE - && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK)) + || NOTE_INSN_BASIC_BLOCK_P (insn)) insn = NEXT_INSN (insn); new_insn = emit_block_insn_before (pat, insn, BASIC_BLOCK (bb)); diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 5750e754f68..8f0b50e18d9 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -978,8 +978,7 @@ emit_swap_insn (insn, regstack, reg) while (tmp != limit) { if (GET_CODE (tmp) == CODE_LABEL - || (GET_CODE (tmp) == NOTE - && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_BASIC_BLOCK) + || NOTE_INSN_BASIC_BLOCK_P (tmp) || (GET_CODE (tmp) == INSN && stack_regs_mentioned (tmp))) { diff --git a/gcc/rtl.h b/gcc/rtl.h index ccf60c02cdf..4351712c09d 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -565,6 +565,11 @@ extern const char * const reg_note_name[]; Other kinds of NOTEs are identified by negative numbers here. */ #define NOTE_LINE_NUMBER(INSN) XCINT(INSN, 4, NOTE) +/* Nonzero if INSN is a note marking the beginning of a basic block. */ +#define NOTE_INSN_BASIC_BLOCK_P(INSN) \ + (GET_CODE (INSN) == NOTE \ + && NOTE_LINE_NUMBER (INSN) == NOTE_INSN_BASIC_BLOCK) + /* Codes that appear in the NOTE_LINE_NUMBER field for kinds of notes that are not line numbers. diff --git a/gcc/ssa.c b/gcc/ssa.c index af793aba2ab..866d0c393d1 100644 --- a/gcc/ssa.c +++ b/gcc/ssa.c @@ -98,6 +98,8 @@ struct rename_context; static inline rtx * phi_alternative PARAMS ((rtx, int)); +static rtx first_insn_after_basic_block_note PARAMS ((basic_block)); + static int remove_phi_alternative PARAMS ((rtx, int)); static void simplify_to_immediate_dominators @@ -449,6 +451,28 @@ compute_iterated_dominance_frontiers (idfs, frontiers, evals, nregs) } } +/* Return the INSN immediately following the NOTE_INSN_BASIC_BLOCK + note associated with the BLOCK. */ + +static rtx +first_insn_after_basic_block_note (block) + basic_block block; +{ + rtx insn; + + /* Get the first instruction in the block. */ + insn = block->head; + + if (insn == NULL_RTX) + return NULL_RTX; + if (GET_CODE (insn) == CODE_LABEL) + insn = NEXT_INSN (insn); + if (!NOTE_INSN_BASIC_BLOCK_P (insn)) + abort (); + + return NEXT_INSN (insn); +} + /* Insert the phi nodes. */ @@ -461,6 +485,8 @@ insert_phi_node (regno, bb) int npred, i; rtvec vec; rtx phi, reg; + rtx insn; + int end_p; /* Find out how many predecessors there are. */ for (e = b->pred, npred = 0; e; e = e->pred_next) @@ -488,10 +514,11 @@ insert_phi_node (regno, bb) phi = gen_rtx_PHI (VOIDmode, vec); phi = gen_rtx_SET (VOIDmode, reg, phi); - if (GET_CODE (b->head) == CODE_LABEL) - emit_insn_after (phi, b->head); - else - b->head = emit_insn_before (phi, b->head); + insn = first_insn_after_basic_block_note (b); + end_p = PREV_INSN (insn) == b->end; + emit_insn_before (phi, insn); + if (end_p) + b->end = PREV_INSN (insn); } @@ -811,9 +838,7 @@ rename_block (bb, idom) if (e->dest == EXIT_BLOCK_PTR) continue; - insn = e->dest->head; - if (GET_CODE (insn) == CODE_LABEL) - insn = NEXT_INSN (insn); + insn = first_insn_after_basic_block_note (e->dest); while (PHI_NODE_P (insn)) { @@ -1145,9 +1170,7 @@ eliminate_phi (e, reg_partition) /* Collect an upper bound on the number of registers needing processing. */ - insn = e->dest->head; - if (GET_CODE (insn) == CODE_LABEL) - insn = next_nonnote_insn (insn); + insn = first_insn_after_basic_block_note (e->dest); n_nodes = 0; while (PHI_NODE_P (insn)) @@ -1171,9 +1194,7 @@ eliminate_phi (e, reg_partition) sbitmap_vector_zero (pred, n_nodes); sbitmap_vector_zero (succ, n_nodes); - insn = e->dest->head; - if (GET_CODE (insn) == CODE_LABEL) - insn = next_nonnote_insn (insn); + insn = first_insn_after_basic_block_note (e->dest); n_nodes = 0; for (; PHI_NODE_P (insn); insn = next_nonnote_insn (insn)) @@ -1271,11 +1292,10 @@ make_regs_equivalent_over_bad_edges (bb, reg_partition) { int changed = 0; basic_block b = BASIC_BLOCK (bb); - rtx phi = b->head; + rtx phi; /* Advance to the first phi node. */ - if (GET_CODE (phi) == CODE_LABEL) - phi = next_nonnote_insn (phi); + phi = first_insn_after_basic_block_note (b); /* Scan all the phi nodes. */ for (; @@ -1341,12 +1361,11 @@ make_equivalent_phi_alternatives_equivalent (bb, reg_partition) partition reg_partition; { int changed = 0; - rtx phi = BLOCK_HEAD (bb); basic_block b = BASIC_BLOCK (bb); + rtx phi; /* Advance to the first phi node. */ - if (GET_CODE (phi) == CODE_LABEL) - phi = next_nonnote_insn (phi); + phi = first_insn_after_basic_block_note (b); /* Scan all the phi nodes. */ for (; @@ -1889,23 +1908,27 @@ convert_from_ssa() for (bb = n_basic_blocks; --bb >= 0; ) { rtx insn = BLOCK_HEAD (bb); - int start = (GET_CODE (insn) != CODE_LABEL); - if (! start) - insn = next_nonnote_insn (insn); - while (PHI_NODE_P (insn)) + while (1) { - /* If a phi node is the last insn in the block, there must - have been nothing else. Set the block end to the block - head. */ - if (insn == BLOCK_END (bb)) - BLOCK_END (bb) = BLOCK_HEAD (bb); - insn = delete_insn (insn); - if (GET_CODE (insn) == NOTE) - insn = next_nonnote_insn (insn); + /* If this is a PHI node delete it. */ + if (PHI_NODE_P (insn)) + { + if (insn == BLOCK_END (bb)) + BLOCK_END (bb) = PREV_INSN (insn); + insn = delete_insn (insn); + } + /* Since all the phi nodes come at the beginning of the + block, if we find an ordinary insn, we can stop looking + for more phi nodes. */ + else if (INSN_P (insn)) + break; + /* If we've reached the end of the block, stop. */ + else if (insn == BLOCK_END (bb)) + break; + else + insn = NEXT_INSN (insn); } - if (start) - BLOCK_HEAD (bb) = insn; } /* Commit all the copy nodes needed to convert out of SSA form. */ @@ -1947,11 +1970,7 @@ for_each_successor_phi (bb, fn, data) continue; /* Advance to the first non-label insn of the successor block. */ - insn = successor->head; - while (insn != NULL - && (GET_CODE (insn) == CODE_LABEL - || GET_CODE (insn) == NOTE)) - insn = NEXT_INSN (insn); + insn = first_insn_after_basic_block_note (successor); if (insn == NULL) continue; |