Skip to content

Commit 5bf495a

Browse files
committed
minor optimizations in GetItemNode/SetItemNode
1 parent b2881fc commit 5bf495a

File tree

3 files changed

+44
-30
lines changed

3 files changed

+44
-30
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/DestructuringAssignmentNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
import com.oracle.graal.python.nodes.attributes.LookupInheritedAttributeNode;
4242
import com.oracle.graal.python.nodes.builtins.TupleNodes;
4343
import com.oracle.graal.python.nodes.subscript.GetItemNode;
44-
import com.oracle.graal.python.nodes.subscript.GetItemNodeFactory.GetItemNodeGen;
44+
import com.oracle.graal.python.nodes.subscript.GetItemNodeGen;
4545
import com.oracle.graal.python.runtime.exception.PException;
4646
import com.oracle.truffle.api.frame.VirtualFrame;
4747
import com.oracle.truffle.api.nodes.ExplodeLoop;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/subscript/GetItemNode.java

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,16 @@
4444
import com.oracle.graal.python.nodes.expression.BinaryOpNode;
4545
import com.oracle.graal.python.nodes.frame.ReadNode;
4646
import com.oracle.graal.python.runtime.sequence.SequenceUtil.NormalizeIndexNode;
47+
import com.oracle.truffle.api.CompilerDirectives;
4748
import com.oracle.truffle.api.dsl.Cached;
48-
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
4949
import com.oracle.truffle.api.dsl.Specialization;
5050
import com.oracle.truffle.api.frame.VirtualFrame;
5151
import com.oracle.truffle.api.nodes.NodeInfo;
5252

