mirror of git://gcc.gnu.org/git/gcc.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 <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
This commit is contained in:
parent
f9f3b77cf5
commit
2045ae1d3f
|
|
@ -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>
|
2018-10-11 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
* config/i386/x86-tune-costs.h (bdver?_memcpy, bdver?_memset,
|
* config/i386/x86-tune-costs.h (bdver?_memcpy, bdver?_memset,
|
||||||
|
|
|
||||||
|
|
@ -370,7 +370,20 @@ rtx_writer::print_rtx_operand_codes_E_and_V (const_rtx in_rtx, int idx)
|
||||||
m_sawclose = 1;
|
m_sawclose = 1;
|
||||||
|
|
||||||
for (int j = 0; j < XVECLEN (in_rtx, idx); j++)
|
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;
|
m_indent -= 2;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2166,6 +2166,20 @@ test_loading_mem ()
|
||||||
ASSERT_EQ (6, MEM_ADDR_SPACE (mem2));
|
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. */
|
/* Run all of the selftests within this file. */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -2187,6 +2201,7 @@ read_rtl_function_c_tests ()
|
||||||
test_loading_cfg ();
|
test_loading_cfg ();
|
||||||
test_loading_bb_index ();
|
test_loading_bb_index ();
|
||||||
test_loading_mem ();
|
test_loading_mem ();
|
||||||
|
test_loading_repeat ();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace selftest
|
} // namespace selftest
|
||||||
|
|
|
||||||
|
|
@ -1690,6 +1690,7 @@ rtx_reader::read_rtx_operand (rtx return_rtx, int idx)
|
||||||
struct obstack vector_stack;
|
struct obstack vector_stack;
|
||||||
int list_counter = 0;
|
int list_counter = 0;
|
||||||
rtvec return_vec = NULL_RTVEC;
|
rtvec return_vec = NULL_RTVEC;
|
||||||
|
rtx saved_rtx = NULL_RTX;
|
||||||
|
|
||||||
require_char_ws ('[');
|
require_char_ws ('[');
|
||||||
|
|
||||||
|
|
@ -1700,8 +1701,34 @@ rtx_reader::read_rtx_operand (rtx return_rtx, int idx)
|
||||||
if (c == EOF)
|
if (c == EOF)
|
||||||
fatal_expected_char (']', c);
|
fatal_expected_char (']', c);
|
||||||
unread_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)
|
if (list_counter > 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -284,6 +284,29 @@ const_poly_int_tests<N>::run ()
|
||||||
gen_int_mode (poly_int64 (5, -1), QImode));
|
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. */
|
/* Run all of the selftests within this file. */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -295,6 +318,7 @@ rtl_tests_c_tests ()
|
||||||
test_single_set ();
|
test_single_set ();
|
||||||
test_uncond_jump ();
|
test_uncond_jump ();
|
||||||
const_poly_int_tests<NUM_POLY_INT_COEFFS>::run ();
|
const_poly_int_tests<NUM_POLY_INT_COEFFS>::run ();
|
||||||
|
test_dumping_repeat ();
|
||||||
|
|
||||||
/* Purge state. */
|
/* Purge state. */
|
||||||
set_first_insn (NULL);
|
set_first_insn (NULL);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
2018-10-11 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR c++/87582
|
PR c++/87582
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue