diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-14 22:07:42 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-14 22:07:42 +0800 |
| commit | 558485504773804d56f0552517dbe42722742741 (patch) | |
| tree | 44d1b02c1bea4ad2617f7aa89796d24769089abf /backend/lib/CodeGen/GlobalISel/Legalizer.cpp | |
| parent | 9430569e0817c61d6fdaa37cf5cc35445f2f6289 (diff) | |
| download | rcc-project-558485504773804d56f0552517dbe42722742741.tar.gz rcc-project-558485504773804d56f0552517dbe42722742741.tar.xz | |
[RISCV] Legalize va_copy intrinsics
Diffstat (limited to 'backend/lib/CodeGen/GlobalISel/Legalizer.cpp')
| -rw-r--r-- | backend/lib/CodeGen/GlobalISel/Legalizer.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/backend/lib/CodeGen/GlobalISel/Legalizer.cpp b/backend/lib/CodeGen/GlobalISel/Legalizer.cpp index c749039..dfa4523 100644 --- a/backend/lib/CodeGen/GlobalISel/Legalizer.cpp +++ b/backend/lib/CodeGen/GlobalISel/Legalizer.cpp @@ -70,6 +70,18 @@ namespace { } } +[[nodiscard]] bool isIntrinsicOpcode(Opcode InstructionOpcode) noexcept { + switch (static_cast<GenericOpcode>(InstructionOpcode.value())) { + default: + return false; + case GenericOpcode::G_INTRINSIC: + case GenericOpcode::G_INTRINSIC_W_SIDE_EFFECTS: + case GenericOpcode::G_INTRINSIC_CONVERGENT: + case GenericOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS: + return true; + } +} + using InstList = GISelWorkList<256>; using ArtifactList = GISelWorkList<128>; @@ -329,6 +341,27 @@ Expected<MachinePassResult> Legalizer::runImplementation(MachineFunction &Functi withErrorContext(Validation.error(), "legalizer input is invalid: ")); } + if (isIntrinsicOpcode(Instruction->opcode())) { + auto Accepted = Actions.request("legalize.intrinsic", Function, Instruction->stableID()); + if (!Accepted) + return std::unexpected(Accepted.error()); + if (!*Accepted) + return std::unexpected(passFailure("required intrinsic legalization action was rejected", + ErrorCode::VerificationError)); + auto IntrinsicResult = Info->legalizeIntrinsic(Helper, *Instruction); + if (!IntrinsicResult) + return std::unexpected(IntrinsicResult.error()); + if (!*IntrinsicResult) { + const std::string_view Name = Descriptor->Name; + return std::unexpected(passFailure("target legalizer rejected intrinsic instruction '" + + std::string(Name) + "'", + ErrorCode::Unsupported)); + } + Result.Changed = true; + Result.Changes.add(MachinePassChange::Instructions); + continue; + } + auto Decision = Info->getDecision(*Instruction, Function, Target); if (!Decision) return std::unexpected(Decision.error()); |
