Elide repeated RTL elements.
authorAndrew Stubbs <ams@codesourcery.com>
Thu, 11 Oct 2018 14:00:20 +0000 (14:00 +0000)
committerAndrew Stubbs <ams@gcc.gnu.org>
Thu, 11 Oct 2018 14:00:20 +0000 (14:00 +0000)
GCN's 64-lane vectors tend to make RTL dumps very long.  This patch makes them
far more bearable by eliding long sequences of the same element into "repeated"
messages.

This also takes care of reading repeated sequences in the RTL front-end.

There are self tests for both reading and writing.

2018-10-11  Andrew Stubbs  <ams@codesourcery.com>
    Jan Hubicka  <jh@suse.cz>
    Martin Jambor  <mjambor@suse.cz>

gcc/
* print-rtl.c (print_rtx_operand_codes_E_and_V): Print how many times
the same elements are repeated rather than printing all of them.
* read-rtl.c (rtx_reader::read_rtx_operand): Recognize and expand
"repeated" elements.
* read-rtl-function.c (test_loading_repeat): New function.
(read_rtl_function_c_tests): Call test_loading_repeat.
* rtl-tests.c (test_dumping_repeat): New function.
(rtl_tests_c_tests): Call test_dumping_repeat.

gcc/testsuite/
* selftests/repeat.rtl: New file.

Co-Authored-By: Jan Hubicka <jh@suse.cz>
Co-Authored-By: Martin Jambor <mjambor@suse.cz>
From-SVN: r265042

gcc/ChangeLog
gcc/print-rtl.c
gcc/read-rtl-function.c
gcc/read-rtl.c
gcc/rtl-tests.c
gcc/testsuite/ChangeLog
gcc/testsuite/selftests/repeat.rtl [new file with mode: 0644]

index 8f1f735ea7daabc86bc8c885d384e5f994dd832a..421a4c3ed276227413d06a2efd6899ba07b2a993 100644 (file)
@@ -1,3 +1,16 @@
+2018-10-11  Andrew Stubbs  <ams@codesourcery.com>
+           Jan Hubicka  <jh@suse.cz>
+           Martin Jambor  <mjambor@suse.cz>
+
+       * print-rtl.c (print_rtx_operand_codes_E_and_V): Print how many times
+       the same elements are repeated rather than printing all of them.
+       * read-rtl.c (rtx_reader::read_rtx_operand): Recognize and expand
+       "repeated" elements.
+       * read-rtl-function.c (test_loading_repeat): New function.
+       (read_rtl_function_c_tests): Call test_loading_repeat.
+       * rtl-tests.c (test_dumping_repeat): New function.
+       (rtl_tests_c_tests): Call test_dumping_repeat.
+
 2018-10-11  Richard Biener  <rguenther@suse.de>
 
        * config/i386/x86-tune-costs.h (bdver?_memcpy, bdver?_memset,
index 233be9e5dc7b0b30540080c4b482ffaa875d4b31..7af92e168380c4139893a297226c3e47211d8ed5 100644 (file)
@@ -370,7 +370,20 @@ rtx_writer::print_rtx_operand_codes_E_and_V (const_rtx in_rtx, int idx)
        m_sawclose = 1;
 
       for (int j = 0; j < XVECLEN (in_rtx, idx); j++)
-       print_rtx (XVECEXP (in_rtx, idx, j));
+       {
+         int j1;
+
+         print_rtx (XVECEXP (in_rtx, idx, j));
+         for (j1 = j + 1; j1 < XVECLEN (in_rtx, idx); j1++)
+           if (XVECEXP (in_rtx, idx, j) != XVECEXP (in_rtx, idx, j1))
+             break;
+
+         if (j1 != j + 1)
+           {
+             fprintf (m_outfile, " repeated x%i", j1 - j);
+             j = j1 - 1;
+           }
+       }
 
       m_indent -= 2;
     }
index cde9d3e07af3d7aefe26ee2f828f6644d7b3fa4f..8746f704d03642ad86b4cce1a807ef9f83458205 100644 (file)
@@ -2166,6 +2166,20 @@ test_loading_mem ()
   ASSERT_EQ (6, MEM_ADDR_SPACE (mem2));
 }
 
+/* Verify that "repeated xN" is read correctly.  */
+
+static void
+test_loading_repeat ()
+{
+  rtl_dump_test t (SELFTEST_LOCATION, locate_file ("repeat.rtl"));
+
+  rtx_insn *insn_1 = get_insn_by_uid (1);
+  ASSERT_EQ (PARALLEL, GET_CODE (PATTERN (insn_1)));
+  ASSERT_EQ (64, XVECLEN (PATTERN (insn_1), 0));
+  for (int i = 0; i < 64; i++)
+    ASSERT_EQ (const0_rtx, XVECEXP (PATTERN (insn_1), 0, i));
+}
+
 /* Run all of the selftests within this file.  */
 
 void
