aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-14 22:07:42 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-14 22:07:42 +0800
commit558485504773804d56f0552517dbe42722742741 (patch)
tree44d1b02c1bea4ad2617f7aa89796d24769089abf /backend/lib/CodeGen
parent9430569e0817c61d6fdaa37cf5cc35445f2f6289 (diff)
downloadrcc-project-558485504773804d56f0552517dbe42722742741.tar.gz
rcc-project-558485504773804d56f0552517dbe42722742741.tar.xz
[RISCV] Legalize va_copy intrinsics
Diffstat (limited to 'backend/lib/CodeGen')
-rw-r--r--backend/lib/CodeGen/GlobalISel/Legalizer.cpp33
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());