diff mbox

[011/236] Replace PREV_INSN et al macros with functions

Message ID 1407345815-14551-12-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm Aug. 6, 2014, 5:19 p.m. UTC
Yet more scaffolding: convert the NEXT_INSN/PREV_INSN macros
and their SET_* variants into functions.

Convert the rvalue-style functions into returning
rtx_insn * rather than plain rtx.

For now, this is done by adding a checked cast, but I hope this can
eventually become a field lookup.  The lvalue forms for now return an rtx&
to allow in-place modification.

gcc/
	* rtl.h (PREV_INSN): Convert to an inline function.  Strengthen
	the return type from rtx to rtx_insn *,  which will enable various
	conversions in followup patches.  For now this is is done by a
	checked cast.
	(NEXT_INSN): Likewise.
	(SET_PREV_INSN): Convert to an inilne function.  This is intended
	for use as an lvalue, and so returns an rtx& to allow in-place
	modification.
	(SET_NEXT_INSN): Likewise.
---
 gcc/rtl.h | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

Comments

Jeff Law Aug. 12, 2014, 9:20 p.m. UTC | #1
On 08/06/14 11:19, David Malcolm wrote:
> Yet more scaffolding: convert the NEXT_INSN/PREV_INSN macros
> and their SET_* variants into functions.
>
> Convert the rvalue-style functions into returning
> rtx_insn * rather than plain rtx.
>
> For now, this is done by adding a checked cast, but I hope this can
> eventually become a field lookup.  The lvalue forms for now return an rtx&
> to allow in-place modification.
>
> gcc/
> 	* rtl.h (PREV_INSN): Convert to an inline function.  Strengthen
> 	the return type from rtx to rtx_insn *,  which will enable various
> 	conversions in followup patches.  For now this is is done by a
> 	checked cast.
> 	(NEXT_INSN): Likewise.
> 	(SET_PREV_INSN): Convert to an inilne function.  This is intended
> 	for use as an lvalue, and so returns an rtx& to allow in-place
> 	modification.
> 	(SET_NEXT_INSN): Likewise.
OK.

FWIW, I do think that after this series is done that we should look very 
closely at moving those fields out of the rtunion array and just have 
them first class fields in their classes.

I can see a day where I say foo->uid or foo->next/prev and be 
exceedingly happy.  And if we keep "rtx_real_insn" as a concept, then 
foo.pattern ;-)

Jeff
diff mbox

Patch

diff --git a/gcc/rtl.h b/gcc/rtl.h
index e08f05b..5936829 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -972,15 +972,33 @@  extern void rtl_check_failed_flag (const char *, const_rtx, const char *,
   (RTL_INSN_CHAIN_FLAG_CHECK ("INSN_UID", (INSN))->u2.insn_uid)
 
 /* Chain insns together in sequence.  */
+
 /* For now these are split in two: an rvalue form:
      PREV_INSN/NEXT_INSN
    and an lvalue form:
      SET_NEXT_INSN/SET_PREV_INSN.  */
 
-#define PREV_INSN(INSN)      XEXP ((const_rtx)(INSN), 0)
-#define SET_PREV_INSN(INSN)  XEXP (INSN, 0)
-#define NEXT_INSN(INSN)      XEXP ((const_rtx)(INSN), 1)
-#define SET_NEXT_INSN(INSN)  XEXP (INSN, 1)
+inline rtx_insn *PREV_INSN (const_rtx insn)
+{
+  rtx prev = XEXP (insn, 0);
+  return as_a_nullable <rtx_insn *> (prev);
+}
+
+inline rtx& SET_PREV_INSN (rtx insn)
+{
+  return XEXP (insn, 0);
+}
+
+inline rtx_insn *NEXT_INSN (const_rtx insn)
+{
+  rtx next = XEXP (insn, 1);
+  return as_a_nullable <rtx_insn *> (next);
+}
+
+inline rtx& SET_NEXT_INSN (rtx insn)
+{
+  return XEXP (insn, 1);
+}
 
 #define BLOCK_FOR_INSN(INSN) XBBDEF (INSN, 2)