33// Use the minimum level level of the two operands for the result storage
44
55!evaluator = !lattigo.bgv.evaluator
6+ !ckks_evaluator = !lattigo.ckks.evaluator
7+ !bootstrapping_evaluator = !lattigo.ckks.bootstrapping_evaluator
68!ct = !lattigo.rlwe.ciphertext
79
810// CHECK: ![[evaluator:.*]] = !lattigo.bgv.evaluator
@@ -20,3 +22,19 @@ func.func @drop_level(%evaluator : !evaluator, %ct : !ct) -> !ct {
2022 %2 = lattigo.bgv.add_new %evaluator , %0 , %1 : (!evaluator , !ct , !ct ) -> !ct
2123 return %2 : !ct
2224}
25+
26+ // A bootstrap resets depth to zero. Do not reuse its exhausted input as
27+ // storage for the refreshed result's users, or the user will be coereced
28+ // down to level 0, which will then cause failures down the line.
29+ // CHECK: func.func @bootstrap_resets_level
30+ func.func @bootstrap_resets_level (%evaluator: !ckks_evaluator , %bootstrapping_evaluator: !bootstrapping_evaluator , %ct: !ct ) -> !ct {
31+ // CHECK: %[[LOW:.*]] = lattigo.ckks.rescale_new
32+ %0 = lattigo.ckks.rescale_new %evaluator , %ct : (!ckks_evaluator , !ct ) -> !ct
33+ // CHECK: %[[BOOT:.*]] = lattigo.ckks.bootstrap %{{.*}}, %[[LOW]]
34+ %1 = lattigo.ckks.bootstrap %bootstrapping_evaluator , %0 : (!bootstrapping_evaluator , !ct ) -> !ct
35+ // CHECK: %[[MUL:.*]] = lattigo.ckks.mul %{{.*}}, %[[BOOT]], %[[BOOT]], %[[BOOT]]
36+ %2 = lattigo.ckks.mul_new %evaluator , %1 , %1 : (!ckks_evaluator , !ct , !ct ) -> !ct
37+ // CHECK: %[[RESCALED:.*]] = lattigo.ckks.rescale %{{.*}}, %[[MUL]], %[[LOW]]
38+ %3 = lattigo.ckks.rescale_new %evaluator , %2 : (!ckks_evaluator , !ct ) -> !ct
39+ return %3 : !ct
40+ }
0 commit comments