# HG changeset patch # User Bernhard Urban # Date 1398350477 -7200 # Node ID c279c6773799e4c0a6b041b69e020f74dd90e40e # Parent f14192b72692c09ac80111c833a1643830486205 snippet counter: fix location for counter access diff -r f14192b72692 -r c279c6773799 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetCounter.java --- 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 { - 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); } } diff -r f14192b72692 -r c279c6773799 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- 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; }