mirror of
https://github.com/zeek/zeek.git
synced 2025-10-08 17:48:21 +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()) &&
|
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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue