LLZK 3.0.0
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_INLINEFREEFUNCTIONSPASS
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// InlineFreeFunctionsPass
301//===----------------------------------------------------------------------===//
302#ifdef GEN_PASS_DECL_INLINEFREEFUNCTIONSPASS
303std::unique_ptr<::mlir::Pass> createInlineFreeFunctionsPass();
304#undef GEN_PASS_DECL_INLINEFREEFUNCTIONSPASS
305#endif // GEN_PASS_DECL_INLINEFREEFUNCTIONSPASS
306#ifdef GEN_PASS_DEF_INLINEFREEFUNCTIONSPASS
307
308namespace impl {
309 std::unique_ptr<::mlir::Pass> createInlineFreeFunctionsPass();
310} // namespace impl
311namespace impl {
312
313template <typename DerivedT>
314class InlineFreeFunctionsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
315public:
316 using Base = InlineFreeFunctionsPassBase;
317
318 InlineFreeFunctionsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
319 InlineFreeFunctionsPassBase(const InlineFreeFunctionsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
320 InlineFreeFunctionsPassBase& operator=(const InlineFreeFunctionsPassBase &) = delete;
321 InlineFreeFunctionsPassBase(InlineFreeFunctionsPassBase &&) = delete;
322 InlineFreeFunctionsPassBase& operator=(InlineFreeFunctionsPassBase &&) = delete;
323 ~InlineFreeFunctionsPassBase() = default;
324
326 static constexpr ::llvm::StringLiteral getArgumentName() {
327 return ::llvm::StringLiteral("llzk-inline-free-functions");
328 }
329 ::llvm::StringRef getArgument() const override { return "llzk-inline-free-functions"; }
330
331 ::llvm::StringRef getDescription() const override { return "Inline calls to free functions"; }
332
334 static constexpr ::llvm::StringLiteral getPassName() {
335 return ::llvm::StringLiteral("InlineFreeFunctionsPass");
336 }
337 ::llvm::StringRef getName() const override { return "InlineFreeFunctionsPass"; }
338
340 static bool classof(const ::mlir::Pass *pass) {
341 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
342 }
343
345 std::unique_ptr<::mlir::Pass> clonePass() const override {
346 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
347 }
348
350 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
351 registry.insert<llzk::LLZKDialect>();
352 registry.insert<llzk::boolean::BoolDialect>();
353 registry.insert<llzk::array::ArrayDialect>();
354 registry.insert<llzk::component::StructDialect>();
355 registry.insert<llzk::constrain::ConstrainDialect>();
356 registry.insert<llzk::felt::FeltDialect>();
357 registry.insert<llzk::global::GlobalDialect>();
358 registry.insert<llzk::include::IncludeDialect>();
359 registry.insert<llzk::function::FunctionDialect>();
360 registry.insert<llzk::string::StringDialect>();
361 registry.insert<llzk::polymorphic::PolymorphicDialect>();
362 registry.insert<mlir::arith::ArithDialect>();
363 registry.insert<mlir::scf::SCFDialect>();
364 }
365
369 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineFreeFunctionsPassBase<DerivedT>)
370
371protected:
372private:
373
374 friend std::unique_ptr<::mlir::Pass> createInlineFreeFunctionsPass() {
375 return std::make_unique<DerivedT>();
376 }
377};
378} // namespace impl
379
380std::unique_ptr<::mlir::Pass> createInlineFreeFunctionsPass() {
381 return impl::createInlineFreeFunctionsPass();
382}
383#undef GEN_PASS_DEF_INLINEFREEFUNCTIONSPASS
384#endif // GEN_PASS_DEF_INLINEFREEFUNCTIONSPASS
385
386//===----------------------------------------------------------------------===//
387// PolyLoweringPass
388//===----------------------------------------------------------------------===//
389#ifdef GEN_PASS_DECL_POLYLOWERINGPASS
390struct PolyLoweringPassOptions {
391 unsigned maxDegree = 2;
392};
393std::unique_ptr<::mlir::Pass> createPolyLoweringPass();
394std::unique_ptr<::mlir::Pass> createPolyLoweringPass(PolyLoweringPassOptions options);
395#undef GEN_PASS_DECL_POLYLOWERINGPASS
396#endif // GEN_PASS_DECL_POLYLOWERINGPASS
397#ifdef GEN_PASS_DEF_POLYLOWERINGPASS
398
399namespace impl {
400 std::unique_ptr<::mlir::Pass> createPolyLoweringPass();
401} // namespace impl
402
403namespace impl {
404 std::unique_ptr<::mlir::Pass> createPolyLoweringPass(PolyLoweringPassOptions options);
405} // namespace impl
406namespace impl {
407
408template <typename DerivedT>
409class PolyLoweringPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
410public:
411 using Base = PolyLoweringPassBase;
412
413 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
414 PolyLoweringPassBase(const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
415 PolyLoweringPassBase& operator=(const PolyLoweringPassBase &) = delete;
416 PolyLoweringPassBase(PolyLoweringPassBase &&) = delete;
417 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) = delete;
418 ~PolyLoweringPassBase() = default;
419
421 static constexpr ::llvm::StringLiteral getArgumentName() {
422 return ::llvm::StringLiteral("llzk-poly-lowering-pass");
423 }
424 ::llvm::StringRef getArgument() const override { return "llzk-poly-lowering-pass"; }
425
426 ::llvm::StringRef getDescription() const override { return "Lower the degree of all polynomial equations to a specified maximum"; }
427
429 static constexpr ::llvm::StringLiteral getPassName() {
430 return ::llvm::StringLiteral("PolyLoweringPass");
431 }
432 ::llvm::StringRef getName() const override { return "PolyLoweringPass"; }
433
435 static bool classof(const ::mlir::Pass *pass) {
436 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
437 }
438
440 std::unique_ptr<::mlir::Pass> clonePass() const override {
441 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
442 }
443
445 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
446 registry.insert<llzk::LLZKDialect>();
447 registry.insert<llzk::boolean::BoolDialect>();
448 registry.insert<llzk::array::ArrayDialect>();
449 registry.insert<llzk::component::StructDialect>();
450 registry.insert<llzk::constrain::ConstrainDialect>();
451 registry.insert<llzk::felt::FeltDialect>();
452 registry.insert<llzk::global::GlobalDialect>();
453 registry.insert<llzk::include::IncludeDialect>();
454 registry.insert<llzk::function::FunctionDialect>();
455 registry.insert<llzk::string::StringDialect>();
456 registry.insert<llzk::polymorphic::PolymorphicDialect>();
457 registry.insert<mlir::arith::ArithDialect>();
458 registry.insert<mlir::scf::SCFDialect>();
459 }
460
464 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
465
466 PolyLoweringPassBase(PolyLoweringPassOptions options) : PolyLoweringPassBase() {
467 maxDegree = std::move(options.maxDegree);
468 }
469protected:
470 ::mlir::Pass::Option<unsigned> maxDegree{*this, "max-degree", ::llvm::cl::desc("Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
471private:
472
473 friend std::unique_ptr<::mlir::Pass> createPolyLoweringPass() {
474 return std::make_unique<DerivedT>();
475 }
476
477 friend std::unique_ptr<::mlir::Pass> createPolyLoweringPass(PolyLoweringPassOptions options) {
478 return std::make_unique<DerivedT>(std::move(options));
479 }
480};
481} // namespace impl
482
483std::unique_ptr<::mlir::Pass> createPolyLoweringPass() {
484 return impl::createPolyLoweringPass();
485}
486
487std::unique_ptr<::mlir::Pass> createPolyLoweringPass(PolyLoweringPassOptions options) {
488 return impl::createPolyLoweringPass(std::move(options));
489}
490#undef GEN_PASS_DEF_POLYLOWERINGPASS
491#endif // GEN_PASS_DEF_POLYLOWERINGPASS
492
493//===----------------------------------------------------------------------===//
494// RedundantOperationEliminationPass
495//===----------------------------------------------------------------------===//
496#ifdef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
497std::unique_ptr<::mlir::Pass> createRedundantOperationEliminationPass();
498#undef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
499#endif // GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
500#ifdef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
501
502namespace impl {
503 std::unique_ptr<::mlir::Pass> createRedundantOperationEliminationPass();
504} // namespace impl
505namespace impl {
506
507template <typename DerivedT>
508class RedundantOperationEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
509public:
510 using Base = RedundantOperationEliminationPassBase;
511
512 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
513 RedundantOperationEliminationPassBase(const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
514 RedundantOperationEliminationPassBase& operator=(const RedundantOperationEliminationPassBase &) = delete;
515 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) = delete;
516 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) = delete;
517 ~RedundantOperationEliminationPassBase() = default;
518
520 static constexpr ::llvm::StringLiteral getArgumentName() {
521 return ::llvm::StringLiteral("llzk-duplicate-op-elim");
522 }
523 ::llvm::StringRef getArgument() const override { return "llzk-duplicate-op-elim"; }
524
525 ::llvm::StringRef getDescription() const override { return "Remove redundant operations"; }
526
528 static constexpr ::llvm::StringLiteral getPassName() {
529 return ::llvm::StringLiteral("RedundantOperationEliminationPass");
530 }
531 ::llvm::StringRef getName() const override { return "RedundantOperationEliminationPass"; }
532
534 static bool classof(const ::mlir::Pass *pass) {
535 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
536 }
537
539 std::unique_ptr<::mlir::Pass> clonePass() const override {
540 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
541 }
542
544 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
545 registry.insert<llzk::LLZKDialect>();
546 registry.insert<llzk::boolean::BoolDialect>();
547 registry.insert<llzk::array::ArrayDialect>();
548 registry.insert<llzk::component::StructDialect>();
549 registry.insert<llzk::constrain::ConstrainDialect>();
550 registry.insert<llzk::felt::FeltDialect>();
551 registry.insert<llzk::global::GlobalDialect>();
552 registry.insert<llzk::include::IncludeDialect>();
553 registry.insert<llzk::function::FunctionDialect>();
554 registry.insert<llzk::string::StringDialect>();
555 registry.insert<llzk::polymorphic::PolymorphicDialect>();
556 registry.insert<mlir::arith::ArithDialect>();
557 registry.insert<mlir::scf::SCFDialect>();
558 }
559
563 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
564
565protected:
566private:
567
568 friend std::unique_ptr<::mlir::Pass> createRedundantOperationEliminationPass() {
569 return std::make_unique<DerivedT>();
570 }
571};
572} // namespace impl
573
574std::unique_ptr<::mlir::Pass> createRedundantOperationEliminationPass() {
575 return impl::createRedundantOperationEliminationPass();
576}
577#undef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
578#endif // GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
579
580//===----------------------------------------------------------------------===//
581// RedundantReadAndWriteEliminationPass
582//===----------------------------------------------------------------------===//
583#ifdef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
584std::unique_ptr<::mlir::Pass> createRedundantReadAndWriteEliminationPass();
585#undef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
586#endif // GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
587#ifdef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
588
589namespace impl {
590 std::unique_ptr<::mlir::Pass> createRedundantReadAndWriteEliminationPass();
591} // namespace impl
592namespace impl {
593
594template <typename DerivedT>
595class RedundantReadAndWriteEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
596public:
597 using Base = RedundantReadAndWriteEliminationPassBase;
598
599 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
600 RedundantReadAndWriteEliminationPassBase(const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
601 RedundantReadAndWriteEliminationPassBase& operator=(const RedundantReadAndWriteEliminationPassBase &) = delete;
602 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) = delete;
603 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) = delete;
604 ~RedundantReadAndWriteEliminationPassBase() = default;
605
607 static constexpr ::llvm::StringLiteral getArgumentName() {
608 return ::llvm::StringLiteral("llzk-duplicate-read-write-elim");
609 }
610 ::llvm::StringRef getArgument() const override { return "llzk-duplicate-read-write-elim"; }
611
612 ::llvm::StringRef getDescription() const override { return "Remove redundant reads and writes"; }
613
615 static constexpr ::llvm::StringLiteral getPassName() {
616 return ::llvm::StringLiteral("RedundantReadAndWriteEliminationPass");
617 }
618 ::llvm::StringRef getName() const override { return "RedundantReadAndWriteEliminationPass"; }
619
621 static bool classof(const ::mlir::Pass *pass) {
622 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
623 }
624
626 std::unique_ptr<::mlir::Pass> clonePass() const override {
627 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
628 }
629
631 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
632 registry.insert<llzk::LLZKDialect>();
633 registry.insert<llzk::boolean::BoolDialect>();
634 registry.insert<llzk::array::ArrayDialect>();
635 registry.insert<llzk::component::StructDialect>();
636 registry.insert<llzk::constrain::ConstrainDialect>();
637 registry.insert<llzk::felt::FeltDialect>();
638 registry.insert<llzk::global::GlobalDialect>();
639 registry.insert<llzk::include::IncludeDialect>();
640 registry.insert<llzk::function::FunctionDialect>();
641 registry.insert<llzk::string::StringDialect>();
642 registry.insert<llzk::polymorphic::PolymorphicDialect>();
643 registry.insert<mlir::arith::ArithDialect>();
644 registry.insert<mlir::scf::SCFDialect>();
645 }
646
650 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
651
652protected:
653private:
654
655 friend std::unique_ptr<::mlir::Pass> createRedundantReadAndWriteEliminationPass() {
656 return std::make_unique<DerivedT>();
657 }
658};
659} // namespace impl
660
661std::unique_ptr<::mlir::Pass> createRedundantReadAndWriteEliminationPass() {
662 return impl::createRedundantReadAndWriteEliminationPass();
663}
664#undef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
665#endif // GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
666
667//===----------------------------------------------------------------------===//
668// RemoveUnusedDiscardableAllocationsPass
669//===----------------------------------------------------------------------===//
670#ifdef GEN_PASS_DECL_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
671struct RemoveUnusedDiscardableAllocationsPassOptions {
672 std::string allocatorOpName = "";
673};
674std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass();
675std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass(RemoveUnusedDiscardableAllocationsPassOptions options);
676#undef GEN_PASS_DECL_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
677#endif // GEN_PASS_DECL_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
678#ifdef GEN_PASS_DEF_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
679
680namespace impl {
681 std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass();
682} // namespace impl
683
684namespace impl {
685 std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass(RemoveUnusedDiscardableAllocationsPassOptions options);
686} // namespace impl
687namespace impl {
688
689template <typename DerivedT>
690class RemoveUnusedDiscardableAllocationsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
691public:
692 using Base = RemoveUnusedDiscardableAllocationsPassBase;
693
694 RemoveUnusedDiscardableAllocationsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
695 RemoveUnusedDiscardableAllocationsPassBase(const RemoveUnusedDiscardableAllocationsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
696 RemoveUnusedDiscardableAllocationsPassBase& operator=(const RemoveUnusedDiscardableAllocationsPassBase &) = delete;
697 RemoveUnusedDiscardableAllocationsPassBase(RemoveUnusedDiscardableAllocationsPassBase &&) = delete;
698 RemoveUnusedDiscardableAllocationsPassBase& operator=(RemoveUnusedDiscardableAllocationsPassBase &&) = delete;
699 ~RemoveUnusedDiscardableAllocationsPassBase() = default;
700
702 static constexpr ::llvm::StringLiteral getArgumentName() {
703 return ::llvm::StringLiteral("llzk-remove-unused-discardable-allocations");
704 }
705 ::llvm::StringRef getArgument() const override { return "llzk-remove-unused-discardable-allocations"; }
706
707 ::llvm::StringRef getDescription() const override { return "Remove unread discardable allocations and their dead stores"; }
708
710 static constexpr ::llvm::StringLiteral getPassName() {
711 return ::llvm::StringLiteral("RemoveUnusedDiscardableAllocationsPass");
712 }
713 ::llvm::StringRef getName() const override { return "RemoveUnusedDiscardableAllocationsPass"; }
714
716 static bool classof(const ::mlir::Pass *pass) {
717 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
718 }
719
721 std::unique_ptr<::mlir::Pass> clonePass() const override {
722 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
723 }
724
726 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
727 registry.insert<llzk::LLZKDialect>();
728 registry.insert<llzk::boolean::BoolDialect>();
729 registry.insert<llzk::array::ArrayDialect>();
730 registry.insert<llzk::component::StructDialect>();
731 registry.insert<llzk::constrain::ConstrainDialect>();
732 registry.insert<llzk::felt::FeltDialect>();
733 registry.insert<llzk::global::GlobalDialect>();
734 registry.insert<llzk::include::IncludeDialect>();
735 registry.insert<llzk::function::FunctionDialect>();
736 registry.insert<llzk::string::StringDialect>();
737 registry.insert<llzk::polymorphic::PolymorphicDialect>();
738 registry.insert<mlir::arith::ArithDialect>();
739 registry.insert<mlir::scf::SCFDialect>();
740 }
741
745 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RemoveUnusedDiscardableAllocationsPassBase<DerivedT>)
746
747 RemoveUnusedDiscardableAllocationsPassBase(RemoveUnusedDiscardableAllocationsPassOptions options) : RemoveUnusedDiscardableAllocationsPassBase() {
748 allocatorOpName = std::move(options.allocatorOpName);
749 }
750protected:
751 ::mlir::Pass::Option<std::string> allocatorOpName{*this, "allocator-op", ::llvm::cl::desc("Operation name of the discardable allocator to remove"), ::llvm::cl::init("")};
752private:
753
754 friend std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass() {
755 return std::make_unique<DerivedT>();
756 }
757
758 friend std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass(RemoveUnusedDiscardableAllocationsPassOptions options) {
759 return std::make_unique<DerivedT>(std::move(options));
760 }
761};
762} // namespace impl
763
764std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass() {
765 return impl::createRemoveUnusedDiscardableAllocationsPass();
766}
767
768std::unique_ptr<::mlir::Pass> createRemoveUnusedDiscardableAllocationsPass(RemoveUnusedDiscardableAllocationsPassOptions options) {
769 return impl::createRemoveUnusedDiscardableAllocationsPass(std::move(options));
770}
771#undef GEN_PASS_DEF_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
772#endif // GEN_PASS_DEF_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
773
774//===----------------------------------------------------------------------===//
775// UnusedDeclarationEliminationPass
776//===----------------------------------------------------------------------===//
777#ifdef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
778struct UnusedDeclarationEliminationPassOptions {
779 bool removeStructs = false;
780};
781std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass();
782std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass(UnusedDeclarationEliminationPassOptions options);
783#undef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
784#endif // GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
785#ifdef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
786
787namespace impl {
788 std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass();
789} // namespace impl
790
791namespace impl {
792 std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass(UnusedDeclarationEliminationPassOptions options);
793} // namespace impl
794namespace impl {
795
796template <typename DerivedT>
797class UnusedDeclarationEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
798public:
799 using Base = UnusedDeclarationEliminationPassBase;
800
801 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
802 UnusedDeclarationEliminationPassBase(const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
803 UnusedDeclarationEliminationPassBase& operator=(const UnusedDeclarationEliminationPassBase &) = delete;
804 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) = delete;
805 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) = delete;
806 ~UnusedDeclarationEliminationPassBase() = default;
807
809 static constexpr ::llvm::StringLiteral getArgumentName() {
810 return ::llvm::StringLiteral("llzk-unused-declaration-elim");
811 }
812 ::llvm::StringRef getArgument() const override { return "llzk-unused-declaration-elim"; }
813
814 ::llvm::StringRef getDescription() const override { return "Remove unused member and struct declarations"; }
815
817 static constexpr ::llvm::StringLiteral getPassName() {
818 return ::llvm::StringLiteral("UnusedDeclarationEliminationPass");
819 }
820 ::llvm::StringRef getName() const override { return "UnusedDeclarationEliminationPass"; }
821
823 static bool classof(const ::mlir::Pass *pass) {
824 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
825 }
826
828 std::unique_ptr<::mlir::Pass> clonePass() const override {
829 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
830 }
831
833 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
834 registry.insert<llzk::LLZKDialect>();
835 registry.insert<llzk::boolean::BoolDialect>();
836 registry.insert<llzk::array::ArrayDialect>();
837 registry.insert<llzk::component::StructDialect>();
838 registry.insert<llzk::constrain::ConstrainDialect>();
839 registry.insert<llzk::felt::FeltDialect>();
840 registry.insert<llzk::global::GlobalDialect>();
841 registry.insert<llzk::include::IncludeDialect>();
842 registry.insert<llzk::function::FunctionDialect>();
843 registry.insert<llzk::string::StringDialect>();
844 registry.insert<llzk::polymorphic::PolymorphicDialect>();
845 registry.insert<mlir::arith::ArithDialect>();
846 registry.insert<mlir::scf::SCFDialect>();
847 }
848
852 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
853
854 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassOptions options) : UnusedDeclarationEliminationPassBase() {
855 removeStructs = std::move(options.removeStructs);
856 }
857protected:
858 ::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)};
859private:
860
861 friend std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass() {
862 return std::make_unique<DerivedT>();
863 }
864
865 friend std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass(UnusedDeclarationEliminationPassOptions options) {
866 return std::make_unique<DerivedT>(std::move(options));
867 }
868};
869} // namespace impl
870
871std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass() {
872 return impl::createUnusedDeclarationEliminationPass();
873}
874
875std::unique_ptr<::mlir::Pass> createUnusedDeclarationEliminationPass(UnusedDeclarationEliminationPassOptions options) {
876 return impl::createUnusedDeclarationEliminationPass(std::move(options));
877}
878#undef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
879#endif // GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
880
881//===----------------------------------------------------------------------===//
882// WhileToForPass
883//===----------------------------------------------------------------------===//
884#ifdef GEN_PASS_DECL_WHILETOFORPASS
885std::unique_ptr<::mlir::Pass> createWhileToForPass();
886#undef GEN_PASS_DECL_WHILETOFORPASS
887#endif // GEN_PASS_DECL_WHILETOFORPASS
888#ifdef GEN_PASS_DEF_WHILETOFORPASS
889
890namespace impl {
891 std::unique_ptr<::mlir::Pass> createWhileToForPass();
892} // namespace impl
893namespace impl {
894
895template <typename DerivedT>
896class WhileToForPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
897public:
898 using Base = WhileToForPassBase;
899
900 WhileToForPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
901 WhileToForPassBase(const WhileToForPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
902 WhileToForPassBase& operator=(const WhileToForPassBase &) = delete;
903 WhileToForPassBase(WhileToForPassBase &&) = delete;
904 WhileToForPassBase& operator=(WhileToForPassBase &&) = delete;
905 ~WhileToForPassBase() = default;
906
908 static constexpr ::llvm::StringLiteral getArgumentName() {
909 return ::llvm::StringLiteral("llzk-while-to-for");
910 }
911 ::llvm::StringRef getArgument() const override { return "llzk-while-to-for"; }
912
913 ::llvm::StringRef getDescription() const override { return "Converts scf.while loops to equivalent scf.for loops when possible"; }
914
916 static constexpr ::llvm::StringLiteral getPassName() {
917 return ::llvm::StringLiteral("WhileToForPass");
918 }
919 ::llvm::StringRef getName() const override { return "WhileToForPass"; }
920
922 static bool classof(const ::mlir::Pass *pass) {
923 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
924 }
925
927 std::unique_ptr<::mlir::Pass> clonePass() const override {
928 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
929 }
930
932 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
933 registry.insert<llzk::LLZKDialect>();
934 registry.insert<llzk::boolean::BoolDialect>();
935 registry.insert<llzk::array::ArrayDialect>();
936 registry.insert<llzk::component::StructDialect>();
937 registry.insert<llzk::constrain::ConstrainDialect>();
938 registry.insert<llzk::felt::FeltDialect>();
939 registry.insert<llzk::global::GlobalDialect>();
940 registry.insert<llzk::include::IncludeDialect>();
941 registry.insert<llzk::function::FunctionDialect>();
942 registry.insert<llzk::string::StringDialect>();
943 registry.insert<llzk::polymorphic::PolymorphicDialect>();
944 registry.insert<mlir::arith::ArithDialect>();
945 registry.insert<mlir::scf::SCFDialect>();
946 }
947
951 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(WhileToForPassBase<DerivedT>)
952
953protected:
954private:
955
956 friend std::unique_ptr<::mlir::Pass> createWhileToForPass() {
957 return std::make_unique<DerivedT>();
958 }
959};
960} // namespace impl
961
962std::unique_ptr<::mlir::Pass> createWhileToForPass() {
963 return impl::createWhileToForPass();
964}
965#undef GEN_PASS_DEF_WHILETOFORPASS
966#endif // GEN_PASS_DEF_WHILETOFORPASS
967#ifdef GEN_PASS_REGISTRATION
968
969//===----------------------------------------------------------------------===//
970// ComputeConstrainToProductPass Registration
971//===----------------------------------------------------------------------===//
972
974 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
976 });
977}
978
979// Old registration code, kept for temporary backwards compatibility.
981 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
983 });
984}
985
986//===----------------------------------------------------------------------===//
987// EnforceNoMemberOverwritePass Registration
988//===----------------------------------------------------------------------===//
989
991 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
993 });
994}
995
996// Old registration code, kept for temporary backwards compatibility.
998 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1000 });
1001}
1002
1003//===----------------------------------------------------------------------===//
1004// FuseProductLoopsPass Registration
1005//===----------------------------------------------------------------------===//
1006
1007inline void registerFuseProductLoopsPass() {
1008 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1010 });
1011}
1012
1013// Old registration code, kept for temporary backwards compatibility.
1015 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1017 });
1018}
1019
1020//===----------------------------------------------------------------------===//
1021// InlineFreeFunctionsPass Registration
1022//===----------------------------------------------------------------------===//
1023
1024inline void registerInlineFreeFunctionsPass() {
1025 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1027 });
1028}
1029
1030// Old registration code, kept for temporary backwards compatibility.
1032 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1034 });
1035}
1036
1037//===----------------------------------------------------------------------===//
1038// PolyLoweringPass Registration
1039//===----------------------------------------------------------------------===//
1040
1041inline void registerPolyLoweringPass() {
1042 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1043 return createPolyLoweringPass();
1044 });
1045}
1046
1047// Old registration code, kept for temporary backwards compatibility.
1048inline void registerPolyLoweringPassPass() {
1049 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1050 return createPolyLoweringPass();
1051 });
1052}
1053
1054//===----------------------------------------------------------------------===//
1055// RedundantOperationEliminationPass Registration
1056//===----------------------------------------------------------------------===//
1057
1059 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1061 });
1062}
1063
1064// Old registration code, kept for temporary backwards compatibility.
1066 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1068 });
1069}
1070
1071//===----------------------------------------------------------------------===//
1072// RedundantReadAndWriteEliminationPass Registration
1073//===----------------------------------------------------------------------===//
1074
1076 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1078 });
1079}
1080
1081// Old registration code, kept for temporary backwards compatibility.
1083 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1085 });
1086}
1087
1088//===----------------------------------------------------------------------===//
1089// RemoveUnusedDiscardableAllocationsPass Registration
1090//===----------------------------------------------------------------------===//
1091
1093 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1095 });
1096}
1097
1098// Old registration code, kept for temporary backwards compatibility.
1100 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1102 });
1103}
1104
1105//===----------------------------------------------------------------------===//
1106// UnusedDeclarationEliminationPass Registration
1107//===----------------------------------------------------------------------===//
1108
1110 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1112 });
1113}
1114
1115// Old registration code, kept for temporary backwards compatibility.
1117 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1119 });
1120}
1121
1122//===----------------------------------------------------------------------===//
1123// WhileToForPass Registration
1124//===----------------------------------------------------------------------===//
1125
1126inline void registerWhileToForPass() {
1127 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1128 return createWhileToForPass();
1129 });
1130}
1131
1132// Old registration code, kept for temporary backwards compatibility.
1133inline void registerWhileToForPassPass() {
1134 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1135 return createWhileToForPass();
1136 });
1137}
1138
1139//===----------------------------------------------------------------------===//
1140// Transformation Registration
1141//===----------------------------------------------------------------------===//
1142
1143inline void registerTransformationPasses() {
1154}
1155#undef GEN_PASS_REGISTRATION
1156#endif // GEN_PASS_REGISTRATION
1157// Deprecated. Please use the new per-pass macros.
1158#ifdef GEN_PASS_CLASSES
1159
1160template <typename DerivedT>
1161class ComputeConstrainToProductPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1162public:
1163 using Base = ComputeConstrainToProductPassBase;
1164
1165 ComputeConstrainToProductPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1166 ComputeConstrainToProductPassBase(const ComputeConstrainToProductPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1167 ComputeConstrainToProductPassBase& operator=(const ComputeConstrainToProductPassBase &) = delete;
1168 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassBase &&) = delete;
1169 ComputeConstrainToProductPassBase& operator=(ComputeConstrainToProductPassBase &&) = delete;
1170 ~ComputeConstrainToProductPassBase() = default;
1171
1173 static constexpr ::llvm::StringLiteral getArgumentName() {
1174 return ::llvm::StringLiteral("llzk-compute-constrain-to-product");
1175 }
1176 ::llvm::StringRef getArgument() const override { return "llzk-compute-constrain-to-product"; }
1177
1178 ::llvm::StringRef getDescription() const override { return "Replace separate @compute and @constrain functions in a struct with a single @product function"; }
1179
1181 static constexpr ::llvm::StringLiteral getPassName() {
1182 return ::llvm::StringLiteral("ComputeConstrainToProductPass");
1183 }
1184 ::llvm::StringRef getName() const override { return "ComputeConstrainToProductPass"; }
1185
1187 static bool classof(const ::mlir::Pass *pass) {
1188 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1189 }
1190
1192 std::unique_ptr<::mlir::Pass> clonePass() const override {
1193 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1194 }
1195
1197 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1198 registry.insert<llzk::LLZKDialect>();
1199 registry.insert<llzk::boolean::BoolDialect>();
1200 registry.insert<llzk::array::ArrayDialect>();
1201 registry.insert<llzk::component::StructDialect>();
1202 registry.insert<llzk::constrain::ConstrainDialect>();
1203 registry.insert<llzk::felt::FeltDialect>();
1204 registry.insert<llzk::global::GlobalDialect>();
1205 registry.insert<llzk::include::IncludeDialect>();
1206 registry.insert<llzk::function::FunctionDialect>();
1207 registry.insert<llzk::string::StringDialect>();
1208 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1209 registry.insert<mlir::arith::ArithDialect>();
1210 registry.insert<mlir::scf::SCFDialect>();
1211 }
1212
1216 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ComputeConstrainToProductPassBase<DerivedT>)
1217
1218protected:
1219 ::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")};
1220};
1221
1222template <typename DerivedT>
1223class EnforceNoMemberOverwritePassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1224public:
1225 using Base = EnforceNoMemberOverwritePassBase;
1226
1227 EnforceNoMemberOverwritePassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1228 EnforceNoMemberOverwritePassBase(const EnforceNoMemberOverwritePassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1229 EnforceNoMemberOverwritePassBase& operator=(const EnforceNoMemberOverwritePassBase &) = delete;
1230 EnforceNoMemberOverwritePassBase(EnforceNoMemberOverwritePassBase &&) = delete;
1231 EnforceNoMemberOverwritePassBase& operator=(EnforceNoMemberOverwritePassBase &&) = delete;
1232 ~EnforceNoMemberOverwritePassBase() = default;
1233
1235 static constexpr ::llvm::StringLiteral getArgumentName() {
1236 return ::llvm::StringLiteral("llzk-enforce-no-overwrite");
1237 }
1238 ::llvm::StringRef getArgument() const override { return "llzk-enforce-no-overwrite"; }
1239
1240 ::llvm::StringRef getDescription() const override { return "Checks that every struct member is written exactly once"; }
1241
1243 static constexpr ::llvm::StringLiteral getPassName() {
1244 return ::llvm::StringLiteral("EnforceNoMemberOverwritePass");
1245 }
1246 ::llvm::StringRef getName() const override { return "EnforceNoMemberOverwritePass"; }
1247
1249 static bool classof(const ::mlir::Pass *pass) {
1250 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1251 }
1252
1254 std::unique_ptr<::mlir::Pass> clonePass() const override {
1255 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1256 }
1257
1259 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1260 registry.insert<llzk::LLZKDialect>();
1261 registry.insert<llzk::boolean::BoolDialect>();
1262 registry.insert<llzk::array::ArrayDialect>();
1263 registry.insert<llzk::component::StructDialect>();
1264 registry.insert<llzk::constrain::ConstrainDialect>();
1265 registry.insert<llzk::felt::FeltDialect>();
1266 registry.insert<llzk::global::GlobalDialect>();
1267 registry.insert<llzk::include::IncludeDialect>();
1268 registry.insert<llzk::function::FunctionDialect>();
1269 registry.insert<llzk::string::StringDialect>();
1270 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1271 registry.insert<mlir::arith::ArithDialect>();
1272 registry.insert<mlir::scf::SCFDialect>();
1273 }
1274
1278 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EnforceNoMemberOverwritePassBase<DerivedT>)
1279
1280protected:
1281};
1282
1283template <typename DerivedT>
1284class FuseProductLoopsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1285public:
1286 using Base = FuseProductLoopsPassBase;
1287
1288 FuseProductLoopsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1289 FuseProductLoopsPassBase(const FuseProductLoopsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1290 FuseProductLoopsPassBase& operator=(const FuseProductLoopsPassBase &) = delete;
1291 FuseProductLoopsPassBase(FuseProductLoopsPassBase &&) = delete;
1292 FuseProductLoopsPassBase& operator=(FuseProductLoopsPassBase &&) = delete;
1293 ~FuseProductLoopsPassBase() = default;
1294
1296 static constexpr ::llvm::StringLiteral getArgumentName() {
1297 return ::llvm::StringLiteral("llzk-fuse-product-loops");
1298 }
1299 ::llvm::StringRef getArgument() const override { return "llzk-fuse-product-loops"; }
1300
1301 ::llvm::StringRef getDescription() const override { return "Fuse matching witness/constraint loops in a @product function"; }
1302
1304 static constexpr ::llvm::StringLiteral getPassName() {
1305 return ::llvm::StringLiteral("FuseProductLoopsPass");
1306 }
1307 ::llvm::StringRef getName() const override { return "FuseProductLoopsPass"; }
1308
1310 static bool classof(const ::mlir::Pass *pass) {
1311 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1312 }
1313
1315 std::unique_ptr<::mlir::Pass> clonePass() const override {
1316 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1317 }
1318
1320 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1321 registry.insert<llzk::LLZKDialect>();
1322 registry.insert<llzk::boolean::BoolDialect>();
1323 registry.insert<llzk::array::ArrayDialect>();
1324 registry.insert<llzk::component::StructDialect>();
1325 registry.insert<llzk::constrain::ConstrainDialect>();
1326 registry.insert<llzk::felt::FeltDialect>();
1327 registry.insert<llzk::global::GlobalDialect>();
1328 registry.insert<llzk::include::IncludeDialect>();
1329 registry.insert<llzk::function::FunctionDialect>();
1330 registry.insert<llzk::string::StringDialect>();
1331 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1332 registry.insert<mlir::arith::ArithDialect>();
1333 registry.insert<mlir::scf::SCFDialect>();
1334 }
1335
1339 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FuseProductLoopsPassBase<DerivedT>)
1340
1341protected:
1342};
1343
1344template <typename DerivedT>
1345class InlineFreeFunctionsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1346public:
1347 using Base = InlineFreeFunctionsPassBase;
1348
1349 InlineFreeFunctionsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1350 InlineFreeFunctionsPassBase(const InlineFreeFunctionsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1351 InlineFreeFunctionsPassBase& operator=(const InlineFreeFunctionsPassBase &) = delete;
1352 InlineFreeFunctionsPassBase(InlineFreeFunctionsPassBase &&) = delete;
1353 InlineFreeFunctionsPassBase& operator=(InlineFreeFunctionsPassBase &&) = delete;
1354 ~InlineFreeFunctionsPassBase() = default;
1355
1357 static constexpr ::llvm::StringLiteral getArgumentName() {
1358 return ::llvm::StringLiteral("llzk-inline-free-functions");
1359 }
1360 ::llvm::StringRef getArgument() const override { return "llzk-inline-free-functions"; }
1361
1362 ::llvm::StringRef getDescription() const override { return "Inline calls to free functions"; }
1363
1365 static constexpr ::llvm::StringLiteral getPassName() {
1366 return ::llvm::StringLiteral("InlineFreeFunctionsPass");
1367 }
1368 ::llvm::StringRef getName() const override { return "InlineFreeFunctionsPass"; }
1369
1371 static bool classof(const ::mlir::Pass *pass) {
1372 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1373 }
1374
1376 std::unique_ptr<::mlir::Pass> clonePass() const override {
1377 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1378 }
1379
1381 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1382 registry.insert<llzk::LLZKDialect>();
1383 registry.insert<llzk::boolean::BoolDialect>();
1384 registry.insert<llzk::array::ArrayDialect>();
1385 registry.insert<llzk::component::StructDialect>();
1386 registry.insert<llzk::constrain::ConstrainDialect>();
1387 registry.insert<llzk::felt::FeltDialect>();
1388 registry.insert<llzk::global::GlobalDialect>();
1389 registry.insert<llzk::include::IncludeDialect>();
1390 registry.insert<llzk::function::FunctionDialect>();
1391 registry.insert<llzk::string::StringDialect>();
1392 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1393 registry.insert<mlir::arith::ArithDialect>();
1394 registry.insert<mlir::scf::SCFDialect>();
1395 }
1396
1400 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineFreeFunctionsPassBase<DerivedT>)
1401
1402protected:
1403};
1404
1405template <typename DerivedT>
1406class PolyLoweringPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1407public:
1408 using Base = PolyLoweringPassBase;
1409
1410 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1411 PolyLoweringPassBase(const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1412 PolyLoweringPassBase& operator=(const PolyLoweringPassBase &) = delete;
1413 PolyLoweringPassBase(PolyLoweringPassBase &&) = delete;
1414 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) = delete;
1415 ~PolyLoweringPassBase() = default;
1416
1418 static constexpr ::llvm::StringLiteral getArgumentName() {
1419 return ::llvm::StringLiteral("llzk-poly-lowering-pass");
1420 }
1421 ::llvm::StringRef getArgument() const override { return "llzk-poly-lowering-pass"; }
1422
1423 ::llvm::StringRef getDescription() const override { return "Lower the degree of all polynomial equations to a specified maximum"; }
1424
1426 static constexpr ::llvm::StringLiteral getPassName() {
1427 return ::llvm::StringLiteral("PolyLoweringPass");
1428 }
1429 ::llvm::StringRef getName() const override { return "PolyLoweringPass"; }
1430
1432 static bool classof(const ::mlir::Pass *pass) {
1433 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1434 }
1435
1437 std::unique_ptr<::mlir::Pass> clonePass() const override {
1438 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1439 }
1440
1442 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1443 registry.insert<llzk::LLZKDialect>();
1444 registry.insert<llzk::boolean::BoolDialect>();
1445 registry.insert<llzk::array::ArrayDialect>();
1446 registry.insert<llzk::component::StructDialect>();
1447 registry.insert<llzk::constrain::ConstrainDialect>();
1448 registry.insert<llzk::felt::FeltDialect>();
1449 registry.insert<llzk::global::GlobalDialect>();
1450 registry.insert<llzk::include::IncludeDialect>();
1451 registry.insert<llzk::function::FunctionDialect>();
1452 registry.insert<llzk::string::StringDialect>();
1453 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1454 registry.insert<mlir::arith::ArithDialect>();
1455 registry.insert<mlir::scf::SCFDialect>();
1456 }
1457
1461 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
1462
1463protected:
1464 ::mlir::Pass::Option<unsigned> maxDegree{*this, "max-degree", ::llvm::cl::desc("Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
1465};
1466
1467template <typename DerivedT>
1468class RedundantOperationEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1469public:
1470 using Base = RedundantOperationEliminationPassBase;
1471
1472 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1473 RedundantOperationEliminationPassBase(const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1474 RedundantOperationEliminationPassBase& operator=(const RedundantOperationEliminationPassBase &) = delete;
1475 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) = delete;
1476 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) = delete;
1477 ~RedundantOperationEliminationPassBase() = default;
1478
1480 static constexpr ::llvm::StringLiteral getArgumentName() {
1481 return ::llvm::StringLiteral("llzk-duplicate-op-elim");
1482 }
1483 ::llvm::StringRef getArgument() const override { return "llzk-duplicate-op-elim"; }
1484
1485 ::llvm::StringRef getDescription() const override { return "Remove redundant operations"; }
1486
1488 static constexpr ::llvm::StringLiteral getPassName() {
1489 return ::llvm::StringLiteral("RedundantOperationEliminationPass");
1490 }
1491 ::llvm::StringRef getName() const override { return "RedundantOperationEliminationPass"; }
1492
1494 static bool classof(const ::mlir::Pass *pass) {
1495 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1496 }
1497
1499 std::unique_ptr<::mlir::Pass> clonePass() const override {
1500 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1501 }
1502
1504 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1505 registry.insert<llzk::LLZKDialect>();
1506 registry.insert<llzk::boolean::BoolDialect>();
1507 registry.insert<llzk::array::ArrayDialect>();
1508 registry.insert<llzk::component::StructDialect>();
1509 registry.insert<llzk::constrain::ConstrainDialect>();
1510 registry.insert<llzk::felt::FeltDialect>();
1511 registry.insert<llzk::global::GlobalDialect>();
1512 registry.insert<llzk::include::IncludeDialect>();
1513 registry.insert<llzk::function::FunctionDialect>();
1514 registry.insert<llzk::string::StringDialect>();
1515 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1516 registry.insert<mlir::arith::ArithDialect>();
1517 registry.insert<mlir::scf::SCFDialect>();
1518 }
1519
1523 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
1524
1525protected:
1526};
1527
1528template <typename DerivedT>
1529class RedundantReadAndWriteEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1530public:
1531 using Base = RedundantReadAndWriteEliminationPassBase;
1532
1533 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1534 RedundantReadAndWriteEliminationPassBase(const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1535 RedundantReadAndWriteEliminationPassBase& operator=(const RedundantReadAndWriteEliminationPassBase &) = delete;
1536 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) = delete;
1537 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) = delete;
1538 ~RedundantReadAndWriteEliminationPassBase() = default;
1539
1541 static constexpr ::llvm::StringLiteral getArgumentName() {
1542 return ::llvm::StringLiteral("llzk-duplicate-read-write-elim");
1543 }
1544 ::llvm::StringRef getArgument() const override { return "llzk-duplicate-read-write-elim"; }
1545
1546 ::llvm::StringRef getDescription() const override { return "Remove redundant reads and writes"; }
1547
1549 static constexpr ::llvm::StringLiteral getPassName() {
1550 return ::llvm::StringLiteral("RedundantReadAndWriteEliminationPass");
1551 }
1552 ::llvm::StringRef getName() const override { return "RedundantReadAndWriteEliminationPass"; }
1553
1555 static bool classof(const ::mlir::Pass *pass) {
1556 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1557 }
1558
1560 std::unique_ptr<::mlir::Pass> clonePass() const override {
1561 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1562 }
1563
1565 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1566 registry.insert<llzk::LLZKDialect>();
1567 registry.insert<llzk::boolean::BoolDialect>();
1568 registry.insert<llzk::array::ArrayDialect>();
1569 registry.insert<llzk::component::StructDialect>();
1570 registry.insert<llzk::constrain::ConstrainDialect>();
1571 registry.insert<llzk::felt::FeltDialect>();
1572 registry.insert<llzk::global::GlobalDialect>();
1573 registry.insert<llzk::include::IncludeDialect>();
1574 registry.insert<llzk::function::FunctionDialect>();
1575 registry.insert<llzk::string::StringDialect>();
1576 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1577 registry.insert<mlir::arith::ArithDialect>();
1578 registry.insert<mlir::scf::SCFDialect>();
1579 }
1580
1584 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
1585
1586protected:
1587};
1588
1589template <typename DerivedT>
1590class RemoveUnusedDiscardableAllocationsPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1591public:
1592 using Base = RemoveUnusedDiscardableAllocationsPassBase;
1593
1594 RemoveUnusedDiscardableAllocationsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1595 RemoveUnusedDiscardableAllocationsPassBase(const RemoveUnusedDiscardableAllocationsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1596 RemoveUnusedDiscardableAllocationsPassBase& operator=(const RemoveUnusedDiscardableAllocationsPassBase &) = delete;
1597 RemoveUnusedDiscardableAllocationsPassBase(RemoveUnusedDiscardableAllocationsPassBase &&) = delete;
1598 RemoveUnusedDiscardableAllocationsPassBase& operator=(RemoveUnusedDiscardableAllocationsPassBase &&) = delete;
1599 ~RemoveUnusedDiscardableAllocationsPassBase() = default;
1600
1602 static constexpr ::llvm::StringLiteral getArgumentName() {
1603 return ::llvm::StringLiteral("llzk-remove-unused-discardable-allocations");
1604 }
1605 ::llvm::StringRef getArgument() const override { return "llzk-remove-unused-discardable-allocations"; }
1606
1607 ::llvm::StringRef getDescription() const override { return "Remove unread discardable allocations and their dead stores"; }
1608
1610 static constexpr ::llvm::StringLiteral getPassName() {
1611 return ::llvm::StringLiteral("RemoveUnusedDiscardableAllocationsPass");
1612 }
1613 ::llvm::StringRef getName() const override { return "RemoveUnusedDiscardableAllocationsPass"; }
1614
1616 static bool classof(const ::mlir::Pass *pass) {
1617 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1618 }
1619
1621 std::unique_ptr<::mlir::Pass> clonePass() const override {
1622 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1623 }
1624
1626 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1627 registry.insert<llzk::LLZKDialect>();
1628 registry.insert<llzk::boolean::BoolDialect>();
1629 registry.insert<llzk::array::ArrayDialect>();
1630 registry.insert<llzk::component::StructDialect>();
1631 registry.insert<llzk::constrain::ConstrainDialect>();
1632 registry.insert<llzk::felt::FeltDialect>();
1633 registry.insert<llzk::global::GlobalDialect>();
1634 registry.insert<llzk::include::IncludeDialect>();
1635 registry.insert<llzk::function::FunctionDialect>();
1636 registry.insert<llzk::string::StringDialect>();
1637 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1638 registry.insert<mlir::arith::ArithDialect>();
1639 registry.insert<mlir::scf::SCFDialect>();
1640 }
1641
1645 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RemoveUnusedDiscardableAllocationsPassBase<DerivedT>)
1646
1647protected:
1648 ::mlir::Pass::Option<std::string> allocatorOpName{*this, "allocator-op", ::llvm::cl::desc("Operation name of the discardable allocator to remove"), ::llvm::cl::init("")};
1649};
1650
1651template <typename DerivedT>
1652class UnusedDeclarationEliminationPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1653public:
1654 using Base = UnusedDeclarationEliminationPassBase;
1655
1656 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1657 UnusedDeclarationEliminationPassBase(const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1658 UnusedDeclarationEliminationPassBase& operator=(const UnusedDeclarationEliminationPassBase &) = delete;
1659 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) = delete;
1660 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) = delete;
1661 ~UnusedDeclarationEliminationPassBase() = default;
1662
1664 static constexpr ::llvm::StringLiteral getArgumentName() {
1665 return ::llvm::StringLiteral("llzk-unused-declaration-elim");
1666 }
1667 ::llvm::StringRef getArgument() const override { return "llzk-unused-declaration-elim"; }
1668
1669 ::llvm::StringRef getDescription() const override { return "Remove unused member and struct declarations"; }
1670
1672 static constexpr ::llvm::StringLiteral getPassName() {
1673 return ::llvm::StringLiteral("UnusedDeclarationEliminationPass");
1674 }
1675 ::llvm::StringRef getName() const override { return "UnusedDeclarationEliminationPass"; }
1676
1678 static bool classof(const ::mlir::Pass *pass) {
1679 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1680 }
1681
1683 std::unique_ptr<::mlir::Pass> clonePass() const override {
1684 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1685 }
1686
1688 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1689 registry.insert<llzk::LLZKDialect>();
1690 registry.insert<llzk::boolean::BoolDialect>();
1691 registry.insert<llzk::array::ArrayDialect>();
1692 registry.insert<llzk::component::StructDialect>();
1693 registry.insert<llzk::constrain::ConstrainDialect>();
1694 registry.insert<llzk::felt::FeltDialect>();
1695 registry.insert<llzk::global::GlobalDialect>();
1696 registry.insert<llzk::include::IncludeDialect>();
1697 registry.insert<llzk::function::FunctionDialect>();
1698 registry.insert<llzk::string::StringDialect>();
1699 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1700 registry.insert<mlir::arith::ArithDialect>();
1701 registry.insert<mlir::scf::SCFDialect>();
1702 }
1703
1707 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
1708
1709protected:
1710 ::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)};
1711};
1712
1713template <typename DerivedT>
1714class WhileToForPassBase : public ::mlir::OperationPass<::mlir::ModuleOp> {
1715public:
1716 using Base = WhileToForPassBase;
1717
1718 WhileToForPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1719 WhileToForPassBase(const WhileToForPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1720 WhileToForPassBase& operator=(const WhileToForPassBase &) = delete;
1721 WhileToForPassBase(WhileToForPassBase &&) = delete;
1722 WhileToForPassBase& operator=(WhileToForPassBase &&) = delete;
1723 ~WhileToForPassBase() = default;
1724
1726 static constexpr ::llvm::StringLiteral getArgumentName() {
1727 return ::llvm::StringLiteral("llzk-while-to-for");
1728 }
1729 ::llvm::StringRef getArgument() const override { return "llzk-while-to-for"; }
1730
1731 ::llvm::StringRef getDescription() const override { return "Converts scf.while loops to equivalent scf.for loops when possible"; }
1732
1734 static constexpr ::llvm::StringLiteral getPassName() {
1735 return ::llvm::StringLiteral("WhileToForPass");
1736 }
1737 ::llvm::StringRef getName() const override { return "WhileToForPass"; }
1738
1740 static bool classof(const ::mlir::Pass *pass) {
1741 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1742 }
1743
1745 std::unique_ptr<::mlir::Pass> clonePass() const override {
1746 return std::make_unique<DerivedT>(*static_cast<const DerivedT *>(this));
1747 }
1748
1750 void getDependentDialects(::mlir::DialectRegistry &registry) const override {
1751 registry.insert<llzk::LLZKDialect>();
1752 registry.insert<llzk::boolean::BoolDialect>();
1753 registry.insert<llzk::array::ArrayDialect>();
1754 registry.insert<llzk::component::StructDialect>();
1755 registry.insert<llzk::constrain::ConstrainDialect>();
1756 registry.insert<llzk::felt::FeltDialect>();
1757 registry.insert<llzk::global::GlobalDialect>();
1758 registry.insert<llzk::include::IncludeDialect>();
1759 registry.insert<llzk::function::FunctionDialect>();
1760 registry.insert<llzk::string::StringDialect>();
1761 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1762 registry.insert<mlir::arith::ArithDialect>();
1763 registry.insert<mlir::scf::SCFDialect>();
1764 }
1765
1769 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(WhileToForPassBase<DerivedT>)
1770
1771protected:
1772};
1773#undef GEN_PASS_CLASSES
1774#endif // GEN_PASS_CLASSES
void registerTransformationPasses()
std::unique_ptr<::mlir::Pass > createUnusedDeclarationEliminationPass()
std::unique_ptr<::mlir::Pass > createPolyLoweringPass()
std::unique_ptr<::mlir::Pass > createRemoveUnusedDiscardableAllocationsPass()
std::unique_ptr<::mlir::Pass > createInlineFreeFunctionsPass()
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 registerInlineFreeFunctionsPass()
void registerRedundantOperationEliminationPass()
void registerEnforceNoMemberOverwritePassPass()
void registerPolyLoweringPassPass()
void registerUnusedDeclarationEliminationPass()
void registerComputeConstrainToProductPassPass()
void registerRedundantOperationEliminationPassPass()
void registerRemoveUnusedDiscardableAllocationsPass()
void registerComputeConstrainToProductPass()
void registerRedundantReadAndWriteEliminationPass()
void registerPolyLoweringPass()
void registerInlineFreeFunctionsPassPass()
void registerRedundantReadAndWriteEliminationPassPass()
void registerRemoveUnusedDiscardableAllocationsPassPass()
void registerEnforceNoMemberOverwritePass()
void registerFuseProductLoopsPass()