From d69738849ecc11bcf74252a4af5769b43a107e70 Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Thu, 16 May 2024 13:48:02 -0700 Subject: [PATCH] bug fixes --- src/Expr.cc | 17 +++++------------ src/Expr.h | 6 +----- src/script_opt/CSE.cc | 4 ++-- src/script_opt/Expr.cc | 11 +++++++++++ 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Expr.cc b/src/Expr.cc index ec966e0ea4..744512d92f 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -422,8 +422,6 @@ bool NameExpr::CanDel() const { return GetType()->Tag() == TYPE_TABLE || GetType()->Tag() == TYPE_VECTOR; } -TypePtr NameExpr::DelType() const { return GetType(); } - ValPtr NameExpr::Delete(Frame* f) { auto v = Eval(f); if ( v ) { @@ -2524,13 +2522,6 @@ bool IndexExpr::CanDel() const { return op1->GetType()->Tag() == TYPE_TABLE; } -TypePtr IndexExpr::AddType() const { return op1->GetType(); } - -TypePtr IndexExpr::DelType() const { - auto y = op1->GetType()->Yield(); - return y ? y : base_type(TYPE_VOID); -} - ValPtr IndexExpr::Add(Frame* f) { if ( IsError() ) return nullptr; @@ -2791,8 +2782,6 @@ ExprPtr FieldExpr::MakeLvalue() { return with_location_of(make_intrusiveGetAttr(ATTR_DEFAULT) || td->GetAttr(ATTR_OPTIONAL); } -TypePtr FieldExpr::DelType() const { return GetType(); } - void FieldExpr::Assign(Frame* f, ValPtr v) { if ( IsError() ) return; @@ -2807,8 +2796,12 @@ void FieldExpr::Assign(ValPtr lhs, ValPtr rhs) { ValPtr FieldExpr::Delete(Frame* f) { auto op_v = op->Eval(f); + if ( ! op_v ) + return nullptr; + + auto former = op_v->AsRecordVal()->GetField(field); Assign(op_v, nullptr); - return op_v; + return former; } ValPtr FieldExpr::Fold(Val* v) const { diff --git a/src/Expr.h b/src/Expr.h index c7714b68c1..0cab292c92 100644 --- a/src/Expr.h +++ b/src/Expr.h @@ -427,7 +427,6 @@ public: explicit NameExpr(IDPtr id, bool const_init = false); bool CanDel() const override; - TypePtr DelType() const override; ValPtr Delete(Frame* f) override; ID* Id() const { return id.get(); } @@ -717,6 +716,7 @@ public: // Optimization-related: bool IsReduced(Reducer* c) const override { return HasReducedOps(c); } bool HasReducedOps(Reducer* c) const override { return op->HasReducedOps(c); } + ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override; }; class AggrAddExpr final : public AggrAddDelExpr { @@ -1017,9 +1017,6 @@ public: bool CanAdd() const override; bool CanDel() const override; - TypePtr AddType() const override; - TypePtr DelType() const override; - ValPtr Add(Frame* f) override; ValPtr Delete(Frame* f) override; @@ -1119,7 +1116,6 @@ public: const char* FieldName() const { return field_name; } bool CanDel() const override; - TypePtr DelType() const override; void Assign(Frame* f, ValPtr v) override; ValPtr Delete(Frame* f) override; diff --git a/src/script_opt/CSE.cc b/src/script_opt/CSE.cc index 3e217ee322..9830399ffe 100644 --- a/src/script_opt/CSE.cc +++ b/src/script_opt/CSE.cc @@ -148,7 +148,7 @@ TraversalCode CSE_ValidityChecker::PreExpr(const Expr* e) { auto aggr = e->GetOp1(); auto aggr_t = aggr->GetType(); - if ( in_aggr_mod_expr ) { + if ( in_aggr_mod_expr > 0 ) { auto aggr_id = aggr->AsNameExpr()->Id(); if ( CheckID(aggr_id, true) || CheckAggrMod(aggr_t) ) @@ -168,7 +168,7 @@ TraversalCode CSE_ValidityChecker::PreExpr(const Expr* e) { } TraversalCode CSE_ValidityChecker::PostExpr(const Expr* e) { - if ( e->Tag() == EXPR_AGGR_ADD || e->Tag() == EXPR_AGGR_DEL ) + if ( have_start_e && (e->Tag() == EXPR_AGGR_ADD || e->Tag() == EXPR_AGGR_DEL) ) --in_aggr_mod_expr; return TC_CONTINUE; diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index 568b3202cb..fe72fb60ec 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -723,6 +723,17 @@ ExprPtr AddExpr::BuildSub(const ExprPtr& op1, const ExprPtr& op2) { return with_location_of(make_intrusive(op1, rhs), this); } +ExprPtr AggrAddDelExpr::Reduce(Reducer* c, StmtPtr& red_stmt) { + if ( type ) + return UnaryExpr::Reduce(c, red_stmt); + + if ( c->Optimizing() ) + op = c->UpdateExpr(op); + + red_stmt = op->ReduceToSingletons(c); + return ThisPtr(); +} + ExprPtr AggrAddExpr::Duplicate() { return SetSucc(new AggrAddExpr(op->Duplicate())); } ExprPtr AggrDelExpr::Duplicate() { return SetSucc(new AggrDelExpr(op->Duplicate())); }