diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 20:03:59 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 20:03:59 +0800 |
| commit | 5b6ba4568cf6916a61ecde702f45246db8154b9f (patch) | |
| tree | e581672bd1f27bf68831ea5222d92a8e8337fcfe /backend/lib/CodeGen/GlobalISel/Legalizer.cpp | |
| parent | b5fb607fa3f54e791baf7ab39faf77d925dd53b7 (diff) | |
| download | rcc-project-5b6ba4568cf6916a61ecde702f45246db8154b9f.tar.gz rcc-project-5b6ba4568cf6916a61ecde702f45246db8154b9f.tar.xz | |
[RISCV][GlobalISel] Legalize floating-point remainder
Diffstat (limited to 'backend/lib/CodeGen/GlobalISel/Legalizer.cpp')
| -rw-r--r-- | backend/lib/CodeGen/GlobalISel/Legalizer.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/backend/lib/CodeGen/GlobalISel/Legalizer.cpp b/backend/lib/CodeGen/GlobalISel/Legalizer.cpp index 877777e..8f3f06f 100644 --- a/backend/lib/CodeGen/GlobalISel/Legalizer.cpp +++ b/backend/lib/CodeGen/GlobalISel/Legalizer.cpp @@ -258,6 +258,12 @@ const MachinePassContract &Legalizer::contract() const noexcept { Expected<MachinePassResult> Legalizer::run(MachineFunction &Function, const TargetDescription &Target, MachineFunctionAnalysisManager &Analyses) { + if (Function.properties().has(MachineFunctionProperty::FailedISel)) + return MachinePassResult{ + .Changed = false, + .Changes = {}, + .Preserved = PreservedAnalyses::all(), + }; if (Info == nullptr) return std::unexpected( passFailure("legalizer has no target behavior interface", ErrorCode::InvalidArgument)); @@ -265,6 +271,24 @@ Expected<MachinePassResult> Legalizer::run(MachineFunction &Function, if (!Required) return std::unexpected(Required.error()); + if (AbortMode != GlobalISelAbortMode::Enable) { + if (AbortMode != GlobalISelAbortMode::Disable && + AbortMode != GlobalISelAbortMode::DisableWithDiagnostic) { + return std::unexpected(passFailure("legalizer has an unknown GlobalISel abort mode", + ErrorCode::InvalidArgument)); + } + MachineActionReplay Actions(Analyses); + auto Result = runImplementation(Function, Target, Actions); + if (Result || Result.error().code() != ErrorCode::Unsupported) + return Result; + Function.properties().set(MachineFunctionProperty::FailedISel); + return MachinePassResult{ + .Changed = true, + .Changes = {MachinePassChange::Instructions}, + .Preserved = PreservedAnalyses::none(), + }; + } + auto Trial = cloneMachineFunction( Function, Target, MachineFunctionCloneOptions{.NewStableID = Function.stableID(), .NewName = std::nullopt}); |
