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) {}
33 InlineStructsPassBase& operator=(
const InlineStructsPassBase &) =
delete;
34 InlineStructsPassBase(InlineStructsPassBase &&) =
delete;
35 InlineStructsPassBase& operator=(InlineStructsPassBase &&) =
delete;
36 ~InlineStructsPassBase() =
default;
39 static constexpr ::llvm::StringLiteral getArgumentName() {
40 return ::llvm::StringLiteral(
"llzk-inline-structs");
42 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
44 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
47 static constexpr ::llvm::StringLiteral getPassName() {
48 return ::llvm::StringLiteral(
"InlineStructsPass");
50 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
53 static bool classof(const ::mlir::Pass *pass) {
54 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
58 std::unique_ptr<::mlir::Pass> clonePass()
const override {
59 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
63 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
64 registry.insert<llzk::LLZKDialect>();
65 registry.insert<llzk::boolean::BoolDialect>();
66 registry.insert<llzk::array::ArrayDialect>();
67 registry.insert<llzk::component::StructDialect>();
68 registry.insert<llzk::constrain::ConstrainDialect>();
69 registry.insert<llzk::felt::FeltDialect>();
70 registry.insert<llzk::global::GlobalDialect>();
71 registry.insert<llzk::include::IncludeDialect>();
72 registry.insert<llzk::function::FunctionDialect>();
73 registry.insert<llzk::string::StringDialect>();
74 registry.insert<llzk::polymorphic::PolymorphicDialect>();
75 registry.insert<llzk::undef::UndefDialect>();
76 registry.insert<mlir::arith::ArithDialect>();
77 registry.insert<mlir::scf::SCFDialect>();
83 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
85 InlineStructsPassBase(InlineStructsPassOptions options) : InlineStructsPassBase() {
86 maxComplexity = std::move(options.maxComplexity);
89 ::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)};
93#undef GEN_PASS_DEF_INLINESTRUCTSPASS
99#ifdef GEN_PASS_DECL_POLYLOWERINGPASS
100struct PolyLoweringPassOptions {
101 unsigned maxDegree = 2;
103#undef GEN_PASS_DECL_POLYLOWERINGPASS
105#ifdef GEN_PASS_DEF_POLYLOWERINGPASS
108template <
typename DerivedT>
109class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
111 using Base = PolyLoweringPassBase;
113 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
114 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
115 PolyLoweringPassBase& operator=(
const PolyLoweringPassBase &) =
delete;
116 PolyLoweringPassBase(PolyLoweringPassBase &&) =
delete;
117 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) =
delete;
118 ~PolyLoweringPassBase() =
default;
121 static constexpr ::llvm::StringLiteral getArgumentName() {
122 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
124 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
126 ::llvm::StringRef getDescription()
const override {
return "Lowers the degree of all polynomial equations to a specified maximum"; }
129 static constexpr ::llvm::StringLiteral getPassName() {
130 return ::llvm::StringLiteral(
"PolyLoweringPass");
132 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
135 static bool classof(const ::mlir::Pass *pass) {
136 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
140 std::unique_ptr<::mlir::Pass> clonePass()
const override {
141 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
145 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
146 registry.insert<llzk::LLZKDialect>();
147 registry.insert<llzk::boolean::BoolDialect>();
148 registry.insert<llzk::array::ArrayDialect>();
149 registry.insert<llzk::component::StructDialect>();
150 registry.insert<llzk::constrain::ConstrainDialect>();
151 registry.insert<llzk::felt::FeltDialect>();
152 registry.insert<llzk::global::GlobalDialect>();
153 registry.insert<llzk::include::IncludeDialect>();
154 registry.insert<llzk::function::FunctionDialect>();
155 registry.insert<llzk::string::StringDialect>();
156 registry.insert<llzk::polymorphic::PolymorphicDialect>();
157 registry.insert<llzk::undef::UndefDialect>();
158 registry.insert<mlir::arith::ArithDialect>();
159 registry.insert<mlir::scf::SCFDialect>();
165 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
167 PolyLoweringPassBase(PolyLoweringPassOptions options) : PolyLoweringPassBase() {
168 maxDegree = std::move(options.maxDegree);
171 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
175#undef GEN_PASS_DEF_POLYLOWERINGPASS
181#ifdef GEN_PASS_DECL_R1CSLOWERINGPASS
182#undef GEN_PASS_DECL_R1CSLOWERINGPASS
184#ifdef GEN_PASS_DEF_R1CSLOWERINGPASS
187template <
typename DerivedT>
188class R1CSLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
190 using Base = R1CSLoweringPassBase;
192 R1CSLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
193 R1CSLoweringPassBase(
const R1CSLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
194 R1CSLoweringPassBase& operator=(
const R1CSLoweringPassBase &) =
delete;
195 R1CSLoweringPassBase(R1CSLoweringPassBase &&) =
delete;
196 R1CSLoweringPassBase& operator=(R1CSLoweringPassBase &&) =
delete;
197 ~R1CSLoweringPassBase() =
default;
200 static constexpr ::llvm::StringLiteral getArgumentName() {
201 return ::llvm::StringLiteral(
"llzk-r1cs-lowering");
203 ::llvm::StringRef getArgument()
const override {
return "llzk-r1cs-lowering"; }
205 ::llvm::StringRef getDescription()
const override {
return "Rewrites constraints to be compatible with R1CS constraints i.e a*b - c = 0"; }
208 static constexpr ::llvm::StringLiteral getPassName() {
209 return ::llvm::StringLiteral(
"R1CSLoweringPass");
211 ::llvm::StringRef getName()
const override {
return "R1CSLoweringPass"; }
214 static bool classof(const ::mlir::Pass *pass) {
215 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
219 std::unique_ptr<::mlir::Pass> clonePass()
const override {
220 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
224 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
225 registry.insert<llzk::LLZKDialect>();
226 registry.insert<llzk::boolean::BoolDialect>();
227 registry.insert<llzk::array::ArrayDialect>();
228 registry.insert<llzk::component::StructDialect>();
229 registry.insert<llzk::constrain::ConstrainDialect>();
230 registry.insert<llzk::felt::FeltDialect>();
231 registry.insert<llzk::global::GlobalDialect>();
232 registry.insert<llzk::include::IncludeDialect>();
233 registry.insert<llzk::function::FunctionDialect>();
234 registry.insert<llzk::string::StringDialect>();
235 registry.insert<llzk::polymorphic::PolymorphicDialect>();
236 registry.insert<llzk::undef::UndefDialect>();
237 registry.insert<mlir::arith::ArithDialect>();
238 registry.insert<mlir::scf::SCFDialect>();
244 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(R1CSLoweringPassBase<DerivedT>)
250#undef GEN_PASS_DEF_R1CSLOWERINGPASS
256#ifdef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
257#undef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
259#ifdef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
262template <
typename DerivedT>
263class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
265 using Base = RedundantOperationEliminationPassBase;
267 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
268 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
269 RedundantOperationEliminationPassBase& operator=(
const RedundantOperationEliminationPassBase &) =
delete;
270 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) =
delete;
271 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) =
delete;
272 ~RedundantOperationEliminationPassBase() =
default;
275 static constexpr ::llvm::StringLiteral getArgumentName() {
276 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
278 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
280 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
283 static constexpr ::llvm::StringLiteral getPassName() {
284 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
286 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
289 static bool classof(const ::mlir::Pass *pass) {
290 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
294 std::unique_ptr<::mlir::Pass> clonePass()
const override {
295 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
299 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
300 registry.insert<llzk::LLZKDialect>();
301 registry.insert<llzk::boolean::BoolDialect>();
302 registry.insert<llzk::array::ArrayDialect>();
303 registry.insert<llzk::component::StructDialect>();
304 registry.insert<llzk::constrain::ConstrainDialect>();
305 registry.insert<llzk::felt::FeltDialect>();
306 registry.insert<llzk::global::GlobalDialect>();
307 registry.insert<llzk::include::IncludeDialect>();
308 registry.insert<llzk::function::FunctionDialect>();
309 registry.insert<llzk::string::StringDialect>();
310 registry.insert<llzk::polymorphic::PolymorphicDialect>();
311 registry.insert<llzk::undef::UndefDialect>();
312 registry.insert<mlir::arith::ArithDialect>();
313 registry.insert<mlir::scf::SCFDialect>();
319 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
325#undef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
331#ifdef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
332#undef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
334#ifdef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
337template <
typename DerivedT>
338class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
340 using Base = RedundantReadAndWriteEliminationPassBase;
342 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
343 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
344 RedundantReadAndWriteEliminationPassBase& operator=(
const RedundantReadAndWriteEliminationPassBase &) =
delete;
345 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) =
delete;
346 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) =
delete;
347 ~RedundantReadAndWriteEliminationPassBase() =
default;
350 static constexpr ::llvm::StringLiteral getArgumentName() {
351 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
353 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
355 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
358 static constexpr ::llvm::StringLiteral getPassName() {
359 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
361 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
364 static bool classof(const ::mlir::Pass *pass) {
365 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
369 std::unique_ptr<::mlir::Pass> clonePass()
const override {
370 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
374 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
375 registry.insert<llzk::LLZKDialect>();
376 registry.insert<llzk::boolean::BoolDialect>();
377 registry.insert<llzk::array::ArrayDialect>();
378 registry.insert<llzk::component::StructDialect>();
379 registry.insert<llzk::constrain::ConstrainDialect>();
380 registry.insert<llzk::felt::FeltDialect>();
381 registry.insert<llzk::global::GlobalDialect>();
382 registry.insert<llzk::include::IncludeDialect>();
383 registry.insert<llzk::function::FunctionDialect>();
384 registry.insert<llzk::string::StringDialect>();
385 registry.insert<llzk::polymorphic::PolymorphicDialect>();
386 registry.insert<llzk::undef::UndefDialect>();
387 registry.insert<mlir::arith::ArithDialect>();
388 registry.insert<mlir::scf::SCFDialect>();
394 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
400#undef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
406#ifdef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
407struct UnusedDeclarationEliminationPassOptions {
408 bool removeStructs =
false;
410#undef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
412#ifdef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
415template <
typename DerivedT>
416class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
418 using Base = UnusedDeclarationEliminationPassBase;
420 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
421 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
422 UnusedDeclarationEliminationPassBase& operator=(
const UnusedDeclarationEliminationPassBase &) =
delete;
423 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) =
delete;
424 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) =
delete;
425 ~UnusedDeclarationEliminationPassBase() =
default;
428 static constexpr ::llvm::StringLiteral getArgumentName() {
429 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
431 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
433 ::llvm::StringRef getDescription()
const override {
return "Remove unused field and struct declarations"; }
436 static constexpr ::llvm::StringLiteral getPassName() {
437 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
439 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
442 static bool classof(const ::mlir::Pass *pass) {
443 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
447 std::unique_ptr<::mlir::Pass> clonePass()
const override {
448 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
452 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
453 registry.insert<llzk::LLZKDialect>();
454 registry.insert<llzk::boolean::BoolDialect>();
455 registry.insert<llzk::array::ArrayDialect>();
456 registry.insert<llzk::component::StructDialect>();
457 registry.insert<llzk::constrain::ConstrainDialect>();
458 registry.insert<llzk::felt::FeltDialect>();
459 registry.insert<llzk::global::GlobalDialect>();
460 registry.insert<llzk::include::IncludeDialect>();
461 registry.insert<llzk::function::FunctionDialect>();
462 registry.insert<llzk::string::StringDialect>();
463 registry.insert<llzk::polymorphic::PolymorphicDialect>();
464 registry.insert<llzk::undef::UndefDialect>();
465 registry.insert<mlir::arith::ArithDialect>();
466 registry.insert<mlir::scf::SCFDialect>();
472 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
474 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassOptions options) : UnusedDeclarationEliminationPassBase() {
475 removeStructs = std::move(options.removeStructs);
478 ::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)};
482#undef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
484#ifdef GEN_PASS_REGISTRATION
491 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
498 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
508 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
515 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
525 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
532 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
542 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
549 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
559 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
566 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
576 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
583 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
600#undef GEN_PASS_REGISTRATION
603#ifdef GEN_PASS_CLASSES
605template <
typename DerivedT>
606class InlineStructsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
608 using Base = InlineStructsPassBase;
610 InlineStructsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
611 InlineStructsPassBase(
const InlineStructsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
612 InlineStructsPassBase& operator=(
const InlineStructsPassBase &) =
delete;
613 InlineStructsPassBase(InlineStructsPassBase &&) =
delete;
614 InlineStructsPassBase& operator=(InlineStructsPassBase &&) =
delete;
615 ~InlineStructsPassBase() =
default;
618 static constexpr ::llvm::StringLiteral getArgumentName() {
619 return ::llvm::StringLiteral(
"llzk-inline-structs");
621 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
623 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
626 static constexpr ::llvm::StringLiteral getPassName() {
627 return ::llvm::StringLiteral(
"InlineStructsPass");
629 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
632 static bool classof(const ::mlir::Pass *pass) {
633 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
637 std::unique_ptr<::mlir::Pass> clonePass()
const override {
638 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
642 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
643 registry.insert<llzk::LLZKDialect>();
644 registry.insert<llzk::boolean::BoolDialect>();
645 registry.insert<llzk::array::ArrayDialect>();
646 registry.insert<llzk::component::StructDialect>();
647 registry.insert<llzk::constrain::ConstrainDialect>();
648 registry.insert<llzk::felt::FeltDialect>();
649 registry.insert<llzk::global::GlobalDialect>();
650 registry.insert<llzk::include::IncludeDialect>();
651 registry.insert<llzk::function::FunctionDialect>();
652 registry.insert<llzk::string::StringDialect>();
653 registry.insert<llzk::polymorphic::PolymorphicDialect>();
654 registry.insert<llzk::undef::UndefDialect>();
655 registry.insert<mlir::arith::ArithDialect>();
656 registry.insert<mlir::scf::SCFDialect>();
662 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
665 ::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)};
668template <
typename DerivedT>
669class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
671 using Base = PolyLoweringPassBase;
673 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
674 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
675 PolyLoweringPassBase& operator=(
const PolyLoweringPassBase &) =
delete;
676 PolyLoweringPassBase(PolyLoweringPassBase &&) =
delete;
677 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) =
delete;
678 ~PolyLoweringPassBase() =
default;
681 static constexpr ::llvm::StringLiteral getArgumentName() {
682 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
684 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
686 ::llvm::StringRef getDescription()
const override {
return "Lowers the degree of all polynomial equations to a specified maximum"; }
689 static constexpr ::llvm::StringLiteral getPassName() {
690 return ::llvm::StringLiteral(
"PolyLoweringPass");
692 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
695 static bool classof(const ::mlir::Pass *pass) {
696 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
700 std::unique_ptr<::mlir::Pass> clonePass()
const override {
701 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
705 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
706 registry.insert<llzk::LLZKDialect>();
707 registry.insert<llzk::boolean::BoolDialect>();
708 registry.insert<llzk::array::ArrayDialect>();
709 registry.insert<llzk::component::StructDialect>();
710 registry.insert<llzk::constrain::ConstrainDialect>();
711 registry.insert<llzk::felt::FeltDialect>();
712 registry.insert<llzk::global::GlobalDialect>();
713 registry.insert<llzk::include::IncludeDialect>();
714 registry.insert<llzk::function::FunctionDialect>();
715 registry.insert<llzk::string::StringDialect>();
716 registry.insert<llzk::polymorphic::PolymorphicDialect>();
717 registry.insert<llzk::undef::UndefDialect>();
718 registry.insert<mlir::arith::ArithDialect>();
719 registry.insert<mlir::scf::SCFDialect>();
725 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
728 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
731template <
typename DerivedT>
732class R1CSLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
734 using Base = R1CSLoweringPassBase;
736 R1CSLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
737 R1CSLoweringPassBase(
const R1CSLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
738 R1CSLoweringPassBase& operator=(
const R1CSLoweringPassBase &) =
delete;
739 R1CSLoweringPassBase(R1CSLoweringPassBase &&) =
delete;
740 R1CSLoweringPassBase& operator=(R1CSLoweringPassBase &&) =
delete;
741 ~R1CSLoweringPassBase() =
default;
744 static constexpr ::llvm::StringLiteral getArgumentName() {
745 return ::llvm::StringLiteral(
"llzk-r1cs-lowering");
747 ::llvm::StringRef getArgument()
const override {
return "llzk-r1cs-lowering"; }
749 ::llvm::StringRef getDescription()
const override {
return "Rewrites constraints to be compatible with R1CS constraints i.e a*b - c = 0"; }
752 static constexpr ::llvm::StringLiteral getPassName() {
753 return ::llvm::StringLiteral(
"R1CSLoweringPass");
755 ::llvm::StringRef getName()
const override {
return "R1CSLoweringPass"; }
758 static bool classof(const ::mlir::Pass *pass) {
759 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
763 std::unique_ptr<::mlir::Pass> clonePass()
const override {
764 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
768 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
769 registry.insert<llzk::LLZKDialect>();
770 registry.insert<llzk::boolean::BoolDialect>();
771 registry.insert<llzk::array::ArrayDialect>();
772 registry.insert<llzk::component::StructDialect>();
773 registry.insert<llzk::constrain::ConstrainDialect>();
774 registry.insert<llzk::felt::FeltDialect>();
775 registry.insert<llzk::global::GlobalDialect>();
776 registry.insert<llzk::include::IncludeDialect>();
777 registry.insert<llzk::function::FunctionDialect>();
778 registry.insert<llzk::string::StringDialect>();
779 registry.insert<llzk::polymorphic::PolymorphicDialect>();
780 registry.insert<llzk::undef::UndefDialect>();
781 registry.insert<mlir::arith::ArithDialect>();
782 registry.insert<mlir::scf::SCFDialect>();
788 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(R1CSLoweringPassBase<DerivedT>)
793template <
typename DerivedT>
794class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
796 using Base = RedundantOperationEliminationPassBase;
798 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
799 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
800 RedundantOperationEliminationPassBase& operator=(
const RedundantOperationEliminationPassBase &) =
delete;
801 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) =
delete;
802 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) =
delete;
803 ~RedundantOperationEliminationPassBase() =
default;
806 static constexpr ::llvm::StringLiteral getArgumentName() {
807 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
809 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
811 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
814 static constexpr ::llvm::StringLiteral getPassName() {
815 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
817 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
820 static bool classof(const ::mlir::Pass *pass) {
821 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
825 std::unique_ptr<::mlir::Pass> clonePass()
const override {
826 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
830 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
831 registry.insert<llzk::LLZKDialect>();
832 registry.insert<llzk::boolean::BoolDialect>();
833 registry.insert<llzk::array::ArrayDialect>();
834 registry.insert<llzk::component::StructDialect>();
835 registry.insert<llzk::constrain::ConstrainDialect>();
836 registry.insert<llzk::felt::FeltDialect>();
837 registry.insert<llzk::global::GlobalDialect>();
838 registry.insert<llzk::include::IncludeDialect>();
839 registry.insert<llzk::function::FunctionDialect>();
840 registry.insert<llzk::string::StringDialect>();
841 registry.insert<llzk::polymorphic::PolymorphicDialect>();
842 registry.insert<llzk::undef::UndefDialect>();
843 registry.insert<mlir::arith::ArithDialect>();
844 registry.insert<mlir::scf::SCFDialect>();
850 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
855template <
typename DerivedT>
856class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
858 using Base = RedundantReadAndWriteEliminationPassBase;
860 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
861 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
862 RedundantReadAndWriteEliminationPassBase& operator=(
const RedundantReadAndWriteEliminationPassBase &) =
delete;
863 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) =
delete;
864 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) =
delete;
865 ~RedundantReadAndWriteEliminationPassBase() =
default;
868 static constexpr ::llvm::StringLiteral getArgumentName() {
869 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
871 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
873 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
876 static constexpr ::llvm::StringLiteral getPassName() {
877 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
879 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
882 static bool classof(const ::mlir::Pass *pass) {
883 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
887 std::unique_ptr<::mlir::Pass> clonePass()
const override {
888 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
892 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
893 registry.insert<llzk::LLZKDialect>();
894 registry.insert<llzk::boolean::BoolDialect>();
895 registry.insert<llzk::array::ArrayDialect>();
896 registry.insert<llzk::component::StructDialect>();
897 registry.insert<llzk::constrain::ConstrainDialect>();
898 registry.insert<llzk::felt::FeltDialect>();
899 registry.insert<llzk::global::GlobalDialect>();
900 registry.insert<llzk::include::IncludeDialect>();
901 registry.insert<llzk::function::FunctionDialect>();
902 registry.insert<llzk::string::StringDialect>();
903 registry.insert<llzk::polymorphic::PolymorphicDialect>();
904 registry.insert<llzk::undef::UndefDialect>();
905 registry.insert<mlir::arith::ArithDialect>();
906 registry.insert<mlir::scf::SCFDialect>();
912 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
917template <
typename DerivedT>
918class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
920 using Base = UnusedDeclarationEliminationPassBase;
922 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
923 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
924 UnusedDeclarationEliminationPassBase& operator=(
const UnusedDeclarationEliminationPassBase &) =
delete;
925 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) =
delete;
926 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) =
delete;
927 ~UnusedDeclarationEliminationPassBase() =
default;
930 static constexpr ::llvm::StringLiteral getArgumentName() {
931 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
933 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
935 ::llvm::StringRef getDescription()
const override {
return "Remove unused field and struct declarations"; }
938 static constexpr ::llvm::StringLiteral getPassName() {
939 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
941 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
944 static bool classof(const ::mlir::Pass *pass) {
945 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
949 std::unique_ptr<::mlir::Pass> clonePass()
const override {
950 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
954 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
955 registry.insert<llzk::LLZKDialect>();
956 registry.insert<llzk::boolean::BoolDialect>();
957 registry.insert<llzk::array::ArrayDialect>();
958 registry.insert<llzk::component::StructDialect>();
959 registry.insert<llzk::constrain::ConstrainDialect>();
960 registry.insert<llzk::felt::FeltDialect>();
961 registry.insert<llzk::global::GlobalDialect>();
962 registry.insert<llzk::include::IncludeDialect>();
963 registry.insert<llzk::function::FunctionDialect>();
964 registry.insert<llzk::string::StringDialect>();
965 registry.insert<llzk::polymorphic::PolymorphicDialect>();
966 registry.insert<llzk::undef::UndefDialect>();
967 registry.insert<mlir::arith::ArithDialect>();
968 registry.insert<mlir::scf::SCFDialect>();
974 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
977 ::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)};
979#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()