This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 3/7] Move ORIGINAL_REGNO to rtx header
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 10 May 2014 21:08:32 +0100
- Subject: [PATCH 3/7] Move ORIGINAL_REGNO to rtx header
- Authentication-results: sourceware.org; auth=none
- References: <87a9ap1k8n dot fsf at talisman dot default>
...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)