From 7294b31fde8eeed0900d7c1815f8290c3fb1f625 Mon Sep 17 00:00:00 2001 From: Jake Fecher Date: Thu, 9 Jan 2025 09:36:43 -0600 Subject: [PATCH 1/2] Add short circuit in ssa-gen for known if conditions --- .../noirc_evaluator/src/ssa/ssa_gen/mod.rs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs b/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs index 56a2723a038..2000c3c1644 100644 --- a/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs +++ b/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs @@ -2,6 +2,7 @@ pub(crate) mod context; mod program; mod value; +use acvm::AcirField; use noirc_frontend::token::FmtStrFragment; pub(crate) use program::Ssa; @@ -595,6 +596,9 @@ impl<'a> FunctionContext<'a> { /// ``` fn codegen_if(&mut self, if_expr: &ast::If) -> Result { let condition = self.codegen_non_tuple_expression(&if_expr.condition)?; + if let Some(result) = self.try_codegen_constant_if(condition, if_expr) { + return result; + } let then_block = self.builder.insert_block(); let else_block = self.builder.insert_block(); @@ -633,6 +637,26 @@ impl<'a> FunctionContext<'a> { Ok(result) } + /// If the condition is known, skip codegen for the then/else branch and only compile the + /// relevant branch. + fn try_codegen_constant_if( + &mut self, + condition: ValueId, + if_expr: &ast::If, + ) -> Option> { + let condition = self.builder.current_function.dfg.get_numeric_constant(condition)?; + + Some(if condition.is_zero() { + if let Some(alternative) = &if_expr.alternative { + self.codegen_expression(alternative) + } else { + Ok(Self::unit_value()) + } + } else { + self.codegen_expression(&if_expr.consequence) + }) + } + fn codegen_tuple(&mut self, tuple: &[Expression]) -> Result { Ok(Tree::Branch(try_vecmap(tuple, |expr| self.codegen_expression(expr))?)) } From 00d82de4f3f196d8d8766de48a7b94bf19b0702c Mon Sep 17 00:00:00 2001 From: Jake Fecher Date: Thu, 9 Jan 2025 09:39:50 -0600 Subject: [PATCH 2/2] Cleaner to use a match --- compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs b/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs index 2000c3c1644..10b8129e8db 100644 --- a/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs +++ b/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs @@ -647,10 +647,9 @@ impl<'a> FunctionContext<'a> { let condition = self.builder.current_function.dfg.get_numeric_constant(condition)?; Some(if condition.is_zero() { - if let Some(alternative) = &if_expr.alternative { - self.codegen_expression(alternative) - } else { - Ok(Self::unit_value()) + match if_expr.alternative.as_ref() { + Some(alternative) => self.codegen_expression(alternative), + None => Ok(Self::unit_value()), } } else { self.codegen_expression(&if_expr.consequence)