From: Andrew Stubbs Date: Thu, 11 Oct 2018 14:00:20 +0000 (+0000) Subject: Elide repeated RTL elements. X-Git-Tag: basepoints/gcc-10~3748 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2045ae1d3f511717c2a1223148ce63f71800e1dd;p=thirdparty%2Fgcc.git Elide repeated RTL elements. 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 Jan Hubicka Martin Jambor 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 Co-Authored-By: Martin Jambor From-SVN: r265042 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8f1f735ea7da..421a4c3ed276 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2018-10-11 Andrew Stubbs + Jan Hubicka + Martin Jambor + + * 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 * config/i386/x86-tune-costs.h (bdver?_memcpy, bdver?_memset, diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c index 233be9e5dc7b..7af92e168380 100644 --- a/gcc/print-rtl.c +++ b/gcc/print-rtl.c @@ -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; } diff --git a/gcc/read-rtl-function.c b/gcc/read-rtl-function.c index cde9d3e07af3..8746f704d036 100644 --- a/gcc/read-rtl-function.c +++ b/gcc/read-rtl-function.c @@ -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 diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c index 723c3e174b55..d698dd4af4d2 100644 --- a/gcc/read-rtl.c +++ b/gcc/read-rtl.c @@ -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) { diff --git a/gcc/rtl-tests.c b/gcc/rtl-tests.c index f67f2a356242..c684f8e1d74a 100644 --- a/gcc/rtl-tests.c +++ b/gcc/rtl-tests.c @@ -284,6 +284,29 @@ const_poly_int_tests::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::run (); + test_dumping_repeat (); /* Purge state. */ set_first_insn (NULL); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 333ec99bd67a..c5bbaf8df79b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-10-11 Andrew Stubbs + + * selftests/repeat.rtl: New file. + 2018-10-11 Jakub Jelinek PR c++/87582 diff --git a/gcc/testsuite/selftests/repeat.rtl b/gcc/testsuite/selftests/repeat.rtl new file mode 100644 index 000000000000..5507d33527b0 --- /dev/null +++ b/gcc/testsuite/selftests/repeat.rtl @@ -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