diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c44329da83e..b2582a7ecc3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2016-10-21 Trevor Saunders + + * cfgcleanup.c (merge_blocks_move_successor_nojumps): Adjust. + (outgoing_edges_match): Likewise. + (try_crossjump_to_edge): Likewise. + * cfgrtl.c (try_redirect_by_replacing_jump): Likewise. + (rtl_tidy_fallthru_edge): Likewise. + * rtl.h (tablejump_p): Adjust prototype. + * rtlanal.c (tablejump_p): Return the label as a rtx_insn *. + 2016-10-21 Trevor Saunders * rtl.h (label_ref_label): New function. diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 1c9691dfa12..c67b4d707f2 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -688,7 +688,7 @@ static void merge_blocks_move_successor_nojumps (basic_block a, basic_block b) { rtx_insn *barrier, *real_b_end; - rtx label; + rtx_insn *label; rtx_jump_table_data *table; /* If we are partitioning hot/cold basic blocks, we don't want to @@ -709,7 +709,7 @@ merge_blocks_move_successor_nojumps (basic_block a, basic_block b) /* If there is a jump table following block B temporarily add the jump table to block B so that it will also be moved to the correct location. */ if (tablejump_p (BB_END (b), &label, &table) - && prev_active_insn (as_a (label)) == BB_END (b)) + && prev_active_insn (label) == BB_END (b)) { BB_END (b) = table; } @@ -1697,7 +1697,7 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2) /* Check whether there are tablejumps in the end of BB1 and BB2. Return true if they are identical. */ { - rtx label1, label2; + rtx_insn *label1, *label2; rtx_jump_table_data *table1, *table2; if (tablejump_p (BB_END (bb1), &label1, &table1) @@ -1994,7 +1994,7 @@ try_crossjump_to_edge (int mode, edge e1, edge e2, they have been already compared for equivalence in outgoing_edges_match () so replace the references to TABLE1 by references to TABLE2. */ { - rtx label1, label2; + rtx_insn *label1, *label2; rtx_jump_table_data *table1, *table2; if (tablejump_p (BB_END (osrc1), &label1, &table1) diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 67cab7133ce..813f7cee092 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -1101,7 +1101,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout) { rtx_code_label *target_label = block_label (target); rtx_insn *barrier; - rtx label; + rtx_insn *label; rtx_jump_table_data *table; emit_jump_insn_after_noloc (targetm.gen_jump (target_label), insn); @@ -1773,7 +1773,7 @@ rtl_tidy_fallthru_edge (edge e) && (any_uncondjump_p (q) || single_succ_p (b))) { - rtx label; + rtx_insn *label; rtx_jump_table_data *table; if (tablejump_p (q, &label, &table)) @@ -1786,8 +1786,7 @@ rtl_tidy_fallthru_edge (edge e) PUT_CODE (label, NOTE); NOTE_KIND (label) = NOTE_INSN_DELETED_LABEL; NOTE_DELETED_LABEL_NAME (label) = name; - rtx_insn *lab = safe_as_a (label); - reorder_insns (lab, lab, PREV_INSN (q)); + reorder_insns (label, label, PREV_INSN (q)); delete_insn (table); } diff --git a/gcc/rtl.h b/gcc/rtl.h index 9b223c9dcee..d054c6c905d 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -3040,7 +3040,7 @@ extern rtx replace_rtx (rtx, rtx, rtx, bool = false); extern void replace_label (rtx *, rtx, rtx, bool); extern void replace_label_in_insn (rtx_insn *, rtx, rtx, bool); extern bool rtx_referenced_p (const_rtx, const_rtx); -extern bool tablejump_p (const rtx_insn *, rtx *, rtx_jump_table_data **); +extern bool tablejump_p (const rtx_insn *, rtx_insn **, rtx_jump_table_data **); extern int computed_jump_p (const rtx_insn *); extern bool tls_referenced_p (const_rtx); diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 90b55b6adf0..4e600c0de6d 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -3103,26 +3103,26 @@ rtx_referenced_p (const_rtx x, const_rtx body) *LABELP and the jump table to *TABLEP. LABELP and TABLEP may be NULL. */ bool -tablejump_p (const rtx_insn *insn, rtx *labelp, rtx_jump_table_data **tablep) +tablejump_p (const rtx_insn *insn, rtx_insn **labelp, + rtx_jump_table_data **tablep) { - rtx label; - rtx_insn *table; - if (!JUMP_P (insn)) return false; - label = JUMP_LABEL (insn); - if (label != NULL_RTX && !ANY_RETURN_P (label) - && (table = NEXT_INSN (as_a (label))) != NULL_RTX - && JUMP_TABLE_DATA_P (table)) - { - if (labelp) - *labelp = label; - if (tablep) - *tablep = as_a (table); - return true; - } - return false; + rtx target = JUMP_LABEL (insn); + if (target == NULL_RTX || ANY_RETURN_P (target)) + return false; + + rtx_insn *label = as_a (target); + rtx_insn *table = next_insn (label); + if (table == NULL_RTX || !JUMP_TABLE_DATA_P (table)) + return false; + + if (labelp) + *labelp = label; + if (tablep) + *tablep = as_a (table); + return true; } /* A subroutine of computed_jump_p, return 1 if X contains a REG or MEM or