diff --git a/compiler/include/concretelang/Conversion/ConcreteToBConcrete/Pass.h b/compiler/include/concretelang/Conversion/ConcreteToBConcrete/Pass.h index cd0353690..e82eb0c8f 100644 --- a/compiler/include/concretelang/Conversion/ConcreteToBConcrete/Pass.h +++ b/compiler/include/concretelang/Conversion/ConcreteToBConcrete/Pass.h @@ -11,7 +11,8 @@ namespace mlir { namespace concretelang { /// Create a pass to convert `Concrete` dialect to `BConcrete` dialect. -std::unique_ptr> createConvertConcreteToBConcretePass(); +std::unique_ptr> +createConvertConcreteToBConcretePass(bool loopParallelize); } // namespace concretelang } // namespace mlir diff --git a/compiler/include/concretelang/Conversion/Passes.td b/compiler/include/concretelang/Conversion/Passes.td index 015258683..e80234f94 100644 --- a/compiler/include/concretelang/Conversion/Passes.td +++ b/compiler/include/concretelang/Conversion/Passes.td @@ -36,7 +36,6 @@ def ConcreteToBConcrete : Pass<"concrete-to-bconcrete", "mlir::ModuleOp"> { let summary = "Lowers operations from the Concrete dialect to Bufferized Concrete"; let description = [{ Lowers operations from the Concrete dialect to Bufferized Concrete }]; let constructor = "mlir::concretelang::createConvertConcreteToBConcretePass()"; - let options = []; let dependentDialects = ["mlir::linalg::LinalgDialect", "mlir::concretelang::Concrete::ConcreteDialect", "mlir::concretelang::BConcrete::BConcreteDialect"]; } diff --git a/compiler/include/concretelang/Support/Pipeline.h b/compiler/include/concretelang/Support/Pipeline.h index 9b590b30f..e5e6cc891 100644 --- a/compiler/include/concretelang/Support/Pipeline.h +++ b/compiler/include/concretelang/Support/Pipeline.h @@ -44,7 +44,8 @@ lowerTFHEToConcrete(mlir::MLIRContext &context, mlir::ModuleOp &module, mlir::LogicalResult lowerConcreteToBConcrete(mlir::MLIRContext &context, mlir::ModuleOp &module, - std::function enablePass); + std::function enablePass, + bool parallelizeLoops); mlir::LogicalResult lowerBConcreteToStd(mlir::MLIRContext &context, mlir::ModuleOp &module, diff --git a/compiler/lib/Conversion/ConcreteToBConcrete/ConcreteToBConcrete.cpp b/compiler/lib/Conversion/ConcreteToBConcrete/ConcreteToBConcrete.cpp index 071c09bcb..f57efbc17 100644 --- a/compiler/lib/Conversion/ConcreteToBConcrete/ConcreteToBConcrete.cpp +++ b/compiler/lib/Conversion/ConcreteToBConcrete/ConcreteToBConcrete.cpp @@ -24,6 +24,12 @@ namespace { struct ConcreteToBConcretePass : public ConcreteToBConcreteBase { void runOnOperation() final; + ConcreteToBConcretePass() = delete; + ConcreteToBConcretePass(bool loopParallelize) + : loopParallelize(loopParallelize){}; + +private: + bool loopParallelize; }; } // namespace @@ -953,12 +959,17 @@ void ConcreteToBConcretePass::runOnOperation() { // Add patterns to rewrite linalg op to nested loops with views on // ciphertexts - patterns.insert>(converter, - &getContext()); + if (loopParallelize) { + patterns.insert>( + converter, &getContext()); + } else { + patterns.insert>(converter, + &getContext()); + } target.addLegalOp(); + mlir::scf::ParallelOp, mlir::scf::YieldOp, + mlir::AffineApplyOp, mlir::memref::SubViewOp, + mlir::memref::LoadOp, mlir::memref::TensorStoreOp>(); // Add patterns to do the conversion of func mlir::populateFuncOpTypeConversionPattern(patterns, converter); @@ -991,8 +1002,8 @@ void ConcreteToBConcretePass::runOnOperation() { namespace mlir { namespace concretelang { std::unique_ptr> -createConvertConcreteToBConcretePass() { - return std::make_unique(); +createConvertConcreteToBConcretePass(bool loopParallelize) { + return std::make_unique(loopParallelize); } } // namespace concretelang } // namespace mlir diff --git a/compiler/lib/Support/CompilerEngine.cpp b/compiler/lib/Support/CompilerEngine.cpp index 9b7387de7..9041297a6 100644 --- a/compiler/lib/Support/CompilerEngine.cpp +++ b/compiler/lib/Support/CompilerEngine.cpp @@ -299,7 +299,8 @@ CompilerEngine::compile(llvm::SourceMgr &sm, Target target, OptionalLib lib) { // Concrete -> BConcrete if (mlir::concretelang::pipeline::lowerConcreteToBConcrete( - mlirContext, module, this->enablePass) + mlirContext, module, this->enablePass, + this->loopParallelize || this->autoParallelize) .failed()) { return StreamStringError( "Lowering from Concrete to Bufferized Concrete failed"); diff --git a/compiler/lib/Support/Pipeline.cpp b/compiler/lib/Support/Pipeline.cpp index dea3b3ea5..6eec827b5 100644 --- a/compiler/lib/Support/Pipeline.cpp +++ b/compiler/lib/Support/Pipeline.cpp @@ -187,11 +187,14 @@ lowerTFHEToConcrete(mlir::MLIRContext &context, mlir::ModuleOp &module, mlir::LogicalResult lowerConcreteToBConcrete(mlir::MLIRContext &context, mlir::ModuleOp &module, - std::function enablePass) { + std::function enablePass, + bool parallelizeLoops) { mlir::PassManager pm(&context); pipelinePrinting("ConcreteToBConcrete", pm, context); addPotentiallyNestedPass( - pm, mlir::concretelang::createConvertConcreteToBConcretePass(), + pm, + mlir::concretelang::createConvertConcreteToBConcretePass( + parallelizeLoops), enablePass); return pm.run(module.getOperation());