catch exponent 0 to equal 1 at propagation and flattening
This commit is contained in:
parent
8eda3f09dd
commit
c46b9d6265
4 changed files with 7 additions and 4 deletions
3
zokrates_cli/examples/reduceable_exponent.code
Normal file
3
zokrates_cli/examples/reduceable_exponent.code
Normal file
|
@ -0,0 +1,3 @@
|
|||
def main() -> (field):
|
||||
field a = 2
|
||||
return 2**(a**2 + 2)
|
|
@ -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
|
||||
|
|
|
@ -28,13 +28,10 @@ impl<T: Field> Analyse for TypedProg<T> {
|
|||
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
|
||||
|
|
|
@ -155,8 +155,8 @@ impl<T: Field> Folder<T> for Propagator<T> {
|
|||
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)),
|
||||
|
|
Loading…
Reference in a new issue