From 103299abab6922f450671baa76e34ad746ac4312 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Mon, 17 Aug 2026 02:46:40 +0800 Subject: [RISCV][GlobalISel] Constrain core copies during selection --- .../lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'backend/lib/Target') diff --git a/backend/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp b/backend/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp index 898b366..bd46144 100644 --- a/backend/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp +++ b/backend/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp @@ -421,6 +421,8 @@ public: return std::unexpected(Generated.error()); if (*Generated) return {}; + if (Instruction.opcode() == opcode(GenericOpcode::COPY)) + return selectCopy(Instruction, Function, Target); auto Match = canSelect(Instruction, Function, Target); if (!Match) return std::unexpected(Match.error()); @@ -514,6 +516,19 @@ public: } private: + [[nodiscard]] Expected selectCopy(MachineInstr &Instruction, MachineFunction &Function, + const TargetDescription &Target) const { + const MachineOperand *DestinationOperand = Instruction.operandAt(0); + const Register *Destination = + DestinationOperand == nullptr ? nullptr : DestinationOperand->getIf(); + if (Destination == nullptr) + return makeUnexpected(ErrorCode::VerificationError, + "RISC-V COPY selection requires a register destination"); + if (!Destination->isVirtual()) + return {}; + return RegisterBanks.constrainRegister(Function, *Destination, Target); + } + [[nodiscard]] Expected createTemporary(MachineFunction &Function, LowLevelType Type, const TargetDescription &Target, std::optional Bank = std::nullopt) const { -- cgit v1.2.3