Fix class members getting misoptimized away.
This commit is contained in:
parent
15b40a97d9
commit
1a6c2fc55d
|
|
@ -597,7 +597,8 @@ public:
|
||||||
MODULETEMP,
|
MODULETEMP,
|
||||||
STMTTEMP,
|
STMTTEMP,
|
||||||
XTEMP,
|
XTEMP,
|
||||||
IFACEREF // Used to link Interfaces between modules
|
IFACEREF, // Used to link Interfaces between modules
|
||||||
|
MEMBER
|
||||||
};
|
};
|
||||||
enum en m_e;
|
enum en m_e;
|
||||||
inline AstVarType() : m_e(UNKNOWN) {}
|
inline AstVarType() : m_e(UNKNOWN) {}
|
||||||
|
|
@ -612,7 +613,7 @@ public:
|
||||||
"TRIWIRE", "TRI0", "TRI1",
|
"TRIWIRE", "TRI0", "TRI1",
|
||||||
"PORT",
|
"PORT",
|
||||||
"BLOCKTEMP", "MODULETEMP", "STMTTEMP", "XTEMP",
|
"BLOCKTEMP", "MODULETEMP", "STMTTEMP", "XTEMP",
|
||||||
"IFACEREF"};
|
"IFACEREF", "MEMBER"};
|
||||||
return names[m_e]; }
|
return names[m_e]; }
|
||||||
bool isSignal() const {
|
bool isSignal() const {
|
||||||
return (m_e==WIRE || m_e==WREAL || m_e==IMPLICITWIRE
|
return (m_e==WIRE || m_e==WREAL || m_e==IMPLICITWIRE
|
||||||
|
|
@ -632,7 +633,7 @@ public:
|
||||||
return (m_e==GPARAM || m_e==LPARAM || m_e==GENVAR
|
return (m_e==GPARAM || m_e==LPARAM || m_e==GENVAR
|
||||||
|| m_e==VAR
|
|| m_e==VAR
|
||||||
|| m_e==BLOCKTEMP || m_e==MODULETEMP || m_e==STMTTEMP
|
|| m_e==BLOCKTEMP || m_e==MODULETEMP || m_e==STMTTEMP
|
||||||
|| m_e==XTEMP || m_e==IFACEREF);
|
|| m_e==XTEMP || m_e==IFACEREF || m_e==MEMBER);
|
||||||
}
|
}
|
||||||
bool isTemp() const {
|
bool isTemp() const {
|
||||||
return (m_e==BLOCKTEMP || m_e==MODULETEMP || m_e==STMTTEMP || m_e==XTEMP);
|
return (m_e==BLOCKTEMP || m_e==MODULETEMP || m_e==STMTTEMP || m_e==XTEMP);
|
||||||
|
|
|
||||||
|
|
@ -1307,7 +1307,6 @@ void AstVar::dump(std::ostream& str) const {
|
||||||
if (attrClockEn()) str<<" [aCLKEN]";
|
if (attrClockEn()) str<<" [aCLKEN]";
|
||||||
if (attrIsolateAssign()) str<<" [aISO]";
|
if (attrIsolateAssign()) str<<" [aISO]";
|
||||||
if (attrFileDescr()) str<<" [aFD]";
|
if (attrFileDescr()) str<<" [aFD]";
|
||||||
if (isClassMember()) str<<" [MEMBER]";
|
|
||||||
if (isFuncReturn()) str<<" [FUNCRTN]";
|
if (isFuncReturn()) str<<" [FUNCRTN]";
|
||||||
else if (isFuncLocal()) str<<" [FUNC]";
|
else if (isFuncLocal()) str<<" [FUNC]";
|
||||||
if (isDpiOpenArray()) str<<" [DPIOPENA]";
|
if (isDpiOpenArray()) str<<" [DPIOPENA]";
|
||||||
|
|
|
||||||
|
|
@ -1575,7 +1575,6 @@ private:
|
||||||
bool m_usedClock:1; // Signal used as a clock
|
bool m_usedClock:1; // Signal used as a clock
|
||||||
bool m_usedParam:1; // Parameter is referenced (on link; later signals not setup)
|
bool m_usedParam:1; // Parameter is referenced (on link; later signals not setup)
|
||||||
bool m_usedLoopIdx:1; // Variable subject of for unrolling
|
bool m_usedLoopIdx:1; // Variable subject of for unrolling
|
||||||
bool m_classMember:1; // Member variable for a class
|
|
||||||
bool m_funcLocal:1; // Local variable for a function
|
bool m_funcLocal:1; // Local variable for a function
|
||||||
bool m_funcReturn:1; // Return variable for a function
|
bool m_funcReturn:1; // Return variable for a function
|
||||||
bool m_attrClockEn:1;// User clock enable attribute
|
bool m_attrClockEn:1;// User clock enable attribute
|
||||||
|
|
@ -1603,7 +1602,6 @@ private:
|
||||||
m_usedClock = false; m_usedParam = false; m_usedLoopIdx = false;
|
m_usedClock = false; m_usedParam = false; m_usedLoopIdx = false;
|
||||||
m_sigPublic = false; m_sigModPublic = false;
|
m_sigPublic = false; m_sigModPublic = false;
|
||||||
m_sigUserRdPublic = false; m_sigUserRWPublic = false;
|
m_sigUserRdPublic = false; m_sigUserRWPublic = false;
|
||||||
m_classMember = false;
|
|
||||||
m_funcLocal = false; m_funcReturn = false;
|
m_funcLocal = false; m_funcReturn = false;
|
||||||
m_attrClockEn = false; m_attrScBv = false;
|
m_attrClockEn = false; m_attrScBv = false;
|
||||||
m_attrIsolateAssign = false; m_attrSFormat = false; m_attrSplitVar = false;
|
m_attrIsolateAssign = false; m_attrSFormat = false; m_attrSplitVar = false;
|
||||||
|
|
@ -1724,7 +1722,6 @@ public:
|
||||||
void isConst(bool flag) { m_isConst = flag; }
|
void isConst(bool flag) { m_isConst = flag; }
|
||||||
void isStatic(bool flag) { m_isStatic = flag; }
|
void isStatic(bool flag) { m_isStatic = flag; }
|
||||||
void isIfaceParent(bool flag) { m_isIfaceParent = flag; }
|
void isIfaceParent(bool flag) { m_isIfaceParent = flag; }
|
||||||
void classMember(bool flag) { m_classMember = flag; }
|
|
||||||
void funcLocal(bool flag) { m_funcLocal = flag; }
|
void funcLocal(bool flag) { m_funcLocal = flag; }
|
||||||
void funcReturn(bool flag) { m_funcReturn = flag; }
|
void funcReturn(bool flag) { m_funcReturn = flag; }
|
||||||
void isDpiOpenArray(bool flag) { m_isDpiOpenArray = flag; }
|
void isDpiOpenArray(bool flag) { m_isDpiOpenArray = flag; }
|
||||||
|
|
@ -1756,6 +1753,7 @@ public:
|
||||||
&& (isIO() || isBitLogic())
|
&& (isIO() || isBitLogic())
|
||||||
// Wrapper would otherwise duplicate wrapped module's coverage
|
// Wrapper would otherwise duplicate wrapped module's coverage
|
||||||
&& !isSc() && !isPrimaryIO() && !isConst()); }
|
&& !isSc() && !isPrimaryIO() && !isConst()); }
|
||||||
|
bool isClassMember() const { return varType() == AstVarType::MEMBER; }
|
||||||
bool isStatementTemp() const { return (varType()==AstVarType::STMTTEMP); }
|
bool isStatementTemp() const { return (varType()==AstVarType::STMTTEMP); }
|
||||||
bool isMovableToBlock() const { return (varType()==AstVarType::BLOCKTEMP || isFuncLocal()); }
|
bool isMovableToBlock() const { return (varType()==AstVarType::BLOCKTEMP || isFuncLocal()); }
|
||||||
bool isXTemp() const { return (varType()==AstVarType::XTEMP); }
|
bool isXTemp() const { return (varType()==AstVarType::XTEMP); }
|
||||||
|
|
@ -1779,7 +1777,6 @@ public:
|
||||||
bool isTrace() const { return m_trace; }
|
bool isTrace() const { return m_trace; }
|
||||||
bool isConst() const { return m_isConst; }
|
bool isConst() const { return m_isConst; }
|
||||||
bool isStatic() const { return m_isStatic; }
|
bool isStatic() const { return m_isStatic; }
|
||||||
bool isClassMember() const { return m_classMember; }
|
|
||||||
bool isFuncLocal() const { return m_funcLocal; }
|
bool isFuncLocal() const { return m_funcLocal; }
|
||||||
bool isFuncReturn() const { return m_funcReturn; }
|
bool isFuncReturn() const { return m_funcReturn; }
|
||||||
bool isPullup() const { return m_isPullup; }
|
bool isPullup() const { return m_isPullup; }
|
||||||
|
|
|
||||||
|
|
@ -328,6 +328,7 @@ private:
|
||||||
bool mightElimVar(AstVar* nodep) {
|
bool mightElimVar(AstVar* nodep) {
|
||||||
return (!nodep->isSigPublic() // Can't elim publics!
|
return (!nodep->isSigPublic() // Can't elim publics!
|
||||||
&& !nodep->isIO()
|
&& !nodep->isIO()
|
||||||
|
&& !nodep->isClassMember()
|
||||||
&& ((nodep->isTemp() && !nodep->isTrace())
|
&& ((nodep->isTemp() && !nodep->isTrace())
|
||||||
|| (nodep->isParam() && !nodep->isTrace() && !v3Global.opt.xmlOnly())
|
|| (nodep->isParam() && !nodep->isTrace() && !v3Global.opt.xmlOnly())
|
||||||
|| m_elimUserVars)); // Post-Trace can kill most anything
|
|| m_elimUserVars)); // Post-Trace can kill most anything
|
||||||
|
|
|
||||||
|
|
@ -2513,7 +2513,8 @@ void EmitCStmts::emitVarList(AstNode* firstp, EisWhich which, const string& pref
|
||||||
bool doit = true;
|
bool doit = true;
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case EVL_CLASS_IO: doit = varp->isIO(); break;
|
case EVL_CLASS_IO: doit = varp->isIO(); break;
|
||||||
case EVL_CLASS_SIG: doit = (varp->isSignal() && !varp->isIO()); break;
|
case EVL_CLASS_SIG:
|
||||||
|
doit = ((varp->isSignal() || varp->isClassMember()) && !varp->isIO()); break;
|
||||||
case EVL_CLASS_TEMP: doit = (varp->isTemp() && !varp->isIO()); break;
|
case EVL_CLASS_TEMP: doit = (varp->isTemp() && !varp->isIO()); break;
|
||||||
case EVL_CLASS_PAR: doit = (varp->isParam() && !VN_IS(varp->valuep(), Const)); break;
|
case EVL_CLASS_PAR: doit = (varp->isParam() && !VN_IS(varp->valuep(), Const)); break;
|
||||||
case EVL_CLASS_ALL: doit = true; break;
|
case EVL_CLASS_ALL: doit = true; break;
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@ private:
|
||||||
}
|
}
|
||||||
virtual void visit(AstVar* nodep) VL_OVERRIDE {
|
virtual void visit(AstVar* nodep) VL_OVERRIDE {
|
||||||
iterateChildren(nodep);
|
iterateChildren(nodep);
|
||||||
if (m_classp) nodep->classMember(true);
|
if (m_classp) nodep->varType(AstVarType::MEMBER);
|
||||||
if (m_ftaskp) nodep->funcLocal(true);
|
if (m_ftaskp) nodep->funcLocal(true);
|
||||||
if (nodep->isSigModPublic()) {
|
if (nodep->isSigModPublic()) {
|
||||||
nodep->sigModPublic(false); // We're done with this attribute
|
nodep->sigModPublic(false); // We're done with this attribute
|
||||||
|
|
|
||||||
|
|
@ -129,6 +129,7 @@ private:
|
||||||
if ((nodep->isMovableToBlock() // Blocktemp
|
if ((nodep->isMovableToBlock() // Blocktemp
|
||||||
|| !flags.m_notStd) // Or used only in block
|
|| !flags.m_notStd) // Or used only in block
|
||||||
&& !flags.m_notOpt // Optimizable
|
&& !flags.m_notOpt // Optimizable
|
||||||
|
&& !nodep->isClassMember()
|
||||||
&& nodep->user1p()) { // Single cfunc
|
&& nodep->user1p()) { // Single cfunc
|
||||||
// We don't need to test for tracing; it would be in the tracefunc if it was needed
|
// We don't need to test for tracing; it would be in the tracefunc if it was needed
|
||||||
UINFO(4," ModVar->BlkVar "<<nodep<<endl);
|
UINFO(4," ModVar->BlkVar "<<nodep<<endl);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue