Optimise constant IFN_WHILE_ULTs

Programming / Compilers / GCC - rsandifo [138bc75d-0d04-0410-961f-82ee72b054a4] - 13 August 2019 21:33 EDT

This patch is a combination of two changes that have to be committed as a single unit:

(1) Try to fold IFN_WHILE_ULTs with constant arguments to a VECTOR_CST (which is always possible for fixed-length vectors but is not necessarily so for variable-length vectors)

(2) Make the SVE port recognise constants that map to PTRUE VLn, which includes those generated by the new fold.

(2) can't be tested without (1) and (1) would be a significant pessimisation without (2).

The target-specific parts also start moving towards doing predicate manipulation in a canonical VNx16BImode form, using rtx_vector_builders.

2019-08-13 Richard Sandiford

gcc/
- tree.h (build_vector_a_then_b): Declare.
- tree.c (build_vector_a_then_b): New function.
- fold-const-call.c (fold_while_ult): Likewise. (fold_const_call): Use it to handle IFN_WHILE_ULT.
- config/aarch64/aarch64-protos.h (AARCH64_FOR_SVPATTERN): New macro. (aarch64_svpattern): New enum.
- config/aarch64/aarch64-sve.md (mov): Pass constants through aarch64_expand_mov_immediate. (*aarch64_sve_mov): Use aarch64_mov_operand rather than general_operand as the predicate for operand 1. (while_ult): Add a '@' marker.
- config/aarch64/aarch64.c (simd_immediate_info::PTRUE): New insn_type. (simd_immediate_info::simd_immediate_info): New overload that takes a scalar_int_mode and an svpattern. (simd_immediate_info::u): Add a "pattern" field. (svpattern_token): New function. (aarch64_get_sve_pred_bits, aarch64_widest_sve_pred_elt_size) (aarch64_partial_ptrue_length, aarch64_svpattern_for_vl) (aarch64_sve_move_pred_via_while): New functions. (aarch64_expand_mov_immediate): Try using aarch64_sve_move_pred_via_while for predicates that contain N ones followed by M zeros but that do not correspond to a VLnnn pattern. (aarch64_sve_pred_valid_immediate): New function. (aarch64_simd_valid_immediate): Use it instead of dealing directly with PTRUE and PFALSE. (aarch64_output_sve_mov_immediate): Handle new simd_immediate_info forms.

gcc/testsuite/
- gcc.target/aarch64/sve/spill_2.c: Increase iteration counts beyond the range of a PTRUE.
- gcc.target/aarch64/sve/while_6.c: New test.
- gcc.target/aarch64/sve/while_7.c: Likewise.
- gcc.target/aarch64/sve/while_8.c: Likewise.
- gcc.target/aarch64/sve/while_9.c: Likewise.
- gcc.target/aarch64/sve/while_10.c: Likewise.

aa1412f5628 Optimise constant IFN_WHILE_ULTs
gcc/ChangeLog | 31 +++
gcc/config/aarch64/aarch64-protos.h | 27 +++
gcc/config/aarch64/aarch64-sve.md | 10 +-
gcc/config/aarch64/aarch64.c | 275 ++++++++++++++++++++++--
gcc/fold-const-call.c | 38 ++++
gcc/testsuite/ChangeLog | 10 +
gcc/testsuite/gcc.target/aarch64/sve/spill_2.c | 17 +-
gcc/testsuite/gcc.target/aarch64/sve/while_10.c | 25 +++
gcc/testsuite/gcc.target/aarch64/sve/while_6.c | 25 +++
gcc/testsuite/gcc.target/aarch64/sve/while_7.c | 25 +++
gcc/testsuite/gcc.target/aarch64/sve/while_8.c | 25 +++
gcc/testsuite/gcc.target/aarch64/sve/while_9.c | 25 +++
gcc/tree.c | 17 ++
gcc/tree.h | 1 +
14 files changed, 518 insertions(+), 33 deletions(-)

Upstream: gcc.gnu.org


  • Share