aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-29 00:32:26 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-29 00:32:26 +0800
commita2b81e7789e7c24cf802f104bf851c4cbc91c3a2 (patch)
tree83112effe40c2121c03be1034e0ffc7ad1de69ed
parent27f840d377d8288deb3ecf936cb70e246d7da162 (diff)
downloadrcc-project-a2b81e7789e7c24cf802f104bf851c4cbc91c3a2.tar.gz
rcc-project-a2b81e7789e7c24cf802f104bf851c4cbc91c3a2.tar.xz
[RISCV] Reuse validated move registers
-rw-r--r--backend/lib/Target/RISCV/RISCVMoveMerger.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/backend/lib/Target/RISCV/RISCVMoveMerger.cpp b/backend/lib/Target/RISCV/RISCVMoveMerger.cpp
index 1e68187..1eb4b43 100644
--- a/backend/lib/Target/RISCV/RISCVMoveMerger.cpp
+++ b/backend/lib/Target/RISCV/RISCVMoveMerger.cpp
@@ -161,6 +161,10 @@ struct CopyOperands final {
MoveFromSavedToArgument ? FirstCopy->Source : FirstCopy->Destination;
MachineOperand *SecondOperand =
MoveFromSavedToArgument ? SecondCopy->Source : SecondCopy->Destination;
+ Register FirstRegister =
+ MoveFromSavedToArgument ? FirstCopy->SourceRegister : FirstCopy->DestinationRegister;
+ Register SecondRegister =
+ MoveFromSavedToArgument ? SecondCopy->SourceRegister : SecondCopy->DestinationRegister;
RegisterOperandFlags PairedSourceFlags = SecondCopy->Source->registerFlags();
if (MoveFromSavedToArgument && PairedSourceFlags.has(RegisterOperandFlag::Kill)) {
auto ReadBetween = isReadBetween(First, Second, SecondCopy->SourcePhysical, Target);
@@ -172,6 +176,7 @@ struct CopyOperands final {
if (MoveFromSavedToArgument ? !isRegister(FirstCopy->DestinationPhysical, PhysicalRegisterID::X10)
: !isRegister(FirstCopy->SourcePhysical, PhysicalRegisterID::X10)) {
std::swap(FirstOperand, SecondOperand);
+ std::swap(FirstRegister, SecondRegister);
}
const RegisterOperandFlags FirstFlags =
@@ -192,13 +197,12 @@ struct CopyOperands final {
if (auto Location = Pending->setDebugLocation(*First.debugLocation()); !Location)
return std::unexpected(Location.error());
}
- Expected<void> Added = MoveFromSavedToArgument
- ? Pending->addUse(*FirstOperand->registerValue(), FirstFlags)
- : Pending->addDef(*FirstOperand->registerValue(), FirstFlags);
+ Expected<void> Added = MoveFromSavedToArgument ? Pending->addUse(FirstRegister, FirstFlags)
+ : Pending->addDef(FirstRegister, FirstFlags);
if (!Added)
return std::unexpected(Added.error());
- Added = MoveFromSavedToArgument ? Pending->addUse(*SecondOperand->registerValue(), SecondFlags)
- : Pending->addDef(*SecondOperand->registerValue(), SecondFlags);
+ Added = MoveFromSavedToArgument ? Pending->addUse(SecondRegister, SecondFlags)
+ : Pending->addDef(SecondRegister, SecondFlags);
if (!Added)
return std::unexpected(Added.error());
return Pending->build();