From af8edd154e7768d30008920b50872da5bcc80f04 Mon Sep 17 00:00:00 2001 From: Lukas Stadler <lukas.stadler@oracle.com> Date: Fri, 16 Feb 2018 15:14:27 +0100 Subject: [PATCH] add various profiles --- .../oracle/truffle/r/nodes/builtin/base/Assign.java | 9 +++++++-- .../oracle/truffle/r/nodes/builtin/base/DoCall.java | 5 +++-- .../oracle/truffle/r/nodes/builtin/base/Lapply.java | 6 ++++-- .../truffle/r/nodes/builtin/base/ListBuiltin.java | 13 +++++++------ .../r/nodes/builtin/base/StandardGeneric.java | 6 ++++-- .../r/nodes/function/GetBaseEnvFrameNode.java | 3 ++- .../truffle/r/nodes/objects/DispatchGeneric.java | 3 ++- .../oracle/truffle/r/nodes/objects/LoadMethod.java | 3 ++- 8 files changed, 31 insertions(+), 17 deletions(-) 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 63e8279505..962eb99b04 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 5d56afcee2..49d139a0eb 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 d13b44e5c9..ddb5992e1f 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 dc16026b21..3f7af3a6c6 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 6194da9a6c..ade40bbe96 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 934265d302..33b538da50 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 7b425b9f8f..8eac73eeb1 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 1803e88efb..a376072cd1 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)); -- GitLab