short circuit on constant branch conditions
This commit is contained in:
parent
1c3187b062
commit
5582b1f004
4 changed files with 21 additions and 15 deletions
1
changelogs/unreleased/1315-schaeff
Normal file
1
changelogs/unreleased/1315-schaeff
Normal file
|
@ -0,0 +1 @@
|
|||
Short-circuit on compile-time constant branch conditions
|
|
@ -181,26 +181,22 @@ impl<'ast, T: Field> ResultFolder<'ast, T> for Propagator<'ast, T> {
|
|||
_: &E::Ty,
|
||||
e: ConditionalExpression<'ast, T, E>,
|
||||
) -> Result<ConditionalOrExpression<'ast, T, E>, Self::Error> {
|
||||
Ok(
|
||||
match (
|
||||
self.fold_boolean_expression(*e.condition)?,
|
||||
e.consequence.fold(self)?,
|
||||
e.alternative.fold(self)?,
|
||||
) {
|
||||
(BooleanExpression::Value(v), consequence, _) if v.value => {
|
||||
Ok(match self.fold_boolean_expression(*e.condition)? {
|
||||
BooleanExpression::Value(v) if v.value => {
|
||||
ConditionalOrExpression::Expression(e.consequence.fold(self)?.into_inner())
|
||||
}
|
||||
BooleanExpression::Value(v) if !v.value => {
|
||||
ConditionalOrExpression::Expression(e.alternative.fold(self)?.into_inner())
|
||||
}
|
||||
condition => match (e.consequence.fold(self)?, e.alternative.fold(self)?) {
|
||||
(consequence, alternative) if consequence == alternative => {
|
||||
ConditionalOrExpression::Expression(consequence.into_inner())
|
||||
}
|
||||
(BooleanExpression::Value(v), _, alternative) if !v.value => {
|
||||
ConditionalOrExpression::Expression(alternative.into_inner())
|
||||
}
|
||||
(_, consequence, alternative) if consequence == alternative => {
|
||||
ConditionalOrExpression::Expression(consequence.into_inner())
|
||||
}
|
||||
(condition, consequence, alternative) => ConditionalOrExpression::Conditional(
|
||||
(consequence, alternative) => ConditionalOrExpression::Conditional(
|
||||
ConditionalExpression::new(condition, consequence, alternative, e.kind),
|
||||
),
|
||||
},
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
fn fold_assembly_assignment(
|
||||
|
|
3
zokrates_core_test/tests/tests/constant_condition.json
Normal file
3
zokrates_core_test/tests/tests/constant_condition.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"tests": []
|
||||
}
|
6
zokrates_core_test/tests/tests/constant_condition.zok
Normal file
6
zokrates_core_test/tests/tests/constant_condition.zok
Normal file
|
@ -0,0 +1,6 @@
|
|||
def main() {
|
||||
field[2] a = [0; 2];
|
||||
for u32 i in 1..2 {
|
||||
field b = (i == 1) ? 0 : a[i - 2];
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue