41 static std::unique_ptr<Statistics>
44 return std::make_unique<Statistics>(sourceFile);
52 rvsdg::RvsdgModule & rvsdgModule,
55 auto statistics = Statistics::Create(rvsdgModule.SourceFilePath().value());
58 auto annotationMap = ComputeAnnotationMap(rvsdgModule.Rvsdg());
63 fprintf(file.fd(),
"%s\n", json.c_str());
94 const auto matchAggregateAlloca = [](
const rvsdg::Node & node)
96 const auto allocaOperation =
dynamic_cast<const AllocaOperation *
>(&node.GetOperation());
97 return allocaOperation &&
IsAggregateType(*allocaOperation->allocatedType());
99 AnnotateNumNodes(rvsdg, matchAggregateAlloca,
"NumAggregateAllocaNodes", annotationMap);
104 const auto matchAlloca = [](
const rvsdg::Node & node)
106 return rvsdg::is<AllocaOperation>(&node);
113 const auto matchLoad = [](
const rvsdg::Node & node)
115 return rvsdg::is<LoadOperation>(&node);
122 const auto matchStore = [](
const rvsdg::Node & node)
124 return rvsdg::is<StoreOperation>(&node);
139 return annotationMap;
145 const std::function<
bool(
const rvsdg::Node &)> & match,
146 const std::string_view & label,
152 for (
auto & node : region.Nodes())
156 size_t numSubregionNodes = 0;
157 for (
size_t n = 0; n < structuralNode->nsubregions(); n++)
159 auto subregion = structuralNode->subregion(n);
160 numSubregionNodes += annotateRegion(*subregion);
165 { label,
static_cast<uint64_t
>(numSubregionNodes) });
174 annotationMap.
AddAnnotation(®ion, { label,
static_cast<uint64_t
>(numNodes) });
187 std::string_view argumentLabel(
"NumMemoryStateTypeArguments");
188 std::string_view resultLabel(
"NumMemoryStateTypeResults");
189 std::string_view inputLabel(
"NumMemoryStateTypeInputs");
190 std::string_view outputLabel(
"NumMemoryStateTypeOutputs");
194 auto argumentRange = region.Arguments();
195 auto numMemoryStateArguments =
199 { argumentLabel,
static_cast<uint64_t
>(numMemoryStateArguments) });
201 auto resultRange = region.Results();
202 auto numMemoryStateResults =
206 { resultLabel,
static_cast<uint64_t
>(numMemoryStateResults) });
208 for (
auto & node : region.Nodes())
212 size_t numMemoryStateInputs = 0;
213 for (
size_t n = 0; n < structuralNode->ninputs(); n++)
215 auto input = structuralNode->input(n);
216 if (rvsdg::is<MemoryStateType>(input->Type()))
218 numMemoryStateInputs++;
223 { inputLabel,
static_cast<uint64_t
>(numMemoryStateInputs) });
225 size_t numMemoryStateOutputs = 0;
226 for (
size_t n = 0; n < structuralNode->noutputs(); n++)
228 auto output = structuralNode->output(n);
229 if (rvsdg::is<MemoryStateType>(output->Type()))
231 numMemoryStateOutputs++;
236 { outputLabel,
static_cast<uint64_t
>(numMemoryStateOutputs) });
238 for (
size_t n = 0; n < structuralNode->nsubregions(); n++)
240 auto subregion = structuralNode->subregion(n);
241 annotateRegion(*subregion);
253 std::string_view nodeIdLabel(
"NodeId");
254 std::string_view regionIdLabel(
"RegionId");
258 for (
auto & node : region.Nodes())
262 for (
auto & subregion : structuralNode->Subregions())
263 annotateRegion(subregion);
267 { nodeIdLabel,
static_cast<uint64_t
>(structuralNode->GetNodeId()) });
273 { regionIdLabel,
static_cast<uint64_t
>(region.getRegionId()) });
282 return rvsdg::is<MemoryStateType>(input->Type());
288 return rvsdg::is<MemoryStateType>(output->Type());
static jlm::util::StatisticsCollector statisticsCollector
const util::HashSet< Annotation > & RequiredAnnotations() const noexcept
@ NumAggregateAllocaNodes
@ NumMemoryStateInputsOutputs
static std::unique_ptr< Statistics > Create(const util::FilePath &sourceFile)
Statistics(const util::FilePath &sourceFile)
~Statistics() override=default
RVSDG tree printer debug pass.
util::AnnotationMap ComputeAnnotationMap(const rvsdg::Graph &rvsdg) const
static bool IsMemoryStateOutput(const rvsdg::Output *output) noexcept
~RvsdgTreePrinter() noexcept override
static void AnnotateDebugIds(const rvsdg::Graph &rvsdg, util::AnnotationMap &annotationMap)
Configuration Configuration_
static void AnnotateNumMemoryStateInputsOutputs(const rvsdg::Graph &rvsdg, util::AnnotationMap &annotationMap)
static bool IsMemoryStateInput(const rvsdg::Input *input) noexcept
static void AnnotateNumNodes(const rvsdg::Graph &rvsdg, const std::function< bool(const rvsdg::Node &)> &match, const std::string_view &label, util::AnnotationMap &annotationMap)
Region & GetRootRegion() const noexcept
Represent acyclic RVSDG subgraphs.
static std::string toJson(const Region ®ion, const util::AnnotationMap &annotationMap) noexcept
void AddAnnotation(const void *key, Annotation annotation)
void open(const char *mode)
IteratorRange< ItemConstIterator > Items() const noexcept
void CollectDemandedStatistics(std::unique_ptr< Statistics > statistics)
File createOutputFile(std::string fileNameSuffix, bool includeCount=false)
util::Timer & GetTimer(const std::string &name)
util::Timer & AddTimer(std::string name)
#define JLM_UNREACHABLE(msg)
Global memory state passed between functions.
bool IsAggregateType(const jlm::rvsdg::Type &type)
static const char * Timer