diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-29 00:32:26 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-29 00:32:26 +0800 |
| commit | a2b81e7789e7c24cf802f104bf851c4cbc91c3a2 (patch) | |
| tree | 83112effe40c2121c03be1034e0ffc7ad1de69ed | |
| parent | 27f840d377d8288deb3ecf936cb70e246d7da162 (diff) | |
| download | rcc-project-a2b81e7789e7c24cf802f104bf851c4cbc91c3a2.tar.gz rcc-project-a2b81e7789e7c24cf802f104bf851c4cbc91c3a2.tar.xz | |
[RISCV] Reuse validated move registers
| -rw-r--r-- | backend/lib/Target/RISCV/RISCVMoveMerger.cpp | 14 |
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(); |
