mirror of
https://github.com/zeek/zeek.git
synced 2025-10-08 09:38:19 +00:00
enable reducer to track folding to enable constant propagation
This commit is contained in:
parent
da6ac0b521
commit
6726eaa0a9
1 changed files with 16 additions and 5 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue