21 std::unordered_map<const rvsdg::SimpleNode *, util::HashSet<PointsToGraph::NodeIndex>>;
70 throw std::logic_error(
"Unhandled node type.");
103 static std::unique_ptr<AgnosticModRefSummary>
106 return std::unique_ptr<AgnosticModRefSummary>(
120 std::unique_ptr<ModRefSummary>
128 statistics->StartCollecting();
137 statistics->StopCollecting();
147 for (
const auto allocaNode : pointsToGraph.
allocaNodes())
148 memoryNodes.
insert(allocaNode);
150 for (
const auto deltaNode : pointsToGraph.
deltaNodes())
151 memoryNodes.
insert(deltaNode);
153 for (
const auto lambdaNode : pointsToGraph.
lambdaNodes())
154 memoryNodes.
insert(lambdaNode);
156 for (
const auto mallocNode : pointsToGraph.
mallocNodes())
157 memoryNodes.
insert(mallocNode);
159 for (
const auto importNode : pointsToGraph.
importNodes())
160 memoryNodes.
insert(importNode);
172 for (
const auto & node : region.
Nodes())
182 for (
const auto & subregion : structuralNode.Subregions())
197 const auto & addressReg = pointsToGraph.getNodeForRegister(output);
198 for (
const auto target : pointsToGraph.getExplicitTargets(addressReg).Items())
202 if (pointsToGraph.isTargetingAllExternallyAvailable(addressReg))
204 for (
const auto implicitTarget : pointsToGraph.getExternallyAvailableNodes())
206 modRefSet.
insert(implicitTarget);
218 const auto & address = *StoreOperation::AddressInput(node).origin();
219 util::HashSet<PointsToGraph::NodeIndex> modRefSet;
220 AddPointerTargetsToModRefSet(address, modRefSet);
221 ModRefSummary_->SetSimpleNodeModRef(node, std::move(modRefSet));
225 const auto & address = *LoadOperation::AddressInput(node).origin();
226 util::HashSet<PointsToGraph::NodeIndex> modRefSet;
227 AddPointerTargetsToModRefSet(address, modRefSet);
228 ModRefSummary_->SetSimpleNodeModRef(node, std::move(modRefSet));
232 util::HashSet<PointsToGraph::NodeIndex> modRefSet;
233 const auto & srcAddress = *MemCpyOperation::sourceInput(node).origin();
234 const auto & dstAddress = *MemCpyOperation::destinationInput(node).origin();
235 AddPointerTargetsToModRefSet(srcAddress, modRefSet);
236 AddPointerTargetsToModRefSet(dstAddress, modRefSet);
237 ModRefSummary_->SetSimpleNodeModRef(node, std::move(modRefSet));
241 util::HashSet<PointsToGraph::NodeIndex> modRefSet;
242 const auto & freeAddress = *FreeOperation::addressInput(node).origin();
243 AddPointerTargetsToModRefSet(freeAddress, modRefSet);
244 ModRefSummary_->SetSimpleNodeModRef(node, std::move(modRefSet));
248 const auto allocaMemoryNode = ModRefSummary_->GetPointsToGraph().getNodeForAlloca(node);
249 ModRefSummary_->SetSimpleNodeModRef(node, { allocaMemoryNode });
253 const auto mallocMemoryNode = ModRefSummary_->GetPointsToGraph().getNodeForMalloc(node);
254 ModRefSummary_->SetSimpleNodeModRef(node, { mallocMemoryNode });
256 [&](
const CallOperation &)
261 [&](
const MemoryStateOperation &)
272 std::unique_ptr<ModRefSummary>
273 AgnosticModRefSummarizer::Create(
279 return summarizer.
SummarizeModRefs(rvsdgModule, pointsToGraph, statisticsCollector);
282 std::unique_ptr<ModRefSummary>
283 AgnosticModRefSummarizer::Create(
288 return Create(rvsdgModule, pointsToGraph, 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.