rtx_writer: avoid printing trailing default values
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 7 Nov 2016 15:19:17 +0000 (15:19 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Mon, 7 Nov 2016 15:19:17 +0000 (15:19 +0000)
gcc/ChangeLog:
* print-rtl.c (rtx_writer::operand_has_default_value_p): New
method.
(rtx_writer::print_rtx): In compact mode, omit trailing operands
that have the default values.
* print-rtl.h (rtx_writer::operand_has_default_value_p): New
method.
* rtl-tests.c (selftest::test_dumping_insns): Remove empty
label string from expected dump.
(seltest::test_uncond_jump): Remove trailing "(nil)" for REG_NOTES
from expected dump.

From-SVN: r241908

gcc/ChangeLog
gcc/print-rtl.c
gcc/print-rtl.h
gcc/rtl-tests.c

index 34e88da56420b409b5c2fd8e26b6328f7fec410b..02e05647b7dca54e9887b6a96be7b13c86f7a980 100644 (file)
@@ -1,3 +1,16 @@
+2016-11-07  David Malcolm  <dmalcolm@redhat.com>
+
+       * print-rtl.c (rtx_writer::operand_has_default_value_p): New
+       method.
+       (rtx_writer::print_rtx): In compact mode, omit trailing operands
+       that have the default values.
+       * print-rtl.h (rtx_writer::operand_has_default_value_p): New
+       method.
+       * rtl-tests.c (selftest::test_dumping_insns): Remove empty
+       label string from expected dump.
+       (seltest::test_uncond_jump): Remove trailing "(nil)" for REG_NOTES
+       from expected dump.
+
 2016-11-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/77834
index 341ecdfedb84fb500b54c2a49934afda4b62672c..3f15a216c96e40dc4b5142ad3df8ad96f4213166 100644 (file)
@@ -564,6 +564,43 @@ rtx_writer::print_rtx_operand (const_rtx in_rtx, int idx)
     }
 }
 
+/* Subroutine of rtx_writer::print_rtx.
+   In compact mode, determine if operand IDX of IN_RTX is interesting
+   to dump, or (if in a trailing position) it can be omitted.  */
+
+bool
+rtx_writer::operand_has_default_value_p (const_rtx in_rtx, int idx)
+{
+  const char *format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
+
+  switch (format_ptr[idx])
+    {
+    case 'e':
+    case 'u':
+      return XEXP (in_rtx, idx) == NULL_RTX;
+
+    case 's':
+      return XSTR (in_rtx, idx) == NULL;
+
+    case '0':
+      switch (GET_CODE (in_rtx))
+       {
+       case JUMP_INSN:
+         /* JUMP_LABELs are always omitted in compact mode, so treat
+            any value here as omittable, so that earlier operands can
+            potentially be omitted also.  */
+         return m_compact;
+
+       default:
+         return false;
+
+       }
+
+    default:
+      return false;
+    }
+}
+
 /* Print IN_RTX onto m_outfile.  This is the recursive part of printing.  */
 
 void
@@ -681,9 +718,18 @@ rtx_writer::print_rtx (const_rtx in_rtx)
        fprintf (m_outfile, " %d", INSN_UID (in_rtx));
     }
 
+  /* Determine which is the final operand to print.
+     In compact mode, skip trailing operands that have the default values
+     e.g. trailing "(nil)" values.  */
+  int limit = GET_RTX_LENGTH (GET_CODE (in_rtx));
+  if (m_compact)
+    while (limit > idx && operand_has_default_value_p (in_rtx, limit - 1))
+      limit--;
+
   /* Get the format string and skip the first elements if we have handled
      them already.  */
-  for (; idx < GET_RTX_LENGTH (GET_CODE (in_rtx)); idx++)
+
+  for (; idx < limit; idx++)
     print_rtx_operand (in_rtx, idx);
 
   switch (GET_CODE (in_rtx))
index 8496ffa1491f158a2074d9d6475d257bea48bb4f..68db057b201b92235882bdc9bda8788f19120ece 100644 (file)
@@ -39,6 +39,7 @@ class rtx_writer
   void print_rtx_operand_code_r (const_rtx in_rtx);
   void print_rtx_operand_code_u (const_rtx in_rtx, int idx);
   void print_rtx_operand (const_rtx in_rtx, int idx);
+  bool operand_has_default_value_p (const_rtx in_rtx, int idx);
 
  private:
   FILE *m_outfile;
index cf5239f92f96d3a0a4094ca063328271a28480e3..228226bbb685fb61cb0c7416d02cf8dd42258dd1 100644 (file)
@@ -122,7 +122,7 @@ test_dumping_insns ()
   /* Labels.  */
   rtx_insn *label = gen_label_rtx ();
   CODE_LABEL_NUMBER (label) = 42;
-  ASSERT_RTL_DUMP_EQ ("(clabel 0 42 \"\")\n", label);
+  ASSERT_RTL_DUMP_EQ ("(clabel 0 42)\n", label);
 
   LABEL_NAME (label)= "some_label";
   ASSERT_RTL_DUMP_EQ ("(clabel 0 42 (\"some_label\"))\n", label);
@@ -176,8 +176,7 @@ test_uncond_jump ()
   ASSERT_TRUE (control_flow_insn_p (jump_insn));
 
   ASSERT_RTL_DUMP_EQ ("(cjump_insn 1 (set (pc)\n"
-                     "        (label_ref 0))\n"
-                     "     (nil))\n",
+                     "        (label_ref 0)))\n",
                      jump_insn);
 }