43 !std::getenv(
"JLM_DISABLE_NON_REENTRANT_ALLOCA_BLOCKLIST");
51 !std::getenv(
"JLM_DISABLE_OPERATION_SIZE_BLOCKING");
58 !std::getenv(
"JLM_DISABLE_CONSTANT_MEMORY_BLOCKING");
211 size_t numExtModRefSets,
212 size_t numExtModRefCompressed,
213 size_t numExtModRefKept,
214 size_t numLocalModRefSets,
215 size_t numLocalModRefKept)
225 static std::unique_ptr<Statistics>
228 return std::make_unique<Statistics>(rvsdgModule, pointsToGraph);
300 return ModRefSets_[index].GetMemoryNodes().insert(ptgNode);
331 const auto it =
NodeMap_.find(&node);
388 [[nodiscard]]
static std::unique_ptr<RegionAwareModRefSummary>
391 return std::make_unique<RegionAwareModRefSummary>(pointsToGraph);
407 std::unordered_map<const rvsdg::Node *, ModRefSetIndex>
NodeMap_;
486 std::unordered_map<const rvsdg::Region *, util::HashSet<PointsToGraph::NodeIndex>>
509 std::unordered_map<ModRefSetIndex, const util::HashSet<PointsToGraph::NodeIndex> *>
526 const rvsdg::RvsdgModule & rvsdgModule,
531 Context_ = std::make_unique<Context>(pointsToGraph);
532 auto statistics = Statistics::Create(rvsdgModule, pointsToGraph);
534 statistics->startCallGraphStatistics();
535 createCallGraph(rvsdgModule);
536 statistics->stopCallGraphStatistics(
537 Context_->SccFunctions.size(),
538 Context_->FunctionsCallingSetjmp.Size());
540 statistics->StartAllocasDeadInSccStatistics();
541 FindAllocasDeadInSccs();
542 statistics->StopAllocasDeadInSccStatistics();
544 statistics->StartCreateSimpleAllocasSetStatistics();
545 Context_->SimpleAllocas = CreateSimpleAllocaSet(pointsToGraph);
546 statistics->StopCreateSimpleAllocasSetStatistics(Context_->SimpleAllocas.Size());
548 statistics->StartCreateNonReentrantAllocaSetsStatistics();
549 auto numNonReentrantAllocas = CreateNonReentrantAllocaSets();
550 statistics->StopCreateNonReentrantAllocaSetsStatistics(numNonReentrantAllocas);
552 statistics->StartCreateExternalModRefSet();
553 CreateExternalModRefSet();
554 statistics->StopCreateExternalModRefSet();
556 statistics->StartAnnotationStatistics();
558 for (
const auto & scc : Context_->SccFunctions)
560 for (
const auto lambda : scc.Items())
562 AnnotateFunction(*lambda);
565 statistics->StopAnnotationStatistics();
567 statistics->StartSolvingStatistics();
568 SolveModRefSetConstraintGraph();
569 statistics->StopSolvingStatistics();
573 statistics->StartExternalCompactionStatistics();
574 doExternalCompression();
575 statistics->StopExternalCompactionStatistics(
576 Context_->numExtModRefSets,
577 Context_->numExtModRefCompressed,
578 Context_->numExtModRefKept,
579 Context_->numLocalModRefSets,
580 Context_->numLocalModRefKept);
593 return std::move(ModRefSummary_);
601 static std::vector<const rvsdg::LambdaNode *>
604 std::vector<const rvsdg::LambdaNode *> result;
607 const std::function<void(
rvsdg::Region &)> CollectLambdasInRegion =
610 for (
auto & node : region.Nodes())
614 result.push_back(lambda);
618 for (
size_t i = 0; i < structural->nsubregions(); i++)
620 CollectLambdasInRegion(*structural->subregion(i));
634 const auto & pointsToGraph =
Context_->pointsToGraph;
640 std::unordered_map<const rvsdg::LambdaNode *, size_t> callGraphNodeIndex;
641 callGraphNodeIndex.reserve(lambdaNodes.size());
642 for (
size_t i = 0; i < lambdaNodes.size(); i++)
644 callGraphNodeIndex.insert({ lambdaNodes[i], i });
648 const auto externalNodeIndex = lambdaNodes.size();
649 const auto numCallGraphNodes = externalNodeIndex + 1;
652 std::vector<util::HashSet<size_t>> callGraphSuccessors(numCallGraphNodes);
655 const auto handleCall = [&](
const rvsdg::SimpleNode & callNode,
size_t callerIndex) ->
void
658 if (classification->isSetjmpCall())
660 Context_->FunctionsCallingSetjmp.insert(lambdaNodes[callerIndex]);
665 const auto targetPtgNode = pointsToGraph.getNodeForRegister(*target);
668 for (
const auto calleePtgNode : pointsToGraph.getExplicitTargets(targetPtgNode).Items())
670 const auto kind = pointsToGraph.getNodeKind(calleePtgNode);
673 const auto & lambdaNode = pointsToGraph.getLambdaForNode(calleePtgNode);
676 JLM_ASSERT(callGraphNodeIndex.find(&lambdaNode) != callGraphNodeIndex.end());
677 const auto calleeCallGraphNode = callGraphNodeIndex[&lambdaNode];
680 callGraphSuccessors[callerIndex].insert(calleeCallGraphNode);
685 callGraphSuccessors[callerIndex].insert(externalNodeIndex);
689 if (pointsToGraph.isTargetingAllExternallyAvailable(targetPtgNode))
692 callGraphSuccessors[callerIndex].insert(externalNodeIndex);
697 const std::function<void(
const rvsdg::Region &,
size_t)> handleCalls =
698 [&](
const rvsdg::Region & region,
size_t callerIndex) ->
void
700 for (
auto & node : region.
Nodes())
702 if (
const auto [callNode, callOp] = rvsdg::TryGetSimpleNodeAndOptionalOp<CallOperation>(node);
705 handleCall(*callNode, callerIndex);
712 for (
auto & subregion : structural.
Subregions())
714 handleCalls(subregion, callerIndex);
721 for (
size_t i = 0; i < lambdaNodes.size(); i++)
723 handleCalls(*lambdaNodes[i]->subregion(), i);
726 if (pointsToGraph.isExternallyAvailable(pointsToGraph.getNodeForLambda(*lambdaNodes[i])))
728 callGraphSuccessors[externalNodeIndex].insert(i);
733 callGraphSuccessors[externalNodeIndex].insert(externalNodeIndex);
736 const auto getSuccessors = [&](
size_t nodeIndex)
738 return callGraphSuccessors[nodeIndex].Items();
742 std::vector<size_t> sccIndex;
743 std::vector<size_t> reverseTopologicalOrder;
744 auto numSCCs = util::FindStronglyConnectedComponents<size_t>(
748 reverseTopologicalOrder);
752 Context_->SccFunctions.resize(numSCCs);
753 for (
size_t i = 0; i < lambdaNodes.size(); i++)
755 Context_->SccFunctions[sccIndex[i]].insert(lambdaNodes[i]);
756 Context_->FunctionToSccIndex[lambdaNodes[i]] = sccIndex[i];
760 Context_->SccCallTargets.resize(numSCCs);
761 for (
size_t i = 0; i < numCallGraphNodes; i++)
763 for (
auto target : callGraphSuccessors[i].Items())
765 Context_->SccCallTargets[sccIndex[i]].insert(sccIndex[target]);
770 Context_->ExternalNodeSccIndex = sccIndex[externalNodeIndex];
776 const auto & pointsToGraph =
Context_->pointsToGraph;
779 std::vector<util::HashSet<PointsToGraph::NodeIndex>> liveAllocas(
Context_->SccFunctions.size());
784 for (
auto allocaPtgNode :
Context_->pointsToGraph.allocaNodes())
786 allAllocas.
insert(allocaPtgNode);
787 const auto & allocaNode = pointsToGraph.getAllocaForNode(allocaPtgNode);
790 const auto sccIndex =
Context_->FunctionToSccIndex[&lambdaNode];
791 liveAllocas[sccIndex].insert(allocaPtgNode);
798 for (
size_t sccIndex =
Context_->SccFunctions.size() - 1; sccIndex > 0; sccIndex--)
800 for (
auto targetScc :
Context_->SccCallTargets[sccIndex].Items())
803 if (targetScc != sccIndex)
804 liveAllocas[targetScc].UnionWith(liveAllocas[sccIndex]);
810 for (
size_t sccIndex = 0; sccIndex <
Context_->SccFunctions.size(); sccIndex++)
812 Context_->AllocasDeadInScc[sccIndex].UnionWith(allAllocas);
813 Context_->AllocasDeadInScc[sccIndex].DifferenceWith(liveAllocas[sccIndex]);
823 std::queue<PointsToGraph::NodeIndex> notSimple;
834 simpleAllocas.
insert(ptgNode);
836 notSimple.push(ptgNode);
840 while (!notSimple.empty())
842 const auto ptgNode = notSimple.front();
849 if (simpleAllocas.
Remove(targetPtgNode))
850 notSimple.push(targetPtgNode);
854 return simpleAllocas;
861 const auto & pointsToGraph =
Context_->pointsToGraph;
865 std::queue<PointsToGraph::NodeIndex> nodes;
870 const auto ptgNode = pointsToGraph.getNodeForRegister(*argument);
875 while (!nodes.empty())
877 const auto ptgNode = nodes.front();
880 for (
const auto targetPtgNode : pointsToGraph.getExplicitTargets(ptgNode).Items())
883 if (!
Context_->SimpleAllocas.Contains(targetPtgNode))
886 if (reachableSimpleAllocas.
insert(targetPtgNode))
887 nodes.push(targetPtgNode);
891 return reachableSimpleAllocas;
897 const auto scc =
Context_->FunctionToSccIndex[&lambda];
898 return Context_->SccCallTargets[scc].Contains(scc);
904 const auto & pointsToGraph =
Context_->pointsToGraph;
907 std::unordered_map<const rvsdg::Region *, util::HashSet<PointsToGraph::NodeIndex>>
908 reachableSimpleAllocas;
911 const auto getReachableSimpleAllocas =
914 if (
const auto it = reachableSimpleAllocas.find(®ion); it != reachableSimpleAllocas.end())
924 auto & allocaNode = pointsToGraph.getAllocaForNode(simpleAllocaPtgNode);
925 const auto & region = *allocaNode.region();
935 if (getReachableSimpleAllocas(region).
Contains(simpleAllocaPtgNode))
942 size_t numNonReentrantAllocas = 0;
945 for (
auto simpleAllocaPtgNode :
Context_->SimpleAllocas.Items())
947 if (isNonReentrant(simpleAllocaPtgNode))
949 const auto region = pointsToGraph.getAllocaForNode(simpleAllocaPtgNode).region();
951 Context_->NonReentrantAllocas[region].insert(simpleAllocaPtgNode);
952 numNonReentrantAllocas++;
956 return numNonReentrantAllocas;
962 const auto & pointsToGraph =
Context_->pointsToGraph;
970 if (!pointsToGraph.isMemoryNode(ptgNode))
974 if (!pointsToGraph.isExternallyAvailable(ptgNode))
990 Context_->ModRefSetSimpleConstraints[from].insert(to);
999 Context_->ModRefSetBlocklists[index] = &blocklist;
1005 const auto & region = *lambda.
subregion();
1007 const auto lambdaModRefSet =
ModRefSummary_->GetOrCreateSetForNode(lambda);
1010 if (
Context_->FunctionsCallingSetjmp.Contains(&lambda))
1021 const auto lambdaPtgNode =
Context_->pointsToGraph.getNodeForLambda(lambda);
1022 if (
Context_->pointsToGraph.isExternallyAvailable(lambdaPtgNode))
1035 for (
auto & node : region.
Nodes())
1052 if (
const auto it =
Context_->NonReentrantAllocas.find(®ion);
1059 return regionModRefSet;
1067 const auto nodeModRefSet =
ModRefSummary_->GetOrCreateSetForNode(structuralNode);
1069 for (
auto & subregion : structuralNode.
Subregions())
1071 const auto subregionModRefSef =
AnnotateRegion(subregion, lambda);
1075 return nodeModRefSet;
1078 std::optional<ModRefSetIndex>
1087 return AnnotateLoad(simpleNode, lambda);
1091 return AnnotateStore(simpleNode, lambda);
1095 return AnnotateAlloca(simpleNode);
1099 return AnnotateMalloc(simpleNode);
1103 return AnnotateFree(simpleNode, lambda);
1107 return AnnotateMemcpy(simpleNode, lambda);
1111 return AnnotateMemset(simpleNode, lambda);
1115 return AnnotateCall(simpleNode, lambda);
1120 return std::nullopt;
1122 [&]() -> std::optional<ModRefSetIndex>
1125 JLM_ASSERT(!hasMemoryState(simpleNode));
1126 return std::nullopt;
1134 std::optional<size_t> minTargetSize,
1137 const auto & pointsToGraph =
Context_->pointsToGraph;
1138 const auto & allocasDead =
Context_->AllocasDeadInScc[
Context_->FunctionToSccIndex[&lambda]];
1141 const auto registerPtgNode = pointsToGraph.getNodeForRegister(origin);
1149 const auto targetSize = pointsToGraph.tryGetNodeSize(targetPtgNode);
1150 if (targetSize && *targetSize < minTargetSize)
1159 if (pointsToGraph.isTargetingAllExternallyAvailable(registerPtgNode))
1161 for (
const auto targetPtgNode : pointsToGraph.getExternallyAvailableNodes())
1163 tryAddToModRefSet(targetPtgNode);
1167 for (
const auto targetPtgNode : pointsToGraph.getExplicitTargets(registerPtgNode).Items())
1169 tryAddToModRefSet(targetPtgNode);
1178 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(loadNode);
1180 const auto loadOperation = util::assertedCast<const LoadOperation>(&loadNode.
GetOperation());
1192 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(storeNode);
1194 const auto storeOperation = util::assertedCast<const StoreOperation>(&storeNode.
GetOperation());
1204 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(allocaNode);
1205 const auto allocaMemoryNode =
Context_->pointsToGraph.getNodeForAlloca(allocaNode);
1213 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(mallocNode);
1214 const auto mallocMemoryNode =
Context_->pointsToGraph.getNodeForMalloc(mallocNode);
1226 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(freeNode);
1241 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(memcpyNode);
1258 const auto nodeModRef =
ModRefSummary_->GetOrCreateSetForNode(memsetNode);
1274 const auto & pointsToGraph =
Context_->pointsToGraph;
1277 const auto callModRef =
ModRefSummary_->GetOrCreateSetForNode(callNode);
1280 const auto targetPtr = callNode.
input(0)->
origin();
1281 const auto targetPtgNode =
Context_->pointsToGraph.getNodeForRegister(*targetPtr);
1284 for (
const auto calleePtgNode : pointsToGraph.getExplicitTargets(targetPtgNode).Items())
1286 const auto kind = pointsToGraph.getNodeKind(calleePtgNode);
1289 const auto & calleeLambda = pointsToGraph.getLambdaForNode(calleePtgNode);
1290 const auto targetModRefSet =
ModRefSummary_->GetOrCreateSetForNode(calleeLambda);
1298 if (pointsToGraph.isTargetingAllExternallyAvailable(targetPtgNode))
1330 for (
auto target :
Context_->ModRefSetSimpleConstraints[workItem].Items())
1332 bool changed =
false;
1333 if (
auto blocklist =
Context_->ModRefSetBlocklists.find(target);
1334 blocklist !=
Context_->ModRefSetBlocklists.end())
1337 for (
auto memoryNode :
ModRefSummary_->GetModRefSet(workItem).Items())
1339 if (blocklist->second->Contains(memoryNode))
1363 for (
auto [index, blocklist] :
Context_->ModRefSetBlocklists)
1365 for (
auto memoryNode :
ModRefSummary_->GetModRefSet(index).Items())
1367 if (blocklist->Contains(memoryNode))
1377 for (
auto & functions :
Context_->SccFunctions)
1379 for (
auto function : functions.Items())
1399 for (
auto modRefSetIndex : modRefSets.
Items())
1402 if (modRefSet.Contains(externalMemoryNode))
1405 for (
auto memoryNode : modRefSet.Items())
1406 memoryNodesToKeep.
insert(memoryNode);
1410 memoryNodesToKeep.
insert(externalMemoryNode);
1413 for (
auto modRefSetIndex : modRefSets.
Items())
1416 if (!modRefSet.Contains(externalMemoryNode))
1419 Context_->numLocalModRefKept += modRefSet.Size();
1424 size_t removed = modRefSet.RemoveWhere(
1427 return !memoryNodesToKeep.
Contains(node);
1429 Context_->numExtModRefCompressed += removed;
1430 Context_->numExtModRefKept += modRefSet.Size();
1449 for (
auto & subregion : structuralNode.
Subregions())
1451 for (auto & node : subregion.Nodes())
1453 findAllModRefSets(node, modRefSets);
1462 std::ostringstream ss;
1463 for (
size_t i = 0; i < summarizer.
Context_->SccFunctions.size(); i++)
1467 ss <<
"[" << std::endl;
1468 if (i == summarizer.
Context_->ExternalNodeSccIndex)
1470 ss <<
" " <<
"<external>" << std::endl;
1472 for (
auto function : summarizer.
Context_->SccFunctions[i].Items())
1474 ss <<
" " <<
function->DebugString() << std::endl;
1482 RegionAwareModRefSummarizer::ToRegionTree(
1488 std::ostringstream ss;
1492 ss <<
"MemoryNodes: {";
1493 for (
auto & memoryNode : memoryNodes.Items())
1498 ss <<
"}" << std::endl;
1501 auto indent = [&](
size_t depth,
char c =
'-')
1503 for (
size_t i = 0; i < depth; i++)
1507 std::function<void(
const rvsdg::Node &,
size_t)> toRegionTree =
1514 auto & memoryNodes = modRefSummary.
GetModRefSet(modRefIndex);
1516 toString(memoryNodes);
1520 for (
auto & region : structuralNode->Subregions())
1523 ss <<
"region" << std::endl;
1524 for (
auto & n : region.Nodes())
1525 toRegionTree(n, depth + 2);
1531 toRegionTree(node, 0);
1536 std::unique_ptr<ModRefSummary>
1537 RegionAwareModRefSummarizer::Create(
1546 std::unique_ptr<ModRefSummary>
1547 RegionAwareModRefSummarizer::Create(
static jlm::util::StatisticsCollector statisticsCollector
static bool Contains(const jlm::llvm::InterProceduralGraphModule &module, const std::string &)
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 & destinationInput(const rvsdg::Node &node) noexcept
static rvsdg::Input & lengthInput(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
static constexpr NodeIndex externalMemoryNode
Region-aware mod/ref summarizer statistics.
void StopAnnotationStatistics()
void StartAnnotationStatistics()
static constexpr auto NumExtModRefKept_
void StopCreateExternalModRefSet()
static constexpr auto NumLocalModRefKept_
static constexpr auto NumCallGraphSccs_
void StartSolvingStatistics()
static constexpr auto NumSimpleAllocas_
~Statistics() override=default
static constexpr auto AllocasDeadInSccsTimer_
static constexpr auto NumExtModRefSets_
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 StartExternalCompactionStatistics()
void StopCreateSimpleAllocasSetStatistics(uint64_t numSimpleAllocas)
static constexpr auto AnnotationTimer_
static constexpr auto NumExtModRefCompressed_
static constexpr auto NumLocalModRefSets_
static std::unique_ptr< Statistics > Create(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph)
void StopExternalCompactionStatistics(size_t numExtModRefSets, size_t numExtModRefCompressed, size_t numExtModRefKept, size_t numLocalModRefSets, size_t numLocalModRefKept)
void StopCreateNonReentrantAllocaSetsStatistics(size_t numNonReentrantAllocas)
static constexpr auto ExternalCompressionTimer_
void stopCallGraphStatistics(size_t numSccs, size_t numFunctionsCallingSetjmp)
Region-aware mod/ref summarizer.
ModRefSetIndex AnnotateStore(const rvsdg::SimpleNode &storeNode, const rvsdg::LambdaNode &lambda)
void findAllModRefSets(const rvsdg::Node &node, util::HashSet< ModRefSetIndex > &modRefSets)
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)
void compressExternalInFunction(const rvsdg::LambdaNode &lambda)
void doExternalCompression()
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
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
size_t CreateNonReentrantAllocaSets()
ModRefSetIndex AnnotateMemset(const rvsdg::SimpleNode &memsetNode, const rvsdg::LambdaNode &lambda)
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)
util::HashSet< PointsToGraph::NodeIndex > & GetModRefSet(ModRefSetIndex index)
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 Contains(const ItemType &item) const noexcept
bool Remove(ItemType item)
IteratorRange< ItemConstIterator > Items() const noexcept
void CollectDemandedStatistics(std::unique_ptr< Statistics > statistics)
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
static const bool ENABLE_EXTERNAL_COMPRESSION
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
size_t numExtModRefCompressed
size_t numLocalModRefKept
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
size_t numLocalModRefSets
static const char * NumPointsToGraphMemoryNodes
static const char * NumRvsdgNodes