LLZK 2.1.1
An open-source IR for Zero Knowledge (ZK) circuits
Loading...
Searching...
No Matches
LLZKTransformationPasses.h.inc
Go to the documentation of this file.
1/* Autogenerated by mlir-tblgen; don't manually edit */
2
3#ifdef GEN_PASS_DECL
4// Generate declarations for all passes.
5#define GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
6#define GEN_PASS_DECL_ENFORCENOMEMBEROVERWRITEPASS
7#define GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
8#define GEN_PASS_DECL_INLINESTRUCTSPASS
9#define GEN_PASS_DECL_POLYLOWERINGPASS
10#define GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
11#define GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
12#define GEN_PASS_DECL_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
13#define GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
14#define GEN_PASS_DECL_WHILETOFORPASS
15#undef GEN_PASS_DECL
16#endif // GEN_PASS_DECL
17
18//===----------------------------------------------------------------------===//
19// ComputeConstrainToProductPass
20//===----------------------------------------------------------------------===//
21#ifdef GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
22struct ComputeConstrainToProductPassOptions {
23 std::string rootStruct = "@Main";
24};
25std::unique_ptr<::mlir::Pass> createComputeConstrainToProductPass();
26std::unique_ptr<::mlir::Pass> createComputeConstrainToProductPass(ComputeConstrainToProductPassOptions options);
27#undef GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
28#endif // GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
29#ifdef GEN_PASS_DEF_COMPUTECONSTRAINTOPRODUCTPASS
30
31namespace impl {
32 std::unique_ptr<::mlir::Pass> createComputeConstrainToProductPass();
33} // namespace impl
34
35namespace impl {
36 std::unique_ptr<::mlir::Pass> createComputeConstrainToProductPass(ComputeConstrainToProductPassOptions options);
37} // namespace impl
38namespace impl {
39
40template <typename DerivedT>
41class ComputeConstrainToProductPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
42public:
43 using Base = ComputeConstrainToProductPassBase;
44
45 ComputeConstrainToProductPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
46 ComputeConstrainToProductPassBase(const ComputeConstrainToProductPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
47 ComputeConstrainToProductPassBase& operator=(const ComputeConstrainToProductPassBase &) = delete;
48 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassBase &&) = delete;
49 ComputeConstrainToProductPassBase& operator=(ComputeConstrainToProductPassBase &&) = delete;
50 ~ComputeConstrainToProductPassBase() = default;
51
53 static constexpr ::llvm::StringLiteral getArgumentName() {
54 return ::llvm::StringLiteral("llzk-compute-constrain-to-product");
55 }
56 ::llvm::StringRef getArgument() const override { return "llzk-compute-constrain-to-product"; }
57
58 ::llvm::StringRef getDescription() const override { return "Replace separate @compute and @constrain functions in a struct with a single @product function"; }
59
61 static constexpr ::llvm::StringLiteral getPassName() {
62 return ::llvm::StringLiteral("ComputeConstrainToProductPass");
63 }
64 ::llvm::StringRef getName() const override { return "ComputeConstrainToProductPass"; }
65
67 static bool classof(const ::mlir::Pass *pass) {
68 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
69 }
70
72 std::unique_ptr<::mlir::Pass> clonePass() const override {
73 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
74 }
75
77 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
78 registry.insert<llzk::LLZKDialect>();
79 registry.insert<llzk::boolean::BoolDialect>();
80 registry.insert<llzk::array::ArrayDialect>();
81 registry.insert<llzk::component::StructDialect>();
82 registry.insert<llzk::constrain::ConstrainDialect>();
83 registry.insert<llzk::felt::FeltDialect>();
84 registry.insert<llzk::global::GlobalDialect>();
85 registry.insert<llzk::include::IncludeDialect>();
86 registry.insert<llzk::function::FunctionDialect>();
87 registry.insert<llzk::string::StringDialect>();
88 registry.insert<llzk::polymorphic::PolymorphicDialect>();
89 registry.insert<mlir::arith::ArithDialect>();
90 registry.insert<mlir::scf::SCFDialect>();
91 }
92
96 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ComputeConstrainToProductPassBase<DerivedT>)
97
98 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassOptions options) : ComputeConstrainToProductPassBase() {
99 rootStruct = std::move(options.rootStruct);
100 }
101protected:
102 ::mlir::Pass::Option<std::string> rootStruct{*this, "root-struct", ::llvm::cl::desc("Root struct at which to start alignment (default to `@Main`)"), ::llvm::cl::init("@Main")};
103private:
104
105 friend std::unique_ptr<::mlir::Pass> createComputeConstrainToProductPass() {
106 return std::make_unique<DerivedT>();
107 }
108
109 friend std::unique_ptr<::mlir::Pass> createComputeConstrainToProductPass(ComputeConstrainToProductPassOptions options) {
110 return std::make_unique<DerivedT>(std::move(options));
111 }
112};
113} // namespace impl
114
115std::unique_ptr<::mlir::Pass> createComputeConstrainToProductPass() {
116 return impl::createComputeConstrainToProductPass();
117}
118
119std::unique_ptr<::mlir::Pass> createComputeConstrainToProductPass(ComputeConstrainToProductPassOptions options) {
120 return impl::createComputeConstrainToProductPass(std::move(options));
121}
122#undef GEN_PASS_DEF_COMPUTECONSTRAINTOPRODUCTPASS
123#endif // GEN_PASS_DEF_COMPUTECONSTRAINTOPRODUCTPASS
124
125//===----------------------------------------------------------------------===//
126// EnforceNoMemberOverwritePass
127//===----------------------------------------------------------------------===//
128#ifdef GEN_PASS_DECL_ENFORCENOMEMBEROVERWRITEPASS
129std::unique_ptr<::mlir::Pass> createEnforceNoMemberOverwritePass();
130#undef GEN_PASS_DECL_ENFORCENOMEMBEROVERWRITEPASS
131#endif // GEN_PASS_DECL_ENFORCENOMEMBEROVERWRITEPASS
132#ifdef GEN_PASS_DEF_ENFORCENOMEMBEROVERWRITEPASS
133
134namespace impl {
135 std::unique_ptr<::mlir::Pass> createEnforceNoMemberOverwritePass();
136} // namespace impl
137namespace impl {
138
139template <typename DerivedT>
140class EnforceNoMemberOverwritePassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
141public:
142 using Base = EnforceNoMemberOverwritePassBase;
143
144 EnforceNoMemberOverwritePassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
145 EnforceNoMemberOverwritePassBase(const EnforceNoMemberOverwritePassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
146 EnforceNoMemberOverwritePassBase& operator=(const EnforceNoMemberOverwritePassBase &) = delete;
147 EnforceNoMemberOverwritePassBase(EnforceNoMemberOverwritePassBase &&) = delete;
148 EnforceNoMemberOverwritePassBase& operator=(EnforceNoMemberOverwritePassBase &&) = delete;
149 ~EnforceNoMemberOverwritePassBase() = default;
150
152 static constexpr ::llvm::StringLiteral getArgumentName() {
153 return ::llvm::StringLiteral("llzk-enforce-no-overwrite");
154 }
155 ::llvm::StringRef getArgument() const override { return "llzk-enforce-no-overwrite"; }
156
157 ::llvm::StringRef getDescription() const override { return "Checks that every struct member is written exactly once"; }
158
160 static constexpr ::llvm::StringLiteral getPassName() {
161 return ::llvm::StringLiteral("EnforceNoMemberOverwritePass");
162 }
163 ::llvm::StringRef getName() const override { return "EnforceNoMemberOverwritePass"; }
164
166 static bool classof(const ::mlir::Pass *pass) {
167 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
168 }
169
171 std::unique_ptr<::mlir::Pass> clonePass() const override {
172 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
173 }
174
176 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
177 registry.insert<llzk::LLZKDialect>();
178 registry.insert<llzk::boolean::BoolDialect>();
179 registry.insert<llzk::array::ArrayDialect>();
180 registry.insert<llzk::component::StructDialect>();
181 registry.insert<llzk::constrain::ConstrainDialect>();
182 registry.insert<llzk::felt::FeltDialect>();
183 registry.insert<llzk::global::GlobalDialect>();
184 registry.insert<llzk::include::IncludeDialect>();
185 registry.insert<llzk::function::FunctionDialect>();
186 registry.insert<llzk::string::StringDialect>();
187 registry.insert<llzk::polymorphic::PolymorphicDialect>();
188 registry.insert<mlir::arith::ArithDialect>();
189 registry.insert<mlir::scf::SCFDialect>();
190 }
191
195 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EnforceNoMemberOverwritePassBase<DerivedT>)
196
197protected:
198private:
199
200 friend std::unique_ptr<::mlir::Pass> createEnforceNoMemberOverwritePass() {
201 return std::make_unique<DerivedT>();
202 }
203};
204} // namespace impl
205
206std::unique_ptr<::mlir::Pass> createEnforceNoMemberOverwritePass() {
207 return impl::createEnforceNoMemberOverwritePass();
208}
209#undef GEN_PASS_DEF_ENFORCENOMEMBEROVERWRITEPASS
210#endif // GEN_PASS_DEF_ENFORCENOMEMBEROVERWRITEPASS
211
212//===----------------------------------------------------------------------===//
213// FuseProductLoopsPass
214//===----------------------------------------------------------------------===//
215#ifdef GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
216std::unique_ptr<::mlir::Pass> createFuseProductLoopsPass();
217#undef GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
218#endif // GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
219#ifdef GEN_PASS_DEF_FUSEPRODUCTLOOPSPASS
220
221namespace impl {
222 std::unique_ptr<::mlir::Pass> createFuseProductLoopsPass();
223} // namespace impl
224namespace impl {
225
226template <typename DerivedT>
227class FuseProductLoopsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
228public:
229 using Base = FuseProductLoopsPassBase;
230
231 FuseProductLoopsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
232 FuseProductLoopsPassBase(const FuseProductLoopsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
233 FuseProductLoopsPassBase& operator=(const FuseProductLoopsPassBase &) = delete;
234 FuseProductLoopsPassBase(FuseProductLoopsPassBase &&) = delete;
235 FuseProductLoopsPassBase& operator=(FuseProductLoopsPassBase &&) = delete;
236 ~FuseProductLoopsPassBase() = default;
237
239 static constexpr ::llvm::StringLiteral getArgumentName() {
240 return ::llvm::StringLiteral("llzk-fuse-product-loops");
241 }
242 ::llvm::StringRef getArgument() const override { return "llzk-fuse-product-loops"; }
243
244 ::llvm::StringRef getDescription() const override { return "Fuse matching witness/constraint loops in a @product function"; }
245
247 static constexpr ::llvm::StringLiteral getPassName() {
248 return ::llvm::StringLiteral("FuseProductLoopsPass");
249 }
250 ::llvm::StringRef getName() const override { return "FuseProductLoopsPass"; }
251
253 static bool classof(const ::mlir::Pass *pass) {
254 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
255 }
256
258 std::unique_ptr<::mlir::Pass> clonePass() const override {
259 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
260 }
261
263 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
264 registry.insert<llzk::LLZKDialect>();
265 registry.insert<llzk::boolean::BoolDialect>();
266 registry.insert<llzk::array::ArrayDialect>();
267 registry.insert<llzk::component::StructDialect>();
268 registry.insert<llzk::constrain::ConstrainDialect>();
269 registry.insert<llzk::felt::FeltDialect>();
270 registry.insert<llzk::global::GlobalDialect>();
271 registry.insert<llzk::include::IncludeDialect>();
272 registry.insert<llzk::function::FunctionDialect>();
273 registry.insert<llzk::string::StringDialect>();
274 registry.insert<llzk::polymorphic::PolymorphicDialect>();
275 registry.insert<mlir::arith::ArithDialect>();
276 registry.insert<mlir::scf::SCFDialect>();
277 }
278
282 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FuseProductLoopsPassBase<DerivedT>)
283
284protected:
285private:
286
287 friend std::unique_ptr<::mlir::Pass> createFuseProductLoopsPass() {
288 return std::make_unique<DerivedT>();
289 }
290};
291} // namespace impl
292
293std::unique_ptr<::mlir::Pass> createFuseProductLoopsPass() {
294 return impl::createFuseProductLoopsPass();
295}
296#undef GEN_PASS_DEF_FUSEPRODUCTLOOPSPASS
297#endif // GEN_PASS_DEF_FUSEPRODUCTLOOPSPASS
298
299//===----------------------------------------------------------------------===//
300// InlineStructsPass
301//===----------------------------------------------------------------------===//
302#ifdef GEN_PASS_DECL_INLINESTRUCTSPASS
303struct InlineStructsPassOptions {
304 uint64_t maxComplexity = 0;
305};
306std::unique_ptr<::mlir::Pass> createInlineStructsPass();
307std::unique_ptr<::mlir::Pass> createInlineStructsPass(InlineStructsPassOptions options);
308#undef GEN_PASS_DECL_INLINESTRUCTSPASS
309#endif // GEN_PASS_DECL_INLINESTRUCTSPASS
310#ifdef GEN_PASS_DEF_INLINESTRUCTSPASS
311
312namespace impl {
313 std::unique_ptr<::mlir::Pass> createInlineStructsPass();
314} // namespace impl
315
316namespace impl {
317 std::unique_ptr<::mlir::Pass> createInlineStructsPass(InlineStructsPassOptions options);
318} // namespace impl
319namespace impl {
320
321template <typename DerivedT>
322class InlineStructsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
323public:
324 using Base = InlineStructsPassBase;
325
326 InlineStructsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
327 InlineStructsPassBase(const InlineStructsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
328 InlineStructsPassBase& operator=(const InlineStructsPassBase &) = delete;
329 InlineStructsPassBase(InlineStructsPassBase &&) = delete;
330 InlineStructsPassBase& operator=(InlineStructsPassBase &&) = delete;
331 ~InlineStructsPassBase() = default;
332
334 static constexpr ::llvm::StringLiteral getArgumentName() {
335 return ::llvm::StringLiteral("llzk-inline-structs");
336 }
337 ::llvm::StringRef getArgument() const override { return "llzk-inline-structs"; }
338
339 ::llvm::StringRef getDescription() const override { return "Inlines nested structs (i.e., subcomponents)."; }
340
342 static constexpr ::llvm::StringLiteral getPassName() {
343 return ::llvm::StringLiteral("InlineStructsPass");
344 }
345 ::llvm::StringRef getName() const override { return "InlineStructsPass"; }
346
348 static bool classof(const ::mlir::Pass *pass) {
349 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
350 }
351
353 std::unique_ptr<::mlir::Pass> clonePass() const override {
354 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
355 }
356
358 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
359 registry.insert<llzk::LLZKDialect>();
360 registry.insert<llzk::boolean::BoolDialect>();
361 registry.insert<llzk::array::ArrayDialect>();
362 registry.insert<llzk::component::StructDialect>();
363 registry.insert<llzk::constrain::ConstrainDialect>();
364 registry.insert<llzk::felt::FeltDialect>();
365 registry.insert<llzk::global::GlobalDialect>();
366 registry.insert<llzk::include::IncludeDialect>();
367 registry.insert<llzk::function::FunctionDialect>();
368 registry.insert<llzk::string::StringDialect>();
369 registry.insert<llzk::polymorphic::PolymorphicDialect>();
370 registry.insert<mlir::arith::ArithDialect>();
371 registry.insert<mlir::scf::SCFDialect>();
372 }
373
377 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
378
379 InlineStructsPassBase(InlineStructsPassOptions options) : InlineStructsPassBase() {
380 maxComplexity = std::move(options.maxComplexity);
381 }
382protected:
383 ::mlir::Pass::Option<uint64_t> maxComplexity{*this, "max-merge-complexity", ::llvm::cl::desc("Maximum allowed constraint+multiplications in merged @constrain functions"), ::llvm::cl::init(0)};
384private:
385
386 friend std::unique_ptr<::mlir::Pass> createInlineStructsPass() {
387 return std::make_unique<DerivedT>();
388 }
389
390 friend std::unique_ptr<::mlir::Pass> createInlineStructsPass(InlineStructsPassOptions options) {
391 return std::make_unique<DerivedT>(std::move(options));
392 }
393};
394} // namespace impl
395
396std::unique_ptr<::mlir::Pass> createInlineStructsPass() {
397 return impl::createInlineStructsPass();
398}
399
400std::unique_ptr<::mlir::Pass> createInlineStructsPass(InlineStructsPassOptions options) {
401 return impl::createInlineStructsPass(std::move(options));
402}
403#undef GEN_PASS_DEF_INLINESTRUCTSPASS
404#endif // GEN_PASS_DEF_INLINESTRUCTSPASS
405
406//===----------------------------------------------------------------------===//
407// PolyLoweringPass
408//===----------------------------------------------------------------------===//
409#ifdef GEN_PASS_DECL_POLYLOWERINGPASS
410struct PolyLoweringPassOptions {
411 unsigned maxDegree = 2;
412};
413std::unique_ptr<::mlir::Pass> createPolyLoweringPass();
414std::unique_ptr<::mlir::Pass> createPolyLoweringPass(PolyLoweringPassOptions options);
415#undef GEN_PASS_DECL_POLYLOWERINGPASS
416#endif // GEN_PASS_DECL_POLYLOWERINGPASS
417#ifdef GEN_PASS_DEF_POLYLOWERINGPASS
418
419namespace impl {
420 std::unique_ptr<::mlir::Pass> createPolyLoweringPass();
421} // namespace impl
422
423namespace impl {
424 std::unique_ptr<::mlir::Pass> createPolyLoweringPass(PolyLoweringPassOptions options);
425} // namespace impl
426namespace impl {
427
428template <typename DerivedT>
429class PolyLoweringPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
430public:
431 using Base = PolyLoweringPassBase;
432
433 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
434 PolyLoweringPassBase(const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
435 PolyLoweringPassBase& operator=(const PolyLoweringPassBase &) = delete;
436 PolyLoweringPassBase(PolyLoweringPassBase &&) = delete;
437 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) = delete;
438 ~PolyLoweringPassBase() = default;
439
441 static constexpr ::llvm::StringLiteral getArgumentName() {
442 return ::llvm::StringLiteral("llzk-poly-lowering-pass");
443 }
444 ::llvm::StringRef getArgument() const override { return "llzk-poly-lowering-pass"; }
445
446 ::llvm::StringRef getDescription() const override { return "Lower the degree of all polynomial equations to a specified maximum"; }
447
449 static constexpr ::llvm::StringLiteral getPassName() {
450 return ::llvm::StringLiteral("PolyLoweringPass");
451 }
452 ::llvm::StringRef getName() const override { return "PolyLoweringPass"; }
453
455 static bool classof(const ::mlir::Pass *pass) {
456 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
457 }
458
460 std::unique_ptr<::mlir::Pass> clonePass() const override {
461 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
462 }
463
465 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
466 registry.insert<llzk::LLZKDialect>();
467 registry.insert<llzk::boolean::BoolDialect>();
468 registry.insert<llzk::array::ArrayDialect>();
469 registry.insert<llzk::component::StructDialect>();
470 registry.insert<llzk::constrain::ConstrainDialect>();
471 registry.insert<llzk::felt::FeltDialect>();
472 registry.insert<llzk::global::GlobalDialect>();
473 registry.insert<llzk::include::IncludeDialect>();
474 registry.insert<llzk::function::FunctionDialect>();
475 registry.insert<llzk::string::StringDialect>();
476 registry.insert<llzk::polymorphic::PolymorphicDialect>();
477 registry.insert<mlir::arith::ArithDialect>();
478 registry.insert<mlir::scf::SCFDialect>();
479 }
480
484 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
485
486 PolyLoweringPassBase(PolyLoweringPassOptions options) : PolyLoweringPassBase() {
487 maxDegree = std::move(options.maxDegree);
488 }
489protected:
490 ::mlir::Pass::Option<unsigned> maxDegree{*this, "max-degree", ::llvm::cl::desc("Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
491private:
492
493 friend std::unique_ptr<::mlir::Pass> createPolyLoweringPass() {
494 return std::make_unique<DerivedT>();
495 }
496
497 friend std::unique_ptr<::mlir::Pass> createPolyLoweringPass(PolyLoweringPassOptions options) {
498 return std::make_unique<DerivedT>(std::move(options));
499 }
500};
501} // namespace impl
502
503std::unique_ptr<::mlir::Pass> createPolyLoweringPass() {
504 return impl::createPolyLoweringPass();
505}
506
507std::unique_ptr<::mlir::Pass> createPolyLoweringPass(PolyLoweringPassOptions options) {
508 return impl::createPolyLoweringPass(std::move(options));
509}
510#undef GEN_PASS_DEF_POLYLOWERINGPASS
511#endif // GEN_PASS_DEF_POLYLOWERINGPASS
512
513//===----------------------------------------------------------------------===//
514// RedundantOperationEliminationPass
515//===----------------------------------------------------------------------===//
516#ifdef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
517std::unique_ptr<::mlir::Pass> createRedundantOperationEliminationPass();
518#undef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
519#endif // GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
520#ifdef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
521
522namespace impl {
523 std::unique_ptr<::mlir::Pass> createRedundantOperationEliminationPass();
524} // namespace impl
525namespace impl {
526
527template <typename DerivedT>
528class RedundantOperationEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
529public:
530 using Base = RedundantOperationEliminationPassBase;
531
532 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
533 RedundantOperationEliminationPassBase(const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
534 RedundantOperationEliminationPassBase& operator=(const RedundantOperationEliminationPassBase &) = delete;
535 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) = delete;
536 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) = delete;
537 ~RedundantOperationEliminationPassBase() = default;
538
540 static constexpr ::llvm::StringLiteral getArgumentName() {
541 return ::llvm::StringLiteral("llzk-duplicate-op-elim");
542 }
543 ::llvm::StringRef getArgument() const override { return "llzk-duplicate-op-elim"; }
544
545 ::llvm::StringRef getDescription() const override { return "Remove redundant operations"; }
546
548 static constexpr ::llvm::StringLiteral getPassName() {
549 return ::llvm::StringLiteral("RedundantOperationEliminationPass");
550 }
551 ::llvm::StringRef getName() const override { return "RedundantOperationEliminationPass"; }
552
554 static bool classof(const ::mlir::Pass *pass) {
555 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
556 }
557
559 std::unique_ptr<::mlir::Pass> clonePass() const override {
560 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
561 }
562
564 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
565 registry.insert<llzk::LLZKDialect>();
566 registry.insert<llzk::boolean::BoolDialect>();
567 registry.insert<llzk::array::ArrayDialect>();
568 registry.insert<llzk::component::StructDialect>();
569 registry.insert<llzk::constrain::ConstrainDialect>();
570 registry.insert<llzk::felt::FeltDialect>();
571 registry.insert<llzk::global::GlobalDialect>();
572 registry.insert<llzk::include::IncludeDialect>();
573 registry.insert<llzk::function::FunctionDialect>();
574 registry.insert<llzk::string::StringDialect>();
575 registry.insert<llzk::polymorphic::PolymorphicDialect>();
576 registry.insert<mlir::arith::ArithDialect>();
577 registry.insert<mlir::scf::SCFDialect>();
578 }
579
583 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
584
585protected:
586private:
587
588 friend std::unique_ptr<::mlir::Pass> createRedundantOperationEliminationPass() {
589 return std::make_unique<DerivedT>();
590 }
591};
592} // namespace impl
593
594std::unique_ptr<::mlir::Pass> createRedundantOperationEliminationPass() {
595 return impl::createRedundantOperationEliminationPass();
596}
597#undef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
598#endif // GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
599
600//===----------------------------------------------------------------------===//
601// RedundantReadAndWriteEliminationPass
602//===----------------------------------------------------------------------===//
603#ifdef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
604std::unique_ptr<::mlir::Pass> createRedundantReadAndWriteEliminationPass();
605#undef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
606#endif // GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
607#ifdef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
608
609namespace impl {
610 std::unique_ptr<::mlir::Pass> createRedundantReadAndWriteEliminationPass();
611} // namespace impl
612namespace impl {
613
614template <typename DerivedT>
615class RedundantReadAndWriteEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
616public:
617 using Base = RedundantReadAndWriteEliminationPassBase;
618
619 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
620 RedundantReadAndWriteEliminationPassBase(const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
621 RedundantReadAndWriteEliminationPassBase& operator=(const RedundantReadAndWriteEliminationPassBase &) = delete;
622 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) = delete;
623 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) = delete;
624 ~RedundantReadAndWriteEliminationPassBase() = default;
625
627 static constexpr ::llvm::StringLiteral getArgumentName() {
628 return ::llvm::StringLiteral("llzk-duplicate-read-write-elim");
629 }
630 ::llvm::StringRef getArgument() const override { return "llzk-duplicate-read-write-elim"; }
631
632 ::llvm::StringRef getDescription() const override { return "Remove redundant reads and writes"; }
633
635 static constexpr ::llvm::StringLiteral getPassName() {
636 return ::llvm::StringLiteral("RedundantReadAndWriteEliminationPass");
637 }
638 ::llvm::StringRef getName() const override { return "RedundantReadAndWriteEliminationPass"; }
639
641 static bool classof(const ::mlir::Pass *pass) {
642 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
643 }
644
646 std::unique_ptr<::mlir::Pass> clonePass() const override {
647 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
648 }
649
651 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
652 registry.insert<llzk::LLZKDialect>();
653 registry.insert<llzk::boolean::BoolDialect>();
654 registry.insert<llzk::array::ArrayDialect>();
655 registry.insert<llzk::component::StructDialect>();
656 registry.insert<llzk::constrain::ConstrainDialect>();
657 registry.insert<llzk::felt::FeltDialect>();
658 registry.insert<llzk::global::GlobalDialect>();
659 registry.insert<llzk::include::IncludeDialect>();
660 registry.insert<llzk::function::FunctionDialect>();
661 registry.insert<llzk::string::StringDialect>();
662 registry.insert<llzk::polymorphic::PolymorphicDialect>();
663 registry.insert<mlir::arith::ArithDialect>();
664 registry.insert<mlir::scf::SCFDialect>();
665 }
666
670 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
671
672protected:
673private:
674
675 friend std::unique_ptr<::mlir::Pass> createRedundantReadAndWriteEliminationPass() {
676 return std::make_unique<DerivedT>();
677 }
678};
679} // namespace impl
680
681std::unique_ptr<::mlir::Pass> createRedundantReadAndWriteEliminationPass() {
682 return impl::createRedundantReadAndWriteEliminationPass();
683}
684#undef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
685#endif // GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
686
687//===----------------------------------------------------------------------===//
688// RemoveUnusedDiscardableAllocationsPass
689//===----------------------------------------------------------------------===//
690#ifdef GEN_PASS_DECL_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
691struct RemoveUnusedDiscardableAllocationsPassOptions {
692 std::string allocatorOpName = "";
693};
694std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass();
695std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass(RemoveUnusedDiscardableAllocationsPassOptions options);
696#undef GEN_PASS_DECL_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
697#endif // GEN_PASS_DECL_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
698#ifdef GEN_PASS_DEF_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
699
700namespace impl {
701 std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass();
702} // namespace impl
703
704namespace impl {
705 std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass(RemoveUnusedDiscardableAllocationsPassOptions options);
706} // namespace impl
707namespace impl {
708
709template <typename DerivedT>
710class RemoveUnusedDiscardableAllocationsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
711public:
712 using Base = RemoveUnusedDiscardableAllocationsPassBase;
713
714 RemoveUnusedDiscardableAllocationsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
715 RemoveUnusedDiscardableAllocationsPassBase(const RemoveUnusedDiscardableAllocationsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
716 RemoveUnusedDiscardableAllocationsPassBase& operator=(const RemoveUnusedDiscardableAllocationsPassBase &) = delete;
717 RemoveUnusedDiscardableAllocationsPassBase(RemoveUnusedDiscardableAllocationsPassBase &&) = delete;
718 RemoveUnusedDiscardableAllocationsPassBase& operator=(RemoveUnusedDiscardableAllocationsPassBase &&) = delete;
719 ~RemoveUnusedDiscardableAllocationsPassBase() = default;
720
722 static constexpr ::llvm::StringLiteral getArgumentName() {
723 return ::llvm::StringLiteral("llzk-remove-unused-discardable-allocations");
724 }
725 ::llvm::StringRef getArgument() const override { return "llzk-remove-unused-discardable-allocations"; }
726
727 ::llvm::StringRef getDescription() const override { return "Remove unread discardable allocations and their dead stores"; }
728
730 static constexpr ::llvm::StringLiteral getPassName() {
731 return ::llvm::StringLiteral("RemoveUnusedDiscardableAllocationsPass");
732 }
733 ::llvm::StringRef getName() const override { return "RemoveUnusedDiscardableAllocationsPass"; }
734
736 static bool classof(const ::mlir::Pass *pass) {
737 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
738 }
739
741 std::unique_ptr<::mlir::Pass> clonePass() const override {
742 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
743 }
744
746 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
747 registry.insert<llzk::LLZKDialect>();
748 registry.insert<llzk::boolean::BoolDialect>();
749 registry.insert<llzk::array::ArrayDialect>();
750 registry.insert<llzk::component::StructDialect>();
751 registry.insert<llzk::constrain::ConstrainDialect>();
752 registry.insert<llzk::felt::FeltDialect>();
753 registry.insert<llzk::global::GlobalDialect>();
754 registry.insert<llzk::include::IncludeDialect>();
755 registry.insert<llzk::function::FunctionDialect>();
756 registry.insert<llzk::string::StringDialect>();
757 registry.insert<llzk::polymorphic::PolymorphicDialect>();
758 registry.insert<mlir::arith::ArithDialect>();
759 registry.insert<mlir::scf::SCFDialect>();
760 }
761
765 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RemoveUnusedDiscardableAllocationsPassBase<DerivedT>)
766
767 RemoveUnusedDiscardableAllocationsPassBase(RemoveUnusedDiscardableAllocationsPassOptions options) : RemoveUnusedDiscardableAllocationsPassBase() {
768 allocatorOpName = std::move(options.allocatorOpName);
769 }
770protected:
771 ::mlir::Pass::Option<std::string> allocatorOpName{*this, "allocator-op", ::llvm::cl::desc("Operation name of the discardable allocator to remove"), ::llvm::cl::init("")};
772private:
773
774 friend std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass() {
775 return std::make_unique<DerivedT>();
776 }
777
778 friend std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass(RemoveUnusedDiscardableAllocationsPassOptions options) {
779 return std::make_unique<DerivedT>(std::move(options));
780 }
781};
782} // namespace impl
783
784std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass() {
785 return impl::createRemoveUnusedDiscardableAllocationsPass();
786}
787
788std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass(RemoveUnusedDiscardableAllocationsPassOptions options) {
789 return impl::createRemoveUnusedDiscardableAllocationsPass(std::move(options));
790}
791#undef GEN_PASS_DEF_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
792#endif // GEN_PASS_DEF_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
793
794//===----------------------------------------------------------------------===//
795// UnusedDeclarationEliminationPass
796//===----------------------------------------------------------------------===//
797#ifdef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
798struct UnusedDeclarationEliminationPassOptions {
799 bool removeStructs = false;
800};
801std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass();
802std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass(UnusedDeclarationEliminationPassOptions options);
803#undef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
804#endif // GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
805#ifdef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
806
807namespace impl {
808 std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass();
809} // namespace impl
810
811namespace impl {
812 std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass(UnusedDeclarationEliminationPassOptions options);
813} // namespace impl
814namespace impl {
815
816template <typename DerivedT>
817class UnusedDeclarationEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
818public:
819 using Base = UnusedDeclarationEliminationPassBase;
820
821 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
822 UnusedDeclarationEliminationPassBase(const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
823 UnusedDeclarationEliminationPassBase& operator=(const UnusedDeclarationEliminationPassBase &) = delete;
824 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) = delete;
825 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) = delete;
826 ~UnusedDeclarationEliminationPassBase() = default;
827
829 static constexpr ::llvm::StringLiteral getArgumentName() {
830 return ::llvm::StringLiteral("llzk-unused-declaration-elim");
831 }
832 ::llvm::StringRef getArgument() const override { return "llzk-unused-declaration-elim"; }
833
834 ::llvm::StringRef getDescription() const override { return "Remove unused member and struct declarations"; }
835
837 static constexpr ::llvm::StringLiteral getPassName() {
838 return ::llvm::StringLiteral("UnusedDeclarationEliminationPass");
839 }
840 ::llvm::StringRef getName() const override { return "UnusedDeclarationEliminationPass"; }
841
843 static bool classof(const ::mlir::Pass *pass) {
844 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
845 }
846
848 std::unique_ptr<::mlir::Pass> clonePass() const override {
849 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
850 }
851
853 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
854 registry.insert<llzk::LLZKDialect>();
855 registry.insert<llzk::boolean::BoolDialect>();
856 registry.insert<llzk::array::ArrayDialect>();
857 registry.insert<llzk::component::StructDialect>();
858 registry.insert<llzk::constrain::ConstrainDialect>();
859 registry.insert<llzk::felt::FeltDialect>();
860 registry.insert<llzk::global::GlobalDialect>();
861 registry.insert<llzk::include::IncludeDialect>();
862 registry.insert<llzk::function::FunctionDialect>();
863 registry.insert<llzk::string::StringDialect>();
864 registry.insert<llzk::polymorphic::PolymorphicDialect>();
865 registry.insert<mlir::arith::ArithDialect>();
866 registry.insert<mlir::scf::SCFDialect>();
867 }
868
872 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
873
874 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassOptions options) : UnusedDeclarationEliminationPassBase() {
875 removeStructs = std::move(options.removeStructs);
876 }
877protected:
878 ::mlir::Pass::Option<bool> removeStructs{*this, "remove-structs", ::llvm::cl::desc("Whether to remove unused struct definitions as well. Requires module to declare a Main component, otherwise all components will appear unused."), ::llvm::cl::init(false)};
879private:
880
881 friend std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass() {
882 return std::make_unique<DerivedT>();
883 }
884
885 friend std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass(UnusedDeclarationEliminationPassOptions options) {
886 return std::make_unique<DerivedT>(std::move(options));
887 }
888};
889} // namespace impl
890
891std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass() {
892 return impl::createUnusedDeclarationEliminationPass();
893}
894
895std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass(UnusedDeclarationEliminationPassOptions options) {
896 return impl::createUnusedDeclarationEliminationPass(std::move(options));
897}
898#undef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
899#endif // GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
900
901//===----------------------------------------------------------------------===//
902// WhileToForPass
903//===----------------------------------------------------------------------===//
904#ifdef GEN_PASS_DECL_WHILETOFORPASS
905std::unique_ptr<::mlir::Pass> createWhileToForPass();
906#undef GEN_PASS_DECL_WHILETOFORPASS
907#endif // GEN_PASS_DECL_WHILETOFORPASS
908#ifdef GEN_PASS_DEF_WHILETOFORPASS
909
910namespace impl {
911 std::unique_ptr<::mlir::Pass> createWhileToForPass();
912} // namespace impl
913namespace impl {
914
915template <typename DerivedT>
916class WhileToForPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
917public:
918 using Base = WhileToForPassBase;
919
920 WhileToForPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
921 WhileToForPassBase(const WhileToForPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
922 WhileToForPassBase& operator=(const WhileToForPassBase &) = delete;
923 WhileToForPassBase(WhileToForPassBase &&) = delete;
924 WhileToForPassBase& operator=(WhileToForPassBase &&) = delete;
925 ~WhileToForPassBase() = default;
926
928 static constexpr ::llvm::StringLiteral getArgumentName() {
929 return ::llvm::StringLiteral("llzk-while-to-for");
930 }
931 ::llvm::StringRef getArgument() const override { return "llzk-while-to-for"; }
932
933 ::llvm::StringRef getDescription() const override { return "Converts scf.while loops to equivalent scf.for loops when possible"; }
934
936 static constexpr ::llvm::StringLiteral getPassName() {
937 return ::llvm::StringLiteral("WhileToForPass");
938 }
939 ::llvm::StringRef getName() const override { return "WhileToForPass"; }
940
942 static bool classof(const ::mlir::Pass *pass) {
943 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
944 }
945
947 std::unique_ptr<::mlir::Pass> clonePass() const override {
948 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
949 }
950
952 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
953 registry.insert<llzk::LLZKDialect>();
954 registry.insert<llzk::boolean::BoolDialect>();
955 registry.insert<llzk::array::ArrayDialect>();
956 registry.insert<llzk::component::StructDialect>();
957 registry.insert<llzk::constrain::ConstrainDialect>();
958 registry.insert<llzk::felt::FeltDialect>();
959 registry.insert<llzk::global::GlobalDialect>();
960 registry.insert<llzk::include::IncludeDialect>();
961 registry.insert<llzk::function::FunctionDialect>();
962 registry.insert<llzk::string::StringDialect>();
963 registry.insert<llzk::polymorphic::PolymorphicDialect>();
964 registry.insert<mlir::arith::ArithDialect>();
965 registry.insert<mlir::scf::SCFDialect>();
966 }
967
971 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(WhileToForPassBase<DerivedT>)
972
973protected:
974private:
975
976 friend std::unique_ptr<::mlir::Pass> createWhileToForPass() {
977 return std::make_unique<DerivedT>();
978 }
979};
980} // namespace impl
981
982std::unique_ptr<::mlir::Pass> createWhileToForPass() {
983 return impl::createWhileToForPass();
984}
985#undef GEN_PASS_DEF_WHILETOFORPASS
986#endif // GEN_PASS_DEF_WHILETOFORPASS
987#ifdef GEN_PASS_REGISTRATION
988
989//===----------------------------------------------------------------------===//
990// ComputeConstrainToProductPass Registration
991//===----------------------------------------------------------------------===//
992
994 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
996 });
997}
998
999// Old registration code, kept for temporary backwards compatibility.
1001 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1003 });
1004}
1005
1006//===----------------------------------------------------------------------===//
1007// EnforceNoMemberOverwritePass Registration
1008//===----------------------------------------------------------------------===//
1009
1011 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1013 });
1014}
1015
1016// Old registration code, kept for temporary backwards compatibility.
1018 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1020 });
1021}
1022
1023//===----------------------------------------------------------------------===//
1024// FuseProductLoopsPass Registration
1025//===----------------------------------------------------------------------===//
1026
1027inline void registerFuseProductLoopsPass() {
1028 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1030 });
1031}
1032
1033// Old registration code, kept for temporary backwards compatibility.
1035 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1037 });
1038}
1039
1040//===----------------------------------------------------------------------===//
1041// InlineStructsPass Registration
1042//===----------------------------------------------------------------------===//
1043
1044inline void registerInlineStructsPass() {
1045 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1046 return createInlineStructsPass();
1047 });
1048}
1049
1050// Old registration code, kept for temporary backwards compatibility.
1051inline void registerInlineStructsPassPass() {
1052 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1053 return createInlineStructsPass();
1054 });
1055}
1056
1057//===----------------------------------------------------------------------===//
1058// PolyLoweringPass Registration
1059//===----------------------------------------------------------------------===//
1060
1061inline void registerPolyLoweringPass() {
1062 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1063 return createPolyLoweringPass();
1064 });
1065}
1066
1067// Old registration code, kept for temporary backwards compatibility.
1068inline void registerPolyLoweringPassPass() {
1069 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1070 return createPolyLoweringPass();
1071 });
1072}
1073
1074//===----------------------------------------------------------------------===//
1075// RedundantOperationEliminationPass Registration
1076//===----------------------------------------------------------------------===//
1077
1079 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1081 });
1082}
1083
1084// Old registration code, kept for temporary backwards compatibility.
1086 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1088 });
1089}
1090
1091//===----------------------------------------------------------------------===//
1092// RedundantReadAndWriteEliminationPass Registration
1093//===----------------------------------------------------------------------===//
1094
1096 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1098 });
1099}
1100
1101// Old registration code, kept for temporary backwards compatibility.
1103 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1105 });
1106}
1107
1108//===----------------------------------------------------------------------===//
1109// RemoveUnusedDiscardableAllocationsPass Registration
1110//===----------------------------------------------------------------------===//
1111
1113 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1115 });
1116}
1117
1118// Old registration code, kept for temporary backwards compatibility.
1120 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1122 });
1123}
1124
1125//===----------------------------------------------------------------------===//
1126// UnusedDeclarationEliminationPass Registration
1127//===----------------------------------------------------------------------===//
1128
1130 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1132 });
1133}
1134
1135// Old registration code, kept for temporary backwards compatibility.
1137 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1139 });
1140}
1141
1142//===----------------------------------------------------------------------===//
1143// WhileToForPass Registration
1144//===----------------------------------------------------------------------===//
1145
1146inline void registerWhileToForPass() {
1147 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1148 return createWhileToForPass();
1149 });
1150}
1151
1152// Old registration code, kept for temporary backwards compatibility.
1153inline void registerWhileToForPassPass() {
1154 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1155 return createWhileToForPass();
1156 });
1157}
1158
1159//===----------------------------------------------------------------------===//
1160// Transformation Registration
1161//===----------------------------------------------------------------------===//
1162
1163inline void registerTransformationPasses() {
1174}
1175#undef GEN_PASS_REGISTRATION
1176#endif // GEN_PASS_REGISTRATION
1177// Deprecated. Please use the new per-pass macros.
1178#ifdef GEN_PASS_CLASSES
1179
1180template <typename DerivedT>
1181class ComputeConstrainToProductPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1182public:
1183 using Base = ComputeConstrainToProductPassBase;
1184
1185 ComputeConstrainToProductPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1186 ComputeConstrainToProductPassBase(const ComputeConstrainToProductPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1187 ComputeConstrainToProductPassBase& operator=(const ComputeConstrainToProductPassBase &) = delete;
1188 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassBase &&) = delete;
1189 ComputeConstrainToProductPassBase& operator=(ComputeConstrainToProductPassBase &&) = delete;
1190 ~ComputeConstrainToProductPassBase() = default;
1191
1193 static constexpr ::llvm::StringLiteral getArgumentName() {
1194 return ::llvm::StringLiteral("llzk-compute-constrain-to-product");
1195 }
1196 ::llvm::StringRef getArgument() const override { return "llzk-compute-constrain-to-product"; }
1197
1198 ::llvm::StringRef getDescription() const override { return "Replace separate @compute and @constrain functions in a struct with a single @product function"; }
1199
1201 static constexpr ::llvm::StringLiteral getPassName() {
1202 return ::llvm::StringLiteral("ComputeConstrainToProductPass");
1203 }
1204 ::llvm::StringRef getName() const override { return "ComputeConstrainToProductPass"; }
1205
1207 static bool classof(const ::mlir::Pass *pass) {
1208 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1209 }
1210
1212 std::unique_ptr<::mlir::Pass> clonePass() const override {
1213 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1214 }
1215
1217 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1218 registry.insert<llzk::LLZKDialect>();
1219 registry.insert<llzk::boolean::BoolDialect>();
1220 registry.insert<llzk::array::ArrayDialect>();
1221 registry.insert<llzk::component::StructDialect>();
1222 registry.insert<llzk::constrain::ConstrainDialect>();
1223 registry.insert<llzk::felt::FeltDialect>();
1224 registry.insert<llzk::global::GlobalDialect>();
1225 registry.insert<llzk::include::IncludeDialect>();
1226 registry.insert<llzk::function::FunctionDialect>();
1227 registry.insert<llzk::string::StringDialect>();
1228 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1229 registry.insert<mlir::arith::ArithDialect>();
1230 registry.insert<mlir::scf::SCFDialect>();
1231 }
1232
1236 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ComputeConstrainToProductPassBase<DerivedT>)
1237
1238protected:
1239 ::mlir::Pass::Option<std::string> rootStruct{*this, "root-struct", ::llvm::cl::desc("Root struct at which to start alignment (default to `@Main`)"), ::llvm::cl::init("@Main")};
1240};
1241
1242template <typename DerivedT>
1243class EnforceNoMemberOverwritePassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1244public:
1245 using Base = EnforceNoMemberOverwritePassBase;
1246
1247 EnforceNoMemberOverwritePassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1248 EnforceNoMemberOverwritePassBase(const EnforceNoMemberOverwritePassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1249 EnforceNoMemberOverwritePassBase& operator=(const EnforceNoMemberOverwritePassBase &) = delete;
1250 EnforceNoMemberOverwritePassBase(EnforceNoMemberOverwritePassBase &&) = delete;
1251 EnforceNoMemberOverwritePassBase& operator=(EnforceNoMemberOverwritePassBase &&) = delete;
1252 ~EnforceNoMemberOverwritePassBase() = default;
1253
1255 static constexpr ::llvm::StringLiteral getArgumentName() {
1256 return ::llvm::StringLiteral("llzk-enforce-no-overwrite");
1257 }
1258 ::llvm::StringRef getArgument() const override { return "llzk-enforce-no-overwrite"; }
1259
1260 ::llvm::StringRef getDescription() const override { return "Checks that every struct member is written exactly once"; }
1261
1263 static constexpr ::llvm::StringLiteral getPassName() {
1264 return ::llvm::StringLiteral("EnforceNoMemberOverwritePass");
1265 }
1266 ::llvm::StringRef getName() const override { return "EnforceNoMemberOverwritePass"; }
1267
1269 static bool classof(const ::mlir::Pass *pass) {
1270 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1271 }
1272
1274 std::unique_ptr<::mlir::Pass> clonePass() const override {
1275 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1276 }
1277
1279 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1280 registry.insert<llzk::LLZKDialect>();
1281 registry.insert<llzk::boolean::BoolDialect>();
1282 registry.insert<llzk::array::ArrayDialect>();
1283 registry.insert<llzk::component::StructDialect>();
1284 registry.insert<llzk::constrain::ConstrainDialect>();
1285 registry.insert<llzk::felt::FeltDialect>();
1286 registry.insert<llzk::global::GlobalDialect>();
1287 registry.insert<llzk::include::IncludeDialect>();
1288 registry.insert<llzk::function::FunctionDialect>();
1289 registry.insert<llzk::string::StringDialect>();
1290 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1291 registry.insert<mlir::arith::ArithDialect>();
1292 registry.insert<mlir::scf::SCFDialect>();
1293 }
1294
1298 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EnforceNoMemberOverwritePassBase<DerivedT>)
1299
1300protected:
1301};
1302
1303template <typename DerivedT>
1304class FuseProductLoopsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1305public:
1306 using Base = FuseProductLoopsPassBase;
1307
1308 FuseProductLoopsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1309 FuseProductLoopsPassBase(const FuseProductLoopsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1310 FuseProductLoopsPassBase& operator=(const FuseProductLoopsPassBase &) = delete;
1311 FuseProductLoopsPassBase(FuseProductLoopsPassBase &&) = delete;
1312 FuseProductLoopsPassBase& operator=(FuseProductLoopsPassBase &&) = delete;
1313 ~FuseProductLoopsPassBase() = default;
1314
1316 static constexpr ::llvm::StringLiteral getArgumentName() {
1317 return ::llvm::StringLiteral("llzk-fuse-product-loops");
1318 }
1319 ::llvm::StringRef getArgument() const override { return "llzk-fuse-product-loops"; }
1320
1321 ::llvm::StringRef getDescription() const override { return "Fuse matching witness/constraint loops in a @product function"; }
1322
1324 static constexpr ::llvm::StringLiteral getPassName() {
1325 return ::llvm::StringLiteral("FuseProductLoopsPass");
1326 }
1327 ::llvm::StringRef getName() const override { return "FuseProductLoopsPass"; }
1328
1330 static bool classof(const ::mlir::Pass *pass) {
1331 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1332 }
1333
1335 std::unique_ptr<::mlir::Pass> clonePass() const override {
1336 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1337 }
1338
1340 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1341 registry.insert<llzk::LLZKDialect>();
1342 registry.insert<llzk::boolean::BoolDialect>();
1343 registry.insert<llzk::array::ArrayDialect>();
1344 registry.insert<llzk::component::StructDialect>();
1345 registry.insert<llzk::constrain::ConstrainDialect>();
1346 registry.insert<llzk::felt::FeltDialect>();
1347 registry.insert<llzk::global::GlobalDialect>();
1348 registry.insert<llzk::include::IncludeDialect>();
1349 registry.insert<llzk::function::FunctionDialect>();
1350 registry.insert<llzk::string::StringDialect>();
1351 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1352 registry.insert<mlir::arith::ArithDialect>();
1353 registry.insert<mlir::scf::SCFDialect>();
1354 }
1355
1359 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FuseProductLoopsPassBase<DerivedT>)
1360
1361protected:
1362};
1363
1364template <typename DerivedT>
1365class InlineStructsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1366public:
1367 using Base = InlineStructsPassBase;
1368
1369 InlineStructsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1370 InlineStructsPassBase(const InlineStructsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1371 InlineStructsPassBase& operator=(const InlineStructsPassBase &) = delete;
1372 InlineStructsPassBase(InlineStructsPassBase &&) = delete;
1373 InlineStructsPassBase& operator=(InlineStructsPassBase &&) = delete;
1374 ~InlineStructsPassBase() = default;
1375
1377 static constexpr ::llvm::StringLiteral getArgumentName() {
1378 return ::llvm::StringLiteral("llzk-inline-structs");
1379 }
1380 ::llvm::StringRef getArgument() const override { return "llzk-inline-structs"; }
1381
1382 ::llvm::StringRef getDescription() const override { return "Inlines nested structs (i.e., subcomponents)."; }
1383
1385 static constexpr ::llvm::StringLiteral getPassName() {
1386 return ::llvm::StringLiteral("InlineStructsPass");
1387 }
1388 ::llvm::StringRef getName() const override { return "InlineStructsPass"; }
1389
1391 static bool classof(const ::mlir::Pass *pass) {
1392 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1393 }
1394
1396 std::unique_ptr<::mlir::Pass> clonePass() const override {
1397 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1398 }
1399
1401 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1402 registry.insert<llzk::LLZKDialect>();
1403 registry.insert<llzk::boolean::BoolDialect>();
1404 registry.insert<llzk::array::ArrayDialect>();
1405 registry.insert<llzk::component::StructDialect>();
1406 registry.insert<llzk::constrain::ConstrainDialect>();
1407 registry.insert<llzk::felt::FeltDialect>();
1408 registry.insert<llzk::global::GlobalDialect>();
1409 registry.insert<llzk::include::IncludeDialect>();
1410 registry.insert<llzk::function::FunctionDialect>();
1411 registry.insert<llzk::string::StringDialect>();
1412 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1413 registry.insert<mlir::arith::ArithDialect>();
1414 registry.insert<mlir::scf::SCFDialect>();
1415 }
1416
1420 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
1421
1422protected:
1423 ::mlir::Pass::Option<uint64_t> maxComplexity{*this, "max-merge-complexity", ::llvm::cl::desc("Maximum allowed constraint+multiplications in merged @constrain functions"), ::llvm::cl::init(0)};
1424};
1425
1426template <typename DerivedT>
1427class PolyLoweringPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1428public:
1429 using Base = PolyLoweringPassBase;
1430
1431 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1432 PolyLoweringPassBase(const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1433 PolyLoweringPassBase& operator=(const PolyLoweringPassBase &) = delete;
1434 PolyLoweringPassBase(PolyLoweringPassBase &&) = delete;
1435 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) = delete;
1436 ~PolyLoweringPassBase() = default;
1437
1439 static constexpr ::llvm::StringLiteral getArgumentName() {
1440 return ::llvm::StringLiteral("llzk-poly-lowering-pass");
1441 }
1442 ::llvm::StringRef getArgument() const override { return "llzk-poly-lowering-pass"; }
1443
1444 ::llvm::StringRef getDescription() const override { return "Lower the degree of all polynomial equations to a specified maximum"; }
1445
1447 static constexpr ::llvm::StringLiteral getPassName() {
1448 return ::llvm::StringLiteral("PolyLoweringPass");
1449 }
1450 ::llvm::StringRef getName() const override { return "PolyLoweringPass"; }
1451
1453 static bool classof(const ::mlir::Pass *pass) {
1454 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1455 }
1456
1458 std::unique_ptr<::mlir::Pass> clonePass() const override {
1459 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1460 }
1461
1463 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1464 registry.insert<llzk::LLZKDialect>();
1465 registry.insert<llzk::boolean::BoolDialect>();
1466 registry.insert<llzk::array::ArrayDialect>();
1467 registry.insert<llzk::component::StructDialect>();
1468 registry.insert<llzk::constrain::ConstrainDialect>();
1469 registry.insert<llzk::felt::FeltDialect>();
1470 registry.insert<llzk::global::GlobalDialect>();
1471 registry.insert<llzk::include::IncludeDialect>();
1472 registry.insert<llzk::function::FunctionDialect>();
1473 registry.insert<llzk::string::StringDialect>();
1474 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1475 registry.insert<mlir::arith::ArithDialect>();
1476 registry.insert<mlir::scf::SCFDialect>();
1477 }
1478
1482 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
1483
1484protected:
1485 ::mlir::Pass::Option<unsigned> maxDegree{*this, "max-degree", ::llvm::cl::desc("Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
1486};
1487
1488template <typename DerivedT>
1489class RedundantOperationEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1490public:
1491 using Base = RedundantOperationEliminationPassBase;
1492
1493 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1494 RedundantOperationEliminationPassBase(const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1495 RedundantOperationEliminationPassBase& operator=(const RedundantOperationEliminationPassBase &) = delete;
1496 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) = delete;
1497 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) = delete;
1498 ~RedundantOperationEliminationPassBase() = default;
1499
1501 static constexpr ::llvm::StringLiteral getArgumentName() {
1502 return ::llvm::StringLiteral("llzk-duplicate-op-elim");
1503 }
1504 ::llvm::StringRef getArgument() const override { return "llzk-duplicate-op-elim"; }
1505
1506 ::llvm::StringRef getDescription() const override { return "Remove redundant operations"; }
1507
1509 static constexpr ::llvm::StringLiteral getPassName() {
1510 return ::llvm::StringLiteral("RedundantOperationEliminationPass");
1511 }
1512 ::llvm::StringRef getName() const override { return "RedundantOperationEliminationPass"; }
1513
1515 static bool classof(const ::mlir::Pass *pass) {
1516 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1517 }
1518
1520 std::unique_ptr<::mlir::Pass> clonePass() const override {
1521 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1522 }
1523
1525 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1526 registry.insert<llzk::LLZKDialect>();
1527 registry.insert<llzk::boolean::BoolDialect>();
1528 registry.insert<llzk::array::ArrayDialect>();
1529 registry.insert<llzk::component::StructDialect>();
1530 registry.insert<llzk::constrain::ConstrainDialect>();
1531 registry.insert<llzk::felt::FeltDialect>();
1532 registry.insert<llzk::global::GlobalDialect>();
1533 registry.insert<llzk::include::IncludeDialect>();
1534 registry.insert<llzk::function::FunctionDialect>();
1535 registry.insert<llzk::string::StringDialect>();
1536 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1537 registry.insert<mlir::arith::ArithDialect>();
1538 registry.insert<mlir::scf::SCFDialect>();
1539 }
1540
1544 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
1545
1546protected:
1547};
1548
1549template <typename DerivedT>
1550class RedundantReadAndWriteEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1551public:
1552 using Base = RedundantReadAndWriteEliminationPassBase;
1553
1554 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1555 RedundantReadAndWriteEliminationPassBase(const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1556 RedundantReadAndWriteEliminationPassBase& operator=(const RedundantReadAndWriteEliminationPassBase &) = delete;
1557 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) = delete;
1558 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) = delete;
1559 ~RedundantReadAndWriteEliminationPassBase() = default;
1560
1562 static constexpr ::llvm::StringLiteral getArgumentName() {
1563 return ::llvm::StringLiteral("llzk-duplicate-read-write-elim");
1564 }
1565 ::llvm::StringRef getArgument() const override { return "llzk-duplicate-read-write-elim"; }
1566
1567 ::llvm::StringRef getDescription() const override { return "Remove redundant reads and writes"; }
1568
1570 static constexpr ::llvm::StringLiteral getPassName() {
1571 return ::llvm::StringLiteral("RedundantReadAndWriteEliminationPass");
1572 }
1573 ::llvm::StringRef getName() const override { return "RedundantReadAndWriteEliminationPass"; }
1574
1576 static bool classof(const ::mlir::Pass *pass) {
1577 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1578 }
1579
1581 std::unique_ptr<::mlir::Pass> clonePass() const override {
1582 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1583 }
1584
1586 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1587 registry.insert<llzk::LLZKDialect>();
1588 registry.insert<llzk::boolean::BoolDialect>();
1589 registry.insert<llzk::array::ArrayDialect>();
1590 registry.insert<llzk::component::StructDialect>();
1591 registry.insert<llzk::constrain::ConstrainDialect>();
1592 registry.insert<llzk::felt::FeltDialect>();
1593 registry.insert<llzk::global::GlobalDialect>();
1594 registry.insert<llzk::include::IncludeDialect>();
1595 registry.insert<llzk::function::FunctionDialect>();
1596 registry.insert<llzk::string::StringDialect>();
1597 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1598 registry.insert<mlir::arith::ArithDialect>();
1599 registry.insert<mlir::scf::SCFDialect>();
1600 }
1601
1605 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
1606
1607protected:
1608};
1609
1610template <typename DerivedT>
1611class RemoveUnusedDiscardableAllocationsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1612public:
1613 using Base = RemoveUnusedDiscardableAllocationsPassBase;
1614
1615 RemoveUnusedDiscardableAllocationsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1616 RemoveUnusedDiscardableAllocationsPassBase(const RemoveUnusedDiscardableAllocationsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1617 RemoveUnusedDiscardableAllocationsPassBase& operator=(const RemoveUnusedDiscardableAllocationsPassBase &) = delete;
1618 RemoveUnusedDiscardableAllocationsPassBase(RemoveUnusedDiscardableAllocationsPassBase &&) = delete;
1619 RemoveUnusedDiscardableAllocationsPassBase& operator=(RemoveUnusedDiscardableAllocationsPassBase &&) = delete;
1620 ~RemoveUnusedDiscardableAllocationsPassBase() = default;
1621
1623 static constexpr ::llvm::StringLiteral getArgumentName() {
1624 return ::llvm::StringLiteral("llzk-remove-unused-discardable-allocations");
1625 }
1626 ::llvm::StringRef getArgument() const override { return "llzk-remove-unused-discardable-allocations"; }
1627
1628 ::llvm::StringRef getDescription() const override { return "Remove unread discardable allocations and their dead stores"; }
1629
1631 static constexpr ::llvm::StringLiteral getPassName() {
1632 return ::llvm::StringLiteral("RemoveUnusedDiscardableAllocationsPass");
1633 }
1634 ::llvm::StringRef getName() const override { return "RemoveUnusedDiscardableAllocationsPass"; }
1635
1637 static bool classof(const ::mlir::Pass *pass) {
1638 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1639 }
1640
1642 std::unique_ptr<::mlir::Pass> clonePass() const override {
1643 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1644 }
1645
1647 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1648 registry.insert<llzk::LLZKDialect>();
1649 registry.insert<llzk::boolean::BoolDialect>();
1650 registry.insert<llzk::array::ArrayDialect>();
1651 registry.insert<llzk::component::StructDialect>();
1652 registry.insert<llzk::constrain::ConstrainDialect>();
1653 registry.insert<llzk::felt::FeltDialect>();
1654 registry.insert<llzk::global::GlobalDialect>();
1655 registry.insert<llzk::include::IncludeDialect>();
1656 registry.insert<llzk::function::FunctionDialect>();
1657 registry.insert<llzk::string::StringDialect>();
1658 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1659 registry.insert<mlir::arith::ArithDialect>();
1660 registry.insert<mlir::scf::SCFDialect>();
1661 }
1662
1666 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RemoveUnusedDiscardableAllocationsPassBase<DerivedT>)
1667
1668protected:
1669 ::mlir::Pass::Option<std::string> allocatorOpName{*this, "allocator-op", ::llvm::cl::desc("Operation name of the discardable allocator to remove"), ::llvm::cl::init("")};
1670};
1671
1672template <typename DerivedT>
1673class UnusedDeclarationEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1674public:
1675 using Base = UnusedDeclarationEliminationPassBase;
1676
1677 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1678 UnusedDeclarationEliminationPassBase(const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1679 UnusedDeclarationEliminationPassBase& operator=(const UnusedDeclarationEliminationPassBase &) = delete;
1680 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) = delete;
1681 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) = delete;
1682 ~UnusedDeclarationEliminationPassBase() = default;
1683
1685 static constexpr ::llvm::StringLiteral getArgumentName() {
1686 return ::llvm::StringLiteral("llzk-unused-declaration-elim");
1687 }
1688 ::llvm::StringRef getArgument() const override { return "llzk-unused-declaration-elim"; }
1689
1690 ::llvm::StringRef getDescription() const override { return "Remove unused member and struct declarations"; }
1691
1693 static constexpr ::llvm::StringLiteral getPassName() {
1694 return ::llvm::StringLiteral("UnusedDeclarationEliminationPass");
1695 }
1696 ::llvm::StringRef getName() const override { return "UnusedDeclarationEliminationPass"; }
1697
1699 static bool classof(const ::mlir::Pass *pass) {
1700 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1701 }
1702
1704 std::unique_ptr<::mlir::Pass> clonePass() const override {
1705 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1706 }
1707
1709 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1710 registry.insert<llzk::LLZKDialect>();
1711 registry.insert<llzk::boolean::BoolDialect>();
1712 registry.insert<llzk::array::ArrayDialect>();
1713 registry.insert<llzk::component::StructDialect>();
1714 registry.insert<llzk::constrain::ConstrainDialect>();
1715 registry.insert<llzk::felt::FeltDialect>();
1716 registry.insert<llzk::global::GlobalDialect>();
1717 registry.insert<llzk::include::IncludeDialect>();
1718 registry.insert<llzk::function::FunctionDialect>();
1719 registry.insert<llzk::string::StringDialect>();
1720 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1721 registry.insert<mlir::arith::ArithDialect>();
1722 registry.insert<mlir::scf::SCFDialect>();
1723 }
1724
1728 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
1729
1730protected:
1731 ::mlir::Pass::Option<bool> removeStructs{*this, "remove-structs", ::llvm::cl::desc("Whether to remove unused struct definitions as well. Requires module to declare a Main component, otherwise all components will appear unused."), ::llvm::cl::init(false)};
1732};
1733
1734template <typename DerivedT>
1735class WhileToForPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1736public:
1737 using Base = WhileToForPassBase;
1738
1739 WhileToForPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1740 WhileToForPassBase(const WhileToForPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1741 WhileToForPassBase& operator=(const WhileToForPassBase &) = delete;
1742 WhileToForPassBase(WhileToForPassBase &&) = delete;
1743 WhileToForPassBase& operator=(WhileToForPassBase &&) = delete;
1744 ~WhileToForPassBase() = default;
1745
1747 static constexpr ::llvm::StringLiteral getArgumentName() {
1748 return ::llvm::StringLiteral("llzk-while-to-for");
1749 }
1750 ::llvm::StringRef getArgument() const override { return "llzk-while-to-for"; }
1751
1752 ::llvm::StringRef getDescription() const override { return "Converts scf.while loops to equivalent scf.for loops when possible"; }
1753
1755 static constexpr ::llvm::StringLiteral getPassName() {
1756 return ::llvm::StringLiteral("WhileToForPass");
1757 }
1758 ::llvm::StringRef getName() const override { return "WhileToForPass"; }
1759
1761 static bool classof(const ::mlir::Pass *pass) {
1762 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1763 }
1764
1766 std::unique_ptr<::mlir::Pass> clonePass() const override {
1767 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1768 }
1769
1771 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1772 registry.insert<llzk::LLZKDialect>();
1773 registry.insert<llzk::boolean::BoolDialect>();
1774 registry.insert<llzk::array::ArrayDialect>();
1775 registry.insert<llzk::component::StructDialect>();
1776 registry.insert<llzk::constrain::ConstrainDialect>();
1777 registry.insert<llzk::felt::FeltDialect>();
1778 registry.insert<llzk::global::GlobalDialect>();
1779 registry.insert<llzk::include::IncludeDialect>();
1780 registry.insert<llzk::function::FunctionDialect>();
1781 registry.insert<llzk::string::StringDialect>();
1782 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1783 registry.insert<mlir::arith::ArithDialect>();
1784 registry.insert<mlir::scf::SCFDialect>();
1785 }
1786
1790 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(WhileToForPassBase<DerivedT>)
1791
1792protected:
1793};
1794#undef GEN_PASS_CLASSES
1795#endif // GEN_PASS_CLASSES
void registerTransformationPasses()
std::unique_ptr<::mlir::Pass > createInlineStructsPass()
std::unique_ptr<::mlir::Pass > createUnusedDeclarationEliminationPass()
std::unique_ptr<::mlir::Pass > createPolyLoweringPass()
std::unique_ptr<::mlir::Pass > createRemoveUnusedDiscardableAllocationsPass()
std::unique_ptr<::mlir::Pass > createRedundantReadAndWriteEliminationPass()
std::unique_ptr<::mlir::Pass > createFuseProductLoopsPass()
std::unique_ptr<::mlir::Pass > createRedundantOperationEliminationPass()
std::unique_ptr<::mlir::Pass > createWhileToForPass()
std::unique_ptr<::mlir::Pass > createComputeConstrainToProductPass()
std::unique_ptr<::mlir::Pass > createEnforceNoMemberOverwritePass()
void registerUnusedDeclarationEliminationPassPass()
void registerWhileToForPassPass()
void registerWhileToForPass()
void registerFuseProductLoopsPassPass()
void registerRedundantOperationEliminationPass()
void registerEnforceNoMemberOverwritePassPass()
void registerPolyLoweringPassPass()
void registerUnusedDeclarationEliminationPass()
void registerComputeConstrainToProductPassPass()
void registerRedundantOperationEliminationPassPass()
void registerRemoveUnusedDiscardableAllocationsPass()
void registerInlineStructsPassPass()
void registerComputeConstrainToProductPass()
void registerRedundantReadAndWriteEliminationPass()
void registerPolyLoweringPass()
void registerRedundantReadAndWriteEliminationPassPass()
void registerRemoveUnusedDiscardableAllocationsPassPass()
void registerEnforceNoMemberOverwritePass()
void registerInlineStructsPass()
void registerFuseProductLoopsPass()