5#define GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
6#define GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
7#define GEN_PASS_DECL_INLINESTRUCTSPASS
8#define GEN_PASS_DECL_PCLLOWERINGPASS
9#define GEN_PASS_DECL_POLYLOWERINGPASS
10#define GEN_PASS_DECL_R1CSLOWERINGPASS
11#define GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
12#define GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
13#define GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
20#ifdef GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
21struct ComputeConstrainToProductPassOptions {
22 std::string rootStruct =
"@Main";
24#undef GEN_PASS_DECL_COMPUTECONSTRAINTOPRODUCTPASS
26#ifdef GEN_PASS_DEF_COMPUTECONSTRAINTOPRODUCTPASS
29template <
typename DerivedT>
30class ComputeConstrainToProductPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
32 using Base = ComputeConstrainToProductPassBase;
34 ComputeConstrainToProductPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
35 ComputeConstrainToProductPassBase(
const ComputeConstrainToProductPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
36 ComputeConstrainToProductPassBase& operator=(
const ComputeConstrainToProductPassBase &) =
delete;
37 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassBase &&) =
delete;
38 ComputeConstrainToProductPassBase& operator=(ComputeConstrainToProductPassBase &&) =
delete;
39 ~ComputeConstrainToProductPassBase() =
default;
42 static constexpr ::llvm::StringLiteral getArgumentName() {
43 return ::llvm::StringLiteral(
"llzk-compute-constrain-to-product");
45 ::llvm::StringRef getArgument()
const override {
return "llzk-compute-constrain-to-product"; }
47 ::llvm::StringRef getDescription()
const override {
return "Replaces separate @compute and @constrain functions in a struct with a single @product function"; }
50 static constexpr ::llvm::StringLiteral getPassName() {
51 return ::llvm::StringLiteral(
"ComputeConstrainToProductPass");
53 ::llvm::StringRef getName()
const override {
return "ComputeConstrainToProductPass"; }
56 static bool classof(const ::mlir::Pass *pass) {
57 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
61 std::unique_ptr<::mlir::Pass> clonePass()
const override {
62 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
66 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
67 registry.insert<llzk::LLZKDialect>();
68 registry.insert<llzk::boolean::BoolDialect>();
69 registry.insert<llzk::array::ArrayDialect>();
70 registry.insert<llzk::component::StructDialect>();
71 registry.insert<llzk::constrain::ConstrainDialect>();
72 registry.insert<llzk::felt::FeltDialect>();
73 registry.insert<llzk::global::GlobalDialect>();
74 registry.insert<llzk::include::IncludeDialect>();
75 registry.insert<llzk::function::FunctionDialect>();
76 registry.insert<llzk::string::StringDialect>();
77 registry.insert<llzk::polymorphic::PolymorphicDialect>();
78 registry.insert<mlir::arith::ArithDialect>();
79 registry.insert<mlir::scf::SCFDialect>();
85 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ComputeConstrainToProductPassBase<DerivedT>)
87 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassOptions options) : ComputeConstrainToProductPassBase() {
88 rootStruct = std::move(options.rootStruct);
91 ::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")};
95#undef GEN_PASS_DEF_COMPUTECONSTRAINTOPRODUCTPASS
101#ifdef GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
102#undef GEN_PASS_DECL_FUSEPRODUCTLOOPSPASS
104#ifdef GEN_PASS_DEF_FUSEPRODUCTLOOPSPASS
107template <
typename DerivedT>
108class FuseProductLoopsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
110 using Base = FuseProductLoopsPassBase;
112 FuseProductLoopsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
113 FuseProductLoopsPassBase(
const FuseProductLoopsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
114 FuseProductLoopsPassBase& operator=(
const FuseProductLoopsPassBase &) =
delete;
115 FuseProductLoopsPassBase(FuseProductLoopsPassBase &&) =
delete;
116 FuseProductLoopsPassBase& operator=(FuseProductLoopsPassBase &&) =
delete;
117 ~FuseProductLoopsPassBase() =
default;
120 static constexpr ::llvm::StringLiteral getArgumentName() {
121 return ::llvm::StringLiteral(
"llzk-fuse-product-loops");
123 ::llvm::StringRef getArgument()
const override {
return "llzk-fuse-product-loops"; }
125 ::llvm::StringRef getDescription()
const override {
return "Fuses matching witness/constraint loops in a @product function"; }
128 static constexpr ::llvm::StringLiteral getPassName() {
129 return ::llvm::StringLiteral(
"FuseProductLoopsPass");
131 ::llvm::StringRef getName()
const override {
return "FuseProductLoopsPass"; }
134 static bool classof(const ::mlir::Pass *pass) {
135 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
139 std::unique_ptr<::mlir::Pass> clonePass()
const override {
140 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
144 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
145 registry.insert<llzk::LLZKDialect>();
146 registry.insert<llzk::boolean::BoolDialect>();
147 registry.insert<llzk::array::ArrayDialect>();
148 registry.insert<llzk::component::StructDialect>();
149 registry.insert<llzk::constrain::ConstrainDialect>();
150 registry.insert<llzk::felt::FeltDialect>();
151 registry.insert<llzk::global::GlobalDialect>();
152 registry.insert<llzk::include::IncludeDialect>();
153 registry.insert<llzk::function::FunctionDialect>();
154 registry.insert<llzk::string::StringDialect>();
155 registry.insert<llzk::polymorphic::PolymorphicDialect>();
156 registry.insert<mlir::arith::ArithDialect>();
157 registry.insert<mlir::scf::SCFDialect>();
163 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FuseProductLoopsPassBase<DerivedT>)
169#undef GEN_PASS_DEF_FUSEPRODUCTLOOPSPASS
175#ifdef GEN_PASS_DECL_INLINESTRUCTSPASS
176struct InlineStructsPassOptions {
177 uint64_t maxComplexity = 0;
179#undef GEN_PASS_DECL_INLINESTRUCTSPASS
181#ifdef GEN_PASS_DEF_INLINESTRUCTSPASS
184template <
typename DerivedT>
185class InlineStructsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
187 using Base = InlineStructsPassBase;
189 InlineStructsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
190 InlineStructsPassBase(
const InlineStructsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
191 InlineStructsPassBase& operator=(
const InlineStructsPassBase &) =
delete;
192 InlineStructsPassBase(InlineStructsPassBase &&) =
delete;
193 InlineStructsPassBase& operator=(InlineStructsPassBase &&) =
delete;
194 ~InlineStructsPassBase() =
default;
197 static constexpr ::llvm::StringLiteral getArgumentName() {
198 return ::llvm::StringLiteral(
"llzk-inline-structs");
200 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
202 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
205 static constexpr ::llvm::StringLiteral getPassName() {
206 return ::llvm::StringLiteral(
"InlineStructsPass");
208 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
211 static bool classof(const ::mlir::Pass *pass) {
212 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
216 std::unique_ptr<::mlir::Pass> clonePass()
const override {
217 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
221 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
222 registry.insert<llzk::LLZKDialect>();
223 registry.insert<llzk::boolean::BoolDialect>();
224 registry.insert<llzk::array::ArrayDialect>();
225 registry.insert<llzk::component::StructDialect>();
226 registry.insert<llzk::constrain::ConstrainDialect>();
227 registry.insert<llzk::felt::FeltDialect>();
228 registry.insert<llzk::global::GlobalDialect>();
229 registry.insert<llzk::include::IncludeDialect>();
230 registry.insert<llzk::function::FunctionDialect>();
231 registry.insert<llzk::string::StringDialect>();
232 registry.insert<llzk::polymorphic::PolymorphicDialect>();
233 registry.insert<mlir::arith::ArithDialect>();
234 registry.insert<mlir::scf::SCFDialect>();
240 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
242 InlineStructsPassBase(InlineStructsPassOptions options) : InlineStructsPassBase() {
243 maxComplexity = std::move(options.maxComplexity);
246 ::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)};
250#undef GEN_PASS_DEF_INLINESTRUCTSPASS
256#ifdef GEN_PASS_DECL_PCLLOWERINGPASS
257struct PCLLoweringPassOptions {
258 ::llvm::APInt prime = llvm::APInt(31, 2130706433);
260#undef GEN_PASS_DECL_PCLLOWERINGPASS
262#ifdef GEN_PASS_DEF_PCLLOWERINGPASS
265template <
typename DerivedT>
266class PCLLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
268 using Base = PCLLoweringPassBase;
270 PCLLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
271 PCLLoweringPassBase(
const PCLLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
272 PCLLoweringPassBase& operator=(
const PCLLoweringPassBase &) =
delete;
273 PCLLoweringPassBase(PCLLoweringPassBase &&) =
delete;
274 PCLLoweringPassBase& operator=(PCLLoweringPassBase &&) =
delete;
275 ~PCLLoweringPassBase() =
default;
278 static constexpr ::llvm::StringLiteral getArgumentName() {
279 return ::llvm::StringLiteral(
"llzk-to-pcl");
281 ::llvm::StringRef getArgument()
const override {
return "llzk-to-pcl"; }
283 ::llvm::StringRef getDescription()
const override {
return "Rewrites constraints to be compatible with PCL constraints used by Picus"; }
286 static constexpr ::llvm::StringLiteral getPassName() {
287 return ::llvm::StringLiteral(
"PCLLoweringPass");
289 ::llvm::StringRef getName()
const override {
return "PCLLoweringPass"; }
292 static bool classof(const ::mlir::Pass *pass) {
293 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
297 std::unique_ptr<::mlir::Pass> clonePass()
const override {
298 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
302 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
303 registry.insert<llzk::LLZKDialect>();
304 registry.insert<llzk::boolean::BoolDialect>();
305 registry.insert<llzk::array::ArrayDialect>();
306 registry.insert<llzk::component::StructDialect>();
307 registry.insert<llzk::constrain::ConstrainDialect>();
308 registry.insert<llzk::felt::FeltDialect>();
309 registry.insert<llzk::global::GlobalDialect>();
310 registry.insert<llzk::include::IncludeDialect>();
311 registry.insert<llzk::function::FunctionDialect>();
312 registry.insert<llzk::string::StringDialect>();
313 registry.insert<llzk::polymorphic::PolymorphicDialect>();
314 registry.insert<mlir::arith::ArithDialect>();
315 registry.insert<mlir::scf::SCFDialect>();
321 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PCLLoweringPassBase<DerivedT>)
323 PCLLoweringPassBase(PCLLoweringPassOptions options) : PCLLoweringPassBase() {
324 prime = std::move(options.prime);
327 ::mlir::Pass::Option<::llvm::APInt> prime{*
this,
"prime", ::llvm::cl::desc(
"The prime field that the constraints operate over. This is required by PCL, and the prime must be passed in digits."), ::llvm::cl::init(llvm::APInt(31, 2130706433))};
331#undef GEN_PASS_DEF_PCLLOWERINGPASS
337#ifdef GEN_PASS_DECL_POLYLOWERINGPASS
338struct PolyLoweringPassOptions {
339 unsigned maxDegree = 2;
341#undef GEN_PASS_DECL_POLYLOWERINGPASS
343#ifdef GEN_PASS_DEF_POLYLOWERINGPASS
346template <
typename DerivedT>
347class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
349 using Base = PolyLoweringPassBase;
351 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
352 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
353 PolyLoweringPassBase& operator=(
const PolyLoweringPassBase &) =
delete;
354 PolyLoweringPassBase(PolyLoweringPassBase &&) =
delete;
355 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) =
delete;
356 ~PolyLoweringPassBase() =
default;
359 static constexpr ::llvm::StringLiteral getArgumentName() {
360 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
362 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
364 ::llvm::StringRef getDescription()
const override {
return "Lowers the degree of all polynomial equations to a specified maximum"; }
367 static constexpr ::llvm::StringLiteral getPassName() {
368 return ::llvm::StringLiteral(
"PolyLoweringPass");
370 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
373 static bool classof(const ::mlir::Pass *pass) {
374 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
378 std::unique_ptr<::mlir::Pass> clonePass()
const override {
379 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
383 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
384 registry.insert<llzk::LLZKDialect>();
385 registry.insert<llzk::boolean::BoolDialect>();
386 registry.insert<llzk::array::ArrayDialect>();
387 registry.insert<llzk::component::StructDialect>();
388 registry.insert<llzk::constrain::ConstrainDialect>();
389 registry.insert<llzk::felt::FeltDialect>();
390 registry.insert<llzk::global::GlobalDialect>();
391 registry.insert<llzk::include::IncludeDialect>();
392 registry.insert<llzk::function::FunctionDialect>();
393 registry.insert<llzk::string::StringDialect>();
394 registry.insert<llzk::polymorphic::PolymorphicDialect>();
395 registry.insert<mlir::arith::ArithDialect>();
396 registry.insert<mlir::scf::SCFDialect>();
402 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
404 PolyLoweringPassBase(PolyLoweringPassOptions options) : PolyLoweringPassBase() {
405 maxDegree = std::move(options.maxDegree);
408 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
412#undef GEN_PASS_DEF_POLYLOWERINGPASS
418#ifdef GEN_PASS_DECL_R1CSLOWERINGPASS
419#undef GEN_PASS_DECL_R1CSLOWERINGPASS
421#ifdef GEN_PASS_DEF_R1CSLOWERINGPASS
424template <
typename DerivedT>
425class R1CSLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
427 using Base = R1CSLoweringPassBase;
429 R1CSLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
430 R1CSLoweringPassBase(
const R1CSLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
431 R1CSLoweringPassBase& operator=(
const R1CSLoweringPassBase &) =
delete;
432 R1CSLoweringPassBase(R1CSLoweringPassBase &&) =
delete;
433 R1CSLoweringPassBase& operator=(R1CSLoweringPassBase &&) =
delete;
434 ~R1CSLoweringPassBase() =
default;
437 static constexpr ::llvm::StringLiteral getArgumentName() {
438 return ::llvm::StringLiteral(
"llzk-r1cs-lowering");
440 ::llvm::StringRef getArgument()
const override {
return "llzk-r1cs-lowering"; }
442 ::llvm::StringRef getDescription()
const override {
return "Rewrites constraints to be compatible with R1CS constraints i.e a*b - c = 0"; }
445 static constexpr ::llvm::StringLiteral getPassName() {
446 return ::llvm::StringLiteral(
"R1CSLoweringPass");
448 ::llvm::StringRef getName()
const override {
return "R1CSLoweringPass"; }
451 static bool classof(const ::mlir::Pass *pass) {
452 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
456 std::unique_ptr<::mlir::Pass> clonePass()
const override {
457 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
461 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
462 registry.insert<llzk::LLZKDialect>();
463 registry.insert<llzk::boolean::BoolDialect>();
464 registry.insert<llzk::array::ArrayDialect>();
465 registry.insert<llzk::component::StructDialect>();
466 registry.insert<llzk::constrain::ConstrainDialect>();
467 registry.insert<llzk::felt::FeltDialect>();
468 registry.insert<llzk::global::GlobalDialect>();
469 registry.insert<llzk::include::IncludeDialect>();
470 registry.insert<llzk::function::FunctionDialect>();
471 registry.insert<llzk::string::StringDialect>();
472 registry.insert<llzk::polymorphic::PolymorphicDialect>();
473 registry.insert<mlir::arith::ArithDialect>();
474 registry.insert<mlir::scf::SCFDialect>();
480 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(R1CSLoweringPassBase<DerivedT>)
486#undef GEN_PASS_DEF_R1CSLOWERINGPASS
492#ifdef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
493#undef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
495#ifdef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
498template <
typename DerivedT>
499class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
501 using Base = RedundantOperationEliminationPassBase;
503 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
504 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
505 RedundantOperationEliminationPassBase& operator=(
const RedundantOperationEliminationPassBase &) =
delete;
506 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) =
delete;
507 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) =
delete;
508 ~RedundantOperationEliminationPassBase() =
default;
511 static constexpr ::llvm::StringLiteral getArgumentName() {
512 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
514 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
516 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
519 static constexpr ::llvm::StringLiteral getPassName() {
520 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
522 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
525 static bool classof(const ::mlir::Pass *pass) {
526 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
530 std::unique_ptr<::mlir::Pass> clonePass()
const override {
531 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
535 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
536 registry.insert<llzk::LLZKDialect>();
537 registry.insert<llzk::boolean::BoolDialect>();
538 registry.insert<llzk::array::ArrayDialect>();
539 registry.insert<llzk::component::StructDialect>();
540 registry.insert<llzk::constrain::ConstrainDialect>();
541 registry.insert<llzk::felt::FeltDialect>();
542 registry.insert<llzk::global::GlobalDialect>();
543 registry.insert<llzk::include::IncludeDialect>();
544 registry.insert<llzk::function::FunctionDialect>();
545 registry.insert<llzk::string::StringDialect>();
546 registry.insert<llzk::polymorphic::PolymorphicDialect>();
547 registry.insert<mlir::arith::ArithDialect>();
548 registry.insert<mlir::scf::SCFDialect>();
554 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
560#undef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
566#ifdef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
567#undef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
569#ifdef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
572template <
typename DerivedT>
573class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
575 using Base = RedundantReadAndWriteEliminationPassBase;
577 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
578 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
579 RedundantReadAndWriteEliminationPassBase& operator=(
const RedundantReadAndWriteEliminationPassBase &) =
delete;
580 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) =
delete;
581 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) =
delete;
582 ~RedundantReadAndWriteEliminationPassBase() =
default;
585 static constexpr ::llvm::StringLiteral getArgumentName() {
586 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
588 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
590 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
593 static constexpr ::llvm::StringLiteral getPassName() {
594 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
596 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
599 static bool classof(const ::mlir::Pass *pass) {
600 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
604 std::unique_ptr<::mlir::Pass> clonePass()
const override {
605 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
609 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
610 registry.insert<llzk::LLZKDialect>();
611 registry.insert<llzk::boolean::BoolDialect>();
612 registry.insert<llzk::array::ArrayDialect>();
613 registry.insert<llzk::component::StructDialect>();
614 registry.insert<llzk::constrain::ConstrainDialect>();
615 registry.insert<llzk::felt::FeltDialect>();
616 registry.insert<llzk::global::GlobalDialect>();
617 registry.insert<llzk::include::IncludeDialect>();
618 registry.insert<llzk::function::FunctionDialect>();
619 registry.insert<llzk::string::StringDialect>();
620 registry.insert<llzk::polymorphic::PolymorphicDialect>();
621 registry.insert<mlir::arith::ArithDialect>();
622 registry.insert<mlir::scf::SCFDialect>();
628 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
634#undef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
640#ifdef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
641struct UnusedDeclarationEliminationPassOptions {
642 bool removeStructs =
false;
644#undef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
646#ifdef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
649template <
typename DerivedT>
650class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
652 using Base = UnusedDeclarationEliminationPassBase;
654 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
655 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
656 UnusedDeclarationEliminationPassBase& operator=(
const UnusedDeclarationEliminationPassBase &) =
delete;
657 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) =
delete;
658 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) =
delete;
659 ~UnusedDeclarationEliminationPassBase() =
default;
662 static constexpr ::llvm::StringLiteral getArgumentName() {
663 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
665 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
667 ::llvm::StringRef getDescription()
const override {
return "Remove unused member and struct declarations"; }
670 static constexpr ::llvm::StringLiteral getPassName() {
671 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
673 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
676 static bool classof(const ::mlir::Pass *pass) {
677 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
681 std::unique_ptr<::mlir::Pass> clonePass()
const override {
682 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
686 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
687 registry.insert<llzk::LLZKDialect>();
688 registry.insert<llzk::boolean::BoolDialect>();
689 registry.insert<llzk::array::ArrayDialect>();
690 registry.insert<llzk::component::StructDialect>();
691 registry.insert<llzk::constrain::ConstrainDialect>();
692 registry.insert<llzk::felt::FeltDialect>();
693 registry.insert<llzk::global::GlobalDialect>();
694 registry.insert<llzk::include::IncludeDialect>();
695 registry.insert<llzk::function::FunctionDialect>();
696 registry.insert<llzk::string::StringDialect>();
697 registry.insert<llzk::polymorphic::PolymorphicDialect>();
698 registry.insert<mlir::arith::ArithDialect>();
699 registry.insert<mlir::scf::SCFDialect>();
705 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
707 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassOptions options) : UnusedDeclarationEliminationPassBase() {
708 removeStructs = std::move(options.removeStructs);
711 ::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)};
715#undef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
717#ifdef GEN_PASS_REGISTRATION
724 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
731 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
741 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
748 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
758 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
765 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
775 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
776 return llzk::createPCLLoweringPass();
782 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
783 return llzk::createPCLLoweringPass();
792 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
799 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
809 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
816 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
826 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
833 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
843 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
850 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
860 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
867 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
887#undef GEN_PASS_REGISTRATION
890#ifdef GEN_PASS_CLASSES
892template <
typename DerivedT>
893class ComputeConstrainToProductPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
895 using Base = ComputeConstrainToProductPassBase;
897 ComputeConstrainToProductPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
898 ComputeConstrainToProductPassBase(
const ComputeConstrainToProductPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
899 ComputeConstrainToProductPassBase& operator=(
const ComputeConstrainToProductPassBase &) =
delete;
900 ComputeConstrainToProductPassBase(ComputeConstrainToProductPassBase &&) =
delete;
901 ComputeConstrainToProductPassBase& operator=(ComputeConstrainToProductPassBase &&) =
delete;
902 ~ComputeConstrainToProductPassBase() =
default;
905 static constexpr ::llvm::StringLiteral getArgumentName() {
906 return ::llvm::StringLiteral(
"llzk-compute-constrain-to-product");
908 ::llvm::StringRef getArgument()
const override {
return "llzk-compute-constrain-to-product"; }
910 ::llvm::StringRef getDescription()
const override {
return "Replaces separate @compute and @constrain functions in a struct with a single @product function"; }
913 static constexpr ::llvm::StringLiteral getPassName() {
914 return ::llvm::StringLiteral(
"ComputeConstrainToProductPass");
916 ::llvm::StringRef getName()
const override {
return "ComputeConstrainToProductPass"; }
919 static bool classof(const ::mlir::Pass *pass) {
920 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
924 std::unique_ptr<::mlir::Pass> clonePass()
const override {
925 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
929 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
930 registry.insert<llzk::LLZKDialect>();
931 registry.insert<llzk::boolean::BoolDialect>();
932 registry.insert<llzk::array::ArrayDialect>();
933 registry.insert<llzk::component::StructDialect>();
934 registry.insert<llzk::constrain::ConstrainDialect>();
935 registry.insert<llzk::felt::FeltDialect>();
936 registry.insert<llzk::global::GlobalDialect>();
937 registry.insert<llzk::include::IncludeDialect>();
938 registry.insert<llzk::function::FunctionDialect>();
939 registry.insert<llzk::string::StringDialect>();
940 registry.insert<llzk::polymorphic::PolymorphicDialect>();
941 registry.insert<mlir::arith::ArithDialect>();
942 registry.insert<mlir::scf::SCFDialect>();
948 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ComputeConstrainToProductPassBase<DerivedT>)
951 ::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")};
954template <
typename DerivedT>
955class FuseProductLoopsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
957 using Base = FuseProductLoopsPassBase;
959 FuseProductLoopsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
960 FuseProductLoopsPassBase(
const FuseProductLoopsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
961 FuseProductLoopsPassBase& operator=(
const FuseProductLoopsPassBase &) =
delete;
962 FuseProductLoopsPassBase(FuseProductLoopsPassBase &&) =
delete;
963 FuseProductLoopsPassBase& operator=(FuseProductLoopsPassBase &&) =
delete;
964 ~FuseProductLoopsPassBase() =
default;
967 static constexpr ::llvm::StringLiteral getArgumentName() {
968 return ::llvm::StringLiteral(
"llzk-fuse-product-loops");
970 ::llvm::StringRef getArgument()
const override {
return "llzk-fuse-product-loops"; }
972 ::llvm::StringRef getDescription()
const override {
return "Fuses matching witness/constraint loops in a @product function"; }
975 static constexpr ::llvm::StringLiteral getPassName() {
976 return ::llvm::StringLiteral(
"FuseProductLoopsPass");
978 ::llvm::StringRef getName()
const override {
return "FuseProductLoopsPass"; }
981 static bool classof(const ::mlir::Pass *pass) {
982 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
986 std::unique_ptr<::mlir::Pass> clonePass()
const override {
987 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
991 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
992 registry.insert<llzk::LLZKDialect>();
993 registry.insert<llzk::boolean::BoolDialect>();
994 registry.insert<llzk::array::ArrayDialect>();
995 registry.insert<llzk::component::StructDialect>();
996 registry.insert<llzk::constrain::ConstrainDialect>();
997 registry.insert<llzk::felt::FeltDialect>();
998 registry.insert<llzk::global::GlobalDialect>();
999 registry.insert<llzk::include::IncludeDialect>();
1000 registry.insert<llzk::function::FunctionDialect>();
1001 registry.insert<llzk::string::StringDialect>();
1002 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1003 registry.insert<mlir::arith::ArithDialect>();
1004 registry.insert<mlir::scf::SCFDialect>();
1010 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FuseProductLoopsPassBase<DerivedT>)
1015template <
typename DerivedT>
1016class InlineStructsPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1018 using Base = InlineStructsPassBase;
1020 InlineStructsPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1021 InlineStructsPassBase(
const InlineStructsPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1022 InlineStructsPassBase& operator=(
const InlineStructsPassBase &) =
delete;
1023 InlineStructsPassBase(InlineStructsPassBase &&) =
delete;
1024 InlineStructsPassBase& operator=(InlineStructsPassBase &&) =
delete;
1025 ~InlineStructsPassBase() =
default;
1028 static constexpr ::llvm::StringLiteral getArgumentName() {
1029 return ::llvm::StringLiteral(
"llzk-inline-structs");
1031 ::llvm::StringRef getArgument()
const override {
return "llzk-inline-structs"; }
1033 ::llvm::StringRef getDescription()
const override {
return "Inlines nested structs (i.e., subcomponents)."; }
1036 static constexpr ::llvm::StringLiteral getPassName() {
1037 return ::llvm::StringLiteral(
"InlineStructsPass");
1039 ::llvm::StringRef getName()
const override {
return "InlineStructsPass"; }
1042 static bool classof(const ::mlir::Pass *pass) {
1043 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1047 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1048 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1052 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1053 registry.insert<llzk::LLZKDialect>();
1054 registry.insert<llzk::boolean::BoolDialect>();
1055 registry.insert<llzk::array::ArrayDialect>();
1056 registry.insert<llzk::component::StructDialect>();
1057 registry.insert<llzk::constrain::ConstrainDialect>();
1058 registry.insert<llzk::felt::FeltDialect>();
1059 registry.insert<llzk::global::GlobalDialect>();
1060 registry.insert<llzk::include::IncludeDialect>();
1061 registry.insert<llzk::function::FunctionDialect>();
1062 registry.insert<llzk::string::StringDialect>();
1063 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1064 registry.insert<mlir::arith::ArithDialect>();
1065 registry.insert<mlir::scf::SCFDialect>();
1071 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(InlineStructsPassBase<DerivedT>)
1074 ::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)};
1077template <
typename DerivedT>
1078class PCLLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1080 using Base = PCLLoweringPassBase;
1082 PCLLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1083 PCLLoweringPassBase(
const PCLLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1084 PCLLoweringPassBase& operator=(
const PCLLoweringPassBase &) =
delete;
1085 PCLLoweringPassBase(PCLLoweringPassBase &&) =
delete;
1086 PCLLoweringPassBase& operator=(PCLLoweringPassBase &&) =
delete;
1087 ~PCLLoweringPassBase() =
default;
1090 static constexpr ::llvm::StringLiteral getArgumentName() {
1091 return ::llvm::StringLiteral(
"llzk-to-pcl");
1093 ::llvm::StringRef getArgument()
const override {
return "llzk-to-pcl"; }
1095 ::llvm::StringRef getDescription()
const override {
return "Rewrites constraints to be compatible with PCL constraints used by Picus"; }
1098 static constexpr ::llvm::StringLiteral getPassName() {
1099 return ::llvm::StringLiteral(
"PCLLoweringPass");
1101 ::llvm::StringRef getName()
const override {
return "PCLLoweringPass"; }
1104 static bool classof(const ::mlir::Pass *pass) {
1105 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1109 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1110 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1114 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1115 registry.insert<llzk::LLZKDialect>();
1116 registry.insert<llzk::boolean::BoolDialect>();
1117 registry.insert<llzk::array::ArrayDialect>();
1118 registry.insert<llzk::component::StructDialect>();
1119 registry.insert<llzk::constrain::ConstrainDialect>();
1120 registry.insert<llzk::felt::FeltDialect>();
1121 registry.insert<llzk::global::GlobalDialect>();
1122 registry.insert<llzk::include::IncludeDialect>();
1123 registry.insert<llzk::function::FunctionDialect>();
1124 registry.insert<llzk::string::StringDialect>();
1125 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1126 registry.insert<mlir::arith::ArithDialect>();
1127 registry.insert<mlir::scf::SCFDialect>();
1133 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PCLLoweringPassBase<DerivedT>)
1136 ::mlir::Pass::Option<::llvm::APInt> prime{*
this,
"prime", ::llvm::cl::desc(
"The prime field that the constraints operate over. This is required by PCL, and the prime must be passed in digits."), ::llvm::cl::init(llvm::APInt(31, 2130706433))};
1139template <
typename DerivedT>
1140class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1142 using Base = PolyLoweringPassBase;
1144 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1145 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1146 PolyLoweringPassBase& operator=(
const PolyLoweringPassBase &) =
delete;
1147 PolyLoweringPassBase(PolyLoweringPassBase &&) =
delete;
1148 PolyLoweringPassBase& operator=(PolyLoweringPassBase &&) =
delete;
1149 ~PolyLoweringPassBase() =
default;
1152 static constexpr ::llvm::StringLiteral getArgumentName() {
1153 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
1155 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
1157 ::llvm::StringRef getDescription()
const override {
return "Lowers the degree of all polynomial equations to a specified maximum"; }
1160 static constexpr ::llvm::StringLiteral getPassName() {
1161 return ::llvm::StringLiteral(
"PolyLoweringPass");
1163 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
1166 static bool classof(const ::mlir::Pass *pass) {
1167 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1171 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1172 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1176 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1177 registry.insert<llzk::LLZKDialect>();
1178 registry.insert<llzk::boolean::BoolDialect>();
1179 registry.insert<llzk::array::ArrayDialect>();
1180 registry.insert<llzk::component::StructDialect>();
1181 registry.insert<llzk::constrain::ConstrainDialect>();
1182 registry.insert<llzk::felt::FeltDialect>();
1183 registry.insert<llzk::global::GlobalDialect>();
1184 registry.insert<llzk::include::IncludeDialect>();
1185 registry.insert<llzk::function::FunctionDialect>();
1186 registry.insert<llzk::string::StringDialect>();
1187 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1188 registry.insert<mlir::arith::ArithDialect>();
1189 registry.insert<mlir::scf::SCFDialect>();
1195 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
1198 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
1201template <
typename DerivedT>
1202class R1CSLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1204 using Base = R1CSLoweringPassBase;
1206 R1CSLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1207 R1CSLoweringPassBase(
const R1CSLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1208 R1CSLoweringPassBase& operator=(
const R1CSLoweringPassBase &) =
delete;
1209 R1CSLoweringPassBase(R1CSLoweringPassBase &&) =
delete;
1210 R1CSLoweringPassBase& operator=(R1CSLoweringPassBase &&) =
delete;
1211 ~R1CSLoweringPassBase() =
default;
1214 static constexpr ::llvm::StringLiteral getArgumentName() {
1215 return ::llvm::StringLiteral(
"llzk-r1cs-lowering");
1217 ::llvm::StringRef getArgument()
const override {
return "llzk-r1cs-lowering"; }
1219 ::llvm::StringRef getDescription()
const override {
return "Rewrites constraints to be compatible with R1CS constraints i.e a*b - c = 0"; }
1222 static constexpr ::llvm::StringLiteral getPassName() {
1223 return ::llvm::StringLiteral(
"R1CSLoweringPass");
1225 ::llvm::StringRef getName()
const override {
return "R1CSLoweringPass"; }
1228 static bool classof(const ::mlir::Pass *pass) {
1229 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1233 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1234 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1238 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1239 registry.insert<llzk::LLZKDialect>();
1240 registry.insert<llzk::boolean::BoolDialect>();
1241 registry.insert<llzk::array::ArrayDialect>();
1242 registry.insert<llzk::component::StructDialect>();
1243 registry.insert<llzk::constrain::ConstrainDialect>();
1244 registry.insert<llzk::felt::FeltDialect>();
1245 registry.insert<llzk::global::GlobalDialect>();
1246 registry.insert<llzk::include::IncludeDialect>();
1247 registry.insert<llzk::function::FunctionDialect>();
1248 registry.insert<llzk::string::StringDialect>();
1249 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1250 registry.insert<mlir::arith::ArithDialect>();
1251 registry.insert<mlir::scf::SCFDialect>();
1257 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(R1CSLoweringPassBase<DerivedT>)
1262template <
typename DerivedT>
1263class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1265 using Base = RedundantOperationEliminationPassBase;
1267 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1268 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1269 RedundantOperationEliminationPassBase& operator=(
const RedundantOperationEliminationPassBase &) =
delete;
1270 RedundantOperationEliminationPassBase(RedundantOperationEliminationPassBase &&) =
delete;
1271 RedundantOperationEliminationPassBase& operator=(RedundantOperationEliminationPassBase &&) =
delete;
1272 ~RedundantOperationEliminationPassBase() =
default;
1275 static constexpr ::llvm::StringLiteral getArgumentName() {
1276 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
1278 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
1280 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
1283 static constexpr ::llvm::StringLiteral getPassName() {
1284 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
1286 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
1289 static bool classof(const ::mlir::Pass *pass) {
1290 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1294 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1295 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1299 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1300 registry.insert<llzk::LLZKDialect>();
1301 registry.insert<llzk::boolean::BoolDialect>();
1302 registry.insert<llzk::array::ArrayDialect>();
1303 registry.insert<llzk::component::StructDialect>();
1304 registry.insert<llzk::constrain::ConstrainDialect>();
1305 registry.insert<llzk::felt::FeltDialect>();
1306 registry.insert<llzk::global::GlobalDialect>();
1307 registry.insert<llzk::include::IncludeDialect>();
1308 registry.insert<llzk::function::FunctionDialect>();
1309 registry.insert<llzk::string::StringDialect>();
1310 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1311 registry.insert<mlir::arith::ArithDialect>();
1312 registry.insert<mlir::scf::SCFDialect>();
1318 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
1323template <
typename DerivedT>
1324class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1326 using Base = RedundantReadAndWriteEliminationPassBase;
1328 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1329 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1330 RedundantReadAndWriteEliminationPassBase& operator=(
const RedundantReadAndWriteEliminationPassBase &) =
delete;
1331 RedundantReadAndWriteEliminationPassBase(RedundantReadAndWriteEliminationPassBase &&) =
delete;
1332 RedundantReadAndWriteEliminationPassBase& operator=(RedundantReadAndWriteEliminationPassBase &&) =
delete;
1333 ~RedundantReadAndWriteEliminationPassBase() =
default;
1336 static constexpr ::llvm::StringLiteral getArgumentName() {
1337 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
1339 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
1341 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
1344 static constexpr ::llvm::StringLiteral getPassName() {
1345 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
1347 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
1350 static bool classof(const ::mlir::Pass *pass) {
1351 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1355 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1356 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1360 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1361 registry.insert<llzk::LLZKDialect>();
1362 registry.insert<llzk::boolean::BoolDialect>();
1363 registry.insert<llzk::array::ArrayDialect>();
1364 registry.insert<llzk::component::StructDialect>();
1365 registry.insert<llzk::constrain::ConstrainDialect>();
1366 registry.insert<llzk::felt::FeltDialect>();
1367 registry.insert<llzk::global::GlobalDialect>();
1368 registry.insert<llzk::include::IncludeDialect>();
1369 registry.insert<llzk::function::FunctionDialect>();
1370 registry.insert<llzk::string::StringDialect>();
1371 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1372 registry.insert<mlir::arith::ArithDialect>();
1373 registry.insert<mlir::scf::SCFDialect>();
1379 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
1384template <
typename DerivedT>
1385class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
1387 using Base = UnusedDeclarationEliminationPassBase;
1389 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
1390 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
1391 UnusedDeclarationEliminationPassBase& operator=(
const UnusedDeclarationEliminationPassBase &) =
delete;
1392 UnusedDeclarationEliminationPassBase(UnusedDeclarationEliminationPassBase &&) =
delete;
1393 UnusedDeclarationEliminationPassBase& operator=(UnusedDeclarationEliminationPassBase &&) =
delete;
1394 ~UnusedDeclarationEliminationPassBase() =
default;
1397 static constexpr ::llvm::StringLiteral getArgumentName() {
1398 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
1400 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
1402 ::llvm::StringRef getDescription()
const override {
return "Remove unused member and struct declarations"; }
1405 static constexpr ::llvm::StringLiteral getPassName() {
1406 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
1408 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
1411 static bool classof(const ::mlir::Pass *pass) {
1412 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
1416 std::unique_ptr<::mlir::Pass> clonePass()
const override {
1417 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
1421 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
1422 registry.insert<llzk::LLZKDialect>();
1423 registry.insert<llzk::boolean::BoolDialect>();
1424 registry.insert<llzk::array::ArrayDialect>();
1425 registry.insert<llzk::component::StructDialect>();
1426 registry.insert<llzk::constrain::ConstrainDialect>();
1427 registry.insert<llzk::felt::FeltDialect>();
1428 registry.insert<llzk::global::GlobalDialect>();
1429 registry.insert<llzk::include::IncludeDialect>();
1430 registry.insert<llzk::function::FunctionDialect>();
1431 registry.insert<llzk::string::StringDialect>();
1432 registry.insert<llzk::polymorphic::PolymorphicDialect>();
1433 registry.insert<mlir::arith::ArithDialect>();
1434 registry.insert<mlir::scf::SCFDialect>();
1440 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
1443 ::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)};
1445#undef GEN_PASS_CLASSES
void registerTransformationPasses()
void registerUnusedDeclarationEliminationPassPass()
std::unique_ptr< mlir::Pass > createRedundantOperationEliminationPass()
void registerFuseProductLoopsPassPass()
void registerR1CSLoweringPass()
void registerRedundantOperationEliminationPass()
std::unique_ptr< Pass > createComputeConstrainToProductPass()
void registerPolyLoweringPassPass()
void registerUnusedDeclarationEliminationPass()
void registerComputeConstrainToProductPassPass()
void registerRedundantOperationEliminationPassPass()
void registerPCLLoweringPass()
std::unique_ptr< mlir::Pass > createRedundantReadAndWriteEliminationPass()
void registerR1CSLoweringPassPass()
void registerInlineStructsPassPass()
std::unique_ptr< mlir::Pass > createUnusedDeclarationEliminationPass()
void registerComputeConstrainToProductPass()
std::unique_ptr< mlir::Pass > createPolyLoweringPass()
void registerRedundantReadAndWriteEliminationPass()
void registerPolyLoweringPass()
void registerRedundantReadAndWriteEliminationPassPass()
void registerPCLLoweringPassPass()
std::unique_ptr< mlir::Pass > createInlineStructsPass()
std::unique_ptr< mlir::Pass > createR1CSLoweringPass()
std::unique_ptr< mlir::Pass > createFuseProductLoopsPass()
void registerInlineStructsPass()
void registerFuseProductLoopsPass()