diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index e54ca4dc37..d3211e1d67 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -1015,9 +1015,10 @@ ExprPtr TimesExpr::Reduce(Reducer* c, StmtPtr& red_stmt) if ( (op1->IsZero() || op2->IsZero()) && GetType()->Tag() != TYPE_DOUBLE ) { - auto zero_val = op1->IsZero() ? - op1->Eval(nullptr) : op2->Eval(nullptr); - return make_intrusive(zero_val); + if ( op1->IsZero() ) + return c->Fold(op1); + else + return c->Fold(op2); } return BinaryExpr::Reduce(c, red_stmt); @@ -1623,12 +1624,22 @@ bool AssignExpr::HasReducedOps(Reducer* c) const ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt) { // Yields a fully reduced assignment expression. - if ( c->Optimizing() ) { // Don't update the LHS, it's already in reduced form // and it doesn't make sense to expand aliases or such. + auto orig_op2 = op2; op2 = c->UpdateExpr(op2); + + if ( op2 != orig_op2 && op2->Tag() == EXPR_CONST && + op1->Tag() == EXPR_REF ) + { + auto lhs = op1->GetOp1(); + auto op2_c = cast_intrusive(op2); + if ( lhs->Tag() == EXPR_NAME ) + c->FoldedTo(orig_op2, op2_c); + } + return ThisPtr(); } @@ -1751,7 +1762,7 @@ ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt) red_stmt = op2->ReduceToSingletons(c); if ( op2->HasConstantOps() && op2->Tag() != EXPR_TO_ANY_COERCE ) - op2 = make_intrusive(op2->Eval(nullptr)); + op2 = c->Fold(op2); // Check once again for transformation, this time made possible // because the operands have been reduced. We don't simply