Internals: Fix not clearing packagep on some assignments. Should affect assertions only.

This commit is contained in:
Wilson Snyder 2020-11-24 21:34:11 -05:00
parent fd21a41acd
commit dc1f44840d
1 changed files with 21 additions and 19 deletions

View File

@ -106,6 +106,9 @@ private:
} }
if (AstNode* subnodep = nodep->getChildDTypep()) subnodep->user1Inc(); if (AstNode* subnodep = nodep->getChildDTypep()) subnodep->user1Inc();
} }
void checkVarRef(AstNodeVarRef* nodep) {
if (nodep->packagep() && m_elimCells) { nodep->packagep(nullptr); }
}
void checkDType(AstNodeDType* nodep) { void checkDType(AstNodeDType* nodep) {
if (!nodep->generic() // Don't remove generic types if (!nodep->generic() // Don't remove generic types
&& m_elimDTypes // dtypes stick around until post-widthing && m_elimDTypes // dtypes stick around until post-widthing
@ -159,20 +162,16 @@ private:
} }
virtual void visit(AstNodeVarRef* nodep) override { virtual void visit(AstNodeVarRef* nodep) override {
// Note NodeAssign skips calling this in some cases
iterateChildren(nodep); iterateChildren(nodep);
checkAll(nodep); checkAll(nodep);
checkVarRef(nodep);
if (nodep->varScopep()) { if (nodep->varScopep()) {
nodep->varScopep()->user1Inc(); nodep->varScopep()->user1Inc();
nodep->varScopep()->varp()->user1Inc(); nodep->varScopep()->varp()->user1Inc();
} }
if (nodep->varp()) nodep->varp()->user1Inc(); if (nodep->varp()) nodep->varp()->user1Inc();
if (nodep->packagep()) { if (nodep->packagep()) nodep->packagep()->user1Inc();
if (m_elimCells) {
nodep->packagep(nullptr);
} else {
nodep->packagep()->user1Inc();
}
}
} }
virtual void visit(AstNodeFTaskRef* nodep) override { virtual void visit(AstNodeFTaskRef* nodep) override {
iterateChildren(nodep); iterateChildren(nodep);
@ -276,6 +275,8 @@ private:
// See if simple assignments to variables may be eliminated because // See if simple assignments to variables may be eliminated because
// that variable is never used. // that variable is never used.
// Similar code in V3Life // Similar code in V3Life
VL_RESTORER(m_sideEffect);
{
m_sideEffect = false; m_sideEffect = false;
iterateAndNextNull(nodep->rhsp()); iterateAndNextNull(nodep->rhsp());
checkAll(nodep); checkAll(nodep);
@ -285,10 +286,11 @@ private:
&& varrefp->varScopep()) { // For simplicity, we only remove post-scoping && varrefp->varScopep()) { // For simplicity, we only remove post-scoping
m_assignMap.insert(make_pair(varrefp->varScopep(), nodep)); m_assignMap.insert(make_pair(varrefp->varScopep(), nodep));
checkAll(varrefp); // Must track reference to dtype() checkAll(varrefp); // Must track reference to dtype()
checkVarRef(varrefp);
} else { // Track like any other statement } else { // Track like any other statement
iterateAndNextNull(nodep->lhsp()); iterateAndNextNull(nodep->lhsp());
} }
checkAll(nodep); }
} }
//----- //-----