aarch64: Fix PR99437 - tighten shift predicates for narrowing shift patterns
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Mon, 8 Mar 2021 15:05:21 +0000 (15:05 +0000)
committerKyrylo Tkachov <kyrylo.tkachov@arm.com>
Mon, 8 Mar 2021 15:05:21 +0000 (15:05 +0000)
commit0d9a70ea3881c284b7689b691d54d047b55b486d
treeddc84555a643c6880d9a59687a1f70b22655a147
parent81fee438512460f1be50d91ee5de452f8fe5cc18
aarch64: Fix PR99437 - tighten shift predicates for narrowing shift patterns

In this bug combine forms the (R)SHRN(2) instructions with an invalid shift amount.
The intrinsic expanders for these patterns validate the right shift amount but if the
final patterns end up being matched by combine (or other RTL passes I suppose) they
still let the wrong const_vector through.

This patch tightens up the predicates for the instructions involved by using predicates
for the right shift amount const_vectors.

gcc/ChangeLog:

PR target/99437
* config/aarch64/predicates.md (aarch64_simd_shift_imm_vec_qi): Define.
(aarch64_simd_shift_imm_vec_hi): Likewise.
(aarch64_simd_shift_imm_vec_si): Likewise.
(aarch64_simd_shift_imm_vec_di): Likewise.
* config/aarch64/aarch64-simd.md (aarch64_shrn<mode>_insn_le): Use
predicate from above.
(aarch64_shrn<mode>_insn_be): Likewise.
(aarch64_rshrn<mode>_insn_le): Likewise.
(aarch64_rshrn<mode>_insn_be): Likewise.
(aarch64_shrn2<mode>_insn_le): Likewise.
(aarch64_shrn2<mode>_insn_be): Likewise.
(aarch64_rshrn2<mode>_insn_le): Likewise.
(aarch64_rshrn2<mode>_insn_be): Likewise.

gcc/testsuite/ChangeLog:

PR target/99437
* gcc.target/aarch64/simd/pr99437.c: New test.
gcc/config/aarch64/aarch64-simd.md
gcc/config/aarch64/predicates.md
gcc/testsuite/gcc.target/aarch64/simd/pr99437.c [new file with mode: 0644]