51 :
Statistics(
Id::AliasAnalysisPrecisionEvaluation, sourceFile)
97 static std::unique_ptr<PrecisionStatistics>
100 return std::make_unique<PrecisionStatistics>(sourceFile);
110 const rvsdg::RvsdgModule & rvsdgModule,
112 util::StatisticsCollector & statisticsCollector)
114 auto statistics = PrecisionStatistics::Create(rvsdgModule.SourceFilePath().value());
117 if (!statisticsCollector.IsDemanded(*statistics))
124 if (IsAliasingGraphEnabled())
130 writer.
WriteGraphs(gw, rvsdgModule.Rvsdg().GetRootRegion(),
true);
134 statistics->StartEvaluatingPrecision(*
this, aliasAnalysis);
135 EvaluateAllFunctions(rvsdgModule.Rvsdg().GetRootRegion(), aliasAnalysis);
136 statistics->StopEvaluatingPrecision();
139 if (IsAliasingGraphEnabled())
141 auto out = statisticsCollector.createOutputFile(
"AliasingGraph.dot",
true);
142 std::ofstream fd(out.path().to_str());
144 statistics->AddAliasingGraphOutputFile(out.path());
148 std::optional<util::FilePath> perFunctionOutputFile;
149 if (IsPerFunctionOutputEnabled())
151 perFunctionOutputFile =
152 statisticsCollector.createOutputFile(
"AAPrecisionEvaluation.log",
true).path();
153 statistics->AddPerFunctionOutputFile(*perFunctionOutputFile);
157 CalculateResults(perFunctionOutputFile, *statistics);
159 statisticsCollector.CollectDemandedStatistics(std::move(statistics));
167 for (
auto & node : region.
Nodes())
207 precisionEvaluation.NumOperations += p1Multiplier;
212 precisionEvaluation.NumClobberOperations += p1Multiplier;
219 if (p1Multiplier > 1)
229 auto response = aliasAnalysis.
Query(*p1, s1, *p2, s2);
251 precisionEvaluation.ClobberOperations.push_back(clobberInfo);
258 for (
auto & node : region.
Nodes())
281 JLM_ASSERT(is<LoadNonVolatileOperation>(*load) || is<LoadVolatileOperation>(*load));
289 JLM_ASSERT(is<StoreNonVolatileOperation>(*store) || is<StoreVolatileOperation>(*store));
330 std::map<std::tuple<const rvsdg::Output *, size_t, bool>,
size_t> pointerOpMultipliers;
334 pointerOpMultipliers[{ pointer, size, isClobber }] += multiplier;
338 for (
const auto & [pointerOp, multiplier] : pointerOpMultipliers)
340 const auto [pointer, size, isClobber] = pointerOp;
346 if (!isClobber && pointerOpMultipliers.count({ pointer, size, true }) > 0)
378 newNode.SetProgramObject(p);
382 auto & p1Node = GetOrCreateAliasGraphNode(p1);
383 auto & p2Node = GetOrCreateAliasGraphNode(p2);
386 std::optional<std::string> edgeColor;
397 edge.SetAttribute(
"color", *edgeColor);
403 const std::vector<PrecisionInfo::ClobberInfo> & clobberInfos)
407 for (
auto & clobber : clobberInfos)
409 size_t total = clobber.NumNoAlias + clobber.NumMayAlias + clobber.NumMustAlias;
418 static_cast<double>(clobber.NumNoAlias) / total * clobber.Multiplier;
420 static_cast<double>(clobber.NumMayAlias) / total * clobber.Multiplier;
422 static_cast<double>(clobber.NumMustAlias) / total * clobber.Multiplier;
423 result.
TotalNoAlias += clobber.NumNoAlias * clobber.Multiplier;
424 result.
TotalMayAlias += clobber.NumMayAlias * clobber.Multiplier;
425 result.
TotalMustAlias += clobber.NumMustAlias * clobber.Multiplier;
447 out <<
"No clobber operations" << std::endl;
456 out <<
"Total responses: " << clobberInfos.
TotalNoAlias <<
" NoAlias \t";
464 std::optional<util::FilePath> perFunctionOutputFile,
468 std::vector<PrecisionInfo::ClobberInfo> allClobberInfos;
472 if (perFunctionOutputFile)
473 out.open(perFunctionOutputFile->to_str());
478 if (perFunctionOutputFile)
481 out <<
function->GetOperation().debug_string() <<
" [";
482 out << precision.NumOperations <<
" pointer operations]:" << std::endl;
487 for (
auto & clobberInfo : precision.ClobberOperations)
488 allClobberInfos.push_back(clobberInfo);
493 if (perFunctionOutputFile)
495 out <<
"Module total:" << std::endl;
static rvsdg::Input & AddressInput(const rvsdg::Node &node) noexcept
static rvsdg::Input & AddressInput(const rvsdg::Node &node) noexcept
void StartEvaluatingPrecision(const AliasAnalysisPrecisionEvaluator &evaluator, const AliasAnalysis &aliasAnalysis)
static constexpr auto LoadsConsideredClobbers_
static constexpr auto ClobberAverageNoAlias
void AddPrecisionSummaryStatistics(const AggregatedClobberInfos &clobberInfos)
static constexpr auto NumTotalMustAlias_
static constexpr auto PerFunctionOutputFile_
static constexpr auto PrecisionEvaluationTimer_
static constexpr auto NumTotalMayAlias_
~PrecisionStatistics() override=default
void StopEvaluatingPrecision()
static constexpr auto PairwiseAliasAnalysisType_
static constexpr auto NumTotalNoAlias_
static constexpr auto DeduplicatingPointers_
PrecisionStatistics(const util::FilePath &sourceFile)
void AddAliasingGraphOutputFile(const util::FilePath &outputFile)
static constexpr auto AliasingGraphOutputFile_
static constexpr auto ModuleNumClobbers_
static constexpr auto ClobberAverageMustAlias
static constexpr auto ClobberAverageMayAlias
static std::unique_ptr< PrecisionStatistics > Create(const util::FilePath &sourceFile)
void AddPerFunctionOutputFile(const util::FilePath &outputFile)
static void PrintAggregatedClobberInfos(const AggregatedClobberInfos &clobberInfos, std::ostream &out)
static AggregatedClobberInfos AggregateClobberInfos(const std::vector< PrecisionInfo::ClobberInfo > &clobberInfos)
void AggregateDuplicates()
~AliasAnalysisPrecisionEvaluator() noexcept
void CollectPointersFromRegion(const rvsdg::Region ®ion)
bool IsDeduplicatingPointers() const noexcept
void EvaluateFunction(const rvsdg::LambdaNode &function, AliasAnalysis &aliasAnalysis)
void CalculateResults(std::optional< util::FilePath > perFunctionOutput, PrecisionStatistics &statistics) const
void CollectPointersFromStructuralNode(const rvsdg::StructuralNode &node)
void AddToAliasingGraph(const rvsdg::Output &p1, size_t s1, const rvsdg::Output &p2, size_t s2, AliasAnalysis::AliasQueryResponse response)
bool AreLoadsConsideredClobbers() const noexcept
bool IsAliasingGraphEnabled() const noexcept
void NormalizePointerValues()
void CollectPointer(const rvsdg::Output *value, size_t size, bool isClobber)
void CollectPointersFromSimpleNode(const rvsdg::SimpleNode &node)
void EvaluateAllFunctions(const rvsdg::Region ®ion, AliasAnalysis &aliasAnalysis)
AliasAnalysisPrecisionEvaluator()
virtual std::string ToString() const =0
virtual AliasQueryResponse Query(const rvsdg::Output &p1, size_t s1, const rvsdg::Output &p2, size_t s2)=0
util::graph::Graph & WriteGraphs(util::graph::Writer &writer, const Region ®ion, bool emitTypeGraph)
A phi node represents the fixpoint of mutually recursive definitions.
Represent acyclic RVSDG subgraphs.
NodeRange Nodes() noexcept
const SimpleOperation & GetOperation() const noexcept override
SubregionIteratorRange Subregions()
const std::string & to_str() const noexcept
util::Timer & GetTimer(const std::string &name)
Statistics(const Statistics::Id &statisticsId, util::FilePath sourceFile)
util::Timer & AddTimer(std::string name)
void AddMeasurement(std::string name, T value)
void SetAttribute(const std::string &attribute, std::string value)
void SetAttributeGraphElement(const std::string &attribute, const GraphElement &element)
GraphElement * GetElementFromProgramObject(uintptr_t object) const
Edge & CreateEdge(Port &from, Port &to, bool directed)
GraphElement * GetElementFromProgramObject(uintptr_t object) const
void outputAllGraphs(std::ostream &out, OutputFormat format)
#define JLM_UNREACHABLE(msg)
bool IsPointerCompatible(const rvsdg::Output &value)
rvsdg::Output & traceOutput(rvsdg::Output &output)
size_t GetTypeStoreSize(const rvsdg::Type &type)
static std::string strfmt(Args... args)
double ClobberAverageNoAlias
double ClobberAverageMayAlias
uint64_t NumClobberOperations
double ClobberAverageMustAlias
util::graph::Graph * AliasingGraph_
std::unordered_map< const rvsdg::LambdaNode *, PrecisionInfo > PerFunctionPrecision
std::vector< std::tuple< const rvsdg::Output *, size_t, bool, size_t > > PointerOperations