ira.c (struct equivalence): Promote INIT_INSNs field to an rtx_insn_list.
authorJeff Law <law@redhat.com>
Fri, 10 Oct 2014 15:47:19 +0000 (09:47 -0600)
committerJeff Law <law@gcc.gnu.org>
Fri, 10 Oct 2014 15:47:19 +0000 (09:47 -0600)
        * ira.c (struct equivalence): Promote INIT_INSNs field to
        an rtx_insn_list.  Add comments.
        (no_equiv): Promote LIST to an rtx_insn_list.  Update
        testing for and creating the special marker.  Use methods
        to extract the insn and next pointers.  Promote INSN to an
        rtx_insn.
        (update_equiv_regs): Update test for special marker in the
        INIT_INSNs list.

From-SVN: r216095

gcc/ChangeLog
gcc/ira.c

index 8f5db119b13c6965983d918c9f9f31ff50c44bcf..2186328045940dae7799fedb633cba7a0e2d4bce 100644 (file)
@@ -1,3 +1,14 @@
+2014-10-10  Jeff Law  <law@redhat.com>
+
+       * ira.c (struct equivalence): Promote INIT_INSNs field to
+       an rtx_insn_list.  Add comments.
+       (no_equiv): Promote LIST to an rtx_insn_list.  Update
+       testing for and creating the special marker.  Use methods
+       to extract the insn and next pointers.  Promote INSN to an
+       rtx_insn.
+       (update_equiv_regs): Update test for special marker in the
+       INIT_INSNs list.
+
 2014-10-10  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * configure.ac: Add --enable-fix-cortex-a53-835769 option.
index ad0e463e4cddba2eddeb096f70528864577d28ba..d057ea6ddfef0ab1a10165df87c1ec4ebf9fe0e5 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -2890,8 +2890,16 @@ struct equivalence
      e.g. by reload.  */
   rtx replacement;
   rtx *src_p;
-  /* The list of each instruction which initializes this register.  */
-  rtx init_insns;
+
+  /* The list of each instruction which initializes this register.
+
+     NULL indicates we know nothing about this register's equivalence
+     properties.
+
+     An INSN_LIST with a NULL insn indicates this pseudo is already
+     known to not have a valid equivalence.  */
+  rtx_insn_list *init_insns;
+
   /* Loop depth is used to recognize equivalences which appear
      to be present within the same loop (or in an inner loop).  */
   int loop_depth;
@@ -3242,15 +3250,15 @@ no_equiv (rtx reg, const_rtx store ATTRIBUTE_UNUSED,
          void *data ATTRIBUTE_UNUSED)
 {
   int regno;
-  rtx list;
+  rtx_insn_list *list;
 
   if (!REG_P (reg))
     return;
   regno = REGNO (reg);
   list = reg_equiv[regno].init_insns;
-  if (list == const0_rtx)
+  if (list && list->insn () == NULL)
     return;
-  reg_equiv[regno].init_insns = const0_rtx;
+  reg_equiv[regno].init_insns = gen_rtx_INSN_LIST (VOIDmode, NULL_RTX, NULL);
   reg_equiv[regno].replacement = NULL_RTX;
   /* This doesn't matter for equivalences made for argument registers, we
      should keep their initialization insns.  */
@@ -3258,9 +3266,9 @@ no_equiv (rtx reg, const_rtx store ATTRIBUTE_UNUSED,
     return;
   ira_reg_equiv[regno].defined_p = false;
   ira_reg_equiv[regno].init_insns = NULL;
-  for (; list; list =  XEXP (list, 1))
+  for (; list; list = list->next ())
     {
-      rtx insn = XEXP (list, 0);
+      rtx_insn *insn = list->insn ();
       remove_note (insn, find_reg_note (insn, REG_EQUIV, NULL_RTX));
     }
 }
@@ -3437,7 +3445,8 @@ update_equiv_regs (void)
 
          if (!REG_P (dest)
              || (regno = REGNO (dest)) < FIRST_PSEUDO_REGISTER
-             || reg_equiv[regno].init_insns == const0_rtx
+             || (reg_equiv[regno].init_insns
+                 && reg_equiv[regno].init_insns->insn () == NULL)
              || (targetm.class_likely_spilled_p (reg_preferred_class (regno))
                  && MEM_P (src) && ! reg_equiv[regno].is_arg_equivalence))
            {
@@ -3608,8 +3617,8 @@ update_equiv_regs (void)
          && (regno = REGNO (src)) >= FIRST_PSEUDO_REGISTER
          && REG_BASIC_BLOCK (regno) >= NUM_FIXED_BLOCKS
          && DF_REG_DEF_COUNT (regno) == 1
-         && reg_equiv[regno].init_insns != 0
-         && reg_equiv[regno].init_insns != const0_rtx
+         && reg_equiv[regno].init_insns != NULL
+         && reg_equiv[regno].init_insns->insn () != NULL
          && ! find_reg_note (XEXP (reg_equiv[regno].init_insns, 0),
                              REG_EQUIV, NULL_RTX)
          && ! contains_replace_regs (XEXP (dest, 0))
@@ -3728,7 +3737,7 @@ update_equiv_regs (void)
                      delete_insn (equiv_insn);
 
                      reg_equiv[regno].init_insns
-                       = XEXP (reg_equiv[regno].init_insns, 1);
+                       = reg_equiv[regno].init_insns->next ();
 
                      ira_reg_equiv[regno].init_insns = NULL;
                      bitmap_set_bit (cleared_regs, regno);