Jlm
Loading...
Searching...
No Matches
PredicateCorrelation.hpp
Go to the documentation of this file.
1/*
2 * Copyright 2025 Nico Reißmann <nico.reissmann@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#ifndef JLM_LLVM_OPT_PREDICATECORRELATION_HPP
7#define JLM_LLVM_OPT_PREDICATECORRELATION_HPP
8
9#include <jlm/rvsdg/gamma.hpp>
10#include <jlm/rvsdg/theta.hpp>
12
13#include <optional>
14#include <variant>
15#include <vector>
16
17namespace jlm
18{
19
20namespace rvsdg
21{
22class Region;
23class ThetaNode;
24}
25
26namespace util
27{
28class StatisticsCollector;
29}
30}
31
32namespace jlm::llvm
33{
34
57
62{
63public:
68
69 using CorrelationData = std::variant<MatchCorrelationData>;
70
71private:
82
83public:
84 [[nodiscard]] CorrelationType
85 type() const noexcept
86 {
87 return type_;
88 }
89
90 [[nodiscard]] rvsdg::GammaNode &
91 gammaNode1() const noexcept
92 {
93 return gammaNode1_;
94 }
95
96 [[nodiscard]] rvsdg::GammaNode &
97 gammaNode2() const noexcept
98 {
99 return gammaNode2_;
100 }
101
102 [[nodiscard]] const CorrelationData &
103 correlationData() const noexcept
104 {
105 return correlationData_;
106 }
107
108 static std::unique_ptr<GammaGammaPredicateCorrelation>
113 {
114 return std::unique_ptr<GammaGammaPredicateCorrelation>(new GammaGammaPredicateCorrelation(
118 std::move(correlationData)));
119 }
120
121private:
126};
127
128std::optional<std::unique_ptr<GammaGammaPredicateCorrelation>>
130
136{
137public:
138 using ControlConstantCorrelationData = std::vector<uint64_t>;
139
141 {
143 std::vector<uint64_t> alternatives{};
144 };
145
150
151 using CorrelationData = std::
152 variant<ControlConstantCorrelationData, MatchConstantCorrelationData, MatchCorrelationData>;
153
154private:
156 const CorrelationType type,
159 CorrelationData correlationData)
160 : type_(type),
163 data_(std::move(correlationData))
164 {}
165
166public:
167 [[nodiscard]] CorrelationType
168 type() const noexcept
169 {
170 return type_;
171 }
172
173 [[nodiscard]] rvsdg::ThetaNode &
174 thetaNode() const noexcept
175 {
176 return thetaNode_;
177 }
178
179 [[nodiscard]] rvsdg::GammaNode &
180 gammaNode() const noexcept
181 {
182 return gammaNode_;
183 }
184
185 [[nodiscard]] const CorrelationData &
186 data() const noexcept
187 {
188 return data_;
189 }
190
191 static std::unique_ptr<ThetaGammaPredicateCorrelation>
203
204 static std::unique_ptr<ThetaGammaPredicateCorrelation>
209 {
210 return std::unique_ptr<ThetaGammaPredicateCorrelation>(new ThetaGammaPredicateCorrelation(
212 thetaNode,
213 gammaNode,
214 std::move(data)));
215 }
216
217 static std::unique_ptr<ThetaGammaPredicateCorrelation>
222 {
223 return std::unique_ptr<ThetaGammaPredicateCorrelation>(new ThetaGammaPredicateCorrelation(
225 thetaNode,
226 gammaNode,
227 std::move(data)));
228 }
229
230private:
235};
236
243std::optional<std::unique_ptr<ThetaGammaPredicateCorrelation>>
245
251
259std::optional<GammaSubregionRoles>
261
271{
272public:
273 ~PredicateCorrelation() noexcept override;
274
278
280
283
284 void
286
287private:
288 static void
290
296 static void
298
299 static bool
301
302 static bool
304};
305
306}
307
308#endif
static jlm::util::StatisticsCollector statisticsCollector
GammaGammaPredicateCorrelation(const CorrelationType type, rvsdg::GammaNode &gammaNode1, rvsdg::GammaNode &gammaNode2, CorrelationData correlationData)
static std::unique_ptr< GammaGammaPredicateCorrelation > CreateMatchCorrelation(rvsdg::GammaNode &gammaNode1, rvsdg::GammaNode &gammaNode2, MatchCorrelationData correlationData)
rvsdg::GammaNode & gammaNode2() const noexcept
const CorrelationData & correlationData() const noexcept
rvsdg::GammaNode & gammaNode1() const noexcept
std::variant< MatchCorrelationData > CorrelationData
static bool handleMatchConstantCorrelation(const ThetaGammaPredicateCorrelation &correlation)
PredicateCorrelation & operator=(const PredicateCorrelation &)=delete
static void correlatePredicatesInRegion(rvsdg::Region &region)
PredicateCorrelation(const PredicateCorrelation &)=delete
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
static bool handleControlConstantCorrelation(const ThetaGammaPredicateCorrelation &correlation)
static void correlatePredicatesInTheta(rvsdg::ThetaNode &thetaNode)
~PredicateCorrelation() noexcept override
static std::unique_ptr< ThetaGammaPredicateCorrelation > CreateMatchCorrelation(rvsdg::ThetaNode &thetaNode, rvsdg::GammaNode &gammaNode, MatchCorrelationData data)
rvsdg::GammaNode & gammaNode() const noexcept
static std::unique_ptr< ThetaGammaPredicateCorrelation > CreateMatchConstantCorrelation(rvsdg::ThetaNode &thetaNode, rvsdg::GammaNode &gammaNode, MatchConstantCorrelationData data)
rvsdg::ThetaNode & thetaNode() const noexcept
ThetaGammaPredicateCorrelation(const CorrelationType type, rvsdg::ThetaNode &thetaNode, rvsdg::GammaNode &gammaNode, CorrelationData correlationData)
const CorrelationData & data() const noexcept
std::variant< ControlConstantCorrelationData, MatchConstantCorrelationData, MatchCorrelationData > CorrelationData
static std::unique_ptr< ThetaGammaPredicateCorrelation > CreateControlConstantCorrelation(rvsdg::ThetaNode &thetaNode, rvsdg::GammaNode &gammaNode, ControlConstantCorrelationData data)
Conditional operator / pattern matching.
Definition gamma.hpp:99
Represent acyclic RVSDG subgraphs.
Definition region.hpp:213
Represents an RVSDG transformation.
Transformation(std::string_view Name)
Global memory state passed between functions.
std::optional< std::unique_ptr< ThetaGammaPredicateCorrelation > > computeThetaGammaPredicateCorrelation(rvsdg::ThetaNode &thetaNode)
std::optional< std::unique_ptr< GammaGammaPredicateCorrelation > > computeGammaGammaPredicateCorrelation(rvsdg::GammaNode &gammaNode)
std::optional< GammaSubregionRoles > determineGammaSubregionRoles(const ThetaGammaPredicateCorrelation &correlation)