On 10/23/2017 05:17 AM, Richard Sandiford wrote: > This patch adds a vec_duplicate_p helper that tests for constant > or non-constant vector duplicates. Together with the existing > const_vec_duplicate_p, this complements the gen_vec_duplicate > and gen_const_vec_duplicate added by a previous patch. > > The patch uses the new routines to add more rtx simplifications > involving vector duplicates. These mirror simplifications that > we already do for CONST_VECTOR broadcasts and are needed for > variable-length SVE, which uses: > > (const:M (vec_duplicate:M X)) > > to represent constant broadcasts instead. The simplifications do > trigger on the testsuite for variable duplicates too, and in each > case I saw the change was an improvement. E.g.: > [ snip ]
> > The best way of testing the new simplifications seemed to be > via selftests. The patch cribs part of David's patch here: > https://gcc.gnu.org/ml/gcc-patches/2016-07/msg00270.html . Cool. I really wish I had more time to promote David's work by adding selftests to various things. There's certainly cases where it's the most direct and useful way to test certain bits of lower level infrastructure we have. Glad to see you found it useful here. > > > 2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> > David Malcolm <dmalc...@redhat.com> > Alan Hayward <alan.hayw...@arm.com> > David Sherwood <david.sherw...@arm.com> > > gcc/ > * rtl.h (vec_duplicate_p): New function. > * selftest-rtl.c (assert_rtx_eq_at): New function. > * selftest-rtl.h (ASSERT_RTX_EQ): New macro. > (assert_rtx_eq_at): Declare. > * selftest.h (selftest::simplify_rtx_c_tests): Declare. > * selftest-run-tests.c (selftest::run_tests): Call it. > * simplify-rtx.c: Include selftest.h and selftest-rtl.h. > (simplify_unary_operation_1): Recursively handle vector duplicates. > (simplify_binary_operation_1): Likewise. Handle VEC_SELECTs of > vector duplicates. > (simplify_subreg): Handle subregs of vector duplicates. > (make_test_reg, test_vector_ops_duplicate, test_vector_ops) > (selftest::simplify_rtx_c_tests): New functions. Thanks for the examples of how this affects various targets. Seems like it ought to be a consistent win when they trigger. jeff