]> git.ipfire.org Git - thirdparty/gcc.git/commit
aarch64: Don't include vec_select high-half in SIMD subtract cost
authorJonathan Wright <jonathan.wright@arm.com>
Wed, 28 Jul 2021 16:45:36 +0000 (17:45 +0100)
committerJonathan Wright <jonathan.wright@arm.com>
Thu, 5 Aug 2021 10:52:13 +0000 (11:52 +0100)
commit0c3aab7f2a394b69a0cfd4852e33f11d9eb7e737
tree14bc4fe5016ee5661f51deac402500bf5fc94b53
parent8cd27a3b25558e5be7f8595fc1c828bc46641671
aarch64: Don't include vec_select high-half in SIMD subtract cost

The Neon subtract-long/subract-widen instructions can select the top
or bottom half of the operand registers. This selection does not
change the cost of the underlying instruction and this should be
reflected by the RTL cost function.

This patch adds RTL tree traversal in the Neon subtract cost function
to match vec_select high-half of its operands. This traversal
prevents the cost of the vec_select from being added into the cost of
the subtract - meaning that these instructions can now be emitted in
the combine pass as they are no longer deemed prohibitively
expensive.

gcc/ChangeLog:

2021-07-28  Jonathan Wright  <jonathan.wright@arm.com>

* config/aarch64/aarch64.c: Traverse RTL tree to prevent cost
of vec_select high-half from being added into Neon subtract
cost.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/vsubX_high_cost.c: New test.
gcc/config/aarch64/aarch64.c
gcc/testsuite/gcc.target/aarch64/vsubX_high_cost.c [new file with mode: 0644]