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_UNUSEDDECLARATIONELIMINATIONPASS
19#ifdef GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
20struct ComputeConstrainToProductPassOptions {
21 std::string rootStruct =
"@Main";
23#undef GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
25#ifdef GEN_PASS_DEF_COMPUTECONSTRAINTOPRODUCTPASS
28template <
typename DerivedT>
29class ComputeConstrainToProductPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
31 using Base = ComputeConstrainToProductPassBase;
33 ComputeConstrainToProductPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
34 ComputeConstrainToProductPassBase(
const ComputeConstrainToProductPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
35 ComputeConstrainToProductPassBase& operator=(
const ComputeConstrainToProductPassBase &) =
delete;
36 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassBase &&) =
delete;
37 ComputeConstrainToProductPassBase& operator=(ComputeConstrainToProductPassBase &&) =
delete;
38 ~ComputeConstrainToProductPassBase() =
default;
41 static constexpr ::llvm::StringLiteral getArgumentName() {
42 return ::llvm::StringLiteral(
"llzk-compute-constrain-to-product");
44 ::llvm::StringRef getArgument()
const override {
return "llzk-compute-constrain-to-product"; }
46 ::llvm::StringRef getDescription()
const override {
return "Replace separate @compute and @constrain functions in a struct with a single @product function"; }
49 static constexpr ::llvm::StringLiteral getPassName() {
50 return ::llvm::StringLiteral(
"ComputeConstrainToProductPass");
52 ::llvm::StringRef getName()
const override {
return "ComputeConstrainToProductPass"; }
55 static bool classof(const ::mlir::Pass *pass) {
56 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
60 std::unique_ptr<::mlir::Pass> clonePass()
const override {
61 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
65 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
66 registry.insert<llzk::LLZKDialect>();
67 registry.insert<llzk::boolean::BoolDialect>();
68 registry.insert<llzk::array::ArrayDialect>();
69 registry.insert<llzk::component::StructDialect>();
70 registry.insert<llzk::constrain::ConstrainDialect>();
71 registry.insert<llzk::felt::FeltDialect>();
72 registry.insert<llzk::global::GlobalDialect>();
73 registry.insert<llzk::include::IncludeDialect>();
74 registry.insert<llzk::function::FunctionDialect>();
75 registry.insert<llzk::string::StringDialect>();
76 registry.insert<llzk::polymorphic::PolymorphicDialect>();
77 registry.insert<mlir::arith::ArithDialect>();
78 registry.insert<mlir::scf::SCFDialect>();
84 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ComputeConstrainToProductPassBase<DerivedT>)
86 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassOptions options) : ComputeConstrainToProductPassBase() {
87 rootStruct = std::move(options.rootStruct);
90 ::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")};
94#undef GEN_PASS_DEF_COMPUTECONSTRAINTOPRODUCTPASS
100#ifdef GEN_PASS_DECL_ENFORCENOMEMBEROVERWRITEPASS
101#undef GEN_PASS_DECL_ENFORCENOMEMBEROVERWRITEPASS
103#ifdef GEN_PASS_DEF_ENFORCENOMEMBEROVERWRITEPASS
106template <
typename DerivedT>
107class EnforceNoMemberOverwritePassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
109 using Base = EnforceNoMemberOverwritePassBase;
111 EnforceNoMemberOverwritePassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
112 EnforceNoMemberOverwritePassBase(
const EnforceNoMemberOverwritePassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
113 EnforceNoMemberOverwritePassBase& operator=(
const EnforceNoMemberOverwritePassBase &) =
delete;
114 EnforceNoMemberOverwritePassBase(EnforceNoMemberOverwritePassBase &&) =
delete;
115 EnforceNoMemberOverwritePassBase& operator=(EnforceNoMemberOverwritePassBase &&) =
delete;
116 ~EnforceNoMemberOverwritePassBase() =
default;
119 static constexpr ::llvm::StringLiteral getArgumentName() {
120 return ::llvm::StringLiteral(
"llzk-enforce-no-overwrite");
122 ::llvm::StringRef getArgument()
const override {
return "llzk-enforce-no-overwrite"; }
124 ::llvm::StringRef getDescription()
const override {
return "Checks that every struct member is written exactly once"; }
127 static constexpr ::llvm::StringLiteral getPassName() {
128 return ::llvm::StringLiteral(
"EnforceNoMemberOverwritePass");
130 ::llvm::StringRef getName()
const override {
return "EnforceNoMemberOverwritePass"; }
133 static bool classof(const ::mlir::Pass *pass) {
134 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
138 std::unique_ptr<::mlir::Pass> clonePass()
const override {
139 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
143 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
144 registry.insert<llzk::LLZKDialect>();
145 registry.insert<llzk::boolean::BoolDialect>();
146 registry.insert<llzk::array::ArrayDialect>();
147 registry.insert<llzk::component::StructDialect>();
148 registry.insert<llzk::constrain::ConstrainDialect>();
149 registry.insert<llzk::felt::FeltDialect>();
150 registry.insert<llzk::global::GlobalDialect>();
151 registry.insert<llzk::include::IncludeDialect>();
152 registry.insert<llzk::function::FunctionDialect>();
153 registry.insert<llzk::string::StringDialect>();
154 registry.insert<llzk::polymorphic::PolymorphicDialect>();
155 registry.insert<mlir::arith::ArithDialect>();
156 registry.insert<mlir::scf::SCFDialect>();
162 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EnforceNoMemberOverwritePassBase<DerivedT>)
168#undef GEN_PASS_DEF_ENFORCENOMEMBEROVERWRITEPASS
174#ifdef GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
175#undef GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
177#ifdef GEN_PASS_DEF_FUSEPRODUCTLOOPSPASS
180template <
typename DerivedT>
181class FuseProductLoopsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
183 using Base = FuseProductLoopsPassBase;
185 FuseProductLoopsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
186 FuseProductLoopsPassBase(
const FuseProductLoopsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
187 FuseProductLoopsPassBase& operator=(
const FuseProductLoopsPassBase &) =
delete;
188 FuseProductLoopsPassBase(FuseProductLoopsPassBase &&) =
delete;
189 FuseProductLoopsPassBase& operator=(FuseProductLoopsPassBase &&) =
delete;
190 ~FuseProductLoopsPassBase() =
default;
193 static constexpr ::llvm::StringLiteral getArgumentName() {
194 return ::llvm::StringLiteral(
"llzk-fuse-product-loops");
196 ::llvm::StringRef getArgument()
const override {
return "llzk-fuse-product-loops"; }
198 ::llvm::StringRef getDescription()
const override {
return "Fuse matching witness/constraint loops in a @product function"; }
201 static constexpr ::llvm::StringLiteral getPassName() {
202 return ::llvm::StringLiteral(
"FuseProductLoopsPass");
204 ::llvm::StringRef getName()
const override {
return "FuseProductLoopsPass"; }
207 static bool classof(const ::mlir::Pass *pass) {
208 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
212 std::unique_ptr<::mlir::Pass> clonePass()
const override {
213 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
217 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
218 registry.insert<llzk::LLZKDialect>();
219 registry.insert<llzk::boolean::BoolDialect>();
220 registry.insert<llzk::array::ArrayDialect>();
221 registry.insert<llzk::component::StructDialect>();
222 registry.insert<llzk::constrain::ConstrainDialect>();
223 registry.insert<llzk::felt::FeltDialect>();
224 registry.insert<llzk::global::GlobalDialect>();
225 registry.insert<llzk::include::IncludeDialect>();
226 registry.insert<llzk::function::FunctionDialect>();
227 registry.insert<llzk::string::StringDialect>();
228 registry.insert<llzk::polymorphic::PolymorphicDialect>();
229 registry.insert<mlir::arith::ArithDialect>();
230 registry.insert<mlir::scf::SCFDialect>();
236 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FuseProductLoopsPassBase<DerivedT>)
242#undef GEN_PASS_DEF_FUSEPRODUCTLOOPSPASS
248#ifdef GEN_PASS_DECL_INLINESTRUCTSPASS
249struct InlineStructsPassOptions {
250 uint64_t maxComplexity = 0;
252#undef GEN_PASS_DECL_INLINESTRUCTSPASS
254#ifdef GEN_PASS_DEF_INLINESTRUCTSPASS
257template <
typename DerivedT>
258class InlineStructsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
260 using Base = InlineStructsPassBase;
262 InlineStructsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
263 InlineStructsPassBase(
const InlineStructsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
264 InlineStructsPassBase& operator=(
const InlineStructsPassBase &) =
delete;
265 InlineStructsPassBase(InlineStructsPassBase &&) =
delete;
266 InlineStructsPassBase& operator=(InlineStructsPassBase &&) =
delete;
267 ~InlineStructsPassBase() =
default;
270 static constexpr ::llvm::StringLiteral getArgumentName() {
271 return ::llvm::StringLiteral(
"llzk-inline-structs");
273 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
275 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
278 static constexpr ::llvm::StringLiteral getPassName() {
279 return ::llvm::StringLiteral(
"InlineStructsPass");
281 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
284 static bool classof(const ::mlir::Pass *pass) {
285 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
289 std::unique_ptr<::mlir::Pass> clonePass()
const override {
290 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
294 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
295 registry.insert<llzk::LLZKDialect>();
296 registry.insert<llzk::boolean::BoolDialect>();
297 registry.insert<llzk::array::ArrayDialect>();
298 registry.insert<llzk::component::StructDialect>();
299 registry.insert<llzk::constrain::ConstrainDialect>();
300 registry.insert<llzk::felt::FeltDialect>();
301 registry.insert<llzk::global::GlobalDialect>();
302 registry.insert<llzk::include::IncludeDialect>();
303 registry.insert<llzk::function::FunctionDialect>();
304 registry.insert<llzk::string::StringDialect>();
305 registry.insert<llzk::polymorphic::PolymorphicDialect>();
306 registry.insert<mlir::arith::ArithDialect>();
307 registry.insert<mlir::scf::SCFDialect>();
313 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
315 InlineStructsPassBase(InlineStructsPassOptions options) : InlineStructsPassBase() {
316 maxComplexity = std::move(options.maxComplexity);
319 ::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)};
323#undef GEN_PASS_DEF_INLINESTRUCTSPASS
329#ifdef GEN_PASS_DECL_POLYLOWERINGPASS
330struct PolyLoweringPassOptions {
331 unsigned maxDegree = 2;
333#undef GEN_PASS_DECL_POLYLOWERINGPASS
335#ifdef GEN_PASS_DEF_POLYLOWERINGPASS
338template <
typename DerivedT>
339class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
341 using Base = PolyLoweringPassBase;
343 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
344 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
345 PolyLoweringPassBase& operator=(
const PolyLoweringPassBase &) =
delete;
346 PolyLoweringPassBase(PolyLoweringPassBase &&) =
delete;
347 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) =
delete;
348 ~PolyLoweringPassBase() =
default;
351 static constexpr ::llvm::StringLiteral getArgumentName() {
352 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
354 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
356 ::llvm::StringRef getDescription()
const override {
return "Lower the degree of all polynomial equations to a specified maximum"; }
359 static constexpr ::llvm::StringLiteral getPassName() {
360 return ::llvm::StringLiteral(
"PolyLoweringPass");
362 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
365 static bool classof(const ::mlir::Pass *pass) {
366 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
370 std::unique_ptr<::mlir::Pass> clonePass()
const override {
371 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
375 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
376 registry.insert<llzk::LLZKDialect>();
377 registry.insert<llzk::boolean::BoolDialect>();
378 registry.insert<llzk::array::ArrayDialect>();
379 registry.insert<llzk::component::StructDialect>();
380 registry.insert<llzk::constrain::ConstrainDialect>();
381 registry.insert<llzk::felt::FeltDialect>();
382 registry.insert<llzk::global::GlobalDialect>();
383 registry.insert<llzk::include::IncludeDialect>();
384 registry.insert<llzk::function::FunctionDialect>();
385 registry.insert<llzk::string::StringDialect>();
386 registry.insert<llzk::polymorphic::PolymorphicDialect>();
387 registry.insert<mlir::arith::ArithDialect>();
388 registry.insert<mlir::scf::SCFDialect>();
394 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
396 PolyLoweringPassBase(PolyLoweringPassOptions options) : PolyLoweringPassBase() {
397 maxDegree = std::move(options.maxDegree);
400 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
404#undef GEN_PASS_DEF_POLYLOWERINGPASS
410#ifdef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
411#undef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
413#ifdef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
416template <
typename DerivedT>
417class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
419 using Base = RedundantOperationEliminationPassBase;
421 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
422 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
423 RedundantOperationEliminationPassBase& operator=(
const RedundantOperationEliminationPassBase &) =
delete;
424 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) =
delete;
425 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) =
delete;
426 ~RedundantOperationEliminationPassBase() =
default;
429 static constexpr ::llvm::StringLiteral getArgumentName() {
430 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
432 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
434 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
437 static constexpr ::llvm::StringLiteral getPassName() {
438 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
440 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
443 static bool classof(const ::mlir::Pass *pass) {
444 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
448 std::unique_ptr<::mlir::Pass> clonePass()
const override {
449 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
453 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
454 registry.insert<llzk::LLZKDialect>();
455 registry.insert<llzk::boolean::BoolDialect>();
456 registry.insert<llzk::array::ArrayDialect>();
457 registry.insert<llzk::component::StructDialect>();
458 registry.insert<llzk::constrain::ConstrainDialect>();
459 registry.insert<llzk::felt::FeltDialect>();
460 registry.insert<llzk::global::GlobalDialect>();
461 registry.insert<llzk::include::IncludeDialect>();
462 registry.insert<llzk::function::FunctionDialect>();
463 registry.insert<llzk::string::StringDialect>();
464 registry.insert<llzk::polymorphic::PolymorphicDialect>();
465 registry.insert<mlir::arith::ArithDialect>();
466 registry.insert<mlir::scf::SCFDialect>();
472 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
478#undef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
484#ifdef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
485#undef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
487#ifdef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
490template <
typename DerivedT>
491class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
493 using Base = RedundantReadAndWriteEliminationPassBase;
495 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
496 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
497 RedundantReadAndWriteEliminationPassBase& operator=(
const RedundantReadAndWriteEliminationPassBase &) =
delete;
498 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) =
delete;
499 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) =
delete;
500 ~RedundantReadAndWriteEliminationPassBase() =
default;
503 static constexpr ::llvm::StringLiteral getArgumentName() {
504 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
506 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
508 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
511 static constexpr ::llvm::StringLiteral getPassName() {
512 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
514 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
517 static bool classof(const ::mlir::Pass *pass) {
518 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
522 std::unique_ptr<::mlir::Pass> clonePass()
const override {
523 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
527 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
528 registry.insert<llzk::LLZKDialect>();
529 registry.insert<llzk::boolean::BoolDialect>();
530 registry.insert<llzk::array::ArrayDialect>();
531 registry.insert<llzk::component::StructDialect>();
532 registry.insert<llzk::constrain::ConstrainDialect>();
533 registry.insert<llzk::felt::FeltDialect>();
534 registry.insert<llzk::global::GlobalDialect>();
535 registry.insert<llzk::include::IncludeDialect>();
536 registry.insert<llzk::function::FunctionDialect>();
537 registry.insert<llzk::string::StringDialect>();
538 registry.insert<llzk::polymorphic::PolymorphicDialect>();
539 registry.insert<mlir::arith::ArithDialect>();
540 registry.insert<mlir::scf::SCFDialect>();
546 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
552#undef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
558#ifdef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
559struct UnusedDeclarationEliminationPassOptions {
560 bool removeStructs =
false;
562#undef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
564#ifdef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
567template <
typename DerivedT>
568class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
570 using Base = UnusedDeclarationEliminationPassBase;
572 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
573 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
574 UnusedDeclarationEliminationPassBase& operator=(
const UnusedDeclarationEliminationPassBase &) =
delete;
575 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) =
delete;
576 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) =
delete;
577 ~UnusedDeclarationEliminationPassBase() =
default;
580 static constexpr ::llvm::StringLiteral getArgumentName() {
581 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
583 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
585 ::llvm::StringRef getDescription()
const override {
return "Remove unused member and struct declarations"; }
588 static constexpr ::llvm::StringLiteral getPassName() {
589 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
591 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
594 static bool classof(const ::mlir::Pass *pass) {
595 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
599 std::unique_ptr<::mlir::Pass> clonePass()
const override {
600 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
604 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
605 registry.insert<llzk::LLZKDialect>();
606 registry.insert<llzk::boolean::BoolDialect>();
607 registry.insert<llzk::array::ArrayDialect>();
608 registry.insert<llzk::component::StructDialect>();
609 registry.insert<llzk::constrain::ConstrainDialect>();
610 registry.insert<llzk::felt::FeltDialect>();
611 registry.insert<llzk::global::GlobalDialect>();
612 registry.insert<llzk::include::IncludeDialect>();
613 registry.insert<llzk::function::FunctionDialect>();
614 registry.insert<llzk::string::StringDialect>();
615 registry.insert<llzk::polymorphic::PolymorphicDialect>();
616 registry.insert<mlir::arith::ArithDialect>();
617 registry.insert<mlir::scf::SCFDialect>();
623 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
625 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassOptions options) : UnusedDeclarationEliminationPassBase() {
626 removeStructs = std::move(options.removeStructs);
629 ::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)};
633#undef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
635#ifdef GEN_PASS_REGISTRATION
642 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
649 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
659 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
666 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
676 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
683 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
693 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
700 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
710 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
717 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
727 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
734 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
744 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
751 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
761 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
768 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
787#undef GEN_PASS_REGISTRATION
790#ifdef GEN_PASS_CLASSES
792template <
typename DerivedT>
793class ComputeConstrainToProductPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
795 using Base = ComputeConstrainToProductPassBase;
797 ComputeConstrainToProductPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
798 ComputeConstrainToProductPassBase(
const ComputeConstrainToProductPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
799 ComputeConstrainToProductPassBase& operator=(
const ComputeConstrainToProductPassBase &) =
delete;
800 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassBase &&) =
delete;
801 ComputeConstrainToProductPassBase& operator=(ComputeConstrainToProductPassBase &&) =
delete;
802 ~ComputeConstrainToProductPassBase() =
default;
805 static constexpr ::llvm::StringLiteral getArgumentName() {
806 return ::llvm::StringLiteral(
"llzk-compute-constrain-to-product");
808 ::llvm::StringRef getArgument()
const override {
return "llzk-compute-constrain-to-product"; }
810 ::llvm::StringRef getDescription()
const override {
return "Replace separate @compute and @constrain functions in a struct with a single @product function"; }
813 static constexpr ::llvm::StringLiteral getPassName() {
814 return ::llvm::StringLiteral(
"ComputeConstrainToProductPass");
816 ::llvm::StringRef getName()
const override {
return "ComputeConstrainToProductPass"; }
819 static bool classof(const ::mlir::Pass *pass) {
820 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
824 std::unique_ptr<::mlir::Pass> clonePass()
const override {
825 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
829 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
830 registry.insert<llzk::LLZKDialect>();
831 registry.insert<llzk::boolean::BoolDialect>();
832 registry.insert<llzk::array::ArrayDialect>();
833 registry.insert<llzk::component::StructDialect>();
834 registry.insert<llzk::constrain::ConstrainDialect>();
835 registry.insert<llzk::felt::FeltDialect>();
836 registry.insert<llzk::global::GlobalDialect>();
837 registry.insert<llzk::include::IncludeDialect>();
838 registry.insert<llzk::function::FunctionDialect>();
839 registry.insert<llzk::string::StringDialect>();
840 registry.insert<llzk::polymorphic::PolymorphicDialect>();
841 registry.insert<mlir::arith::ArithDialect>();
842 registry.insert<mlir::scf::SCFDialect>();
848 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ComputeConstrainToProductPassBase<DerivedT>)
851 ::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")};
854template <
typename DerivedT>
855class EnforceNoMemberOverwritePassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
857 using Base = EnforceNoMemberOverwritePassBase;
859 EnforceNoMemberOverwritePassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
860 EnforceNoMemberOverwritePassBase(
const EnforceNoMemberOverwritePassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
861 EnforceNoMemberOverwritePassBase& operator=(
const EnforceNoMemberOverwritePassBase &) =
delete;
862 EnforceNoMemberOverwritePassBase(EnforceNoMemberOverwritePassBase &&) =
delete;
863 EnforceNoMemberOverwritePassBase& operator=(EnforceNoMemberOverwritePassBase &&) =
delete;
864 ~EnforceNoMemberOverwritePassBase() =
default;
867 static constexpr ::llvm::StringLiteral getArgumentName() {
868 return ::llvm::StringLiteral(
"llzk-enforce-no-overwrite");
870 ::llvm::StringRef getArgument()
const override {
return "llzk-enforce-no-overwrite"; }
872 ::llvm::StringRef getDescription()
const override {
return "Checks that every struct member is written exactly once"; }
875 static constexpr ::llvm::StringLiteral getPassName() {
876 return ::llvm::StringLiteral(
"EnforceNoMemberOverwritePass");
878 ::llvm::StringRef getName()
const override {
return "EnforceNoMemberOverwritePass"; }
881 static bool classof(const ::mlir::Pass *pass) {
882 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
886 std::unique_ptr<::mlir::Pass> clonePass()
const override {
887 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
891 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
892 registry.insert<llzk::LLZKDialect>();
893 registry.insert<llzk::boolean::BoolDialect>();
894 registry.insert<llzk::array::ArrayDialect>();
895 registry.insert<llzk::component::StructDialect>();
896 registry.insert<llzk::constrain::ConstrainDialect>();
897 registry.insert<llzk::felt::FeltDialect>();
898 registry.insert<llzk::global::GlobalDialect>();
899 registry.insert<llzk::include::IncludeDialect>();
900 registry.insert<llzk::function::FunctionDialect>();
901 registry.insert<llzk::string::StringDialect>();
902 registry.insert<llzk::polymorphic::PolymorphicDialect>();
903 registry.insert<mlir::arith::ArithDialect>();
904 registry.insert<mlir::scf::SCFDialect>();
910 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EnforceNoMemberOverwritePassBase<DerivedT>)
915template <
typename DerivedT>
916class FuseProductLoopsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
918 using Base = FuseProductLoopsPassBase;
920 FuseProductLoopsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
921 FuseProductLoopsPassBase(
const FuseProductLoopsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
922 FuseProductLoopsPassBase& operator=(
const FuseProductLoopsPassBase &) =
delete;
923 FuseProductLoopsPassBase(FuseProductLoopsPassBase &&) =
delete;
924 FuseProductLoopsPassBase& operator=(FuseProductLoopsPassBase &&) =
delete;
925 ~FuseProductLoopsPassBase() =
default;
928 static constexpr ::llvm::StringLiteral getArgumentName() {
929 return ::llvm::StringLiteral(
"llzk-fuse-product-loops");
931 ::llvm::StringRef getArgument()
const override {
return "llzk-fuse-product-loops"; }
933 ::llvm::StringRef getDescription()
const override {
return "Fuse matching witness/constraint loops in a @product function"; }
936 static constexpr ::llvm::StringLiteral getPassName() {
937 return ::llvm::StringLiteral(
"FuseProductLoopsPass");
939 ::llvm::StringRef getName()
const override {
return "FuseProductLoopsPass"; }
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(FuseProductLoopsPassBase<DerivedT>)
976template <
typename DerivedT>
977class InlineStructsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
979 using Base = InlineStructsPassBase;
981 InlineStructsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
982 InlineStructsPassBase(
const InlineStructsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
983 InlineStructsPassBase& operator=(
const InlineStructsPassBase &) =
delete;
984 InlineStructsPassBase(InlineStructsPassBase &&) =
delete;
985 InlineStructsPassBase& operator=(InlineStructsPassBase &&) =
delete;
986 ~InlineStructsPassBase() =
default;
989 static constexpr ::llvm::StringLiteral getArgumentName() {
990 return ::llvm::StringLiteral(
"llzk-inline-structs");
992 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
994 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
997 static constexpr ::llvm::StringLiteral getPassName() {
998 return ::llvm::StringLiteral(
"InlineStructsPass");
1000 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
1003 static bool classof(const ::mlir::Pass *pass) {
1004 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1008 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1009 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1013 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1014 registry.insert<llzk::LLZKDialect>();
1015 registry.insert<llzk::boolean::BoolDialect>();
1016 registry.insert<llzk::array::ArrayDialect>();
1017 registry.insert<llzk::component::StructDialect>();
1018 registry.insert<llzk::constrain::ConstrainDialect>();
1019 registry.insert<llzk::felt::FeltDialect>();
1020 registry.insert<llzk::global::GlobalDialect>();
1021 registry.insert<llzk::include::IncludeDialect>();
1022 registry.insert<llzk::function::FunctionDialect>();
1023 registry.insert<llzk::string::StringDialect>();
1024 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1025 registry.insert<mlir::arith::ArithDialect>();
1026 registry.insert<mlir::scf::SCFDialect>();
1032 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
1035 ::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)};
1038template <
typename DerivedT>
1039class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1041 using Base = PolyLoweringPassBase;
1043 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1044 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1045 PolyLoweringPassBase& operator=(
const PolyLoweringPassBase &) =
delete;
1046 PolyLoweringPassBase(PolyLoweringPassBase &&) =
delete;
1047 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) =
delete;
1048 ~PolyLoweringPassBase() =
default;
1051 static constexpr ::llvm::StringLiteral getArgumentName() {
1052 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
1054 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
1056 ::llvm::StringRef getDescription()
const override {
return "Lower the degree of all polynomial equations to a specified maximum"; }
1059 static constexpr ::llvm::StringLiteral getPassName() {
1060 return ::llvm::StringLiteral(
"PolyLoweringPass");
1062 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
1065 static bool classof(const ::mlir::Pass *pass) {
1066 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1070 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1071 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1075 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1076 registry.insert<llzk::LLZKDialect>();
1077 registry.insert<llzk::boolean::BoolDialect>();
1078 registry.insert<llzk::array::ArrayDialect>();
1079 registry.insert<llzk::component::StructDialect>();
1080 registry.insert<llzk::constrain::ConstrainDialect>();
1081 registry.insert<llzk::felt::FeltDialect>();
1082 registry.insert<llzk::global::GlobalDialect>();
1083 registry.insert<llzk::include::IncludeDialect>();
1084 registry.insert<llzk::function::FunctionDialect>();
1085 registry.insert<llzk::string::StringDialect>();
1086 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1087 registry.insert<mlir::arith::ArithDialect>();
1088 registry.insert<mlir::scf::SCFDialect>();
1094 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
1097 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
1100template <
typename DerivedT>
1101class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1103 using Base = RedundantOperationEliminationPassBase;
1105 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1106 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1107 RedundantOperationEliminationPassBase& operator=(
const RedundantOperationEliminationPassBase &) =
delete;
1108 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) =
delete;
1109 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) =
delete;
1110 ~RedundantOperationEliminationPassBase() =
default;
1113 static constexpr ::llvm::StringLiteral getArgumentName() {
1114 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
1116 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
1118 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
1121 static constexpr ::llvm::StringLiteral getPassName() {
1122 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
1124 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
1127 static bool classof(const ::mlir::Pass *pass) {
1128 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1132 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1133 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1137 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1138 registry.insert<llzk::LLZKDialect>();
1139 registry.insert<llzk::boolean::BoolDialect>();
1140 registry.insert<llzk::array::ArrayDialect>();
1141 registry.insert<llzk::component::StructDialect>();
1142 registry.insert<llzk::constrain::ConstrainDialect>();
1143 registry.insert<llzk::felt::FeltDialect>();
1144 registry.insert<llzk::global::GlobalDialect>();
1145 registry.insert<llzk::include::IncludeDialect>();
1146 registry.insert<llzk::function::FunctionDialect>();
1147 registry.insert<llzk::string::StringDialect>();
1148 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1149 registry.insert<mlir::arith::ArithDialect>();
1150 registry.insert<mlir::scf::SCFDialect>();
1156 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
1161template <
typename DerivedT>
1162class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1164 using Base = RedundantReadAndWriteEliminationPassBase;
1166 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1167 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1168 RedundantReadAndWriteEliminationPassBase& operator=(
const RedundantReadAndWriteEliminationPassBase &) =
delete;
1169 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) =
delete;
1170 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) =
delete;
1171 ~RedundantReadAndWriteEliminationPassBase() =
default;
1174 static constexpr ::llvm::StringLiteral getArgumentName() {
1175 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
1177 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
1179 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
1182 static constexpr ::llvm::StringLiteral getPassName() {
1183 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
1185 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
1188 static bool classof(const ::mlir::Pass *pass) {
1189 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1193 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1194 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1198 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1199 registry.insert<llzk::LLZKDialect>();
1200 registry.insert<llzk::boolean::BoolDialect>();
1201 registry.insert<llzk::array::ArrayDialect>();
1202 registry.insert<llzk::component::StructDialect>();
1203 registry.insert<llzk::constrain::ConstrainDialect>();
1204 registry.insert<llzk::felt::FeltDialect>();
1205 registry.insert<llzk::global::GlobalDialect>();
1206 registry.insert<llzk::include::IncludeDialect>();
1207 registry.insert<llzk::function::FunctionDialect>();
1208 registry.insert<llzk::string::StringDialect>();
1209 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1210 registry.insert<mlir::arith::ArithDialect>();
1211 registry.insert<mlir::scf::SCFDialect>();
1217 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
1222template <
typename DerivedT>
1223class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1225 using Base = UnusedDeclarationEliminationPassBase;
1227 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1228 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1229 UnusedDeclarationEliminationPassBase& operator=(
const UnusedDeclarationEliminationPassBase &) =
delete;
1230 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) =
delete;
1231 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) =
delete;
1232 ~UnusedDeclarationEliminationPassBase() =
default;
1235 static constexpr ::llvm::StringLiteral getArgumentName() {
1236 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
1238 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
1240 ::llvm::StringRef getDescription()
const override {
return "Remove unused member and struct declarations"; }
1243 static constexpr ::llvm::StringLiteral getPassName() {
1244 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
1246 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
1249 static bool classof(const ::mlir::Pass *pass) {
1250 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1254 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1255 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1259 void getDependentDialects(::mlir::DialectRegistry ®istry)
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>();
1278 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
1281 ::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)};
1283#undef GEN_PASS_CLASSES
void registerTransformationPasses()
void registerUnusedDeclarationEliminationPassPass()
std::unique_ptr< mlir::Pass > createRedundantOperationEliminationPass()
void registerFuseProductLoopsPassPass()
void registerRedundantOperationEliminationPass()
void registerEnforceNoMemberOverwritePassPass()
std::unique_ptr< Pass > createComputeConstrainToProductPass()
void registerPolyLoweringPassPass()
void registerUnusedDeclarationEliminationPass()
void registerComputeConstrainToProductPassPass()
void registerRedundantOperationEliminationPassPass()
std::unique_ptr< mlir::Pass > createRedundantReadAndWriteEliminationPass()
void registerInlineStructsPassPass()
std::unique_ptr< mlir::Pass > createUnusedDeclarationEliminationPass()
void registerComputeConstrainToProductPass()
std::unique_ptr< mlir::Pass > createPolyLoweringPass()
void registerRedundantReadAndWriteEliminationPass()
void registerPolyLoweringPass()
void registerRedundantReadAndWriteEliminationPassPass()
std::unique_ptr< mlir::Pass > createInlineStructsPass()
void registerEnforceNoMemberOverwritePass()
std::unique_ptr< mlir::Pass > createNoOverwritesPass()
std::unique_ptr< mlir::Pass > createFuseProductLoopsPass()
void registerInlineStructsPass()
void registerFuseProductLoopsPass()