5#define GEN_PASS_DECL_EMPTYPARAMLISTREMOVALPASS
6#define GEN_PASS_DECL_FLATTENINGPASS
13#ifdef GEN_PASS_DECL_EMPTYPARAMLISTREMOVALPASS
14#undef GEN_PASS_DECL_EMPTYPARAMLISTREMOVALPASS
16#ifdef GEN_PASS_DEF_EMPTYPARAMLISTREMOVALPASS
19template <
typename DerivedT>
20class EmptyParamListRemovalPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
22 using Base = EmptyParamListRemovalPassBase;
24 EmptyParamListRemovalPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
25 EmptyParamListRemovalPassBase(
const EmptyParamListRemovalPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
28 static constexpr ::llvm::StringLiteral getArgumentName() {
29 return ::llvm::StringLiteral(
"llzk-drop-empty-params");
31 ::llvm::StringRef getArgument()
const override {
return "llzk-drop-empty-params"; }
33 ::llvm::StringRef getDescription()
const override {
return "Remove empty struct parameter lists"; }
36 static constexpr ::llvm::StringLiteral getPassName() {
37 return ::llvm::StringLiteral(
"EmptyParamListRemovalPass");
39 ::llvm::StringRef getName()
const override {
return "EmptyParamListRemovalPass"; }
42 static bool classof(const ::mlir::Pass *pass) {
43 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
47 std::unique_ptr<::mlir::Pass> clonePass()
const override {
48 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
52 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
53 registry.insert<llzk::LLZKDialect>();
54 registry.insert<llzk::boolean::BoolDialect>();
55 registry.insert<llzk::array::ArrayDialect>();
56 registry.insert<llzk::component::StructDialect>();
57 registry.insert<llzk::constrain::ConstrainDialect>();
58 registry.insert<llzk::felt::FeltDialect>();
59 registry.insert<llzk::global::GlobalDialect>();
60 registry.insert<llzk::include::IncludeDialect>();
61 registry.insert<llzk::function::FunctionDialect>();
62 registry.insert<llzk::string::StringDialect>();
63 registry.insert<llzk::polymorphic::PolymorphicDialect>();
64 registry.insert<llzk::undef::UndefDialect>();
65 registry.insert<mlir::arith::ArithDialect>();
66 registry.insert<mlir::scf::SCFDialect>();
72 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EmptyParamListRemovalPassBase<DerivedT>)
78#undef GEN_PASS_DEF_EMPTYPARAMLISTREMOVALPASS
84#ifdef GEN_PASS_DECL_FLATTENINGPASS
85struct FlatteningPassOptions {
86 unsigned iterationLimit = 1000;
89#undef GEN_PASS_DECL_FLATTENINGPASS
91#ifdef GEN_PASS_DEF_FLATTENINGPASS
94template <
typename DerivedT>
95class FlatteningPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
97 using Base = FlatteningPassBase;
99 FlatteningPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
100 FlatteningPassBase(
const FlatteningPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
103 static constexpr ::llvm::StringLiteral getArgumentName() {
104 return ::llvm::StringLiteral(
"llzk-flatten");
106 ::llvm::StringRef getArgument()
const override {
return "llzk-flatten"; }
108 ::llvm::StringRef getDescription()
const override {
return "Flatten structs and unroll loops"; }
111 static constexpr ::llvm::StringLiteral getPassName() {
112 return ::llvm::StringLiteral(
"FlatteningPass");
114 ::llvm::StringRef getName()
const override {
return "FlatteningPass"; }
117 static bool classof(const ::mlir::Pass *pass) {
118 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
122 std::unique_ptr<::mlir::Pass> clonePass()
const override {
123 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
127 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
128 registry.insert<llzk::LLZKDialect>();
129 registry.insert<llzk::boolean::BoolDialect>();
130 registry.insert<llzk::array::ArrayDialect>();
131 registry.insert<llzk::component::StructDialect>();
132 registry.insert<llzk::constrain::ConstrainDialect>();
133 registry.insert<llzk::felt::FeltDialect>();
134 registry.insert<llzk::global::GlobalDialect>();
135 registry.insert<llzk::include::IncludeDialect>();
136 registry.insert<llzk::function::FunctionDialect>();
137 registry.insert<llzk::string::StringDialect>();
138 registry.insert<llzk::polymorphic::PolymorphicDialect>();
139 registry.insert<llzk::undef::UndefDialect>();
140 registry.insert<mlir::arith::ArithDialect>();
141 registry.insert<mlir::scf::SCFDialect>();
147 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FlatteningPassBase<DerivedT>)
149 FlatteningPassBase(
const FlatteningPassOptions &options) : FlatteningPassBase() {
150 iterationLimit = options.iterationLimit;
151 cleanupMode = options.cleanupMode;
154 ::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)};
155 ::mlir::Pass::Option<::llzk::polymorphic::StructCleanupMode> cleanupMode{*
this,
"cleanup", ::llvm::cl::desc(
"Specifies the extent to which unused parameterized structs are removed during the flattening pass."), ::llvm::cl::init(
::llzk::polymorphic::StructCleanupMode::Preimage), ::llvm::cl::values(
160 "Only structs that were replaced with concrete instantiations are deleted."),
163 "All structs that cannot be reached by a use-def chain from some concrete struct are deleted."),
166 "All structs that cannot be reached by a use-def chain from the \"Main\" struct are deleted.")
171#undef GEN_PASS_DEF_FLATTENINGPASS
173#ifdef GEN_PASS_REGISTRATION
180 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
187 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
197 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
204 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
217#undef GEN_PASS_REGISTRATION
220#ifdef GEN_PASS_CLASSES
222template <
typename DerivedT>
223class EmptyParamListRemovalPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
225 using Base = EmptyParamListRemovalPassBase;
227 EmptyParamListRemovalPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
228 EmptyParamListRemovalPassBase(
const EmptyParamListRemovalPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
231 static constexpr ::llvm::StringLiteral getArgumentName() {
232 return ::llvm::StringLiteral(
"llzk-drop-empty-params");
234 ::llvm::StringRef getArgument()
const override {
return "llzk-drop-empty-params"; }
236 ::llvm::StringRef getDescription()
const override {
return "Remove empty struct parameter lists"; }
239 static constexpr ::llvm::StringLiteral getPassName() {
240 return ::llvm::StringLiteral(
"EmptyParamListRemovalPass");
242 ::llvm::StringRef getName()
const override {
return "EmptyParamListRemovalPass"; }
245 static bool classof(const ::mlir::Pass *pass) {
246 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
250 std::unique_ptr<::mlir::Pass> clonePass()
const override {
251 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
255 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
256 registry.insert<llzk::LLZKDialect>();
257 registry.insert<llzk::boolean::BoolDialect>();
258 registry.insert<llzk::array::ArrayDialect>();
259 registry.insert<llzk::component::StructDialect>();
260 registry.insert<llzk::constrain::ConstrainDialect>();
261 registry.insert<llzk::felt::FeltDialect>();
262 registry.insert<llzk::global::GlobalDialect>();
263 registry.insert<llzk::include::IncludeDialect>();
264 registry.insert<llzk::function::FunctionDialect>();
265 registry.insert<llzk::string::StringDialect>();
266 registry.insert<llzk::polymorphic::PolymorphicDialect>();
267 registry.insert<llzk::undef::UndefDialect>();
268 registry.insert<mlir::arith::ArithDialect>();
269 registry.insert<mlir::scf::SCFDialect>();
275 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EmptyParamListRemovalPassBase<DerivedT>)
280template <
typename DerivedT>
281class FlatteningPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
283 using Base = FlatteningPassBase;
285 FlatteningPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
286 FlatteningPassBase(
const FlatteningPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
289 static constexpr ::llvm::StringLiteral getArgumentName() {
290 return ::llvm::StringLiteral(
"llzk-flatten");
292 ::llvm::StringRef getArgument()
const override {
return "llzk-flatten"; }
294 ::llvm::StringRef getDescription()
const override {
return "Flatten structs and unroll loops"; }
297 static constexpr ::llvm::StringLiteral getPassName() {
298 return ::llvm::StringLiteral(
"FlatteningPass");
300 ::llvm::StringRef getName()
const override {
return "FlatteningPass"; }
303 static bool classof(const ::mlir::Pass *pass) {
304 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
308 std::unique_ptr<::mlir::Pass> clonePass()
const override {
309 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
313 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
314 registry.insert<llzk::LLZKDialect>();
315 registry.insert<llzk::boolean::BoolDialect>();
316 registry.insert<llzk::array::ArrayDialect>();
317 registry.insert<llzk::component::StructDialect>();
318 registry.insert<llzk::constrain::ConstrainDialect>();
319 registry.insert<llzk::felt::FeltDialect>();
320 registry.insert<llzk::global::GlobalDialect>();
321 registry.insert<llzk::include::IncludeDialect>();
322 registry.insert<llzk::function::FunctionDialect>();
323 registry.insert<llzk::string::StringDialect>();
324 registry.insert<llzk::polymorphic::PolymorphicDialect>();
325 registry.insert<llzk::undef::UndefDialect>();
326 registry.insert<mlir::arith::ArithDialect>();
327 registry.insert<mlir::scf::SCFDialect>();
333 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FlatteningPassBase<DerivedT>)
336 ::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)};
337 ::mlir::Pass::Option<::llzk::polymorphic::StructCleanupMode> cleanupMode{*
this,
"cleanup", ::llvm::cl::desc(
"Specifies the extent to which unused parameterized structs are removed during the flattening pass."), ::llvm::cl::init(
::llzk::polymorphic::StructCleanupMode::Preimage), ::llvm::cl::values(
342 "Only structs that were replaced with concrete instantiations are deleted."),
345 "All structs that cannot be reached by a use-def chain from some concrete struct are deleted."),
348 "All structs that cannot be reached by a use-def chain from the \"Main\" struct are deleted.")
351#undef GEN_PASS_CLASSES
void registerTransformationPasses()
void registerFlatteningPass()
void registerEmptyParamListRemovalPassPass()
std::unique_ptr< mlir::Pass > createFlatteningPass()
void registerFlatteningPassPass()
std::unique_ptr< mlir::Pass > createEmptyParamListRemoval()
::llvm::StringRef stringifyStructCleanupMode(StructCleanupMode val)
void registerEmptyParamListRemovalPass()