Internals: V3Dead: Avoid iterating over vars we can't remove.

This commit is contained in:
Wilson Snyder 2012-02-29 23:05:11 -05:00
parent e6244ca204
commit 8c75674591
2 changed files with 14 additions and 14 deletions

View File

@ -70,16 +70,16 @@ class DeadVisitor : public AstNVisitor {
private: private:
// NODE STATE // NODE STATE
// Entire Netlist: // Entire Netlist:
// AstNodeModule::user() -> int. Count of number of cells referencing this module. // AstNodeModule::user1() -> int. Count of number of cells referencing this module.
// AstVar::user() -> int. Count of number of references // AstVar::user1() -> int. Count of number of references
// AstVarScope::user() -> int. Count of number of references // AstVarScope::user1() -> int. Count of number of references
AstUser1InUse m_inuser1; AstUser1InUse m_inuser1;
// TYPES // TYPES
typedef multimap<AstVarScope*,AstNodeAssign*> AssignMap; typedef multimap<AstVarScope*,AstNodeAssign*> AssignMap;
// STATE // STATE
vector<AstVar*> m_varsp; // List of all encountered to avoid another loop through tree vector<AstNode*> m_varEtcsp; // List of all encountered to avoid another loop through tree
vector<AstVarScope*> m_vscsp; // List of all encountered to avoid another loop through tree vector<AstVarScope*> m_vscsp; // List of all encountered to avoid another loop through tree
AssignMap m_assignMap; // List of all simple assignments for each variable AssignMap m_assignMap; // List of all simple assignments for each variable
bool m_elimUserVars; // Allow removal of user's vars bool m_elimUserVars; // Allow removal of user's vars
@ -130,11 +130,15 @@ private:
} }
virtual void visit(AstVarScope* nodep, AstNUser*) { virtual void visit(AstVarScope* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
m_vscsp.push_back(nodep); if (mightElim(nodep->varp())) {
m_vscsp.push_back(nodep);
}
} }
virtual void visit(AstVar* nodep, AstNUser*) { virtual void visit(AstVar* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
m_varsp.push_back(nodep); if (mightElim(nodep)) {
m_varEtcsp.push_back(nodep);
}
} }
virtual void visit(AstNodeAssign* nodep, AstNUser*) { virtual void visit(AstNodeAssign* nodep, AstNUser*) {
@ -180,7 +184,7 @@ private:
} }
} }
} }
bool canElim(AstVar* nodep) { bool mightElim(AstVar* nodep) {
return (!nodep->isSigPublic() // Can't elim publics! return (!nodep->isSigPublic() // Can't elim publics!
&& !nodep->isIO() && !nodep->isIO()
&& (nodep->isTemp() || nodep->isParam() || m_elimUserVars)); && (nodep->isTemp() || nodep->isParam() || m_elimUserVars));
@ -189,7 +193,7 @@ private:
// Delete any unused varscopes // Delete any unused varscopes
for (vector<AstVarScope*>::iterator it = m_vscsp.begin(); it!=m_vscsp.end(); ++it) { for (vector<AstVarScope*>::iterator it = m_vscsp.begin(); it!=m_vscsp.end(); ++it) {
AstVarScope* vscp = *it; AstVarScope* vscp = *it;
if (vscp->user1() == 0 && canElim(vscp->varp())) { if (vscp->user1() == 0) {
UINFO(4," Dead "<<vscp<<endl); UINFO(4," Dead "<<vscp<<endl);
pair <AssignMap::iterator,AssignMap::iterator> eqrange = m_assignMap.equal_range(vscp); pair <AssignMap::iterator,AssignMap::iterator> eqrange = m_assignMap.equal_range(vscp);
for (AssignMap::iterator it = eqrange.first; it != eqrange.second; ++it) { for (AssignMap::iterator it = eqrange.first; it != eqrange.second; ++it) {
@ -200,8 +204,8 @@ private:
vscp->unlinkFrBack()->deleteTree(); vscp=NULL; vscp->unlinkFrBack()->deleteTree(); vscp=NULL;
} }
} }
for (vector<AstVar*>::iterator it = m_varsp.begin(); it!=m_varsp.end(); ++it) { for (vector<AstNode*>::iterator it = m_varEtcsp.begin(); it!=m_varEtcsp.end(); ++it) {
if ((*it)->user1() == 0 && canElim((*it))) { if ((*it)->user1() == 0) {
UINFO(4," Dead "<<(*it)<<endl); UINFO(4," Dead "<<(*it)<<endl);
(*it)->unlinkFrBack()->deleteTree(); (*it)=NULL; (*it)->unlinkFrBack()->deleteTree(); (*it)=NULL;
} }

View File

@ -3323,7 +3323,3 @@ string V3ParseGrammar::deQuote(FileLine* fileline, string text) {
// --report=lookahead // --report=lookahead
// --report=itemset // --report=itemset
// --graph // --graph
//
// Local Variables:
// compile-command: "cd obj_dbg ; /usr/bin/bison -y -d -v ../verilog.y ; cat y.output"
// End: