diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index 3af06df5cd..da42ac46db 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -369,7 +369,7 @@ ExprPtr NameExpr::Reduce(Reducer* c, StmtPtr& red_stmt) return TransformMe(make_intrusive(v), c, red_stmt); } - return c->UpdateName(this)->ThisPtr(); + return c->UpdateName({NewRef{}, this}); } ValPtr NameExpr::FoldVal() const diff --git a/src/script_opt/Reduce.cc b/src/script_opt/Reduce.cc index 5e7adb7e41..b30c669882 100644 --- a/src/script_opt/Reduce.cc +++ b/src/script_opt/Reduce.cc @@ -33,15 +33,12 @@ ExprPtr Reducer::GenTemporaryExpr(const TypePtr& t, ExprPtr rhs) return e; } -NameExpr* Reducer::UpdateName(NameExpr* n) +NameExprPtr Reducer::UpdateName(NameExprPtr n) { - if ( NameIsReduced(n) ) - { - Ref(n); + if ( NameIsReduced(n.get()) ) return n; - } - return new NameExpr(FindNewLocal(n)); + return make_intrusive(FindNewLocal(n.get())); } bool Reducer::NameIsReduced(const NameExpr* n) const @@ -58,7 +55,10 @@ void Reducer::UpdateIDs(IDPList* ids) IDPtr id = {NewRef{}, (*ids)[i]}; if ( ! ID_IsReduced(id) ) + { + Unref((*ids)[i]); (*ids)[i] = UpdateID(id).release(); + } } } @@ -198,7 +198,7 @@ TempVar* Reducer::FindTemporary(const ID* id) const return tmp->second; } -Stmt* Reducer::MergeStmts(const NameExpr* lhs, ExprPtr rhs, Stmt* succ_stmt) +StmtPtr Reducer::MergeStmts(const NameExpr* lhs, ExprPtr rhs, Stmt* succ_stmt) { // First check for tmp=rhs. auto lhs_id = lhs->Id(); @@ -254,7 +254,7 @@ Stmt* Reducer::MergeStmts(const NameExpr* lhs, ExprPtr rhs, Stmt* succ_stmt) nullptr, nullptr, false); TrackExprReplacement(rhs.get(), merge_e.get()); - return new ExprStmt(merge_e); + return make_intrusive(merge_e); } void Reducer::TrackExprReplacement(const Expr* orig, const Expr* e) diff --git a/src/script_opt/Reduce.h b/src/script_opt/Reduce.h index 9f82eba2b0..51214d6e01 100644 --- a/src/script_opt/Reduce.h +++ b/src/script_opt/Reduce.h @@ -25,7 +25,7 @@ public: ExprPtr GenTemporaryExpr(const TypePtr& t, ExprPtr rhs); - NameExpr* UpdateName(NameExpr* n); + NameExprPtr UpdateName(NameExprPtr n); bool NameIsReduced(const NameExpr* n) const; void UpdateIDs(IDPList* ids); @@ -105,7 +105,7 @@ public: // Given an lhs=rhs statement followed by succ_stmt, returns // a (new) merge of the two if they're of the form tmp=rhs, var=tmp; // otherwise, nil. - Stmt* MergeStmts(const NameExpr* lhs, ExprPtr rhs, Stmt* succ_stmt); + StmtPtr MergeStmts(const NameExpr* lhs, ExprPtr rhs, Stmt* succ_stmt); // The following two methods will, in the future, update expressions // with optimized versions. They are distinct because the first diff --git a/src/script_opt/Stmt.cc b/src/script_opt/Stmt.cc index 9b9f5b7f4c..9f61aaa4fd 100644 --- a/src/script_opt/Stmt.cc +++ b/src/script_opt/Stmt.cc @@ -845,7 +845,7 @@ bool StmtList::ReduceStmt(int& s_i, StmtPList* f_stmts, Reducer* c) auto merge = c->MergeStmts(var, rhs, s_i_succ); if ( merge ) { - f_stmts->append(merge); + f_stmts->append(merge.release()); // Skip both this statement and the next, // now that we've substituted the merge.