From 307fc0961972ac5264d6f3459978fbec95cad3a9 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Wed, 19 Aug 2026 04:27:41 +0800 Subject: [RISCV][GlobalISel] Select and expand global addresses --- backend/lib/CodeGen/MIRParser/MIParser.cpp | 5 +++- backend/lib/CodeGen/MIRParser/MIRParser.cpp | 6 +++++ backend/lib/CodeGen/MachineOperand.cpp | 7 ++--- backend/lib/CodeGen/MachinePseudoExpansion.cpp | 37 +++++++++++++++++++++++++- 4 files changed, 50 insertions(+), 5 deletions(-) (limited to 'backend/lib/CodeGen') 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 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::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::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 +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(); } -- cgit v1.2.3