single_set takes an insn
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 9 Sep 2014 17:02:34 +0000 (17:02 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Tue, 9 Sep 2014 17:02:34 +0000 (17:02 +0000)
gcc/ChangeLog:
2014-09-09  David Malcolm  <dmalcolm@redhat.com>

* rtl.h (single_set_2): Strengthen first param from const_rtx to
const rtx_insn *, and move prototype to above...
(single_set): ...this.  Convert this from a macro to an inline
function, enforcing the requirement that the param is a const
rtx_insn *.
(find_args_size_adjust): Strengthen param from rtx to rtx_insn *.

* config/arm/aarch-common-protos.h (aarch_crypto_can_dual_issue):
Strengthen both params from rtx to rtx_insn *.
* config/arm/aarch-common.c (aarch_crypto_can_dual_issue):
Likewise; introduce locals "producer_set", "consumer_set", using
them in place of "producer" and "consumer" when dealing with SET
rather than insn.
* config/avr/avr.c (avr_out_plus): Add checked cast to rtx_insn *
when invoking single_set in region guarded by INSN_P.
(avr_out_bitop): Likewise.
(_reg_unused_after): Introduce local rtx_sequence * "seq" in
region guarded by GET_CODE check, using methods to strengthen
local "this_insn" from rtx to rtx_insn *, and for clarity.
* config/avr/avr.md (define_insn_and_split "xload8<mode>_A"):
Strengthen local "insn" from rtx to rtx_insn *.
(define_insn_and_split "xload<mode>_A"): Likewise.
* config/bfin/bfin.c (trapping_loads_p): Likewise for param
"insn".
(find_load): Likewise for return type.
(workaround_speculation): Likewise for both locals named
"load_insn".
* config/cris/cris.c (cris_cc0_user_requires_cmp): Likewise for
local "cc0_user".
* config/cris/cris.md (define_peephole2 ; moversideqi): Likewise
for local "prev".
* config/h8300/h8300-protos.h (notice_update_cc): Likewise for
param 2.
* config/h8300/h8300.c (notice_update_cc): Likewise.
* config/i386/i386.c (ix86_flags_dependent): Likewise for params
"insn" and "dep_insn".
(exact_store_load_dependency): Likewise for both params.
(ix86_macro_fusion_pair_p): Eliminate local named "single_set"
since this now clashes with inline function.  Instead, delay
calling single_set until the point where its needed, and then
assign the result to "compare_set" and rework the conditional that
follows.
* config/ia64/ia64.md (define_expand "tablejump"): Strengthen
local "last" from rtx to rtx_insn *.
* config/mips/mips-protos.h (mips_load_store_insns): Likewise for
second param.
(mips_store_data_bypass_p): Likewise for both params.
* config/mips/mips.c (mips_load_store_insns): Likewise for second
param.
(mips_store_data_bypass_p): Likewise for both params.
(mips_orphaned_high_part_p): Likewise for param "insn".
* config/mn10300/mn10300.c (extract_bundle): Likewise.
(mn10300_bundle_liw): Likewise for locals "r", "insn1", "insn2".
Introduce local rtx "insn2_pat".
* config/rl78/rl78.c (move_elim_pass): Likewise for locals "insn",
"ninsn".
(rl78_remove_unused_sets): Likewise for locals "insn", "ninsn".
Introduce local rtx "set", using it in place of "insn" for the
result of single_set.  This appears to fix a bug, since the call
to find_regno_note on a SET does nothing.
* config/rs6000/rs6000.c (set_to_load_agen): Strengthen both
params from rtx to rtx_insn *.
(set_to_load_agen): Likewise.
* config/s390/s390.c (s390_label_align): Likewise for local
"prev_insn".  Introduce new rtx locals "set" and "src", using
them in place of "prev_insn" for the results of single_set
and SET_SRC respectively.
(s390_swap_cmp): Strengthen local "jump" from rtx to rtx_insn *.
Introduce new rtx local "set" using in place of "jump" for the
result of single_set.  Use SET_SRC (set) rather than plain
XEXP (set, 1).
* config/sh/sh.c (noncall_uses_reg): Strengthen param 2from
rtx to rtx_insn *.
(noncall_uses_reg): Likewise.
(reg_unused_after): Introduce local rtx_sequence * "seq" in region
guarded by GET_CODE check, using its methods for clarity, and to
enable strengthening local "this_insn" from rtx to rtx_insn *.
* config/sh/sh.md (define_expand "mulhisi3"): Strengthen local
"insn" from rtx to rtx_insn *.
(define_expand "umulhisi3"): Likewise.
(define_expand "smulsi3_highpart"): Likewise.
(define_expand "umulsi3_highpart"): Likewise.
* config/sparc/sparc.c (sparc_do_work_around_errata): Likewise for
local "after".  Replace GET_CODE check with a dyn_cast,
introducing new local rtx_sequence * "seq", using insn method for
typesafety.

* dwarf2cfi.c (dwarf2out_frame_debug): Strengthen param "insn"
from rtx to rtx_insn *.  Introduce local rtx "pat", using it in
place of "insn" once we're dealing with patterns rather than the
input insn.
(scan_insn_after): Strengthen param "insn" from rtx to rtx_insn *.
(scan_trace): Likewise for local "elt", updating lookups within
sequence to use insn method rather than element method.
* expr.c (find_args_size_adjust): Strengthen param "insn" from rtx
to rtx_insn *.
* gcse.c (gcse_emit_move_after): Likewise for local "new_rtx".
* ifcvt.c (noce_try_abs): Likewise for local "insn".
* ira.c (fix_reg_equiv_init): Add checked cast to rtx_insn * when
invoking single_set.
* lra-constraints.c (insn_rhs_dead_pseudo_p): Strengthen param
"insn" from rtx to rtx_insn *.
(skip_usage_debug_insns): Likewise for return type, adding a
checked cast.
(check_secondary_memory_needed_p): Likewise for local "insn".
(inherit_reload_reg): Likewise.
* modulo-sched.c (sms_schedule): Likewise for local "count_init".
* recog.c (peep2_attempt): Likewise for local "old_insn", adding
checked casts.
(store_data_bypass_p): Likewise for both params.
(if_test_bypass_p): Likewise.
* recog.h (store_data_bypass_p): Likewise for both params.
(if_test_bypass_p): Likewise.
* reload.c (find_equiv_reg): Likewise for local "where".
* reorg.c (delete_jump): Likewise for param "insn".
* rtlanal.c (single_set_2): Strenghen param "insn" from const_rtx
to const rtx_insn *.
* store-motion.c (replace_store_insn): Likewise for param "del".
(delete_store): Strengthen local "i" from rtx to rtx_insn_list *,
and use its methods for clarity, and to strengthen local "del"
from rtx to rtx_insn *.
(build_store_vectors): Use insn method of "st" when calling
replace_store_insn for typesafety and clarity.

From-SVN: r215089

35 files changed:
gcc/ChangeLog
gcc/config/arm/aarch-common-protos.h
gcc/config/arm/aarch-common.c
gcc/config/avr/avr.c
gcc/config/avr/avr.md
gcc/config/bfin/bfin.c
gcc/config/cris/cris.c
gcc/config/cris/cris.md
gcc/config/h8300/h8300-protos.h
gcc/config/h8300/h8300.c
gcc/config/i386/i386.c
gcc/config/ia64/ia64.md
gcc/config/mips/mips-protos.h
gcc/config/mips/mips.c
gcc/config/mn10300/mn10300.c
gcc/config/rl78/rl78.c
gcc/config/rs6000/rs6000.c
gcc/config/s390/s390.c
gcc/config/sh/sh.c
gcc/config/sh/sh.md
gcc/config/sparc/sparc.c
gcc/dwarf2cfi.c
gcc/expr.c
gcc/gcse.c
gcc/ifcvt.c
gcc/ira.c
gcc/lra-constraints.c
gcc/modulo-sched.c
gcc/recog.c
gcc/recog.h
gcc/reload.c
gcc/reorg.c
gcc/rtl.h
gcc/rtlanal.c
gcc/store-motion.c

index aa75e0500f80b7e0fd564724457142cf1fa9b271..8c1b755b8aa7369780ded751587fc6aa21709df3 100644 (file)
@@ -1,3 +1,129 @@
+2014-09-09  David Malcolm  <dmalcolm@redhat.com>
+
+       * rtl.h (single_set_2): Strengthen first param from const_rtx to
+       const rtx_insn *, and move prototype to above...
+       (single_set): ...this.  Convert this from a macro to an inline
+       function, enforcing the requirement that the param is a const
+       rtx_insn *.
+       (find_args_size_adjust): Strengthen param from rtx to rtx_insn *.
+
+       * config/arm/aarch-common-protos.h (aarch_crypto_can_dual_issue):
+       Strengthen both params from rtx to rtx_insn *.
+       * config/arm/aarch-common.c (aarch_crypto_can_dual_issue):
+       Likewise; introduce locals "producer_set", "consumer_set", using
+       them in place of "producer" and "consumer" when dealing with SET
+       rather than insn.
+       * config/avr/avr.c (avr_out_plus): Add checked cast to rtx_insn *
+       when invoking single_set in region guarded by INSN_P.
+       (avr_out_bitop): Likewise.
+       (_reg_unused_after): Introduce local rtx_sequence * "seq" in
+       region guarded by GET_CODE check, using methods to strengthen
+       local "this_insn" from rtx to rtx_insn *, and for clarity.
+       * config/avr/avr.md (define_insn_and_split "xload8<mode>_A"):
+       Strengthen local "insn" from rtx to rtx_insn *.
+       (define_insn_and_split "xload<mode>_A"): Likewise.
+       * config/bfin/bfin.c (trapping_loads_p): Likewise for param
+       "insn".
+       (find_load): Likewise for return type.
+       (workaround_speculation): Likewise for both locals named
+       "load_insn".
+       * config/cris/cris.c (cris_cc0_user_requires_cmp): Likewise for
+       local "cc0_user".
+       * config/cris/cris.md (define_peephole2 ; moversideqi): Likewise
+       for local "prev".
+       * config/h8300/h8300-protos.h (notice_update_cc): Likewise for
+       param 2.
+       * config/h8300/h8300.c (notice_update_cc): Likewise.
+       * config/i386/i386.c (ix86_flags_dependent): Likewise for params
+       "insn" and "dep_insn".
+       (exact_store_load_dependency): Likewise for both params.
+       (ix86_macro_fusion_pair_p): Eliminate local named "single_set"
+       since this now clashes with inline function.  Instead, delay
+       calling single_set until the point where its needed, and then
+       assign the result to "compare_set" and rework the conditional that
+       follows.
+       * config/ia64/ia64.md (define_expand "tablejump"): Strengthen
+       local "last" from rtx to rtx_insn *.
+       * config/mips/mips-protos.h (mips_load_store_insns): Likewise for
+       second param.
+       (mips_store_data_bypass_p): Likewise for both params.
+       * config/mips/mips.c (mips_load_store_insns): Likewise for second
+       param.
+       (mips_store_data_bypass_p): Likewise for both params.
+       (mips_orphaned_high_part_p): Likewise for param "insn".
+       * config/mn10300/mn10300.c (extract_bundle): Likewise.
+       (mn10300_bundle_liw): Likewise for locals "r", "insn1", "insn2".
+       Introduce local rtx "insn2_pat".
+       * config/rl78/rl78.c (move_elim_pass): Likewise for locals "insn",
+       "ninsn".
+       (rl78_remove_unused_sets): Likewise for locals "insn", "ninsn".
+       Introduce local rtx "set", using it in place of "insn" for the
+       result of single_set.  This appears to fix a bug, since the call
+       to find_regno_note on a SET does nothing.
+       * config/rs6000/rs6000.c (set_to_load_agen): Strengthen both
+       params from rtx to rtx_insn *.
+       (set_to_load_agen): Likewise.
+       * config/s390/s390.c (s390_label_align): Likewise for local
+       "prev_insn".  Introduce new rtx locals "set" and "src", using
+       them in place of "prev_insn" for the results of single_set
+       and SET_SRC respectively.
+       (s390_swap_cmp): Strengthen local "jump" from rtx to rtx_insn *.
+       Introduce new rtx local "set" using in place of "jump" for the
+       result of single_set.  Use SET_SRC (set) rather than plain
+       XEXP (set, 1).
+       * config/sh/sh.c (noncall_uses_reg): Strengthen param 2from
+       rtx to rtx_insn *.
+       (noncall_uses_reg): Likewise.
+       (reg_unused_after): Introduce local rtx_sequence * "seq" in region
+       guarded by GET_CODE check, using its methods for clarity, and to
+       enable strengthening local "this_insn" from rtx to rtx_insn *.
+       * config/sh/sh.md (define_expand "mulhisi3"): Strengthen local
+       "insn" from rtx to rtx_insn *.
+       (define_expand "umulhisi3"): Likewise.
+       (define_expand "smulsi3_highpart"): Likewise.
+       (define_expand "umulsi3_highpart"): Likewise.
+       * config/sparc/sparc.c (sparc_do_work_around_errata): Likewise for
+       local "after".  Replace GET_CODE check with a dyn_cast,
+       introducing new local rtx_sequence * "seq", using insn method for
+       typesafety.
+
+       * dwarf2cfi.c (dwarf2out_frame_debug): Strengthen param "insn"
+       from rtx to rtx_insn *.  Introduce local rtx "pat", using it in
+       place of "insn" once we're dealing with patterns rather than the
+       input insn.
+       (scan_insn_after): Strengthen param "insn" from rtx to rtx_insn *.
+       (scan_trace): Likewise for local "elt", updating lookups within
+       sequence to use insn method rather than element method.
+       * expr.c (find_args_size_adjust): Strengthen param "insn" from rtx
+       to rtx_insn *.
+       * gcse.c (gcse_emit_move_after): Likewise for local "new_rtx".
+       * ifcvt.c (noce_try_abs): Likewise for local "insn".
+       * ira.c (fix_reg_equiv_init): Add checked cast to rtx_insn * when
+       invoking single_set.
+       * lra-constraints.c (insn_rhs_dead_pseudo_p): Strengthen param
+       "insn" from rtx to rtx_insn *.
+       (skip_usage_debug_insns): Likewise for return type, adding a
+       checked cast.
+       (check_secondary_memory_needed_p): Likewise for local "insn".
+       (inherit_reload_reg): Likewise.
+       * modulo-sched.c (sms_schedule): Likewise for local "count_init".
+       * recog.c (peep2_attempt): Likewise for local "old_insn", adding
+       checked casts.
+       (store_data_bypass_p): Likewise for both params.
+       (if_test_bypass_p): Likewise.
+       * recog.h (store_data_bypass_p): Likewise for both params.
+       (if_test_bypass_p): Likewise.
+       * reload.c (find_equiv_reg): Likewise for local "where".
+       * reorg.c (delete_jump): Likewise for param "insn".
+       * rtlanal.c (single_set_2): Strenghen param "insn" from const_rtx
+       to const rtx_insn *.
+       * store-motion.c (replace_store_insn): Likewise for param "del".
+       (delete_store): Strengthen local "i" from rtx to rtx_insn_list *,
+       and use its methods for clarity, and to strengthen local "del"
+       from rtx to rtx_insn *.
+       (build_store_vectors): Use insn method of "st" when calling
+       replace_store_insn for typesafety and clarity.
+
 2014-09-09  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * config/rs6000/rs6000.c (rtx_is_swappable_p): Add
index 1b60d78925564efa46c6bb58ed1c363b2157fbba..ba0ea9d83fdff28736f8c482a348595a796e54d3 100644 (file)
@@ -23,7 +23,7 @@
 #ifndef GCC_AARCH_COMMON_PROTOS_H
 #define GCC_AARCH_COMMON_PROTOS_H
 
-extern int aarch_crypto_can_dual_issue (rtx, rtx);
+extern int aarch_crypto_can_dual_issue (rtx_insn *, rtx_insn *);
 extern bool aarch_rev16_p (rtx);
 extern bool aarch_rev16_shleft_mask_imm_p (rtx, enum machine_mode);
 extern bool aarch_rev16_shright_mask_imm_p (rtx, enum machine_mode);
index d31191ab9e7dadd68c332c6e1aacf1e124bf7d3e..1c35264840692c89f1b5a772d0551072379aea99 100644 (file)
    implementations.  This function identifies such pairs.  */
 
 int
-aarch_crypto_can_dual_issue (rtx producer, rtx consumer)
+aarch_crypto_can_dual_issue (rtx_insn *producer_insn, rtx_insn *consumer_insn)
 {
+  rtx producer_set, consumer_set;
   rtx producer_src, consumer_src;
 
-  producer = single_set (producer);
-  consumer = single_set (consumer);
+  producer_set = single_set (producer_insn);
+  consumer_set = single_set (consumer_insn);
 
-  producer_src = producer ? SET_SRC (producer) : NULL;
-  consumer_src = consumer ? SET_SRC (consumer) : NULL;
+  producer_src = producer_set ? SET_SRC (producer_set) : NULL;
+  consumer_src = consumer_set ? SET_SRC (consumer_set) : NULL;
 
   if (producer_src && consumer_src
       && GET_CODE (producer_src) == UNSPEC && GET_CODE (consumer_src) == UNSPEC
@@ -58,9 +59,9 @@ aarch_crypto_can_dual_issue (rtx producer, rtx consumer)
           || (XINT (producer_src, 1) == UNSPEC_AESD
               && XINT (consumer_src, 1) == UNSPEC_AESIMC)))
   {
-    unsigned int regno = REGNO (SET_DEST (producer));
+    unsigned int regno = REGNO (SET_DEST (producer_set));
 
-    return REGNO (SET_DEST (consumer)) == regno
+    return REGNO (SET_DEST (consumer_set)) == regno
            && REGNO (XVECEXP (consumer_src, 0, 0)) == regno;
   }
 
index 70d5db55dab9756fe91d68ee8e0a6dd1d65dbd5a..e74979302ad011f37f03b850c230db06e64ffb17 100644 (file)
@@ -6769,7 +6769,7 @@ avr_out_plus (rtx insn, rtx *xop, int *plen, int *pcc, bool out_label)
   int cc_plus, cc_minus, cc_dummy;
   int len_plus, len_minus;
   rtx op[4];
-  rtx xpattern = INSN_P (insn) ? single_set (insn) : insn;
+  rtx xpattern = INSN_P (insn) ? single_set (as_a <rtx_insn *> (insn)) : insn;
   rtx xdest = SET_DEST (xpattern);
   enum machine_mode mode = GET_MODE (xdest);
   enum machine_mode imode = int_mode_for_mode (mode);
@@ -6864,7 +6864,7 @@ const char*
 avr_out_bitop (rtx insn, rtx *xop, int *plen)
 {
   /* CODE and MODE of the operation.  */
-  rtx xpattern = INSN_P (insn) ? single_set (insn) : insn;
+  rtx xpattern = INSN_P (insn) ? single_set (as_a <rtx_insn *> (insn)) : insn;
   enum rtx_code code = GET_CODE (SET_SRC (xpattern));
   enum machine_mode mode = GET_MODE (xop[0]);
 
@@ -7922,12 +7922,13 @@ _reg_unused_after (rtx_insn *insn, rtx reg)
         we must return 0.  */
       else if (code == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
        {
+         rtx_sequence *seq = as_a <rtx_sequence *> (PATTERN (insn));
          int i;
          int retval = 0;
 
-         for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
+         for (i = 0; i < seq->len (); i++)
            {
-             rtx this_insn = XVECEXP (PATTERN (insn), 0, i);
+             rtx_insn *this_insn = seq->insn (i);
              rtx set = single_set (this_insn);
 
              if (CALL_P (this_insn))
index 3bb2a914a339d01d9ccd3247dc2db752975c3fc0..a959b9bb7fa74ee7bb03027d4de3e4f1ca96bc21 100644 (file)
        ; in not able to allocate segment registers and reload the resulting
        ; expressions.  Notice that no address register can hold a PSImode.  */
 
-    rtx insn, addr = XEXP (operands[1], 0);
+    rtx_insn *insn;
+    rtx addr = XEXP (operands[1], 0);
     rtx hi8 = gen_reg_rtx (QImode);
     rtx reg_z = gen_rtx_REG (HImode, REG_Z);
 
     rtx reg_z = gen_rtx_REG (HImode, REG_Z);
     rtx addr_hi8 = simplify_gen_subreg (QImode, addr, PSImode, 2);
     addr_space_t as = MEM_ADDR_SPACE (operands[1]);
-    rtx insn;
+    rtx_insn *insn;
 
     /* Split the address to R21:Z */
     emit_move_insn (reg_z, simplify_gen_subreg (HImode, addr, PSImode, 0));
index e34e24a33b788c510bfe36d30ad2997cdfddc110..b8ea932a81f60eac7badce5a67a87c371fba1323 100644 (file)
@@ -4217,7 +4217,7 @@ harmless_null_pointer_p (rtx mem, int np_reg)
 /* Return nonzero if INSN contains any loads that may trap.  */
 
 static bool
-trapping_loads_p (rtx insn, int np_reg, bool after_np_branch)
+trapping_loads_p (rtx_insn *insn, int np_reg, bool after_np_branch)
 {
   rtx mem = SET_SRC (single_set (insn));
 
@@ -4229,23 +4229,23 @@ trapping_loads_p (rtx insn, int np_reg, bool after_np_branch)
 
 /* Return INSN if it is of TYPE_MCLD.  Alternatively, if INSN is the start of
    a three-insn bundle, see if one of them is a load and return that if so.
-   Return NULL_RTX if the insn does not contain loads.  */
-static rtx
+   Return NULL if the insn does not contain loads.  */
+static rtx_insn *
 find_load (rtx_insn *insn)
 {
   if (!NONDEBUG_INSN_P (insn))
-    return NULL_RTX;
+    return NULL;
   if (get_attr_type (insn) == TYPE_MCLD)
     return insn;
   if (GET_MODE (insn) != SImode)
-    return NULL_RTX;
+    return NULL;
   do {
     insn = NEXT_INSN (insn);
     if ((GET_MODE (insn) == SImode || GET_MODE (insn) == QImode)
        && get_attr_type (insn) == TYPE_MCLD)
       return insn;
   } while (GET_MODE (insn) != QImode);
-  return NULL_RTX;
+  return NULL;
 }
 
 /* Determine whether PAT is an indirect call pattern.  */
@@ -4359,7 +4359,7 @@ workaround_speculation (void)
        }
       else if (NONDEBUG_INSN_P (insn))
        {
-         rtx load_insn = find_load (insn);
+         rtx_insn *load_insn = find_load (insn);
          enum attr_type type = type_for_anomaly (insn);
 
          if (cycles_since_jump < INT_MAX)
@@ -4475,7 +4475,7 @@ workaround_speculation (void)
 
              if (NONDEBUG_INSN_P (target))
                {
-                 rtx load_insn = find_load (target);
+                 rtx_insn *load_insn = find_load (target);
                  enum attr_type type = type_for_anomaly (target);
                  int delay_needed = 0;
                  if (cycles_since_jump < INT_MAX)
index 260644d338c09985cb844d514ee837a40cc059bf..57285e5ba4bd5a3df435245d59361972ac9bbe17 100644 (file)
@@ -2410,7 +2410,7 @@ cris_side_effect_mode_ok (enum rtx_code code, rtx *ops,
 bool
 cris_cc0_user_requires_cmp (rtx insn)
 {
-  rtx cc0_user = NULL;
+  rtx_insn *cc0_user = NULL;
   rtx body;
   rtx set;
 
index 18b9787866343a702cb256a40c4c1031ce8f4be9..9a201f672d9edc1caf3172128187741afdc71c10 100644 (file)
      (set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2)))])]
   ;; Checking the previous insn is a bit too awkward for the condition.
 {
-  rtx prev = prev_nonnote_insn (curr_insn);
+  rtx_insn *prev = prev_nonnote_insn (curr_insn);
   if (prev != NULL_RTX)
     {
       rtx set = single_set (prev);
index ae14125b3a28b36e2268bc7917d93cb0fb26bc8e..e19580b7493302581694de0b23f11727db4c0804 100644 (file)
@@ -35,7 +35,7 @@ extern unsigned int compute_a_rotate_length (rtx *);
 extern const char *output_simode_bld (int, rtx[]);
 extern void final_prescan_insn (rtx_insn *, rtx *, int);
 extern int h8300_expand_movsi (rtx[]);
-extern void notice_update_cc (rtx, rtx);
+extern void notice_update_cc (rtx, rtx_insn *);
 extern const char *output_logical_op (enum machine_mode, rtx *);
 extern unsigned int compute_logical_op_length (enum machine_mode,
                                               rtx *);
index e521f3b0c6f232149969a432f3731edc9b408990..896f44873044f5e25b0b1fa6c4acbc25ecd6a144 100644 (file)
@@ -2022,7 +2022,7 @@ h8300_return_addr_rtx (int count, rtx frame)
 /* Update the condition code from the insn.  */
 
 void
-notice_update_cc (rtx body, rtx insn)
+notice_update_cc (rtx body, rtx_insn *insn)
 {
   rtx set;
 
index b2f5214209d5fb8c29a5cf374744b7543f44552f..5f796bc6baed450a17d2a07ce09b478454cdf197 100644 (file)
@@ -25396,7 +25396,7 @@ ix86_issue_rate (void)
    by DEP_INSN and nothing set by DEP_INSN.  */
 
 static bool
-ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
+ix86_flags_dependent (rtx_insn *insn, rtx_insn *dep_insn, enum attr_type insn_type)
 {
   rtx set, set2;
 
@@ -25504,7 +25504,7 @@ exact_dependency_1 (rtx addr, rtx insn)
 /* Return true if there exists exact dependency for store & load, i.e.
    the same memory address is used in them.  */
 static bool
-exact_store_load_dependency (rtx store, rtx load)
+exact_store_load_dependency (rtx_insn *store, rtx_insn *load)
 {
   rtx set1, set2;
 
@@ -25803,7 +25803,6 @@ static bool
 ix86_macro_fusion_pair_p (rtx_insn *condgen, rtx_insn *condjmp)
 {
   rtx src, dest;
-  rtx single_set = single_set (condgen);
   enum rtx_code ccode;
   rtx compare_set = NULL_RTX, test_if, cond;
   rtx alu_set = NULL_RTX, addr = NULL_RTX;
@@ -25817,13 +25816,12 @@ ix86_macro_fusion_pair_p (rtx_insn *condgen, rtx_insn *condjmp)
       && get_attr_type (condgen) != TYPE_ALU)
     return false;
 
-  if (single_set == NULL_RTX
+  compare_set = single_set (condgen);
+  if (compare_set == NULL_RTX
       && !TARGET_FUSE_ALU_AND_BRANCH)
     return false;
 
-  if (single_set != NULL_RTX)
-    compare_set = single_set;
-  else
+  if (compare_set == NULL_RTX)
     {
       int i;
       rtx pat = PATTERN (condgen);
index 5fedc921407668aa8167626767cfd5717119fa3e..986ef024968141f5ec7fa89fab2df6ed46ed721e 100644 (file)
         stream was the memory load.  Grab the address from that.
         Note we have to momentarily pop out of the sequence started
         by the insn-emit wrapper in order to grab the last insn.  */
-      rtx last, set;
+      rtx_insn *last;
+      rtx set;
 
       end_sequence ();
       last = get_last_insn ();
index e2801eb360d3416cf15418eebf311a4eaf02c86d..01e53a9824ebcc7666701476e5e5e728d7c68303 100644 (file)
@@ -197,7 +197,7 @@ extern bool mips_stack_address_p (rtx, enum machine_mode);
 extern int mips_address_insns (rtx, enum machine_mode, bool);
 extern int mips_const_insns (rtx);
 extern int mips_split_const_insns (rtx);
-extern int mips_load_store_insns (rtx, rtx);
+extern int mips_load_store_insns (rtx, rtx_insn *);
 extern int mips_idiv_insns (void);
 extern rtx_insn *mips_emit_move (rtx, rtx);
 #ifdef RTX_CODE
@@ -300,7 +300,7 @@ extern const char *mips_output_division (const char *, rtx *);
 extern const char *mips_output_probe_stack_range (rtx, rtx);
 extern unsigned int mips_hard_regno_nregs (int, enum machine_mode);
 extern bool mips_linked_madd_p (rtx_insn *, rtx_insn *);
-extern bool mips_store_data_bypass_p (rtx, rtx);
+extern bool mips_store_data_bypass_p (rtx_insn *, rtx_insn *);
 extern int mips_dspalu_bypass_p (rtx, rtx);
 extern rtx mips_prefetch_cookie (rtx, rtx);
 
index 33f868e8c590179e72da76c0f51df6063f299022..646bb4dc7ebd30f51c87148a14c0f284ba4e9b0f 100644 (file)
@@ -2678,7 +2678,7 @@ mips_split_const_insns (rtx x)
    BASE_INSN_LENGTH is the length of one instruction.  */
 
 int
-mips_load_store_insns (rtx mem, rtx insn)
+mips_load_store_insns (rtx mem, rtx_insn *insn)
 {
   enum machine_mode mode;
   bool might_split_p;
@@ -13084,7 +13084,7 @@ mips_linked_madd_p (rtx_insn *out_insn, rtx_insn *in_insn)
    for that case.  */
 
 bool
-mips_store_data_bypass_p (rtx out_insn, rtx in_insn)
+mips_store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
 {
   if (GET_CODE (PATTERN (in_insn)) == UNSPEC_VOLATILE)
     return false;
@@ -16083,7 +16083,7 @@ mips_record_lo_sum (rtx *loc, void *data)
    LO_SUMs in the current function.  */
 
 static bool
-mips_orphaned_high_part_p (mips_offset_table *htab, rtx insn)
+mips_orphaned_high_part_p (mips_offset_table *htab, rtx_insn *insn)
 {
   enum mips_symbol_type type;
   rtx x, set;
index 07cae5cb3832f337a6a978a54413be77b417479e..0fa7931b1d96729388dab17663f3c0d755b33f5c 100644 (file)
@@ -2974,14 +2974,14 @@ struct liw_data
    cannot be bundled.  */
 
 static bool
-extract_bundle (rtx insn, struct liw_data * pdata)
+extract_bundle (rtx_insn *insn, struct liw_data * pdata)
 {
   bool allow_consts = true;
   rtx p;
 
   gcc_assert (pdata != NULL);
 
-  if (insn == NULL_RTX)
+  if (insn == NULL)
     return false;
   /* Make sure that we are dealing with a simple SET insn.  */
   p = single_set (insn);
@@ -3100,11 +3100,11 @@ check_liw_constraints (struct liw_data * pliw1, struct liw_data * pliw2)
 static void
 mn10300_bundle_liw (void)
 {
-  rtx r;
+  rtx_insn *r;
 
-  for (r = get_insns (); r != NULL_RTX; r = next_nonnote_nondebug_insn (r))
+  for (r = get_insns (); r != NULL; r = next_nonnote_nondebug_insn (r))
     {
-      rtx insn1, insn2;
+      rtx_insn *insn1, *insn2;
       struct liw_data liw1, liw2;
 
       insn1 = r;
@@ -3130,17 +3130,18 @@ mn10300_bundle_liw (void)
 
       delete_insn (insn2);
 
+      rtx insn2_pat;
       if (liw1.op == LIW_OP_CMP)
-       insn2 = gen_cmp_liw (liw2.dest, liw2.src, liw1.dest, liw1.src,
-                            GEN_INT (liw2.op));
+       insn2_pat = gen_cmp_liw (liw2.dest, liw2.src, liw1.dest, liw1.src,
+                                GEN_INT (liw2.op));
       else if (liw2.op == LIW_OP_CMP)
-       insn2 = gen_liw_cmp (liw1.dest, liw1.src, liw2.dest, liw2.src,
-                            GEN_INT (liw1.op));
+       insn2_pat = gen_liw_cmp (liw1.dest, liw1.src, liw2.dest, liw2.src,
+                                GEN_INT (liw1.op));
       else
-       insn2 = gen_liw (liw1.dest, liw2.dest, liw1.src, liw2.src,
-                        GEN_INT (liw1.op), GEN_INT (liw2.op));
+       insn2_pat = gen_liw (liw1.dest, liw2.dest, liw1.src, liw2.src,
+                            GEN_INT (liw1.op), GEN_INT (liw2.op));
 
-      insn2 = emit_insn_after (insn2, insn1);
+      insn2 = emit_insn_after (insn2_pat, insn1);
       delete_insn (insn1);
       r = insn2;
     }
index 4234d665f109fb82859a3733e3f0966b62c5c0c7..6b2ddd53cd92aa0a25ccd9ded186566eea17c570 100644 (file)
@@ -167,7 +167,8 @@ make_pass_rl78_devirt (gcc::context *ctxt)
 static unsigned int
 move_elim_pass (void)
 {
-  rtx insn, ninsn, prev = NULL_RTX;
+  rtx_insn *insn, *ninsn;
+  rtx prev = NULL_RTX;
 
   for (insn = get_insns (); insn; insn = ninsn)
     {
@@ -3586,17 +3587,18 @@ rl78_propogate_register_origins (void)
 static void
 rl78_remove_unused_sets (void)
 {
-  rtx insn, ninsn = NULL_RTX;
+  rtx_insn *insn, *ninsn = NULL;
   rtx dest;
 
   for (insn = get_insns (); insn; insn = ninsn)
     {
       ninsn = next_nonnote_nondebug_insn (insn);
 
-      if ((insn = single_set (insn)) == NULL_RTX)
+      rtx set = single_set (insn);
+      if (set == NULL)
        continue;
 
-      dest = SET_DEST (insn);
+      dest = SET_DEST (set);
 
       if (GET_CODE (dest) != REG || REGNO (dest) > 23)
        continue;
index dcd8c7255b8cec9494de92aee1372b96e8c59584..2141bc04503808cd61030f0cd8dada71c04a2291 100644 (file)
@@ -1081,7 +1081,7 @@ static bool is_nonpipeline_insn (rtx);
 static bool is_cracked_insn (rtx);
 static bool is_load_insn (rtx, rtx *);
 static bool is_store_insn (rtx, rtx *);
-static bool set_to_load_agen (rtx,rtx);
+static bool set_to_load_agen (rtx_insn *,rtx_insn *);
 static bool insn_terminates_group_p (rtx , enum group_termination);
 static bool insn_must_be_first_in_group (rtx);
 static bool insn_must_be_last_in_group (rtx);
@@ -26740,7 +26740,7 @@ is_branch_slot_insn (rtx insn)
 /* The function returns true if out_inst sets a value that is
    used in the address generation computation of in_insn */
 static bool
-set_to_load_agen (rtx out_insn, rtx in_insn)
+set_to_load_agen (rtx_insn *out_insn, rtx_insn *in_insn)
 {
   rtx out_set, in_set;
 
index b8beee2fe111fb66a3237c4a523829a6fcc315d6..46fa02be8543b8e21966e5670fa3758521578139 100644 (file)
@@ -495,21 +495,22 @@ static const struct attribute_spec s390_attribute_table[] = {
 int
 s390_label_align (rtx label)
 {
-  rtx prev_insn = prev_active_insn (label);
+  rtx_insn *prev_insn = prev_active_insn (label);
+  rtx set, src;
 
   if (prev_insn == NULL_RTX)
     goto old;
 
-  prev_insn = single_set (prev_insn);
+  set = single_set (prev_insn);
 
-  if (prev_insn == NULL_RTX)
+  if (set == NULL_RTX)
     goto old;
 
-  prev_insn = SET_SRC (prev_insn);
+  src = SET_SRC (set);
 
   /* Don't align literal pool base labels.  */
-  if (GET_CODE (prev_insn) == UNSPEC
-      && XINT (prev_insn, 1) == UNSPEC_MAIN_BASE)
+  if (GET_CODE (src) == UNSPEC
+      && XINT (src, 1) == UNSPEC_MAIN_BASE)
     return 0;
 
  old:
@@ -11155,13 +11156,13 @@ s390_swap_cmp (rtx cond, rtx *op0, rtx *op1, rtx_insn *insn)
 
   if (cond == NULL_RTX)
     {
-      rtx jump = find_cond_jump (NEXT_INSN (insn));
-      jump = jump ? single_set (jump) : NULL_RTX;
+      rtx_insn *jump = find_cond_jump (NEXT_INSN (insn));
+      rtx set = jump ? single_set (jump) : NULL_RTX;
 
-      if (jump == NULL_RTX)
+      if (set == NULL_RTX)
        return;
 
-      cond = XEXP (XEXP (jump, 1), 0);
+      cond = XEXP (SET_SRC (set), 0);
     }
 
   *op0 = *op1;
index dba107ecf351f53af3fbc2438cb77a8b07267156..8c1da68ae6895d0b2488c5916feeb1562d7734a9 100644 (file)
@@ -190,7 +190,7 @@ static void dump_table (rtx_insn *, rtx_insn *);
 static bool broken_move (rtx_insn *);
 static bool mova_p (rtx_insn *);
 static rtx_insn *find_barrier (int, rtx_insn *, rtx_insn *);
-static bool noncall_uses_reg (rtx, rtx, rtx *);
+static bool noncall_uses_reg (rtx, rtx_insn *, rtx *);
 static rtx_insn *gen_block_redirect (rtx_insn *, int, int);
 static void sh_reorg (void);
 static void sh_option_override (void);
@@ -5405,7 +5405,7 @@ sfunc_uses_reg (rtx insn)
    setting it while calling it.  Set *SET to a SET rtx if the register
    is set by INSN.  */
 static bool
-noncall_uses_reg (rtx reg, rtx insn, rtx *set)
+noncall_uses_reg (rtx reg, rtx_insn *insn, rtx *set)
 {
   rtx pattern, reg2;
 
@@ -9953,12 +9953,13 @@ reg_unused_after (rtx reg, rtx_insn *insn)
         we must return 0.  */
       else if (code == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
        {
+         rtx_sequence *seq = as_a <rtx_sequence *> (PATTERN (insn));
          int i;
          int retval = 0;
 
-         for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
+         for (i = 0; i < seq->len (); i++)
            {
-             rtx this_insn = XVECEXP (PATTERN (insn), 0, i);
+             rtx_insn *this_insn = seq->insn (i);
              rtx set = single_set (this_insn);
 
              if (CALL_P (this_insn))
index 265592623bad6d6089e2df42a7c6fdffab15d17a..56dee824f1c0674d51224a3e3b9be20bec7920cc 100644 (file)
@@ -3336,7 +3336,8 @@ label:
        (reg:SI MACL_REG))]
   "TARGET_SH1"
 {
-  rtx insn, macl;
+  rtx_insn *insn;
+  rtx macl;
 
   macl = gen_rtx_REG (SImode, MACL_REG);
   start_sequence ();
@@ -3365,7 +3366,8 @@ label:
        (reg:SI MACL_REG))]
   "TARGET_SH1"
 {
-  rtx insn, macl;
+  rtx_insn *insn;
+  rtx macl;
 
   macl = gen_rtx_REG (SImode, MACL_REG);
   start_sequence ();
@@ -3613,7 +3615,8 @@ label:
        (reg:SI MACH_REG))]
   "TARGET_SH2"
 {
-  rtx insn, mach;
+  rtx_insn *insn;
+  rtx mach;
 
   mach = gen_rtx_REG (SImode, MACH_REG);
   start_sequence ();
@@ -3659,7 +3662,8 @@ label:
        (reg:SI MACH_REG))]
   "TARGET_SH2"
 {
-  rtx insn, mach;
+  rtx_insn *insn;
+  rtx mach;
 
   mach = gen_rtx_REG (SImode, MACH_REG);
   start_sequence ();
index 866afb1e59bbcc10b424366d99f67053c7e34edb..dca08af1f27d10515b12ac9fa6ab94878301fcae 100644 (file)
@@ -1016,7 +1016,7 @@ sparc_do_work_around_errata (void)
          /* The problematic combination is with the sibling FP register.  */
          const unsigned int x = REGNO (SET_DEST (set));
          const unsigned int y = x ^ 1;
-         rtx after;
+         rtx_insn *after;
          int i;
 
          next = next_active_insn (insn);
@@ -1050,15 +1050,16 @@ sparc_do_work_around_errata (void)
                  if (++i == n_insns)
                    break;
                  branch_p = true;
-                 after = NULL_RTX;
+                 after = NULL;
                }
              /* This is a branch with a filled delay slot.  */
-             else if (GET_CODE (PATTERN (after)) == SEQUENCE)
+             else if (rtx_sequence *seq =
+                        dyn_cast <rtx_sequence *> (PATTERN (after)))
                {
                  if (++i == n_insns)
                    break;
                  branch_p = true;
-                 after = XVECEXP (PATTERN (after), 0, 1);
+                 after = seq->insn (1);
                }
              /* This is a regular instruction.  */
              else
index b1659dd2777003f8420ead87e0de8b1e1cae18bd..c8c8a4257964e9dc23b9dc232da760a555118440 100644 (file)
@@ -1935,16 +1935,16 @@ dwarf2out_frame_debug_expr (rtx expr)
    register to the stack.  */
 
 static void
-dwarf2out_frame_debug (rtx insn)
+dwarf2out_frame_debug (rtx_insn *insn)
 {
-  rtx note, n;
+  rtx note, n, pat;
   bool handled_one = false;
 
   for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
     switch (REG_NOTE_KIND (note))
       {
       case REG_FRAME_RELATED_EXPR:
-       insn = XEXP (note, 0);
+       pat = XEXP (note, 0);
        goto do_frame_expr;
 
       case REG_CFA_DEF_CFA:
@@ -2036,14 +2036,14 @@ dwarf2out_frame_debug (rtx insn)
 
   if (!handled_one)
     {
-      insn = PATTERN (insn);
+      pat = PATTERN (insn);
     do_frame_expr:
-      dwarf2out_frame_debug_expr (insn);
+      dwarf2out_frame_debug_expr (pat);
 
       /* Check again.  A parallel can save and update the same register.
          We could probably check just once, here, but this is safer than
          removing the check at the start of the function.  */
-      if (clobbers_queued_reg_save (insn))
+      if (clobbers_queued_reg_save (pat))
        dwarf2out_flush_queued_reg_saves ();
     }
 }
@@ -2362,7 +2362,7 @@ create_trace_edges (rtx_insn *insn)
 /* A subroutine of scan_trace.  Do what needs to be done "after" INSN.  */
 
 static void
-scan_insn_after (rtx insn)
+scan_insn_after (rtx_insn *insn)
 {
   if (RTX_FRAME_RELATED_P (insn))
     dwarf2out_frame_debug (insn);
@@ -2423,7 +2423,7 @@ scan_trace (dw_trace_info *trace)
         handling for the positioning of the notes.  */
       if (rtx_sequence *pat = dyn_cast <rtx_sequence *> (PATTERN (insn)))
        {
-         rtx elt;
+         rtx_insn *elt;
          int i, n = pat->len ();
 
          control = pat->insn (0);
@@ -2438,7 +2438,7 @@ scan_trace (dw_trace_info *trace)
              gcc_assert (!RTX_FRAME_RELATED_P (control));
              gcc_assert (!find_reg_note (control, REG_ARGS_SIZE, NULL));
 
-             elt = pat->element (1);
+             elt = pat->insn (1);
 
              if (INSN_FROM_TARGET_P (elt))
                {
@@ -2493,7 +2493,7 @@ scan_trace (dw_trace_info *trace)
 
          for (i = 1; i < n; ++i)
            {
-             elt = pat->element (i);
+             elt = pat->insn (i);
              scan_insn_after (elt);
            }
 
index 7e69955afbbc8acd10244b9a111121bbff960a7c..0a0ac80bb6cce26fd70b11ccc3841da10660fb38 100644 (file)
@@ -3830,7 +3830,7 @@ mem_autoinc_base (rtx mem)
    cannot be trivially extracted, the return value is INT_MIN.  */
 
 HOST_WIDE_INT
-find_args_size_adjust (rtx insn)
+find_args_size_adjust (rtx_insn *insn)
 {
   rtx dest, set, pat;
   int i;
index 17fc053a3a5f166dd3ea43e795dee093b0ceb8e3..b7c4788a4f7d6eed1ceb1762a67b1b4ad5dc99b5 100644 (file)
@@ -2573,7 +2573,7 @@ single_set_gcse (rtx_insn *insn)
 static rtx
 gcse_emit_move_after (rtx dest, rtx src, rtx_insn *insn)
 {
-  rtx new_rtx;
+  rtx_insn *new_rtx;
   const_rtx set = single_set_gcse (insn);
   rtx set2;
   rtx note;
index 18e8df61a7d4edf75775b23ed2b0b051b23d26c1..6c801d3b3b7ec68c2600b2bbda09d0081cd403ec 100644 (file)
@@ -2063,7 +2063,8 @@ noce_try_abs (struct noce_if_info *if_info)
      REG_EQUAL note or a simple source if necessary.  */
   if (REG_P (c))
     {
-      rtx set, insn = prev_nonnote_insn (earliest);
+      rtx set;
+      rtx_insn *insn = prev_nonnote_insn (earliest);
       if (insn
          && BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (earliest)
          && (set = single_set (insn))
index d83ff8dafc4cbfc6a6c040f0413fd5803452fa48..09b1f88b280698edc0fc802f0c7276c935866a29 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -2689,7 +2689,7 @@ fix_reg_equiv_init (void)
          {
            next = XEXP (x, 1);
            insn = XEXP (x, 0);
-           set = single_set (insn);
+           set = single_set (as_a <rtx_insn *> (insn));
            ira_assert (set != NULL_RTX
                        && (REG_P (SET_DEST (set)) || REG_P (SET_SRC (set))));
            if (REG_P (SET_DEST (set))
index 25354d771261014265cb0b168dd41c08f1670702..d8489541fa61f3c77bc74bf6027ef25fcc1332b5 100644 (file)
@@ -3939,7 +3939,7 @@ dead_pseudo_p (rtx x, rtx insn)
 /* Return true if INSN contains a dying pseudo in INSN right hand
    side.  */
 static bool
-insn_rhs_dead_pseudo_p (rtx insn)
+insn_rhs_dead_pseudo_p (rtx_insn *insn)
 {
   rtx set = single_set (insn);
 
@@ -4390,7 +4390,7 @@ substitute_pseudo_within_insn (rtx_insn *insn, int old_regno, rtx new_reg)
 }
 
 /* Return first non-debug insn in list USAGE_INSNS.  */
-static rtx
+static rtx_insn *
 skip_usage_debug_insns (rtx usage_insns)
 {
   rtx insn;
@@ -4400,7 +4400,7 @@ skip_usage_debug_insns (rtx usage_insns)
        insn != NULL_RTX && GET_CODE (insn) == INSN_LIST;
        insn = XEXP (insn, 1))
     ;
-  return insn;
+  return safe_as_a <rtx_insn *> (insn);
 }
 
 /* Return true if we need secondary memory moves for insn in
@@ -4413,7 +4413,8 @@ check_secondary_memory_needed_p (enum reg_class inher_cl ATTRIBUTE_UNUSED,
 #ifndef SECONDARY_MEMORY_NEEDED
   return false;
 #else
-  rtx insn, set, dest;
+  rtx_insn *insn;
+  rtx set, dest;
   enum reg_class cl;
 
   if (inher_cl == ALL_REGS
@@ -4508,7 +4509,7 @@ inherit_reload_reg (bool def_p, int original_regno,
         transformation will be unprofitable.  */
       if (lra_dump_file != NULL)
        {
-         rtx insn = skip_usage_debug_insns (next_usage_insns);
+         rtx_insn *insn = skip_usage_debug_insns (next_usage_insns);
          rtx set = single_set (insn);
 
          lra_assert (set != NULL_RTX);
index 5ad484dfe6c69cbc7de1e8712f3f2629e390803e..c59c16b0badde79d6dadd49b133f10abb0165988 100644 (file)
@@ -1539,7 +1539,8 @@ sms_schedule (void)
   FOR_EACH_LOOP (loop, 0)
     {
       rtx_insn *head, *tail;
-      rtx count_reg, count_init;
+      rtx count_reg;
+      rtx_insn *count_init;
       int mii, rec_mii, stage_count, min_cycle;
       int64_t loop_count = 0;
       bool opt_sc_p;
@@ -1589,7 +1590,7 @@ sms_schedule (void)
 
       /* In case of th loop have doloop register it gets special
         handling.  */
-      count_init = NULL_RTX;
+      count_init = NULL;
       if ((count_reg = doloop_register_get (head, tail)))
        {
          basic_block pre_header;
index c760c4085cc719846cb3ffaec69e3ce4f1081e35..2150b7a88a308e0459e8a91b2b9408d080f45fbf 100644 (file)
@@ -3167,13 +3167,13 @@ peep2_attempt (basic_block bb, rtx uncast_insn, int match_len, rtx_insn *attempt
   int i;
   rtx_insn *last, *before_try, *x;
   rtx eh_note, as_note;
-  rtx old_insn;
+  rtx_insn *old_insn;
   rtx_insn *new_insn;
   bool was_call = false;
 
   /* If we are splitting an RTX_FRAME_RELATED_P insn, do not allow it to
      match more than one insn, or to be split into more than one insn.  */
-  old_insn = peep2_insn_data[peep2_current].insn;
+  old_insn = as_a <rtx_insn *> (peep2_insn_data[peep2_current].insn);
   if (RTX_FRAME_RELATED_P (old_insn))
     {
       bool any_note = false;
@@ -3261,7 +3261,7 @@ peep2_attempt (basic_block bb, rtx uncast_insn, int match_len, rtx_insn *attempt
       rtx note;
 
       j = peep2_buf_position (peep2_current + i);
-      old_insn = peep2_insn_data[j].insn;
+      old_insn = as_a <rtx_insn *> (peep2_insn_data[j].insn);
       if (!CALL_P (old_insn))
        continue;
       was_call = true;
@@ -3300,7 +3300,7 @@ peep2_attempt (basic_block bb, rtx uncast_insn, int match_len, rtx_insn *attempt
       while (++i <= match_len)
        {
          j = peep2_buf_position (peep2_current + i);
-         old_insn = peep2_insn_data[j].insn;
+         old_insn = as_a <rtx_insn *> (peep2_insn_data[j].insn);
          gcc_assert (!CALL_P (old_insn));
        }
       break;
@@ -3312,7 +3312,7 @@ peep2_attempt (basic_block bb, rtx uncast_insn, int match_len, rtx_insn *attempt
   for (i = match_len; i >= 0; --i)
     {
       int j = peep2_buf_position (peep2_current + i);
-      old_insn = peep2_insn_data[j].insn;
+      old_insn = as_a <rtx_insn *> (peep2_insn_data[j].insn);
 
       as_note = find_reg_note (old_insn, REG_ARGS_SIZE, NULL);
       if (as_note)
@@ -3572,7 +3572,7 @@ peephole2_optimize (void)
    must be either a single_set or a PARALLEL with SETs inside.  */
 
 int
-store_data_bypass_p (rtx out_insn, rtx in_insn)
+store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
 {
   rtx out_set, in_set;
   rtx out_pat, in_pat;
@@ -3665,7 +3665,7 @@ store_data_bypass_p (rtx out_insn, rtx in_insn)
    of insn categorization may be any JUMP or CALL insn.  */
 
 int
-if_test_bypass_p (rtx out_insn, rtx in_insn)
+if_test_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
 {
   rtx out_set, in_set;
 
index 1cb98903e6cc49a0b28b273bf0306443b2801f13..3f94a166c737a3950abb94f168970dbb323e2e57 100644 (file)
@@ -149,8 +149,8 @@ extern rtx peep2_find_free_register (int, int, const char *,
 #endif
 extern rtx peephole2_insns (rtx, rtx, int *);
 
-extern int store_data_bypass_p (rtx, rtx);
-extern int if_test_bypass_p (rtx, rtx);
+extern int store_data_bypass_p (rtx_insn *, rtx_insn *);
+extern int if_test_bypass_p (rtx_insn *, rtx_insn *);
 
 #ifndef GENERATOR_FILE
 /* Try recognizing the instruction INSN,
index a9048ce97286b911038d502172faf7d49379a60b..529cd1401b90db3d1abf6a91b0a81d0e6e56a58d 100644 (file)
@@ -6677,7 +6677,8 @@ find_equiv_reg (rtx goal, rtx_insn *insn, enum reg_class rclass, int other,
                short *reload_reg_p, int goalreg, enum machine_mode mode)
 {
   rtx_insn *p = insn;
-  rtx goaltry, valtry, value, where;
+  rtx goaltry, valtry, value;
+  rtx_insn *where;
   rtx pat;
   int regno = -1;
   int valueno;
index 18820f01ba71f2c43d18929893616362787992ac..c37ae1e96ca39afd83c1ec0ffd6f0ae21b8cabc9 100644 (file)
@@ -3135,7 +3135,7 @@ delete_computation (rtx insn)
    if that's what the previous thing was.  */
 
 static void
-delete_jump (rtx insn)
+delete_jump (rtx_insn *insn)
 {
   rtx set = single_set (insn);
 
index 0f36c48bc15d7e7c18b1a612a5628ea03194087f..56a06e1ade046ee7c0df9154122ca07fbea0d035 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2723,12 +2723,21 @@ extern void set_insn_deleted (rtx);
 
 /* Functions in rtlanal.c */
 
-/* Single set is implemented as macro for performance reasons.  */
-#define single_set(I) (INSN_P (I) \
-                      ? (GET_CODE (PATTERN (I)) == SET \
-                         ? PATTERN (I) : single_set_1 (I)) \
-                      : NULL_RTX)
-#define single_set_1(I) single_set_2 (I, PATTERN (I))
+extern rtx single_set_2 (const rtx_insn *, const_rtx);
+
+/* Handle the cheap and common cases inline for performance.  */
+
+inline rtx single_set (const rtx_insn *insn)
+{
+  if (!INSN_P (insn))
+    return NULL_RTX;
+
+  if (GET_CODE (PATTERN (insn)) == SET)
+    return PATTERN (insn);
+
+  /* Defer to the more expensive case.  */
+  return single_set_2 (insn, PATTERN (insn));
+}
 
 extern enum machine_mode get_address_mode (rtx mem);
 extern int rtx_addr_can_trap_p (const_rtx);
@@ -2753,7 +2762,6 @@ extern int modified_between_p (const_rtx, const rtx_insn *, const rtx_insn *);
 extern int no_labels_between_p (const rtx_insn *, const rtx_insn *);
 extern int modified_in_p (const_rtx, const_rtx);
 extern int reg_set_p (const_rtx, const_rtx);
-extern rtx single_set_2 (const_rtx, const_rtx);
 extern int multiple_sets (const_rtx);
 extern int set_noop_p (const_rtx);
 extern int noop_move_p (const_rtx);
@@ -3372,7 +3380,7 @@ extern void emit_jump (rtx);
 /* In expr.c */
 extern rtx move_by_pieces (rtx, rtx, unsigned HOST_WIDE_INT,
                           unsigned int, int);
-extern HOST_WIDE_INT find_args_size_adjust (rtx);
+extern HOST_WIDE_INT find_args_size_adjust (rtx_insn *);
 extern int fixup_args_size_notes (rtx_insn *, rtx_insn *, int);
 
 /* In cfgrtl.c */
index ece51c8c31296942165bac8ca50d659c4898a9db..d3a3e0277b408b3262bda9c15227b86324b5920f 100644 (file)
@@ -1183,7 +1183,7 @@ record_hard_reg_uses (rtx *px, void *data)
    will not be used, which we ignore.  */
 
 rtx
-single_set_2 (const_rtx insn, const_rtx pat)
+single_set_2 (const rtx_insn *insn, const_rtx pat)
 {
   rtx set = NULL;
   int set_verified = 1;
index 4c7d29e38b586914c1687b146dc982418bf249e0..85870f6815b509d818b17c4be8c421de1758c7f0 100644 (file)
@@ -920,7 +920,8 @@ remove_reachable_equiv_notes (basic_block bb, struct st_expr *smexpr)
 /* This routine will replace a store with a SET to a specified register.  */
 
 static void
-replace_store_insn (rtx reg, rtx del, basic_block bb, struct st_expr *smexpr)
+replace_store_insn (rtx reg, rtx_insn *del, basic_block bb,
+                   struct st_expr *smexpr)
 {
   rtx_insn *insn;
   rtx mem, note, set, ptr;
@@ -984,16 +985,16 @@ replace_store_insn (rtx reg, rtx del, basic_block bb, struct st_expr *smexpr)
 static void
 delete_store (struct st_expr * expr, basic_block bb)
 {
-  rtx reg, i, del;
+  rtx reg;
 
   if (expr->reaching_reg == NULL_RTX)
     expr->reaching_reg = gen_reg_rtx_and_attrs (expr->pattern);
 
   reg = expr->reaching_reg;
 
-  for (i = expr->avail_stores; i; i = XEXP (i, 1))
+  for (rtx_insn_list *i = expr->avail_stores; i; i = i->next ())
     {
-      del = XEXP (i, 0);
+      rtx_insn *del = i->insn ();
       if (BLOCK_FOR_INSN (del) == bb)
        {
          /* We know there is only one since we deleted redundant
@@ -1042,7 +1043,7 @@ build_store_vectors (void)
              rtx r = gen_reg_rtx_and_attrs (ptr->pattern);
              if (dump_file)
                fprintf (dump_file, "Removing redundant store:\n");
-             replace_store_insn (r, XEXP (st, 0), bb, ptr);
+             replace_store_insn (r, st->insn (), bb, ptr);
              continue;
            }
          bitmap_set_bit (st_avloc[bb->index], ptr->index);