# HG changeset patch # User Tom Rodriguez # Date 1418923042 28800 # Node ID ab9d3ff6829bb89568402750663c6e53f8ba8b2f # Parent 6484e5c068c7a8a77c84285b6dfe9f0414b3b367 Pass constant reflection into ConvertNode.convert diff -r 6484e5c068c7 -r ab9d3ff6829b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java --- 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(); diff -r 6484e5c068c7 -r ab9d3ff6829b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java --- 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)) { diff -r 6484e5c068c7 -r ab9d3ff6829b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java --- 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; } diff -r 6484e5c068c7 -r ab9d3ff6829b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HubGetClassNode.java --- 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 { diff -r 6484e5c068c7 -r ab9d3ff6829b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/KlassLayoutHelperNode.java --- 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; } } diff -r 6484e5c068c7 -r ab9d3ff6829b graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java --- 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()); } } diff -r 6484e5c068c7 -r ab9d3ff6829b graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java --- 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); } diff -r 6484e5c068c7 -r ab9d3ff6829b graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java --- 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); } diff -r 6484e5c068c7 -r ab9d3ff6829b graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java --- 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 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; }