diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/FrameSlotNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/FrameSlotNode.java index 2f10a3fe8310c1fbf40973223218e7ea77cb6e68..ef17882695395991db0afa2e0299a20edf68c81a 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/FrameSlotNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/FrameSlotNode.java @@ -90,6 +90,7 @@ public abstract class FrameSlotNode extends Node { } private FrameSlotNode resolveFrameSlot(Frame frame) { + CompilerDirectives.transferToInterpreterAndInvalidate(); FrameSlotNode newNode; FrameSlot frameSlot; if (createIfAbsent) { @@ -137,6 +138,8 @@ public abstract class FrameSlotNode extends Node { private final ConditionProfile initializedProfile = ConditionProfile.createBinaryProfile(); private final FrameSlot frameSlot; + private final ValueProfile frameTypeProfile = ValueProfile.createClassProfile(); + public PresentFrameSlotNode(FrameSlot frameSlot) { this.frameSlot = frameSlot; } @@ -146,9 +149,10 @@ public abstract class FrameSlotNode extends Node { return frameSlot; } - private static boolean isInitialized(Frame frame, FrameSlot frameSlot) { + private boolean isInitialized(Frame frame) { try { - return !frame.isObject(frameSlot) || frame.getObject(frameSlot) != null; + Frame typedFrame = frameTypeProfile.profile(frame); + return !typedFrame.isObject(frameSlot) || typedFrame.getObject(frameSlot) != null; } catch (FrameSlotTypeException e) { throw new IllegalStateException(); } @@ -156,7 +160,7 @@ public abstract class FrameSlotNode extends Node { @Override public boolean hasValue(Frame frame) { - return initializedProfile.profile(isInitialized(frame, frameSlot)); + return initializedProfile.profile(isInitialized(frame)); } } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariableNode.java index 70f5564b368bc8dc95ce0f082be9d6c5905474fc..605657731b3f39ab7acefac1dffedf888376ac9a 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariableNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariableNode.java @@ -30,6 +30,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.api.source.*; +import com.oracle.truffle.api.utilities.*; import com.oracle.truffle.r.nodes.*; import com.oracle.truffle.r.nodes.access.ReadVariableNodeFactory.BuiltinFunctionVariableNodeFactory; import com.oracle.truffle.r.nodes.access.ReadVariableNodeFactory.ReadAndCopySuperVariableNodeFactory; @@ -543,6 +544,8 @@ public abstract class ReadVariableNode extends RNode implements VisibilityContro private final boolean readMissing; private final boolean forcePromise; + private final ValueProfile frameTypeProfile = ValueProfile.createClassProfile(); + ReadVariableMaterializedNode(ReadSuperVariableNode readNode, ReadVariableNode nextNode, boolean readMissing, boolean forcePromise, String mode) { this.readNode = readNode; this.nextNode = nextNode; @@ -560,13 +563,14 @@ public abstract class ReadVariableNode extends RNode implements VisibilityContro @Override public Object execute(VirtualFrame frame, MaterializedFrame enclosingFrame) { controlVisibility(); - if (readNode.getFrameSlotNode().hasValue(enclosingFrame)) { - Object result = readNode.execute(frame, enclosingFrame); + MaterializedFrame typedEnclosingFrame = frameTypeProfile.profile(enclosingFrame); + if (readNode.getFrameSlotNode().hasValue(typedEnclosingFrame)) { + Object result = readNode.execute(frame, typedEnclosingFrame); if (checkType(frame, result, mode, readMissing, forcePromise)) { return result; } } - return nextNode.execute(frame, RArguments.getEnclosingFrame(enclosingFrame)); + return nextNode.execute(frame, RArguments.getEnclosingFrame(typedEnclosingFrame)); } @Override diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java index 46979ab66b15a3bcb05190653ad4abb7a7ac61a8..09ec5a56cc76273111331f87ee8383b52bb47159 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java @@ -24,6 +24,7 @@ package com.oracle.truffle.r.runtime; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.source.*; +import com.oracle.truffle.api.utilities.*; import com.oracle.truffle.r.runtime.data.*; import com.oracle.truffle.r.runtime.env.*; @@ -99,6 +100,8 @@ public final class RArguments { */ public static final int MINIMAL_ARRAY_LENGTH = 6; + private static final ValueProfile materializedFrameProfile = ValueProfile.createClassProfile(); + private RArguments() { } @@ -110,7 +113,7 @@ public final class RArguments { private static Object[] getArgumentsWithEvalCheck(Frame frame) { Object[] arguments = frame.getArguments(); if (arguments.length == 1) { - return ((Frame) arguments[0]).getArguments(); + return materializedFrameProfile.profile((Frame) arguments[0]).getArguments(); } else { return arguments; }