diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Assign.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Assign.java index 63e827950501127a3a6c4a981b22a6bc8d71f19c..962eb99b04fcd2c1b15def407e8c91e728e2d0f3 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Assign.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Assign.java @@ -149,6 +149,7 @@ public abstract class Assign extends RBuiltinNode.Arg4 { } protected final ValueProfile frameAccessProfile = ValueProfile.createClassProfile(); + protected final ValueProfile frameProfile = ValueProfile.createClassProfile(); public abstract void execute(VirtualFrame frame, REnvironment env, String name, Object value); @@ -156,11 +157,15 @@ public abstract class Assign extends RBuiltinNode.Arg4 { return ResolvedWriteSuperFrameVariableNodeGen.create(name, Mode.REGULAR, null, null, FrameSlotNode.create(findOrAddFrameSlot(envDesc, name, FrameSlotKind.Illegal))); } - @Specialization(guards = {"env.getFrame(frameAccessProfile).getFrameDescriptor() == envDesc", "write.getName().equals(name)"}) + protected FrameDescriptor getFrameDescriptor(REnvironment env) { + return frameProfile.profile(env.getFrame(frameAccessProfile)).getFrameDescriptor(); + } + + @Specialization(guards = {"getFrameDescriptor(env) == envDesc", "write.getName().equals(name)"}) protected void assignCached(VirtualFrame frame, REnvironment env, @SuppressWarnings("unused") String name, Object value, @Cached("env.getFrame().getFrameDescriptor()") @SuppressWarnings("unused") FrameDescriptor envDesc, @Cached("createWrite(name, envDesc)") ResolvedWriteSuperFrameVariableNode write) { - write.execute(frame, value, env.getFrame(frameAccessProfile)); + write.execute(frame, value, frameProfile.profile(env.getFrame(frameAccessProfile))); } @Specialization(replaces = "assignCached") diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DoCall.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DoCall.java index 5d56afcee2c928d467ea8394658de6d6351dd47c..49d139a0ebf9c5d9f25306b6e77863190784dff9 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DoCall.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DoCall.java @@ -127,6 +127,7 @@ public abstract class DoCall extends RBuiltinNode.Arg4 implements InternalRSynta @Child private GetNamesAttributeNode getNamesNode; @Child private SetVisibilityNode setVisibilityNode; private final ValueProfile frameAccessProfile = ValueProfile.createClassProfile(); + private final ValueProfile frameProfile = ValueProfile.createClassProfile(); private final RNodeClosureCache languagesClosureCache = new RNodeClosureCache(); private final SymbolClosureCache symbolsClosureCache = new SymbolClosureCache(); @@ -137,7 +138,7 @@ public abstract class DoCall extends RBuiltinNode.Arg4 implements InternalRSynta public abstract Object execute(VirtualFrame virtualFrame, String funcName, RFunction func, RList argsAsList, boolean quote, REnvironment env); protected FrameDescriptor getFrameDescriptor(REnvironment env) { - return env.getFrame(frameAccessProfile).getFrameDescriptor(); + return frameProfile.profile(env.getFrame(frameAccessProfile)).getFrameDescriptor(); } /** @@ -152,7 +153,7 @@ public abstract class DoCall extends RBuiltinNode.Arg4 implements InternalRSynta @Cached("create()") GetVisibilityNode getVisibilityNode, @Cached("createBinaryProfile()") ConditionProfile quoteProfile, @Cached("create()") BranchProfile containsRSymbolProfile) { - MaterializedFrame promiseFrame = env.getFrame(frameAccessProfile).materialize(); + MaterializedFrame promiseFrame = frameProfile.profile(env.getFrame(frameAccessProfile)).materialize(); RArgsValuesAndNames args = getArguments(promiseFrame, quote, quoteProfile, containsRSymbolProfile, argsAsList); RCaller caller = getExplicitCaller(virtualFrame, promiseFrame, funcName, func, args); MaterializedFrame evalFrame = getEvalFrame(virtualFrame, promiseFrame); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java index d13b44e5c9c3c93526c95a9cc2a1eaffe2b81e77..ddb5992e1f16d27b82bd93efb3a6239157c4d389 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Lapply.java @@ -48,6 +48,7 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.context.RContext; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RFunction; +import com.oracle.truffle.r.runtime.data.RDataFactory.VectorFactory; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor; import com.oracle.truffle.r.runtime.nodes.InternalRSyntaxNodeChildren; @@ -84,10 +85,11 @@ public abstract class Lapply extends RBuiltinNode.Arg2 { @Specialization protected Object lapply(VirtualFrame frame, RAbstractVector vec, RFunction fun, - @Cached("create()") ExtractNamesAttributeNode extractNamesNode) { + @Cached("create()") ExtractNamesAttributeNode extractNamesNode, + @Cached("create()") VectorFactory factory) { Object[] result = lapply.execute(frame, vec, fun); // set here else it gets overridden by the iterator evaluation - return RDataFactory.createList(result, extractNamesNode.execute(vec)); + return factory.createList(result, extractNamesNode.execute(vec)); } @Specialization diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ListBuiltin.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ListBuiltin.java index dc16026b21480763d246b606c21b49e00d356ee1..3f7af3a6c6c65c21b1a181cf8f7853cb674a5e2e 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ListBuiltin.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ListBuiltin.java @@ -41,6 +41,7 @@ import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RStringVector; +import com.oracle.truffle.r.runtime.data.RDataFactory.VectorFactory; @RBuiltin(name = "list", kind = PRIMITIVE, parameterNames = {"..."}, behavior = PURE) public abstract class ListBuiltin extends RBuiltinNode.Arg1 { @@ -48,6 +49,7 @@ public abstract class ListBuiltin extends RBuiltinNode.Arg1 { protected static final int CACHE_LIMIT = 2; protected static final int MAX_SHARE_OBJECT_NODES = 16; + @Child private VectorFactory factory = VectorFactory.create(); @Children private final ShareObjectNode[] shareObjectNodes = new ShareObjectNode[MAX_SHARE_OBJECT_NODES]; private final ConditionProfile namesNull = ConditionProfile.createBinaryProfile(); @@ -78,8 +80,7 @@ public abstract class ListBuiltin extends RBuiltinNode.Arg1 { String orgName = signature.getName(i); names[i] = (orgName == null ? RRuntime.NAMES_ATTR_EMPTY_VALUE : orgName); } - RStringVector result = RDataFactory.createStringVector(names, RDataFactory.COMPLETE_VECTOR); - return result; + return factory.createStringVector(names, RDataFactory.COMPLETE_VECTOR); } /** @@ -99,7 +100,7 @@ public abstract class ListBuiltin extends RBuiltinNode.Arg1 { for (int i = 0; i < cachedLength; i++) { getShareObjectNode(i).execute(argArray[i]); } - return RDataFactory.createList(argArray, cachedArgNames); + return factory.createList(argArray, cachedArgNames); } @Specialization(guards = "!args.isEmpty()") @@ -109,7 +110,7 @@ public abstract class ListBuiltin extends RBuiltinNode.Arg1 { for (int i = 0; i < argArray.length; i++) { shareObjectNode.execute(argArray[i]); } - return RDataFactory.createList(argArray, argNameVector(args.getSignature())); + return factory.createList(argArray, argNameVector(args.getSignature())); } @Specialization(guards = "args.isEmpty()") @@ -119,7 +120,7 @@ public abstract class ListBuiltin extends RBuiltinNode.Arg1 { @Specialization protected RList listMissing(@SuppressWarnings("unused") RMissing missing) { - return RDataFactory.createList(new Object[]{}); + return factory.createList(new Object[]{}); } @Specialization(guards = {"!isRArgsValuesAndNames(value)", "!isRMissing(value)"}) @@ -130,7 +131,7 @@ public abstract class ListBuiltin extends RBuiltinNode.Arg1 { CompilerDirectives.transferToInterpreterAndInvalidate(); suppliedSignatureArgNames = argNameVector(ArgumentsSignature.empty(1)); } - return RDataFactory.createList(new Object[]{value}, suppliedSignatureArgNames); + return factory.createList(new Object[]{value}, suppliedSignatureArgNames); } private ShareObjectNode getShareObjectNode(int index) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/StandardGeneric.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/StandardGeneric.java index 6194da9a6cd385a21cac054592523df563b7df4f..ade40bbe969daecd5a039d6e239ad280332075fa 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/StandardGeneric.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/StandardGeneric.java @@ -72,6 +72,8 @@ public abstract class StandardGeneric extends RBuiltinNode.Arg2 { private final BranchProfile noGenFunFound = BranchProfile.create(); private final ConditionProfile sameNamesProfile = ConditionProfile.createBinaryProfile(); + private final ConditionProfile isBuiltinProfile = ConditionProfile.createBinaryProfile(); + private final ConditionProfile isDeferredProfile = ConditionProfile.createBinaryProfile(); static { Casts casts = new Casts(StandardGeneric.class); @@ -83,9 +85,9 @@ public abstract class StandardGeneric extends RBuiltinNode.Arg2 { private Object stdGenericInternal(VirtualFrame frame, String fname, RFunction fdef) { RFunction def = fdef; - if (def.isBuiltin()) { + if (isBuiltinProfile.profile(def.isBuiltin())) { def = RContext.getInstance().getPrimitiveMethodsInfo().getPrimGeneric(def.getRBuiltin().getPrimMethodIndex()); - if (def == null) { + if (isDeferredProfile.profile(def == null)) { return RRuntime.DEFERRED_DEFAULT_MARKER; } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/GetBaseEnvFrameNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/GetBaseEnvFrameNode.java index 934265d3025a5bfeac28d296ede2b8cc06bf5a5a..33b538da50af8ad528f13b0d9a90cb0aa906970e 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/GetBaseEnvFrameNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/GetBaseEnvFrameNode.java @@ -33,6 +33,7 @@ import com.oracle.truffle.r.runtime.env.REnvironment; */ public final class GetBaseEnvFrameNode extends Node { private final ValueProfile frameAccessProfile = ValueProfile.createClassProfile(); + private final ValueProfile frameProfile = ValueProfile.createClassProfile(); private final ValueProfile baseEnvProfile = ValueProfile.createIdentityProfile(); public static GetBaseEnvFrameNode create() { @@ -41,6 +42,6 @@ public final class GetBaseEnvFrameNode extends Node { public MaterializedFrame execute() { REnvironment baseEnv = baseEnvProfile.profile(REnvironment.baseEnv()); - return baseEnv.getFrame(frameAccessProfile); + return frameProfile.profile(baseEnv.getFrame(frameAccessProfile)); } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/DispatchGeneric.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/DispatchGeneric.java index 7b425b9f8fac56ae5a24ce3e17564e472dd0e378..8eac73eeb13153c7c642cfc865cd116ce42c9e0b 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/DispatchGeneric.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/DispatchGeneric.java @@ -38,6 +38,7 @@ public abstract class DispatchGeneric extends RBaseNode { public abstract Object executeObject(VirtualFrame frame, REnvironment mtable, RStringVector classes, RFunction fdef, String fname); private final ConditionProfile singleStringProfile = ConditionProfile.createBinaryProfile(); + private final ConditionProfile isDeferredProfile = ConditionProfile.createBinaryProfile(); private final BranchProfile equalsMethodRequired = BranchProfile.create(); @Child private LoadMethod loadMethod = LoadMethodNodeGen.create(); @Child private ExecuteMethod executeMethod = new ExecuteMethod(); @@ -78,7 +79,7 @@ public abstract class DispatchGeneric extends RBaseNode { RFunction currentFunction = ReadVariableNode.lookupFunction(".InheritForDispatch", methodsEnv.getFrame(), true, true); method = (RFunction) RContext.getEngine().evalFunction(currentFunction, frame.materialize(), RCaller.create(frame, RASTUtils.getOriginalCall(this)), true, null, classes, fdef, mtable); } - if (method.isBuiltin() || getInheritsInternalDispatchCheckNode().execute(method)) { + if (isDeferredProfile.profile(method.isBuiltin() || getInheritsInternalDispatchCheckNode().execute(method))) { return RRuntime.DEFERRED_DEFAULT_MARKER; } method = loadMethod.executeRFunction(frame, method, fname); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/LoadMethod.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/LoadMethod.java index 1803e88efbfda4b92f6f6c4b95f1097ec6477f8b..a376072cd1ed1fb8abf3f1d5257ed94881d264e0 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/LoadMethod.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/LoadMethod.java @@ -68,6 +68,7 @@ abstract class LoadMethod extends RBaseNode { @Specialization protected RFunction loadMethod(VirtualFrame frame, RFunction fdef, String fname, @Cached("createClassProfile()") ValueProfile regFrameAccessProfile, + @Cached("createClassProfile()") ValueProfile regFrameProfile, @Cached("createClassProfile()") ValueProfile methodsFrameAccessProfile) { DynamicObject attributes = fdef.getAttributes(); assert fdef.isBuiltin() || attributes != null; @@ -115,7 +116,7 @@ abstract class LoadMethod extends RBaseNode { RFunction ret; if (fdef.getAttributes() != null && moreAttributes.profile(found < fdef.getAttributes().size())) { RFunction currentFunction; - REnvironment methodsEnv = (REnvironment) methodsEnvRead.execute(frame, REnvironment.getNamespaceRegistry().getFrame(regFrameAccessProfile)); + REnvironment methodsEnv = (REnvironment) methodsEnvRead.execute(frame, regFrameProfile.profile(REnvironment.getNamespaceRegistry().getFrame(regFrameAccessProfile))); if (loadMethodFind == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); loadMethodFind = insert(ReadVariableNode.createFunctionLookup(RRuntime.R_LOAD_METHOD_NAME));