diff --git a/compiler/concrete-optimizer b/compiler/concrete-optimizer index 3b9535ac2..1f15162b3 160000 --- a/compiler/concrete-optimizer +++ b/compiler/concrete-optimizer @@ -1 +1 @@ -Subproject commit 3b9535ac2fe1f2abe680bac647345664c2110936 +Subproject commit 1f15162b39103f5a3bf08dff4e4c4a3ac410b755 diff --git a/compiler/lib/Dialect/FHE/Analysis/ConcreteOptimizer.cpp b/compiler/lib/Dialect/FHE/Analysis/ConcreteOptimizer.cpp index 96b3ba6c3..603c717eb 100644 --- a/compiler/lib/Dialect/FHE/Analysis/ConcreteOptimizer.cpp +++ b/compiler/lib/Dialect/FHE/Analysis/ConcreteOptimizer.cpp @@ -154,7 +154,7 @@ struct FunctionToDag { } void addDot(optimizer::Dag &dag, mlir::Value &val, Inputs &encrypted_inputs, - std::vector &weights_vector) { + std::vector &weights_vector) { assert(encrypted_inputs.size() == 1); auto weights = concrete_optimizer::weights::vector(slice(weights_vector)); index[val] = dag->add_dot(slice(encrypted_inputs), std::move(weights)); @@ -228,19 +228,19 @@ struct FunctionToDag { return value.isa(); } - std::vector + std::vector resolveConstantVectorWeights(mlir::arith::ConstantOp &cstOp) { - std::vector values; + std::vector values; mlir::DenseIntElementsAttr denseVals = cstOp->getAttrOfType("value"); for (llvm::APInt val : denseVals.getValues()) { - values.push_back(val.getZExtValue()); + values.push_back(val.getSExtValue()); } return values; } - llvm::Optional> + llvm::Optional> resolveConstantWeights(mlir::Value &value) { if (auto cstOp = llvm::dyn_cast_or_null( value.getDefiningOp())) { @@ -258,7 +258,7 @@ struct FunctionToDag { } } - llvm::Optional> + llvm::Optional> dotWeights(mlir::concretelang::FHELinalg::Dot &dot) { if (dot.getOperands().size() != 2) { return llvm::None; diff --git a/compiler/tests/check_tests/Dialect/FHE/optimizer_ast.mlir b/compiler/tests/check_tests/Dialect/FHE/optimizer_ast.mlir new file mode 100644 index 000000000..e33228cd5 --- /dev/null +++ b/compiler/tests/check_tests/Dialect/FHE/optimizer_ast.mlir @@ -0,0 +1,10 @@ +// RUN: concretecompiler --verbose --split-input-file --action=dump-fhe %s 2>&1| FileCheck %s + +func.func @main(%arg0: tensor<5x!FHE.eint<5>>) -> !FHE.eint<5> { + %weights = arith.constant dense<[-1, -1, -1, -1, -1]> : tensor<5xi6> + %tlu = arith.constant dense<[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]> : tensor<32xi64> + %0 = "FHELinalg.apply_lookup_table"(%arg0, %tlu) : (tensor<5x!FHE.eint<5>>, tensor<32xi64>) -> tensor<5x!FHE.eint<5>> + // CHECK: Dot { [[a:.*]], weights: ClearTensor { shape: Shape { dimensions_size: [5] }, values: [-1, -1, -1, -1, -1] }, [[b:.*]]} + %1 = "FHELinalg.dot_eint_int"(%0, %weights) : (tensor<5x!FHE.eint<5>>, tensor<5xi6>) -> !FHE.eint<5> + return %1 : !FHE.eint<5> +}