diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-19 04:27:41 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-19 04:27:41 +0800 |
| commit | 307fc0961972ac5264d6f3459978fbec95cad3a9 (patch) | |
| tree | 80eff53db8f62a736a46221d258dcadf7543fa88 /backend/lib/CodeGen | |
| parent | 6a91664223881226e2b6186561c05ff378a19355 (diff) | |
| download | rcc-project-307fc0961972ac5264d6f3459978fbec95cad3a9.tar.gz rcc-project-307fc0961972ac5264d6f3459978fbec95cad3a9.tar.xz | |
[RISCV][GlobalISel] Select and expand global addresses
Diffstat (limited to 'backend/lib/CodeGen')
| -rw-r--r-- | backend/lib/CodeGen/MIRParser/MIParser.cpp | 5 | ||||
| -rw-r--r-- | backend/lib/CodeGen/MIRParser/MIRParser.cpp | 6 | ||||
| -rw-r--r-- | backend/lib/CodeGen/MachineOperand.cpp | 7 | ||||
| -rw-r--r-- | backend/lib/CodeGen/MachinePseudoExpansion.cpp | 37 |
4 files changed, 50 insertions, 5 deletions
diff --git a/backend/lib/CodeGen/MIRParser/MIParser.cpp b/backend/lib/CodeGen/MIRParser/MIParser.cpp index 62f1f14..b44701b 100644 --- a/backend/lib/CodeGen/MIRParser/MIParser.cpp +++ b/backend/lib/CodeGen/MIRParser/MIParser.cpp @@ -2290,7 +2290,10 @@ bool MIParser::Impl::parseOperand(bool IsDef, ParsedOperand &Result) { std::int64_t Offset = 0; if (parseOptionalOffset(Offset)) return true; - auto Created = MachineOperand::globalSymbol(Name, Offset, TargetFlags); + const GlobalValueProperties Properties = Context.GlobalValuePropertiesForName + ? Context.GlobalValuePropertiesForName(Name) + : GlobalValueProperties{}; + auto Created = MachineOperand::globalSymbol(Name, Offset, TargetFlags, Properties); if (!Created) return importError(OperandToken, Created.error()); Operand = std::move(*Created); diff --git a/backend/lib/CodeGen/MIRParser/MIRParser.cpp b/backend/lib/CodeGen/MIRParser/MIRParser.cpp index 3b89491..c7e92a0 100644 --- a/backend/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/backend/lib/CodeGen/MIRParser/MIRParser.cpp @@ -290,6 +290,12 @@ bool MIRDocumentParser::parseFunction(const yaml::Node &Root, MIRDocument &Docum return IRFunction->block(BlockName) != nullptr; }; } + if (Document.EmbeddedIR) { + const EmbeddedIRReferenceIndex *Embedded = &*Document.EmbeddedIR; + Context.GlobalValuePropertiesForName = [Embedded](std::string_view GlobalName) { + return Embedded->globalObjectProperties(GlobalName).value_or(GlobalValueProperties{}); + }; + } std::vector<PendingJumpTable> PendingJumpTables; if (parseFunctionScalars(Root, Function, DocumentInfo) || diff --git a/backend/lib/CodeGen/MachineOperand.cpp b/backend/lib/CodeGen/MachineOperand.cpp index 92b09dc..f265c3f 100644 --- a/backend/lib/CodeGen/MachineOperand.cpp +++ b/backend/lib/CodeGen/MachineOperand.cpp @@ -116,12 +116,13 @@ MachineOperand MachineOperand::jumpTable(JumpTableIndex Index, std::uint32_t Tar } Expected<MachineOperand> MachineOperand::globalSymbol(std::string Name, std::int64_t Offset, - std::uint32_t TargetFlags) { + std::uint32_t TargetFlags, + GlobalValueProperties Properties) { if (Name.empty()) { return makeUnexpected(ErrorCode::InvalidArgument, "global symbol operand name cannot be empty"); } - return MachineOperand(Kind::GlobalSymbol, GlobalSymbolOperand{std::move(Name), Offset}, - TargetFlags); + return MachineOperand(Kind::GlobalSymbol, + GlobalSymbolOperand{std::move(Name), Offset, Properties}, TargetFlags); } Expected<MachineOperand> MachineOperand::externalSymbol(std::string Name, std::int64_t Offset, diff --git a/backend/lib/CodeGen/MachinePseudoExpansion.cpp b/backend/lib/CodeGen/MachinePseudoExpansion.cpp index e3109ed..8388079 100644 --- a/backend/lib/CodeGen/MachinePseudoExpansion.cpp +++ b/backend/lib/CodeGen/MachinePseudoExpansion.cpp @@ -94,7 +94,8 @@ using BlockSizeSnapshot = std::vector<std::pair<MachineBlockStableID, std::uint6 return makeUnexpected(ErrorCode::PseudoExpansionFailed, "pseudo expansion changed CFG resources outside its owner contract"); } - if (Before.VirtualRegisterCount != After.VirtualRegisterCount) { + if (Phase != MachinePseudoExpansionPhase::PreRA && + Before.VirtualRegisterCount != After.VirtualRegisterCount) { return makeUnexpected(ErrorCode::PseudoExpansionFailed, "post-selection pseudo expansion created a virtual register"); } @@ -109,6 +110,8 @@ using BlockSizeSnapshot = std::vector<std::pair<MachineBlockStableID, std::uint6 [[nodiscard]] PseudoOwner ownerFor(MachinePseudoExpansionPhase Phase) noexcept { switch (Phase) { + case MachinePseudoExpansionPhase::PreRA: + return PseudoOwner::PreRAExpansion; case MachinePseudoExpansionPhase::PrePEI: return PseudoOwner::PrePEIExpansion; case MachinePseudoExpansionPhase::PostRA: @@ -137,6 +140,21 @@ using BlockSizeSnapshot = std::vector<std::pair<MachineBlockStableID, std::uint6 } [[nodiscard]] const MachinePassContract &phaseContract(MachinePseudoExpansionPhase Phase) { + static const MachinePassContract PreRA = [] { + MachinePassContract Value{ + .Name = "pre-ra-target-pseudo-expansion", + .Requires = {MachineFunctionProperty::Selected, MachineFunctionProperty::NoPHIs, + MachineFunctionProperty::TiedOpsRewritten}, + .Sets = {}, + .Clears = {}, + .RequiredAnalyses = {}, + .VerificationStage = PipelineStage::TiedOpsRewritten, + }; + Value.ThreadSafety = PassThreadSafety::ThreadSafe; + Value.DeclaredChanges = {MachinePassChange::Instructions, MachinePassChange::Operands, + MachinePassChange::Registers}; + return Value; + }(); static const MachinePassContract PrePEI = [] { MachinePassContract Value{ .Name = "pre-pei-target-pseudo-expansion", @@ -185,6 +203,8 @@ using BlockSizeSnapshot = std::vector<std::pair<MachineBlockStableID, std::uint6 return Value; }(); switch (Phase) { + case MachinePseudoExpansionPhase::PreRA: + return PreRA; case MachinePseudoExpansionPhase::PrePEI: return PrePEI; case MachinePseudoExpansionPhase::PostRA: @@ -402,6 +422,21 @@ runExpansionTransaction(MachineFunction &Function, const TargetDescription &Targ } // namespace +const MachinePassContract &PreRATargetPseudoExpansionPass::contract() const noexcept { + return phaseContract(MachinePseudoExpansionPhase::PreRA); +} + +Expected<MachinePassResult> +PreRATargetPseudoExpansionPass::run(MachineFunction &Function, const TargetDescription &Target, + MachineFunctionAnalysisManager &Analyses) { + if (!Function.properties().containsAll(contract().Requires)) { + return makeUnexpected(ErrorCode::VerificationError, + "pre-RA pseudo expansion requires selected SSA-exited MIR"); + } + return runExpansionTransaction(Function, Target, *Info, MachinePseudoExpansionPhase::PreRA, + nullptr, Analyses); +} + const MachinePassContract &PreparePostRAPseudosPass::contract() const noexcept { return preparationContract(); } |
