Make SET_NEXT_INSN/SET_PREV_INSN require an rtx_insn
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 28 Aug 2014 18:59:13 +0000 (18:59 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Thu, 28 Aug 2014 18:59:13 +0000 (18:59 +0000)
gcc/
2014-08-28  David Malcolm  <dmalcolm@redhat.com>

* rtl.h (SET_PREV_INSN): Strengthen param from rtx to rtx_insn *.
(SET_NEXT_INSN): Likewise.
(gen_rtvec_v): Add an overload for param types (int, rtx_insn **).

* config/c6x/c6x.c (gen_one_bundle): Strengthen param "slot" from
rtx * to rtx_insn **.  Introduce a new local rtx "seq", using it
to split out the SEQUENCE from local "bundle", strengthening the
latter from rtx to rtx_insn * to hold the insn holding the SEQUENCE.
Strengthen locals "t" and "insn" from rtx to rtx_insn *.
(c6x_gen_bundles): Strengthen locals "insn", "next", "last_call"
and the type of the elements of the "slot" array from rtx to
rtx_insn *.
(reorg_split_calls): Likewise for locals "insn" and "next", and
the type of the elements of the "slot" array.

* config/frv/frv.c (frv_nops): Likewise for the elements of this
array.
(frv_function_prologue): Likewise for locals "insn", "next",
"last_call".
(frv_register_nop): Introduce a local "nop_insn" to be the
rtx_insn * containing rtx "nop".

* config/mep/mep.c (mep_make_bundle): Param "core" is sometimes
used as an insn and sometimes as a pattern, so rename it to
"core_insn_or_pat", and introduce local rtx_insn * "core_insn",
using it where dealing with the core insn.

* config/picochip/picochip.c (reorder_var_tracking_notes):
Strengthen locals "insn", "next", "last_insn", "queue",
"next_queue", "prev" from rtx to rtx_insn *.

* emit-rtl.c (gen_rtvec_v): Add overloaded implementation for when
the second param is an rtx_insn ** rather than an rtx **.
(link_insn_into_chain): Strengthen locals "seq" and "sequence"
from rtx to rtx_sequence *, and introduce local named "sequence",
using methods of rtx_sequence to clarify the code.
(remove_insn): Introduce local rtx_sequence * named "sequence" and
use its methods.
(emit_insn_after_1): Strengthen return type from rtx to rtx_insn *.
Rename param "after" to "uncast_after", reintroducing "after" as a
local rtx_insn * with a checked cast.
(emit_pattern_after_noloc): Rename param "after" to "uncast_after",
reintroducing "after" as a local rtx_insn * with a checked cast.
Strengthen local "last" from rtx to rtx_insn * and remove the
now-redundant checked casts.
(copy_delay_slot_insn): Strengthen return type and param from rtx
to rtx_insn *.

* haifa-sched.c (reemit_notes): Strengthen params "insn" and
"last" from rtx to rtx_insn *.

From-SVN: r214685

gcc/ChangeLog
gcc/config/c6x/c6x.c
gcc/config/frv/frv.c
gcc/config/mep/mep.c
gcc/config/picochip/picochip.c
gcc/emit-rtl.c
gcc/haifa-sched.c
gcc/rtl.h

index 4860446d216dfb67935f26fa2cbdb03c7f28148d..4db8b4f26ffa0b0d5fc7147f1bf67da081c2480e 100644 (file)
@@ -1,3 +1,56 @@
+2014-08-28  David Malcolm  <dmalcolm@redhat.com>
+
+       * rtl.h (SET_PREV_INSN): Strengthen param from rtx to rtx_insn *.
+       (SET_NEXT_INSN): Likewise.
+       (gen_rtvec_v): Add an overload for param types (int, rtx_insn **).
+
+       * config/c6x/c6x.c (gen_one_bundle): Strengthen param "slot" from
+       rtx * to rtx_insn **.  Introduce a new local rtx "seq", using it
+       to split out the SEQUENCE from local "bundle", strengthening the
+       latter from rtx to rtx_insn * to hold the insn holding the SEQUENCE.
+       Strengthen locals "t" and "insn" from rtx to rtx_insn *.
+       (c6x_gen_bundles): Strengthen locals "insn", "next", "last_call"
+       and the type of the elements of the "slot" array from rtx to
+       rtx_insn *.
+       (reorg_split_calls): Likewise for locals "insn" and "next", and
+       the type of the elements of the "slot" array.
+
+       * config/frv/frv.c (frv_nops): Likewise for the elements of this
+       array.
+       (frv_function_prologue): Likewise for locals "insn", "next",
+       "last_call".
+       (frv_register_nop): Introduce a local "nop_insn" to be the
+       rtx_insn * containing rtx "nop".
+
+       * config/mep/mep.c (mep_make_bundle): Param "core" is sometimes
+       used as an insn and sometimes as a pattern, so rename it to
+       "core_insn_or_pat", and introduce local rtx_insn * "core_insn",
+       using it where dealing with the core insn.
+
+       * config/picochip/picochip.c (reorder_var_tracking_notes):
+       Strengthen locals "insn", "next", "last_insn", "queue",
+       "next_queue", "prev" from rtx to rtx_insn *.
+
+       * emit-rtl.c (gen_rtvec_v): Add overloaded implementation for when
+       the second param is an rtx_insn ** rather than an rtx **.
+       (link_insn_into_chain): Strengthen locals "seq" and "sequence"
+       from rtx to rtx_sequence *, and introduce local named "sequence",
+       using methods of rtx_sequence to clarify the code.
+       (remove_insn): Introduce local rtx_sequence * named "sequence" and
+       use its methods.
+       (emit_insn_after_1): Strengthen return type from rtx to rtx_insn *.
+       Rename param "after" to "uncast_after", reintroducing "after" as a
+       local rtx_insn * with a checked cast.
+       (emit_pattern_after_noloc): Rename param "after" to "uncast_after",
+       reintroducing "after" as a local rtx_insn * with a checked cast.
+       Strengthen local "last" from rtx to rtx_insn * and remove the
+       now-redundant checked casts.
+       (copy_delay_slot_insn): Strengthen return type and param from rtx
+       to rtx_insn *.
+
+       * haifa-sched.c (reemit_notes): Strengthen params "insn" and
+       "last" from rtx to rtx_insn *.
+
 2014-08-28  David Malcolm  <dmalcolm@redhat.com>
 
        * emit-rtl.h (copy_delay_slot_insn): Strengthen return type and
index 8422756137b0c5174c9c3864c5c0f6cc962d008b..9ed41ef245dcb2be63c9d24d00003113db113068 100644 (file)
@@ -4591,23 +4591,24 @@ c6x_adjust_cost (rtx_insn *insn, rtx link, rtx_insn *dep_insn, int cost)
    first in the original stream.  */
 
 static void
-gen_one_bundle (rtx *slot, int n_filled, int real_first)
+gen_one_bundle (rtx_insn **slot, int n_filled, int real_first)
 {
-  rtx bundle;
-  rtx t;
+  rtx seq;
+  rtx_insn *bundle;
+  rtx_insn *t;
   int i;
 
-  bundle = gen_rtx_SEQUENCE (VOIDmode, gen_rtvec_v (n_filled, slot));
-  bundle = make_insn_raw (bundle);
+  seq = gen_rtx_SEQUENCE (VOIDmode, gen_rtvec_v (n_filled, slot));
+  bundle = make_insn_raw (seq);
   BLOCK_FOR_INSN (bundle) = BLOCK_FOR_INSN (slot[0]);
   INSN_LOCATION (bundle) = INSN_LOCATION (slot[0]);
   SET_PREV_INSN (bundle) = SET_PREV_INSN (slot[real_first]);
 
-  t = NULL_RTX;
+  t = NULL;
 
   for (i = 0; i < n_filled; i++)
     {
-      rtx insn = slot[i];
+      rtx_insn *insn = slot[i];
       remove_insn (insn);
       SET_PREV_INSN (insn) = t ? t : PREV_INSN (bundle);
       if (t != NULL_RTX)
@@ -4630,14 +4631,14 @@ static void
 c6x_gen_bundles (void)
 {
   basic_block bb;
-  rtx insn, next, last_call;
+  rtx_insn *insn, *next, *last_call;
 
   FOR_EACH_BB_FN (bb, cfun)
     {
-      rtx insn, next;
+      rtx_insn *insn, *next;
       /* The machine is eight insns wide.  We can have up to six shadow
         insns, plus an extra slot for merging the jump shadow.  */
-      rtx slot[15];
+      rtx_insn *slot[15];
       int n_filled = 0;
       int first_slot = 0;
 
@@ -4700,7 +4701,7 @@ c6x_gen_bundles (void)
   /* Bundling, and emitting nops, can separate
      NOTE_INSN_CALL_ARG_LOCATION from the corresponding calls.  Fix
      that up here.  */
-  last_call = NULL_RTX;
+  last_call = NULL;
   for (insn = get_insns (); insn; insn = next)
     {
       next = NEXT_INSN (insn);
@@ -4855,13 +4856,13 @@ static void
 reorg_split_calls (rtx *call_labels)
 {
   unsigned int reservation_mask = 0;
-  rtx insn = get_insns ();
+  rtx_insn *insn = get_insns ();
   gcc_assert (NOTE_P (insn));
   insn = next_real_insn (insn);
   while (insn)
     {
       int uid;
-      rtx next = next_real_insn (insn);
+      rtx_insn *next = next_real_insn (insn);
 
       if (DEBUG_INSN_P (insn))
        goto done;
@@ -4886,7 +4887,7 @@ reorg_split_calls (rtx *call_labels)
              else
                {
                  rtx t;
-                 rtx slot[4];
+                 rtx_insn *slot[4];
                  emit_label_after (label, insn);
 
                  /* Bundle the call and its delay slots into a single
index 1ed8f74c66711c5c7ba47fccd477e9db3049fe2a..ac3179455574baeffd25a77a987d430dd9bb68fc 100644 (file)
@@ -105,7 +105,7 @@ static unsigned int frv_type_to_unit[TYPE_UNKNOWN + 1];
 
 /* An array of dummy nop INSNs, one for each type of nop that the
    target supports.  */
-static GTY(()) rtx frv_nops[NUM_NOP_PATTERNS];
+static GTY(()) rtx_insn *frv_nops[NUM_NOP_PATTERNS];
 
 /* The number of nop instructions in frv_nops[].  */
 static unsigned int frv_num_nops;
@@ -1405,7 +1405,7 @@ frv_function_contains_far_jump (void)
 static void
 frv_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
 {
-  rtx insn, next, last_call;
+  rtx_insn *insn, *next, *last_call;
 
   /* If no frame was created, check whether the function uses a call
      instruction to implement a far jump.  If so, save the link in gr3 and
@@ -1415,7 +1415,7 @@ frv_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
      a stack frame.  */
   if (frv_stack_info ()->total_size == 0 && frv_function_contains_far_jump ())
     {
-      rtx insn;
+      rtx_insn *insn;
 
       /* Just to check that the above comment is true.  */
       gcc_assert (!df_regs_ever_live_p (GPR_FIRST + 3));
@@ -1450,7 +1450,7 @@ frv_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
 
   /* Locate CALL_ARG_LOCATION notes that have been misplaced
      and move them back to where they should be located.  */
-  last_call = NULL_RTX;
+  last_call = NULL;
   for (insn = get_insns (); insn; insn = next)
     {
       next = NEXT_INSN (insn);
@@ -8161,10 +8161,10 @@ frv_reorg_packet (void)
 static void
 frv_register_nop (rtx nop)
 {
-  nop = make_insn_raw (nop);
-  SET_NEXT_INSN (nop) = 0;
-  SET_PREV_INSN (nop) = 0;
-  frv_nops[frv_num_nops++] = nop;
+  rtx_insn *nop_insn = make_insn_raw (nop);
+  SET_NEXT_INSN (nop_insn) = 0;
+  SET_PREV_INSN (nop_insn) = 0;
+  frv_nops[frv_num_nops++] = nop_insn;
 }
 
 /* Implement TARGET_MACHINE_DEPENDENT_REORG.  Divide the instructions
index 3c71b9574a97f1722df4f5c61d2d883a5eecf707..745fe1f1a7f7f9178ff5c5042f2758488ba7ee1a 100644 (file)
@@ -6804,38 +6804,42 @@ mep_ipipe_ldc_p (rtx_insn *insn)
    Emit the bundle in place of COP and return it.  */
 
 static rtx_insn *
-mep_make_bundle (rtx core, rtx_insn *cop)
+mep_make_bundle (rtx core_insn_or_pat, rtx_insn *cop)
 {
   rtx seq;
+  rtx_insn *core_insn;
   rtx_insn *insn;
 
   /* If CORE is an existing instruction, remove it, otherwise put
      the new pattern in an INSN harness.  */
-  if (INSN_P (core))
-    remove_insn (core);
+  if (INSN_P (core_insn_or_pat))
+    {
+      core_insn = as_a <rtx_insn *> (core_insn_or_pat);
+      remove_insn (core_insn);
+    }
   else
-    core = make_insn_raw (core);
+    core_insn = make_insn_raw (core_insn_or_pat);
 
   /* Generate the bundle sequence and replace COP with it.  */
-  seq = gen_rtx_SEQUENCE (VOIDmode, gen_rtvec (2, core, cop));
+  seq = gen_rtx_SEQUENCE (VOIDmode, gen_rtvec (2, core_insn, cop));
   insn = emit_insn_after (seq, cop);
   remove_insn (cop);
 
   /* Set up the links of the insns inside the SEQUENCE.  */
-  SET_PREV_INSN (core) = PREV_INSN (insn);
-  SET_NEXT_INSN (core) = cop;
-  SET_PREV_INSN (cop) = core;
+  SET_PREV_INSN (core_insn) = PREV_INSN (insn);
+  SET_NEXT_INSN (core_insn) = cop;
+  SET_PREV_INSN (cop) = core_insn;
   SET_NEXT_INSN (cop) = NEXT_INSN (insn);
 
   /* Set the VLIW flag for the coprocessor instruction.  */
-  PUT_MODE (core, VOIDmode);
+  PUT_MODE (core_insn, VOIDmode);
   PUT_MODE (cop, BImode);
 
   /* Derive a location for the bundle.  Individual instructions cannot
      have their own location because there can be no assembler labels
-     between CORE and COP.  */
-  INSN_LOCATION (insn) = INSN_LOCATION (INSN_LOCATION (core) ? core : cop);
-  INSN_LOCATION (core) = 0;
+     between CORE_INSN and COP.  */
+  INSN_LOCATION (insn) = INSN_LOCATION (INSN_LOCATION (core_insn) ? core_insn : cop);
+  INSN_LOCATION (core_insn) = 0;
   INSN_LOCATION (cop) = 0;
 
   return insn;
index 7d603d022854e185f644c73eaa9eab9a30aafe9d..8adef350764d012ac67c3e40c8fcc8d7cbc4afe3 100644 (file)
@@ -3177,8 +3177,8 @@ reorder_var_tracking_notes (void)
 
   FOR_EACH_BB_FN (bb, cfun)
     {
-      rtx insn, next, last_insn = NULL_RTX;
-      rtx queue = NULL_RTX;
+      rtx_insn *insn, *next, *last_insn = NULL;
+      rtx_insn *queue = NULL;
 
       /* Iterate through the bb and find the last non-debug insn */
       for (insn = BB_HEAD (bb); insn != NEXT_INSN(BB_END (bb)); insn = NEXT_INSN(insn))
@@ -3198,7 +3198,7 @@ reorder_var_tracking_notes (void)
             {
               while (queue)
                 {
-                  rtx next_queue = PREV_INSN (queue);
+                  rtx_insn *next_queue = PREV_INSN (queue);
                   SET_PREV_INSN (NEXT_INSN(insn)) = queue;
                   SET_NEXT_INSN(queue) = NEXT_INSN(insn);
                   SET_PREV_INSN(queue) = insn;
@@ -3215,7 +3215,7 @@ reorder_var_tracking_notes (void)
                 {
                   while (queue)
                     {
-                      rtx next_queue = PREV_INSN (queue);
+                      rtx_insn *next_queue = PREV_INSN (queue);
                       SET_NEXT_INSN (PREV_INSN(insn)) = queue;
                       SET_PREV_INSN (queue) = PREV_INSN(insn);
                       SET_PREV_INSN (insn) = queue;
@@ -3226,7 +3226,7 @@ reorder_var_tracking_notes (void)
             }
           else if (NOTE_P (insn))
             {
-               rtx prev = PREV_INSN (insn);
+               rtx_insn *prev = PREV_INSN (insn);
                SET_PREV_INSN (next) = prev;
                SET_NEXT_INSN (prev) = next;
                /* Ignore call_arg notes. They are expected to be just after the
index 2365dc2df1d7df1bb3fa5319de0ef7c9d2591e29..8ec78a9f3c89f56aa8f73e5dc44bf27f68ebb101 100644 (file)
@@ -933,6 +933,25 @@ gen_rtvec_v (int n, rtx *argp)
 
   return rt_val;
 }
+
+rtvec
+gen_rtvec_v (int n, rtx_insn **argp)
+{
+  int i;
+  rtvec rt_val;
+
+  /* Don't allocate an empty rtvec...  */
+  if (n == 0)
+    return NULL_RTVEC;
+
+  rt_val = rtvec_alloc (n);
+
+  for (i = 0; i < n; i++)
+    rt_val->elem[i] = *argp++;
+
+  return rt_val;
+}
+
 \f
 /* Return the number of bytes between the start of an OUTER_MODE
    in-memory value and the start of an INNER_MODE in-memory value,
@@ -3885,22 +3904,25 @@ link_insn_into_chain (rtx_insn *insn, rtx_insn *prev, rtx_insn *next)
       SET_NEXT_INSN (prev) = insn;
       if (NONJUMP_INSN_P (prev) && GET_CODE (PATTERN (prev)) == SEQUENCE)
        {
-         rtx sequence = PATTERN (prev);
-         SET_NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
+         rtx_sequence *sequence = as_a <rtx_sequence *> (PATTERN (prev));
+         SET_NEXT_INSN (sequence->insn (sequence->len () - 1)) = insn;
        }
     }
   if (next != NULL)
     {
       SET_PREV_INSN (next) = insn;
       if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
-       SET_PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = insn;
+       {
+         rtx_sequence *sequence = as_a <rtx_sequence *> (PATTERN (next));
+         SET_PREV_INSN (sequence->insn (0)) = insn;
+       }
     }
 
   if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
     {
-      rtx sequence = PATTERN (insn);
-      SET_PREV_INSN (XVECEXP (sequence, 0, 0)) = prev;
-      SET_NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = next;
+      rtx_sequence *sequence = as_a <rtx_sequence *> (PATTERN (insn));
+      SET_PREV_INSN (sequence->insn (0)) = prev;
+      SET_NEXT_INSN (sequence->insn (sequence->len () - 1)) = next;
     }
 }
 
@@ -4079,8 +4101,8 @@ remove_insn (rtx insn)
       SET_NEXT_INSN (prev) = next;
       if (NONJUMP_INSN_P (prev) && GET_CODE (PATTERN (prev)) == SEQUENCE)
        {
-         rtx sequence = PATTERN (prev);
-         SET_NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = next;
+         rtx_sequence *sequence = as_a <rtx_sequence *> (PATTERN (prev));
+         SET_NEXT_INSN (sequence->insn (sequence->len () - 1)) = next;
        }
     }
   else if (get_insns () == insn)
@@ -4107,7 +4129,10 @@ remove_insn (rtx insn)
     {
       SET_PREV_INSN (next) = prev;
       if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
-       SET_PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = prev;
+       {
+         rtx_sequence *sequence = as_a <rtx_sequence *> (PATTERN (next));
+         SET_PREV_INSN (sequence->insn (0)) = prev;
+       }
     }
   else if (get_last_insn () == insn)
     set_last_insn (prev);
@@ -4387,9 +4412,10 @@ emit_label_before (rtx label, rtx before)
 /* Helper for emit_insn_after, handles lists of instructions
    efficiently.  */
 
-static rtx
-emit_insn_after_1 (rtx_insn *first, rtx after, basic_block bb)
+static rtx_insn *
+emit_insn_after_1 (rtx_insn *first, rtx uncast_after, basic_block bb)
 {
+  rtx_insn *after = safe_as_a <rtx_insn *> (uncast_after);
   rtx_insn *last;
   rtx_insn *after_after;
   if (!bb && !BARRIER_P (after))
@@ -4431,15 +4457,16 @@ emit_insn_after_1 (rtx_insn *first, rtx after, basic_block bb)
 }
 
 static rtx_insn *
-emit_pattern_after_noloc (rtx x, rtx after, basic_block bb,
+emit_pattern_after_noloc (rtx x, rtx uncast_after, basic_block bb,
                          rtx_insn *(*make_raw)(rtx))
 {
-  rtx last = after;
+  rtx_insn *after = safe_as_a <rtx_insn *> (uncast_after);
+  rtx_insn *last = after;
 
   gcc_assert (after);
 
   if (x == NULL_RTX)
-    return safe_as_a <rtx_insn *> (last);
+    return last;
 
   switch (GET_CODE (x))
     {
@@ -4465,7 +4492,7 @@ emit_pattern_after_noloc (rtx x, rtx after, basic_block bb,
       break;
     }
 
-  return safe_as_a <rtx_insn *> (last);
+  return last;
 }
 
 /* Make X be output after the insn AFTER and set the BB of insn.  If
index 1bb6a9d206e1ec32cf1c21d43c934537df0c2eb0..576ef564dba915ed6e554aceb2fa31ee03761bc9 100644 (file)
@@ -5243,7 +5243,7 @@ reemit_notes (rtx_insn *insn)
 
 /* Move INSN.  Reemit notes if needed.  Update CFG, if needed.  */
 static void
-move_insn (rtx_insn *insn, rtx last, rtx nt)
+move_insn (rtx_insn *insn, rtx_insn *last, rtx nt)
 {
   if (PREV_INSN (insn) != last)
     {
index 0b617a32d087b8d4a2b6260d6b344d1095c16fbb..3a02132838396e0991eada78c72f3fec801ff298 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1327,7 +1327,7 @@ inline rtx_insn *PREV_INSN (const_rtx insn)
   return safe_as_a <rtx_insn *> (prev);
 }
 
-inline rtx& SET_PREV_INSN (rtx insn)
+inline rtx& SET_PREV_INSN (rtx_insn *insn)
 {
   return XEXP (insn, 0);
 }
@@ -1338,7 +1338,7 @@ inline rtx_insn *NEXT_INSN (const_rtx insn)
   return safe_as_a <rtx_insn *> (next);
 }
 
-inline rtx& SET_NEXT_INSN (rtx insn)
+inline rtx& SET_NEXT_INSN (rtx_insn *insn)
 {
   return XEXP (insn, 1);
 }
@@ -2498,6 +2498,7 @@ extern int rtx_equal_p (const_rtx, const_rtx);
 
 /* In emit-rtl.c */
 extern rtvec gen_rtvec_v (int, rtx *);
+extern rtvec gen_rtvec_v (int, rtx_insn **);
 extern rtx gen_reg_rtx (enum machine_mode);
 extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int);
 extern rtx gen_reg_rtx_offset (rtx, enum machine_mode, int);