do not bubble_binop_vars when not needed
This commit is contained in:
@@ -29,9 +29,8 @@ pub fn bubble_binop_vars(expr: TypedExpr) -> TypedExpr {
|
|||||||
let rhs = *rhs;
|
let rhs = *rhs;
|
||||||
|
|
||||||
let lhs = bubble_binop_vars(lhs);
|
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 {
|
TypedExpr::BinOp {
|
||||||
lhs: lhs1,
|
lhs: lhs1,
|
||||||
@@ -47,18 +46,22 @@ pub fn bubble_binop_vars(expr: TypedExpr) -> TypedExpr {
|
|||||||
},
|
},
|
||||||
*rhs1,
|
*rhs1,
|
||||||
op1,
|
op1,
|
||||||
|
true,
|
||||||
),
|
),
|
||||||
(lhs, rhs) if !lhs.is_const() && rhs.is_const() && op.swappable(&op) => {
|
(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) => {
|
(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 lhs = if rebubble {
|
||||||
let rhs = bubble_binop_vars(rhs);
|
bubble_binop_vars(lhs)
|
||||||
|
} else {
|
||||||
|
lhs
|
||||||
|
};
|
||||||
|
|
||||||
TypedExpr::BinOp {
|
TypedExpr::BinOp {
|
||||||
lhs: Box::new(lhs),
|
lhs: Box::new(lhs),
|
||||||
|
|||||||
Reference in New Issue
Block a user