]> git.ipfire.org Git - thirdparty/gcc.git/commit
aarch64: Don't record hazards against paired insns [PR113356]
authorAlex Coplan <alex.coplan@arm.com>
Mon, 15 Jan 2024 11:07:48 +0000 (11:07 +0000)
committerAlex Coplan <alex.coplan@arm.com>
Tue, 23 Jan 2024 16:49:13 +0000 (16:49 +0000)
commit639ae543449a8d6525303458497bd4b897660ec3
tree97d4f1a88c4dd92473e03c57994905729c41f33c
parent0ad6908f6a9e4e04d2dfb1ef1d6644e28d5a65ae
aarch64: Don't record hazards against paired insns [PR113356]

For the testcase in the PR, we try to pair insns where the first has
writeback and the second uses the updated base register.  This causes us
to record a hazard against the second insn, thus narrowing the move
range away from the end of the BB.

However, it isn't meaningful to record hazards against the other insn
in the pair, as this doesn't change which pairs can be formed, and also
doesn't change where the pair is formed (from the perspective of
nondebug insns).

To see why this is the case, consider the two cases:

 - Suppoe we are finding hazards for insns[0].  If we record a hazard
   against insns[1], then range.last becomes
   insns[1]->prev_nondebug_insn (), but note that this is equivalent to
   inserting after insns[1] (since insns[1] is being changed).
 - Now consider finding hazards for insns[1].  Suppose we record
   insns[0] as a hazard.  Then we set range.first = insns[0], which is a
   no-op.

As such, it seems better to never record hazards against the other insn
in the pair, as we check whether the insns themselves are suitable for
combination separately (e.g. for ldp checking that they use distinct
transfer registers).  Avoiding unnecessarily narrowing the move range
avoids unnecessarily re-ordering over debug insns.

This should also mean that we can only narrow the move range away from
the end of the BB in the case that we record a hazard for insns[0]
against insns[1]->prev_nondebug_insn () or earlier.  This means that for
the non-call-exceptions case, either the move range includes insns[1],
or we reject the pair (thus the assert tripped in the PR should always
hold).

gcc/ChangeLog:

PR target/113356
* config/aarch64/aarch64-ldp-fusion.cc (ldp_bb_info::try_fuse_pair):
Don't record hazards against the opposite insn in the pair.

gcc/testsuite/ChangeLog:

PR target/113356
* gcc.target/aarch64/pr113356.C: New test.
gcc/config/aarch64/aarch64-ldp-fusion.cc
gcc/testsuite/gcc.target/aarch64/pr113356.C [new file with mode: 0644]