enable reducer to track folding to enable constant propagation

This commit is contained in:
Vern Paxson 2021-08-16 13:11:40 -07:00
parent da6ac0b521
commit 6726eaa0a9

View file

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