Skip to content

Commit f2db39a

Browse files
cosminbascalukasstadler
authored andcommitted
MROLookup: avoid poly/megamorphic ReadAttr nodes on the mro classes
1 parent c481f43 commit f2db39a

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonClass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public Assumption createAttributeInMROFinalAssumption(Object name) {
127127
}
128128

129129
@TruffleBoundary
130-
public void setAttributesInMROFinalAssumption(Object name, Assumption assumption) {
130+
public void setAttributeInMROFinalAssumption(Object name, Assumption assumption) {
131131
List<Assumption> attrAssumptions = attributesInMROFinalAssumptions.getOrDefault(name, null);
132132
if (attrAssumptions == null) {
133133
attrAssumptions = new ArrayList<>();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ final static class PythonClassAssumptionPair {
107107
public PythonClass cls;
108108
public Assumption assumption;
109109

110-
public PythonClassAssumptionPair(PythonClass cls, Assumption assumption) {
110+
PythonClassAssumptionPair(PythonClass cls, Assumption assumption) {
111111
this.cls = cls;
112112
this.assumption = assumption;
113113
}
@@ -117,15 +117,15 @@ protected PythonClassAssumptionPair findAttrClassAndAssumptionInMRO(PythonClass
117117
PythonClass[] mro = klass.getMethodResolutionOrder();
118118
Assumption attrAssumption = null;
119119
for (int i = 0; i < mro.length; i++) {
120-
PythonClass kls = mro[i];
120+
PythonClass cls = mro[i];
121121
if (attrAssumption == null) {
122-
attrAssumption = kls.createAttributeInMROFinalAssumption(key);
122+
attrAssumption = cls.createAttributeInMROFinalAssumption(key);
123123
} else {
124-
kls.setAttributesInMROFinalAssumption(key, attrAssumption);
124+
cls.setAttributeInMROFinalAssumption(key, attrAssumption);
125125
}
126126

127-
if (kls.getStorage().containsKey(key)) {
128-
return new PythonClassAssumptionPair(kls, attrAssumption);
127+
if (cls.getStorage().containsKey(key)) {
128+
return new PythonClassAssumptionPair(cls, attrAssumption);
129129
}
130130
}
131131
return new PythonClassAssumptionPair(null, attrAssumption);
@@ -148,17 +148,25 @@ protected Object lookupConstantMROCached(@SuppressWarnings("unused") PythonClass
148148
return value;
149149
}
150150

151+
protected ReadAttributeFromObjectNode[] create(int size) {
152+
ReadAttributeFromObjectNode[] nodes = new ReadAttributeFromObjectNode[size];
153+
for (int i = 0; i < size; i++) {
154+
nodes[i] = ReadAttributeFromObjectNode.create();
155+
}
156+
return nodes;
157+
}
158+
151159
@Specialization(guards = {"klass == cachedKlass", "mroLength < 32"}, limit = "5", assumptions = "lookupStable")
152160
@ExplodeLoop(kind = ExplodeLoop.LoopExplosionKind.FULL_EXPLODE_UNTIL_RETURN)
153161
protected Object lookupConstantMRO(@SuppressWarnings("unused") PythonClass klass,
154162
@Cached("klass") @SuppressWarnings("unused") PythonClass cachedKlass,
155163
@Cached("cachedKlass.getLookupStableAssumption()") @SuppressWarnings("unused") Assumption lookupStable,
156-
@Cached("create()") ReadAttributeFromObjectNode readAttrNode,
157164
@Cached(value = "cachedKlass.getMethodResolutionOrder()", dimensions = 1) PythonClass[] mro,
158-
@Cached("mro.length") @SuppressWarnings("unused") int mroLength) {
165+
@Cached("mro.length") @SuppressWarnings("unused") int mroLength,
166+
@Cached("create(mroLength)") ReadAttributeFromObjectNode[] readAttrNodes) {
159167
for (int i = 0; i < mro.length; i++) {
160168
PythonClass kls = mro[i];
161-
Object value = readAttrNode.execute(kls, key);
169+
Object value = readAttrNodes[i].execute(kls, key);
162170
if (value != PNone.NO_VALUE) {
163171
return value;
164172
}

0 commit comments

Comments
 (0)