Commit a756c6be by David Malcolm Committed by David Malcolm

Introduce rtx_insn_list subclass of rtx_def

gcc/
2014-08-27  David Malcolm  <dmalcolm@redhat.com>

	* coretypes.h (class rtx_insn_list): Add forward declaration.
	* rtl.h (class rtx_insn_list): New subclass of rtx_def
	(is_a_helper <rtx_insn_list *>::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
parent 9daaca36
2014-08-27 David Malcolm <dmalcolm@redhat.com> 2014-08-27 David Malcolm <dmalcolm@redhat.com>
* coretypes.h (class rtx_insn_list): Add forward declaration.
* rtl.h (class rtx_insn_list): New subclass of rtx_def
(is_a_helper <rtx_insn_list *>::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 <dmalcolm@redhat.com>
* ira-lives.c (find_call_crossed_cheap_reg): Strengthen local * ira-lives.c (find_call_crossed_cheap_reg): Strengthen local
"prev" from rtx to rtx_insn *. "prev" from rtx to rtx_insn *.
......
...@@ -60,6 +60,7 @@ typedef const struct rtx_def *const_rtx; ...@@ -60,6 +60,7 @@ typedef const struct rtx_def *const_rtx;
hierarchy, along with the relevant invariant. hierarchy, along with the relevant invariant.
Where possible, keep this list in the same order as in rtl.def. */ Where possible, keep this list in the same order as in rtl.def. */
class rtx_def; class rtx_def;
class rtx_insn_list; /* GET_CODE (X) == INSN_LIST */
class rtx_insn; class rtx_insn;
class rtx_debug_insn; /* DEBUG_INSN_P (X) */ class rtx_debug_insn; /* DEBUG_INSN_P (X) */
class rtx_nonjump_insn; /* NONJUMP_INSN_P (X) */ class rtx_nonjump_insn; /* NONJUMP_INSN_P (X) */
......
...@@ -409,6 +409,13 @@ gen_raw_REG (enum machine_mode mode, int regno) ...@@ -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 functions do the raw handling. If you add to this list, modify
special_rtx in gengenrtl.c as well. */ 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 <rtx_insn_list *> (gen_rtx_fmt_ue (INSN_LIST, mode, insn,
insn_list));
}
rtx rtx
gen_rtx_CONST_INT (enum machine_mode mode ATTRIBUTE_UNUSED, HOST_WIDE_INT arg) gen_rtx_CONST_INT (enum machine_mode mode ATTRIBUTE_UNUSED, HOST_WIDE_INT arg)
{ {
......
...@@ -123,7 +123,8 @@ special_format (const char *fmt) ...@@ -123,7 +123,8 @@ special_format (const char *fmt)
static int static int
special_rtx (int idx) 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, "REG") == 0
|| strcmp (defs[idx].enumname, "SUBREG") == 0 || strcmp (defs[idx].enumname, "SUBREG") == 0
|| strcmp (defs[idx].enumname, "MEM") == 0 || strcmp (defs[idx].enumname, "MEM") == 0
......
...@@ -402,6 +402,35 @@ struct GTY((desc("0"), tag("0"), ...@@ -402,6 +402,35 @@ struct GTY((desc("0"), tag("0"),
} GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u; } 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 <rtx_insn_list *>::test (rtx rt)
{
return rt->code == INSN_LIST;
}
class GTY(()) rtx_insn : public rtx_def class GTY(()) rtx_insn : public rtx_def
{ {
/* No extra fields, but adds the invariant: /* No extra fields, but adds the invariant:
...@@ -1168,6 +1197,21 @@ extern void rtl_check_failed_flag (const char *, const_rtx, const char *, ...@@ -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) #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 <rtx_insn_list *> (tmp);
}
inline rtx_insn *rtx_insn_list::insn () const
{
rtx tmp = XEXP (this, 0);
return safe_as_a <rtx_insn *> (tmp);
}
/* ACCESS MACROS for particular fields of insns. */ /* ACCESS MACROS for particular fields of insns. */
/* Holds a unique number for each insn. /* Holds a unique number for each insn.
...@@ -2952,6 +2996,7 @@ get_mem_attrs (const_rtx x) ...@@ -2952,6 +2996,7 @@ get_mem_attrs (const_rtx x)
generation functions included above do the raw handling. If you generation functions included above do the raw handling. If you
add to this list, modify special_rtx in gengenrtl.c as well. */ 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_INT (enum machine_mode, HOST_WIDE_INT);
extern rtx gen_rtx_CONST_VECTOR (enum machine_mode, rtvec); extern rtx gen_rtx_CONST_VECTOR (enum machine_mode, rtvec);
extern rtx gen_raw_REG (enum machine_mode, int); extern rtx gen_raw_REG (enum machine_mode, int);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment