LLZK 3.0.0
An open-source IR for Zero Knowledge (ZK) circuits
Loading...
Searching...
No Matches
llzk-opt.cpp
Go to the documentation of this file.
1//===-- llzk-opt.cpp - LLZK opt tool ----------------------------*- C++ -*-===//
2//
3// Part of the LLZK Project, under the Apache License v2.0.
4// See LICENSE.txt for license information.
5// Copyright 2025 Veridise Inc.
6// SPDX-License-Identifier: Apache-2.0
7//
8//===----------------------------------------------------------------------===//
14//===----------------------------------------------------------------------===//
15
16#include "r1cs/Dialect/IR/Dialect.h"
17#include "r1cs/DialectRegistration.h"
18#include "r1cs/Transforms/TransformationPassPipelines.h"
19#include "r1cs/Transforms/TransformationPasses.h"
20#include "smt/Conversions/ConversionPasses.h"
21#include "tools/config.h"
22#include "zklean/Conversions/Passes.h"
23#include "zklean/DialectRegistration.h"
24
26#include "llzk/Config/Config.h"
39
40#include <mlir/Dialect/Func/Extensions/InlinerExtension.h>
41#include <mlir/Dialect/Func/IR/FuncOps.h>
42#include <mlir/Dialect/SCF/IR/SCF.h>
43#include <mlir/IR/DialectRegistry.h>
44#include <mlir/Pass/PassManager.h>
45#include <mlir/Pass/PassRegistry.h>
46#include <mlir/Tools/mlir-opt/MlirOptMain.h>
47#include <mlir/Transforms/Passes.h>
48
49#include <llvm/ADT/StringRef.h>
50#include <llvm/Support/CommandLine.h>
51#include <llvm/Support/PrettyStackTrace.h>
52#include <llvm/Support/Signals.h>
53
54#if LLZK_WITH_PCL
55#include "pcl/Conversion/ConversionPasses.h"
56#include "pcl/Dialect/IR/Dialect.h"
57#include "pcl/DialectRegistration.h"
58#include "pcl/Transforms/TransformationPasses.h"
59#endif // LLZK_WITH_PCL
60
61static llvm::cl::list<std::string> IncludeDirs(
62 "I", llvm::cl::desc("Directory of include files"), llvm::cl::value_desc("directory"),
63 llvm::cl::Prefix
64);
65
66static llvm::cl::opt<bool>
67 PrintAllOps("print-llzk-ops", llvm::cl::desc("Print a list of all ops registered in LLZK"));
68
72namespace mlir_hotfix {
73
74inline static void registerTransformsPasses() {
75 mlir::registerCSE();
76 mlir::registerCanonicalizer();
77 mlir::registerCompositeFixedPointPass();
78 mlir::registerControlFlowSink();
79 mlir::registerGenerateRuntimeVerification();
80 mlir::registerInliner();
81 mlir::registerLocationSnapshot();
82 mlir::registerLoopInvariantCodeMotion();
83 mlir::registerLoopInvariantSubsetHoisting();
84 mlir::registerMem2Reg();
85 mlir::registerPrintIRPass();
86 mlir::registerPrintOpStats();
88 mlir::registerSCCP();
89 mlir::registerSROA();
90 mlir::registerStripDebugInfo();
91 mlir::registerSymbolDCE();
92 mlir::registerSymbolPrivatize();
93 mlir::registerTopologicalSort();
94 mlir::registerViewOpGraph();
95}
96
97} // namespace mlir_hotfix
98
99int main(int argc, char **argv) {
100 llvm::sys::PrintStackTraceOnErrorSignal(llvm::StringRef());
101 llvm::setBugReportMsg(
102 "PLEASE submit a bug report to " BUG_REPORT_URL
103 " and include the crash backtrace, relevant LLZK files,"
104 " and associated run script(s).\n"
105 );
106 llvm::cl::AddExtraVersionPrinter([](llvm::raw_ostream &os) {
107 os << "\nLLZK (" LLZK_URL "):\n LLZK version " LLZK_VERSION_STRING "\n";
108 });
109
110 // MLIR initialization
111 mlir::DialectRegistry registry;
112 // registers CSE, etc
113 mlir_hotfix::registerTransformsPasses();
115 r1cs::registerAllDialects(registry);
116 zklean::registerAllDialects(registry);
117 mlir::func::registerInlinerExtension(registry);
118#if LLZK_WITH_PCL
119 pcl::registerAllDialects(registry);
120#endif // LLZK_WITH_PCL
121
131 r1cs::registerTransformationPasses();
132 zklean::registerConversionPasses();
133#if LLZK_WITH_PCL
134 pcl::registerPCLConversionPasses();
135 pcl::registerTransformationPasses();
136#endif // LLZK_WITH_PCL
137 llzk::smt::registerConversionPasses();
138
140 r1cs::registerTransformationPassPipelines();
141
142 // Register and parse command line options.
143 std::string inputFilename, outputFilename;
144 std::tie(inputFilename, outputFilename) =
145 registerAndParseCLIOptions(argc, argv, "llzk-opt", registry);
146
147 if (PrintAllOps) {
148 mlir::MLIRContext context;
149 context.appendDialectRegistry(registry);
150 context.loadAllAvailableDialects();
151 llvm::outs() << "All ops registered in LLZK IR: {\n";
152 for (const auto &opName : context.getRegisteredOperations()) {
153 llvm::outs().indent(2) << opName.getStringRef() << '\n';
154 }
155 llvm::outs() << "}\n";
156 return EXIT_SUCCESS;
157 }
158
159 // Set the include directories from CL option
160 if (mlir::failed(llzk::GlobalSourceMgr::get().setup(IncludeDirs))) {
161 return EXIT_FAILURE;
162 }
163
164 // Run 'mlir-opt'
165 auto result = mlir::MlirOptMain(argc, argv, inputFilename, outputFilename, registry);
166 return mlir::asMainReturnCode(result);
167}
#define LLZK_VERSION_STRING
Definition Config.h:12
#define LLZK_URL
Definition Config.h:17
Provides SpecializedSROA<AllocOpTy> and SpecializedMem2Reg<AllocOpTy>: pass templates that replicate ...
static GlobalSourceMgr & get()
#define BUG_REPORT_URL
Definition config.h:15
int main(int argc, char **argv)
Definition llzk-opt.cpp:99
This file defines llzk::registerAllDialects.
void registerTransformationPasses()
void registerTransformationPasses()
void registerTransformationPasses()
void registerTransformationPasses()
std::unique_ptr< mlir::Pass > createRemoveDeadValuesWorkaroundPass()
void registerValidationPasses()
void registerAllDialects(mlir::DialectRegistry &registry)
void registerAnalysisPasses()
Replace mlir::registerTransformsPasses() to register a custom remove-dead-values pass because MLIR ve...
Definition llzk-opt.cpp:72