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
21#ifdef GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
22struct ComputeConstrainToProductPassOptions {
23 std::string rootStruct =
"@Main";
27#undef GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
29#ifdef GEN_PASS_DEF_COMPUTECONSTRAINTOPRODUCTPASS
40template <
typename DerivedT>
41class ComputeConstrainToProductPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
43 using Base = ComputeConstrainToProductPassBase;
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;
53 static constexpr ::llvm::StringLiteral getArgumentName() {
54 return ::llvm::StringLiteral(
"llzk-compute-constrain-to-product");
56 ::llvm::StringRef getArgument()
const override {
return "llzk-compute-constrain-to-product"; }
58 ::llvm::StringRef getDescription()
const override {
return "Replace separate @compute and @constrain functions in a struct with a single @product function"; }
61 static constexpr ::llvm::StringLiteral getPassName() {
62 return ::llvm::StringLiteral(
"ComputeConstrainToProductPass");
64 ::llvm::StringRef getName()
const override {
return "ComputeConstrainToProductPass"; }
67 static bool classof(const ::mlir::Pass *pass) {
68 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
72 std::unique_ptr<::mlir::Pass> clonePass()
const override {
73 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
77 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
96 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ComputeConstrainToProductPassBase<DerivedT>)
98 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassOptions options) : ComputeConstrainToProductPassBase() {
99 rootStruct = std::move(options.rootStruct);
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")};
106 return std::make_unique<DerivedT>();
110 return std::make_unique<DerivedT>(std::move(options));
116 return impl::createComputeConstrainToProductPass();
120 return impl::createComputeConstrainToProductPass(std::move(options));
122#undef GEN_PASS_DEF_COMPUTECONSTRAINTOPRODUCTPASS
128#ifdef GEN_PASS_DECL_ENFORCENOMEMBEROVERWRITEPASS
130#undef GEN_PASS_DECL_ENFORCENOMEMBEROVERWRITEPASS
132#ifdef GEN_PASS_DEF_ENFORCENOMEMBEROVERWRITEPASS
139template <
typename DerivedT>
140class EnforceNoMemberOverwritePassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
142 using Base = EnforceNoMemberOverwritePassBase;
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;
152 static constexpr ::llvm::StringLiteral getArgumentName() {
153 return ::llvm::StringLiteral(
"llzk-enforce-no-overwrite");
155 ::llvm::StringRef getArgument()
const override {
return "llzk-enforce-no-overwrite"; }
157 ::llvm::StringRef getDescription()
const override {
return "Checks that every struct member is written exactly once"; }
160 static constexpr ::llvm::StringLiteral getPassName() {
161 return ::llvm::StringLiteral(
"EnforceNoMemberOverwritePass");
163 ::llvm::StringRef getName()
const override {
return "EnforceNoMemberOverwritePass"; }
166 static bool classof(const ::mlir::Pass *pass) {
167 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
171 std::unique_ptr<::mlir::Pass> clonePass()
const override {
172 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
176 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
195 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EnforceNoMemberOverwritePassBase<DerivedT>)
201 return std::make_unique<DerivedT>();
207 return impl::createEnforceNoMemberOverwritePass();
209#undef GEN_PASS_DEF_ENFORCENOMEMBEROVERWRITEPASS
215#ifdef GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
217#undef GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
219#ifdef GEN_PASS_DEF_FUSEPRODUCTLOOPSPASS
226template <
typename DerivedT>
227class FuseProductLoopsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
229 using Base = FuseProductLoopsPassBase;
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;
239 static constexpr ::llvm::StringLiteral getArgumentName() {
240 return ::llvm::StringLiteral(
"llzk-fuse-product-loops");
242 ::llvm::StringRef getArgument()
const override {
return "llzk-fuse-product-loops"; }
244 ::llvm::StringRef getDescription()
const override {
return "Fuse matching witness/constraint loops in a @product function"; }
247 static constexpr ::llvm::StringLiteral getPassName() {
248 return ::llvm::StringLiteral(
"FuseProductLoopsPass");
250 ::llvm::StringRef getName()
const override {
return "FuseProductLoopsPass"; }
253 static bool classof(const ::mlir::Pass *pass) {
254 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
258 std::unique_ptr<::mlir::Pass> clonePass()
const override {
259 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
263 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
282 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FuseProductLoopsPassBase<DerivedT>)
288 return std::make_unique<DerivedT>();
294 return impl::createFuseProductLoopsPass();
296#undef GEN_PASS_DEF_FUSEPRODUCTLOOPSPASS
302#ifdef GEN_PASS_DECL_INLINESTRUCTSPASS
303struct InlineStructsPassOptions {
304 uint64_t maxComplexity = 0;
308#undef GEN_PASS_DECL_INLINESTRUCTSPASS
310#ifdef GEN_PASS_DEF_INLINESTRUCTSPASS
321template <
typename DerivedT>
322class InlineStructsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
324 using Base = InlineStructsPassBase;
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;
334 static constexpr ::llvm::StringLiteral getArgumentName() {
335 return ::llvm::StringLiteral(
"llzk-inline-structs");
337 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
339 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
342 static constexpr ::llvm::StringLiteral getPassName() {
343 return ::llvm::StringLiteral(
"InlineStructsPass");
345 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
348 static bool classof(const ::mlir::Pass *pass) {
349 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
353 std::unique_ptr<::mlir::Pass> clonePass()
const override {
354 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
358 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
377 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
379 InlineStructsPassBase(InlineStructsPassOptions options) : InlineStructsPassBase() {
380 maxComplexity = std::move(options.maxComplexity);
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)};
387 return std::make_unique<DerivedT>();
391 return std::make_unique<DerivedT>(std::move(options));
397 return impl::createInlineStructsPass();
401 return impl::createInlineStructsPass(std::move(options));
403#undef GEN_PASS_DEF_INLINESTRUCTSPASS
409#ifdef GEN_PASS_DECL_POLYLOWERINGPASS
410struct PolyLoweringPassOptions {
411 unsigned maxDegree = 2;
415#undef GEN_PASS_DECL_POLYLOWERINGPASS
417#ifdef GEN_PASS_DEF_POLYLOWERINGPASS
428template <
typename DerivedT>
429class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
431 using Base = PolyLoweringPassBase;
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;
441 static constexpr ::llvm::StringLiteral getArgumentName() {
442 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
444 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
446 ::llvm::StringRef getDescription()
const override {
return "Lower the degree of all polynomial equations to a specified maximum"; }
449 static constexpr ::llvm::StringLiteral getPassName() {
450 return ::llvm::StringLiteral(
"PolyLoweringPass");
452 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
455 static bool classof(const ::mlir::Pass *pass) {
456 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
460 std::unique_ptr<::mlir::Pass> clonePass()
const override {
461 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
465 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
484 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
486 PolyLoweringPassBase(PolyLoweringPassOptions options) : PolyLoweringPassBase() {
487 maxDegree = std::move(options.maxDegree);
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)};
494 return std::make_unique<DerivedT>();
498 return std::make_unique<DerivedT>(std::move(options));
504 return impl::createPolyLoweringPass();
508 return impl::createPolyLoweringPass(std::move(options));
510#undef GEN_PASS_DEF_POLYLOWERINGPASS
516#ifdef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
518#undef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
520#ifdef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
527template <
typename DerivedT>
528class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
530 using Base = RedundantOperationEliminationPassBase;
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;
540 static constexpr ::llvm::StringLiteral getArgumentName() {
541 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
543 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
545 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
548 static constexpr ::llvm::StringLiteral getPassName() {
549 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
551 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
554 static bool classof(const ::mlir::Pass *pass) {
555 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
559 std::unique_ptr<::mlir::Pass> clonePass()
const override {
560 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
564 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
583 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
589 return std::make_unique<DerivedT>();
595 return impl::createRedundantOperationEliminationPass();
597#undef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
603#ifdef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
605#undef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
607#ifdef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
614template <
typename DerivedT>
615class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
617 using Base = RedundantReadAndWriteEliminationPassBase;
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;
627 static constexpr ::llvm::StringLiteral getArgumentName() {
628 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
630 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
632 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
635 static constexpr ::llvm::StringLiteral getPassName() {
636 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
638 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
641 static bool classof(const ::mlir::Pass *pass) {
642 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
646 std::unique_ptr<::mlir::Pass> clonePass()
const override {
647 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
651 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
670 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
676 return std::make_unique<DerivedT>();
682 return impl::createRedundantReadAndWriteEliminationPass();
684#undef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
690#ifdef GEN_PASS_DECL_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
691struct RemoveUnusedDiscardableAllocationsPassOptions {
692 std::string allocatorOpName =
"";
696#undef GEN_PASS_DECL_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
698#ifdef GEN_PASS_DEF_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
709template <
typename DerivedT>
710class RemoveUnusedDiscardableAllocationsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
712 using Base = RemoveUnusedDiscardableAllocationsPassBase;
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;
722 static constexpr ::llvm::StringLiteral getArgumentName() {
723 return ::llvm::StringLiteral(
"llzk-remove-unused-discardable-allocations");
725 ::llvm::StringRef getArgument()
const override {
return "llzk-remove-unused-discardable-allocations"; }
727 ::llvm::StringRef getDescription()
const override {
return "Remove unread discardable allocations and their dead stores"; }
730 static constexpr ::llvm::StringLiteral getPassName() {
731 return ::llvm::StringLiteral(
"RemoveUnusedDiscardableAllocationsPass");
733 ::llvm::StringRef getName()
const override {
return "RemoveUnusedDiscardableAllocationsPass"; }
736 static bool classof(const ::mlir::Pass *pass) {
737 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
741 std::unique_ptr<::mlir::Pass> clonePass()
const override {
742 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
746 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
765 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RemoveUnusedDiscardableAllocationsPassBase<DerivedT>)
767 RemoveUnusedDiscardableAllocationsPassBase(RemoveUnusedDiscardableAllocationsPassOptions options) : RemoveUnusedDiscardableAllocationsPassBase() {
768 allocatorOpName = std::move(options.allocatorOpName);
771 ::mlir::Pass::Option<std::string> allocatorOpName{*
this,
"allocator-op", ::llvm::cl::desc(
"Operation name of the discardable allocator to remove"), ::llvm::cl::init(
"")};
775 return std::make_unique<DerivedT>();
779 return std::make_unique<DerivedT>(std::move(options));
785 return impl::createRemoveUnusedDiscardableAllocationsPass();
789 return impl::createRemoveUnusedDiscardableAllocationsPass(std::move(options));
791#undef GEN_PASS_DEF_REMOVEUNUSEDDISCARDABLEALLOCATIONSPASS
797#ifdef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
798struct UnusedDeclarationEliminationPassOptions {
799 bool removeStructs =
false;
803#undef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
805#ifdef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
816template <
typename DerivedT>
817class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
819 using Base = UnusedDeclarationEliminationPassBase;
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;
829 static constexpr ::llvm::StringLiteral getArgumentName() {
830 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
832 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
834 ::llvm::StringRef getDescription()
const override {
return "Remove unused member and struct declarations"; }
837 static constexpr ::llvm::StringLiteral getPassName() {
838 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
840 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
843 static bool classof(const ::mlir::Pass *pass) {
844 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
848 std::unique_ptr<::mlir::Pass> clonePass()
const override {
849 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
853 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
872 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
874 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassOptions options) : UnusedDeclarationEliminationPassBase() {
875 removeStructs = std::move(options.removeStructs);
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)};
882 return std::make_unique<DerivedT>();
886 return std::make_unique<DerivedT>(std::move(options));
892 return impl::createUnusedDeclarationEliminationPass();
896 return impl::createUnusedDeclarationEliminationPass(std::move(options));
898#undef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
904#ifdef GEN_PASS_DECL_WHILETOFORPASS
906#undef GEN_PASS_DECL_WHILETOFORPASS
908#ifdef GEN_PASS_DEF_WHILETOFORPASS
915template <
typename DerivedT>
916class WhileToForPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
918 using Base = WhileToForPassBase;
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;
928 static constexpr ::llvm::StringLiteral getArgumentName() {
929 return ::llvm::StringLiteral(
"llzk-while-to-for");
931 ::llvm::StringRef getArgument()
const override {
return "llzk-while-to-for"; }
933 ::llvm::StringRef getDescription()
const override {
return "Converts scf.while loops to equivalent scf.for loops when possible"; }
936 static constexpr ::llvm::StringLiteral getPassName() {
937 return ::llvm::StringLiteral(
"WhileToForPass");
939 ::llvm::StringRef getName()
const override {
return "WhileToForPass"; }
942 static bool classof(const ::mlir::Pass *pass) {
943 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
947 std::unique_ptr<::mlir::Pass> clonePass()
const override {
948 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
952 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
971 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(WhileToForPassBase<DerivedT>)
977 return std::make_unique<DerivedT>();
983 return impl::createWhileToForPass();
985#undef GEN_PASS_DEF_WHILETOFORPASS
987#ifdef GEN_PASS_REGISTRATION
994 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1001 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1011 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1018 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1028 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1035 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1045 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1052 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1062 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1069 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1079 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1086 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1096 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1103 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1113 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1120 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1130 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1137 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1147 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1154 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
1175#undef GEN_PASS_REGISTRATION
1178#ifdef GEN_PASS_CLASSES
1180template <
typename DerivedT>
1181class ComputeConstrainToProductPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1183 using Base = ComputeConstrainToProductPassBase;
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;
1193 static constexpr ::llvm::StringLiteral getArgumentName() {
1194 return ::llvm::StringLiteral(
"llzk-compute-constrain-to-product");
1196 ::llvm::StringRef getArgument()
const override {
return "llzk-compute-constrain-to-product"; }
1198 ::llvm::StringRef getDescription()
const override {
return "Replace separate @compute and @constrain functions in a struct with a single @product function"; }
1201 static constexpr ::llvm::StringLiteral getPassName() {
1202 return ::llvm::StringLiteral(
"ComputeConstrainToProductPass");
1204 ::llvm::StringRef getName()
const override {
return "ComputeConstrainToProductPass"; }
1207 static bool classof(const ::mlir::Pass *pass) {
1208 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1212 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1213 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1217 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1236 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ComputeConstrainToProductPassBase<DerivedT>)
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")};
1242template <
typename DerivedT>
1243class EnforceNoMemberOverwritePassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1245 using Base = EnforceNoMemberOverwritePassBase;
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;
1255 static constexpr ::llvm::StringLiteral getArgumentName() {
1256 return ::llvm::StringLiteral(
"llzk-enforce-no-overwrite");
1258 ::llvm::StringRef getArgument()
const override {
return "llzk-enforce-no-overwrite"; }
1260 ::llvm::StringRef getDescription()
const override {
return "Checks that every struct member is written exactly once"; }
1263 static constexpr ::llvm::StringLiteral getPassName() {
1264 return ::llvm::StringLiteral(
"EnforceNoMemberOverwritePass");
1266 ::llvm::StringRef getName()
const override {
return "EnforceNoMemberOverwritePass"; }
1269 static bool classof(const ::mlir::Pass *pass) {
1270 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1274 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1275 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1279 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1298 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EnforceNoMemberOverwritePassBase<DerivedT>)
1303template <
typename DerivedT>
1304class FuseProductLoopsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1306 using Base = FuseProductLoopsPassBase;
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;
1316 static constexpr ::llvm::StringLiteral getArgumentName() {
1317 return ::llvm::StringLiteral(
"llzk-fuse-product-loops");
1319 ::llvm::StringRef getArgument()
const override {
return "llzk-fuse-product-loops"; }
1321 ::llvm::StringRef getDescription()
const override {
return "Fuse matching witness/constraint loops in a @product function"; }
1324 static constexpr ::llvm::StringLiteral getPassName() {
1325 return ::llvm::StringLiteral(
"FuseProductLoopsPass");
1327 ::llvm::StringRef getName()
const override {
return "FuseProductLoopsPass"; }
1330 static bool classof(const ::mlir::Pass *pass) {
1331 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1335 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1336 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1340 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1359 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FuseProductLoopsPassBase<DerivedT>)
1364template <
typename DerivedT>
1365class InlineStructsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1367 using Base = InlineStructsPassBase;
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;
1377 static constexpr ::llvm::StringLiteral getArgumentName() {
1378 return ::llvm::StringLiteral(
"llzk-inline-structs");
1380 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
1382 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
1385 static constexpr ::llvm::StringLiteral getPassName() {
1386 return ::llvm::StringLiteral(
"InlineStructsPass");
1388 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
1391 static bool classof(const ::mlir::Pass *pass) {
1392 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1396 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1397 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1401 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1420 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
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)};
1426template <
typename DerivedT>
1427class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1429 using Base = PolyLoweringPassBase;
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;
1439 static constexpr ::llvm::StringLiteral getArgumentName() {
1440 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
1442 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
1444 ::llvm::StringRef getDescription()
const override {
return "Lower the degree of all polynomial equations to a specified maximum"; }
1447 static constexpr ::llvm::StringLiteral getPassName() {
1448 return ::llvm::StringLiteral(
"PolyLoweringPass");
1450 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
1453 static bool classof(const ::mlir::Pass *pass) {
1454 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1458 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1459 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1463 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1482 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
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)};
1488template <
typename DerivedT>
1489class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1491 using Base = RedundantOperationEliminationPassBase;
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;
1501 static constexpr ::llvm::StringLiteral getArgumentName() {
1502 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
1504 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
1506 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
1509 static constexpr ::llvm::StringLiteral getPassName() {
1510 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
1512 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
1515 static bool classof(const ::mlir::Pass *pass) {
1516 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1520 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1521 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1525 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1544 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
1549template <
typename DerivedT>
1550class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1552 using Base = RedundantReadAndWriteEliminationPassBase;
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;
1562 static constexpr ::llvm::StringLiteral getArgumentName() {
1563 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
1565 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
1567 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
1570 static constexpr ::llvm::StringLiteral getPassName() {
1571 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
1573 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
1576 static bool classof(const ::mlir::Pass *pass) {
1577 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1581 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1582 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1586 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1605 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
1610template <
typename DerivedT>
1611class RemoveUnusedDiscardableAllocationsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1613 using Base = RemoveUnusedDiscardableAllocationsPassBase;
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;
1623 static constexpr ::llvm::StringLiteral getArgumentName() {
1624 return ::llvm::StringLiteral(
"llzk-remove-unused-discardable-allocations");
1626 ::llvm::StringRef getArgument()
const override {
return "llzk-remove-unused-discardable-allocations"; }
1628 ::llvm::StringRef getDescription()
const override {
return "Remove unread discardable allocations and their dead stores"; }
1631 static constexpr ::llvm::StringLiteral getPassName() {
1632 return ::llvm::StringLiteral(
"RemoveUnusedDiscardableAllocationsPass");
1634 ::llvm::StringRef getName()
const override {
return "RemoveUnusedDiscardableAllocationsPass"; }
1637 static bool classof(const ::mlir::Pass *pass) {
1638 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1642 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1643 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1647 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1666 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RemoveUnusedDiscardableAllocationsPassBase<DerivedT>)
1669 ::mlir::Pass::Option<std::string> allocatorOpName{*
this,
"allocator-op", ::llvm::cl::desc(
"Operation name of the discardable allocator to remove"), ::llvm::cl::init(
"")};
1672template <
typename DerivedT>
1673class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1675 using Base = UnusedDeclarationEliminationPassBase;
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;
1685 static constexpr ::llvm::StringLiteral getArgumentName() {
1686 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
1688 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
1690 ::llvm::StringRef getDescription()
const override {
return "Remove unused member and struct declarations"; }
1693 static constexpr ::llvm::StringLiteral getPassName() {
1694 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
1696 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
1699 static bool classof(const ::mlir::Pass *pass) {
1700 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1704 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1705 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1709 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1728 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
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)};
1734template <
typename DerivedT>
1735class WhileToForPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1737 using Base = WhileToForPassBase;
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;
1747 static constexpr ::llvm::StringLiteral getArgumentName() {
1748 return ::llvm::StringLiteral(
"llzk-while-to-for");
1750 ::llvm::StringRef getArgument()
const override {
return "llzk-while-to-for"; }
1752 ::llvm::StringRef getDescription()
const override {
return "Converts scf.while loops to equivalent scf.for loops when possible"; }
1755 static constexpr ::llvm::StringLiteral getPassName() {
1756 return ::llvm::StringLiteral(
"WhileToForPass");
1758 ::llvm::StringRef getName()
const override {
return "WhileToForPass"; }
1761 static bool classof(const ::mlir::Pass *pass) {
1762 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1766 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1767 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1771 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1790 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(WhileToForPassBase<DerivedT>)
1794#undef 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()