Introduce rtx_insn_list subclass of rtx_def
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 27 Aug 2014 19:49:43 +0000 (19:49 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Wed, 27 Aug 2014 19:49:43 +0000 (19:49 +0000)
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

gcc/ChangeLog
gcc/coretypes.h
gcc/emit-rtl.c
gcc/gengenrtl.c
gcc/rtl.h

index dbae32edf937dc2a2317a90726c8698f321f50c1..2004d583c3fda691379d1a4e17f379009b3b9384 100644 (file)
@@ -1,3 +1,14 @@
+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
index 87aec0f998193ba96fee742229bf3adea90d5339..99ddbdbaf145e8be7a15451fd5e07aa064615ffd 100644 (file)
@@ -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) */
index 0ab0db581d59612e64cd030f56ccfd8f42675bb6..cffb8db40f45f997bee4ecacd150f35a1d70fa77 100644 (file)
@@ -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 <rtx_insn_list *> (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)
 {
index 550efb8e17091329a83a4841fbde40f4c47b0c04..cd2934126af2d03972c5fdc11d006465284c8c6d 100644 (file)
@@ -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
index cd77d87e513d78289a4722a18a45ef41f4d2558d..9f57170d804d18288a879ad3f9387e017a996ad2 100644 (file)
--- 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 <rtx_insn_list *>::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)
 \f
+
+/* 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.  */
 
 /* 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);