aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'backend/lib/CodeGen')
-rw-r--r--backend/lib/CodeGen/MIRParser/MIParser.cpp5
-rw-r--r--backend/lib/CodeGen/MIRParser/MIRParser.cpp6
-rw-r--r--backend/lib/CodeGen/MachineOperand.cpp7
-rw-r--r--backend/lib/CodeGen/MachinePseudoExpansion.cpp37
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();
}