From c46b9d62656b0bfcbd290222b5f281adc47b79ed Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 31 Oct 2018 17:37:57 +0100 Subject: [PATCH] catch exponent 0 to equal 1 at propagation and flattening --- zokrates_cli/examples/reduceable_exponent.code | 3 +++ zokrates_core/src/flatten/mod.rs | 3 +++ zokrates_core/src/static_analysis/mod.rs | 3 --- zokrates_core/src/static_analysis/propagation.rs | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 zokrates_cli/examples/reduceable_exponent.code diff --git a/zokrates_cli/examples/reduceable_exponent.code b/zokrates_cli/examples/reduceable_exponent.code new file mode 100644 index 00000000..955f36e4 --- /dev/null +++ b/zokrates_cli/examples/reduceable_exponent.code @@ -0,0 +1,3 @@ +def main() -> (field): + field a = 2 + return 2**(a**2 + 2) \ No newline at end of file diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 1dfbfdbb..ab9da03c 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -650,6 +650,9 @@ impl Flattener { assert!(base_flattened.is_linear()); match e { + e if *e == T::zero() => { + FlatExpression::Number(T::one()) + }, // flatten(base ** 1) == flatten(base) e if *e == T::one() => { base_flattened diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index 4b0650fa..56e39f4f 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -28,13 +28,10 @@ impl Analyse for TypedProg { let r = Unroller::unroll(self); //propagate a first time for constants to reach function calls let r = Propagator::propagate(r); - println!("{}", r); // apply inlining strategy let r = Inliner::inline(r); // Propagate again let r = Propagator::propagate(r); - println!("{}", r); - // remove unused functions let r = DeadCode::clean(r); r diff --git a/zokrates_core/src/static_analysis/propagation.rs b/zokrates_core/src/static_analysis/propagation.rs index bd232e82..12b16742 100644 --- a/zokrates_core/src/static_analysis/propagation.rs +++ b/zokrates_core/src/static_analysis/propagation.rs @@ -155,8 +155,8 @@ impl Folder for Propagator { FieldElementExpression::Pow(box e1, box e2) => { let e1 = self.fold_field_expression(e1); let e2 = self.fold_field_expression(e2); - println!("{}, {}", e1, e2); match (e1, e2) { + (_, FieldElementExpression::Number(ref n2)) if *n2 == T::from(0)=> FieldElementExpression::Number(T::from(1)), (FieldElementExpression::Number(n1), FieldElementExpression::Number(n2)) => FieldElementExpression::Number(n1.pow(n2)), (e1, FieldElementExpression::Number(n2)) => FieldElementExpression::Pow(box e1, box FieldElementExpression::Number(n2)), (_, e2) => panic!(format!("non-constant exponent {} detected during static analysis", e2)),