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

short circuit on constant branch conditions

This commit is contained in:
schaeff 2023-05-23 10:59:39 +02:00
parent 1c3187b062
commit 5582b1f004
4 changed files with 21 additions and 15 deletions

View file

@ -0,0 +1 @@
Short-circuit on compile-time constant branch conditions

View file

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

View file

@ -0,0 +1,3 @@
{
"tests": []
}

View 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];
}
}