On 09/14/2016 01:21 PM, tbsaunde+...@tbsaunde.org wrote:
From: Trevor Saunders <tbsaunde+...@tbsaunde.org>

gcc/ChangeLog:

2016-09-14  Trevor Saunders  <tbsaunde+...@tbsaunde.org>

        * emit-rtl.c (next_active_insn): Change argument type to
        rtx_insn *.
        (prev_active_insn): Likewise.
        (active_insn_p): Likewise.
        * rtl.h: Adjust prototypes.
        * cfgcleanup.c (merge_blocks_move_successor_nojumps): Adjust.
        * config/arc/arc.md: Likewise.
        * config/pa/pa.c (branch_to_delay_slot_p): Likewise.
        (branch_needs_nop_p): Likewise.
        (use_skip_p): Likewise.
        * config/sh/sh.c (gen_block_redirect): Likewise.
        (split_branches): Likewise.
        * reorg.c (optimize_skip): Likewise.
        (fill_simple_delay_slots): Likewise.
        (fill_slots_from_thread): Likewise.
        (relax_delay_slots): Likewise.
        * resource.c (mark_target_live_regs): Likewise.
---
 gcc/cfgcleanup.c      |  2 +-
 gcc/config/arc/arc.md | 33 +++++++++++++++++++++++----------
 gcc/config/pa/pa.c    |  6 +++---
 gcc/config/sh/sh.c    |  8 ++++----
 gcc/emit-rtl.c        | 10 +++-------
 gcc/reorg.c           | 29 +++++++++++++++++------------
 gcc/resource.c        |  2 +-
 gcc/rtl.h             |  6 +++---
 8 files changed, 55 insertions(+), 41 deletions(-)

diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 023b9d2..2e2a635 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -708,7 +708,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 (label) == BB_END (b))
+      && prev_active_insn (as_a<rtx_insn *> (label)) == BB_END (b))
Looking at tablejump_p, there seems to be a belief that JUMP_LABEL could be a RETURN (as you mentioned in a latter message). That seems like something we should tackle, but I think that can happen independently.

Presumably if we get a RETURN or SIMPLE_RETURN for LABEL the as_a will fail because it's not something that can be converted into an rtx_insn *.


 diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index b3e949e..a9b5a14 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -5503,7 +5503,8 @@ gen_block_redirect (rtx_insn *jump, int addr, int 
need_block)

   else if (optimize && need_block >= 0)
     {
-      rtx_insn *next = next_active_insn (next_active_insn (dest));
+      rtx_insn *next = next_active_insn (as_a<rtx_insn *> (dest));
It may be better to fix how we initialize "dest" to ensure it's an rtx_insn *. Essentially this:

  rtx dest = XEXP (SET_SRC (PATTERN (jump)), 0);

turns into:

  rtx temp = XEXP (SET_SRC (PATTERN (jump)), 0);
  rtx_insn *dest = as_a<rtx_insn *> (temp));

But presumably we can't do this until INSN_UID (and perhaps other stuff) is changed to accept an rtx_insn *.

So that's future work.


@@ -2575,7 +2575,8 @@ fill_slots_from_thread (rtx_jump_insn *insn, rtx 
condition,
                             to call update_block and delete_insn.  */
                          fix_reg_dead_note (prior_insn, insn);
                          update_reg_unused_notes (prior_insn, new_thread);
-                         new_thread = next_active_insn (new_thread);
+                         new_thread
+                           = next_active_insn (as_a<rtx_insn *> (new_thread));
Probably can't avoid the cast for now without other surgery. Nothing that should be terrible, but I don't think you need to pull on the that thread (pun intended) for this patch.

In fact, I'm generally OK with adding the casts in reorg.c until fairly late in this process :-)

diff --git a/gcc/resource.c b/gcc/resource.c
index ae2f5d8..1d7ce95 100644
--- a/gcc/resource.c
+++ b/gcc/resource.c
@@ -1122,7 +1122,7 @@ mark_target_live_regs (rtx_insn *insns, rtx 
target_maybe_return, struct resource
       rtx_insn *stop_insn = next_active_insn (jump_insn);

       if (!ANY_RETURN_P (jump_target))
-       jump_target = next_active_insn (jump_target);
+       jump_target = next_active_insn (as_a<rtx_insn *> (jump_target));
Right. jump_target here can only be an rtx_insn * because of controlling condition. But clearly this is something we'll want to clean up later.

I think this is fine once prereqs are approved.

jeff

Reply via email to