changeset 18720:ab9d3ff6829b

Pass constant reflection into ConvertNode.convert
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Thu, 18 Dec 2014 09:17:22 -0800
parents 6484e5c068c7
children d747b9e5695c
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HubGetClassNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/KlassLayoutHelperNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java
diffstat 9 files changed, 83 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java	Thu Dec 18 15:31:12 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java	Thu Dec 18 09:17:22 2014 -0800
@@ -176,11 +176,51 @@
             // zero and the MIN_VALUE / -1 cases.
         } else if (n instanceof AbstractDeoptimizeNode || n instanceof UnwindNode || n instanceof RemNode) {
             /* No lowering, we generate LIR directly for these nodes. */
+        } else if (n instanceof ClassGetHubNode) {
+            lowerClassGetHubNode((ClassGetHubNode) n, tool);
+        } else if (n instanceof HubGetClassNode) {
+            lowerHubGetClassNode((HubGetClassNode) n, tool);
+        } else if (n instanceof KlassLayoutHelperNode) {
+            lowerKlassLayoutHelperNode((KlassLayoutHelperNode) n, tool);
         } else {
             super.lower(n, tool);
         }
     }
 
+    private void lowerKlassLayoutHelperNode(KlassLayoutHelperNode n, LoweringTool tool) {
+        if (tool.getLoweringStage() == LoweringTool.StandardLoweringStage.HIGH_TIER) {
+            return;
+        }
+        StructuredGraph graph = n.graph();
+        LocationNode location = ConstantLocationNode.create(KLASS_LAYOUT_HELPER_LOCATION, runtime.getConfig().klassLayoutHelperOffset, graph);
+        assert !n.getHub().isConstant();
+        graph.replaceFloating(n, graph.unique(FloatingReadNode.create(n.getHub(), location, null, n.stamp(), n.getGuard(), BarrierType.NONE)));
+    }
+
+    private void lowerHubGetClassNode(HubGetClassNode n, LoweringTool tool) {
+        if (tool.getLoweringStage() == LoweringTool.StandardLoweringStage.HIGH_TIER) {
+            return;
+        }
+
+        StructuredGraph graph = n.graph();
+        LocationNode location = ConstantLocationNode.create(CLASS_MIRROR_LOCATION, runtime.getConfig().classMirrorOffset, graph);
+        assert !n.getHub().isConstant();
+        FloatingReadNode read = graph.unique(FloatingReadNode.create(n.getHub(), location, null, n.stamp(), n.getGuard(), BarrierType.NONE));
+        graph.replaceFloating(n, read);
+    }
+
+    private void lowerClassGetHubNode(ClassGetHubNode n, LoweringTool tool) {
+        if (tool.getLoweringStage() == LoweringTool.StandardLoweringStage.HIGH_TIER) {
+            return;
+        }
+
+        StructuredGraph graph = n.graph();
+        LocationNode location = ConstantLocationNode.create(CLASS_KLASS_LOCATION, runtime.getConfig().klassOffset, graph);
+        assert !n.getValue().isConstant();
+        FloatingReadNode read = graph.unique(FloatingReadNode.create(n.getValue(), location, null, n.stamp(), n.getGuard(), BarrierType.NONE));
+        graph.replaceFloating(n, read);
+    }
+
     private void lowerInvoke(Invoke invoke, LoweringTool tool, StructuredGraph graph) {
         if (invoke.callTarget() instanceof MethodCallTargetNode) {
             MethodCallTargetNode callTarget = (MethodCallTargetNode) invoke.callTarget();
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java	Thu Dec 18 15:31:12 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java	Thu Dec 18 09:17:22 2014 -0800
@@ -98,7 +98,7 @@
     }
 
     @Override
-    public Constant convert(Constant c) {
+    public Constant convert(Constant c, ConstantReflectionProvider constantReflection) {
         switch (op) {
             case Compress:
                 return compress(c, encoding);
@@ -110,7 +110,7 @@
     }
 
     @Override
-    public Constant reverse(Constant c) {
+    public Constant reverse(Constant c, ConstantReflectionProvider constantReflection) {
         switch (op) {
             case Compress:
                 return uncompress(c, encoding);
@@ -159,7 +159,7 @@
     @Override
     public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) {
         if (forValue.isConstant()) {
-            return ConstantNode.forConstant(stamp(), convert(forValue.asConstant()), tool.getMetaAccess());
+            return ConstantNode.forConstant(stamp(), convert(forValue.asConstant(), tool.getConstantReflection()), tool.getMetaAccess());
         } else if (forValue instanceof CompressionNode) {
             CompressionNode other = (CompressionNode) forValue;
             if (op != other.op && encoding.equals(other.encoding)) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java	Thu Dec 18 15:31:12 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java	Thu Dec 18 09:17:22 2014 -0800
@@ -22,19 +22,15 @@
  */
 package com.oracle.graal.hotspot.replacements;
 
-import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*;
-
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.calc.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.*;
 import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.nodes.type.*;
 import com.oracle.graal.hotspot.word.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
-import com.oracle.graal.nodes.HeapAccess.BarrierType;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.spi.*;
@@ -48,24 +44,18 @@
 @NodeInfo
 public class ClassGetHubNode extends FloatingGuardedNode implements Lowerable, Canonicalizable, ConvertNode {
     @Input protected ValueNode clazz;
-    protected final HotSpotGraalRuntimeProvider runtime;
 
-    public static ClassGetHubNode create(@InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode clazz) {
-        return new ClassGetHubNode(clazz, null, runtime);
+    public static ClassGetHubNode create(ValueNode clazz) {
+        return new ClassGetHubNode(clazz, null);
     }
 
-    public static ClassGetHubNode create(@InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode clazz, ValueNode guard) {
-        return new ClassGetHubNode(clazz, guard, runtime);
+    public static ClassGetHubNode create(ValueNode clazz, ValueNode guard) {
+        return new ClassGetHubNode(clazz, guard);
     }
 
-    protected ClassGetHubNode(ValueNode clazz, ValueNode guard, HotSpotGraalRuntimeProvider runtime) {
+    protected ClassGetHubNode(ValueNode clazz, ValueNode guard) {
         super(KlassPointerStamp.klass(), (GuardingNode) guard);
         this.clazz = clazz;
-        this.runtime = runtime;
-    }
-
-    public ValueNode getHub() {
-        return clazz;
     }
 
     @Override
@@ -96,14 +86,7 @@
 
     @Override
     public void lower(LoweringTool tool) {
-        if (tool.getLoweringStage() == LoweringTool.StandardLoweringStage.HIGH_TIER) {
-            return;
-        }
-
-        LocationNode location = ConstantLocationNode.create(CLASS_KLASS_LOCATION, runtime.getConfig().klassOffset, graph());
-        assert !clazz.isConstant();
-        FloatingReadNode read = graph().unique(FloatingReadNode.create(clazz, location, null, stamp(), getGuard(), BarrierType.NONE));
-        graph().replaceFloating(this, read);
+        tool.getLowerer().lower(this, tool);
     }
 
     @NodeIntrinsic
@@ -116,8 +99,9 @@
         return clazz;
     }
 
-    public Constant convert(Constant c) {
-        ResolvedJavaType exactType = runtime.getHostProviders().getConstantReflection().asJavaType(c);
+    @Override
+    public Constant convert(Constant c, ConstantReflectionProvider constantReflection) {
+        ResolvedJavaType exactType = constantReflection.asJavaType(c);
         if (exactType instanceof HotSpotResolvedObjectType) {
             HotSpotResolvedObjectType objectType = (HotSpotResolvedObjectType) exactType;
             return objectType.getObjectHub();
@@ -127,9 +111,10 @@
         }
     }
 
-    public Constant reverse(Constant c) {
+    @Override
+    public Constant reverse(Constant c, ConstantReflectionProvider constantReflection) {
         assert !c.equals(JavaConstant.NULL_POINTER);
-        ResolvedJavaType objectType = runtime.getHostProviders().getConstantReflection().asJavaType(c);
+        ResolvedJavaType objectType = constantReflection.asJavaType(c);
         return objectType.getJavaClass();
     }
 
@@ -138,9 +123,9 @@
     }
 
     @Override
-    public boolean preservesOrder(Condition op, Constant value) {
+    public boolean preservesOrder(Condition op, Constant value, ConstantReflectionProvider constantReflection) {
         assert op == Condition.EQ || op == Condition.NE;
-        ResolvedJavaType exactType = runtime.getHostProviders().getConstantReflection().asJavaType(value);
+        ResolvedJavaType exactType = constantReflection.asJavaType(value);
         return exactType instanceof HotSpotResolvedObjectType;
     }
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HubGetClassNode.java	Thu Dec 18 15:31:12 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HubGetClassNode.java	Thu Dec 18 09:17:22 2014 -0800
@@ -22,20 +22,15 @@
  */
 package com.oracle.graal.hotspot.replacements;
 
-import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*;
-
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.*;
 import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.word.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
-import com.oracle.graal.nodes.HeapAccess.BarrierType;
 import com.oracle.graal.nodes.calc.*;
-import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.spi.*;
 
 /**
@@ -45,16 +40,14 @@
 @NodeInfo
 public class HubGetClassNode extends FloatingGuardedNode implements Lowerable, Canonicalizable, ConvertNode {
     @Input protected ValueNode hub;
-    protected final HotSpotGraalRuntimeProvider runtime;
 
-    public static HubGetClassNode create(@InjectedNodeParameter MetaAccessProvider metaAccess, @InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode hub) {
-        return new HubGetClassNode(hub, metaAccess, runtime);
+    public static HubGetClassNode create(@InjectedNodeParameter MetaAccessProvider metaAccess, ValueNode hub) {
+        return new HubGetClassNode(hub, metaAccess);
     }
 
-    protected HubGetClassNode(ValueNode hub, MetaAccessProvider metaAccess, HotSpotGraalRuntimeProvider runtime) {
+    protected HubGetClassNode(ValueNode hub, MetaAccessProvider metaAccess) {
         super(StampFactory.declaredNonNull(metaAccess.lookupJavaType(Class.class)), null);
         this.hub = hub;
-        this.runtime = runtime;
     }
 
     public ValueNode getHub() {
@@ -79,14 +72,7 @@
 
     @Override
     public void lower(LoweringTool tool) {
-        if (tool.getLoweringStage() == LoweringTool.StandardLoweringStage.HIGH_TIER) {
-            return;
-        }
-
-        LocationNode location = ConstantLocationNode.create(CLASS_MIRROR_LOCATION, runtime.getConfig().classMirrorOffset, graph());
-        assert !hub.isConstant();
-        FloatingReadNode read = graph().unique(FloatingReadNode.create(hub, location, null, stamp(), getGuard(), BarrierType.NONE));
-        graph().replaceFloating(this, read);
+        tool.getLowerer().lower(this, tool);
     }
 
     @NodeIntrinsic
@@ -98,19 +84,19 @@
     }
 
     @Override
-    public Constant convert(Constant c) {
+    public Constant convert(Constant c, ConstantReflectionProvider constantReflection) {
         if (JavaConstant.NULL_POINTER.equals(c)) {
             return c;
         }
-        return runtime.getHostProviders().getConstantReflection().asJavaType(c).getJavaClass();
+        return constantReflection.asJavaType(c).getJavaClass();
     }
 
     @Override
-    public Constant reverse(Constant c) {
+    public Constant reverse(Constant c, ConstantReflectionProvider constantReflection) {
         if (JavaConstant.NULL_POINTER.equals(c)) {
             return c;
         }
-        ResolvedJavaType type = runtime.getHostProviders().getConstantReflection().asJavaType(c);
+        ResolvedJavaType type = constantReflection.asJavaType(c);
         if (type instanceof HotSpotResolvedObjectType) {
             return ((HotSpotResolvedObjectType) type).getObjectHub();
         } else {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/KlassLayoutHelperNode.java	Thu Dec 18 15:31:12 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/KlassLayoutHelperNode.java	Thu Dec 18 09:17:22 2014 -0800
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.hotspot.replacements;
 
-import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*;
-
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.graph.*;
@@ -32,7 +30,6 @@
 import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
-import com.oracle.graal.nodes.HeapAccess.BarrierType;
 import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.spi.*;
 
@@ -114,11 +111,10 @@
 
     @Override
     public void lower(LoweringTool tool) {
-        if (tool.getLoweringStage() == LoweringTool.StandardLoweringStage.HIGH_TIER) {
-            return;
-        }
-        LocationNode location = ConstantLocationNode.create(KLASS_LAYOUT_HELPER_LOCATION, config.klassLayoutHelperOffset, graph());
-        assert !klass.isConstant();
-        graph().replaceFloating(this, graph().unique(FloatingReadNode.create(klass, location, null, stamp(), getGuard(), BarrierType.NONE)));
+        tool.getLowerer().lower(this, tool);
+    }
+
+    public ValueNode getHub() {
+        return klass;
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Thu Dec 18 15:31:12 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Thu Dec 18 09:17:22 2014 -0800
@@ -137,9 +137,10 @@
     }
 
     private ConstantNode canonicalConvertConstant(CanonicalizerTool tool, ConvertNode convert, Constant constant) {
-        if (convert.preservesOrder(condition(), constant)) {
-            Constant reverseConverted = convert.reverse(constant);
-            if (convert.convert(reverseConverted).equals(constant)) {
+        ConstantReflectionProvider constantReflection = tool.getConstantReflection();
+        if (convert.preservesOrder(condition(), constant, constantReflection)) {
+            Constant reverseConverted = convert.reverse(constant, constantReflection);
+            if (convert.convert(reverseConverted, constantReflection).equals(constant)) {
                 return ConstantNode.forConstant(convert.getValue().stamp(), reverseConverted, tool.getMetaAccess());
             }
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java	Thu Dec 18 15:31:12 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java	Thu Dec 18 09:17:22 2014 -0800
@@ -35,9 +35,9 @@
 
     ValueNode getValue();
 
-    Constant convert(Constant c);
+    Constant convert(Constant c, ConstantReflectionProvider constantReflection);
 
-    Constant reverse(Constant c);
+    Constant reverse(Constant c, ConstantReflectionProvider constantReflection);
 
     /**
      * Check whether a conversion is lossless.
@@ -61,9 +61,10 @@
      *
      * @param op a comparison operator
      * @param value
+     * @param constantReflection
      * @return true iff (c1 op value) == (convert(c1) op convert(value)) for value and all c1
      */
-    default boolean preservesOrder(Condition op, Constant value) {
+    default boolean preservesOrder(Condition op, Constant value, ConstantReflectionProvider constantReflection) {
         return preservesOrder(op);
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java	Thu Dec 18 15:31:12 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java	Thu Dec 18 09:17:22 2014 -0800
@@ -55,12 +55,12 @@
     }
 
     @Override
-    public Constant convert(Constant c) {
+    public Constant convert(Constant c, ConstantReflectionProvider constantReflection) {
         return getOp(getValue()).foldConstant(c);
     }
 
     @Override
-    public Constant reverse(Constant c) {
+    public Constant reverse(Constant c, ConstantReflectionProvider constantReflection) {
         FloatConvertOp reverse = ArithmeticOpTable.forStamp(stamp()).getFloatConvert(op.reverse());
         return reverse.foldConstant(c);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java	Thu Dec 18 15:31:12 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java	Thu Dec 18 09:17:22 2014 -0800
@@ -69,12 +69,12 @@
     }
 
     @Override
-    public Constant convert(Constant c) {
+    public Constant convert(Constant c, ConstantReflectionProvider constantReflection) {
         return getOp(getValue()).foldConstant(getInputBits(), getResultBits(), c);
     }
 
     @Override
-    public Constant reverse(Constant c) {
+    public Constant reverse(Constant c, ConstantReflectionProvider constantReflection) {
         IntegerConvertOp<REV> reverse = getReverseOp.apply(ArithmeticOpTable.forStamp(stamp()));
         return reverse.foldConstant(getResultBits(), getInputBits(), c);
     }
@@ -89,7 +89,7 @@
         if (inputBits == resultBits) {
             return value;
         } else if (value.isConstant()) {
-            return ConstantNode.forPrimitive(stamp(), convert(forValue.asConstant()));
+            return ConstantNode.forPrimitive(stamp(), convert(forValue.asConstant(), tool.getConstantReflection()));
         } else {
             return this;
         }