Message ID | 1407345815-14551-12-git-send-email-dmalcolm@redhat.com |
---|---|
State | New |
Headers | show |
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 --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)