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]

[PATCH 3/7] Move ORIGINAL_REGNO to rtx header


...and reduce the size of REGs by one field.  This is still OK for REG->MEM
conversion since MEMs only have 2 fields.

In some ways it would have been nicer to move REGNO to the header,
since we wouldn't then need to fetch the second word of the rtx when
checking whether something is a REG and then checking its REGNO.
But that's much more complicated and essentially breaks the LISPness
of rtxes; see the covering note for more details.

We currently print the ORIGINAL_REGNO twice if there are also REG_ATTRS.
I've kept this behaviour in order to ensure that the -da output wasn't
changed by the patch series, but I could turn the "if" into an "else if"
if that seems better.

Tested on x86_64-linux-gnu.  OK to install?

Thanks,
Richard


gcc/
	* rtl.def (REG): Remove middle field.
	* rtl.h (rtx_def): Add orignal_regno to u2.
	(ORIGINAL_REGNO): Use it instead of field 1.
	(REG_ATTRS): Lower field index accordingly.
	* gengtype.c (adjust_field_rtx_def): Remove handling of
	ORIGINAL_REGNO.  Move REG_ATTRS index down.
	* print-rtl.c (print_rtx): Move ORIGINAL_REGNO handling to the
	code that prints the REGNO.

Index: gcc/rtl.def
===================================================================
--- gcc/rtl.def	2014-05-10 14:02:58.078340665 +0100
+++ gcc/rtl.def	2014-05-10 21:05:20.359929520 +0100
@@ -378,12 +378,10 @@ DEF_RTL_EXPR(PC, "pc", "", RTX_OBJ)
 /* A register.  The "operand" is the register number, accessed with
    the REGNO macro.  If this number is less than FIRST_PSEUDO_REGISTER
    than a hardware register is being referred to.  The second operand
-   holds the original register number - this will be different for a
-   pseudo register that got turned into a hard register.  The third
-   operand points to a reg_attrs structure.
+   points to a reg_attrs structure.
    This rtx needs to have as many (or more) fields as a MEM, since we
    can change REG rtx's into MEMs during reload.  */
-DEF_RTL_EXPR(REG, "reg", "i00", RTX_OBJ)
+DEF_RTL_EXPR(REG, "reg", "i0", RTX_OBJ)
 
 /* A scratch register.  This represents a register used only within a
    single insn.  It will be turned into a REG during register allocation
Index: gcc/rtl.h
===================================================================
--- gcc/rtl.h	2014-05-10 20:30:19.508904129 +0100
+++ gcc/rtl.h	2014-05-10 21:06:00.723283830 +0100
@@ -352,6 +352,9 @@ struct GTY((chain_next ("RTX_NEXT (&%h)"
        layout for that case and use the gap for extra code-specific
        information.  */
 
+    /* The ORIGINAL_REGNO of a REG.  */
+    unsigned original_regno;
+
     /* In a CONST_WIDE_INT (aka hwivec_def), this is the number of
        HOST_WIDE_INTs in the hwivec_def.  */
     unsigned num_elem;
@@ -1194,7 +1197,8 @@ #define SET_REGNO_RAW(RTX,N) (XCUINT (RT
 /* ORIGINAL_REGNO holds the number the register originally had; for a
    pseudo register turned into a hard reg this will hold the old pseudo
    register number.  */
-#define ORIGINAL_REGNO(RTX) X0UINT (RTX, 1)
+#define ORIGINAL_REGNO(RTX) \
+  (RTL_FLAG_CHECK1 ("ORIGINAL_REGNO", (RTX), REG)->u2.original_regno)
 
 /* Force the REGNO macro to only be used on the lhs.  */
 static inline unsigned int
@@ -1641,7 +1645,7 @@ #define MEM_ATTRS(RTX) X0MEMATTR (RTX, 1
 
 /* The register attribute block.  We provide access macros for each value
    in the block and provide defaults if none specified.  */
-#define REG_ATTRS(RTX) X0REGATTR (RTX, 2)
+#define REG_ATTRS(RTX) X0REGATTR (RTX, 1)
 
 #ifndef GENERATOR_FILE
 /* For a MEM rtx, the alias set.  If 0, this MEM is not in any alias
Index: gcc/gengtype.c
===================================================================
--- gcc/gengtype.c	2014-05-10 14:02:58.078340665 +0100
+++ gcc/gengtype.c	2014-05-10 21:05:11.739853801 +0100
@@ -1248,8 +1248,6 @@ adjust_field_rtx_def (type_p t, options_
 	      else if (i == DEBUG_EXPR && aindex == 0)
 		t = tree_tp, subname = "rt_tree";
 	      else if (i == REG && aindex == 1)
-		t = scalar_tp, subname = "rt_int";
-	      else if (i == REG && aindex == 2)
 		t = reg_attrs_tp, subname = "rt_reg";
 	      else if (i == SCRATCH && aindex == 0)
 		t = scalar_tp, subname = "rt_int";
Index: gcc/print-rtl.c
===================================================================
--- gcc/print-rtl.c	2014-05-10 20:37:19.251577206 +0100
+++ gcc/print-rtl.c	2014-05-10 21:05:11.739853801 +0100
@@ -216,12 +216,7 @@ print_rtx (const_rtx in_rtx)
 	   that the field has several different valid contents.  */
       case '0':
 #ifndef GENERATOR_FILE
-	if (i == 1 && REG_P (in_rtx))
-	  {
-	    if (REGNO (in_rtx) != ORIGINAL_REGNO (in_rtx))
-	      fprintf (outfile, " [%d]", ORIGINAL_REGNO (in_rtx));
-	  }
-	else if (i == 1 && GET_CODE (in_rtx) == SYMBOL_REF)
+	if (i == 1 && GET_CODE (in_rtx) == SYMBOL_REF)
 	  {
 	    int flags = SYMBOL_REF_FLAGS (in_rtx);
 	    if (flags)
@@ -491,6 +486,8 @@ print_rtx (const_rtx in_rtx)
 			   REG_OFFSET (in_rtx));
 		fputs (" ]", outfile);
 	      }
+	    if (REG_P (in_rtx) && REGNO (in_rtx) != ORIGINAL_REGNO (in_rtx))
+	      fprintf (outfile, " [%d]", ORIGINAL_REGNO (in_rtx));
 #endif
 
 	    if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)


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