5#define GEN_PASS_DECL_POLYLOWERINGPASS
6#define GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
7#define GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
8#define GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
15#ifdef GEN_PASS_DECL_POLYLOWERINGPASS
16struct PolyLoweringPassOptions {
17 unsigned maxDegree = 2;
19#undef GEN_PASS_DECL_POLYLOWERINGPASS
21#ifdef GEN_PASS_DEF_POLYLOWERINGPASS
24template <
typename DerivedT>
25class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
27 using Base = PolyLoweringPassBase;
29 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
30 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
33 static constexpr ::llvm::StringLiteral getArgumentName() {
34 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
36 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
38 ::llvm::StringRef getDescription()
const override {
return "Lowers the degree of all polynomial equations to a specified maximum"; }
41 static constexpr ::llvm::StringLiteral getPassName() {
42 return ::llvm::StringLiteral(
"PolyLoweringPass");
44 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
47 static bool classof(const ::mlir::Pass *pass) {
48 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
52 std::unique_ptr<::mlir::Pass> clonePass()
const override {
53 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
57 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
58 registry.insert<llzk::LLZKDialect>();
59 registry.insert<llzk::boolean::BoolDialect>();
60 registry.insert<llzk::array::ArrayDialect>();
61 registry.insert<llzk::component::StructDialect>();
62 registry.insert<llzk::constrain::ConstrainDialect>();
63 registry.insert<llzk::felt::FeltDialect>();
64 registry.insert<llzk::global::GlobalDialect>();
65 registry.insert<llzk::include::IncludeDialect>();
66 registry.insert<llzk::function::FunctionDialect>();
67 registry.insert<llzk::string::StringDialect>();
68 registry.insert<llzk::polymorphic::PolymorphicDialect>();
69 registry.insert<llzk::undef::UndefDialect>();
70 registry.insert<mlir::arith::ArithDialect>();
71 registry.insert<mlir::scf::SCFDialect>();
77 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
79 PolyLoweringPassBase(
const PolyLoweringPassOptions &options) : PolyLoweringPassBase() {
80 maxDegree = options.maxDegree;
83 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
87#undef GEN_PASS_DEF_POLYLOWERINGPASS
93#ifdef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
94#undef GEN_PASS_DECL_REDUNDANTOPERATIONELIMINATIONPASS
96#ifdef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
99template <
typename DerivedT>
100class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
102 using Base = RedundantOperationEliminationPassBase;
104 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
105 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
108 static constexpr ::llvm::StringLiteral getArgumentName() {
109 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
111 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
113 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
116 static constexpr ::llvm::StringLiteral getPassName() {
117 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
119 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
122 static bool classof(const ::mlir::Pass *pass) {
123 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
127 std::unique_ptr<::mlir::Pass> clonePass()
const override {
128 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
132 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
133 registry.insert<llzk::LLZKDialect>();
134 registry.insert<llzk::boolean::BoolDialect>();
135 registry.insert<llzk::array::ArrayDialect>();
136 registry.insert<llzk::component::StructDialect>();
137 registry.insert<llzk::constrain::ConstrainDialect>();
138 registry.insert<llzk::felt::FeltDialect>();
139 registry.insert<llzk::global::GlobalDialect>();
140 registry.insert<llzk::include::IncludeDialect>();
141 registry.insert<llzk::function::FunctionDialect>();
142 registry.insert<llzk::string::StringDialect>();
143 registry.insert<llzk::polymorphic::PolymorphicDialect>();
144 registry.insert<llzk::undef::UndefDialect>();
145 registry.insert<mlir::arith::ArithDialect>();
146 registry.insert<mlir::scf::SCFDialect>();
152 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
158#undef GEN_PASS_DEF_REDUNDANTOPERATIONELIMINATIONPASS
164#ifdef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
165#undef GEN_PASS_DECL_REDUNDANTREADANDWRITEELIMINATIONPASS
167#ifdef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
170template <
typename DerivedT>
171class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
173 using Base = RedundantReadAndWriteEliminationPassBase;
175 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
176 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
179 static constexpr ::llvm::StringLiteral getArgumentName() {
180 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
182 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
184 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
187 static constexpr ::llvm::StringLiteral getPassName() {
188 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
190 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
193 static bool classof(const ::mlir::Pass *pass) {
194 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
198 std::unique_ptr<::mlir::Pass> clonePass()
const override {
199 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
203 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
204 registry.insert<llzk::LLZKDialect>();
205 registry.insert<llzk::boolean::BoolDialect>();
206 registry.insert<llzk::array::ArrayDialect>();
207 registry.insert<llzk::component::StructDialect>();
208 registry.insert<llzk::constrain::ConstrainDialect>();
209 registry.insert<llzk::felt::FeltDialect>();
210 registry.insert<llzk::global::GlobalDialect>();
211 registry.insert<llzk::include::IncludeDialect>();
212 registry.insert<llzk::function::FunctionDialect>();
213 registry.insert<llzk::string::StringDialect>();
214 registry.insert<llzk::polymorphic::PolymorphicDialect>();
215 registry.insert<llzk::undef::UndefDialect>();
216 registry.insert<mlir::arith::ArithDialect>();
217 registry.insert<mlir::scf::SCFDialect>();
223 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
229#undef GEN_PASS_DEF_REDUNDANTREADANDWRITEELIMINATIONPASS
235#ifdef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
236struct UnusedDeclarationEliminationPassOptions {
237 bool removeStructs =
false;
239#undef GEN_PASS_DECL_UNUSEDDECLARATIONELIMINATIONPASS
241#ifdef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
244template <
typename DerivedT>
245class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
247 using Base = UnusedDeclarationEliminationPassBase;
249 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
250 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
253 static constexpr ::llvm::StringLiteral getArgumentName() {
254 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
256 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
258 ::llvm::StringRef getDescription()
const override {
return "Remove unused field and struct declarations"; }
261 static constexpr ::llvm::StringLiteral getPassName() {
262 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
264 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
267 static bool classof(const ::mlir::Pass *pass) {
268 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
272 std::unique_ptr<::mlir::Pass> clonePass()
const override {
273 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
277 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
278 registry.insert<llzk::LLZKDialect>();
279 registry.insert<llzk::boolean::BoolDialect>();
280 registry.insert<llzk::array::ArrayDialect>();
281 registry.insert<llzk::component::StructDialect>();
282 registry.insert<llzk::constrain::ConstrainDialect>();
283 registry.insert<llzk::felt::FeltDialect>();
284 registry.insert<llzk::global::GlobalDialect>();
285 registry.insert<llzk::include::IncludeDialect>();
286 registry.insert<llzk::function::FunctionDialect>();
287 registry.insert<llzk::string::StringDialect>();
288 registry.insert<llzk::polymorphic::PolymorphicDialect>();
289 registry.insert<llzk::undef::UndefDialect>();
290 registry.insert<mlir::arith::ArithDialect>();
291 registry.insert<mlir::scf::SCFDialect>();
297 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
299 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassOptions &options) : UnusedDeclarationEliminationPassBase() {
300 removeStructs = options.removeStructs;
303 ::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)};
307#undef GEN_PASS_DEF_UNUSEDDECLARATIONELIMINATIONPASS
309#ifdef GEN_PASS_REGISTRATION
316 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
323 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
333 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
340 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
350 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
357 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
367 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
374 ::mlir::registerPass([]() -> std::unique_ptr<::mlir::Pass> {
389#undef GEN_PASS_REGISTRATION
392#ifdef GEN_PASS_CLASSES
394template <
typename DerivedT>
395class PolyLoweringPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
397 using Base = PolyLoweringPassBase;
399 PolyLoweringPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
400 PolyLoweringPassBase(
const PolyLoweringPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
403 static constexpr ::llvm::StringLiteral getArgumentName() {
404 return ::llvm::StringLiteral(
"llzk-poly-lowering-pass");
406 ::llvm::StringRef getArgument()
const override {
return "llzk-poly-lowering-pass"; }
408 ::llvm::StringRef getDescription()
const override {
return "Lowers the degree of all polynomial equations to a specified maximum"; }
411 static constexpr ::llvm::StringLiteral getPassName() {
412 return ::llvm::StringLiteral(
"PolyLoweringPass");
414 ::llvm::StringRef getName()
const override {
return "PolyLoweringPass"; }
417 static bool classof(const ::mlir::Pass *pass) {
418 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
422 std::unique_ptr<::mlir::Pass> clonePass()
const override {
423 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
427 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
428 registry.insert<llzk::LLZKDialect>();
429 registry.insert<llzk::boolean::BoolDialect>();
430 registry.insert<llzk::array::ArrayDialect>();
431 registry.insert<llzk::component::StructDialect>();
432 registry.insert<llzk::constrain::ConstrainDialect>();
433 registry.insert<llzk::felt::FeltDialect>();
434 registry.insert<llzk::global::GlobalDialect>();
435 registry.insert<llzk::include::IncludeDialect>();
436 registry.insert<llzk::function::FunctionDialect>();
437 registry.insert<llzk::string::StringDialect>();
438 registry.insert<llzk::polymorphic::PolymorphicDialect>();
439 registry.insert<llzk::undef::UndefDialect>();
440 registry.insert<mlir::arith::ArithDialect>();
441 registry.insert<mlir::scf::SCFDialect>();
447 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(PolyLoweringPassBase<DerivedT>)
450 ::mlir::Pass::Option<unsigned> maxDegree{*
this,
"max-degree", ::llvm::cl::desc(
"Maximum degree of constraint polynomials (default 2, minimum 2)"), ::llvm::cl::init(2)};
453template <
typename DerivedT>
454class RedundantOperationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
456 using Base = RedundantOperationEliminationPassBase;
458 RedundantOperationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
459 RedundantOperationEliminationPassBase(
const RedundantOperationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
462 static constexpr ::llvm::StringLiteral getArgumentName() {
463 return ::llvm::StringLiteral(
"llzk-duplicate-op-elim");
465 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-op-elim"; }
467 ::llvm::StringRef getDescription()
const override {
return "Remove redundant operations"; }
470 static constexpr ::llvm::StringLiteral getPassName() {
471 return ::llvm::StringLiteral(
"RedundantOperationEliminationPass");
473 ::llvm::StringRef getName()
const override {
return "RedundantOperationEliminationPass"; }
476 static bool classof(const ::mlir::Pass *pass) {
477 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
481 std::unique_ptr<::mlir::Pass> clonePass()
const override {
482 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
486 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
487 registry.insert<llzk::LLZKDialect>();
488 registry.insert<llzk::boolean::BoolDialect>();
489 registry.insert<llzk::array::ArrayDialect>();
490 registry.insert<llzk::component::StructDialect>();
491 registry.insert<llzk::constrain::ConstrainDialect>();
492 registry.insert<llzk::felt::FeltDialect>();
493 registry.insert<llzk::global::GlobalDialect>();
494 registry.insert<llzk::include::IncludeDialect>();
495 registry.insert<llzk::function::FunctionDialect>();
496 registry.insert<llzk::string::StringDialect>();
497 registry.insert<llzk::polymorphic::PolymorphicDialect>();
498 registry.insert<llzk::undef::UndefDialect>();
499 registry.insert<mlir::arith::ArithDialect>();
500 registry.insert<mlir::scf::SCFDialect>();
506 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantOperationEliminationPassBase<DerivedT>)
511template <
typename DerivedT>
512class RedundantReadAndWriteEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
514 using Base = RedundantReadAndWriteEliminationPassBase;
516 RedundantReadAndWriteEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
517 RedundantReadAndWriteEliminationPassBase(
const RedundantReadAndWriteEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
520 static constexpr ::llvm::StringLiteral getArgumentName() {
521 return ::llvm::StringLiteral(
"llzk-duplicate-read-write-elim");
523 ::llvm::StringRef getArgument()
const override {
return "llzk-duplicate-read-write-elim"; }
525 ::llvm::StringRef getDescription()
const override {
return "Remove redundant reads and writes"; }
528 static constexpr ::llvm::StringLiteral getPassName() {
529 return ::llvm::StringLiteral(
"RedundantReadAndWriteEliminationPass");
531 ::llvm::StringRef getName()
const override {
return "RedundantReadAndWriteEliminationPass"; }
534 static bool classof(const ::mlir::Pass *pass) {
535 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
539 std::unique_ptr<::mlir::Pass> clonePass()
const override {
540 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
544 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
545 registry.insert<llzk::LLZKDialect>();
546 registry.insert<llzk::boolean::BoolDialect>();
547 registry.insert<llzk::array::ArrayDialect>();
548 registry.insert<llzk::component::StructDialect>();
549 registry.insert<llzk::constrain::ConstrainDialect>();
550 registry.insert<llzk::felt::FeltDialect>();
551 registry.insert<llzk::global::GlobalDialect>();
552 registry.insert<llzk::include::IncludeDialect>();
553 registry.insert<llzk::function::FunctionDialect>();
554 registry.insert<llzk::string::StringDialect>();
555 registry.insert<llzk::polymorphic::PolymorphicDialect>();
556 registry.insert<llzk::undef::UndefDialect>();
557 registry.insert<mlir::arith::ArithDialect>();
558 registry.insert<mlir::scf::SCFDialect>();
564 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(RedundantReadAndWriteEliminationPassBase<DerivedT>)
569template <
typename DerivedT>
570class UnusedDeclarationEliminationPassBase :
public ::mlir::OperationPass<::mlir::ModuleOp> {
572 using Base = UnusedDeclarationEliminationPassBase;
574 UnusedDeclarationEliminationPassBase() : ::mlir::OperationPass<::mlir::ModuleOp>(::mlir::TypeID::get<DerivedT>()) {}
575 UnusedDeclarationEliminationPassBase(
const UnusedDeclarationEliminationPassBase &other) : ::mlir::OperationPass<::mlir::ModuleOp>(other) {}
578 static constexpr ::llvm::StringLiteral getArgumentName() {
579 return ::llvm::StringLiteral(
"llzk-unused-declaration-elim");
581 ::llvm::StringRef getArgument()
const override {
return "llzk-unused-declaration-elim"; }
583 ::llvm::StringRef getDescription()
const override {
return "Remove unused field and struct declarations"; }
586 static constexpr ::llvm::StringLiteral getPassName() {
587 return ::llvm::StringLiteral(
"UnusedDeclarationEliminationPass");
589 ::llvm::StringRef getName()
const override {
return "UnusedDeclarationEliminationPass"; }
592 static bool classof(const ::mlir::Pass *pass) {
593 return pass->getTypeID() == ::mlir::TypeID::get<DerivedT>();
597 std::unique_ptr<::mlir::Pass> clonePass()
const override {
598 return std::make_unique<DerivedT>(*
static_cast<const DerivedT *
>(
this));
602 void getDependentDialects(::mlir::DialectRegistry ®istry)
const override {
603 registry.insert<llzk::LLZKDialect>();
604 registry.insert<llzk::boolean::BoolDialect>();
605 registry.insert<llzk::array::ArrayDialect>();
606 registry.insert<llzk::component::StructDialect>();
607 registry.insert<llzk::constrain::ConstrainDialect>();
608 registry.insert<llzk::felt::FeltDialect>();
609 registry.insert<llzk::global::GlobalDialect>();
610 registry.insert<llzk::include::IncludeDialect>();
611 registry.insert<llzk::function::FunctionDialect>();
612 registry.insert<llzk::string::StringDialect>();
613 registry.insert<llzk::polymorphic::PolymorphicDialect>();
614 registry.insert<llzk::undef::UndefDialect>();
615 registry.insert<mlir::arith::ArithDialect>();
616 registry.insert<mlir::scf::SCFDialect>();
622 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(UnusedDeclarationEliminationPassBase<DerivedT>)
625 ::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)};
627#undef GEN_PASS_CLASSES
void registerTransformationPasses()
void registerUnusedDeclarationEliminationPassPass()
std::unique_ptr< mlir::Pass > createRedundantOperationEliminationPass()
void registerRedundantOperationEliminationPass()
void registerPolyLoweringPassPass()
void registerUnusedDeclarationEliminationPass()
void registerRedundantOperationEliminationPassPass()
std::unique_ptr< mlir::Pass > createRedundantReadAndWriteEliminationPass()
std::unique_ptr< mlir::Pass > createUnusedDeclarationEliminationPass()
std::unique_ptr< mlir::Pass > createPolyLoweringPass()
void registerRedundantReadAndWriteEliminationPass()
void registerPolyLoweringPass()
void registerRedundantReadAndWriteEliminationPassPass()