diff --git a/acvm-repo/acir/src/circuit/directives.rs b/acvm-repo/acir/src/circuit/directives.rs index 2486f4cfb83..d1ba43791f8 100644 --- a/acvm-repo/acir/src/circuit/directives.rs +++ b/acvm-repo/acir/src/circuit/directives.rs @@ -22,3 +22,12 @@ pub enum Directive { sort_by: Vec, // specify primary index to sort by, then the secondary,... For instance, if tuple is 2 and sort_by is [1,0], then a=[(a0,b0),..] is sorted by bi and then ai. }, } + +impl Directive { + pub fn get_outputs_vec(&self) -> Vec { + match self { + Directive::ToLeRadix { b, .. } => b.to_owned(), + Directive::PermutationSort { bits, .. } => bits.to_owned(), + } + } +} diff --git a/acvm-repo/acvm/src/compiler/optimizers/constant_backpropagation.rs b/acvm-repo/acvm/src/compiler/optimizers/constant_backpropagation.rs index dc9c95198a9..6483b99011c 100644 --- a/acvm-repo/acvm/src/compiler/optimizers/constant_backpropagation.rs +++ b/acvm-repo/acvm/src/compiler/optimizers/constant_backpropagation.rs @@ -228,9 +228,17 @@ impl ConstantBackpropOptimizer { } }; - match solve_directives(&mut known_witnesses, &directive) { - Ok(()) => continue, - Err(_) => Opcode::Directive(directive), + if directive + .get_outputs_vec() + .iter() + .all(|output| known_witnesses.contains_key(output)) + { + continue; + } else { + match solve_directives(&mut known_witnesses, &directive) { + Ok(()) => continue, + Err(_) => Opcode::Directive(directive), + } } } diff --git a/acvm-repo/acvm/src/compiler/optimizers/mod.rs b/acvm-repo/acvm/src/compiler/optimizers/mod.rs index 2bf22faf13f..e5464913d31 100644 --- a/acvm-repo/acvm/src/compiler/optimizers/mod.rs +++ b/acvm-repo/acvm/src/compiler/optimizers/mod.rs @@ -66,6 +66,9 @@ pub(super) fn optimize_internal(acir: Circuit) -> (Circuit, Vec) { let (acir, acir_opcode_positions) = range_optimizer.replace_redundant_ranges(acir_opcode_positions); + let (acir, acir_opcode_positions) = + ConstantBackpropOptimizer::backpropagate_constants(acir, acir_opcode_positions); + info!("Number of opcodes after: {}", acir.opcodes.len()); (acir, acir_opcode_positions)