5#define GEN_PASS_DECL_EMPTYPARAMLISTREMOVALPASS
6#define GEN_PASS_DECL_FLATTENINGPASS
13#ifdef GEN_PASS_DECL_EMPTYPARAMLISTREMOVALPASS
14#undef GEN_PASS_DECL_EMPTYPARAMLISTREMOVALPASS
16#ifdef GEN_PASS_DEF_EMPTYPARAMLISTREMOVALPASS
19template <
typename DerivedT>
20class EmptyParamListRemovalPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
22 using Base = EmptyParamListRemovalPassBase;
24 EmptyParamListRemovalPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
25 EmptyParamListRemovalPassBase(
const EmptyParamListRemovalPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
26 EmptyParamListRemovalPassBase& operator=(
const EmptyParamListRemovalPassBase &) =
delete;
27 EmptyParamListRemovalPassBase(EmptyParamListRemovalPassBase &&) =
delete;
28 EmptyParamListRemovalPassBase& operator=(EmptyParamListRemovalPassBase &&) =
delete;
29 ~EmptyParamListRemovalPassBase() =
default;
32 static constexpr ::llvm::StringLiteral getArgumentName() {
33 return ::llvm::StringLiteral(
"llzk-drop-empty-params");
35 ::llvm::StringRef getArgument()
const override {
return "llzk-drop-empty-params"; }
37 ::llvm::StringRef getDescription()
const override {
return "Remove empty struct parameter lists"; }
40 static constexpr ::llvm::StringLiteral getPassName() {
41 return ::llvm::StringLiteral(
"EmptyParamListRemovalPass");
43 ::llvm::StringRef getName()
const override {
return "EmptyParamListRemovalPass"; }
46 static bool classof(const ::mlir::Pass *pass) {
47 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
51 std::unique_ptr<::mlir::Pass> clonePass()
const override {
52 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
56 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
57 registry.insert<llzk::LLZKDialect>();
58 registry.insert<llzk::boolean::BoolDialect>();
59 registry.insert<llzk::array::ArrayDialect>();
60 registry.insert<llzk::component::StructDialect>();
61 registry.insert<llzk::constrain::ConstrainDialect>();
62 registry.insert<llzk::felt::FeltDialect>();
63 registry.insert<llzk::global::GlobalDialect>();
64 registry.insert<llzk::include::IncludeDialect>();
65 registry.insert<llzk::function::FunctionDialect>();
66 registry.insert<llzk::string::StringDialect>();
67 registry.insert<llzk::polymorphic::PolymorphicDialect>();
68 registry.insert<llzk::undef::UndefDialect>();
69 registry.insert<mlir::arith::ArithDialect>();
70 registry.insert<mlir::scf::SCFDialect>();
76 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EmptyParamListRemovalPassBase<DerivedT>)
82#undef GEN_PASS_DEF_EMPTYPARAMLISTREMOVALPASS
88#ifdef GEN_PASS_DECL_FLATTENINGPASS
89struct FlatteningPassOptions {
90 unsigned iterationLimit = 1000;
93#undef GEN_PASS_DECL_FLATTENINGPASS
95#ifdef GEN_PASS_DEF_FLATTENINGPASS
98template <
typename DerivedT>
99class FlatteningPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
101 using Base = FlatteningPassBase;
103 FlatteningPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
104 FlatteningPassBase(
const FlatteningPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
105 FlatteningPassBase& operator=(
const FlatteningPassBase &) =
delete;
106 FlatteningPassBase(FlatteningPassBase &&) =
delete;
107 FlatteningPassBase& operator=(FlatteningPassBase &&) =
delete;
108 ~FlatteningPassBase() =
default;
111 static constexpr ::llvm::StringLiteral getArgumentName() {
112 return ::llvm::StringLiteral(
"llzk-flatten");
114 ::llvm::StringRef getArgument()
const override {
return "llzk-flatten"; }
116 ::llvm::StringRef getDescription()
const override {
return "Flatten structs and unroll loops"; }
119 static constexpr ::llvm::StringLiteral getPassName() {
120 return ::llvm::StringLiteral(
"FlatteningPass");
122 ::llvm::StringRef getName()
const override {
return "FlatteningPass"; }
125 static bool classof(const ::mlir::Pass *pass) {
126 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
130 std::unique_ptr<::mlir::Pass> clonePass()
const override {
131 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
135 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
136 registry.insert<llzk::LLZKDialect>();
137 registry.insert<llzk::boolean::BoolDialect>();
138 registry.insert<llzk::array::ArrayDialect>();
139 registry.insert<llzk::component::StructDialect>();
140 registry.insert<llzk::constrain::ConstrainDialect>();
141 registry.insert<llzk::felt::FeltDialect>();
142 registry.insert<llzk::global::GlobalDialect>();
143 registry.insert<llzk::include::IncludeDialect>();
144 registry.insert<llzk::function::FunctionDialect>();
145 registry.insert<llzk::string::StringDialect>();
146 registry.insert<llzk::polymorphic::PolymorphicDialect>();
147 registry.insert<llzk::undef::UndefDialect>();
148 registry.insert<mlir::arith::ArithDialect>();
149 registry.insert<mlir::scf::SCFDialect>();
155 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FlatteningPassBase<DerivedT>)
157 FlatteningPassBase(FlatteningPassOptions options) : FlatteningPassBase() {
158 iterationLimit = std::move(options.iterationLimit);
159 cleanupMode = std::move(options.cleanupMode);
162 ::mlir::Pass::Option<unsigned> iterationLimit{*
this,
"max-iter", ::llvm::cl::desc(
"Maximum number of times the pass will run if a fixpoint is not reached earlier. Unrolling loops can provide more opportunities for instantiating structs but the converse is true as well. Thus, the pass will run multiple times until no further changes can be made or the upper limit provided in this option is reached."), ::llvm::cl::init(1000)};
163 ::mlir::Pass::Option<::llzk::polymorphic::StructCleanupMode> cleanupMode{*
this,
"cleanup", ::llvm::cl::desc(
"Specifies the extent to which unused parameterized structs are removed during the flattening pass."), ::llvm::cl::init(
::llzk::polymorphic::StructCleanupMode::Preimage), ::llvm::cl::values(
168 "Only structs that were replaced with concrete instantiations are deleted."),
171 "All structs that cannot be reached by a use-def chain from some concrete struct are deleted."),
174 "All structs that cannot be reached by a use-def chain from the \"Main\" struct are deleted.")
179#undef GEN_PASS_DEF_FLATTENINGPASS
181#ifdef GEN_PASS_REGISTRATION
188 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
195 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
205 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
212 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
225#undef GEN_PASS_REGISTRATION
228#ifdef GEN_PASS_CLASSES
230template <
typename DerivedT>
231class EmptyParamListRemovalPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
233 using Base = EmptyParamListRemovalPassBase;
235 EmptyParamListRemovalPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
236 EmptyParamListRemovalPassBase(
const EmptyParamListRemovalPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
237 EmptyParamListRemovalPassBase& operator=(
const EmptyParamListRemovalPassBase &) =
delete;
238 EmptyParamListRemovalPassBase(EmptyParamListRemovalPassBase &&) =
delete;
239 EmptyParamListRemovalPassBase& operator=(EmptyParamListRemovalPassBase &&) =
delete;
240 ~EmptyParamListRemovalPassBase() =
default;
243 static constexpr ::llvm::StringLiteral getArgumentName() {
244 return ::llvm::StringLiteral(
"llzk-drop-empty-params");
246 ::llvm::StringRef getArgument()
const override {
return "llzk-drop-empty-params"; }
248 ::llvm::StringRef getDescription()
const override {
return "Remove empty struct parameter lists"; }
251 static constexpr ::llvm::StringLiteral getPassName() {
252 return ::llvm::StringLiteral(
"EmptyParamListRemovalPass");
254 ::llvm::StringRef getName()
const override {
return "EmptyParamListRemovalPass"; }
257 static bool classof(const ::mlir::Pass *pass) {
258 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
262 std::unique_ptr<::mlir::Pass> clonePass()
const override {
263 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
267 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
268 registry.insert<llzk::LLZKDialect>();
269 registry.insert<llzk::boolean::BoolDialect>();
270 registry.insert<llzk::array::ArrayDialect>();
271 registry.insert<llzk::component::StructDialect>();
272 registry.insert<llzk::constrain::ConstrainDialect>();
273 registry.insert<llzk::felt::FeltDialect>();
274 registry.insert<llzk::global::GlobalDialect>();
275 registry.insert<llzk::include::IncludeDialect>();
276 registry.insert<llzk::function::FunctionDialect>();
277 registry.insert<llzk::string::StringDialect>();
278 registry.insert<llzk::polymorphic::PolymorphicDialect>();
279 registry.insert<llzk::undef::UndefDialect>();
280 registry.insert<mlir::arith::ArithDialect>();
281 registry.insert<mlir::scf::SCFDialect>();
287 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EmptyParamListRemovalPassBase<DerivedT>)
292template <
typename DerivedT>
293class FlatteningPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
295 using Base = FlatteningPassBase;
297 FlatteningPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
298 FlatteningPassBase(
const FlatteningPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
299 FlatteningPassBase& operator=(
const FlatteningPassBase &) =
delete;
300 FlatteningPassBase(FlatteningPassBase &&) =
delete;
301 FlatteningPassBase& operator=(FlatteningPassBase &&) =
delete;
302 ~FlatteningPassBase() =
default;
305 static constexpr ::llvm::StringLiteral getArgumentName() {
306 return ::llvm::StringLiteral(
"llzk-flatten");
308 ::llvm::StringRef getArgument()
const override {
return "llzk-flatten"; }
310 ::llvm::StringRef getDescription()
const override {
return "Flatten structs and unroll loops"; }
313 static constexpr ::llvm::StringLiteral getPassName() {
314 return ::llvm::StringLiteral(
"FlatteningPass");
316 ::llvm::StringRef getName()
const override {
return "FlatteningPass"; }
319 static bool classof(const ::mlir::Pass *pass) {
320 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
324 std::unique_ptr<::mlir::Pass> clonePass()
const override {
325 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
329 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
330 registry.insert<llzk::LLZKDialect>();
331 registry.insert<llzk::boolean::BoolDialect>();
332 registry.insert<llzk::array::ArrayDialect>();
333 registry.insert<llzk::component::StructDialect>();
334 registry.insert<llzk::constrain::ConstrainDialect>();
335 registry.insert<llzk::felt::FeltDialect>();
336 registry.insert<llzk::global::GlobalDialect>();
337 registry.insert<llzk::include::IncludeDialect>();
338 registry.insert<llzk::function::FunctionDialect>();
339 registry.insert<llzk::string::StringDialect>();
340 registry.insert<llzk::polymorphic::PolymorphicDialect>();
341 registry.insert<llzk::undef::UndefDialect>();
342 registry.insert<mlir::arith::ArithDialect>();
343 registry.insert<mlir::scf::SCFDialect>();
349 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FlatteningPassBase<DerivedT>)
352 ::mlir::Pass::Option<unsigned> iterationLimit{*
this,
"max-iter", ::llvm::cl::desc(
"Maximum number of times the pass will run if a fixpoint is not reached earlier. Unrolling loops can provide more opportunities for instantiating structs but the converse is true as well. Thus, the pass will run multiple times until no further changes can be made or the upper limit provided in this option is reached."), ::llvm::cl::init(1000)};
353 ::mlir::Pass::Option<::llzk::polymorphic::StructCleanupMode> cleanupMode{*
this,
"cleanup", ::llvm::cl::desc(
"Specifies the extent to which unused parameterized structs are removed during the flattening pass."), ::llvm::cl::init(
::llzk::polymorphic::StructCleanupMode::Preimage), ::llvm::cl::values(
358 "Only structs that were replaced with concrete instantiations are deleted."),
361 "All structs that cannot be reached by a use-def chain from some concrete struct are deleted."),
364 "All structs that cannot be reached by a use-def chain from the \"Main\" struct are deleted.")
367#undef GEN_PASS_CLASSES
void registerTransformationPasses()
void registerFlatteningPass()
void registerEmptyParamListRemovalPassPass()
std::unique_ptr< mlir::Pass > createFlatteningPass()
void registerFlatteningPassPass()
std::unique_ptr< mlir::Pass > createEmptyParamListRemoval()
::llvm::StringRef stringifyStructCleanupMode(StructCleanupMode val)
void registerEmptyParamListRemovalPass()