From 7c766e45a0482f7b1967bce91e8995844ea3447d Mon Sep 17 00:00:00 2001 From: lionarius Date: Wed, 13 Nov 2024 21:00:41 +0300 Subject: [PATCH] do not bubble_binop_vars when not needed --- src/ast/optimization.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/ast/optimization.rs b/src/ast/optimization.rs index 28890e2..398f241 100644 --- a/src/ast/optimization.rs +++ b/src/ast/optimization.rs @@ -29,9 +29,8 @@ pub fn bubble_binop_vars(expr: TypedExpr) -> TypedExpr { let rhs = *rhs; let lhs = bubble_binop_vars(lhs); - let rhs = bubble_binop_vars(rhs); - let (lhs, rhs, op) = match (lhs, rhs) { + let (lhs, rhs, op, rebubble) = match (lhs, rhs) { ( TypedExpr::BinOp { lhs: lhs1, @@ -47,18 +46,22 @@ pub fn bubble_binop_vars(expr: TypedExpr) -> TypedExpr { }, *rhs1, op1, + true, ), (lhs, rhs) if !lhs.is_const() && rhs.is_const() && op.swappable(&op) => { - (rhs, lhs, op) + (rhs, lhs, op, false) }, (lhs, rhs) if op.precedence() < lhs.precedence() && op.swappable(&op) => { - (rhs, lhs, op) + (rhs, lhs, op, true) }, - (lhs, rhs) => (lhs, rhs, op), + (lhs, rhs) => (lhs, rhs, op, false), }; - let lhs = bubble_binop_vars(lhs); - let rhs = bubble_binop_vars(rhs); + let lhs = if rebubble { + bubble_binop_vars(lhs) + } else { + lhs + }; TypedExpr::BinOp { lhs: Box::new(lhs),