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) {}
26 EmptyParamListRemovalPassBase& operator=(
const EmptyParamListRemovalPassBase &) =
delete;
27 EmptyParamListRemovalPassBase(EmptyParamListRemovalPassBase &&) =
delete;
28 EmptyParamListRemovalPassBase& operator=(EmptyParamListRemovalPassBase &&) =
delete;
29 ~EmptyParamListRemovalPassBase() =
default;
32 static constexpr ::llvm::StringLiteral getArgumentName() {
33 return ::llvm::StringLiteral(
"llzk-drop-empty-params");
35 ::llvm::StringRef getArgument()
const override {
return "llzk-drop-empty-params"; }
37 ::llvm::StringRef getDescription()
const override {
return "Remove empty struct parameter lists"; }
40 static constexpr ::llvm::StringLiteral getPassName() {
41 return ::llvm::StringLiteral(
"EmptyParamListRemovalPass");
43 ::llvm::StringRef getName()
const override {
return "EmptyParamListRemovalPass"; }
46 static bool classof(const ::mlir::Pass *pass) {
47 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
51 std::unique_ptr<::mlir::Pass> clonePass()
const override {
52 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
56 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
57 registry.insert<llzk::LLZKDialect>();
58 registry.insert<llzk::boolean::BoolDialect>();
59 registry.insert<llzk::array::ArrayDialect>();
60 registry.insert<llzk::component::StructDialect>();
61 registry.insert<llzk::constrain::ConstrainDialect>();
62 registry.insert<llzk::felt::FeltDialect>();
63 registry.insert<llzk::global::GlobalDialect>();
64 registry.insert<llzk::include::IncludeDialect>();
65 registry.insert<llzk::function::FunctionDialect>();
66 registry.insert<llzk::string::StringDialect>();
67 registry.insert<llzk::polymorphic::PolymorphicDialect>();
68 registry.insert<mlir::arith::ArithDialect>();
69 registry.insert<mlir::scf::SCFDialect>();
75 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EmptyParamListRemovalPassBase<DerivedT>)
81#undef GEN_PASS_DEF_EMPTYPARAMLISTREMOVALPASS
87#ifdef GEN_PASS_DECL_FLATTENINGPASS
88struct FlatteningPassOptions {
89 unsigned iterationLimit = 1000;
92#undef GEN_PASS_DECL_FLATTENINGPASS
94#ifdef GEN_PASS_DEF_FLATTENINGPASS
97template <
typename DerivedT>
98class FlatteningPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
100 using Base = FlatteningPassBase;
102 FlatteningPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
103 FlatteningPassBase(
const FlatteningPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
104 FlatteningPassBase& operator=(
const FlatteningPassBase &) =
delete;
105 FlatteningPassBase(FlatteningPassBase &&) =
delete;
106 FlatteningPassBase& operator=(FlatteningPassBase &&) =
delete;
107 ~FlatteningPassBase() =
default;
110 static constexpr ::llvm::StringLiteral getArgumentName() {
111 return ::llvm::StringLiteral(
"llzk-flatten");
113 ::llvm::StringRef getArgument()
const override {
return "llzk-flatten"; }
115 ::llvm::StringRef getDescription()
const override {
return "Flatten structs and unroll loops"; }
118 static constexpr ::llvm::StringLiteral getPassName() {
119 return ::llvm::StringLiteral(
"FlatteningPass");
121 ::llvm::StringRef getName()
const override {
return "FlatteningPass"; }
124 static bool classof(const ::mlir::Pass *pass) {
125 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
129 std::unique_ptr<::mlir::Pass> clonePass()
const override {
130 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
134 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
135 registry.insert<llzk::LLZKDialect>();
136 registry.insert<llzk::boolean::BoolDialect>();
137 registry.insert<llzk::array::ArrayDialect>();
138 registry.insert<llzk::component::StructDialect>();
139 registry.insert<llzk::constrain::ConstrainDialect>();
140 registry.insert<llzk::felt::FeltDialect>();
141 registry.insert<llzk::global::GlobalDialect>();
142 registry.insert<llzk::include::IncludeDialect>();
143 registry.insert<llzk::function::FunctionDialect>();
144 registry.insert<llzk::string::StringDialect>();
145 registry.insert<llzk::polymorphic::PolymorphicDialect>();
146 registry.insert<mlir::arith::ArithDialect>();
147 registry.insert<mlir::scf::SCFDialect>();
153 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FlatteningPassBase<DerivedT>)
155 FlatteningPassBase(FlatteningPassOptions options) : FlatteningPassBase() {
156 iterationLimit = std::move(options.iterationLimit);
157 cleanupMode = std::move(options.cleanupMode);
160 ::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)};
161 ::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(
166 "Only structs that were replaced with concrete instantiations are deleted."),
169 "All structs that cannot be reached by a use-def chain from some concrete struct are deleted."),
172 "All structs that cannot be reached by a use-def chain from the \"Main\" struct are deleted.")
177#undef GEN_PASS_DEF_FLATTENINGPASS
179#ifdef GEN_PASS_REGISTRATION
186 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
193 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
203 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
210 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
223#undef GEN_PASS_REGISTRATION
226#ifdef GEN_PASS_CLASSES
228template <
typename DerivedT>
229class EmptyParamListRemovalPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
231 using Base = EmptyParamListRemovalPassBase;
233 EmptyParamListRemovalPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
234 EmptyParamListRemovalPassBase(
const EmptyParamListRemovalPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
235 EmptyParamListRemovalPassBase& operator=(
const EmptyParamListRemovalPassBase &) =
delete;
236 EmptyParamListRemovalPassBase(EmptyParamListRemovalPassBase &&) =
delete;
237 EmptyParamListRemovalPassBase& operator=(EmptyParamListRemovalPassBase &&) =
delete;
238 ~EmptyParamListRemovalPassBase() =
default;
241 static constexpr ::llvm::StringLiteral getArgumentName() {
242 return ::llvm::StringLiteral(
"llzk-drop-empty-params");
244 ::llvm::StringRef getArgument()
const override {
return "llzk-drop-empty-params"; }
246 ::llvm::StringRef getDescription()
const override {
return "Remove empty struct parameter lists"; }
249 static constexpr ::llvm::StringLiteral getPassName() {
250 return ::llvm::StringLiteral(
"EmptyParamListRemovalPass");
252 ::llvm::StringRef getName()
const override {
return "EmptyParamListRemovalPass"; }
255 static bool classof(const ::mlir::Pass *pass) {
256 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
260 std::unique_ptr<::mlir::Pass> clonePass()
const override {
261 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
265 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
266 registry.insert<llzk::LLZKDialect>();
267 registry.insert<llzk::boolean::BoolDialect>();
268 registry.insert<llzk::array::ArrayDialect>();
269 registry.insert<llzk::component::StructDialect>();
270 registry.insert<llzk::constrain::ConstrainDialect>();
271 registry.insert<llzk::felt::FeltDialect>();
272 registry.insert<llzk::global::GlobalDialect>();
273 registry.insert<llzk::include::IncludeDialect>();
274 registry.insert<llzk::function::FunctionDialect>();
275 registry.insert<llzk::string::StringDialect>();
276 registry.insert<llzk::polymorphic::PolymorphicDialect>();
277 registry.insert<mlir::arith::ArithDialect>();
278 registry.insert<mlir::scf::SCFDialect>();
284 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(EmptyParamListRemovalPassBase<DerivedT>)
289template <
typename DerivedT>
290class FlatteningPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
292 using Base = FlatteningPassBase;
294 FlatteningPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
295 FlatteningPassBase(
const FlatteningPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
296 FlatteningPassBase& operator=(
const FlatteningPassBase &) =
delete;
297 FlatteningPassBase(FlatteningPassBase &&) =
delete;
298 FlatteningPassBase& operator=(FlatteningPassBase &&) =
delete;
299 ~FlatteningPassBase() =
default;
302 static constexpr ::llvm::StringLiteral getArgumentName() {
303 return ::llvm::StringLiteral(
"llzk-flatten");
305 ::llvm::StringRef getArgument()
const override {
return "llzk-flatten"; }
307 ::llvm::StringRef getDescription()
const override {
return "Flatten structs and unroll loops"; }
310 static constexpr ::llvm::StringLiteral getPassName() {
311 return ::llvm::StringLiteral(
"FlatteningPass");
313 ::llvm::StringRef getName()
const override {
return "FlatteningPass"; }
316 static bool classof(const ::mlir::Pass *pass) {
317 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
321 std::unique_ptr<::mlir::Pass> clonePass()
const override {
322 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
326 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
327 registry.insert<llzk::LLZKDialect>();
328 registry.insert<llzk::boolean::BoolDialect>();
329 registry.insert<llzk::array::ArrayDialect>();
330 registry.insert<llzk::component::StructDialect>();
331 registry.insert<llzk::constrain::ConstrainDialect>();
332 registry.insert<llzk::felt::FeltDialect>();
333 registry.insert<llzk::global::GlobalDialect>();
334 registry.insert<llzk::include::IncludeDialect>();
335 registry.insert<llzk::function::FunctionDialect>();
336 registry.insert<llzk::string::StringDialect>();
337 registry.insert<llzk::polymorphic::PolymorphicDialect>();
338 registry.insert<mlir::arith::ArithDialect>();
339 registry.insert<mlir::scf::SCFDialect>();
345 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(FlatteningPassBase<DerivedT>)
348 ::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)};
349 ::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(
354 "Only structs that were replaced with concrete instantiations are deleted."),
357 "All structs that cannot be reached by a use-def chain from some concrete struct are deleted."),
360 "All structs that cannot be reached by a use-def chain from the \"Main\" struct are deleted.")
363#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()