This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFA: RTL typesafety improvements for ira.c


On 10/01/14 17:27, David Malcolm wrote:
On Wed, 2014-10-01 at 16:34 -0600, Jeff Law wrote:
This was inspired by a discussion with Felix who was making changes in
this area.

Basically this promotes the "init_insns" field within struct equivalence
from an rtx to an rtx_insn_list.

The only thing that's really interesting here is the old code exploits
the fact that we could put any RTX in the list by shoving const0_rtx
into the init_insns list as a marker to indicate we've already
determined the relevant pseudo must not have an equivalence.

Thus we could have the following objects in the init_insns field:

NULL
const0_rtx
INSN_LIST ...

This patch uses INSN_LIST (NULL_RTX, NULL) as the special marker.  Thus
the only two things that would exist in the init_insns field would be
NULL or an INSN_LIST.  Goodness.

Rather than stash away the special marker INSN_LIST into a global
variable or something similar, we instead to do a two step check for the
marker.  First verify that the insn_list field is non-NULL, then look at
the first insn in the list and see if that is NULL.

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

Ok for the trunk?


[...]

	* 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.
	(update_equiv_regs): Update test for special marker in the
	INIT_INSNs list.

diff --git a/gcc/ira.c b/gcc/ira.c
[...]

@@ -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 = list->insn ();
        remove_note (insn, find_reg_note (insn, REG_EQUIV, NULL_RTX));

FWIW, presumably "insn" here also can now be an rtx_insn *?
Yes.  I'll update that.  Thanks.

Jeff


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]