27 std::unordered_map<const rvsdg::SimpleNode *, util::HashSet<PointsToGraph::NodeIndex>>;
76 throw std::logic_error(
"Unhandled node type.");
109 static std::unique_ptr<AgnosticModRefSummary>
112 return std::unique_ptr<AgnosticModRefSummary>(
126 std::unique_ptr<ModRefSummary>
134 statistics->StartCollecting();
143 statistics->StopCollecting();
153 for (
const auto allocaNode : pointsToGraph.
allocaNodes())
154 memoryNodes.
insert(allocaNode);
156 for (
const auto deltaNode : pointsToGraph.
deltaNodes())
157 memoryNodes.
insert(deltaNode);
159 for (
const auto lambdaNode : pointsToGraph.
lambdaNodes())
160 memoryNodes.
insert(lambdaNode);
162 for (
const auto mallocNode : pointsToGraph.
mallocNodes())
163 memoryNodes.
insert(mallocNode);
165 for (
const auto importNode : pointsToGraph.
importNodes())
166 memoryNodes.
insert(importNode);
178 for (
const auto & node : region.
Nodes())
188 for (
const auto & subregion : structuralNode.Subregions())
203 const auto & addressReg = pointsToGraph.getNodeForRegister(output);
204 for (
const auto target : pointsToGraph.getExplicitTargets(addressReg).Items())
208 if (pointsToGraph.isTargetingAllExternallyAvailable(addressReg))
210 for (
const auto implicitTarget : pointsToGraph.getExternallyAvailableNodes())
212 modRefSet.
insert(implicitTarget);
224 const auto & address = *StoreOperation::AddressInput(node).origin();
225 util::HashSet<PointsToGraph::NodeIndex> modRefSet;
226 AddPointerTargetsToModRefSet(address, modRefSet);
227 ModRefSummary_->SetSimpleNodeModRef(node, std::move(modRefSet));
231 const auto & address = *LoadOperation::AddressInput(node).origin();
232 util::HashSet<PointsToGraph::NodeIndex> modRefSet;
233 AddPointerTargetsToModRefSet(address, modRefSet);
234 ModRefSummary_->SetSimpleNodeModRef(node, std::move(modRefSet));
238 util::HashSet<PointsToGraph::NodeIndex> modRefSet;
239 const auto & srcAddress = *MemCpyOperation::sourceInput(node).origin();
240 const auto & dstAddress = *MemCpyOperation::destinationInput(node).origin();
241 AddPointerTargetsToModRefSet(srcAddress, modRefSet);
242 AddPointerTargetsToModRefSet(dstAddress, modRefSet);
243 ModRefSummary_->SetSimpleNodeModRef(node, std::move(modRefSet));
247 util::HashSet<PointsToGraph::NodeIndex> modRefSet;
248 const auto & dstAddress = *MemSetOperation::destinationInput(node).origin();
249 AddPointerTargetsToModRefSet(dstAddress, modRefSet);
250 ModRefSummary_->SetSimpleNodeModRef(node, std::move(modRefSet));
254 util::HashSet<PointsToGraph::NodeIndex> modRefSet;
255 const auto & freeAddress = *FreeOperation::addressInput(node).origin();
256 AddPointerTargetsToModRefSet(freeAddress, modRefSet);
257 ModRefSummary_->SetSimpleNodeModRef(node, std::move(modRefSet));
261 const auto allocaMemoryNode = ModRefSummary_->GetPointsToGraph().getNodeForAlloca(node);
262 ModRefSummary_->SetSimpleNodeModRef(node, { allocaMemoryNode });
266 const auto mallocMemoryNode = ModRefSummary_->GetPointsToGraph().getNodeForMalloc(node);
267 ModRefSummary_->SetSimpleNodeModRef(node, { mallocMemoryNode });
269 [&](
const CallOperation &)
274 [&](
const MemoryStateOperation &)
285 std::unique_ptr<ModRefSummary>
286 AgnosticModRefSummarizer::Create(
295 std::unique_ptr<ModRefSummary>
296 AgnosticModRefSummarizer::Create(
static jlm::util::StatisticsCollector statisticsCollector
static std::unique_ptr< Statistics > Create(const util::FilePath &sourceFile, const util::StatisticsCollector &statisticsCollector, const PointsToGraph &pointsToGraph)
Agnostic mod/ref summarizer.
std::unique_ptr< ModRefSummary > SummarizeModRefs(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph, util::StatisticsCollector &statisticsCollector) override
void AddPointerTargetsToModRefSet(const rvsdg::Output &output, util::HashSet< PointsToGraph::NodeIndex > &modRefSet) const
static util::HashSet< PointsToGraph::NodeIndex > GetAllMemoryNodes(const PointsToGraph &pointsToGraph)
AgnosticModRefSummarizer()
void AnnotateRegion(const rvsdg::Region ®ion)
void AnnotateSimpleNode(const rvsdg::SimpleNode &node)
std::unique_ptr< AgnosticModRefSummary > ModRefSummary_
~AgnosticModRefSummarizer() override
Mod/Ref summary of agnostic mod/ref summarizer.
AgnosticModRefSummary(AgnosticModRefSummary &&)=delete
SimpleNodeModRefMap SimpleNodeModRefs_
const util::HashSet< PointsToGraph::NodeIndex > & GetSimpleNodeModRef(const rvsdg::SimpleNode &node) const override
void SetSimpleNodeModRef(const rvsdg::SimpleNode &node, util::HashSet< PointsToGraph::NodeIndex > modRefSet)
const util::HashSet< PointsToGraph::NodeIndex > & GetGammaExitModRef([[maybe_unused]] const rvsdg::GammaNode &gamma) const override
std::unordered_map< const rvsdg::SimpleNode *, util::HashSet< PointsToGraph::NodeIndex > > SimpleNodeModRefMap
~AgnosticModRefSummary() noexcept override=default
const util::HashSet< PointsToGraph::NodeIndex > & GetGammaEntryModRef([[maybe_unused]] const rvsdg::GammaNode &gamma) const override
AgnosticModRefSummary & operator=(const AgnosticModRefSummary &)=delete
const util::HashSet< PointsToGraph::NodeIndex > & GetLambdaExitModRef([[maybe_unused]] const rvsdg::LambdaNode &lambda) const override
static std::unique_ptr< AgnosticModRefSummary > Create(const PointsToGraph &pointsToGraph, util::HashSet< PointsToGraph::NodeIndex > memoryNodes)
const util::HashSet< PointsToGraph::NodeIndex > & GetThetaModRef([[maybe_unused]] const rvsdg::ThetaNode &theta) const override
AgnosticModRefSummary(const AgnosticModRefSummary &)=delete
AgnosticModRefSummary(const PointsToGraph &pointsToGraph, util::HashSet< PointsToGraph::NodeIndex > allMemoryNodes)
AgnosticModRefSummary & operator=(AgnosticModRefSummary &&)=delete
const PointsToGraph & PointsToGraph_
const util::HashSet< PointsToGraph::NodeIndex > & GetLambdaEntryModRef([[maybe_unused]] const rvsdg::LambdaNode &lambda) const override
util::HashSet< PointsToGraph::NodeIndex > AllMemoryNodes_
const PointsToGraph & GetPointsToGraph() const noexcept override
size_t numMemoryNodes() const noexcept
AllocaNodeRange allocaNodes() const noexcept
NodeIndex getExternalMemoryNode() const noexcept
LambdaNodeRange lambdaNodes() const noexcept
DeltaNodeRange deltaNodes() const noexcept
MallocNodeRange mallocNodes() const noexcept
ImportNodeRange importNodes() const noexcept
Conditional operator / pattern matching.
Region & GetRootRegion() const noexcept
Represent acyclic RVSDG subgraphs.
NodeRange Nodes() noexcept
const std::optional< util::FilePath > & SourceFilePath() const noexcept
const SimpleOperation & GetOperation() const noexcept override
bool insert(ItemType item)
std::size_t Size() const noexcept
void CollectDemandedStatistics(std::unique_ptr< Statistics > statistics)
bool IsPointerCompatible(const rvsdg::Output &value)
bool hasMemoryState(const rvsdg::Node &node)
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.