72 :
public mlir::PassWrapper<RemoveDeadValuesWorkaroundPass, mlir::OperationPass<>> {
77 llvm::StringRef
getDescription()
const override {
return "Remove dead values"; }
81 getOperation()->walk([](mlir::scf::IfOp ifOp) {
82 if (ifOp.getElseRegion().empty()) {
83 mlir::Block &elseBlock = ifOp.getElseRegion().emplaceBlock();
84 mlir::OpBuilder builder(ifOp.getContext());
85 builder.setInsertionPointToEnd(&elseBlock);
86 builder.create<mlir::scf::YieldOp>(ifOp.getLoc());
90 mlir::OpPassManager pm(getOperation()->getName().getStringRef());
91 pm.addPass(mlir::createRemoveDeadValuesPass());
92 if (mlir::failed(runPipeline(pm, getOperation()))) {
97 getOperation()->walk([](mlir::scf::IfOp ifOp) {
98 if (ifOp.getResults().empty()) {
99 mlir::Region &elseRegion = ifOp.getElseRegion();
100 if (!llvm::hasSingleElement(elseRegion)) {
103 mlir::Block &elseBlock = elseRegion.front();
104 if (!llvm::hasSingleElement(elseBlock)) {
107 if (!llvm::isa<mlir::scf::YieldOp>(elseBlock.front())) {
110 elseRegion.dropAllReferences();
112 elseRegion.getBlocks().clear();
118inline static void registerTransformsPasses() {
120 mlir::registerCanonicalizer();
121 mlir::registerCompositeFixedPointPass();
122 mlir::registerControlFlowSink();
123 mlir::registerGenerateRuntimeVerification();
124 mlir::registerInliner();
125 mlir::registerLocationSnapshot();
126 mlir::registerLoopInvariantCodeMotion();
127 mlir::registerLoopInvariantSubsetHoisting();
128 mlir::registerMem2Reg();
129 mlir::registerPrintIRPass();
130 mlir::registerPrintOpStats();
131 mlir::registerPass([]() -> std::unique_ptr<mlir::Pass> {
132 return std::make_unique<RemoveDeadValuesWorkaroundPass>();
134 mlir::registerSCCP();
135 mlir::registerSROA();
136 mlir::registerStripDebugInfo();
137 mlir::registerSymbolDCE();
138 mlir::registerSymbolPrivatize();
139 mlir::registerTopologicalSort();
140 mlir::registerViewOpGraph();
145int main(
int argc,
char **argv) {
146 llvm::sys::PrintStackTraceOnErrorSignal(llvm::StringRef());
147 llvm::setBugReportMsg(
149 " and include the crash backtrace, relevant LLZK files,"
150 " and associated run script(s).\n"
152 llvm::cl::AddExtraVersionPrinter([](llvm::raw_ostream &os) {
157 mlir::DialectRegistry registry;
159 mlir_hotfix::registerTransformsPasses();
161 r1cs::registerAllDialects(registry);
162 zklean::registerAllDialects(registry);
163 mlir::func::registerInlinerExtension(registry);
165 pcl::registerAllDialects(registry);
175 r1cs::registerTransformationPasses();
176 zklean::registerConversionPasses();
177 zklean::registerZKLeanPasses();
179 pcl::registerTransformationPasses();
180 pcl::conversion::registerPCLTransformationPasses();
184 r1cs::registerTransformationPassPipelines();
185 llzk::smt::registerConversionPasses();
188 std::string inputFilename, outputFilename;
189 std::tie(inputFilename, outputFilename) =
190 registerAndParseCLIOptions(argc, argv,
"llzk-opt", registry);
193 mlir::MLIRContext context;
194 context.appendDialectRegistry(registry);
195 context.loadAllAvailableDialects();
196 llvm::outs() <<
"All ops registered in LLZK IR: {\n";
197 for (
const auto &opName : context.getRegisteredOperations()) {
198 llvm::outs().indent(2) << opName.getStringRef() <<
'\n';
200 llvm::outs() <<
"}\n";
210 auto result = mlir::MlirOptMain(argc, argv, inputFilename, outputFilename, registry);
211 return mlir::asMainReturnCode(result);