changeset 11945:1fee8d3e99f6

Merge.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 09 Oct 2013 17:26:38 +0200
parents 506d4520435d (diff) 87402d9a67ca (current diff)
children ca8bf227323c
files
diffstat 7 files changed, 54 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Wed Oct 09 16:02:48 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Wed Oct 09 17:26:38 2013 +0200
@@ -647,8 +647,16 @@
                 checkcastDynamicSnippets.lower(checkcastDynamicNode);
             }
         } else if (n instanceof UnsafeLoadNode) {
-            if (graph.getGuardsStage().ordinal() > StructuredGraph.GuardsStage.FLOATING_GUARDS.ordinal()) {
-                UnsafeLoadNode load = (UnsafeLoadNode) n;
+            UnsafeLoadNode load = (UnsafeLoadNode) n;
+            if (load.getGuardingCondition() != null) {
+                boolean compressible = (!load.object().isNullConstant() && load.accessKind() == Kind.Object);
+                ConditionAnchorNode valueAnchorNode = graph.add(new ConditionAnchorNode(load.getGuardingCondition()));
+                LocationNode location = createLocation(load);
+                ReadNode memoryRead = graph.add(new ReadNode(load.object(), location, load.stamp(), valueAnchorNode, BarrierType.NONE, compressible));
+                load.replaceAtUsages(memoryRead);
+                graph.replaceFixedWithFixed(load, valueAnchorNode);
+                graph.addAfterFixed(valueAnchorNode, memoryRead);
+            } else if (graph.getGuardsStage().ordinal() > StructuredGraph.GuardsStage.FLOATING_GUARDS.ordinal()) {
                 assert load.kind() != Kind.Illegal;
                 boolean compressible = (!load.object().isNullConstant() && load.accessKind() == Kind.Object);
                 if (addReadBarrier(load)) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConditionAnchorNode.java	Wed Oct 09 16:02:48 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConditionAnchorNode.java	Wed Oct 09 17:26:38 2013 +0200
@@ -28,7 +28,7 @@
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
-@NodeInfo(nameTemplate = "ConditionGuard(!={p#negated})")
+@NodeInfo(nameTemplate = "ConditionAnchor(!={p#negated})")
 public final class ConditionAnchorNode extends FixedWithNextNode implements Canonicalizable, Lowerable, GuardingNode {
 
     @Input private LogicNode condition;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java	Wed Oct 09 16:02:48 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java	Wed Oct 09 17:26:38 2013 +0200
@@ -26,10 +26,10 @@
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
-import com.oracle.graal.graph.iterators.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
+import com.oracle.graal.nodes.virtual.*;
 
 /**
  * The {@code ConstantNode} represents a constant such as an integer value, long, float, object
@@ -57,15 +57,24 @@
 
     @Override
     public void generate(LIRGeneratorTool gen) {
-        if (gen.canInlineConstant(value) || onlyUsedInFrameState()) {
+        if (gen.canInlineConstant(value) || onlyUsedInVirtualState()) {
             gen.setResult(this, value);
         } else {
             gen.setResult(this, gen.emitMove(value));
         }
     }
 
-    private boolean onlyUsedInFrameState() {
-        return usages().filter(NodePredicates.isNotA(FrameState.class)).isEmpty();
+    private boolean onlyUsedInVirtualState() {
+        for (Node n : this.usages()) {
+            if (n instanceof FrameState) {
+                // Only frame state usages.
+            } else if (n instanceof VirtualState) {
+                // Only virtual usage.
+            } else {
+                return false;
+            }
+        }
+        return true;
     }
 
     public static ConstantNode forConstant(Constant constant, MetaAccessProvider runtime, Graph graph) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Wed Oct 09 16:02:48 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Wed Oct 09 17:26:38 2013 +0200
@@ -77,8 +77,7 @@
     @Override
     public void virtualize(VirtualizerTool tool) {
         State state = tool.getObjectState(object);
-        if (state != null && state.getState() == EscapeState.Virtual) {
-            assert ObjectStamp.typeOrNull(this).isAssignableFrom(state.getVirtualObject().type());
+        if (state != null && state.getState() == EscapeState.Virtual && ObjectStamp.typeOrNull(this).isAssignableFrom(state.getVirtualObject().type())) {
             tool.replaceWithVirtual(state.getVirtualObject());
         }
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java	Wed Oct 09 16:02:48 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java	Wed Oct 09 17:26:38 2013 +0200
@@ -35,13 +35,19 @@
  * performed before the load.
  */
 public class UnsafeLoadNode extends UnsafeAccessNode implements Lowerable, Virtualizable {
+    @Input private LogicNode guardingCondition;
 
     public UnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind) {
-        this(object, offset, accessKind, LocationIdentity.ANY_LOCATION);
+        this(object, offset, accessKind, LocationIdentity.ANY_LOCATION, null);
     }
 
-    public UnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind, LocationIdentity locationIdentity) {
+    public UnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind, LocationIdentity locationIdentity, LogicNode condition) {
         super(StampFactory.forKind(accessKind.getStackKind()), object, offset, accessKind, locationIdentity);
+        this.guardingCondition = condition;
+    }
+
+    public LogicNode getGuardingCondition() {
+        return guardingCondition;
     }
 
     @Override
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Wed Oct 09 16:02:48 2013 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Wed Oct 09 17:26:38 2013 +0200
@@ -523,6 +523,23 @@
                     }
                     metricCheckCastRemoved.increment();
                 }
+            } else if (node instanceof ConditionAnchorNode) {
+                ConditionAnchorNode conditionAnchorNode = (ConditionAnchorNode) node;
+                LogicNode condition = conditionAnchorNode.condition();
+                ValueNode replacementAnchor = null;
+                if (conditionAnchorNode.isNegated()) {
+                    if (state.falseConditions.containsKey(condition)) {
+                        replacementAnchor = state.falseConditions.get(condition);
+                    }
+                } else {
+                    if (state.trueConditions.containsKey(condition)) {
+                        replacementAnchor = state.trueConditions.get(condition);
+                    }
+                }
+                if (replacementAnchor != null) {
+                    conditionAnchorNode.replaceAtUsages(replacementAnchor);
+                    conditionAnchorNode.graph().removeFixed(conditionAnchorNode);
+                }
             } else if (node instanceof IfNode) {
                 IfNode ifNode = (IfNode) node;
                 LogicNode compare = ifNode.condition();
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadMacroNode.java	Wed Oct 09 16:02:48 2013 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadMacroNode.java	Wed Oct 09 17:26:38 2013 +0200
@@ -26,6 +26,7 @@
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodes.*;
+import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.truffle.nodes.asserts.*;
 import com.oracle.truffle.api.*;
@@ -46,7 +47,6 @@
         assert arguments.size() == ARGUMENT_COUNT;
     }
 
-    @SuppressWarnings("unused")
     @Override
     public Node canonical(CanonicalizerTool tool) {
         ValueNode locationArgument = arguments.get(LOCATION_ARGUMENT_INDEX);
@@ -61,7 +61,9 @@
             } else {
                 locationIdentity = ObjectLocationIdentity.create(locationIdentityObject);
             }
-            return graph().add(new UnsafeLoadNode(objectArgument, offsetArgument, this.stamp().kind(), locationIdentity));
+            return graph().add(
+                            new UnsafeLoadNode(objectArgument, offsetArgument, this.stamp().kind(), locationIdentity, CompareNode.createCompareNode(Condition.EQ, conditionArgument,
+                                            ConstantNode.forBoolean(true, graph()))));
         }
         return this;
     }