From: Trevor Saunders
gcc/ChangeLog:
2016-10-17 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 *.
---
gcc/cfgcleanup.c | 8
gcc/cfgrtl.c | 7 +++
gcc/rtl.h| 2 +-
gcc/rtlanal.c| 32
4 files changed, 24 insertions(+), 25 deletions(-)
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 1c9691d..c67b4d7 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), , )
- && 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), , )
@@ -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), , )
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 67cab71..813f7ce 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, , ))
@@ -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 7ee0b61..c84fe71 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -3038,7 +3038,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 90b55b6..4e600c0 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