Mercurial > hg > graal-jvmci-8
changeset 15363:c279c6773799
snippet counter: fix location for counter access
author | Bernhard Urban <bernhard.urban@jku.at> |
---|---|
date | Thu, 24 Apr 2014 16:41:17 +0200 |
parents | f14192b72692 |
children | 9693513ce95c |
files | graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetCounter.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java |
diffstat | 2 files changed, 23 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetCounter.java Thu Apr 24 14:03:17 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetCounter.java Thu Apr 24 16:41:17 2014 +0200 @@ -32,15 +32,13 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.replacements.Snippet.Fold; -import com.oracle.graal.replacements.nodes.*; +import com.oracle.graal.word.*; /** * A counter that can be safely {@linkplain #inc() incremented} from within a snippet for gathering * snippet specific metrics. */ public class SnippetCounter implements Comparable<SnippetCounter> { - private static final LocationIdentity SNIPPET_COUNTER_LOCATION = new NamedLocationIdentity("SnippetCounter"); - /** * A group of related counters. */ @@ -107,7 +105,7 @@ /** * Creates a counter. - * + * * @param group the group to which the counter belongs. If this is null, the newly created * counter is disabled and {@linkplain #inc() incrementing} is a no-op. * @param name the name of the counter @@ -130,12 +128,20 @@ } /** + * We do not want to use the {@link LocationIdentity} of the {@link #value} field, so that the + * usage in snippets is always possible. If a method accesses the counter via the field and the + * snippet, the result might not be correct though. + */ + protected static final LocationIdentity SNIPPET_COUNTER_LOCATION = new NamedLocationIdentity("SnippetCounter"); + + /** * Increments the value of this counter. This method can be safely used in a snippet if it is * invoked on a compile-time constant {@link SnippetCounter} object. */ public void inc() { if (group != null) { - DirectObjectStoreNode.storeLong(this, countOffset(), 0, value + 1, SNIPPET_COUNTER_LOCATION); + long loadedValue = ObjectAccess.readLong(this, countOffset(), SNIPPET_COUNTER_LOCATION); + ObjectAccess.writeLong(this, countOffset(), loadedValue + 1, SNIPPET_COUNTER_LOCATION); } }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Thu Apr 24 14:03:17 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Thu Apr 24 16:41:17 2014 +0200 @@ -23,9 +23,11 @@ package com.oracle.graal.replacements; import static com.oracle.graal.api.meta.LocationIdentity.*; + import static com.oracle.graal.api.meta.MetaUtil.*; import static com.oracle.graal.debug.Debug.*; import static java.util.FormattableFlags.*; +import static com.oracle.graal.compiler.common.GraalOptions.*; import java.io.*; import java.lang.reflect.*; @@ -40,8 +42,8 @@ import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; import com.oracle.graal.debug.internal.*; +import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.graph.*; -import com.oracle.graal.graph.Graph.Mark; import com.oracle.graal.loop.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.StructuredGraph.GuardsStage; @@ -965,7 +967,15 @@ * if no FloatingReadNode is reading from this location, the kill to this location is fine. */ for (FloatingReadNode frn : replacee.graph().getNodes(FloatingReadNode.class)) { - assert !(kills.contains(frn.location().getLocationIdentity())) : frn + " reads from " + frn.location().getLocationIdentity() + " but " + replacee + " does not kill this location"; + LocationIdentity locationIdentity = frn.location().getLocationIdentity(); + if (SnippetCounters.getValue()) { + // accesses to snippet counters are artificially introduced and violate the memory + // semantics. + if (locationIdentity == SnippetCounter.SNIPPET_COUNTER_LOCATION) { + continue; + } + } + assert !kills.contains(locationIdentity) : frn + " reads from location \"" + locationIdentity + "\" but " + replacee + " does not kill this location"; } return true; }