diff options
author | Luke Lau <luke@igalia.com> | 2025-10-04 18:50:44 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-10-04 22:50:44 +0000 |
commit | 795a115d1919966df72079eb3bd82699bfb2fa58 (patch) | |
tree | 9fa3f529fbce3dfddcfd0aee52e90649b518980e /llvm/unittests/Object/BuildIDTest.cpp | |
parent | 24c1bb60e321c16cb8247b45b080b2d5e02a2b31 (diff) | |
download | llvm-795a115d1919966df72079eb3bd82699bfb2fa58.zip llvm-795a115d1919966df72079eb3bd82699bfb2fa58.tar.gz llvm-795a115d1919966df72079eb3bd82699bfb2fa58.tar.bz2 |
[RegAlloc] Remove default restriction on non-trivial rematerialization (#159211)
In the register allocator we define non-trivial rematerialization as the
rematerlization of an instruction with virtual register uses.
We have been able to perform non-trivial rematerialization for a while,
but it has been prevented by default unless specifically overriden by
the target in `TargetTransformInfo::isReMaterializableImpl`. The
original reasoning for this given by the comment in the default
implementation is because we might increase a live range of the virtual
register, but we don't actually do this.
LiveRangeEdit::allUsesAvailableAt makes sure that we only rematerialize
instructions whose virtual registers are already live at the use sites.
https://reviews.llvm.org/D106408 had originally tried to remove this
restriction but it was reverted after some performance regressions were
reported. We think it is likely that the regressions were caused by the
fact that the old isTriviallyReMaterializable API sometimes returned
true for non-trivial rematerializations.
However https://github.com/llvm/llvm-project/pull/160377 recently split
the API out into a separate non-trivial and trivial version and updated
the call-sites accordingly, and
https://github.com/llvm/llvm-project/pull/160709 and #159180 fixed
heuristics which weren't accounting for the difference between
non-trivial and trivial.
With these fixes in place, this patch proposes to again allow
non-trivial rematerialization by default which reduces a significant
amount of spills and reloads across various targets.
For llvm-test-suite built with -O3 -flto, we get the following geomean
reduction in reloads:
- arm64-apple-darwin: 11.6%
- riscv64-linux-gnu: 8.1%
- x86_64-linux-gnu: 6.5%
Diffstat (limited to 'llvm/unittests/Object/BuildIDTest.cpp')
0 files changed, 0 insertions, 0 deletions