From 8b797159e6c8fe1294fd2d26de3bd0992c61ea24 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Tue, 11 Aug 2026 19:54:56 +0800 Subject: [RISCV] Use canonical copies for full ABI values --- backend/lib/Target/RISCV/RISCVCallLowering.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'backend/lib/Target/RISCV') diff --git a/backend/lib/Target/RISCV/RISCVCallLowering.cpp b/backend/lib/Target/RISCV/RISCVCallLowering.cpp index ec794bc..fd01d52 100644 --- a/backend/lib/Target/RISCV/RISCVCallLowering.cpp +++ b/backend/lib/Target/RISCV/RISCVCallLowering.cpp @@ -2,6 +2,7 @@ #include "rcc/Target/RISCV/RISCVCallLowering.h" +#include "rcc/CodeGen/GenericOpcodes.h" #include "rcc/CodeGen/MachineBasicBlock.h" #include "rcc/CodeGen/MachineFrameInfo.h" #include "rcc/CodeGen/MachineFunction.h" @@ -777,7 +778,10 @@ createMemoryOperand(MachineFunction &Function, MemoryAccessFlags Accesses, std:: [[nodiscard]] Expected emitCCCopy(MachineIRBuilder &Builder, Register Destination, Register Source, CallValueTransform Transform) { - auto Instruction = Builder.buildInstr(targetOpcode(InstructionOpcode::PseudoCC_COPY)); + const Opcode CopyOpcode = Transform == CallValueTransform::Full + ? opcode(GenericOpcode::COPY) + : targetOpcode(InstructionOpcode::PseudoCC_COPY); + auto Instruction = Builder.buildInstr(CopyOpcode); if (!Instruction) return std::unexpected(Instruction.error()); auto Def = Instruction->addDef(Destination); @@ -786,9 +790,11 @@ createMemoryOperand(MachineFunction &Function, MemoryAccessFlags Accesses, std:: auto Use = Instruction->addUse(Source); if (!Use) return std::unexpected(Use.error()); - auto Action = Instruction->addImmediate(static_cast(Transform)); - if (!Action) - return std::unexpected(Action.error()); + if (Transform != CallValueTransform::Full) { + auto Action = Instruction->addImmediate(static_cast(Transform)); + if (!Action) + return std::unexpected(Action.error()); + } auto Built = Instruction->build(); if (!Built) return std::unexpected(Built.error()); -- cgit v1.2.3