ZAM optimization for ?$ operator applied to non-optional fields

This commit is contained in:
Vern Paxson 2023-07-13 11:44:35 -07:00
parent 3505827982
commit 1d5bc841e0
2 changed files with 19 additions and 0 deletions

View file

@ -1153,6 +1153,9 @@ public:
// Optimization-related:
ExprPtr Duplicate() override;
bool IsReduced(Reducer* c) const override;
ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override;
protected:
ValPtr Fold(Val* v) const override;

View file

@ -1917,6 +1917,22 @@ ExprPtr HasFieldExpr::Duplicate()
return SetSucc(new HasFieldExpr(op->Duplicate(), util::copy_string(field_name)));
}
bool HasFieldExpr::IsReduced(Reducer* c) const
{
return op->GetType<RecordType>()->FieldHasAttr(field, ATTR_OPTIONAL);
}
ExprPtr HasFieldExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
{
if ( ! op->GetType<RecordType>()->FieldHasAttr(field, ATTR_OPTIONAL) )
{
auto true_constant = make_intrusive<ConstExpr>(val_mgr->True());
return TransformMe(true_constant, c, red_stmt);
}
return UnaryExpr::Reduce(c, red_stmt);
}
ExprPtr RecordConstructorExpr::Duplicate()
{
auto op_l = op->Duplicate()->AsListExprPtr();