mirror of
https://github.com/zama-ai/concrete.git
synced 2026-01-14 23:38:10 -05:00
This commit rebases the compiler onto commit 465ee9bfb26d from
llvm-project with locally maintained patches on top, i.e.:
* 5d8669d669ee: Fix the element alignment (size) for memrefCopy
* 4239163ea337: fix: Do not fold the memref.subview if the offset are
!= 0 and strides != 1
* 72c5decfcc21: remove github stuff from llvm
* 8d0ce8f9eca1: Support arbitrary element types in named operations
via attributes
* 94f64805c38c: Copy attributes of scf.for on bufferization and make
it an allocation hoisting barrier
Main upstream changes from llvm-project that required modification of
concretecompiler:
* Switch to C++17
* Various changes in the interfaces for linalg named operations
* Transition from `llvm::Optional` to `std::optional`
* Use of enums instead of string values for iterator types in linalg
* Changed default naming convention of getter methods in
ODS-generated operation classes from `some_value()` to
`getSomeValue()`
* Renaming of Arithmetic dialect to Arith
* Refactoring of side effect interfaces (i.e., renaming from
`NoSideEffect` to `Pure`)
* Re-design of the data flow analysis framework
* Refactoring of build targets for Python bindings
* Refactoring of array attributes with integer values
* Renaming of `linalg.init_tensor` to `tensor.empty`
* Emission of `linalg.map` operations in bufferization of the Tensor
dialect requiring another linalg conversion pass and registration
of the bufferization op interfaces for linalg operations
* Refactoring of the one-shot bufferizer
* Necessity to run the expand-strided-metadata, affine-to-std and
finalize-memref-to-llvm passes before converson to the LLVM
dialect
* Renaming of `BlockAndValueMapping` to `IRMapping`
* Changes in the build function of `LLVM::CallOp`
* Refactoring of the construction of `llvm::ArrayRef` and
`llvm::MutableArrayRef` (direct invocation of constructor instead
of builder functions for some cases)
* New naming conventions for generated SSA values requiring rewrite
of some check tests
* Refactoring of `mlir::LLVM::lookupOrCreateMallocFn()`
* Interface changes in generated type parsers
* New dependencies for to mlir_float16_utils and
MLIRSparseTensorRuntime for the runtime
* Overhaul of MLIR-c deleting `mlir-c/Registration.h`
* Deletion of library MLIRLinalgToSPIRV
* Deletion of library MLIRLinalgAnalysis
* Deletion of library MLIRMemRefUtils
* Deletion of library MLIRQuantTransforms
* Deletion of library MLIRVectorToROCDL
63 lines
2.3 KiB
C++
63 lines
2.3 KiB
C++
// Part of the Concrete Compiler Project, under the BSD3 License with Zama
|
|
// Exceptions. See
|
|
// https://github.com/zama-ai/concrete-compiler-internal/blob/main/LICENSE.txt
|
|
// for license information.
|
|
|
|
#include <concretelang/Runtime/DFRuntime.hpp>
|
|
#include <concretelang/Support/JITSupport.h>
|
|
#include <llvm/Support/TargetSelect.h>
|
|
#include <mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h>
|
|
|
|
namespace mlir {
|
|
namespace concretelang {
|
|
|
|
JITSupport::JITSupport(std::optional<std::string> runtimeLibPath)
|
|
: runtimeLibPath(runtimeLibPath) {}
|
|
|
|
llvm::Expected<std::unique_ptr<JitCompilationResult>>
|
|
JITSupport::compile(llvm::SourceMgr &program, CompilationOptions options) {
|
|
// Setup the compiler engine
|
|
auto context = std::make_shared<CompilationContext>();
|
|
concretelang::CompilerEngine engine(context);
|
|
|
|
engine.setCompilationOptions(options);
|
|
// Compile to LLVM Dialect
|
|
auto compilationResult =
|
|
engine.compile(program, CompilerEngine::Target::LLVM_IR);
|
|
|
|
if (auto err = compilationResult.takeError()) {
|
|
return std::move(err);
|
|
}
|
|
|
|
if (!options.clientParametersFuncName.has_value()) {
|
|
return StreamStringError("Need to have a funcname to JIT compile");
|
|
}
|
|
// Compile from LLVM Dialect to JITLambda
|
|
auto mlirModule = compilationResult.get().mlirModuleRef->get();
|
|
auto lambda = concretelang::JITLambda::create(
|
|
*options.clientParametersFuncName, mlirModule,
|
|
mlir::makeOptimizingTransformer(3, 0, nullptr), runtimeLibPath);
|
|
if (auto err = lambda.takeError()) {
|
|
return std::move(err);
|
|
}
|
|
if (!compilationResult.get().clientParameters.has_value()) {
|
|
// i.e. that should not occurs
|
|
return StreamStringError("No client parameters has been generated");
|
|
}
|
|
auto result = std::make_unique<JitCompilationResult>();
|
|
result->lambda = std::shared_ptr<concretelang::JITLambda>(std::move(*lambda));
|
|
// Mark the lambda as compiled using DF parallelization
|
|
result->lambda->setUseDataflow(options.dataflowParallelize ||
|
|
options.autoParallelize);
|
|
if (!mlir::concretelang::dfr::_dfr_is_root_node()) {
|
|
result->clientParameters = clientlib::ClientParameters();
|
|
} else {
|
|
result->clientParameters = compilationResult.get().clientParameters.value();
|
|
result->feedback = compilationResult.get().feedback.value();
|
|
}
|
|
return std::move(result);
|
|
}
|
|
|
|
} // namespace concretelang
|
|
} // namespace mlir
|