@@ -2187,6 +2201,7 @@ read_rtl_function_c_tests ()
   test_loading_cfg ();
   test_loading_bb_index ();
   test_loading_mem ();
+  test_loading_repeat ();
 }
 
 } // namespace selftest
index 723c3e174b55936501baa4943fdef20fa09ac47d..d698dd4af4d2998f67b1820d9022d36ba5849479 100644 (file)
@@ -1690,6 +1690,7 @@ rtx_reader::read_rtx_operand (rtx return_rtx, int idx)
        struct obstack vector_stack;
        int list_counter = 0;
        rtvec return_vec = NULL_RTVEC;
+       rtx saved_rtx = NULL_RTX;
 
        require_char_ws ('[');
 
@@ -1700,8 +1701,34 @@ rtx_reader::read_rtx_operand (rtx return_rtx, int idx)
            if (c == EOF)
              fatal_expected_char (']', c);
            unread_char (c);
-           list_counter++;
-           obstack_ptr_grow (&vector_stack, read_nested_rtx ());
+
+           rtx value;
+           int repeat_count = 1;
+           if (c == 'r')
+             {
+               /* Process "repeated xN" directive.  */
+               read_name (&name);
+               if (strcmp (name.string, "repeated"))
+                 fatal_with_file_and_line ("invalid directive \"%s\"\n",
+                                           name.string);
+               read_name (&name);
+               if (!sscanf (name.string, "x%d", &repeat_count))
+                 fatal_with_file_and_line ("invalid repeat count \"%s\"\n",
+                                           name.string);
+
+               /* We already saw one of the instances.  */
+               repeat_count--;
+               value = saved_rtx;
+             }
+           else
+             value = read_nested_rtx ();
+
+           for (; repeat_count > 0; repeat_count--)
+             {
+               list_counter++;
+               obstack_ptr_grow (&vector_stack, value);
+             }
+           saved_rtx = value;
          }
        if (list_counter > 0)
          {
index f67f2a356242eea62c6afad3cee2c6ca582bb548..c684f8e1d74a2aabd2190e2fefb7daa05b9cbc34 100644 (file)
@@ -284,6 +284,29 @@ const_poly_int_tests<N>::run ()
             gen_int_mode (poly_int64 (5, -1), QImode));
 }
 
+/* Check dumping of repeated RTL vectors.  */
+
+static void
+test_dumping_repeat ()
+{
+  rtx p = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
+  XVECEXP (p, 0, 0) = const0_rtx;
+  XVECEXP (p, 0, 1) = const0_rtx;
+  XVECEXP (p, 0, 2) = const0_rtx;
+  ASSERT_RTL_DUMP_EQ ("(parallel [\n"
+                     "        (const_int 0) repeated x3\n"
+                     "    ])",
+                     p);
+
+  XVECEXP (p, 0, 1) = const1_rtx;
+  ASSERT_RTL_DUMP_EQ ("(parallel [\n"
+                     "        (const_int 0)\n"
+                     "        (const_int 1)\n"
+                     "        (const_int 0)\n"
+                     "    ])",
+                     p);
+}
+
 /* Run all of the selftests within this file.  */
 
 void
@@ -295,6 +318,7 @@ rtl_tests_c_tests ()
   test_single_set ();
   test_uncond_jump ();
   const_poly_int_tests<NUM_POLY_INT_COEFFS>::run ();
+  test_dumping_repeat ();
 
   /* Purge state.  */
   set_first_insn (NULL);
index 333ec99bd67a458ed68f4e3fba4ae0d11eae7f77..c5bbaf8df79b427e8163b82a693a1039a1e2176c 100644 (file)
@@ -1,3 +1,7 @@
+2018-10-11  Andrew Stubbs  <ams@codesourcery.com>
+
+       * selftests/repeat.rtl: New file.
+
 2018-10-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/87582
diff --git a/gcc/testsuite/selftests/repeat.rtl b/gcc/testsuite/selftests/repeat.rtl
new file mode 100644 (file)
index 0000000..5507d33
--- /dev/null
@@ -0,0 +1,11 @@
+(function "repeat_examples"
+  (insn-chain
+    (block 2
+      (edge-from entry (flags "FALLTHRU"))
+      (cinsn 1
+        (parallel [(const_int 0) repeated x64])
+        "test.c":2 (nil))
+      (edge-to exit (flags "FALLTHRU"))
+    ) ;; block 2
+  ) ;; insn-chain
+) ;; function