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;
23class ThetaNode;
24}
25
26namespace jlm::llvm
27{
28
35{
36public:
37 class Statistics;
38
39 ~NodeReduction() noexcept override;
40
42
43 NodeReduction(const NodeReduction &) = delete;
44
46
48 operator=(const NodeReduction &) = delete;
49
51 operator=(NodeReduction &&) = delete;
52
53 void
54 Run(rvsdg::RvsdgModule & rvsdgModule, util::StatisticsCollector & statisticsCollector) override;
55
56private:
57 void
58 ReduceNodesInRegion(rvsdg::Region & region);
59
69 bool
70 ReduceStructuralNode(rvsdg::StructuralNode & structuralNode);
71
72 bool
73 ReduceGammaNode(rvsdg::GammaNode & gammaNode);
74
75 bool
76 reduceThetaNode(rvsdg::ThetaNode & thetaNode);
77
78 bool
79 ReduceSimpleNode(rvsdg::SimpleNode & simpleNode);
80
81 std::unique_ptr<Statistics> Statistics_;
82};
83
87class NodeReduction::Statistics final : public util::Statistics
88{
89 static inline const char * NumRegionsLabel_ = "NumRegions";
90 static inline const char * NumTotalRegionIterationsLabel_ = "NumTotalRegionIterations";
91 static inline const char * MaxIterationsPerRegionLabel_ = "MaxIterationsPerRegion";
92
93public:
94 ~Statistics() noexcept override = default;
95
96 explicit Statistics(const util::FilePath & sourceFile)
97 : util::Statistics(Id::ReduceNodes, sourceFile)
98 {}
99
100 void
101 Start(const rvsdg::Graph & graph) noexcept;
102
103 void
104 End(const rvsdg::Graph & graph) noexcept;
105
106 bool
107 AddIteration(const rvsdg::Region & region, size_t numIterations);
108
109 std::optional<size_t>
110 GetNumIterations(const rvsdg::Region & region) const noexcept;
111
115 [[nodiscard]] size_t
116 getNumRegions() const noexcept;
117
121 [[nodiscard]] size_t
122 getTotalIterations() const noexcept;
123
127 [[nodiscard]] size_t
128 getMaxIterationsPerRegion() const noexcept;
129
131 {
132 size_t numLoadNonVolatileReductions = 0;
133 size_t numStoreNonVolatileReductions = 0;
134
135 size_t numMemoryStateMergeReductions = 0;
136 size_t numMemoryStateJoinReductions = 0;
137 size_t numMemoryStateSplitReductions = 0;
138 size_t numLambdaExitMemoryStateMergeReductions = 0;
139
140 size_t numMatchReductions = 0;
141 size_t numSExtReductions = 0;
142 size_t numZExtReductions = 0;
143 size_t numTruncReductions = 0;
144 size_t numFPExtReductions = 0;
145 size_t numFPTruncReductions = 0;
146
147 size_t numIntegerEqReductions = 0;
148 size_t numIntegerNeReductions = 0;
149 size_t numIntegerSgeReductions = 0;
150 size_t numIntegerSgtReductions = 0;
151 size_t numIntegerSleReductions = 0;
152 size_t numIntegerSltReductions = 0;
153 size_t numIntegerUgeReductions = 0;
154 size_t numIntegerUgtReductions = 0;
155 size_t numIntegerUleReductions = 0;
156 size_t numIntegerUltReductions = 0;
157
158 size_t numIntegerAddReductions = 0;
159 size_t numIntegerSubReductions = 0;
160 size_t numIntegerMulReductions = 0;
161 size_t numIntegerSDivReductions = 0;
162 size_t numIntegerUDivReductions = 0;
163 size_t numIntegerSRemReductions = 0;
164 size_t numIntegerURemReductions = 0;
165 size_t numIntegerAShrReductions = 0;
166 size_t numIntegerShlReductions = 0;
167 size_t numIntegerLShrReductions = 0;
168 size_t numIntegerAndReductions = 0;
169 size_t numIntegerOrReductions = 0;
170 size_t numIntegerXorReductions = 0;
171
172 size_t numFPBinaryOpReductions = 0;
173
174 size_t numPtrCmpReductions = 0;
175 size_t numGetElementPtrReductions = 0;
176 size_t numFCmpReductions = 0;
177 size_t numMemoryHoistBarrierReductions = 0;
178 size_t numBinaryReductions = 0;
179
180 size_t numGammaReductions = 0;
181 size_t numThetaReductions = 0;
182 };
183
184 [[nodiscard]] ReductionCounters &
186 {
187 return reductionCounters_;
188 }
189
190 [[nodiscard]] const ReductionCounters &
191 getReductionCounters() const noexcept
192 {
193 return reductionCounters_;
194 }
195
196 static std::unique_ptr<Statistics>
197 Create(const util::FilePath & sourceFile)
198 {
199 return std::make_unique<Statistics>(sourceFile);
200 }
201
202private:
203 ReductionCounters reductionCounters_{};
204 std::unordered_map<const rvsdg::Region *, size_t> NumIterations_;
205};
206
207}
208
209#endif
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_
bool reduceThetaNode(rvsdg::ThetaNode &thetaNode)
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.
static util::StatisticsCollector statisticsCollector