From e76add006c937b22f23bae00844c4b5a1f278c53 Mon Sep 17 00:00:00 2001 From: Lukas Stadler <lukas.stadler@oracle.com> Date: Thu, 18 Sep 2014 15:09:43 +0200 Subject: [PATCH] profile the types of Frame instances at strategic points --- .../oracle/truffle/r/nodes/access/FrameSlotNode.java | 10 +++++++--- .../truffle/r/nodes/access/ReadVariableNode.java | 10 +++++++--- .../src/com/oracle/truffle/r/runtime/RArguments.java | 5 ++++- 3 files changed, 18 insertions(+), 7 deletions(-) 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 2f10a3fe83..ef17882695 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 70f5564b36..605657731b 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 46979ab66b..09ec5a56cc 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; } -- GitLab