1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00

catch exponent 0 to equal 1 at propagation and flattening

This commit is contained in:
schaeff 2018-10-31 17:37:57 +01:00
parent 8eda3f09dd
commit c46b9d6265
4 changed files with 7 additions and 4 deletions

View file

@ -0,0 +1,3 @@
def main() -> (field):
field a = 2
return 2**(a**2 + 2)

View file

@ -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

View file

@ -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

View file

@ -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)),