41 static std::unique_ptr<Statistics>
44 return std::make_unique<Statistics>(sourceFile);
52 rvsdg::RvsdgModule & rvsdgModule,
53 util::StatisticsCollector & statisticsCollector)
55 auto statistics = Statistics::Create(rvsdgModule.SourceFilePath().value());
58 auto annotationMap = ComputeAnnotationMap(rvsdgModule.Rvsdg());
61 auto file = statisticsCollector.createOutputFile(
"rvsdgTree.txt",
true);
63 fprintf(file.fd(),
"%s\n", tree.c_str());
67 statisticsCollector.CollectDemandedStatistics(std::move(statistics));
89 const auto matchAlloca = [](
const rvsdg::Node & node)
91 return rvsdg::is<AllocaOperation>(&node);
100 return rvsdg::is<LoadOperation>(&node);
107 const auto matchStore = [](
const rvsdg::Node & node)
109 return rvsdg::is<StoreOperation>(&node);
124 return annotationMap;
131 const std::string_view & label,
137 for (
auto & node : region.Nodes())
141 size_t numSubregionNodes = 0;
142 for (
size_t n = 0; n < structuralNode->nsubregions(); n++)
144 auto subregion = structuralNode->subregion(n);
145 numSubregionNodes += annotateRegion(*subregion);
150 { label,
static_cast<uint64_t
>(numSubregionNodes) });
159 annotationMap.
AddAnnotation(®ion, { label,
static_cast<uint64_t
>(numNodes) });
172 std::string_view argumentLabel(
"NumMemoryStateTypeArguments");
173 std::string_view resultLabel(
"NumMemoryStateTypeResults");
174 std::string_view inputLabel(
"NumMemoryStateTypeInputs");
175 std::string_view outputLabel(
"NumMemoryStateTypeOutputs");
179 auto argumentRange = region.Arguments();
180 auto numMemoryStateArguments =
184 { argumentLabel,
static_cast<uint64_t
>(numMemoryStateArguments) });
186 auto resultRange = region.Results();
187 auto numMemoryStateResults =
191 { resultLabel,
static_cast<uint64_t
>(numMemoryStateResults) });
193 for (
auto & node : region.Nodes())
197 size_t numMemoryStateInputs = 0;
198 for (
size_t n = 0; n < structuralNode->ninputs(); n++)
200 auto input = structuralNode->input(n);
201 if (rvsdg::is<MemoryStateType>(input->Type()))
203 numMemoryStateInputs++;
208 { inputLabel,
static_cast<uint64_t
>(numMemoryStateInputs) });
210 size_t numMemoryStateOutputs = 0;
211 for (
size_t n = 0; n < structuralNode->noutputs(); n++)
213 auto output = structuralNode->output(n);
214 if (rvsdg::is<MemoryStateType>(output->Type()))
216 numMemoryStateOutputs++;
221 { outputLabel,
static_cast<uint64_t
>(numMemoryStateOutputs) });
223 for (
size_t n = 0; n < structuralNode->nsubregions(); n++)
225 auto subregion = structuralNode->subregion(n);
226 annotateRegion(*subregion);
238 return rvsdg::is<MemoryStateType>(input->Type());
244 return rvsdg::is<MemoryStateType>(output->Type());
const util::HashSet< Annotation > & RequiredAnnotations() const noexcept
@ 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
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 ToTree(const rvsdg::Region ®ion, const util::AnnotationMap &annotationMap) noexcept
void AddAnnotation(const void *key, Annotation annotation)
IteratorRange< ItemConstIterator > Items() const noexcept
util::Timer & GetTimer(const std::string &name)
util::Timer & AddTimer(std::string name)
#define JLM_UNREACHABLE(msg)
Global memory state passed between functions.
jlm::rvsdg::Output * match(size_t nbits, const std::unordered_map< uint64_t, uint64_t > &mapping, uint64_t default_alternative, size_t nalternatives, jlm::rvsdg::Output *operand)
static const char * Timer