11 std::shared_ptr<const PointsToGraph> pointsToGraph)
12 : pointsToGraph_(std::move(pointsToGraph))
20 return "PointsToGraphAA";
36 auto tryP1RegisterNode =
pointsToGraph_->tryGetNodeForRegister(p1);
37 if (!tryP1RegisterNode)
40 auto tryP2RegisterNode =
pointsToGraph_->tryGetNodeForRegister(p2);
41 if (!tryP2RegisterNode)
44 const auto p1RegisterNode = *tryP1RegisterNode;
45 const auto p2RegisterNode = *tryP2RegisterNode;
48 const bool p1TargetsExternal =
pointsToGraph_->isTargetingAllExternallyAvailable(p1RegisterNode);
49 const bool p2TargetsExternal =
pointsToGraph_->isTargetingAllExternallyAvailable(p2RegisterNode);
50 if (p1TargetsExternal && p2TargetsExternal)
60 if (p1SingleTarget.has_value() && p2SingleTarget.has_value()
70 const auto neededSize = std::max(s1, s2);
75 if (p1TargetsExternal)
78 std::swap(onlyExplicitTargetsNode, otherNode);
81 for (
const auto target :
pointsToGraph_->getExplicitTargets(onlyExplicitTargetsNode).Items())
86 if (targetSize.has_value() && *targetSize < neededSize)
96 std::optional<PointsToGraph::NodeIndex>
103 std::optional<PointsToGraph::NodeIndex> singleTarget = std::nullopt;
105 for (
const auto target :
pointsToGraph_->getExplicitTargets(node).Items())
109 if (targetSize.has_value() && *targetSize < size)
113 if (singleTarget.has_value())
116 singleTarget = target;
136 throw std::logic_error(
"Unknown node kind");
PointsToGraphAliasAnalysis(std::shared_ptr< const PointsToGraph > pointsToGraph)
bool IsRepresentingSingleMemoryLocation(PointsToGraph::NodeIndex node) const
std::optional< PointsToGraph::NodeIndex > TryGetSingleTarget(PointsToGraph::NodeIndex node, size_t size) const
std::shared_ptr< const PointsToGraph > pointsToGraph_
~PointsToGraphAliasAnalysis() noexcept override
AliasQueryResponse Query(const rvsdg::Output &p1, size_t s1, const rvsdg::Output &p2, size_t s2) override
static std::string ToString(const std::vector< MemoryNodeId > &memoryNodeIds)