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()) && if ( (op1->IsZero() || op2->IsZero()) &&
GetType()->Tag() != TYPE_DOUBLE ) GetType()->Tag() != TYPE_DOUBLE )
{ {
auto zero_val = op1->IsZero() ? if ( op1->IsZero() )
op1->Eval(nullptr) : op2->Eval(nullptr); return c->Fold(op1);
return make_intrusive<ConstExpr>(zero_val); else
return c->Fold(op2);
} }
return BinaryExpr::Reduce(c, red_stmt); return BinaryExpr::Reduce(c, red_stmt);
@ -1623,12 +1624,22 @@ bool AssignExpr::HasReducedOps(Reducer* c) const
ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt) ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
{ {
// Yields a fully reduced assignment expression. // Yields a fully reduced assignment expression.
if ( c->Optimizing() ) if ( c->Optimizing() )
{ {
// Don't update the LHS, it's already in reduced form // Don't update the LHS, it's already in reduced form
// and it doesn't make sense to expand aliases or such. // and it doesn't make sense to expand aliases or such.
auto orig_op2 = op2;
op2 = c->UpdateExpr(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(); return ThisPtr();
} }
@ -1751,7 +1762,7 @@ ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
red_stmt = op2->ReduceToSingletons(c); red_stmt = op2->ReduceToSingletons(c);
if ( op2->HasConstantOps() && op2->Tag() != EXPR_TO_ANY_COERCE ) 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 // Check once again for transformation, this time made possible
// because the operands have been reduced. We don't simply // because the operands have been reduced. We don't simply