40 !std::getenv(
"JLM_DISABLE_NON_REENTRANT_ALLOCA_BLOCKLIST");
48 !std::getenv(
"JLM_DISABLE_OPERATION_SIZE_BLOCKING");
55 !std::getenv(
"JLM_DISABLE_CONSTANT_MEMORY_BLOCKING");
181 static std::unique_ptr<Statistics>
184 return std::make_unique<Statistics>(rvsdgModule, pointsToGraph);
249 return ModRefSets_[index].GetMemoryNodes().insert(ptgNode);
280 const auto it =
NodeMap_.find(&node);
337 [[nodiscard]]
static std::unique_ptr<RegionAwareModRefSummary>
340 return std::make_unique<RegionAwareModRefSummary>(pointsToGraph);
356 std::unordered_map<const rvsdg::Node *, ModRefSetIndex>
NodeMap_;
435 std::unordered_map<const rvsdg::Region *, util::HashSet<PointsToGraph::NodeIndex>>
458 std::unordered_map<ModRefSetIndex, const util::HashSet<PointsToGraph::NodeIndex> *>
468 const rvsdg::RvsdgModule & rvsdgModule,
470 util::StatisticsCollector & statisticsCollector)
473 Context_ = std::make_unique<Context>(pointsToGraph);
474 auto statistics = Statistics::Create(rvsdgModule, pointsToGraph);
476 statistics->startCallGraphStatistics();
477 createCallGraph(rvsdgModule);
478 statistics->stopCallGraphStatistics(
479 Context_->SccFunctions.size(),
480 Context_->FunctionsCallingSetjmp.Size());
482 statistics->StartAllocasDeadInSccStatistics();
483 FindAllocasDeadInSccs();
484 statistics->StopAllocasDeadInSccStatistics();
486 statistics->StartCreateSimpleAllocasSetStatistics();
487 Context_->SimpleAllocas = CreateSimpleAllocaSet(pointsToGraph);
488 statistics->StopCreateSimpleAllocasSetStatistics(Context_->SimpleAllocas.Size());
490 statistics->StartCreateNonReentrantAllocaSetsStatistics();
491 auto numNonReentrantAllocas = CreateNonReentrantAllocaSets();
492 statistics->StopCreateNonReentrantAllocaSetsStatistics(numNonReentrantAllocas);
494 statistics->StartCreateExternalModRefSet();
495 CreateExternalModRefSet();
496 statistics->StopCreateExternalModRefSet();
498 statistics->StartAnnotationStatistics();
500 for (
const auto & scc : Context_->SccFunctions)
502 for (
const auto lambda : scc.Items())
504 AnnotateFunction(*lambda);
507 statistics->StopAnnotationStatistics();
509 statistics->StartSolvingStatistics();
510 SolveModRefSetConstraintGraph();
511 statistics->StopSolvingStatistics();
521 statisticsCollector.CollectDemandedStatistics(std::move(statistics));
523 return std::move(ModRefSummary_);
531 static std::vector<const rvsdg::LambdaNode *>
534 std::vector<const rvsdg::LambdaNode *> result;
537 const std::function<void(
rvsdg::Region &)> CollectLambdasInRegion =
540 for (
auto & node : region.Nodes())
544 result.push_back(lambda);
548 for (
size_t i = 0; i < structural->nsubregions(); i++)
550 CollectLambdasInRegion(*structural->subregion(i));
564 const auto & pointsToGraph =
Context_->pointsToGraph;
570 std::unordered_map<const rvsdg::LambdaNode *, size_t> callGraphNodeIndex;
571 callGraphNodeIndex.reserve(lambdaNodes.size());
572 for (
size_t i = 0; i < lambdaNodes.size(); i++)
574 callGraphNodeIndex.insert({ lambdaNodes[i], i });
578 const auto externalNodeIndex = lambdaNodes.size();
579 const auto numCallGraphNodes = externalNodeIndex + 1;
582 std::vector<util::HashSet<size_t>> callGraphSuccessors(numCallGraphNodes);
585 const auto handleCall = [&](
const rvsdg::SimpleNode & callNode,
size_t callerIndex) ->
void
588 if (classification->isSetjmpCall())
590 Context_->FunctionsCallingSetjmp.insert(lambdaNodes[callerIndex]);
595 const auto targetPtgNode = pointsToGraph.getNodeForRegister(*target);
598 for (
const auto calleePtgNode : pointsToGraph.getExplicitTargets(targetPtgNode).Items())
600 const auto kind = pointsToGraph.getNodeKind(calleePtgNode);
603 const auto & lambdaNode = pointsToGraph.getLambdaForNode(calleePtgNode);
606 JLM_ASSERT(callGraphNodeIndex.find(&lambdaNode) != callGraphNodeIndex.end());
607 const auto calleeCallGraphNode = callGraphNodeIndex[&lambdaNode];
610 callGraphSuccessors[callerIndex].insert(calleeCallGraphNode);
615 callGraphSuccessors[callerIndex].insert(externalNodeIndex);
619 if (pointsToGraph.isTargetingAllExternallyAvailable(targetPtgNode))
622 callGraphSuccessors[callerIndex].insert(externalNodeIndex);
627 const std::function<void(
const rvsdg::Region &,
size_t)> handleCalls =
628 [&](
const rvsdg::Region & region,
size_t callerIndex) ->
void
630 for (
auto & node : region.
Nodes())
632 if (
const auto [callNode, callOp] = rvsdg::TryGetSimpleNodeAndOptionalOp<CallOperation>(node);
635 handleCall(*callNode, callerIndex);
642 for (
auto & subregion : structural.
Subregions())
644 handleCalls(subregion, callerIndex);
651 for (
size_t i = 0; i < lambdaNodes.size(); i++)
653 handleCalls(*lambdaNodes[i]->subregion(), i);
656 if (pointsToGraph.isExternallyAvailable(pointsToGraph.getNodeForLambda(*lambdaNodes[i])))
658 callGraphSuccessors[externalNodeIndex].insert(i);
663 callGraphSuccessors[externalNodeIndex].insert(externalNodeIndex);
666 const auto getSuccessors = [&](
size_t nodeIndex)
668 return callGraphSuccessors[nodeIndex].Items();
672 std::vector<size_t> sccIndex;
673 std::vector<size_t> reverseTopologicalOrder;
674 auto numSCCs = util::FindStronglyConnectedComponents<size_t>(
678 reverseTopologicalOrder);
682 Context_->SccFunctions.resize(numSCCs);
683 for (
size_t i = 0; i < lambdaNodes.size(); i++)
685 Context_->SccFunctions[sccIndex[i]].insert(lambdaNodes[i]);
686 Context_->FunctionToSccIndex[lambdaNodes[i]] = sccIndex[i];
690 Context_->SccCallTargets.resize(numSCCs);
691 for (
size_t i = 0; i < numCallGraphNodes; i++)
693 for (
auto target : callGraphSuccessors[i].Items())
695 Context_->SccCallTargets[sccIndex[i]].insert(sccIndex[target]);
700 Context_->ExternalNodeSccIndex = sccIndex[externalNodeIndex];
706 const auto & pointsToGraph =
Context_->pointsToGraph;
709 std::vector<util::HashSet<PointsToGraph::NodeIndex>> liveAllocas(
Context_->SccFunctions.size());
714 for (
auto allocaPtgNode :
Context_->pointsToGraph.allocaNodes())
716 allAllocas.
insert(allocaPtgNode);
717 const auto & allocaNode = pointsToGraph.getAllocaForNode(allocaPtgNode);
720 const auto sccIndex =
Context_->FunctionToSccIndex[&lambdaNode];
721 liveAllocas[sccIndex].insert(allocaPtgNode);
728 for (
size_t sccIndex =
Context_->SccFunctions.size() - 1; sccIndex > 0; sccIndex--)
730 for (
auto targetScc :
Context_->SccCallTargets[sccIndex].Items())
733 if (targetScc != sccIndex)
734 liveAllocas[targetScc].UnionWith(liveAllocas[sccIndex]);
740 for (
size_t sccIndex = 0; sccIndex <
Context_->SccFunctions.size(); sccIndex++)
742 Context_->AllocasDeadInScc[sccIndex].UnionWith(allAllocas);
743 Context_->AllocasDeadInScc[sccIndex].DifferenceWith(liveAllocas[sccIndex]);
753 std::queue<PointsToGraph::NodeIndex> notSimple;
764 simpleAllocas.
insert(ptgNode);
766 notSimple.push(ptgNode);
770 while (!notSimple.empty())
772 const auto ptgNode = notSimple.front();
779 if (simpleAllocas.
Remove(targetPtgNode))
780 notSimple.push(targetPtgNode);
784 return simpleAllocas;
791 const auto & pointsToGraph =
Context_->pointsToGraph;
795 std::queue<PointsToGraph::NodeIndex> nodes;
800 const auto ptgNode = pointsToGraph.getNodeForRegister(*argument);
805 while (!nodes.empty())
807 const auto ptgNode = nodes.front();
810 for (
const auto targetPtgNode : pointsToGraph.getExplicitTargets(ptgNode).Items())
813 if (!
Context_->SimpleAllocas.Contains(targetPtgNode))
816 if (reachableSimpleAllocas.
insert(targetPtgNode))
817 nodes.push(targetPtgNode);
821 return reachableSimpleAllocas;
827 const auto scc =
Context_->FunctionToSccIndex[&lambda];
828 return Context_->SccCallTargets[scc].Contains(scc);
834 const auto & pointsToGraph =
Context_->pointsToGraph;
837 std::unordered_map<const rvsdg::Region *, util::HashSet<PointsToGraph::NodeIndex>>
838 reachableSimpleAllocas;
841 const auto getReachableSimpleAllocas =
844 if (
const auto it = reachableSimpleAllocas.find(®ion); it != reachableSimpleAllocas.end())
854 auto & allocaNode = pointsToGraph.getAllocaForNode(simpleAllocaPtgNode);
855 const auto & region = *allocaNode.region();
865 if (getReachableSimpleAllocas(region).Contains(simpleAllocaPtgNode))
872 size_t numNonReentrantAllocas = 0;
875 for (
auto simpleAllocaPtgNode :
Context_->SimpleAllocas.Items())
877 if (isNonReentrant(simpleAllocaPtgNode))
879 const auto region = pointsToGraph.getAllocaForNode(simpleAllocaPtgNode).region();
881 Context_->NonReentrantAllocas[region].insert(simpleAllocaPtgNode);
882 numNonReentrantAllocas++;
886 return numNonReentrantAllocas;
892 const auto & pointsToGraph =
Context_->pointsToGraph;
900 if (!pointsToGraph.isMemoryNode(ptgNode))
904 if (!pointsToGraph.isExternallyAvailable(ptgNode))
920 Context_->ModRefSetSimpleConstraints[from].insert(to);
929 Context_->ModRefSetBlocklists[index] = &blocklist;
935 const auto & region = *lambda.
subregion();
937 const auto lambdaModRefSet =
ModRefSummary_->GetOrCreateSetForNode(lambda);
940 if (
Context_->FunctionsCallingSetjmp.Contains(&lambda))
957 for (
auto & node : region.
Nodes())
974 if (
const auto it =
Context_->NonReentrantAllocas.find(®ion);
981 return regionModRefSet;
989 const auto nodeModRefSet =
ModRefSummary_->GetOrCreateSetForNode(structuralNode);
991 for (
auto & subregion : structuralNode.
Subregions())
993 const auto subregionModRefSef =
AnnotateRegion(subregion, lambda);
997 return nodeModRefSet;
1000 std::optional<ModRefSetIndex>
1009 return AnnotateLoad(simpleNode, lambda);
1013 return AnnotateStore(simpleNode, lambda);
1017 return AnnotateAlloca(simpleNode);
1021 return AnnotateMalloc(simpleNode);
1025 return AnnotateFree(simpleNode, lambda);
1029 return AnnotateMemcpy(simpleNode, lambda);
1033 return AnnotateCall(simpleNode, lambda);
1038 return std::nullopt;
1040 [&]() -> std::optional<ModRefSetIndex>
1043 JLM_ASSERT(!hasMemoryState(simpleNode));
1044 return std::nullopt;
1052 std::optional<size_t> minTargetSize,
1055 const auto & pointsToGraph =
Context_->pointsToGraph;
1056 const auto & allocasDead =
Context_->AllocasDeadInScc[
Context_->FunctionToSccIndex[&lambda]];
1059 const auto registerPtgNode = pointsToGraph.getNodeForRegister(origin);
1067 const auto targetSize = pointsToGraph.tryGetNodeSize(targetPtgNode);
1068 if (targetSize && *targetSize < minTargetSize)
1077 if (pointsToGraph.isTargetingAllExternallyAvailable(registerPtgNode))
1079 for (
const auto targetPtgNode : pointsToGraph.getExternallyAvailableNodes())
1081 tryAddToModRefSet(targetPtgNode);
1085 for (
const auto targetPtgNode : pointsToGraph.getExplicitTargets(registerPtgNode).Items())
1087 tryAddToModRefSet(targetPtgNode);
1096 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(loadNode);
1098 const auto loadOperation = util::assertedCast<const LoadOperation>(&loadNode.
GetOperation());
1110 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(storeNode);
1112 const auto storeOperation = util::assertedCast<const StoreOperation>(&storeNode.
GetOperation());
1122 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(allocaNode);
1123 const auto allocaMemoryNode =
Context_->pointsToGraph.getNodeForAlloca(allocaNode);
1131 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(mallocNode);
1132 const auto mallocMemoryNode =
Context_->pointsToGraph.getNodeForMalloc(mallocNode);
1144 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(freeNode);
1159 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(memcpyNode);
1176 const auto & pointsToGraph =
Context_->pointsToGraph;
1179 const auto callModRef =
ModRefSummary_->GetOrCreateSetForNode(callNode);
1182 const auto targetPtr = callNode.
input(0)->
origin();
1183 const auto targetPtgNode =
Context_->pointsToGraph.getNodeForRegister(*targetPtr);
1186 for (
const auto calleePtgNode : pointsToGraph.getExplicitTargets(targetPtgNode).Items())
1188 const auto kind = pointsToGraph.getNodeKind(calleePtgNode);
1191 const auto & calleeLambda = pointsToGraph.getLambdaForNode(calleePtgNode);
1192 const auto targetModRefSet =
ModRefSummary_->GetOrCreateSetForNode(calleeLambda);
1200 if (pointsToGraph.isTargetingAllExternallyAvailable(targetPtgNode))
1232 for (
auto target :
Context_->ModRefSetSimpleConstraints[workItem].Items())
1234 bool changed =
false;
1235 if (
auto blocklist =
Context_->ModRefSetBlocklists.find(target);
1236 blocklist !=
Context_->ModRefSetBlocklists.end())
1239 for (
auto memoryNode :
ModRefSummary_->GetModRefSet(workItem).Items())
1241 if (blocklist->second->Contains(memoryNode))
1265 for (
auto [index, blocklist] :
Context_->ModRefSetBlocklists)
1267 for (
auto memoryNode :
ModRefSummary_->GetModRefSet(index).Items())
1269 if (blocklist->Contains(memoryNode))
1279 std::ostringstream ss;
1280 for (
size_t i = 0; i < summarizer.
Context_->SccFunctions.size(); i++)
1284 ss <<
"[" << std::endl;
1285 if (i == summarizer.
Context_->ExternalNodeSccIndex)
1287 ss <<
" " <<
"<external>" << std::endl;
1289 for (
auto function : summarizer.
Context_->SccFunctions[i].Items())
1291 ss <<
" " <<
function->DebugString() << std::endl;
1305 std::ostringstream ss;
1309 ss <<
"MemoryNodes: {";
1310 for (
auto & memoryNode : memoryNodes.Items())
1315 ss <<
"}" << std::endl;
1318 auto indent = [&](
size_t depth,
char c =
'-')
1320 for (
size_t i = 0; i < depth; i++)
1324 std::function<void(
const rvsdg::Node &,
size_t)> toRegionTree =
1331 auto & memoryNodes = modRefSummary.
GetModRefSet(modRefIndex);
1333 toString(memoryNodes);
1337 for (
auto & region : structuralNode->Subregions())
1340 ss <<
"region" << std::endl;
1341 for (
auto & n : region.Nodes())
1342 toRegionTree(n, depth + 2);
1348 toRegionTree(node, 0);
1353 std::unique_ptr<ModRefSummary>
1360 return summarizer.
SummarizeModRefs(rvsdgModule, pointsToGraph, statisticsCollector);
1363 std::unique_ptr<ModRefSummary>
1369 return Create(rvsdgModule, pointsToGraph, statisticsCollector);
static std::unique_ptr< CallTypeClassifier > ClassifyCall(const rvsdg::SimpleNode &callNode)
Classifies a call node.
static rvsdg::Input & addressInput(const rvsdg::Node &node) noexcept
static rvsdg::Input & AddressInput(const rvsdg::Node &node) noexcept
static rvsdg::Input & destinationInput(const rvsdg::Node &node) noexcept
static rvsdg::Input & countInput(const rvsdg::Node &node) noexcept
static rvsdg::Input & sourceInput(const rvsdg::Node &node) noexcept
static rvsdg::Input & AddressInput(const rvsdg::Node &node) noexcept
const util::HashSet< PointsToGraph::NodeIndex > & GetMemoryNodes() const
util::HashSet< PointsToGraph::NodeIndex > MemoryNodes_
util::HashSet< PointsToGraph::NodeIndex > & GetMemoryNodes()
size_t numNodes() const noexcept
size_t numMemoryNodes() const noexcept
const util::HashSet< NodeIndex > & getExplicitTargets(NodeIndex index) const
bool isExternallyAvailable(NodeIndex index) const
std::string getNodeDebugString(NodeIndex index, char separator=' ') const
NodeKind getNodeKind(NodeIndex index) const
bool isMemoryNode(NodeIndex index) const
Region-aware mod/ref summarizer statistics.
void StopAnnotationStatistics()
void StartAnnotationStatistics()
void StopCreateExternalModRefSet()
static constexpr auto NumCallGraphSccs_
void StartSolvingStatistics()
static constexpr auto NumSimpleAllocas_
~Statistics() override=default
static constexpr auto AllocasDeadInSccsTimer_
void StartCreateExternalModRefSet()
static constexpr auto NumFunctionsCallingSetjmp_
static constexpr auto SimpleAllocasSetTimer_
void startCallGraphStatistics()
static constexpr auto CallGraphTimer_
void StartCreateSimpleAllocasSetStatistics()
static constexpr auto NumCallGraphSccsCanCallExternal_
static constexpr auto NonReentrantAllocaSetsTimer_
static constexpr auto CreateExternalModRefSetTimer_
static constexpr auto NumRvsdgRegionsLabel_
static constexpr auto NumNonReentrantAllocas_
void StartAllocasDeadInSccStatistics()
static constexpr auto SolvingTimer_
Statistics(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph)
void StopSolvingStatistics()
void StopAllocasDeadInSccStatistics()
void StartCreateNonReentrantAllocaSetsStatistics()
void StopCreateSimpleAllocasSetStatistics(uint64_t numSimpleAllocas)
static constexpr auto AnnotationTimer_
static std::unique_ptr< Statistics > Create(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph)
void StopCreateNonReentrantAllocaSetsStatistics(size_t numNonReentrantAllocas)
void stopCallGraphStatistics(size_t numSccs, size_t numFunctionsCallingSetjmp)
Region-aware mod/ref summarizer.
ModRefSetIndex AnnotateStore(const rvsdg::SimpleNode &storeNode, const rvsdg::LambdaNode &lambda)
void SolveModRefSetConstraintGraph()
static util::HashSet< PointsToGraph::NodeIndex > CreateSimpleAllocaSet(const PointsToGraph &pointsToGraph)
void FindAllocasDeadInSccs()
ModRefSetIndex AnnotateLoad(const rvsdg::SimpleNode &loadNode, const rvsdg::LambdaNode &lambda)
void AddPointerOriginTargets(ModRefSetIndex modRefSetIndex, const rvsdg::Output &origin, std::optional< size_t > minTargetSize, const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateMemcpy(const rvsdg::SimpleNode &memcpyNode, const rvsdg::LambdaNode &lambda)
static std::unique_ptr< ModRefSummary > Create(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph, util::StatisticsCollector &statisticsCollector)
void AddModRefSetBlocklist(ModRefSetIndex index, const util::HashSet< PointsToGraph::NodeIndex > &blocklist)
~RegionAwareModRefSummarizer() noexcept override
std::optional< ModRefSetIndex > AnnotateSimpleNode(const rvsdg::SimpleNode &simpleNode, const rvsdg::LambdaNode &lambda)
std::unique_ptr< RegionAwareModRefSummary > ModRefSummary_
ModRefSetIndex AnnotateMalloc(const rvsdg::SimpleNode &mallocNode)
void AddModRefSimpleConstraint(ModRefSetIndex from, ModRefSetIndex to)
bool IsRecursionPossible(const rvsdg::LambdaNode &lambda) const
static std::string CallGraphSCCsToString(const RegionAwareModRefSummarizer &summarizer)
std::unique_ptr< ModRefSummary > SummarizeModRefs(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph, util::StatisticsCollector &statisticsCollector) override
void createCallGraph(const rvsdg::RvsdgModule &rvsdgModule)
bool VerifyBlocklists() const
static std::string ToRegionTree(const rvsdg::Graph &rvsdg, const RegionAwareModRefSummary &modRefSummary)
size_t CreateNonReentrantAllocaSets()
ModRefSetIndex AnnotateRegion(const rvsdg::Region ®ion, const rvsdg::LambdaNode &lambda)
void CreateExternalModRefSet()
std::unique_ptr< Context > Context_
util::HashSet< PointsToGraph::NodeIndex > GetSimpleAllocasReachableFromRegionArguments(const rvsdg::Region ®ion)
void AnnotateFunction(const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateFree(const rvsdg::SimpleNode &freeNode, const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateStructuralNode(const rvsdg::StructuralNode &structuralNode, const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateCall(const rvsdg::SimpleNode &callNode, const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateAlloca(const rvsdg::SimpleNode &allocaNode)
Mod/Ref summary of region-aware mod/ref summarizer.
void MapNodeToSet(const rvsdg::Node &node, ModRefSetIndex index)
bool PropagateModRefSet(ModRefSetIndex from, ModRefSetIndex to)
const util::HashSet< PointsToGraph::NodeIndex > & GetModRefSet(ModRefSetIndex index) const
bool AddToModRefSet(ModRefSetIndex index, PointsToGraph::NodeIndex ptgNode)
ModRefSetIndex GetOrCreateSetForNode(const rvsdg::Node &node)
const util::HashSet< PointsToGraph::NodeIndex > & GetSimpleNodeModRef(const rvsdg::SimpleNode &node) const override
const util::HashSet< PointsToGraph::NodeIndex > & GetGammaEntryModRef(const rvsdg::GammaNode &gamma) const override
std::vector< ModRefSet > ModRefSets_
RegionAwareModRefSummary(const PointsToGraph &pointsToGraph)
std::unordered_map< const rvsdg::Node *, ModRefSetIndex > NodeMap_
RegionAwareModRefSummary(const RegionAwareModRefSummary &)=delete
const util::HashSet< PointsToGraph::NodeIndex > & GetLambdaExitModRef(const rvsdg::LambdaNode &lambda) const override
const util::HashSet< PointsToGraph::NodeIndex > & GetLambdaEntryModRef(const rvsdg::LambdaNode &lambda) const override
RegionAwareModRefSummary & operator=(const RegionAwareModRefSummary &)=delete
const PointsToGraph & GetPointsToGraph() const noexcept override
ModRefSetIndex GetSetForNode(const rvsdg::Node &node) const
const util::HashSet< PointsToGraph::NodeIndex > & GetThetaModRef(const rvsdg::ThetaNode &theta) const override
bool HasSetForNode(const rvsdg::Node &node) const
static std::unique_ptr< RegionAwareModRefSummary > Create(const PointsToGraph &pointsToGraph)
const util::HashSet< PointsToGraph::NodeIndex > & GetGammaExitModRef(const rvsdg::GammaNode &gamma) const override
ModRefSetIndex CreateModRefSet()
size_t NumModRefSets() const noexcept
const PointsToGraph & PointsToGraph_
Conditional operator / pattern matching.
Region & GetRootRegion() const noexcept
rvsdg::Region * subregion() const noexcept
Represent acyclic RVSDG subgraphs.
RegionArgumentRange Arguments() noexcept
static size_t NumRegions(const rvsdg::Region ®ion) noexcept
NodeRange Nodes() noexcept
const SimpleOperation & GetOperation() const noexcept override
NodeInput * input(size_t index) const noexcept
SubregionIteratorRange Subregions()
bool insert(ItemType item)
bool Remove(ItemType item)
util::Timer & GetTimer(const std::string &name)
util::Timer & AddTimer(std::string name)
void AddMeasurement(std::string name, T value)
void PushWorkItem(T item) override
bool HasMoreWorkItems() const noexcept override
static const bool ENABLE_DEAD_ALLOCA_BLOCKLIST
bool IsPointerCompatible(const rvsdg::Output &value)
static const bool ENABLE_CONSTANT_MEMORY_BLOCKING
static std::vector< const rvsdg::LambdaNode * > CollectLambdaNodes(const rvsdg::RvsdgModule &rvsdgModule)
static const bool ENABLE_OPERATION_SIZE_BLOCKING
static const bool ENABLE_NON_REENTRANT_ALLOCA_BLOCKLIST
size_t GetTypeStoreSize(const rvsdg::Type &type)
std::optional< int64_t > tryGetConstantSignedInteger(const rvsdg::Output &output)
void MatchTypeWithDefault(T &obj, const Fns &... fns)
Pattern match over subclass type of given object with default handler.
void MatchTypeOrFail(T &obj, const Fns &... fns)
Pattern match over subclass type of given object.
static std::string indent(size_t depth)
void MatchType(T &obj, const Fns &... fns)
Pattern match over subclass type of given object.
size_t nnodes(const jlm::rvsdg::Region *region) noexcept
rvsdg::LambdaNode & getSurroundingLambdaNode(rvsdg::Node &node)
size_t ExternalNodeSccIndex
std::vector< util::HashSet< const rvsdg::LambdaNode * > > SccFunctions
std::vector< util::HashSet< PointsToGraph::NodeIndex > > AllocasDeadInScc
Context(const PointsToGraph &ptg)
util::HashSet< PointsToGraph::NodeIndex > SimpleAllocas
util::HashSet< const rvsdg::LambdaNode * > FunctionsCallingSetjmp
std::unordered_map< const rvsdg::LambdaNode *, size_t > FunctionToSccIndex
std::vector< util::HashSet< size_t > > SccCallTargets
ModRefSetIndex ExternalModRefIndex
const PointsToGraph & pointsToGraph
std::unordered_map< const rvsdg::Region *, util::HashSet< PointsToGraph::NodeIndex > > NonReentrantAllocas
std::vector< util::HashSet< ModRefSetIndex > > ModRefSetSimpleConstraints
std::unordered_map< ModRefSetIndex, const util::HashSet< PointsToGraph::NodeIndex > * > ModRefSetBlocklists
static const char * NumPointsToGraphMemoryNodes
static const char * NumRvsdgNodes