+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,
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;
}
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
test_loading_cfg ();
test_loading_bb_index ();
test_loading_mem ();
+ test_loading_repeat ();
}
} // namespace selftest
struct obstack vector_stack;
int list_counter = 0;
rtvec return_vec = NULL_RTVEC;
+ rtx saved_rtx = NULL_RTX;
require_char_ws ('[');
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)
{
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
test_single_set ();
test_uncond_jump ();
const_poly_int_tests<NUM_POLY_INT_COEFFS>::run ();
+ test_dumping_repeat ();
/* Purge state. */
set_first_insn (NULL);
+2018-10-11 Andrew Stubbs <ams@codesourcery.com>
+
+ * selftests/repeat.rtl: New file.
+
2018-10-11 Jakub Jelinek <jakub@redhat.com>
PR c++/87582
--- /dev/null
+(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