From f9ae08978737915bbef6fb2af354f0b1e1160452 Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 5 May 2021 10:37:33 +0200 Subject: [PATCH 1/2] remove redef optimizer --- Cargo.lock | 12 +-- zokrates_core/src/static_analysis/mod.rs | 4 - .../src/static_analysis/redefinition.rs | 73 ------------------- .../tests/tests/structs/identity.json | 2 +- .../structs/{identity.code => identity.zok} | 0 .../tests/tests/structs/if_else.zok | 0 .../tests/tests/structs/mutate_argument.json | 16 ++++ .../tests/tests/structs/mutate_argument.zok | 10 +++ 8 files changed, 33 insertions(+), 84 deletions(-) delete mode 100644 zokrates_core/src/static_analysis/redefinition.rs rename zokrates_core_test/tests/tests/structs/{identity.code => identity.zok} (100%) delete mode 100644 zokrates_core_test/tests/tests/structs/if_else.zok create mode 100644 zokrates_core_test/tests/tests/structs/mutate_argument.json create mode 100644 zokrates_core_test/tests/tests/structs/mutate_argument.zok diff --git a/Cargo.lock b/Cargo.lock index 44f43a5a..f6807280 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2269,7 +2269,7 @@ dependencies = [ [[package]] name = "zokrates_cli" -version = "0.7.0" +version = "0.7.1" dependencies = [ "assert_cli", "bincode", @@ -2294,7 +2294,7 @@ version = "0.1.0" [[package]] name = "zokrates_core" -version = "0.6.0" +version = "0.6.1" dependencies = [ "ark-bls12-377", "ark-bn254", @@ -2335,7 +2335,7 @@ dependencies = [ [[package]] name = "zokrates_core_test" -version = "0.2.0" +version = "0.2.1" dependencies = [ "zokrates_test", "zokrates_test_derive", @@ -2381,7 +2381,7 @@ dependencies = [ [[package]] name = "zokrates_parser" -version = "0.2.0" +version = "0.2.1" dependencies = [ "glob 0.2.11", "pest", @@ -2390,7 +2390,7 @@ dependencies = [ [[package]] name = "zokrates_pest_ast" -version = "0.2.0" +version = "0.2.1" dependencies = [ "from-pest", "glob 0.2.11", @@ -2402,7 +2402,7 @@ dependencies = [ [[package]] name = "zokrates_stdlib" -version = "0.2.0" +version = "0.2.1" dependencies = [ "fs_extra", "zokrates_test", diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index 4b91e49e..aaecb49c 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -9,7 +9,6 @@ mod constant_inliner; mod flat_propagation; mod flatten_complex_types; mod propagation; -mod redefinition; mod reducer; mod shift_checker; mod uint_optimizer; @@ -20,7 +19,6 @@ mod variable_write_remover; use self::bounds_checker::BoundsChecker; use self::flatten_complex_types::Flattener; use self::propagation::Propagator; -use self::redefinition::RedefinitionOptimizer; use self::reducer::reduce_program; use self::shift_checker::ShiftChecker; use self::uint_optimizer::UintOptimizer; @@ -84,8 +82,6 @@ impl<'ast, T: Field> TypedProgram<'ast, T> { // propagate let r = Propagator::propagate(r).map_err(Error::from)?; - // optimize redefinitions - let r = RedefinitionOptimizer::optimize(r); // remove assignment to variable index let r = VariableWriteRemover::apply(r); // remove variable access to complex types diff --git a/zokrates_core/src/static_analysis/redefinition.rs b/zokrates_core/src/static_analysis/redefinition.rs deleted file mode 100644 index f44a8450..00000000 --- a/zokrates_core/src/static_analysis/redefinition.rs +++ /dev/null @@ -1,73 +0,0 @@ -use crate::typed_absy::folder::*; -use crate::typed_absy::*; -use std::collections::HashMap; -use zokrates_field::Field; - -pub struct RedefinitionOptimizer<'ast> { - identifiers: HashMap, Identifier<'ast>>, -} - -impl<'ast> RedefinitionOptimizer<'ast> { - fn new() -> Self { - RedefinitionOptimizer { - identifiers: HashMap::new(), - } - } - - pub fn optimize(p: TypedProgram<'ast, T>) -> TypedProgram<'ast, T> { - RedefinitionOptimizer::new().fold_program(p) - } -} - -fn try_id<'ast, T: Field>(e: &TypedExpression<'ast, T>) -> Option> { - match e { - TypedExpression::FieldElement(FieldElementExpression::Identifier(id)) => Some(id.clone()), - TypedExpression::Boolean(BooleanExpression::Identifier(id)) => Some(id.clone()), - TypedExpression::Array(a) => match a.as_inner() { - ArrayExpressionInner::Identifier(id) => Some(id.clone()), - _ => None, - }, - TypedExpression::Struct(a) => match a.as_inner() { - StructExpressionInner::Identifier(id) => Some(id.clone()), - _ => None, - }, - TypedExpression::Uint(a) => match a.as_inner() { - UExpressionInner::Identifier(id) => Some(id.clone()), - _ => None, - }, - _ => None, - } -} - -impl<'ast, T: Field> Folder<'ast, T> for RedefinitionOptimizer<'ast> { - fn fold_function(&mut self, f: TypedFunction<'ast, T>) -> TypedFunction<'ast, T> { - self.identifiers = HashMap::new(); - fold_function(self, f) - } - - fn fold_statement(&mut self, s: TypedStatement<'ast, T>) -> Vec> { - match s { - TypedStatement::Definition(TypedAssignee::Identifier(var), expr) => { - let expr = self.fold_expression(expr); - - match try_id(&expr) { - Some(id) => { - let target = self.identifiers.get(&id).unwrap_or(&id).clone(); - - self.identifiers.insert(var.id, target); - vec![] - } - None => vec![TypedStatement::Definition( - TypedAssignee::Identifier(var), - expr, - )], - } - } - s => fold_statement(self, s), - } - } - - fn fold_name(&mut self, s: Identifier<'ast>) -> Identifier<'ast> { - self.identifiers.get(&s).cloned().unwrap_or(s) - } -} diff --git a/zokrates_core_test/tests/tests/structs/identity.json b/zokrates_core_test/tests/tests/structs/identity.json index 15db3e86..ac96fb97 100644 --- a/zokrates_core_test/tests/tests/structs/identity.json +++ b/zokrates_core_test/tests/tests/structs/identity.json @@ -1,5 +1,5 @@ { - "entry_point": "./tests/tests/structs/identity.code", + "entry_point": "./tests/tests/structs/identity.zok", "curves": ["Bn128", "Bls12_381", "Bls12_377", "Bw6_761"], "tests": [ { diff --git a/zokrates_core_test/tests/tests/structs/identity.code b/zokrates_core_test/tests/tests/structs/identity.zok similarity index 100% rename from zokrates_core_test/tests/tests/structs/identity.code rename to zokrates_core_test/tests/tests/structs/identity.zok diff --git a/zokrates_core_test/tests/tests/structs/if_else.zok b/zokrates_core_test/tests/tests/structs/if_else.zok deleted file mode 100644 index e69de29b..00000000 diff --git a/zokrates_core_test/tests/tests/structs/mutate_argument.json b/zokrates_core_test/tests/tests/structs/mutate_argument.json new file mode 100644 index 00000000..b307b14d --- /dev/null +++ b/zokrates_core_test/tests/tests/structs/mutate_argument.json @@ -0,0 +1,16 @@ +{ + "entry_point": "./tests/tests/structs/mutate_argument.zok", + "curves": ["Bn128", "Bls12_381", "Bls12_377", "Bw6_761"], + "tests": [ + { + "input": { + "values": ["1"] + }, + "output": { + "Ok": { + "values": ["2", "1"] + } + } + } + ] +} diff --git a/zokrates_core_test/tests/tests/structs/mutate_argument.zok b/zokrates_core_test/tests/tests/structs/mutate_argument.zok new file mode 100644 index 00000000..aa352fcd --- /dev/null +++ b/zokrates_core_test/tests/tests/structs/mutate_argument.zok @@ -0,0 +1,10 @@ +struct Foo { + field a +} + +def mutate(field[1] f) -> field[1]: + f[0] = f[0] + 1 + return f + +def main(field[1] f) -> (field[1], field[1]): + return mutate(f), f \ No newline at end of file From f6f4ccea4699ec7139e28e5f371f7999c03d297c Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 5 May 2021 10:47:09 +0200 Subject: [PATCH 2/2] changelog --- changelogs/unreleased/847-schaeff | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelogs/unreleased/847-schaeff diff --git a/changelogs/unreleased/847-schaeff b/changelogs/unreleased/847-schaeff new file mode 100644 index 00000000..d6d50a18 --- /dev/null +++ b/changelogs/unreleased/847-schaeff @@ -0,0 +1 @@ +Remove side effects on complex types (bug) \ No newline at end of file