From a756c6be3193ea9483aaa35b1be4e95ccc79af83 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Wed, 27 Aug 2014 19:49:43 +0000 Subject: [PATCH] Introduce rtx_insn_list subclass of rtx_def gcc/ 2014-08-27 David Malcolm * coretypes.h (class rtx_insn_list): Add forward declaration. * rtl.h (class rtx_insn_list): New subclass of rtx_def (is_a_helper ::test): New. (rtx_insn_list::next): New. (rtx_insn_list::insn): New. (gen_rtx_INSN_LIST): Add prototype. * emit-rtl.c (gen_rtx_INSN_LIST): New. * gengenrtl.c (special_rtx): Add INSN_LIST. From-SVN: r214589 --- gcc/ChangeLog | 11 +++++++++++ gcc/coretypes.h | 1 + gcc/emit-rtl.c | 7 +++++++ gcc/gengenrtl.c | 3 ++- gcc/rtl.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dbae32edf93..2004d583c3f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2014-08-27 David Malcolm + + * coretypes.h (class rtx_insn_list): Add forward declaration. + * rtl.h (class rtx_insn_list): New subclass of rtx_def + (is_a_helper ::test): New. + (rtx_insn_list::next): New. + (rtx_insn_list::insn): New. + (gen_rtx_INSN_LIST): Add prototype. + * emit-rtl.c (gen_rtx_INSN_LIST): New. + * gengenrtl.c (special_rtx): Add INSN_LIST. + 2014-08-27 David Malcolm * ira-lives.c (find_call_crossed_cheap_reg): Strengthen local diff --git a/gcc/coretypes.h b/gcc/coretypes.h index 87aec0f9981..99ddbdbaf14 100644 --- a/gcc/coretypes.h +++ b/gcc/coretypes.h @@ -60,6 +60,7 @@ typedef const struct rtx_def *const_rtx; hierarchy, along with the relevant invariant. Where possible, keep this list in the same order as in rtl.def. */ class rtx_def; + class rtx_insn_list; /* GET_CODE (X) == INSN_LIST */ class rtx_insn; class rtx_debug_insn; /* DEBUG_INSN_P (X) */ class rtx_nonjump_insn; /* NONJUMP_INSN_P (X) */ diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 0ab0db581d5..cffb8db40f4 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -409,6 +409,13 @@ gen_raw_REG (enum machine_mode mode, int regno) functions do the raw handling. If you add to this list, modify special_rtx in gengenrtl.c as well. */ +rtx_insn_list * +gen_rtx_INSN_LIST (enum machine_mode mode, rtx insn, rtx insn_list) +{ + return as_a (gen_rtx_fmt_ue (INSN_LIST, mode, insn, + insn_list)); +} + rtx gen_rtx_CONST_INT (enum machine_mode mode ATTRIBUTE_UNUSED, HOST_WIDE_INT arg) { diff --git a/gcc/gengenrtl.c b/gcc/gengenrtl.c index 550efb8e170..cd2934126af 100644 --- a/gcc/gengenrtl.c +++ b/gcc/gengenrtl.c @@ -123,7 +123,8 @@ special_format (const char *fmt) static int special_rtx (int idx) { - return (strcmp (defs[idx].enumname, "CONST_INT") == 0 + return (strcmp (defs[idx].enumname, "INSN_LIST") == 0 + || strcmp (defs[idx].enumname, "CONST_INT") == 0 || strcmp (defs[idx].enumname, "REG") == 0 || strcmp (defs[idx].enumname, "SUBREG") == 0 || strcmp (defs[idx].enumname, "MEM") == 0 diff --git a/gcc/rtl.h b/gcc/rtl.h index cd77d87e513..9f57170d804 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -402,6 +402,35 @@ struct GTY((desc("0"), tag("0"), } GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u; }; +class GTY(()) rtx_insn_list : public rtx_def +{ + /* No extra fields, but adds invariant: (GET_CODE (X) == INSN_LIST). + + This is an instance of: + + DEF_RTL_EXPR(INSN_LIST, "insn_list", "ue", RTX_EXTRA) + + i.e. a node for constructing singly-linked lists of rtx_insn *, where + the list is "external" to the insn (as opposed to the doubly-linked + list embedded within rtx_insn itself). */ + +public: + /* Get next in list. */ + rtx_insn_list *next () const; + + /* Get at the underlying instruction. */ + rtx_insn *insn () const; + +}; + +template <> +template <> +inline bool +is_a_helper ::test (rtx rt) +{ + return rt->code == INSN_LIST; +} + class GTY(()) rtx_insn : public rtx_def { /* No extra fields, but adds the invariant: @@ -1168,6 +1197,21 @@ extern void rtl_check_failed_flag (const char *, const_rtx, const char *, #define XC2EXP(RTX, N, C1, C2) (RTL_CHECKC2 (RTX, N, C1, C2).rt_rtx) + +/* Methods of rtx_insn_list. */ + +inline rtx_insn_list *rtx_insn_list::next () const +{ + rtx tmp = XEXP (this, 1); + return safe_as_a (tmp); +} + +inline rtx_insn *rtx_insn_list::insn () const +{ + rtx tmp = XEXP (this, 0); + return safe_as_a (tmp); +} + /* ACCESS MACROS for particular fields of insns. */ /* Holds a unique number for each insn. @@ -2952,6 +2996,7 @@ get_mem_attrs (const_rtx x) generation functions included above do the raw handling. If you add to this list, modify special_rtx in gengenrtl.c as well. */ +extern rtx_insn_list *gen_rtx_INSN_LIST (enum machine_mode, rtx, rtx); extern rtx gen_rtx_CONST_INT (enum machine_mode, HOST_WIDE_INT); extern rtx gen_rtx_CONST_VECTOR (enum machine_mode, rtvec); extern rtx gen_raw_REG (enum machine_mode, int);