71 :
public mlir::PassWrapper<RemoveDeadValuesWorkaroundPass, mlir::OperationPass<>> {
76 llvm::StringRef
getDescription()
const override {
return "Remove dead values"; }
80 getOperation()->walk([](mlir::scf::IfOp ifOp) {
81 if (ifOp.getElseRegion().empty()) {
82 mlir::Block &elseBlock = ifOp.getElseRegion().emplaceBlock();
83 mlir::OpBuilder builder(ifOp.getContext());
84 builder.setInsertionPointToEnd(&elseBlock);
85 builder.create<mlir::scf::YieldOp>(ifOp.getLoc());
89 mlir::OpPassManager pm(getOperation()->getName().getStringRef());
90 pm.addPass(mlir::createRemoveDeadValuesPass());
91 if (mlir::failed(runPipeline(pm, getOperation()))) {
96 getOperation()->walk([](mlir::scf::IfOp ifOp) {
97 if (ifOp.getResults().empty()) {
98 mlir::Region &elseRegion = ifOp.getElseRegion();
99 if (!llvm::hasSingleElement(elseRegion)) {
102 mlir::Block &elseBlock = elseRegion.front();
103 if (!llvm::hasSingleElement(elseBlock)) {
106 if (!llvm::isa<mlir::scf::YieldOp>(elseBlock.front())) {
109 elseRegion.dropAllReferences();
111 elseRegion.getBlocks().clear();
117inline static void registerTransformsPasses() {
119 mlir::registerCanonicalizer();
120 mlir::registerCompositeFixedPointPass();
121 mlir::registerControlFlowSink();
122 mlir::registerGenerateRuntimeVerification();
123 mlir::registerInliner();
124 mlir::registerLocationSnapshot();
125 mlir::registerLoopInvariantCodeMotion();
126 mlir::registerLoopInvariantSubsetHoisting();
127 mlir::registerMem2Reg();
128 mlir::registerPrintIRPass();
129 mlir::registerPrintOpStats();
130 mlir::registerPass([]() -> std::unique_ptr<mlir::Pass> {
131 return std::make_unique<RemoveDeadValuesWorkaroundPass>();
133 mlir::registerSCCP();
134 mlir::registerSROA();
135 mlir::registerStripDebugInfo();
136 mlir::registerSymbolDCE();
137 mlir::registerSymbolPrivatize();
138 mlir::registerTopologicalSort();
139 mlir::registerViewOpGraph();
144int main(
int argc,
char **argv) {
145 llvm::sys::PrintStackTraceOnErrorSignal(llvm::StringRef());
146 llvm::setBugReportMsg(
148 " and include the crash backtrace, relevant LLZK files,"
149 " and associated run script(s).\n"
151 llvm::cl::AddExtraVersionPrinter([](llvm::raw_ostream &os) {
156 mlir::DialectRegistry registry;
158 mlir_hotfix::registerTransformsPasses();
160 r1cs::registerAllDialects(registry);
161 zklean::registerAllDialects(registry);
162 mlir::func::registerInlinerExtension(registry);
164 pcl::registerAllDialects(registry);
173 r1cs::registerTransformationPasses();
174 zklean::registerConversionPasses();
175 zklean::registerZKLeanPasses();
177 pcl::registerTransformationPasses();
178 pcl::conversion::registerPCLTransformationPasses();
182 r1cs::registerTransformationPassPipelines();
183 llzk::smt::registerConversionPasses();
186 std::string inputFilename, outputFilename;
187 std::tie(inputFilename, outputFilename) =
188 registerAndParseCLIOptions(argc, argv,
"llzk-opt", registry);
191 mlir::MLIRContext context;
192 context.appendDialectRegistry(registry);
193 context.loadAllAvailableDialects();
194 llvm::outs() <<
"All ops registered in LLZK IR: {\n";
195 for (
const auto &opName : context.getRegisteredOperations()) {
196 llvm::outs().indent(2) << opName.getStringRef() <<
'\n';
198 llvm::outs() <<
"}\n";
208 auto result = mlir::MlirOptMain(argc, argv, inputFilename, outputFilename, registry);
209 return mlir::asMainReturnCode(result);