Switch some Expr transform/reduce logic to use IntrusivePtr

This commit is contained in:
Jon Siwek 2021-01-13 20:27:41 -08:00
parent d88a899804
commit b799665c1a
2 changed files with 27 additions and 27 deletions

View file

@ -272,11 +272,7 @@ public:
{ return false; } { return false; }
// Returns the current expression transformed into "new_me". // Returns the current expression transformed into "new_me".
// Takes a bare pointer for "new_me" since often it's newly ExprPtr TransformMe(ExprPtr new_me, Reducer* c, StmtPtr& red_stmt);
// allocated.
ExprPtr TransformMe(Expr* new_me, Reducer* c, StmtPtr& red_stmt);
ExprPtr TransformMe(ExprPtr new_me, Reducer* c, StmtPtr& red_stmt)
{ return TransformMe(new_me.get(), c, red_stmt); }
// Returns a set of predecessor statements in red_stmt (which might // Returns a set of predecessor statements in red_stmt (which might
// be nil if no reduction necessary), and the reduced version of // be nil if no reduction necessary), and the reduced version of

View file

@ -292,16 +292,16 @@ ExprPtr Expr::AssignToTemporary(ExprPtr e, Reducer* c, StmtPtr& red_stmt)
return result_tmp->Duplicate(); return result_tmp->Duplicate();
} }
ExprPtr Expr::TransformMe(Expr* new_me, Reducer* c, StmtPtr& red_stmt) ExprPtr Expr::TransformMe(ExprPtr new_me, Reducer* c, StmtPtr& red_stmt)
{ {
if ( new_me == this ) if ( new_me == this )
return ThisPtr(); return new_me;
new_me->SetOriginal(ThisPtr()); new_me->SetOriginal(ThisPtr());
// Unlike for Stmt's, we assume that new_me has already // Unlike for Stmt's, we assume that new_me has already
// been reduced, so no need to do so further. // been reduced, so no need to do so further.
return new_me->ThisPtr(); return new_me;
} }
StmtPtr Expr::MergeStmts(StmtPtr s1, StmtPtr s2, StmtPtr s3) const StmtPtr Expr::MergeStmts(StmtPtr s1, StmtPtr s2, StmtPtr s3) const
@ -366,7 +366,7 @@ ExprPtr NameExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
{ {
ValPtr v = id->GetVal(); ValPtr v = id->GetVal();
ASSERT(v); ASSERT(v);
return TransformMe(new ConstExpr(v), c, red_stmt); return TransformMe(make_intrusive<ConstExpr>(v), c, red_stmt);
} }
return c->UpdateName(this)->ThisPtr(); return c->UpdateName(this)->ThisPtr();
@ -432,7 +432,7 @@ ExprPtr UnaryExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
if ( op_val ) if ( op_val )
{ {
auto fold = Fold(op_val.get()); auto fold = Fold(op_val.get());
return TransformMe(new ConstExpr(fold), c, red_stmt); return TransformMe(make_intrusive<ConstExpr>(fold), c, red_stmt);
} }
if ( c->Optimizing() ) if ( c->Optimizing() )
@ -489,7 +489,7 @@ ExprPtr BinaryExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
if ( op1_fold_val && op2_fold_val ) if ( op1_fold_val && op2_fold_val )
{ {
auto fold = Fold(op1_fold_val.get(), op2_fold_val.get()); auto fold = Fold(op1_fold_val.get(), op2_fold_val.get());
return TransformMe(new ConstExpr(fold), c, red_stmt); return TransformMe(make_intrusive<ConstExpr>(fold), c, red_stmt);
} }
if ( c->Optimizing() ) if ( c->Optimizing() )
@ -560,9 +560,13 @@ ExprPtr IncrExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
auto incr_const = make_intrusive<ConstExpr>(val_mgr->Count(1)); auto incr_const = make_intrusive<ConstExpr>(val_mgr->Count(1));
incr_const->SetOriginal(ThisPtr()); incr_const->SetOriginal(ThisPtr());
auto incr_expr = Tag() == EXPR_INCR ? ExprPtr incr_expr;
(Expr*) new AddExpr(target, incr_const) :
(Expr*) new SubExpr(target, incr_const); if ( Tag() == EXPR_INCR )
incr_expr = make_intrusive<AddExpr>(target, incr_const);
else
incr_expr = make_intrusive<SubExpr>(target, incr_const);
incr_expr->SetOriginal(ThisPtr()); incr_expr->SetOriginal(ThisPtr());
StmtPtr incr_stmt; StmtPtr incr_stmt;
auto incr_expr2 = incr_expr->Reduce(c, incr_stmt); auto incr_expr2 = incr_expr->Reduce(c, incr_stmt);
@ -796,8 +800,8 @@ ExprPtr AddToExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
// the following is basically equivalent. // the following is basically equivalent.
auto rhs = op1->AsRefExprPtr()->GetOp1(); auto rhs = op1->AsRefExprPtr()->GetOp1();
auto do_incr = make_intrusive<AddExpr>(rhs->Duplicate(), op2); auto do_incr = make_intrusive<AddExpr>(rhs->Duplicate(), op2);
auto assign = new AssignExpr(op1, do_incr, false, nullptr, auto assign = make_intrusive<AssignExpr>(op1, do_incr, false, nullptr,
nullptr, false); nullptr, false);
return assign->ReduceToSingleton(c, red_stmt); return assign->ReduceToSingleton(c, red_stmt);
} }
@ -827,7 +831,7 @@ ExprPtr SubExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
if ( op2->Tag() == EXPR_NEGATE ) if ( op2->Tag() == EXPR_NEGATE )
{ {
auto rhs = op2->GetOp1(); auto rhs = op2->GetOp1();
auto add = new AddExpr(op1, rhs); auto add = make_intrusive<AddExpr>(op1, rhs);
add->SetOriginal(ThisPtr()); add->SetOriginal(ThisPtr());
return add->Reduce(c, red_stmt); return add->Reduce(c, red_stmt);
} }
@ -865,8 +869,8 @@ ExprPtr RemoveFromExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
{ {
auto rhs = op1->AsRefExprPtr()->GetOp1(); auto rhs = op1->AsRefExprPtr()->GetOp1();
auto do_decr = make_intrusive<SubExpr>(rhs->Duplicate(), op2); auto do_decr = make_intrusive<SubExpr>(rhs->Duplicate(), op2);
auto assign = new AssignExpr(op1, do_decr, false, nullptr, nullptr, auto assign = make_intrusive<AssignExpr>(op1, do_decr, false, nullptr, nullptr,
false); false);
return assign->Reduce(c, red_stmt); return assign->Reduce(c, red_stmt);
} }
@ -1070,11 +1074,11 @@ ExprPtr BoolExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
auto else_val = is_and ? val_mgr->False() : val_mgr->True(); auto else_val = is_and ? val_mgr->False() : val_mgr->True();
ExprPtr else_e = make_intrusive<ConstExpr>(else_val); ExprPtr else_e = make_intrusive<ConstExpr>(else_val);
Expr* cond; ExprPtr cond;
if ( is_and ) if ( is_and )
cond = new CondExpr(op1, op2, else_e); cond = make_intrusive<CondExpr>(op1, op2, else_e);
else else
cond = new CondExpr(op1, else_e, op2); cond = make_intrusive<CondExpr>(op1, else_e, op2);
auto cond_red = cond->ReduceToSingleton(c, red_stmt); auto cond_red = cond->ReduceToSingleton(c, red_stmt);
@ -1144,7 +1148,7 @@ ExprPtr BitExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
if ( Tag() == EXPR_XOR ) if ( Tag() == EXPR_XOR )
{ {
auto zero = new ConstExpr(val_mgr->Count(0)); auto zero = make_intrusive<ConstExpr>(val_mgr->Count(0));
zero->SetOriginal(ThisPtr()); zero->SetOriginal(ThisPtr());
return zero->Reduce(c, red_stmt); return zero->Reduce(c, red_stmt);
} }
@ -1202,7 +1206,7 @@ ExprPtr RelExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
if ( same_singletons(op1, op2) ) if ( same_singletons(op1, op2) )
{ {
bool t = Tag() == EXPR_GE || Tag() == EXPR_LE; bool t = Tag() == EXPR_GE || Tag() == EXPR_LE;
auto res = new ConstExpr(val_mgr->Bool(t)); auto res = make_intrusive<ConstExpr>(val_mgr->Bool(t));
res->SetOriginal(ThisPtr()); res->SetOriginal(ThisPtr());
return res->Reduce(c, red_stmt); return res->Reduce(c, red_stmt);
} }
@ -1530,7 +1534,7 @@ ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
red_stmt = MergeStmts(MergeStmts(rhs_reduce, ind1_stmt), red_stmt = MergeStmts(MergeStmts(rhs_reduce, ind1_stmt),
ind2_stmt, rhs_stmt); ind2_stmt, rhs_stmt);
auto index_assign = new IndexAssignExpr(ind1_e, ind2_e, rhs_e); auto index_assign = make_intrusive<IndexAssignExpr>(ind1_e, ind2_e, rhs_e);
return TransformMe(index_assign, c, red_stmt); return TransformMe(index_assign, c, red_stmt);
} }
@ -1549,7 +1553,7 @@ ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
auto field_name = field_e->FieldName(); auto field_name = field_e->FieldName();
auto field = field_e->Field(); auto field = field_e->Field();
auto field_assign = auto field_assign =
new FieldLHSAssignExpr(lhs_e, rhs_e, field_name, field); make_intrusive<FieldLHSAssignExpr>(lhs_e, rhs_e, field_name, field);
return TransformMe(field_assign, c, red_stmt); return TransformMe(field_assign, c, red_stmt);
} }
@ -1577,7 +1581,7 @@ ExprPtr AssignExpr::Reduce(Reducer* c, StmtPtr& red_stmt)
red_stmt = MergeStmts(red_stmt, assign_stmt); red_stmt = MergeStmts(red_stmt, assign_stmt);
} }
return TransformMe(new NopExpr(), c, red_stmt); return TransformMe(make_intrusive<NopExpr>(), c, red_stmt);
} }
if ( op2->WillTransform(c) ) if ( op2->WillTransform(c) )