[llvm] 3822ac9 - [MCA][RegisterFile] Fix register class check for move elimination (PR50265)

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Fri May 7 13:38:43 PDT 2021


Thank you!

On Fri, May 7, 2021 at 11:30 PM Andrea Di Biagio via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
>
> Author: Andrea Di Biagio
> Date: 2021-05-07T21:30:25+01:00
> New Revision: 3822ac909ead8f41ebc81e382bb01908bf04f407
>
> URL: https://github.com/llvm/llvm-project/commit/3822ac909ead8f41ebc81e382bb01908bf04f407
> DIFF: https://github.com/llvm/llvm-project/commit/3822ac909ead8f41ebc81e382bb01908bf04f407.diff
>
> LOG: [MCA][RegisterFile] Fix register class check for move elimination (PR50265)
>
> The register file should always check if the destination register is from a
> register class that allows move elimination.
>
> Before this change, the check on the register class was only performed in a few
> very specific cases. However, it should have always been performed.
> This patch fixes the issue.
>
> Note that none of the upstream scheduling models is currently affected by this
> bug, so there is no test for it. The issue was found by Roman while working on
> the znver3 model. I was able to reproduce the issue locally by tweaking the
> btver2 model. I then verified that this patch fixes the issue.
>
> Added:
>
>
> Modified:
>     llvm/lib/MCA/HardwareUnits/RegisterFile.cpp
>
> Removed:
>
>
>
> ################################################################################
> diff  --git a/llvm/lib/MCA/HardwareUnits/RegisterFile.cpp b/llvm/lib/MCA/HardwareUnits/RegisterFile.cpp
> index a48915dbed735..e88ee0f0ff26e 100644
> --- a/llvm/lib/MCA/HardwareUnits/RegisterFile.cpp
> +++ b/llvm/lib/MCA/HardwareUnits/RegisterFile.cpp
> @@ -364,6 +364,11 @@ bool RegisterFile::tryEliminateMove(WriteState &WS, ReadState &RS) {
>    if (RegisterFileIndex != RRITo.IndexPlusCost.first)
>      return false;
>
> +  // Early exit if the destination register is from a register class that
> +  // doesn't allow move elimination.
> +  if (!RegisterMappings[RRITo.RenameAs].second.AllowMoveElimination)
> +    return false;
> +
>    // We only allow move elimination for writes that update a full physical
>    // register. On X86, move elimination is possible with 32-bit general purpose
>    // registers because writes to those registers are not partial writes.  If a
> @@ -379,9 +384,6 @@ bool RegisterFile::tryEliminateMove(WriteState &WS, ReadState &RS) {
>    // that allow move elimination, and how those same registers are renamed in
>    // hardware.
>    if (RRITo.RenameAs && RRITo.RenameAs != WS.getRegisterID()) {
> -    // Early exit if the PRF doesn't support move elimination for this register.
> -    if (!RegisterMappings[RRITo.RenameAs].second.AllowMoveElimination)
> -      return false;
>      if (!WS.clearsSuperRegisters())
>        return false;
>    }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list