Skip to content

Commit 3c5cfaa

Browse files
committed
Internals: Remove the memoized superclass set in CaptureVisitor
No functional change intended. Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
1 parent 4c36e0d commit 3c5cfaa

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

src/V3Randomize.cpp

+11-12
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,6 @@ class CaptureVisitor final : public VNVisitor {
737737
AstClass* m_targetp; // Module of inner context (for symbol lookup)
738738
std::map<const AstVar*, AstVar*> m_varCloneMap; // Map original var nodes to their clones
739739
std::set<AstNode*> m_ignore; // Nodes to ignore for capturing
740-
std::set<AstNodeModule*> m_visibleModules; // Modules whose scopes are visible
741740
AstVar* m_thisp = nullptr; // Variable for outer context's object, if necessary
742741

743742
// METHODS
@@ -792,21 +791,20 @@ class CaptureVisitor final : public VNVisitor {
792791
}
793792

794793
CaptureMode getVarRefCaptureMode(AstNodeVarRef* varRefp) {
795-
AstNodeModule* const modp = VN_AS(varRefp->varp()->user2p(), NodeModule);
794+
AstNodeModule* const varModp = VN_AS(varRefp->varp()->user2p(), NodeModule);
795+
AstClass* const varClassp = VN_CAST(varModp, Class);
796+
AstClass* const callerClassp = VN_CAST(m_callerp, Class);
796797

797-
const bool callerIsClass = VN_IS(m_callerp, Class);
798+
const bool callerIsClass = callerClassp;
798799
const bool refIsXref = VN_IS(varRefp, VarXRef);
799800
const bool varIsFuncLocal = varRefp->varp()->isFuncLocal();
800801
const bool varHasAutomaticLifetime = varRefp->varp()->lifetime().isAutomatic();
801-
const bool varIsDeclaredInCaller = modp == m_callerp;
802802
const bool varIsFieldOfCaller
803-
= modp ? m_visibleModules.find(modp) != m_visibleModules.end() : false;
804-
803+
= callerClassp && varClassp ? isSuperClassOf(varClassp, callerClassp) : false;
805804
if (refIsXref) return CaptureMode::CAP_VALUE | CaptureMode::CAP_F_XREF;
806805
if (varIsFuncLocal && varHasAutomaticLifetime) return CaptureMode::CAP_VALUE;
807806
// Static var in function (will not be inlined, because it's in class)
808807
if (callerIsClass && varIsFuncLocal) return CaptureMode::CAP_VALUE;
809-
if (callerIsClass && varIsDeclaredInCaller) return CaptureMode::CAP_THIS;
810808
if (callerIsClass && varIsFieldOfCaller) return CaptureMode::CAP_THIS;
811809
UASSERT_OBJ(!callerIsClass, varRefp, "Invalid reference?");
812810
return CaptureMode::CAP_VALUE;
@@ -845,13 +843,15 @@ class CaptureVisitor final : public VNVisitor {
845843
m_ignore.emplace(memberSelp);
846844
}
847845

848-
void fetchVisibleModules(AstClass* classp) {
849-
for (AstClassExtends* extendsp = classp->extendsp(); extendsp;
846+
// Returns true if the first class is a superclass of the second class
847+
bool isSuperClassOf(AstClass* const classIsp, AstClass* const classOfp) {
848+
if (classIsp == classOfp) return true;
849+
for (AstClassExtends* extendsp = classOfp->extendsp(); extendsp;
850850
extendsp = VN_AS(extendsp->nextp(), ClassExtends)) {
851851
AstClass* const superClassp = VN_AS(extendsp->childDTypep(), ClassRefDType)->classp();
852-
m_visibleModules.insert(superClassp);
853-
fetchVisibleModules(superClassp);
852+
if (isSuperClassOf(classIsp, superClassp)) return true;
854853
}
854+
return false;
855855
}
856856

857857
// VISITORS
@@ -936,7 +936,6 @@ class CaptureVisitor final : public VNVisitor {
936936
: m_argsp(nullptr)
937937
, m_callerp(callerp)
938938
, m_targetp(targetp) {
939-
if (AstClass* classp = VN_CAST(callerp, Class)) fetchVisibleModules(classp);
940939
iterateAndNextNull(nodep);
941940
}
942941

0 commit comments

Comments
 (0)