5#define GEN_PASS_DECL_EMPTYTEMPLATEREMOVALPASS
6#define GEN_PASS_DECL_FLATTENINGPASS
7#define GEN_PASS_DECL_TYPEVARINFERENCEPASS
8#define GEN_PASS_DECL_WILDCARDARRAYSPECIALIZATIONPASS
15#ifdef GEN_PASS_DECL_EMPTYTEMPLATEREMOVALPASS
17#undef GEN_PASS_DECL_EMPTYTEMPLATEREMOVALPASS
19#ifdef GEN_PASS_DEF_EMPTYTEMPLATEREMOVALPASS
26template <
typename DerivedT>
27class EmptyTemplateRemovalPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
29 using Base = EmptyTemplateRemovalPassBase;
31 EmptyTemplateRemovalPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
32 EmptyTemplateRemovalPassBase(
const EmptyTemplateRemovalPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
33 EmptyTemplateRemovalPassBase& operator=(
const EmptyTemplateRemovalPassBase &) =
delete;
34 EmptyTemplateRemovalPassBase(EmptyTemplateRemovalPassBase &&) =
delete;
35 EmptyTemplateRemovalPassBase& operator=(EmptyTemplateRemovalPassBase &&) =
delete;
36 ~EmptyTemplateRemovalPassBase() =
default;
39 static constexpr ::llvm::StringLiteral getArgumentName() {
40 return ::llvm::StringLiteral(
"llzk-drop-empty-templates");
42 ::llvm::StringRef getArgument()
const override {
return "llzk-drop-empty-templates"; }
44 ::llvm::StringRef getDescription()
const override {
return "Remove empty templates"; }
47 static constexpr ::llvm::StringLiteral getPassName() {
48 return ::llvm::StringLiteral(
"EmptyTemplateRemovalPass");
50 ::llvm::StringRef getName()
const override {
return "EmptyTemplateRemovalPass"; }
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<mlir::arith::ArithDialect>();
76 registry.insert<mlir::scf::SCFDialect>();
82 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EmptyTemplateRemovalPassBase<DerivedT>)
88 return std::make_unique<DerivedT>();
94 return impl::createEmptyTemplateRemovalPass();
96#undef GEN_PASS_DEF_EMPTYTEMPLATEREMOVALPASS
102#ifdef GEN_PASS_DECL_FLATTENINGPASS
103struct FlatteningPassOptions {
104 unsigned iterationLimit = 1000;
109#undef GEN_PASS_DECL_FLATTENINGPASS
111#ifdef GEN_PASS_DEF_FLATTENINGPASS
122template <
typename DerivedT>
123class FlatteningPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
125 using Base = FlatteningPassBase;
127 FlatteningPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
128 FlatteningPassBase(
const FlatteningPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
129 FlatteningPassBase& operator=(
const FlatteningPassBase &) =
delete;
130 FlatteningPassBase(FlatteningPassBase &&) =
delete;
131 FlatteningPassBase& operator=(FlatteningPassBase &&) =
delete;
132 ~FlatteningPassBase() =
default;
135 static constexpr ::llvm::StringLiteral getArgumentName() {
136 return ::llvm::StringLiteral(
"llzk-flatten");
138 ::llvm::StringRef getArgument()
const override {
return "llzk-flatten"; }
140 ::llvm::StringRef getDescription()
const override {
return "Flatten structs and unroll loops"; }
143 static constexpr ::llvm::StringLiteral getPassName() {
144 return ::llvm::StringLiteral(
"FlatteningPass");
146 ::llvm::StringRef getName()
const override {
return "FlatteningPass"; }
149 static bool classof(const ::mlir::Pass *pass) {
150 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
154 std::unique_ptr<::mlir::Pass> clonePass()
const override {
155 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
159 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
160 registry.insert<llzk::LLZKDialect>();
161 registry.insert<llzk::boolean::BoolDialect>();
162 registry.insert<llzk::array::ArrayDialect>();
163 registry.insert<llzk::component::StructDialect>();
164 registry.insert<llzk::constrain::ConstrainDialect>();
165 registry.insert<llzk::felt::FeltDialect>();
166 registry.insert<llzk::global::GlobalDialect>();
167 registry.insert<llzk::include::IncludeDialect>();
168 registry.insert<llzk::function::FunctionDialect>();
169 registry.insert<llzk::string::StringDialect>();
170 registry.insert<llzk::polymorphic::PolymorphicDialect>();
171 registry.insert<mlir::arith::ArithDialect>();
172 registry.insert<mlir::scf::SCFDialect>();
178 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FlatteningPassBase<DerivedT>)
180 FlatteningPassBase(FlatteningPassOptions options) : FlatteningPassBase() {
181 iterationLimit = std::move(options.iterationLimit);
182 cleanupMode = std::move(options.cleanupMode);
185 ::mlir::Pass::Option<unsigned> iterationLimit{*
this,
"max-iter", ::llvm::cl::desc(
"Maximum number of times the pass will run if a fixpoint is not reached earlier. Unrolling loops can provide more opportunities for instantiating structs but the converse is true as well. Thus, the pass will run multiple times until no further changes can be made or the upper limit provided in this option is reached."), ::llvm::cl::init(1000)};
186 ::mlir::Pass::Option<::llzk::polymorphic::FlatteningCleanupMode> cleanupMode{*
this,
"cleanup", ::llvm::cl::desc(
"Specifies the extent to which unused parameterized definitions (i.e. structs or free functions within a `poly.template`) are removed during the flattening pass."), ::llvm::cl::init(
::llzk::polymorphic::FlatteningCleanupMode::Unspecified), ::llvm::cl::values(
189 "Use the cleanup mode specified by the calling pipeline (defaults to `preimage` if not specified)."),
192 "No definitions are deleted."),
195 "Only definitions that were replaced with concrete instantiations are deleted."),
198 "All definitions that cannot be reached by a use-def chain from some concrete definition are deleted."),
201 "All definitions that cannot be reached by a use-def chain from the \"Main\" struct are deleted.")
206 return std::make_unique<DerivedT>();
210 return std::make_unique<DerivedT>(std::move(options));
216 return impl::createFlatteningPass();
220 return impl::createFlatteningPass(std::move(options));
222#undef GEN_PASS_DEF_FLATTENINGPASS
228#ifdef GEN_PASS_DECL_TYPEVARINFERENCEPASS
230#undef GEN_PASS_DECL_TYPEVARINFERENCEPASS
232#ifdef GEN_PASS_DEF_TYPEVARINFERENCEPASS
239template <
typename DerivedT>
240class TypeVarInferencePassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
242 using Base = TypeVarInferencePassBase;
244 TypeVarInferencePassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
245 TypeVarInferencePassBase(
const TypeVarInferencePassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
246 TypeVarInferencePassBase& operator=(
const TypeVarInferencePassBase &) =
delete;
247 TypeVarInferencePassBase(TypeVarInferencePassBase &&) =
delete;
248 TypeVarInferencePassBase& operator=(TypeVarInferencePassBase &&) =
delete;
249 ~TypeVarInferencePassBase() =
default;
252 static constexpr ::llvm::StringLiteral getArgumentName() {
253 return ::llvm::StringLiteral(
"llzk-infer-tvar");
255 ::llvm::StringRef getArgument()
const override {
return "llzk-infer-tvar"; }
257 ::llvm::StringRef getDescription()
const override {
return "Infer concrete function types for polymorphic type variables"; }
260 static constexpr ::llvm::StringLiteral getPassName() {
261 return ::llvm::StringLiteral(
"TypeVarInferencePass");
263 ::llvm::StringRef getName()
const override {
return "TypeVarInferencePass"; }
266 static bool classof(const ::mlir::Pass *pass) {
267 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
271 std::unique_ptr<::mlir::Pass> clonePass()
const override {
272 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
276 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
277 registry.insert<llzk::LLZKDialect>();
278 registry.insert<llzk::boolean::BoolDialect>();
279 registry.insert<llzk::array::ArrayDialect>();
280 registry.insert<llzk::component::StructDialect>();
281 registry.insert<llzk::constrain::ConstrainDialect>();
282 registry.insert<llzk::felt::FeltDialect>();
283 registry.insert<llzk::global::GlobalDialect>();
284 registry.insert<llzk::include::IncludeDialect>();
285 registry.insert<llzk::function::FunctionDialect>();
286 registry.insert<llzk::string::StringDialect>();
287 registry.insert<llzk::polymorphic::PolymorphicDialect>();
288 registry.insert<mlir::arith::ArithDialect>();
289 registry.insert<mlir::scf::SCFDialect>();
295 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TypeVarInferencePassBase<DerivedT>)
301 return std::make_unique<DerivedT>();
307 return impl::createTypeVarInferencePass();
309#undef GEN_PASS_DEF_TYPEVARINFERENCEPASS
315#ifdef GEN_PASS_DECL_WILDCARDARRAYSPECIALIZATIONPASS
316struct WildcardArraySpecializationPassOptions {
317 unsigned iterationLimit = 1000;
321#undef GEN_PASS_DECL_WILDCARDARRAYSPECIALIZATIONPASS
323#ifdef GEN_PASS_DEF_WILDCARDARRAYSPECIALIZATIONPASS
334template <
typename DerivedT>
335class WildcardArraySpecializationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
337 using Base = WildcardArraySpecializationPassBase;
339 WildcardArraySpecializationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
340 WildcardArraySpecializationPassBase(
const WildcardArraySpecializationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
341 WildcardArraySpecializationPassBase& operator=(
const WildcardArraySpecializationPassBase &) =
delete;
342 WildcardArraySpecializationPassBase(WildcardArraySpecializationPassBase &&) =
delete;
343 WildcardArraySpecializationPassBase& operator=(WildcardArraySpecializationPassBase &&) =
delete;
344 ~WildcardArraySpecializationPassBase() =
default;
347 static constexpr ::llvm::StringLiteral getArgumentName() {
348 return ::llvm::StringLiteral(
"llzk-specialize-wildcard-arrays");
350 ::llvm::StringRef getArgument()
const override {
return "llzk-specialize-wildcard-arrays"; }
352 ::llvm::StringRef getDescription()
const override {
return "Refine wildcard array casts and specialize concrete call targets"; }
355 static constexpr ::llvm::StringLiteral getPassName() {
356 return ::llvm::StringLiteral(
"WildcardArraySpecializationPass");
358 ::llvm::StringRef getName()
const override {
return "WildcardArraySpecializationPass"; }
361 static bool classof(const ::mlir::Pass *pass) {
362 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
366 std::unique_ptr<::mlir::Pass> clonePass()
const override {
367 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
371 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
372 registry.insert<llzk::LLZKDialect>();
373 registry.insert<llzk::boolean::BoolDialect>();
374 registry.insert<llzk::array::ArrayDialect>();
375 registry.insert<llzk::component::StructDialect>();
376 registry.insert<llzk::constrain::ConstrainDialect>();
377 registry.insert<llzk::felt::FeltDialect>();
378 registry.insert<llzk::global::GlobalDialect>();
379 registry.insert<llzk::include::IncludeDialect>();
380 registry.insert<llzk::function::FunctionDialect>();
381 registry.insert<llzk::string::StringDialect>();
382 registry.insert<llzk::polymorphic::PolymorphicDialect>();
383 registry.insert<mlir::arith::ArithDialect>();
384 registry.insert<mlir::scf::SCFDialect>();
390 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(WildcardArraySpecializationPassBase<DerivedT>)
392 WildcardArraySpecializationPassBase(WildcardArraySpecializationPassOptions options) : WildcardArraySpecializationPassBase() {
393 iterationLimit = std::move(options.iterationLimit);
396 ::mlir::Pass::Option<unsigned> iterationLimit{*
this,
"max-iter", ::llvm::cl::desc(
"Maximum number of iterations before the pass gives up reaching a fixpoint."), ::llvm::cl::init(1000)};
400 return std::make_unique<DerivedT>();
404 return std::make_unique<DerivedT>(std::move(options));
410 return impl::createWildcardArraySpecializationPass();
414 return impl::createWildcardArraySpecializationPass(std::move(options));
416#undef GEN_PASS_DEF_WILDCARDARRAYSPECIALIZATIONPASS
418#ifdef GEN_PASS_REGISTRATION
425 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
432 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
442 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
449 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
459 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
466 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
476 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
483 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
498#undef GEN_PASS_REGISTRATION
501#ifdef GEN_PASS_CLASSES
503template <
typename DerivedT>
504class EmptyTemplateRemovalPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
506 using Base = EmptyTemplateRemovalPassBase;
508 EmptyTemplateRemovalPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
509 EmptyTemplateRemovalPassBase(
const EmptyTemplateRemovalPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
510 EmptyTemplateRemovalPassBase& operator=(
const EmptyTemplateRemovalPassBase &) =
delete;
511 EmptyTemplateRemovalPassBase(EmptyTemplateRemovalPassBase &&) =
delete;
512 EmptyTemplateRemovalPassBase& operator=(EmptyTemplateRemovalPassBase &&) =
delete;
513 ~EmptyTemplateRemovalPassBase() =
default;
516 static constexpr ::llvm::StringLiteral getArgumentName() {
517 return ::llvm::StringLiteral(
"llzk-drop-empty-templates");
519 ::llvm::StringRef getArgument()
const override {
return "llzk-drop-empty-templates"; }
521 ::llvm::StringRef getDescription()
const override {
return "Remove empty templates"; }
524 static constexpr ::llvm::StringLiteral getPassName() {
525 return ::llvm::StringLiteral(
"EmptyTemplateRemovalPass");
527 ::llvm::StringRef getName()
const override {
return "EmptyTemplateRemovalPass"; }
530 static bool classof(const ::mlir::Pass *pass) {
531 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
535 std::unique_ptr<::mlir::Pass> clonePass()
const override {
536 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
540 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
541 registry.insert<llzk::LLZKDialect>();
542 registry.insert<llzk::boolean::BoolDialect>();
543 registry.insert<llzk::array::ArrayDialect>();
544 registry.insert<llzk::component::StructDialect>();
545 registry.insert<llzk::constrain::ConstrainDialect>();
546 registry.insert<llzk::felt::FeltDialect>();
547 registry.insert<llzk::global::GlobalDialect>();
548 registry.insert<llzk::include::IncludeDialect>();
549 registry.insert<llzk::function::FunctionDialect>();
550 registry.insert<llzk::string::StringDialect>();
551 registry.insert<llzk::polymorphic::PolymorphicDialect>();
552 registry.insert<mlir::arith::ArithDialect>();
553 registry.insert<mlir::scf::SCFDialect>();
559 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EmptyTemplateRemovalPassBase<DerivedT>)
564template <
typename DerivedT>
565class FlatteningPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
567 using Base = FlatteningPassBase;
569 FlatteningPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
570 FlatteningPassBase(
const FlatteningPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
571 FlatteningPassBase& operator=(
const FlatteningPassBase &) =
delete;
572 FlatteningPassBase(FlatteningPassBase &&) =
delete;
573 FlatteningPassBase& operator=(FlatteningPassBase &&) =
delete;
574 ~FlatteningPassBase() =
default;
577 static constexpr ::llvm::StringLiteral getArgumentName() {
578 return ::llvm::StringLiteral(
"llzk-flatten");
580 ::llvm::StringRef getArgument()
const override {
return "llzk-flatten"; }
582 ::llvm::StringRef getDescription()
const override {
return "Flatten structs and unroll loops"; }
585 static constexpr ::llvm::StringLiteral getPassName() {
586 return ::llvm::StringLiteral(
"FlatteningPass");
588 ::llvm::StringRef getName()
const override {
return "FlatteningPass"; }
591 static bool classof(const ::mlir::Pass *pass) {
592 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
596 std::unique_ptr<::mlir::Pass> clonePass()
const override {
597 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
601 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
602 registry.insert<llzk::LLZKDialect>();
603 registry.insert<llzk::boolean::BoolDialect>();
604 registry.insert<llzk::array::ArrayDialect>();
605 registry.insert<llzk::component::StructDialect>();
606 registry.insert<llzk::constrain::ConstrainDialect>();
607 registry.insert<llzk::felt::FeltDialect>();
608 registry.insert<llzk::global::GlobalDialect>();
609 registry.insert<llzk::include::IncludeDialect>();
610 registry.insert<llzk::function::FunctionDialect>();
611 registry.insert<llzk::string::StringDialect>();
612 registry.insert<llzk::polymorphic::PolymorphicDialect>();
613 registry.insert<mlir::arith::ArithDialect>();
614 registry.insert<mlir::scf::SCFDialect>();
620 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FlatteningPassBase<DerivedT>)
623 ::mlir::Pass::Option<unsigned> iterationLimit{*
this,
"max-iter", ::llvm::cl::desc(
"Maximum number of times the pass will run if a fixpoint is not reached earlier. Unrolling loops can provide more opportunities for instantiating structs but the converse is true as well. Thus, the pass will run multiple times until no further changes can be made or the upper limit provided in this option is reached."), ::llvm::cl::init(1000)};
624 ::mlir::Pass::Option<::llzk::polymorphic::FlatteningCleanupMode> cleanupMode{*
this,
"cleanup", ::llvm::cl::desc(
"Specifies the extent to which unused parameterized definitions (i.e. structs or free functions within a `poly.template`) are removed during the flattening pass."), ::llvm::cl::init(
::llzk::polymorphic::FlatteningCleanupMode::Unspecified), ::llvm::cl::values(
627 "Use the cleanup mode specified by the calling pipeline (defaults to `preimage` if not specified)."),
630 "No definitions are deleted."),
633 "Only definitions that were replaced with concrete instantiations are deleted."),
636 "All definitions that cannot be reached by a use-def chain from some concrete definition are deleted."),
639 "All definitions that cannot be reached by a use-def chain from the \"Main\" struct are deleted.")
643template <
typename DerivedT>
644class TypeVarInferencePassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
646 using Base = TypeVarInferencePassBase;
648 TypeVarInferencePassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
649 TypeVarInferencePassBase(
const TypeVarInferencePassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
650 TypeVarInferencePassBase& operator=(
const TypeVarInferencePassBase &) =
delete;
651 TypeVarInferencePassBase(TypeVarInferencePassBase &&) =
delete;
652 TypeVarInferencePassBase& operator=(TypeVarInferencePassBase &&) =
delete;
653 ~TypeVarInferencePassBase() =
default;
656 static constexpr ::llvm::StringLiteral getArgumentName() {
657 return ::llvm::StringLiteral(
"llzk-infer-tvar");
659 ::llvm::StringRef getArgument()
const override {
return "llzk-infer-tvar"; }
661 ::llvm::StringRef getDescription()
const override {
return "Infer concrete function types for polymorphic type variables"; }
664 static constexpr ::llvm::StringLiteral getPassName() {
665 return ::llvm::StringLiteral(
"TypeVarInferencePass");
667 ::llvm::StringRef getName()
const override {
return "TypeVarInferencePass"; }
670 static bool classof(const ::mlir::Pass *pass) {
671 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
675 std::unique_ptr<::mlir::Pass> clonePass()
const override {
676 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
680 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
681 registry.insert<llzk::LLZKDialect>();
682 registry.insert<llzk::boolean::BoolDialect>();
683 registry.insert<llzk::array::ArrayDialect>();
684 registry.insert<llzk::component::StructDialect>();
685 registry.insert<llzk::constrain::ConstrainDialect>();
686 registry.insert<llzk::felt::FeltDialect>();
687 registry.insert<llzk::global::GlobalDialect>();
688 registry.insert<llzk::include::IncludeDialect>();
689 registry.insert<llzk::function::FunctionDialect>();
690 registry.insert<llzk::string::StringDialect>();
691 registry.insert<llzk::polymorphic::PolymorphicDialect>();
692 registry.insert<mlir::arith::ArithDialect>();
693 registry.insert<mlir::scf::SCFDialect>();
699 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TypeVarInferencePassBase<DerivedT>)
704template <
typename DerivedT>
705class WildcardArraySpecializationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
707 using Base = WildcardArraySpecializationPassBase;
709 WildcardArraySpecializationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
710 WildcardArraySpecializationPassBase(
const WildcardArraySpecializationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
711 WildcardArraySpecializationPassBase& operator=(
const WildcardArraySpecializationPassBase &) =
delete;
712 WildcardArraySpecializationPassBase(WildcardArraySpecializationPassBase &&) =
delete;
713 WildcardArraySpecializationPassBase& operator=(WildcardArraySpecializationPassBase &&) =
delete;
714 ~WildcardArraySpecializationPassBase() =
default;
717 static constexpr ::llvm::StringLiteral getArgumentName() {
718 return ::llvm::StringLiteral(
"llzk-specialize-wildcard-arrays");
720 ::llvm::StringRef getArgument()
const override {
return "llzk-specialize-wildcard-arrays"; }
722 ::llvm::StringRef getDescription()
const override {
return "Refine wildcard array casts and specialize concrete call targets"; }
725 static constexpr ::llvm::StringLiteral getPassName() {
726 return ::llvm::StringLiteral(
"WildcardArraySpecializationPass");
728 ::llvm::StringRef getName()
const override {
return "WildcardArraySpecializationPass"; }
731 static bool classof(const ::mlir::Pass *pass) {
732 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
736 std::unique_ptr<::mlir::Pass> clonePass()
const override {
737 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
741 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
742 registry.insert<llzk::LLZKDialect>();
743 registry.insert<llzk::boolean::BoolDialect>();
744 registry.insert<llzk::array::ArrayDialect>();
745 registry.insert<llzk::component::StructDialect>();
746 registry.insert<llzk::constrain::ConstrainDialect>();
747 registry.insert<llzk::felt::FeltDialect>();
748 registry.insert<llzk::global::GlobalDialect>();
749 registry.insert<llzk::include::IncludeDialect>();
750 registry.insert<llzk::function::FunctionDialect>();
751 registry.insert<llzk::string::StringDialect>();
752 registry.insert<llzk::polymorphic::PolymorphicDialect>();
753 registry.insert<mlir::arith::ArithDialect>();
754 registry.insert<mlir::scf::SCFDialect>();
760 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(WildcardArraySpecializationPassBase<DerivedT>)
763 ::mlir::Pass::Option<unsigned> iterationLimit{*
this,
"max-iter", ::llvm::cl::desc(
"Maximum number of iterations before the pass gives up reaching a fixpoint."), ::llvm::cl::init(1000)};
765#undef GEN_PASS_CLASSES
void registerTransformationPasses()
std::unique_ptr<::mlir::Pass > createEmptyTemplateRemovalPass()
std::unique_ptr<::mlir::Pass > createFlatteningPass()
std::unique_ptr<::mlir::Pass > createWildcardArraySpecializationPass()
std::unique_ptr<::mlir::Pass > createTypeVarInferencePass()
void registerFlatteningPass()
void registerTypeVarInferencePassPass()
::llvm::StringRef stringifyFlatteningCleanupMode(FlatteningCleanupMode val)
void registerEmptyTemplateRemovalPass()
void registerTypeVarInferencePass()
void registerFlatteningPassPass()
void registerWildcardArraySpecializationPass()
void registerEmptyTemplateRemovalPassPass()
void registerWildcardArraySpecializationPassPass()