5353
@NodeInfo(shortName = __GETITEM__)
54-
@GenerateNodeFactory
5554
public abstract class GetItemNode extends BinaryOpNode implements ReadNode {
5655

57-
@Child private NormalizeIndexNode normalize = NormalizeIndexNode.create();
56+
@Child private NormalizeIndexNode normalize;
5857

5958
public abstract Object execute(Object primary, Object slice);
6059

@@ -69,11 +68,19 @@ public PNode getSlice() {
6968
public abstract Object execute(VirtualFrame frame, Object primary, Object slice);
7069

7170
public static GetItemNode create() {
72-
return GetItemNodeFactory.create(null, null);
71+
return GetItemNodeGen.create(null, null);
7372
}
7473

7574
public static GetItemNode create(PNode primary, PNode slice) {
76-
return GetItemNodeFactory.create(primary, slice);
75+
return GetItemNodeGen.create(primary, slice);
76+
}
77+
78+
private NormalizeIndexNode ensureNormalize() {
79+
if (normalize == null) {
80+
CompilerDirectives.transferToInterpreterAndInvalidate();
81+
normalize = insert(NormalizeIndexNode.create());
82+
}
83+
return normalize;
7784
}
7885

7986
private int toInt(PInt index) {
@@ -87,7 +94,7 @@ private int toInt(PInt index) {
8794

8895
@Override
8996
public PNode makeWriteNode(PNode rhs) {
90-
return SetItemNodeFactory.create(getPrimary(), getSlice(), rhs);
97+
return SetItemNode.create(getPrimary(), getSlice(), rhs);
9198
}
9299

93100
@Specialization
@@ -145,7 +152,7 @@ public String doString(String primary, PInt idx) {
145152

146153
@Specialization
147154
public Object doPBytes(PBytes primary, int idx) {
148-
return primary.getItemNormalized(normalize.forRange(idx, primary.len()));
155+
return primary.getItemNormalized(ensureNormalize().forRange(idx, primary.len()));
149156
}
150157

151158
@Specialization
@@ -155,7 +162,7 @@ public Object doPBytes(PBytes bytes, PInt idx) {
155162

156163
@Specialization
157164
public Object doPByteArray(PByteArray primary, int idx) {
158-
return primary.getItemNormalized(normalize.forRange(idx, primary.len()));
165+
return primary.getItemNormalized(ensureNormalize().forRange(idx, primary.len()));
159166
}
160167

161168
@Specialization
@@ -165,62 +172,62 @@ public Object doPByteArray(PByteArray bytearray, PInt idx) {
165172

166173
@Specialization
167174
public Object doPRange(PRange primary, int idx) {
168-
return primary.getItemNormalized(normalize.forRange(idx, primary.len()));
175+
return primary.getItemNormalized(ensureNormalize().forRange(idx, primary.len()));
169176
}
170177

171178
@Specialization
172179
public Object doPRange(PRange primary, long idx) {
173-
return primary.getItemNormalized(normalize.forRange(idx, primary.len()));
180+
return primary.getItemNormalized(ensureNormalize().forRange(idx, primary.len()));
174181
}
175182

176183
@Specialization
177184
public int doPIntArray(PIntArray primary, int idx) {
178-
return primary.getIntItemNormalized(normalize.forArray(idx, primary.len()));
185+
return primary.getIntItemNormalized(ensureNormalize().forArray(idx, primary.len()));
179186
}
180187

181188
@Specialization
182189
public int doPIntArray(PIntArray primary, long idx) {
183-
return primary.getIntItemNormalized(normalize.forArray(idx, primary.len()));
190+
return primary.getIntItemNormalized(ensureNormalize().forArray(idx, primary.len()));
184191
}
185192

186193
@Specialization
187194
public long doPLongArray(PLongArray primary, int idx) {
188-
return primary.getLongItemNormalized(normalize.forArray(idx, primary.len()));
195+
return primary.getLongItemNormalized(ensureNormalize().forArray(idx, primary.len()));
189196
}
190197

191198
@Specialization
192199
public long doPLongArray(PLongArray primary, long idx) {
193-
return primary.getLongItemNormalized(normalize.forArray(idx, primary.len()));
200+
return primary.getLongItemNormalized(ensureNormalize().forArray(idx, primary.len()));
194201
}
195202

196203
@Specialization
197204
public double doPDoubleArray(PDoubleArray primary, int idx) {
198-
return primary.getDoubleItemNormalized(normalize.forArray(idx, primary.len()));
205+
return primary.getDoubleItemNormalized(ensureNormalize().forArray(idx, primary.len()));
199206
}
200207

201208
@Specialization
202209
public double doPDoubleArray(PDoubleArray primary, long idx) {
203-
return primary.getDoubleItemNormalized(normalize.forArray(idx, primary.len()));
210+
return primary.getDoubleItemNormalized(ensureNormalize().forArray(idx, primary.len()));
204211
}
205212

206213
@Specialization
207214
public char doPCharArray(PCharArray primary, int idx) {
208-
return primary.getCharItemNormalized(normalize.forArray(idx, primary.len()));
215+
return primary.getCharItemNormalized(ensureNormalize().forArray(idx, primary.len()));
209216
}
210217

211218
@Specialization
212219
public char doPCharArray(PCharArray primary, long idx) {
213-
return primary.getCharItemNormalized(normalize.forArray(idx, primary.len()));
220+
return primary.getCharItemNormalized(ensureNormalize().forArray(idx, primary.len()));
214221
}
215222

216223
@Specialization
217224
public Object doPArray(PArray primary, long idx) {
218-
return primary.getItemNormalized(normalize.forArray(idx, primary.len()));
225+
return primary.getItemNormalized(ensureNormalize().forArray(idx, primary.len()));
219226
}
220227

221228
@Specialization
222229
public Object doPArray(PArray primary, PInt idx) {
223-
return primary.getItemNormalized(normalize.forArray(toInt(idx), primary.len()));
230+
return primary.getItemNormalized(ensureNormalize().forArray(toInt(idx), primary.len()));
224231
}
225232

226233
@Specialization

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/subscript/SetItemNode.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,19 @@
4646
import com.oracle.graal.python.nodes.statement.StatementNode;
4747
import com.oracle.graal.python.runtime.sequence.PSequence;
4848
import com.oracle.graal.python.runtime.sequence.SequenceUtil.NormalizeIndexNode;
49+
import com.oracle.truffle.api.CompilerDirectives;
4950
import com.oracle.truffle.api.dsl.Cached;
50-
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
5151
import com.oracle.truffle.api.dsl.NodeChild;
5252
import com.oracle.truffle.api.dsl.NodeChildren;
5353
import com.oracle.truffle.api.dsl.Specialization;
5454
import com.oracle.truffle.api.frame.VirtualFrame;
5555
import com.oracle.truffle.api.nodes.NodeInfo;
5656

5757
@NodeInfo(shortName = __SETITEM__)
58-
@GenerateNodeFactory
5958
@NodeChildren({@NodeChild(value = "primary", type = PNode.class), @NodeChild(value = "slice", type = PNode.class), @NodeChild(value = "right", type = PNode.class)})
6059
public abstract class SetItemNode extends StatementNode implements WriteNode {
6160

62-
@Child private NormalizeIndexNode normalize = NormalizeIndexNode.create();
61+
@Child private NormalizeIndexNode normalize;
6362

6463
public abstract PNode getPrimary();
6564

@@ -68,18 +67,26 @@ public abstract class SetItemNode extends StatementNode implements WriteNode {
6867
public abstract PNode getRight();
6968

7069
public static SetItemNode create(PNode primary, PNode slice, PNode right) {
71-
return SetItemNodeFactory.create(primary, slice, right);
70+
return SetItemNodeGen.create(primary, slice, right);
7271
}
7372

7473
public static SetItemNode create() {
75-
return SetItemNodeFactory.create(null, null, null);
74+
return SetItemNodeGen.create(null, null, null);
7675
}
7776

7877
@Override
7978
public PNode getRhs() {
8079
return getRight();
8180
}
8281

82+
private NormalizeIndexNode ensureNormalize() {
83+
if (normalize == null) {
84+
CompilerDirectives.transferToInterpreterAndInvalidate();
85+
normalize = insert(NormalizeIndexNode.create());
86+
}
87+
return normalize;
88+
}
89+
8390
private int toInt(PInt index) {
8491
try {
8592
return index.intValueExact();
@@ -142,7 +149,7 @@ public Object doPArray(PArray primary, PSlice slice, PArray value) {
142149

143150
@Specialization
144151
public Object doPByteArray1(PByteArray primary, int index, Object value) {
145-
primary.setItemNormalized(normalize.forArrayAssign(index, primary.len()), value);
152+
primary.setItemNormalized(ensureNormalize().forArrayAssign(index, primary.len()), value);
146153
return PNone.NONE;
147154
}
148155

@@ -156,19 +163,19 @@ public Object doPByteArray(PByteArray primary, PInt index, Object value) {
156163
*/
157164
@Specialization
158165
public Object doPArrayInt(PIntArray primary, int index, int value) {
159-
primary.setIntItemNormalized(normalize.forArrayAssign(index, primary.len()), value);
166+
primary.setIntItemNormalized(ensureNormalize().forArrayAssign(index, primary.len()), value);
160167
return PNone.NONE;
161168
}
162169

163170
@Specialization
164171
public Object doPArrayDouble(PDoubleArray primary, int index, double value) {
165-
primary.setDoubleItemNormalized(normalize.forArrayAssign(index, primary.len()), value);
172+
primary.setDoubleItemNormalized(ensureNormalize().forArrayAssign(index, primary.len()), value);
166173
return PNone.NONE;
167174
}
168175

169176
@Specialization
170177
public Object doPArrayChar(PCharArray primary, int index, char value) {
171-
primary.setCharItemNormalized(normalize.forArrayAssign(index, primary.len()), value);
178+
primary.setCharItemNormalized(ensureNormalize().forArrayAssign(index, primary.len()), value);
172179
return PNone.NONE;
173180
}
174181

0 commit comments

Comments
 (0)