diff mbox

RFA: RTL typesafety improvements for ira.c

Message ID 5435F13B.9050108@redhat.com
State New
Headers show

Commit Message

Jeff Law Oct. 9, 2014, 2:21 a.m. UTC
On 10/01/14 17:27, David Malcolm wrote:
>
> FWIW, presumably "insn" here also can now be an rtx_insn *?
>
> (I'd like to eventually strengthen the params to the note-handling
> functions, so fixing this up now would help with that).
Here's the updated patch to include strengthening insn to rtx_insn *.

Bootstrapped and regression tested on x86_64-unknown-linux-gnu.

OK for the trunk?  I'd like to get this wrapped up so that a patch in 
the same area from Felix can get rebased and move forward.

Jeff
* 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.

Comments

Vladimir Makarov Oct. 10, 2014, 3:05 p.m. UTC | #1
On 2014-10-08 10:21 PM, Jeff Law wrote:
> On 10/01/14 17:27, David Malcolm wrote:
>>
>> FWIW, presumably "insn" here also can now be an rtx_insn *?
>>
>> (I'd like to eventually strengthen the params to the note-handling
>> functions, so fixing this up now would help with that).
> Here's the updated patch to include strengthening insn to rtx_insn *.
>
> Bootstrapped and regression tested on x86_64-unknown-linux-gnu.
>
> OK for the trunk?  I'd like to get this wrapped up so that a patch in
> the same area from Felix can get rebased and move forward.
>

It is ok for the trunk, Jeff.  Sorry for the delay with the response. 
As you know I was busy with the rematerialzation pass.
diff mbox

Patch

diff --git a/gcc/ira.c b/gcc/ira.c
index ad0e463..d057ea6 100644
--- 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);