Skip to content

Commit 379aed3

Browse files
committed
tweak node costs
1 parent 5534de6 commit 379aed3

File tree

3 files changed

+38
-16
lines changed

3 files changed

+38
-16
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadIndexedArgumentNode.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,32 +28,39 @@
2828
import com.oracle.graal.python.builtins.objects.PNone;
2929
import com.oracle.graal.python.builtins.objects.function.PArguments;
3030
import com.oracle.graal.python.nodes.PNode;
31+
import com.oracle.truffle.api.dsl.Specialization;
3132
import com.oracle.truffle.api.frame.VirtualFrame;
32-
import com.oracle.truffle.api.profiles.BranchProfile;
33+
import com.oracle.truffle.api.nodes.InvalidAssumptionException;
3334
import com.oracle.truffle.api.profiles.ValueProfile;
3435

35-
public class ReadIndexedArgumentNode extends PNode {
36-
protected final int index;
37-
private final BranchProfile wasOffBounds = BranchProfile.create();
36+
public abstract class ReadIndexedArgumentNode extends PNode {
37+
private final int index;
3838
private final ValueProfile profile = ValueProfile.createClassProfile();
3939

4040
ReadIndexedArgumentNode(int index) {
4141
this.index = index;
4242
}
4343

4444
public static ReadIndexedArgumentNode create(int idx) {
45-
return new ReadIndexedArgumentNode(idx);
45+
return ReadIndexedArgumentNodeGen.create(idx);
4646
}
4747

48-
@Override
49-
public Object execute(VirtualFrame frame) {
48+
@Specialization(rewriteOn = InvalidAssumptionException.class)
49+
Object readArg(VirtualFrame frame) throws InvalidAssumptionException {
50+
Object argumentAt = PArguments.getArgument(frame, index);
51+
if (argumentAt == null) {
52+
throw new InvalidAssumptionException();
53+
}
54+
return profile.profile(argumentAt);
55+
}
56+
57+
@Specialization(replaces = "readArg")
58+
Object readArgOffBounds(VirtualFrame frame) {
5059
Object argumentAt = PArguments.getArgument(frame, index);
5160
if (argumentAt == null) {
52-
wasOffBounds.enter();
5361
return PNone.NO_VALUE;
54-
} else {
55-
return profile.profile(argumentAt);
5662
}
63+
return profile.profile(argumentAt);
5764
}
5865

5966
public int getIndex() {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadVarArgsNode.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,24 @@
2626
package com.oracle.graal.python.nodes.argument;
2727

2828
import com.oracle.graal.python.builtins.objects.function.PArguments;
29+
import com.oracle.graal.python.nodes.PNode;
2930
import com.oracle.graal.python.runtime.PythonOptions;
3031
import com.oracle.truffle.api.CompilerAsserts;
3132
import com.oracle.truffle.api.dsl.Cached;
3233
import com.oracle.truffle.api.dsl.Specialization;
3334
import com.oracle.truffle.api.frame.VirtualFrame;
3435
import com.oracle.truffle.api.nodes.ExplodeLoop;
3536

36-
public abstract class ReadVarArgsNode extends ReadIndexedArgumentNode {
37+
public abstract class ReadVarArgsNode extends PNode {
38+
private final int index;
39+
3740
/**
3841
* Controls if the varargs are wrapped in a tuple
3942
*/
4043
private final boolean builtin;
4144

4245
ReadVarArgsNode(int paramIndex, boolean isBuiltin) {
43-
super(paramIndex);
46+
index = paramIndex;
4447
builtin = isBuiltin;
4548
}
4649

@@ -115,4 +118,8 @@ private Object output(Object[] varArgs) {
115118
public boolean isBuiltin() {
116119
return builtin;
117120
}
121+
122+
public int getIndex() {
123+
return index;
124+
}
118125
}

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,18 @@
2929
import static com.oracle.graal.python.runtime.exception.PythonErrorType.UnboundLocalError;
3030

3131
import com.oracle.graal.python.builtins.objects.PNone;
32+
import com.oracle.truffle.api.CompilerDirectives;
33+
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
3234
import com.oracle.truffle.api.frame.Frame;
3335
import com.oracle.truffle.api.frame.FrameSlot;
3436
import com.oracle.truffle.api.frame.VirtualFrame;
3537
import com.oracle.truffle.api.nodes.NodeCost;
3638
import com.oracle.truffle.api.nodes.UnexpectedResultException;
39+
import com.oracle.truffle.api.profiles.BranchProfile;
3740

3841
public abstract class ReadVariableNode extends FrameSlotNode implements ReadLocalNode {
42+
private final BranchProfile unboundLocal = BranchProfile.create();
43+
@CompilationFinal private NodeCost nodeCost = NodeCost.NONE;
3944

4045
@Child private ReadVariableFromFrameNode readLocalNode;
4146

@@ -53,22 +58,25 @@ public final Object doWrite(VirtualFrame frame, Object value) {
5358

5459
@Override
5560
public final NodeCost getCost() {
56-
// the actual reading is done in a child node
57-
return NodeCost.NONE;
61+
return nodeCost;
5862
}
5963

6064
@Override
6165
public final Object execute(VirtualFrame frame) {
6266
Object value = readLocalNode.execute(getAccessingFrame(frame));
63-
6467
if (value == null) {
68+
if (nodeCost == NodeCost.NONE) {
69+
// acts as branch profile
70+
CompilerDirectives.transferToInterpreterAndInvalidate();
71+
nodeCost = NodeCost.MONOMORPHIC;
72+
}
6573
if (frameSlot.getIdentifier().equals(RETURN_SLOT_ID)) {
6674
value = PNone.NONE;
6775
} else {
76+
unboundLocal.enter();
6877
throw raise(UnboundLocalError, "local variable '%s' referenced before assignment", frameSlot.getIdentifier());
6978
}
7079
}
71-
7280
return value;
7381
}
7482

0 commit comments

Comments
 (0)