5#define GEN_PASS_DECL_INLINESTRUCTSPASS
6#define GEN_PASS_DECL_POLYLOWERINGPASS
7#define GEN_PASS_DECL_R1CSLOWERINGPASS
8#define GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
9#define GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
10#define GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
17#ifdef GEN_PASS_DECL_INLINESTRUCTSPASS
18struct InlineStructsPassOptions {
19 uint64_t maxComplexity = 0;
21#undef GEN_PASS_DECL_INLINESTRUCTSPASS
23#ifdef GEN_PASS_DEF_INLINESTRUCTSPASS
26template <
typename DerivedT>
27class InlineStructsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
29 using Base = InlineStructsPassBase;
31 InlineStructsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
32 InlineStructsPassBase(
const InlineStructsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
35 static constexpr ::llvm::StringLiteral getArgumentName() {
36 return ::llvm::StringLiteral(
"llzk-inline-structs");
38 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
40 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
43 static constexpr ::llvm::StringLiteral getPassName() {
44 return ::llvm::StringLiteral(
"InlineStructsPass");
46 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
49 static bool classof(const ::mlir::Pass *pass) {
50 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
54 std::unique_ptr<::mlir::Pass> clonePass()
const override {
55 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
59 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
60 registry.insert<llzk::LLZKDialect>();
61 registry.insert<llzk::boolean::BoolDialect>();
62 registry.insert<llzk::array::ArrayDialect>();
63 registry.insert<llzk::component::StructDialect>();
64 registry.insert<llzk::constrain::ConstrainDialect>();
65 registry.insert<llzk::felt::FeltDialect>();
66 registry.insert<llzk::global::GlobalDialect>();
67 registry.insert<llzk::include::IncludeDialect>();
68 registry.insert<llzk::function::FunctionDialect>();
69 registry.insert<llzk::string::StringDialect>();
70 registry.insert<llzk::polymorphic::PolymorphicDialect>();
71 registry.insert<llzk::undef::UndefDialect>();
72 registry.insert<mlir::arith::ArithDialect>();
73 registry.insert<mlir::scf::SCFDialect>();
79 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
81 InlineStructsPassBase(
const InlineStructsPassOptions &options) : InlineStructsPassBase() {
82 maxComplexity = options.maxComplexity;
85 ::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)};
89#undef GEN_PASS_DEF_INLINESTRUCTSPASS
95#ifdef GEN_PASS_DECL_POLYLOWERINGPASS
96struct PolyLoweringPassOptions {
97 unsigned maxDegree = 2;
99#undef GEN_PASS_DECL_POLYLOWERINGPASS
101#ifdef GEN_PASS_DEF_POLYLOWERINGPASS
104template <
typename DerivedT>
105class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
107 using Base = PolyLoweringPassBase;
109 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
110 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
113 static constexpr ::llvm::StringLiteral getArgumentName() {
114 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
116 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
118 ::llvm::StringRef getDescription()
const override {
return "Lowers the degree of all polynomial equations to a specified maximum"; }
121 static constexpr ::llvm::StringLiteral getPassName() {
122 return ::llvm::StringLiteral(
"PolyLoweringPass");
124 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
127 static bool classof(const ::mlir::Pass *pass) {
128 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
132 std::unique_ptr<::mlir::Pass> clonePass()
const override {
133 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
137 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
138 registry.insert<llzk::LLZKDialect>();
139 registry.insert<llzk::boolean::BoolDialect>();
140 registry.insert<llzk::array::ArrayDialect>();
141 registry.insert<llzk::component::StructDialect>();
142 registry.insert<llzk::constrain::ConstrainDialect>();
143 registry.insert<llzk::felt::FeltDialect>();
144 registry.insert<llzk::global::GlobalDialect>();
145 registry.insert<llzk::include::IncludeDialect>();
146 registry.insert<llzk::function::FunctionDialect>();
147 registry.insert<llzk::string::StringDialect>();
148 registry.insert<llzk::polymorphic::PolymorphicDialect>();
149 registry.insert<llzk::undef::UndefDialect>();
150 registry.insert<mlir::arith::ArithDialect>();
151 registry.insert<mlir::scf::SCFDialect>();
157 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
159 PolyLoweringPassBase(
const PolyLoweringPassOptions &options) : PolyLoweringPassBase() {
160 maxDegree = options.maxDegree;
163 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
167#undef GEN_PASS_DEF_POLYLOWERINGPASS
173#ifdef GEN_PASS_DECL_R1CSLOWERINGPASS
174#undef GEN_PASS_DECL_R1CSLOWERINGPASS
176#ifdef GEN_PASS_DEF_R1CSLOWERINGPASS
179template <
typename DerivedT>
180class R1CSLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
182 using Base = R1CSLoweringPassBase;
184 R1CSLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
185 R1CSLoweringPassBase(
const R1CSLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
188 static constexpr ::llvm::StringLiteral getArgumentName() {
189 return ::llvm::StringLiteral(
"llzk-r1cs-lowering");
191 ::llvm::StringRef getArgument()
const override {
return "llzk-r1cs-lowering"; }
193 ::llvm::StringRef getDescription()
const override {
return "Rewrites constraints to be compatible with R1CS constraints i.e a*b - c = 0"; }
196 static constexpr ::llvm::StringLiteral getPassName() {
197 return ::llvm::StringLiteral(
"R1CSLoweringPass");
199 ::llvm::StringRef getName()
const override {
return "R1CSLoweringPass"; }
202 static bool classof(const ::mlir::Pass *pass) {
203 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
207 std::unique_ptr<::mlir::Pass> clonePass()
const override {
208 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
212 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
213 registry.insert<llzk::LLZKDialect>();
214 registry.insert<llzk::boolean::BoolDialect>();
215 registry.insert<llzk::array::ArrayDialect>();
216 registry.insert<llzk::component::StructDialect>();
217 registry.insert<llzk::constrain::ConstrainDialect>();
218 registry.insert<llzk::felt::FeltDialect>();
219 registry.insert<llzk::global::GlobalDialect>();
220 registry.insert<llzk::include::IncludeDialect>();
221 registry.insert<llzk::function::FunctionDialect>();
222 registry.insert<llzk::string::StringDialect>();
223 registry.insert<llzk::polymorphic::PolymorphicDialect>();
224 registry.insert<llzk::undef::UndefDialect>();
225 registry.insert<mlir::arith::ArithDialect>();
226 registry.insert<mlir::scf::SCFDialect>();
232 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(R1CSLoweringPassBase<DerivedT>)
238#undef GEN_PASS_DEF_R1CSLOWERINGPASS
244#ifdef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
245#undef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
247#ifdef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
250template <
typename DerivedT>
251class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
253 using Base = RedundantOperationEliminationPassBase;
255 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
256 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
259 static constexpr ::llvm::StringLiteral getArgumentName() {
260 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
262 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
264 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
267 static constexpr ::llvm::StringLiteral getPassName() {
268 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
270 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
273 static bool classof(const ::mlir::Pass *pass) {
274 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
278 std::unique_ptr<::mlir::Pass> clonePass()
const override {
279 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
283 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
284 registry.insert<llzk::LLZKDialect>();
285 registry.insert<llzk::boolean::BoolDialect>();
286 registry.insert<llzk::array::ArrayDialect>();
287 registry.insert<llzk::component::StructDialect>();
288 registry.insert<llzk::constrain::ConstrainDialect>();
289 registry.insert<llzk::felt::FeltDialect>();
290 registry.insert<llzk::global::GlobalDialect>();
291 registry.insert<llzk::include::IncludeDialect>();
292 registry.insert<llzk::function::FunctionDialect>();
293 registry.insert<llzk::string::StringDialect>();
294 registry.insert<llzk::polymorphic::PolymorphicDialect>();
295 registry.insert<llzk::undef::UndefDialect>();
296 registry.insert<mlir::arith::ArithDialect>();
297 registry.insert<mlir::scf::SCFDialect>();
303 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
309#undef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
315#ifdef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
316#undef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
318#ifdef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
321template <
typename DerivedT>
322class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
324 using Base = RedundantReadAndWriteEliminationPassBase;
326 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
327 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
330 static constexpr ::llvm::StringLiteral getArgumentName() {
331 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
333 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
335 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
338 static constexpr ::llvm::StringLiteral getPassName() {
339 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
341 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
344 static bool classof(const ::mlir::Pass *pass) {
345 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
349 std::unique_ptr<::mlir::Pass> clonePass()
const override {
350 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
354 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
355 registry.insert<llzk::LLZKDialect>();
356 registry.insert<llzk::boolean::BoolDialect>();
357 registry.insert<llzk::array::ArrayDialect>();
358 registry.insert<llzk::component::StructDialect>();
359 registry.insert<llzk::constrain::ConstrainDialect>();
360 registry.insert<llzk::felt::FeltDialect>();
361 registry.insert<llzk::global::GlobalDialect>();
362 registry.insert<llzk::include::IncludeDialect>();
363 registry.insert<llzk::function::FunctionDialect>();
364 registry.insert<llzk::string::StringDialect>();
365 registry.insert<llzk::polymorphic::PolymorphicDialect>();
366 registry.insert<llzk::undef::UndefDialect>();
367 registry.insert<mlir::arith::ArithDialect>();
368 registry.insert<mlir::scf::SCFDialect>();
374 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
380#undef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
386#ifdef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
387struct UnusedDeclarationEliminationPassOptions {
388 bool removeStructs =
false;
390#undef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
392#ifdef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
395template <
typename DerivedT>
396class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
398 using Base = UnusedDeclarationEliminationPassBase;
400 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
401 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
404 static constexpr ::llvm::StringLiteral getArgumentName() {
405 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
407 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
409 ::llvm::StringRef getDescription()
const override {
return "Remove unused field and struct declarations"; }
412 static constexpr ::llvm::StringLiteral getPassName() {
413 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
415 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
418 static bool classof(const ::mlir::Pass *pass) {
419 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
423 std::unique_ptr<::mlir::Pass> clonePass()
const override {
424 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
428 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
429 registry.insert<llzk::LLZKDialect>();
430 registry.insert<llzk::boolean::BoolDialect>();
431 registry.insert<llzk::array::ArrayDialect>();
432 registry.insert<llzk::component::StructDialect>();
433 registry.insert<llzk::constrain::ConstrainDialect>();
434 registry.insert<llzk::felt::FeltDialect>();
435 registry.insert<llzk::global::GlobalDialect>();
436 registry.insert<llzk::include::IncludeDialect>();
437 registry.insert<llzk::function::FunctionDialect>();
438 registry.insert<llzk::string::StringDialect>();
439 registry.insert<llzk::polymorphic::PolymorphicDialect>();
440 registry.insert<llzk::undef::UndefDialect>();
441 registry.insert<mlir::arith::ArithDialect>();
442 registry.insert<mlir::scf::SCFDialect>();
448 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
450 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassOptions &options) : UnusedDeclarationEliminationPassBase() {
451 removeStructs = options.removeStructs;
454 ::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)};
458#undef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
460#ifdef GEN_PASS_REGISTRATION
467 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
474 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
484 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
491 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
501 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
508 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
518 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
525 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
535 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
542 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
552 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
559 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
576#undef GEN_PASS_REGISTRATION
579#ifdef GEN_PASS_CLASSES
581template <
typename DerivedT>
582class InlineStructsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
584 using Base = InlineStructsPassBase;
586 InlineStructsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
587 InlineStructsPassBase(
const InlineStructsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
590 static constexpr ::llvm::StringLiteral getArgumentName() {
591 return ::llvm::StringLiteral(
"llzk-inline-structs");
593 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
595 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
598 static constexpr ::llvm::StringLiteral getPassName() {
599 return ::llvm::StringLiteral(
"InlineStructsPass");
601 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
604 static bool classof(const ::mlir::Pass *pass) {
605 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
609 std::unique_ptr<::mlir::Pass> clonePass()
const override {
610 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
614 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
615 registry.insert<llzk::LLZKDialect>();
616 registry.insert<llzk::boolean::BoolDialect>();
617 registry.insert<llzk::array::ArrayDialect>();
618 registry.insert<llzk::component::StructDialect>();
619 registry.insert<llzk::constrain::ConstrainDialect>();
620 registry.insert<llzk::felt::FeltDialect>();
621 registry.insert<llzk::global::GlobalDialect>();
622 registry.insert<llzk::include::IncludeDialect>();
623 registry.insert<llzk::function::FunctionDialect>();
624 registry.insert<llzk::string::StringDialect>();
625 registry.insert<llzk::polymorphic::PolymorphicDialect>();
626 registry.insert<llzk::undef::UndefDialect>();
627 registry.insert<mlir::arith::ArithDialect>();
628 registry.insert<mlir::scf::SCFDialect>();
634 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
637 ::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)};
640template <
typename DerivedT>
641class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
643 using Base = PolyLoweringPassBase;
645 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
646 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
649 static constexpr ::llvm::StringLiteral getArgumentName() {
650 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
652 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
654 ::llvm::StringRef getDescription()
const override {
return "Lowers the degree of all polynomial equations to a specified maximum"; }
657 static constexpr ::llvm::StringLiteral getPassName() {
658 return ::llvm::StringLiteral(
"PolyLoweringPass");
660 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
663 static bool classof(const ::mlir::Pass *pass) {
664 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
668 std::unique_ptr<::mlir::Pass> clonePass()
const override {
669 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
673 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
674 registry.insert<llzk::LLZKDialect>();
675 registry.insert<llzk::boolean::BoolDialect>();
676 registry.insert<llzk::array::ArrayDialect>();
677 registry.insert<llzk::component::StructDialect>();
678 registry.insert<llzk::constrain::ConstrainDialect>();
679 registry.insert<llzk::felt::FeltDialect>();
680 registry.insert<llzk::global::GlobalDialect>();
681 registry.insert<llzk::include::IncludeDialect>();
682 registry.insert<llzk::function::FunctionDialect>();
683 registry.insert<llzk::string::StringDialect>();
684 registry.insert<llzk::polymorphic::PolymorphicDialect>();
685 registry.insert<llzk::undef::UndefDialect>();
686 registry.insert<mlir::arith::ArithDialect>();
687 registry.insert<mlir::scf::SCFDialect>();
693 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
696 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
699template <
typename DerivedT>
700class R1CSLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
702 using Base = R1CSLoweringPassBase;
704 R1CSLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
705 R1CSLoweringPassBase(
const R1CSLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
708 static constexpr ::llvm::StringLiteral getArgumentName() {
709 return ::llvm::StringLiteral(
"llzk-r1cs-lowering");
711 ::llvm::StringRef getArgument()
const override {
return "llzk-r1cs-lowering"; }
713 ::llvm::StringRef getDescription()
const override {
return "Rewrites constraints to be compatible with R1CS constraints i.e a*b - c = 0"; }
716 static constexpr ::llvm::StringLiteral getPassName() {
717 return ::llvm::StringLiteral(
"R1CSLoweringPass");
719 ::llvm::StringRef getName()
const override {
return "R1CSLoweringPass"; }
722 static bool classof(const ::mlir::Pass *pass) {
723 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
727 std::unique_ptr<::mlir::Pass> clonePass()
const override {
728 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
732 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
733 registry.insert<llzk::LLZKDialect>();
734 registry.insert<llzk::boolean::BoolDialect>();
735 registry.insert<llzk::array::ArrayDialect>();
736 registry.insert<llzk::component::StructDialect>();
737 registry.insert<llzk::constrain::ConstrainDialect>();
738 registry.insert<llzk::felt::FeltDialect>();
739 registry.insert<llzk::global::GlobalDialect>();
740 registry.insert<llzk::include::IncludeDialect>();
741 registry.insert<llzk::function::FunctionDialect>();
742 registry.insert<llzk::string::StringDialect>();
743 registry.insert<llzk::polymorphic::PolymorphicDialect>();
744 registry.insert<llzk::undef::UndefDialect>();
745 registry.insert<mlir::arith::ArithDialect>();
746 registry.insert<mlir::scf::SCFDialect>();
752 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(R1CSLoweringPassBase<DerivedT>)
757template <
typename DerivedT>
758class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
760 using Base = RedundantOperationEliminationPassBase;
762 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
763 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
766 static constexpr ::llvm::StringLiteral getArgumentName() {
767 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
769 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
771 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
774 static constexpr ::llvm::StringLiteral getPassName() {
775 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
777 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
780 static bool classof(const ::mlir::Pass *pass) {
781 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
785 std::unique_ptr<::mlir::Pass> clonePass()
const override {
786 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
790 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
791 registry.insert<llzk::LLZKDialect>();
792 registry.insert<llzk::boolean::BoolDialect>();
793 registry.insert<llzk::array::ArrayDialect>();
794 registry.insert<llzk::component::StructDialect>();
795 registry.insert<llzk::constrain::ConstrainDialect>();
796 registry.insert<llzk::felt::FeltDialect>();
797 registry.insert<llzk::global::GlobalDialect>();
798 registry.insert<llzk::include::IncludeDialect>();
799 registry.insert<llzk::function::FunctionDialect>();
800 registry.insert<llzk::string::StringDialect>();
801 registry.insert<llzk::polymorphic::PolymorphicDialect>();
802 registry.insert<llzk::undef::UndefDialect>();
803 registry.insert<mlir::arith::ArithDialect>();
804 registry.insert<mlir::scf::SCFDialect>();
810 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
815template <
typename DerivedT>
816class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
818 using Base = RedundantReadAndWriteEliminationPassBase;
820 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
821 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
824 static constexpr ::llvm::StringLiteral getArgumentName() {
825 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
827 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
829 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
832 static constexpr ::llvm::StringLiteral getPassName() {
833 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
835 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
838 static bool classof(const ::mlir::Pass *pass) {
839 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
843 std::unique_ptr<::mlir::Pass> clonePass()
const override {
844 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
848 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
849 registry.insert<llzk::LLZKDialect>();
850 registry.insert<llzk::boolean::BoolDialect>();
851 registry.insert<llzk::array::ArrayDialect>();
852 registry.insert<llzk::component::StructDialect>();
853 registry.insert<llzk::constrain::ConstrainDialect>();
854 registry.insert<llzk::felt::FeltDialect>();
855 registry.insert<llzk::global::GlobalDialect>();
856 registry.insert<llzk::include::IncludeDialect>();
857 registry.insert<llzk::function::FunctionDialect>();
858 registry.insert<llzk::string::StringDialect>();
859 registry.insert<llzk::polymorphic::PolymorphicDialect>();
860 registry.insert<llzk::undef::UndefDialect>();
861 registry.insert<mlir::arith::ArithDialect>();
862 registry.insert<mlir::scf::SCFDialect>();
868 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
873template <
typename DerivedT>
874class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
876 using Base = UnusedDeclarationEliminationPassBase;
878 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
879 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
882 static constexpr ::llvm::StringLiteral getArgumentName() {
883 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
885 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
887 ::llvm::StringRef getDescription()
const override {
return "Remove unused field and struct declarations"; }
890 static constexpr ::llvm::StringLiteral getPassName() {
891 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
893 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
896 static bool classof(const ::mlir::Pass *pass) {
897 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
901 std::unique_ptr<::mlir::Pass> clonePass()
const override {
902 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
906 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
907 registry.insert<llzk::LLZKDialect>();
908 registry.insert<llzk::boolean::BoolDialect>();
909 registry.insert<llzk::array::ArrayDialect>();
910 registry.insert<llzk::component::StructDialect>();
911 registry.insert<llzk::constrain::ConstrainDialect>();
912 registry.insert<llzk::felt::FeltDialect>();
913 registry.insert<llzk::global::GlobalDialect>();
914 registry.insert<llzk::include::IncludeDialect>();
915 registry.insert<llzk::function::FunctionDialect>();
916 registry.insert<llzk::string::StringDialect>();
917 registry.insert<llzk::polymorphic::PolymorphicDialect>();
918 registry.insert<llzk::undef::UndefDialect>();
919 registry.insert<mlir::arith::ArithDialect>();
920 registry.insert<mlir::scf::SCFDialect>();
926 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
929 ::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)};
931#undef GEN_PASS_CLASSES
void registerTransformationPasses()
void registerUnusedDeclarationEliminationPassPass()
std::unique_ptr< mlir::Pass > createRedundantOperationEliminationPass()
void registerR1CSLoweringPass()
void registerRedundantOperationEliminationPass()
void registerPolyLoweringPassPass()
void registerUnusedDeclarationEliminationPass()
void registerRedundantOperationEliminationPassPass()
std::unique_ptr< mlir::Pass > createRedundantReadAndWriteEliminationPass()
void registerR1CSLoweringPassPass()
void registerInlineStructsPassPass()
std::unique_ptr< mlir::Pass > createUnusedDeclarationEliminationPass()
std::unique_ptr< mlir::Pass > createPolyLoweringPass()
void registerRedundantReadAndWriteEliminationPass()
void registerPolyLoweringPass()
void registerRedundantReadAndWriteEliminationPassPass()
std::unique_ptr< mlir::Pass > createInlineStructsPass()
std::unique_ptr< mlir::Pass > createR1CSLoweringPass()
void registerInlineStructsPass()