Jlm
Loading...
Searching...
No Matches
NodeReduction.hpp
Go to the documentation of this file.
1/*
2 * Copyright 2018 Nico Reißmann <nico.reissmann@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#ifndef JLM_LLVM_OPT_NODEREDUCTION_HPP
7#define JLM_LLVM_OPT_NODEREDUCTION_HPP
8
12
13#include <optional>
14
15namespace jlm::rvsdg
16{
17class GammaNode;
18class Graph;
19class Node;
20class Region;
21class Output;
22class StructuralNode;
23}
24
25namespace jlm::llvm
26{
27
34{
35public:
36 class Statistics;
37
38 ~NodeReduction() noexcept override;
39
41
42 NodeReduction(const NodeReduction &) = delete;
43
45
47 operator=(const NodeReduction &) = delete;
48
50 operator=(NodeReduction &&) = delete;
51
52 void
53 Run(rvsdg::RvsdgModule & rvsdgModule, util::StatisticsCollector & statisticsCollector) override;
54
55private:
56 void
57 ReduceNodesInRegion(rvsdg::Region & region);
58
68 bool
69 ReduceStructuralNode(rvsdg::StructuralNode & structuralNode);
70
71 bool
72 ReduceGammaNode(rvsdg::GammaNode & gammaNode);
73
74 bool
75 ReduceSimpleNode(rvsdg::SimpleNode & simpleNode);
76
77 std::unique_ptr<Statistics> Statistics_;
78};
79
83class NodeReduction::Statistics final : public util::Statistics
84{
85 static inline const char * NumRegionsLabel_ = "NumRegions";
86 static inline const char * NumTotalRegionIterationsLabel_ = "NumTotalRegionIterations";
87 static inline const char * MaxIterationsPerRegionLabel_ = "MaxIterationsPerRegion";
88
89public:
90 ~Statistics() noexcept override = default;
91
92 explicit Statistics(const util::FilePath & sourceFile)
93 : util::Statistics(Id::ReduceNodes, sourceFile)
94 {}
95
96 void
97 Start(const rvsdg::Graph & graph) noexcept;
98
99 void
100 End(const rvsdg::Graph & graph) noexcept;
101
102 bool
103 AddIteration(const rvsdg::Region & region, size_t numIterations);
104
105 std::optional<size_t>
106 GetNumIterations(const rvsdg::Region & region) const noexcept;
107
111 [[nodiscard]] size_t
112 getNumRegions() const noexcept;
113
117 [[nodiscard]] size_t
118 getTotalIterations() const noexcept;
119
123 [[nodiscard]] size_t
124 getMaxIterationsPerRegion() const noexcept;
125
127 {
128 size_t numLoadNonVolatileReductions = 0;
129 size_t numStoreNonVolatileReductions = 0;
130
131 size_t numMemoryStateMergeReductions = 0;
132 size_t numMemoryStateJoinReductions = 0;
133 size_t numMemoryStateSplitReductions = 0;
134 size_t numLambdaExitMemoryStateMergeReductions = 0;
135
136 size_t numMatchReductions = 0;
137 size_t numSExtReductions = 0;
138 size_t numZExtReductions = 0;
139 size_t numTruncReductions = 0;
140
141 size_t numIntegerEqReductions = 0;
142 size_t numIntegerNeReductions = 0;
143 size_t numIntegerSgeReductions = 0;
144 size_t numIntegerSgtReductions = 0;
145 size_t numIntegerSleReductions = 0;
146 size_t numIntegerSltReductions = 0;
147 size_t numIntegerUgeReductions = 0;
148 size_t numIntegerUgtReductions = 0;
149 size_t numIntegerUleReductions = 0;
150 size_t numIntegerUltReductions = 0;
151
152 size_t numIntegerAddReductions = 0;
153 size_t numIntegerSubReductions = 0;
154 size_t numIntegerMulReductions = 0;
155 size_t numIntegerSDivReductions = 0;
156 size_t numIntegerUDivReductions = 0;
157 size_t numIntegerSRemReductions = 0;
158 size_t numIntegerURemReductions = 0;
159 size_t numIntegerAShrReductions = 0;
160 size_t numIntegerShlReductions = 0;
161 size_t numIntegerLShrReductions = 0;
162 size_t numIntegerAndReductions = 0;
163 size_t numIntegerOrReductions = 0;
164 size_t numIntegerXorReductions = 0;
165
166 size_t numPtrCmpReductions = 0;
167 size_t numGetElementPtrReductions = 0;
168 size_t numBinaryReductions = 0;
169
170 size_t numGammaReductions = 0;
171 };
172
173 [[nodiscard]] ReductionCounters &
175 {
176 return reductionCounters_;
177 }
178
179 [[nodiscard]] const ReductionCounters &
180 getReductionCounters() const noexcept
181 {
182 return reductionCounters_;
183 }
184
185 static std::unique_ptr<Statistics>
186 Create(const util::FilePath & sourceFile)
187 {
188 return std::make_unique<Statistics>(sourceFile);
189 }
190
191private:
192 ReductionCounters reductionCounters_{};
193 std::unordered_map<const rvsdg::Region *, size_t> NumIterations_;
194};
195
196}
197
198#endif
static jlm::util::StatisticsCollector statisticsCollector
const ReductionCounters & getReductionCounters() const noexcept
std::unordered_map< const rvsdg::Region *, size_t > NumIterations_
ReductionCounters & getReductionCounters() noexcept
~Statistics() noexcept override=default
static std::unique_ptr< Statistics > Create(const util::FilePath &sourceFile)
void ReduceNodesInRegion(rvsdg::Region &region)
std::unique_ptr< Statistics > Statistics_
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
bool ReduceStructuralNode(rvsdg::StructuralNode &structuralNode)
bool ReduceGammaNode(rvsdg::GammaNode &gammaNode)
bool ReduceSimpleNode(rvsdg::SimpleNode &simpleNode)
~NodeReduction() noexcept override
Represent acyclic RVSDG subgraphs.
Definition region.hpp:213
Represents an RVSDG transformation.
Global memory state passed between functions.