Add more vec_duplicate simplifications

Programming / Compilers / GCC - rsandifo [138bc75d-0d04-0410-961f-82ee72b054a4] - 1 November 2017 09:41 EDT

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.

The best way of testing the new simplifications seemed to be
via selftests. The patch cribs part of David's patch here: .

2017-11-01 Richard Sandiford David Malcolm Alan Hayward David Sherwood

- 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.

98d31d3a185 Add more vec_duplicate simplifications
gcc/ChangeLog | 19 +++++
gcc/rtl.h | 15 ++++
gcc/selftest-rtl.c | 23 ++++++
gcc/selftest-rtl.h | 9 +++
gcc/selftest-run-tests.c | 1 +
gcc/selftest.h | 1 +
gcc/simplify-rtx.c | 201 +++++++++++++++++++++++++++++++++++++++++++++--
7 files changed, 264 insertions(+), 5 deletions(-)


  • Share