From 82b69c20efabeb2bcd6fa1ff7ab001e26005b9ee Mon Sep 17 00:00:00 2001 From: Christian Humer Date: Wed, 15 Jun 2022 21:19:41 +0200 Subject: [PATCH 1/5] Implement Truffle counters using Graal IR instrumentation for guest and host code. --- .../graph/SourceLanguagePosition.java | 4 + .../hotspot/debug/BenchmarkCounters.java | 3 +- .../replacements/nodes/ZeroMemoryNode.java | 4 + .../hotspot/libgraal/TruffleFromLibGraal.java | 1 + .../common/TruffleSourceLanguagePosition.java | 2 + .../libgraal/HSTruffleInliningData.java | 9 + .../hotspot/HotSpotTruffleCompilerImpl.java | 12 +- ...otSpotTruffleProfilingInstrumentation.java | 202 ++++++ ...TruffleCommunityCompilerConfiguration.java | 8 + .../truffle/compiler/PartialEvaluator.java | 5 + .../compiler/TruffleTierConfiguration.java | 5 - .../TruffleFromLibGraalEntryPoints.java | 6 + .../truffle/runtime/TruffleInlining.java | 9 +- .../truffle/runtime/TruffleNodeSources.java | 16 +- ...IsolatedTruffleSourceLanguagePosition.java | 14 +- truffle/docs/Profiling.md | 581 ++++++++++++++++++ 16 files changed, 868 insertions(+), 13 deletions(-) create mode 100644 compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleProfilingInstrumentation.java diff --git a/compiler/src/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/SourceLanguagePosition.java b/compiler/src/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/SourceLanguagePosition.java index 89ab80037047..820b964b020d 100644 --- a/compiler/src/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/SourceLanguagePosition.java +++ b/compiler/src/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/SourceLanguagePosition.java @@ -55,4 +55,8 @@ public interface SourceLanguagePosition { int getNodeId(); String getNodeClassName(); + + default String getQualifiedRootName() { + return null; + } } diff --git a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/debug/BenchmarkCounters.java b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/debug/BenchmarkCounters.java index 73cf6dc60a7e..19c2210a74b6 100644 --- a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/debug/BenchmarkCounters.java +++ b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/debug/BenchmarkCounters.java @@ -274,13 +274,14 @@ public void dumpCounters(boolean staticCounter, String group, long[] array, Set< if (Options.BenchmarkCounterPrintingCutoff.getValue(options)) { long cutoff = sorted.size() < 10 ? 1 : Math.max(1, sum / 100); int cnt = sorted.size(); + final int minRows = 10; // remove everything below cutoff and keep at most maxRows Iterator> iter = sorted.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = iter.next(); long counter = entry.getKey() / array.length; - if (counter < cutoff || cnt > maxRows) { + if (counter == 0 || (cnt > minRows && counter < cutoff) || cnt > maxRows) { iter.remove(); } cnt--; diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ZeroMemoryNode.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ZeroMemoryNode.java index 5c656d7bdeb0..977167434942 100644 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ZeroMemoryNode.java +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ZeroMemoryNode.java @@ -71,6 +71,10 @@ public boolean canNullCheck() { return false; } + public ValueNode getLength() { + return length; + } + @NodeIntrinsic public static native void zero(Word address, long length, @ConstantNodeParameter boolean isAligned, @ConstantNodeParameter LocationIdentity locationIdentity); diff --git a/compiler/src/org.graalvm.compiler.truffle.common.hotspot.libgraal/src/org/graalvm/compiler/truffle/common/hotspot/libgraal/TruffleFromLibGraal.java b/compiler/src/org.graalvm.compiler.truffle.common.hotspot.libgraal/src/org/graalvm/compiler/truffle/common/hotspot/libgraal/TruffleFromLibGraal.java index a84e3353b401..9c2e5d1a3a87 100644 --- a/compiler/src/org.graalvm.compiler.truffle.common.hotspot.libgraal/src/org/graalvm/compiler/truffle/common/hotspot/libgraal/TruffleFromLibGraal.java +++ b/compiler/src/org.graalvm.compiler.truffle.common.hotspot.libgraal/src/org/graalvm/compiler/truffle/common/hotspot/libgraal/TruffleFromLibGraal.java @@ -90,6 +90,7 @@ enum Id implements FromLibGraalId { GetValidRootAssumptionConstant(long.class, Object.class), GetNodeId(int.class, Object.class), GetNodeClassName(String.class, Object.class), + GetQualifiedRootName(String.class, Object.class), GetNonTrivialNodeCount(int.class, Object.class), GetOffsetEnd(int.class, Object.class), GetOffsetStart(int.class, Object.class), diff --git a/compiler/src/org.graalvm.compiler.truffle.common/src/org/graalvm/compiler/truffle/common/TruffleSourceLanguagePosition.java b/compiler/src/org.graalvm.compiler.truffle.common/src/org/graalvm/compiler/truffle/common/TruffleSourceLanguagePosition.java index 8f66e0ea0f39..48c18a025401 100644 --- a/compiler/src/org.graalvm.compiler.truffle.common/src/org/graalvm/compiler/truffle/common/TruffleSourceLanguagePosition.java +++ b/compiler/src/org.graalvm.compiler.truffle.common/src/org/graalvm/compiler/truffle/common/TruffleSourceLanguagePosition.java @@ -43,4 +43,6 @@ public interface TruffleSourceLanguagePosition { int getNodeId(); String getNodeClassName(); + + String getQualifiedRootName(); } diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot.libgraal/src/org/graalvm/compiler/truffle/compiler/hotspot/libgraal/HSTruffleInliningData.java b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot.libgraal/src/org/graalvm/compiler/truffle/compiler/hotspot/libgraal/HSTruffleInliningData.java index 897e8879cb8a..668da732cd8c 100644 --- a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot.libgraal/src/org/graalvm/compiler/truffle/compiler/hotspot/libgraal/HSTruffleInliningData.java +++ b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot.libgraal/src/org/graalvm/compiler/truffle/compiler/hotspot/libgraal/HSTruffleInliningData.java @@ -36,6 +36,7 @@ import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.GetOffsetEnd; import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.GetOffsetStart; import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.GetPosition; +import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.GetQualifiedRootName; import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.GetURI; import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.SetCallCounts; import static org.graalvm.compiler.truffle.compiler.hotspot.libgraal.HSTruffleInliningDataGen.callAddInlinedTarget; @@ -50,6 +51,7 @@ import static org.graalvm.compiler.truffle.compiler.hotspot.libgraal.HSTruffleInliningDataGen.callGetOffsetEnd; import static org.graalvm.compiler.truffle.compiler.hotspot.libgraal.HSTruffleInliningDataGen.callGetOffsetStart; import static org.graalvm.compiler.truffle.compiler.hotspot.libgraal.HSTruffleInliningDataGen.callGetPosition; +import static org.graalvm.compiler.truffle.compiler.hotspot.libgraal.HSTruffleInliningDataGen.callGetQualifiedRootName; import static org.graalvm.compiler.truffle.compiler.hotspot.libgraal.HSTruffleInliningDataGen.callGetURI; import static org.graalvm.compiler.truffle.compiler.hotspot.libgraal.HSTruffleInliningDataGen.callSetCallCounts; import static org.graalvm.jniutils.JNIUtil.createString; @@ -194,5 +196,12 @@ public String getNodeClassName() { public int getNodeId() { return callGetNodeId(JNIMethodScope.env(), getHandle()); } + + @TruffleFromLibGraal(GetQualifiedRootName) + @Override + public String getQualifiedRootName() { + JString res = callGetQualifiedRootName(JNIMethodScope.env(), getHandle()); + return createString(JNIMethodScope.env(), res); + } } } diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleCompilerImpl.java b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleCompilerImpl.java index 8b8971ecd0f6..de3192f1e28c 100644 --- a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleCompilerImpl.java +++ b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleCompilerImpl.java @@ -129,7 +129,11 @@ public static HotSpotTruffleCompilerImpl create(final TruffleCompilerRuntime run Plugins plugins = phase.getGraphBuilderConfig().getPlugins(); HotSpotKnownTruffleTypes knownTruffleTypes = new HotSpotKnownTruffleTypes(backend.getProviders().getMetaAccess()); final PartialEvaluatorConfiguration lastTierPe = createPartialEvaluatorConfiguration(hotspotGraalRuntime.getCompilerConfigurationName()); - final TruffleTierConfiguration lastTierSetup = new TruffleTierConfiguration(lastTierPe, backend, options, knownTruffleTypes); + LIRSuites lastTierLirSuites = backend.getSuites().getDefaultLIRSuites(options); + Suites lastTierSuites = backend.getSuites().getDefaultSuites(options); + Providers lastTierProviders = backend.getProviders(); + HotSpotTruffleProfilingInstrumentation.installGuest(options, lastTierSuites.getLowTier()); + final TruffleTierConfiguration lastTierSetup = new TruffleTierConfiguration(lastTierPe, backend, lastTierProviders, lastTierSuites, lastTierLirSuites); CompilerConfigurationFactory lowTierCompilerConfigurationFactory = new EconomyCompilerConfigurationFactory(); CompilerConfiguration compilerConfiguration = lowTierCompilerConfigurationFactory.createCompilerConfiguration(); @@ -140,8 +144,10 @@ public static HotSpotTruffleCompilerImpl create(final TruffleCompilerRuntime run Providers firstTierProviders = firstTierBackend.getProviders(); PartialEvaluatorConfiguration firstTierPe = new EconomyPartialEvaluatorConfiguration(); firstTierBackend.completeInitialization(HotSpotJVMCIRuntime.runtime(), options); - TruffleTierConfiguration firstTierSetup = new TruffleTierConfiguration(firstTierPe, firstTierBackend, firstTierProviders, firstTierSuites, firstTierLirSuites, knownTruffleTypes); - final TruffleCompilerConfiguration compilerConfig = new TruffleCompilerConfiguration(runtime, plugins, snippetReflection, firstTierSetup, lastTierSetup, knownTruffleTypes); + + HotSpotTruffleProfilingInstrumentation.installGuest(options, firstTierSuites.getLowTier()); + TruffleTierConfiguration firstTierSetup = new TruffleTierConfiguration(firstTierPe, firstTierBackend, firstTierProviders, firstTierSuites, firstTierLirSuites); + final TruffleCompilerConfiguration compilerConfig = new TruffleCompilerConfiguration(runtime, plugins, snippetReflection, firstTierSetup, lastTierSetup); return new HotSpotTruffleCompilerImpl(hotspotGraalRuntime, compilerConfig); } diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleProfilingInstrumentation.java b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleProfilingInstrumentation.java new file mode 100644 index 000000000000..6ee6294a82a5 --- /dev/null +++ b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleProfilingInstrumentation.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.graalvm.compiler.truffle.compiler.hotspot; + +import org.graalvm.collections.EconomicMap; +import org.graalvm.compiler.core.common.GraalOptions; +import org.graalvm.compiler.graph.Node; +import org.graalvm.compiler.graph.NodeSourcePosition; +import org.graalvm.compiler.graph.SourceLanguagePosition; +import org.graalvm.compiler.hotspot.debug.BenchmarkCounters; +import org.graalvm.compiler.nodes.CallTargetNode; +import org.graalvm.compiler.nodes.Invoke; +import org.graalvm.compiler.nodes.StructuredGraph; +import org.graalvm.compiler.nodes.debug.DynamicCounterNode; +import org.graalvm.compiler.nodes.java.AbstractCompareAndSwapNode; +import org.graalvm.compiler.nodes.memory.AbstractWriteNode; +import org.graalvm.compiler.nodes.memory.FixedAccessNode; +import org.graalvm.compiler.nodes.memory.ReadNode; +import org.graalvm.compiler.nodes.util.GraphUtil; +import org.graalvm.compiler.options.Option; +import org.graalvm.compiler.options.OptionKey; +import org.graalvm.compiler.options.OptionType; +import org.graalvm.compiler.options.OptionValues; +import org.graalvm.compiler.phases.Phase; +import org.graalvm.compiler.phases.PhaseSuite; +import org.graalvm.compiler.phases.schedule.SchedulePhase; +import org.graalvm.compiler.phases.tiers.LowTierContext; +import org.graalvm.compiler.replacements.nodes.ZeroMemoryNode; + +import jdk.vm.ci.meta.ResolvedJavaMethod; + +public class HotSpotTruffleProfilingInstrumentation { + + public static class Options { + // @formatter:off + @Option(help = "A", type = OptionType.Debug) + public static final OptionKey TruffleHostCounters = new OptionKey<>(false) { + @Override + protected void onValueUpdate(EconomicMap, Object> values, Boolean oldValue, Boolean newValue) { + if (newValue) { + BenchmarkCounters.Options.GenericDynamicCounters.update(values, true); + GraalOptions.TrackNodeSourcePosition.update(values, true); + } + } + }; + + @Option(help = "A", type = OptionType.Debug) + public static final OptionKey TruffleGuestCounters = new OptionKey<>(false) { + @Override + protected void onValueUpdate(EconomicMap, Object> values, Boolean oldValue, Boolean newValue) { + if (newValue) { + BenchmarkCounters.Options.GenericDynamicCounters.update(values, true); + GraalOptions.TrackNodeSourcePosition.update(values, true); + } + } + }; + // @formatter:on + } + + public static void installHost(OptionValues options, PhaseSuite lowTier) { + if (Options.TruffleHostCounters.getValue(options)) { + var schedule = lowTier.findPhase(SchedulePhase.class); + schedule.previous(); + schedule.add(new InstrumentPhase(true)); + } + } + + public static void installGuest(OptionValues options, PhaseSuite lowTier) { + if (Options.TruffleGuestCounters.getValue(options)) { + var schedule = lowTier.findPhase(SchedulePhase.class); + schedule.previous(); + schedule.add(new InstrumentPhase(false)); + } + } + + public static class InstrumentPhase extends Phase { + + private final boolean host; + + InstrumentPhase(boolean host) { + this.host = host; + } + + @Override + protected void run(StructuredGraph graph) { + graph.getNodes().forEach((node) -> { + if (node instanceof Invoke) { + DynamicCounterNode.addCounterBefore("invoke", formatCounterLocation(node, ((Invoke) node).callTarget(), host), 1, false, ((Invoke) node).asFixedNode()); + } else if (node instanceof ReadNode) { + DynamicCounterNode.addCounterBefore("read", formatCounterLocation(node, null, host), 1, false, (ReadNode) node); + } else if (node instanceof AbstractWriteNode || node instanceof AbstractCompareAndSwapNode) { + DynamicCounterNode.addCounterBefore("write", formatCounterLocation(node, null, host), 1, false, (FixedAccessNode) node); + } else if (node instanceof ZeroMemoryNode) { + ZeroMemoryNode zeroNode = (ZeroMemoryNode) node; + DynamicCounterNode.addCounterBefore("write", formatCounterLocation(node, null, host), zeroNode.getLength(), false, zeroNode); + } + }); + } + } + + static String formatCounterLocation(Node node, CallTargetNode target, boolean host) { + StackTraceElement[] elements = GraphUtil.approxSourceStackTraceElement(node); + StringBuilder b = new StringBuilder(100); + String sep = ""; + for (StackTraceElement stackTraceElement : elements) { + b.append(sep); + b.append(stackTraceElement.toString()); + + if (sep.isEmpty()) { + b.append(" (").append(node.toString()).append(")"); + sep = "\n "; + } + } + if (target != null) { + b.append("\n target => "); + b.append(target.targetMethod().format("%H.%n(%p)")); + } + if (b.length() == 0) { + ResolvedJavaMethod method = ((StructuredGraph) node.graph()).method(); + if (method == null) { + return "no-location"; + } else { + return "no-location in " + method.format("%H.%n(%p)"); + } + } else { + if (!host) { + NodeSourcePosition nodeSource = node.getNodeSourcePosition(); + if (nodeSource != null) { + b.append("\n Source AST Nodes:"); + printSourceLanguageStackTrace(b, "\n ", nodeSource); + } + } + return b.toString(); + } + } + + public static void printSourceLanguageStackTrace(StringBuilder b, String sep, NodeSourcePosition sourcePosition) { + NodeSourcePosition position = sourcePosition; + String prev = null; + while (position != null) { + SourceLanguagePosition source = position.getSourceLanguage(); + if (source != null) { + String trace = formatStackTrace(source); + if (!trace.equals(prev)) { + b.append(sep); + b.append(trace); + } + prev = trace; + } + position = position.getCaller(); + } + } + + private static String formatStackTrace(SourceLanguagePosition source) { + StringBuilder b = new StringBuilder(); + String language = source.getLanguage(); + if (language != null) { + b.append("<" + language + "> "); + } + String path = source.getURI() != null ? source.getURI().getPath() : null; + if (path != null) { + int lastIndex = path.lastIndexOf('/'); + if (lastIndex != -1) { + path = path.substring(lastIndex + 1, path.length()); + } + } + String methodName = source.getQualifiedRootName(); + if (methodName != null) { + b.append(methodName); + } + String fileName = path != null ? path : "Unknown"; + b.append("(").append(fileName); + if (path != null) { + b.append(":").append(source.getLineNumber()); + } + b.append(") (").append(source.getNodeId()).append("|").append(source.getNodeClassName()).append(")"); + return b.toString(); + } + +} diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/TruffleCommunityCompilerConfiguration.java b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/TruffleCommunityCompilerConfiguration.java index 6413893d3dbc..84a7bd49a46e 100644 --- a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/TruffleCommunityCompilerConfiguration.java +++ b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/TruffleCommunityCompilerConfiguration.java @@ -26,6 +26,7 @@ import org.graalvm.compiler.core.phases.CommunityCompilerConfiguration; import org.graalvm.compiler.core.phases.HighTier; +import org.graalvm.compiler.core.phases.LowTier; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.truffle.compiler.phases.TruffleHostInliningPhase; @@ -39,6 +40,13 @@ public HighTier createHighTier(OptionValues options) { return highTier; } + @Override + public LowTier createLowTier(OptionValues options) { + LowTier tier = super.createLowTier(options); + HotSpotTruffleProfilingInstrumentation.installHost(options, tier); + return tier; + } + @Override public void registerGraphBuilderPlugins(Plugins plugins, OptionValues options) { super.registerGraphBuilderPlugins(plugins, options); diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/PartialEvaluator.java b/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/PartialEvaluator.java index 5c6ed7705a0b..1cc201d9eaac 100644 --- a/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/PartialEvaluator.java +++ b/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/PartialEvaluator.java @@ -574,5 +574,10 @@ public String getNodeClassName() { return delegate.getNodeClassName(); } + @Override + public String getQualifiedRootName() { + return delegate.getQualifiedRootName(); + } + } } diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/TruffleTierConfiguration.java b/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/TruffleTierConfiguration.java index 1c5c433b7def..b429c9963734 100644 --- a/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/TruffleTierConfiguration.java +++ b/compiler/src/org.graalvm.compiler.truffle.compiler/src/org/graalvm/compiler/truffle/compiler/TruffleTierConfiguration.java @@ -26,7 +26,6 @@ import org.graalvm.compiler.core.target.Backend; import org.graalvm.compiler.lir.phases.LIRSuites; -import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.phases.tiers.Suites; import org.graalvm.compiler.phases.util.Providers; import org.graalvm.compiler.truffle.compiler.phases.TruffleCompilerPhases; @@ -39,10 +38,6 @@ public final class TruffleTierConfiguration { private final Suites suites; private final LIRSuites lirSuites; - public TruffleTierConfiguration(PartialEvaluatorConfiguration configuration, Backend backend, OptionValues options, KnownTruffleTypes knownTruffleTypes) { - this(configuration, backend, backend.getProviders(), backend.getSuites().getDefaultSuites(options), backend.getSuites().getDefaultLIRSuites(options), knownTruffleTypes); - } - public TruffleTierConfiguration(PartialEvaluatorConfiguration configuration, Backend backend, Providers providers, Suites suites, LIRSuites lirSuites, KnownTruffleTypes knownTruffleTypes) { this.configuration = configuration; this.backend = backend; diff --git a/compiler/src/org.graalvm.compiler.truffle.runtime.hotspot.libgraal/src/org/graalvm/compiler/truffle/runtime/hotspot/libgraal/TruffleFromLibGraalEntryPoints.java b/compiler/src/org.graalvm.compiler.truffle.runtime.hotspot.libgraal/src/org/graalvm/compiler/truffle/runtime/hotspot/libgraal/TruffleFromLibGraalEntryPoints.java index 345bd6fab21a..1d9b88aa6d54 100644 --- a/compiler/src/org.graalvm.compiler.truffle.runtime.hotspot.libgraal/src/org/graalvm/compiler/truffle/runtime/hotspot/libgraal/TruffleFromLibGraalEntryPoints.java +++ b/compiler/src/org.graalvm.compiler.truffle.runtime.hotspot.libgraal/src/org/graalvm/compiler/truffle/runtime/hotspot/libgraal/TruffleFromLibGraalEntryPoints.java @@ -64,6 +64,7 @@ import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.GetSuppliedString; import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.GetURI; import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.GetValidRootAssumptionConstant; +import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.GetQualifiedRootName; import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.HasNextTier; import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.InliningData; import static org.graalvm.compiler.truffle.common.hotspot.libgraal.TruffleFromLibGraal.Id.IsBytecodeInterpreterSwitch; @@ -379,6 +380,11 @@ static String getNodeClassName(Object pos) { return ((TruffleSourceLanguagePosition) pos).getNodeClassName(); } + @TruffleFromLibGraal(GetQualifiedRootName) + static String getQualifiedRootName(Object pos) { + return ((TruffleSourceLanguagePosition) pos).getQualifiedRootName(); + } + @TruffleFromLibGraal(GetNodeId) static int getNodeId(Object pos) { return ((TruffleSourceLanguagePosition) pos).getNodeId(); diff --git a/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleInlining.java b/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleInlining.java index d430884eea56..4b7c665dae7b 100644 --- a/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleInlining.java +++ b/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleInlining.java @@ -109,12 +109,14 @@ public TruffleSourceLanguagePosition getPosition(JavaConstant node) { static class TruffleSourceLanguagePosition implements org.graalvm.compiler.truffle.common.TruffleSourceLanguagePosition { private final SourceSection sourceSection; + private final String qualifiedRootName; private final Class nodeClass; private final int nodeId; - TruffleSourceLanguagePosition(SourceSection section, Class nodeClass, int nodeId) { + TruffleSourceLanguagePosition(SourceSection section, String qualifiedRootName, Class nodeClass, int nodeId) { this.sourceSection = section; this.nodeClass = nodeClass; + this.qualifiedRootName = qualifiedRootName; this.nodeId = nodeId; } @@ -176,5 +178,10 @@ public String getNodeClassName() { return nodeClass.getName(); } + @Override + public String getQualifiedRootName() { + return qualifiedRootName; + } + } } diff --git a/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleNodeSources.java b/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleNodeSources.java index 059a40e3ab07..81a88b6c5841 100644 --- a/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleNodeSources.java +++ b/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleNodeSources.java @@ -30,6 +30,7 @@ import com.oracle.truffle.api.nodes.DirectCallNode; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.RootNode; import com.oracle.truffle.api.source.SourceSection; /** @@ -46,9 +47,20 @@ TruffleSourceLanguagePosition getSourceLocation(Node truffleNode) { return position; } SourceSection section = null; + RootNode rootNode; if (truffleNode instanceof DirectCallNode) { - section = ((DirectCallNode) truffleNode).getCurrentRootNode().getSourceSection(); + rootNode = ((DirectCallNode) truffleNode).getCurrentRootNode(); + section = rootNode.getSourceSection(); + } else { + rootNode = truffleNode.getRootNode(); } + String qualifiedRootName; + if (rootNode != null) { + qualifiedRootName = rootNode.getQualifiedName(); + } else { + qualifiedRootName = ""; + } + if (section == null) { section = truffleNode.getSourceSection(); } @@ -62,7 +74,7 @@ TruffleSourceLanguagePosition getSourceLocation(Node truffleNode) { cur = cur.getParent(); } } - position = new TruffleSourceLanguagePosition(section, truffleNode.getClass(), nodeIdCounter++); + position = new TruffleSourceLanguagePosition(section, qualifiedRootName, truffleNode.getClass(), nodeIdCounter++); sourcePositionCache.put(truffleNode, position); return position; } diff --git a/substratevm/src/com.oracle.svm.truffle/src/com/oracle/svm/truffle/isolated/IsolatedTruffleSourceLanguagePosition.java b/substratevm/src/com.oracle.svm.truffle/src/com/oracle/svm/truffle/isolated/IsolatedTruffleSourceLanguagePosition.java index 62c949625e72..92cb0890e17c 100644 --- a/substratevm/src/com.oracle.svm.truffle/src/com/oracle/svm/truffle/isolated/IsolatedTruffleSourceLanguagePosition.java +++ b/substratevm/src/com.oracle.svm.truffle/src/com/oracle/svm/truffle/isolated/IsolatedTruffleSourceLanguagePosition.java @@ -93,10 +93,16 @@ public String getLanguage() { @Override public String getNodeClassName() { - CompilerHandle nodeClassName = getLanguage0(IsolatedCompileContext.get().getClient(), handle); + CompilerHandle nodeClassName = getNodeClassName0(IsolatedCompileContext.get().getClient(), handle); return IsolatedCompileContext.get().unhand(nodeClassName); } + @Override + public String getQualifiedRootName() { + CompilerHandle qualifiedRootName = getQualifiedRootName0(IsolatedCompileContext.get().getClient(), handle); + return IsolatedCompileContext.get().unhand(qualifiedRootName); + } + @Override public int getNodeId() { return nodeId; @@ -125,4 +131,10 @@ private static CompilerHandle getNodeClassName0(@SuppressWarnings("unuse String language = IsolatedCompileClient.get().unhand(positionHandle).getNodeClassName(); return IsolatedCompileClient.get().createStringInCompiler(language); } + + @CEntryPoint(include = CEntryPoint.NotIncludedAutomatically.class, publishAs = CEntryPoint.Publish.NotPublished) + private static CompilerHandle getQualifiedRootName0(@SuppressWarnings("unused") ClientIsolateThread client, ClientHandle positionHandle) { + String language = IsolatedCompileClient.get().unhand(positionHandle).getQualifiedRootName(); + return IsolatedCompileClient.get().createStringInCompiler(language); + } } diff --git a/truffle/docs/Profiling.md b/truffle/docs/Profiling.md index 70c858043905..1b736f389783 100644 --- a/truffle/docs/Profiling.md +++ b/truffle/docs/Profiling.md @@ -130,3 +130,584 @@ The `analyzer` GUI allows you to view the captured profiling information in seve There is also a command-line tool, `er_print`, which can be used for outputting the profiling information in textual form, for further analysis. For full details, see the [Performance Analyzer](https://docs.oracle.com/cd/E77782_01/html/E77798/index.html) documentation. + + +## Host Profiling using Graal IR Instrumentation + +When optimizing interpreter performance, it can be helpful to profile the interpreter itself. +Especially for bytecode interpreters, regular Java sampling tools do not show very useful output as they only show time spent in a method. +More detailed profiling using Java bytecode instrumentation also does not work very well as it breaks partial evaluation and hinders compiler optimizations. +Graal supports instrumentation on the Graal IR level that allows to instrument without significant impact on optimizations performed. + +When Graal is configured with Truffle extensions, it provides an additional option `-Dgraal.TruffleHostCounters=true` to enable read, write and invoke profiling. +This option is currently only available on HotSpot in jargraal or libgraal configuration. + +On _HotSpot libgraal_, the following command line is recommended to print host counters: + +``` +./latest_graalvm_home/bin/js \ + --jvm --vm.XX:+UnlockExperimentalVMOptions --vm.XX:+UnlockDiagnosticVMOptions --experimental-options \ + --vm.XX:JVMCICounterSize=200000 --vm.XX:+DebugNonSafepoints \ + --vm.Dgraal.TruffleHostCounters=true \ + --engine.Compilation=false \ + ./deltablue.js + +``` + +Note the following: +* `--vm.XX:JVMCICounterSize=20000` configures the number of available counters. If the counter size is not big enough, the run will fail. Increase the counter size to resolve problems. +* `--vm.XX:+DebugNonSafepoints` enables additional node source positions, for a more precise output. +* `--vm.Dgraal.TruffleHostCounters=true` enables the host counters +* `--engine.Compilation=false` disables runtime compilation to benchmark interpreter-only performance. + + +On _HotSpot jargraal_, it is recommended also to enable bootstrapping of the Graal compiler using the following command line: + + +``` +./latest_graalvm_home/bin/js \ + --jvm --vm.XX:+UnlockExperimentalVMOptions --vm.XX:+UnlockDiagnosticVMOptions --experimental-options \ + --vm.XX:JVMCICounterSize=200000 --vm.XX:+DebugNonSafepoints \ + --vm.Dgraal.TruffleHostCounters=true \ + --vm.XX:-UseJVMCINativeLibrary --vm.XX:+UseJVMCICompiler --vm.XX:+BootstrapJVMCI \ + --engine.Compilation=false \ + ./deltablue.js + +``` + +Additional hints: + +* `--vm.Dgraal.TimedDynamicCounters=10000` allows to print the statistics every 10 seconds. It resets the data each time it is printed. This can be useful to hide some unwanted warmup behavior for the run. +* `--vm.Dgraal.BenchmarkCounterPrintingCutoff=false` prints all the entries in the list and not just the most important ones. Be prepared that this prints a lot of text. +* `--vm.Dgraal.BenchmarkCountersFile=statistics.csv` prints the statistics as machine-readable CSV to a given file. + + +Here is a sample output of the command line: + +``` +====== dynamic counters (29284 in total) ====== +=========== invoke (dynamic counters): + 23,562,297 1% com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) (51|Invoke#Indirect#JavaScriptNode.executeVoid) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeGeneric(OptimizedBlockNode.java:78) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.execute(AbstractBlockNode.java:75) + target => com.oracle.truffle.js.nodes.JavaScriptNode.executeVoid(VirtualFrame) + 24,334,186 1% com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) (43|Invoke#Indirect#JavaScriptNode.executeVoid) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeVoid(OptimizedBlockNode.java:123) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:70) + target => com.oracle.truffle.js.nodes.JavaScriptNode.executeVoid(VirtualFrame) + 27,589,168 1% com.oracle.truffle.js.nodes.JavaScriptNode.executeVoid(JavaScriptNode.java:192) (5|Invoke#Direct#JavaScriptNode.execute) + target => com.oracle.truffle.js.nodes.JavaScriptNode.execute(VirtualFrame) + 27,972,248 1% com.oracle.truffle.js.nodes.control.DiscardResultNode.execute(DiscardResultNode.java:88) (6|Invoke#Indirect#JavaScriptNode.execute) + target => com.oracle.truffle.js.nodes.JavaScriptNode.execute(VirtualFrame) + 35,332,991 1% org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:490) (161|Invoke#Direct#OptimizedCallTarget.profileArguments) + org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:68) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$UnboundJSFunctionCacheNode.executeCall(JSFunctionCallNode.java:1314) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode.executeCall(JSFunctionCallNode.java:247) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$InvokeNode.execute(JSFunctionCallNode.java:740) + target => org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profileArguments(Object[]) + 35,332,991 1% org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.doInvoke(OptimizedCallTarget.java:545) (163|Invoke#Direct#OptimizedCallTarget.callBoundary) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:491) + org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:68) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$UnboundJSFunctionCacheNode.executeCall(JSFunctionCallNode.java:1314) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode.executeCall(JSFunctionCallNode.java:247) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$InvokeNode.execute(JSFunctionCallNode.java:740) + target => org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(Object[]) + 41,372,334 1% com.oracle.truffle.js.nodes.access.PropertyNode.evaluateTarget(PropertyNode.java:185) (13|Invoke#Indirect#JavaScriptNode.execute) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$InvokeNode.executeTarget(JSFunctionCallNode.java:747) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$InvokeNode.execute(JSFunctionCallNode.java:736) + target => com.oracle.truffle.js.nodes.JavaScriptNode.execute(VirtualFrame) + 41,372,334 1% com.oracle.truffle.js.nodes.access.PropertyGetNode.getValueOrUndefined(PropertyGetNode.java:203) (26|Invoke#Direct#PropertyGetNode.getValueOrDefault) + com.oracle.truffle.js.nodes.access.PropertyNode.executeWithTarget(PropertyNode.java:152) + com.oracle.truffle.js.nodes.access.PropertyNode.executeWithTarget(PropertyNode.java:144) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$InvokeNode.executeFunctionWithTarget(JSFunctionCallNode.java:751) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$InvokeNode.execute(JSFunctionCallNode.java:738) + target => com.oracle.truffle.js.nodes.access.PropertyGetNode.getValueOrDefault(Object, Object, Object) + 41,491,661 1% com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNodeGen.execute_generic4(JSWriteCurrentFrameSlotNodeGen.java:124) (68|Invoke#Indirect#JavaScriptNode.execute) + com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNodeGen.execute(JSWriteCurrentFrameSlotNodeGen.java:43) + target => com.oracle.truffle.js.nodes.JavaScriptNode.execute(VirtualFrame) + 44,795,491 2% com.oracle.truffle.js.nodes.binary.DualNode.execute(DualNode.java:118) (6|Invoke#Indirect#JavaScriptNode.executeVoid) + target => com.oracle.truffle.js.nodes.JavaScriptNode.executeVoid(VirtualFrame) + 44,795,491 2% com.oracle.truffle.js.nodes.binary.DualNode.execute(DualNode.java:119) (10|Invoke#Indirect#JavaScriptNode.execute) + target => com.oracle.truffle.js.nodes.JavaScriptNode.execute(VirtualFrame) + 46,476,004 2% com.oracle.truffle.js.nodes.access.PropertyGetNode.getValueOrDefault(PropertyGetNode.java:471) (123|Invoke#Indirect#PropertyCacheNode$ReceiverCheckNode.accept) + target => com.oracle.truffle.js.nodes.access.PropertyCacheNode$ReceiverCheckNode.accept(Object) + 56,537,436 2% com.oracle.truffle.js.nodes.access.PropertyNode.evaluateTarget(PropertyNode.java:185) (4|Invoke#Indirect#JavaScriptNode.execute) + com.oracle.truffle.js.nodes.access.PropertyNode.execute(PropertyNode.java:138) + target => com.oracle.truffle.js.nodes.JavaScriptNode.execute(VirtualFrame) + 56,537,436 2% com.oracle.truffle.js.nodes.access.PropertyGetNode.getValueOrUndefined(PropertyGetNode.java:203) (10|Invoke#Direct#PropertyGetNode.getValueOrDefault) + com.oracle.truffle.js.nodes.access.PropertyNode.executeWithTarget(PropertyNode.java:152) + com.oracle.truffle.js.nodes.access.PropertyNode.execute(PropertyNode.java:139) + target => com.oracle.truffle.js.nodes.access.PropertyGetNode.getValueOrDefault(Object, Object, Object) + 59,860,216 2% com.oracle.truffle.js.nodes.function.FunctionBodyNode.execute(FunctionBodyNode.java:73) (6|Invoke#Indirect#JavaScriptNode.execute) + target => com.oracle.truffle.js.nodes.JavaScriptNode.execute(VirtualFrame) + 61,527,369 2% com.oracle.truffle.js.nodes.function.FunctionRootNode.executeInRealm(FunctionRootNode.java:149) (27|Invoke#Indirect#JavaScriptNode.execute) + com.oracle.truffle.js.runtime.JavaScriptRealmBoundaryRootNode.execute(JavaScriptRealmBoundaryRootNode.java:88) + target => com.oracle.truffle.js.nodes.JavaScriptNode.execute(VirtualFrame) + 63,102,432 3% org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:558) (8|Invoke#Direct#OptimizedCallTarget.interpreterCall) + target => org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.interpreterCall() + 63,102,432 3% org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:561) (31|Invoke#Direct#OptimizedCallTarget.profiledPERoot) + target => org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(Object[]) + 80,281,300 3% com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNodeGen.executeVoid(JSWriteCurrentFrameSlotNodeGen.java:330) (79|Invoke#Direct#JSWriteCurrentFrameSlotNodeGen.execute) + target => com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNodeGen.execute(VirtualFrame) + 133,853,675 6% com.oracle.truffle.js.nodes.access.PropertyGetNode.getValueOrDefault(PropertyGetNode.java:478) (50|Invoke#Indirect#PropertyGetNode$GetCacheNode.getValue) + target => com.oracle.truffle.js.nodes.access.PropertyGetNode$GetCacheNode.getValue(Object, Object, Object, PropertyGetNode, boolean) + 2,095,091,970 total +=========== read (dynamic counters): + 210,351,750 0% com.oracle.truffle.api.impl.FrameWithoutBoxing.getIndexedLocals(FrameWithoutBoxing.java:612) (308|Read) + com.oracle.truffle.api.impl.FrameWithoutBoxing.getObject(FrameWithoutBoxing.java:626) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNode.doObject(JSReadFrameSlotNode.java:236) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNodeGen.execute(JSReadCurrentFrameSlotNodeGen.java:45) + 210,351,750 0% org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.loadHubOrNullIntrinsic(HotSpotReplacementsUtil.java) (309|Read) + org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets.instanceofExact(InstanceOfSnippets.java:136) + org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets.instanceofExact(InstanceOfSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.getIndexedLocals(FrameWithoutBoxing.java:612) + com.oracle.truffle.api.impl.FrameWithoutBoxing.getObject(FrameWithoutBoxing.java:626) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNode.doObject(JSReadFrameSlotNode.java:236) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNodeGen.execute(JSReadCurrentFrameSlotNodeGen.java:45) + 210,351,750 0% com.oracle.truffle.api.impl.FrameWithoutBoxing.getIndexedTags(FrameWithoutBoxing.java:620) (310|Read) + com.oracle.truffle.api.impl.FrameWithoutBoxing.getTag(FrameWithoutBoxing.java:491) + com.oracle.truffle.api.impl.FrameWithoutBoxing.isObject(FrameWithoutBoxing.java:758) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNodeGen.execute(JSReadCurrentFrameSlotNodeGen.java:44) + 210,351,750 0% com.oracle.truffle.api.impl.FrameWithoutBoxing.getTag(FrameWithoutBoxing.java:491) (311|Read) + com.oracle.truffle.api.impl.FrameWithoutBoxing.isObject(FrameWithoutBoxing.java:758) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNodeGen.execute(JSReadCurrentFrameSlotNodeGen.java:44) + 210,351,750 0% com.oracle.truffle.api.impl.FrameWithoutBoxing.getTag(FrameWithoutBoxing.java:491) (312|Read) + com.oracle.truffle.api.impl.FrameWithoutBoxing.isObject(FrameWithoutBoxing.java:758) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNodeGen.execute(JSReadCurrentFrameSlotNodeGen.java:44) + 210,351,750 0% sun.misc.Unsafe.getObject(Unsafe.java) (92|Read) + com.oracle.truffle.api.impl.FrameWithoutBoxing.unsafeGetObject(FrameWithoutBoxing.java:569) + com.oracle.truffle.api.impl.FrameWithoutBoxing.getObject(FrameWithoutBoxing.java:626) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNode.doObject(JSReadFrameSlotNode.java:236) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNodeGen.execute(JSReadCurrentFrameSlotNodeGen.java:45) + 212,659,363 0% com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNodeGen.execute(JSReadCurrentFrameSlotNodeGen.java:27) (299|Read) + 212,659,363 0% org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.loadHubOrNullIntrinsic(HotSpotReplacementsUtil.java) (300|Read) + org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets.instanceofExact(InstanceOfSnippets.java:136) + org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets.instanceofExact(InstanceOfSnippets.java) + com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNodeGen.execute(JSReadCurrentFrameSlotNodeGen.java:44) + 212,659,363 0% com.oracle.truffle.js.nodes.access.JSReadCurrentFrameSlotNodeGen.execute(JSReadCurrentFrameSlotNodeGen.java:34) (301|Read) + 237,414,674 0% no-location in com.oracle.truffle.js.nodes.access.PropertyGetNode$ObjectPropertyGetNode.getValue(Object, Object, Object, PropertyGetNode, boolean) + 26,164,670,942 total +=========== write (dynamic counters): + 35,332,991 1% org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode.incrementCallCount(OptimizedDirectCallNode.java:162) (374|Write) + org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:62) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$UnboundJSFunctionCacheNode.executeCall(JSFunctionCallNode.java:1314) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode.executeCall(JSFunctionCallNode.java:247) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$InvokeNode.execute(JSFunctionCallNode.java:740) + 38,394,646 1% java.util.Arrays.fill(Arrays.java:3638) (102|Write) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:166) + 62,186,320 2% org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.writeTlabTop(HotSpotReplacementsUtil.java:267) (575|Write) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.writeTlabTop(HotSpotAllocationSnippets.java:484) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:94) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:168) + 62,186,320 2% org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:294) (576|Write) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:168) + 62,186,320 2% org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeObjectHeader(HotSpotReplacementsUtil.java:465) (577|Write) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.initializeObjectHeader(HotSpotAllocationSnippets.java:429) + org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:297) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:168) + 62,186,320 2% org.graalvm.compiler.nodes.extended.StoreHubNode.write(StoreHubNode.java) (580|Write) + org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeObjectHeader(HotSpotReplacementsUtil.java:466) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.initializeObjectHeader(HotSpotAllocationSnippets.java:429) + org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:297) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:168) + 62,186,458 2% org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.writeTlabTop(HotSpotReplacementsUtil.java:267) (298|Write) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.writeTlabTop(HotSpotAllocationSnippets.java:484) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:94) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:164) + 62,186,458 2% org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:294) (299|Write) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:164) + 62,186,458 2% org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeObjectHeader(HotSpotReplacementsUtil.java:465) (300|Write) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.initializeObjectHeader(HotSpotAllocationSnippets.java:429) + org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:297) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:164) + 62,186,458 2% org.graalvm.compiler.nodes.extended.StoreHubNode.write(StoreHubNode.java) (303|Write) + org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeObjectHeader(HotSpotReplacementsUtil.java:466) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.initializeObjectHeader(HotSpotAllocationSnippets.java:429) + org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:297) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:164) + 62,186,794 2% org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.writeTlabTop(HotSpotReplacementsUtil.java:267) (645|Write) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.writeTlabTop(HotSpotAllocationSnippets.java:484) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:94) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:169) + 62,186,794 2% org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:294) (646|Write) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:169) + 62,186,794 2% org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeObjectHeader(HotSpotReplacementsUtil.java:465) (647|Write) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.initializeObjectHeader(HotSpotAllocationSnippets.java:429) + org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:297) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:169) + 62,186,794 2% org.graalvm.compiler.nodes.extended.StoreHubNode.write(StoreHubNode.java) (650|Write) + org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeObjectHeader(HotSpotReplacementsUtil.java:466) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.initializeObjectHeader(HotSpotAllocationSnippets.java:429) + org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:297) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:169) + 62,186,797 2% org.graalvm.compiler.replacements.AllocationSnippets.fillMemoryAligned(AllocationSnippets.java:231) (651|Write) + org.graalvm.compiler.replacements.AllocationSnippets.fillMemory(AllocationSnippets.java:181) + org.graalvm.compiler.replacements.AllocationSnippets.zeroMemory(AllocationSnippets.java:157) + org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:299) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:169) + 62,188,130 2% java.util.Arrays.fill(Arrays.java:3638) (95|Write) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:166) + 65,369,226 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:185) (112|Write) + 65,369,226 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:186) (115|Write) + 65,369,226 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:187) (118|Write) + 65,369,226 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:188) (120|Write) + 65,369,226 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:189) (123|Write) + 65,369,226 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:190) (126|Write) + 65,369,226 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:191) (130|Write) + 65,369,226 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:192) (134|Write) + 65,369,226 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:193) (137|Write) + 76,186,144 2% org.graalvm.compiler.replacements.AllocationSnippets.fillMemoryAligned(AllocationSnippets.java:231) (304|Write) + org.graalvm.compiler.replacements.AllocationSnippets.fillMemory(AllocationSnippets.java:181) + org.graalvm.compiler.replacements.AllocationSnippets.zeroMemory(AllocationSnippets.java:157) + org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:299) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:164) + 80,584,819 2% com.oracle.truffle.api.impl.FrameWithoutBoxing.verifyIndexedSet(FrameWithoutBoxing.java:736) (170|Write) + com.oracle.truffle.api.impl.FrameWithoutBoxing.setObject(FrameWithoutBoxing.java:631) + com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNode.doObject(JSWriteFrameSlotNode.java:259) + com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNodeGen.execute_generic4(JSWriteCurrentFrameSlotNodeGen.java:157) + com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNodeGen.execute(JSWriteCurrentFrameSlotNodeGen.java:43) + 80,584,819 2% sun.misc.Unsafe.putObject(Unsafe.java) (176|Write) + com.oracle.truffle.api.impl.FrameWithoutBoxing.unsafePutObject(FrameWithoutBoxing.java:579) + com.oracle.truffle.api.impl.FrameWithoutBoxing.setObject(FrameWithoutBoxing.java:632) + com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNode.doObject(JSWriteFrameSlotNode.java:259) + com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNodeGen.execute_generic4(JSWriteCurrentFrameSlotNodeGen.java:157) + com.oracle.truffle.js.nodes.access.JSWriteCurrentFrameSlotNodeGen.execute(JSWriteCurrentFrameSlotNodeGen.java:43) + 100,578,686 3% org.graalvm.compiler.replacements.AllocationSnippets.fillMemoryAligned(AllocationSnippets.java:231) (581|Write) + org.graalvm.compiler.replacements.AllocationSnippets.fillMemory(AllocationSnippets.java:181) + org.graalvm.compiler.replacements.AllocationSnippets.zeroMemory(AllocationSnippets.java:157) + org.graalvm.compiler.replacements.AllocationSnippets.formatArray(AllocationSnippets.java:299) + org.graalvm.compiler.replacements.AllocationSnippets.allocateArrayImpl(AllocationSnippets.java:96) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java:168) + org.graalvm.compiler.hotspot.replacements.HotSpotAllocationSnippets.allocateArray(HotSpotAllocationSnippets.java) + com.oracle.truffle.api.impl.FrameWithoutBoxing.(FrameWithoutBoxing.java:168) + 2,882,562,695 total +``` + +## Guest Profiling using Graal IR Instrumentation + +The same instrumentation for host code also works for runtime compiled guest code. +Please refer to host profiling for additional details. + +On _HotSpot_, the following command line is recommended to print guest counters: + +``` +./latest_graalvm_home/bin/js \ + --jvm --vm.XX:+UnlockDiagnosticVMOptions \ + --vm.XX:JVMCICounterSize=200000 --vm.XX:+DebugNonSafepoints \ + --vm.Dgraal.TruffleGuestCounters=true \ + ./deltablue.js + +``` + +Sample output printed after the execution is completed. +Note that in addition to host stack traces, we now also see guest AST nodes with guest application source locations. + +====== dynamic counters (19195 in total) ====== +=========== invoke (dynamic counters): + + ... omitted output.... + + 719,179 1% org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.doInvoke(OptimizedCallTarget.java:545) (227|Invoke#Direct#OptimizedCallTarget.callBoundary) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:491) + org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:68) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$UnboundJSFunctionCacheNode.executeCall(JSFunctionCallNode.java:1314) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode.executeCall(JSFunctionCallNode.java:247) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$InvokeNode.execute(JSFunctionCallNode.java:740) + com.oracle.truffle.js.nodes.control.DiscardResultNode.execute(DiscardResultNode.java:88) + com.oracle.truffle.js.nodes.binary.DualNode.execute(DualNode.java:119) + com.oracle.truffle.js.nodes.function.FunctionBodyNode.execute(FunctionBodyNode.java:73) + com.oracle.truffle.js.nodes.function.FunctionRootNode.executeInRealm(FunctionRootNode.java:149) + com.oracle.truffle.js.runtime.JavaScriptRealmBoundaryRootNode.execute(JavaScriptRealmBoundaryRootNode.java:88) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:656) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:628) + target => org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(Object[]) + Source AST Nodes: + ScaleConstraint.execute(deltablue.js:1055) (19|org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode) + :anonymous(deltablue.js:516) (16|com.oracle.truffle.js.nodes.function.JSFunctionCallNode$FunctionInstanceCacheNode) + :anonymous(deltablue.js:516) (6|com.oracle.truffle.js.nodes.function.JSFunctionCallNode$Invoke0Node) + :anonymous(deltablue.js:516) (5|com.oracle.truffle.js.nodes.control.DiscardResultNode) + :anonymous(deltablue.js:516) (2|com.oracle.truffle.js.nodes.binary.DualNode) + :anonymous(deltablue.js:516) (1|com.oracle.truffle.js.nodes.function.FunctionBodyNode) + :anonymous(deltablue.js:516) (0|com.oracle.truffle.js.nodes.function.FunctionRootNode) + 6,000,060 15% org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.doInvoke(OptimizedCallTarget.java:545) (264|Invoke#Direct#OptimizedCallTarget.callBoundary) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:491) + org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:68) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$UnboundJSFunctionCacheNode.executeCall(JSFunctionCallNode.java:1314) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode.executeCall(JSFunctionCallNode.java:247) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$CallNode.execute(JSFunctionCallNode.java:537) + com.oracle.truffle.js.nodes.JavaScriptNode.executeVoid(JavaScriptNode.java:192) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeVoid(OptimizedBlockNode.java:123) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:70) + com.oracle.truffle.js.nodes.control.AbstractRepeatingNode.executeBody(AbstractRepeatingNode.java:67) + com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode.executeRepeating(WhileNode.java:238) + com.oracle.truffle.api.nodes.RepeatingNode.executeRepeatingWithValue(RepeatingNode.java:112) + org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode.execute(OptimizedOSRLoopNode.java:124) + com.oracle.truffle.js.nodes.control.WhileNode.executeVoid(WhileNode.java:181) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeVoid(OptimizedBlockNode.java:123) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:70) + com.oracle.truffle.js.nodes.control.VoidBlockNode.execute(VoidBlockNode.java:61) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:85) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeGeneric(OptimizedBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.execute(AbstractBlockNode.java:75) + com.oracle.truffle.js.nodes.function.FunctionBodyNode.execute(FunctionBodyNode.java:73) + com.oracle.truffle.js.nodes.function.FunctionRootNode.executeInRealm(FunctionRootNode.java:149) + com.oracle.truffle.js.runtime.JavaScriptRealmBoundaryRootNode.execute(JavaScriptRealmBoundaryRootNode.java:88) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:656) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:628) + target => org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(Object[]) + Source AST Nodes: + :anonymous(deltablue.js:516) (42|org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode) + Vector.forEach(deltablue.js:90) (41|com.oracle.truffle.js.nodes.function.JSFunctionCallNode$UnboundFunctionDataCacheNode) + Vector.forEach(deltablue.js:90) (28|com.oracle.truffle.js.nodes.function.JSFunctionCallNode$Call1Node) + Vector.forEach(deltablue.js:89) (26|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:89) (27|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:89) (26|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:89) (18|com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode) + Vector.forEach(deltablue.js:89) (17|org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode$OptimizedDefaultOSRLoopNode) + Vector.forEach(deltablue.js:89) (16|com.oracle.truffle.js.nodes.control.WhileNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (9|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (3|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (1|com.oracle.truffle.js.nodes.function.FunctionBodyNode) + Vector.forEach(deltablue.js:88) (0|com.oracle.truffle.js.nodes.function.FunctionRootNode) + 37,842,523 total +=========== read (dynamic counters): + + ... omitted output.... + + 7,391,766 0% sun.misc.Unsafe.getLong(Unsafe.java) (326|Read) + com.oracle.truffle.object.UnsafeAccess.unsafeGetLong(UnsafeAccess.java:67) + com.oracle.truffle.object.CoreLocations$DynamicLongFieldLocation.getLong(CoreLocations.java:997) + com.oracle.truffle.object.CoreLocations$PrimitiveLocationDecorator.getLongInternal(CoreLocations.java:734) + com.oracle.truffle.object.CoreLocations$IntLocationDecorator.getInt(CoreLocations.java:793) + com.oracle.truffle.js.nodes.access.PropertyGetNode$IntPropertyGetNode.getValueInt(PropertyGetNode.java:691) + com.oracle.truffle.js.nodes.access.PropertyGetNode.getValueInt(PropertyGetNode.java:250) + com.oracle.truffle.js.nodes.access.PropertyNode.executeInt(PropertyNode.java:166) + com.oracle.truffle.js.nodes.access.PropertyNode.executeInt(PropertyNode.java:158) + com.oracle.truffle.js.nodes.binary.JSLessThanNodeGen.executeBoolean_int_int0(JSLessThanNodeGen.java:186) + com.oracle.truffle.js.nodes.binary.JSLessThanNodeGen.executeBoolean(JSLessThanNodeGen.java:159) + com.oracle.truffle.js.nodes.control.StatementNode.executeConditionAsBoolean(StatementNode.java:58) + com.oracle.truffle.js.nodes.control.AbstractRepeatingNode.executeCondition(AbstractRepeatingNode.java:63) + com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode.executeRepeating(WhileNode.java:237) + com.oracle.truffle.api.nodes.RepeatingNode.executeRepeatingWithValue(RepeatingNode.java:112) + org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode.execute(OptimizedOSRLoopNode.java:124) + com.oracle.truffle.js.nodes.control.WhileNode.executeVoid(WhileNode.java:181) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeVoid(OptimizedBlockNode.java:123) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:70) + com.oracle.truffle.js.nodes.control.VoidBlockNode.execute(VoidBlockNode.java:61) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:85) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeGeneric(OptimizedBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.execute(AbstractBlockNode.java:75) + com.oracle.truffle.js.nodes.function.FunctionBodyNode.execute(FunctionBodyNode.java:73) + com.oracle.truffle.js.nodes.function.FunctionRootNode.executeInRealm(FunctionRootNode.java:149) + com.oracle.truffle.js.runtime.JavaScriptRealmBoundaryRootNode.execute(JavaScriptRealmBoundaryRootNode.java:88) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:656) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:628) + Source AST Nodes: + Vector.forEach(deltablue.js:89) (24|com.oracle.truffle.js.nodes.access.PropertyGetNode$IntPropertyGetNode) + Vector.forEach(deltablue.js:89) (23|com.oracle.truffle.js.nodes.access.PropertyGetNode) + Vector.forEach(deltablue.js:89) (21|com.oracle.truffle.js.nodes.access.PropertyNode) + Vector.forEach(deltablue.js:89) (19|com.oracle.truffle.js.nodes.binary.JSLessThanNodeGen) + Vector.forEach(deltablue.js:89) (18|com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode) + Vector.forEach(deltablue.js:89) (17|org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode$OptimizedDefaultOSRLoopNode) + Vector.forEach(deltablue.js:89) (16|com.oracle.truffle.js.nodes.control.WhileNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (9|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (3|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (1|com.oracle.truffle.js.nodes.function.FunctionBodyNode) + Vector.forEach(deltablue.js:88) (0|com.oracle.truffle.js.nodes.function.FunctionRootNode) + 7,391,766 0% com.oracle.truffle.api.object.DynamicObject.getShape(DynamicObject.java:173) (321|Read) + com.oracle.truffle.object.ShapeImpl.check(ShapeImpl.java:948) + com.oracle.truffle.js.nodes.access.PropertyGetNode.getValueInt(PropertyGetNode.java:234) + com.oracle.truffle.js.nodes.access.PropertyNode.executeInt(PropertyNode.java:166) + com.oracle.truffle.js.nodes.access.PropertyNode.executeInt(PropertyNode.java:158) + com.oracle.truffle.js.nodes.binary.JSLessThanNodeGen.executeBoolean_int_int0(JSLessThanNodeGen.java:186) + com.oracle.truffle.js.nodes.binary.JSLessThanNodeGen.executeBoolean(JSLessThanNodeGen.java:159) + com.oracle.truffle.js.nodes.control.StatementNode.executeConditionAsBoolean(StatementNode.java:58) + com.oracle.truffle.js.nodes.control.AbstractRepeatingNode.executeCondition(AbstractRepeatingNode.java:63) + com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode.executeRepeating(WhileNode.java:237) + com.oracle.truffle.api.nodes.RepeatingNode.executeRepeatingWithValue(RepeatingNode.java:112) + org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode.execute(OptimizedOSRLoopNode.java:124) + com.oracle.truffle.js.nodes.control.WhileNode.executeVoid(WhileNode.java:181) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeVoid(OptimizedBlockNode.java:123) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:70) + com.oracle.truffle.js.nodes.control.VoidBlockNode.execute(VoidBlockNode.java:61) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:85) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeGeneric(OptimizedBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.execute(AbstractBlockNode.java:75) + com.oracle.truffle.js.nodes.function.FunctionBodyNode.execute(FunctionBodyNode.java:73) + com.oracle.truffle.js.nodes.function.FunctionRootNode.executeInRealm(FunctionRootNode.java:149) + com.oracle.truffle.js.runtime.JavaScriptRealmBoundaryRootNode.execute(JavaScriptRealmBoundaryRootNode.java:88) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:656) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:628) + Source AST Nodes: + Vector.forEach(deltablue.js:89) (23|com.oracle.truffle.js.nodes.access.PropertyGetNode) + Vector.forEach(deltablue.js:89) (21|com.oracle.truffle.js.nodes.access.PropertyNode) + Vector.forEach(deltablue.js:89) (19|com.oracle.truffle.js.nodes.binary.JSLessThanNodeGen) + Vector.forEach(deltablue.js:89) (18|com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode) + Vector.forEach(deltablue.js:89) (17|org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode$OptimizedDefaultOSRLoopNode) + Vector.forEach(deltablue.js:89) (16|com.oracle.truffle.js.nodes.control.WhileNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (9|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (3|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (1|com.oracle.truffle.js.nodes.function.FunctionBodyNode) + Vector.forEach(deltablue.js:88) (0|com.oracle.truffle.js.nodes.function.FunctionRootNode) + 34,073,368 4% no-location in org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(Object[]) + 828,123,983 total +=========== write (dynamic counters): + + ... omitted output.... + + 7,019,402 1% com.oracle.truffle.js.runtime.JSArguments.createInitial(JSArguments.java:77) (489|Write) + com.oracle.truffle.js.runtime.JSArguments.createOneArg(JSArguments.java:88) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$Call1Node.createArguments(JSFunctionCallNode.java:617) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$CallNode.execute(JSFunctionCallNode.java:537) + com.oracle.truffle.js.nodes.JavaScriptNode.executeVoid(JavaScriptNode.java:192) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeVoid(OptimizedBlockNode.java:123) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:70) + com.oracle.truffle.js.nodes.control.AbstractRepeatingNode.executeBody(AbstractRepeatingNode.java:67) + com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode.executeRepeating(WhileNode.java:238) + com.oracle.truffle.api.nodes.RepeatingNode.executeRepeatingWithValue(RepeatingNode.java:112) + org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode.execute(OptimizedOSRLoopNode.java:124) + com.oracle.truffle.js.nodes.control.WhileNode.executeVoid(WhileNode.java:181) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeVoid(OptimizedBlockNode.java:123) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:70) + com.oracle.truffle.js.nodes.control.VoidBlockNode.execute(VoidBlockNode.java:61) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:85) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeGeneric(OptimizedBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.execute(AbstractBlockNode.java:75) + com.oracle.truffle.js.nodes.function.FunctionBodyNode.execute(FunctionBodyNode.java:73) + com.oracle.truffle.js.nodes.function.FunctionRootNode.executeInRealm(FunctionRootNode.java:149) + com.oracle.truffle.js.runtime.JavaScriptRealmBoundaryRootNode.execute(JavaScriptRealmBoundaryRootNode.java:88) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:656) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:628) + Source AST Nodes: + Vector.forEach(deltablue.js:90) (28|com.oracle.truffle.js.nodes.function.JSFunctionCallNode$Call1Node) + Vector.forEach(deltablue.js:89) (26|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:89) (27|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:89) (26|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:89) (18|com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode) + Vector.forEach(deltablue.js:89) (17|org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode$OptimizedDefaultOSRLoopNode) + Vector.forEach(deltablue.js:89) (16|com.oracle.truffle.js.nodes.control.WhileNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (9|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (3|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (1|com.oracle.truffle.js.nodes.function.FunctionBodyNode) + Vector.forEach(deltablue.js:88) (0|com.oracle.truffle.js.nodes.function.FunctionRootNode) + 7,019,402 1% com.oracle.truffle.js.runtime.JSArguments.createInitial(JSArguments.java:77) (486|Write) + com.oracle.truffle.js.runtime.JSArguments.createOneArg(JSArguments.java:88) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$Call1Node.createArguments(JSFunctionCallNode.java:617) + com.oracle.truffle.js.nodes.function.JSFunctionCallNode$CallNode.execute(JSFunctionCallNode.java:537) + com.oracle.truffle.js.nodes.JavaScriptNode.executeVoid(JavaScriptNode.java:192) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeVoid(OptimizedBlockNode.java:123) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:70) + com.oracle.truffle.js.nodes.control.AbstractRepeatingNode.executeBody(AbstractRepeatingNode.java:67) + com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode.executeRepeating(WhileNode.java:238) + com.oracle.truffle.api.nodes.RepeatingNode.executeRepeatingWithValue(RepeatingNode.java:112) + org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode.execute(OptimizedOSRLoopNode.java:124) + com.oracle.truffle.js.nodes.control.WhileNode.executeVoid(WhileNode.java:181) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeVoid(OptimizedBlockNode.java:123) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeVoid(AbstractBlockNode.java:70) + com.oracle.truffle.js.nodes.control.VoidBlockNode.execute(VoidBlockNode.java:61) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:85) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.executeGeneric(AbstractBlockNode.java:1) + org.graalvm.compiler.truffle.runtime.OptimizedBlockNode.executeGeneric(OptimizedBlockNode.java:80) + com.oracle.truffle.js.nodes.control.AbstractBlockNode.execute(AbstractBlockNode.java:75) + com.oracle.truffle.js.nodes.function.FunctionBodyNode.execute(FunctionBodyNode.java:73) + com.oracle.truffle.js.nodes.function.FunctionRootNode.executeInRealm(FunctionRootNode.java:149) + com.oracle.truffle.js.runtime.JavaScriptRealmBoundaryRootNode.execute(JavaScriptRealmBoundaryRootNode.java:88) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:656) + org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:628) + Source AST Nodes: + Vector.forEach(deltablue.js:90) (28|com.oracle.truffle.js.nodes.function.JSFunctionCallNode$Call1Node) + Vector.forEach(deltablue.js:89) (26|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:89) (27|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:89) (26|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:89) (18|com.oracle.truffle.js.nodes.control.WhileNode$WhileDoRepeatingNode) + Vector.forEach(deltablue.js:89) (17|org.graalvm.compiler.truffle.runtime.OptimizedOSRLoopNode$OptimizedDefaultOSRLoopNode) + Vector.forEach(deltablue.js:89) (16|com.oracle.truffle.js.nodes.control.WhileNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (9|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (8|com.oracle.truffle.js.nodes.control.VoidBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (3|org.graalvm.compiler.truffle.runtime.OptimizedBlockNode) + Vector.forEach(deltablue.js:88) (2|com.oracle.truffle.js.nodes.control.ExprBlockNode) + Vector.forEach(deltablue.js:88) (1|com.oracle.truffle.js.nodes.function.FunctionBodyNode) + Vector.forEach(deltablue.js:88) (0|com.oracle.truffle.js.nodes.function.FunctionRootNode) + 429,688,807 total +============================ +``` + From 7cffa1a9e9610b721e38965f07641f3767b59669 Mon Sep 17 00:00:00 2001 From: Christian Humer Date: Wed, 15 Jun 2022 21:16:36 +0200 Subject: [PATCH 2/5] Add changelog entry. --- truffle/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/truffle/CHANGELOG.md b/truffle/CHANGELOG.md index 96fe95a96efe..f35014f76726 100644 --- a/truffle/CHANGELOG.md +++ b/truffle/CHANGELOG.md @@ -17,6 +17,7 @@ This changelog summarizes major changes between Truffle versions relevant to lan * Removed deprecated `UnionAssumption`, `AlwaysValidAssumption` and `NeverValidAssumption`. The API was deprecated in 22.1. * (GR-35797) The [SnippetRun#getException()](https://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/tck/ResultVerifier.SnippetRun.html#getException--) now provides an `IllegalArgumentException` thrown during the snippet execution. The `IllegalArgumentException` is converted to a `PolyglotException` before it is returned. +* GR-39190 Implemented Truffle counters using Graal IR instrumentation for guest and host code. See the [tutorial](https://github.com/oracle/graal/blob/master/truffle/docs/Profiling.md#host-profiling-using-graal-ir-instrumentation) for usage instructions. ## Version 22.2.0 From dd7cb876d59440e6fcb5f82a16956c784aeb3ed3 Mon Sep 17 00:00:00 2001 From: Christian Humer Date: Thu, 16 Jun 2022 10:16:04 +0200 Subject: [PATCH 3/5] Fix errors in requesting the qualified name must be ignored. --- .../compiler/truffle/runtime/TruffleNodeSources.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleNodeSources.java b/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleNodeSources.java index 81a88b6c5841..5c9114d22f8b 100644 --- a/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleNodeSources.java +++ b/compiler/src/org.graalvm.compiler.truffle.runtime/src/org/graalvm/compiler/truffle/runtime/TruffleNodeSources.java @@ -56,7 +56,12 @@ TruffleSourceLanguagePosition getSourceLocation(Node truffleNode) { } String qualifiedRootName; if (rootNode != null) { - qualifiedRootName = rootNode.getQualifiedName(); + try { + qualifiedRootName = rootNode.getQualifiedName(); + } catch (Throwable t) { + // ignore problems in + qualifiedRootName = "Error in receiving root name: " + t.getMessage(); + } } else { qualifiedRootName = ""; } From ae371d6cadc929425694c608b06de6fd2e45aabc Mon Sep 17 00:00:00 2001 From: Christian Humer Date: Thu, 16 Jun 2022 11:50:05 +0200 Subject: [PATCH 4/5] Simplify documentation. --- truffle/docs/Profiling.md | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/truffle/docs/Profiling.md b/truffle/docs/Profiling.md index 1b736f389783..26c06aa04ef7 100644 --- a/truffle/docs/Profiling.md +++ b/truffle/docs/Profiling.md @@ -142,7 +142,7 @@ Graal supports instrumentation on the Graal IR level that allows to instrument w When Graal is configured with Truffle extensions, it provides an additional option `-Dgraal.TruffleHostCounters=true` to enable read, write and invoke profiling. This option is currently only available on HotSpot in jargraal or libgraal configuration. -On _HotSpot libgraal_, the following command line is recommended to print host counters: +On _HotSpot_, the following command line is recommended to print host counters: ``` ./latest_graalvm_home/bin/js \ @@ -159,25 +159,7 @@ Note the following: * `--vm.XX:+DebugNonSafepoints` enables additional node source positions, for a more precise output. * `--vm.Dgraal.TruffleHostCounters=true` enables the host counters * `--engine.Compilation=false` disables runtime compilation to benchmark interpreter-only performance. - - -On _HotSpot jargraal_, it is recommended also to enable bootstrapping of the Graal compiler using the following command line: - - -``` -./latest_graalvm_home/bin/js \ - --jvm --vm.XX:+UnlockExperimentalVMOptions --vm.XX:+UnlockDiagnosticVMOptions --experimental-options \ - --vm.XX:JVMCICounterSize=200000 --vm.XX:+DebugNonSafepoints \ - --vm.Dgraal.TruffleHostCounters=true \ - --vm.XX:-UseJVMCINativeLibrary --vm.XX:+UseJVMCICompiler --vm.XX:+BootstrapJVMCI \ - --engine.Compilation=false \ - ./deltablue.js - -``` - -Additional hints: - -* `--vm.Dgraal.TimedDynamicCounters=10000` allows to print the statistics every 10 seconds. It resets the data each time it is printed. This can be useful to hide some unwanted warmup behavior for the run. +* `--vm.Dgraal.TimedDynamicCounters=10000` allows to print the statistics every 10 seconds. It resets the data each time it is printed. This can be useful to hide some unwanted warmup behavior of the run. * `--vm.Dgraal.BenchmarkCounterPrintingCutoff=false` prints all the entries in the list and not just the most important ones. Be prepared that this prints a lot of text. * `--vm.Dgraal.BenchmarkCountersFile=statistics.csv` prints the statistics as machine-readable CSV to a given file. From 12b3fc801e3a542a935a4759d4b4eb550cbc0a46 Mon Sep 17 00:00:00 2001 From: Christian Humer Date: Wed, 6 Jul 2022 12:12:29 +0200 Subject: [PATCH 5/5] Add tracing category for allocation, switch and conditions; Print graal IR node for nodes without location. --- .../hotspot/HotSpotTruffleCompilerImpl.java | 6 +++--- .../HotSpotTruffleProfilingInstrumentation.java | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleCompilerImpl.java b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleCompilerImpl.java index de3192f1e28c..e1d6ee9dad6c 100644 --- a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleCompilerImpl.java +++ b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleCompilerImpl.java @@ -133,7 +133,7 @@ public static HotSpotTruffleCompilerImpl create(final TruffleCompilerRuntime run Suites lastTierSuites = backend.getSuites().getDefaultSuites(options); Providers lastTierProviders = backend.getProviders(); HotSpotTruffleProfilingInstrumentation.installGuest(options, lastTierSuites.getLowTier()); - final TruffleTierConfiguration lastTierSetup = new TruffleTierConfiguration(lastTierPe, backend, lastTierProviders, lastTierSuites, lastTierLirSuites); + final TruffleTierConfiguration lastTierSetup = new TruffleTierConfiguration(lastTierPe, backend, lastTierProviders, lastTierSuites, lastTierLirSuites, knownTruffleTypes); CompilerConfigurationFactory lowTierCompilerConfigurationFactory = new EconomyCompilerConfigurationFactory(); CompilerConfiguration compilerConfiguration = lowTierCompilerConfigurationFactory.createCompilerConfiguration(); @@ -146,8 +146,8 @@ public static HotSpotTruffleCompilerImpl create(final TruffleCompilerRuntime run firstTierBackend.completeInitialization(HotSpotJVMCIRuntime.runtime(), options); HotSpotTruffleProfilingInstrumentation.installGuest(options, firstTierSuites.getLowTier()); - TruffleTierConfiguration firstTierSetup = new TruffleTierConfiguration(firstTierPe, firstTierBackend, firstTierProviders, firstTierSuites, firstTierLirSuites); - final TruffleCompilerConfiguration compilerConfig = new TruffleCompilerConfiguration(runtime, plugins, snippetReflection, firstTierSetup, lastTierSetup); + TruffleTierConfiguration firstTierSetup = new TruffleTierConfiguration(firstTierPe, firstTierBackend, firstTierProviders, firstTierSuites, firstTierLirSuites, knownTruffleTypes); + final TruffleCompilerConfiguration compilerConfig = new TruffleCompilerConfiguration(runtime, plugins, snippetReflection, firstTierSetup, lastTierSetup, knownTruffleTypes); return new HotSpotTruffleCompilerImpl(hotspotGraalRuntime, compilerConfig); } diff --git a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleProfilingInstrumentation.java b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleProfilingInstrumentation.java index 6ee6294a82a5..4c07da69abae 100644 --- a/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleProfilingInstrumentation.java +++ b/compiler/src/org.graalvm.compiler.truffle.compiler.hotspot/src/org/graalvm/compiler/truffle/compiler/hotspot/HotSpotTruffleProfilingInstrumentation.java @@ -31,9 +31,12 @@ import org.graalvm.compiler.graph.SourceLanguagePosition; import org.graalvm.compiler.hotspot.debug.BenchmarkCounters; import org.graalvm.compiler.nodes.CallTargetNode; +import org.graalvm.compiler.nodes.IfNode; import org.graalvm.compiler.nodes.Invoke; +import org.graalvm.compiler.nodes.PrefetchAllocateNode; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.debug.DynamicCounterNode; +import org.graalvm.compiler.nodes.extended.SwitchNode; import org.graalvm.compiler.nodes.java.AbstractCompareAndSwapNode; import org.graalvm.compiler.nodes.memory.AbstractWriteNode; import org.graalvm.compiler.nodes.memory.FixedAccessNode; @@ -106,7 +109,13 @@ public static class InstrumentPhase extends Phase { @Override protected void run(StructuredGraph graph) { graph.getNodes().forEach((node) -> { - if (node instanceof Invoke) { + if (node instanceof PrefetchAllocateNode) { + DynamicCounterNode.addCounterBefore("allocate", formatCounterLocation(node, null, host), 1, false, (PrefetchAllocateNode) node); + } else if (node instanceof SwitchNode) { + DynamicCounterNode.addCounterBefore("switch", formatCounterLocation(node, null, host), 1, false, (SwitchNode) node); + } else if (node instanceof IfNode) { + DynamicCounterNode.addCounterBefore("if", formatCounterLocation(node, null, host), 1, false, (IfNode) node); + } else if (node instanceof Invoke) { DynamicCounterNode.addCounterBefore("invoke", formatCounterLocation(node, ((Invoke) node).callTarget(), host), 1, false, ((Invoke) node).asFixedNode()); } else if (node instanceof ReadNode) { DynamicCounterNode.addCounterBefore("read", formatCounterLocation(node, null, host), 1, false, (ReadNode) node); @@ -127,9 +136,7 @@ static String formatCounterLocation(Node node, CallTargetNode target, boolean ho for (StackTraceElement stackTraceElement : elements) { b.append(sep); b.append(stackTraceElement.toString()); - if (sep.isEmpty()) { - b.append(" (").append(node.toString()).append(")"); sep = "\n "; } } @@ -140,9 +147,9 @@ static String formatCounterLocation(Node node, CallTargetNode target, boolean ho if (b.length() == 0) { ResolvedJavaMethod method = ((StructuredGraph) node.graph()).method(); if (method == null) { - return "no-location"; + return "no-location(" + node.toString() + ")"; } else { - return "no-location in " + method.format("%H.%n(%p)"); + return "no-location in " + method.format("%H.%n(%p) (" + node.toString() + ")"); } } else { if (!host) {