# HG changeset patch # User Tom Rodriguez # Date 1449624543 28800 # Node ID fea7e5ffe8ce0deed9129e70d4018485ebed8879 # Parent 2d578cb15516a6a6ad7d0948968ab7cf9f3928af Ensure that the stamp is respected when folding reads from arrays diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java Tue Dec 08 17:29:03 2015 -0800 @@ -249,6 +249,15 @@ } @Override + public boolean isCompatible(Constant constant) { + if (constant instanceof PrimitiveConstant) { + PrimitiveConstant prim = (PrimitiveConstant) constant; + return prim.getJavaKind().isNumericFloat(); + } + return false; + } + + @Override public boolean equals(Object obj) { if (this == obj) { return true; @@ -282,6 +291,10 @@ return null; } + public boolean isConstant() { + return (nonNaN && Double.compare(lowerBound, upperBound) == 0); + } + private static final ArithmeticOpTable OPS = new ArithmeticOpTable( new UnaryOp.Neg() { diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java Tue Dec 08 17:29:03 2015 -0800 @@ -92,6 +92,15 @@ } @Override + public boolean isCompatible(Constant constant) { + if (constant instanceof PrimitiveConstant) { + PrimitiveConstant prim = (PrimitiveConstant) constant; + return prim.getJavaKind() == JavaKind.Illegal; + } + return false; + } + + @Override public String toString() { return "ILLEGAL"; } diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java Tue Dec 08 17:29:03 2015 -0800 @@ -295,6 +295,15 @@ } @Override + public boolean isCompatible(Constant constant) { + if (constant instanceof PrimitiveConstant) { + PrimitiveConstant prim = (PrimitiveConstant) constant; + return prim.getJavaKind().isNumericInteger(); + } + return false; + } + + @Override public int hashCode() { final int prime = 31; int result = 1; diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java Tue Dec 08 17:29:03 2015 -0800 @@ -23,6 +23,7 @@ package com.oracle.graal.compiler.common.type; import jdk.vm.ci.meta.Constant; +import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.LIRKind; import jdk.vm.ci.meta.MemoryAccessProvider; import jdk.vm.ci.meta.ResolvedJavaType; @@ -65,6 +66,14 @@ } @Override + public boolean isCompatible(Constant constant) { + if (constant instanceof JavaConstant) { + return ((JavaConstant) constant).getJavaKind().isObject(); + } + return false; + } + + @Override public LIRKind getLIRKind(LIRKindTool tool) { return tool.getObjectKind(); } diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/RawPointerStamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/RawPointerStamp.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/RawPointerStamp.java Tue Dec 08 17:29:03 2015 -0800 @@ -27,6 +27,7 @@ import jdk.vm.ci.meta.LIRKind; import jdk.vm.ci.meta.MemoryAccessProvider; import jdk.vm.ci.meta.MetaAccessProvider; +import jdk.vm.ci.meta.PrimitiveConstant; import jdk.vm.ci.meta.ResolvedJavaType; import com.oracle.graal.compiler.common.spi.LIRKindTool; @@ -102,6 +103,14 @@ } @Override + public boolean isCompatible(Constant constant) { + if (constant instanceof PrimitiveConstant) { + return ((PrimitiveConstant) constant).getJavaKind().isNumericInteger(); + } + return false; + } + + @Override public Constant readConstant(MemoryAccessProvider provider, Constant base, long displacement) { throw JVMCIError.shouldNotReachHere("can't read raw pointer"); } diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/Stamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/Stamp.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/Stamp.java Tue Dec 08 17:29:03 2015 -0800 @@ -23,6 +23,8 @@ package com.oracle.graal.compiler.common.type; import jdk.vm.ci.meta.Constant; +import jdk.vm.ci.meta.ConstantReflectionProvider; +import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.LIRKind; import jdk.vm.ci.meta.MemoryAccessProvider; @@ -107,6 +109,13 @@ public abstract boolean isCompatible(Stamp other); /** + * Check that the constant {@code other} is compatible with this stamp. + * + * @param constant + */ + public abstract boolean isCompatible(Constant constant); + + /** * Test whether this stamp has legal values. */ public abstract boolean hasValues(); @@ -135,6 +144,13 @@ public abstract Constant readConstant(MemoryAccessProvider provider, Constant base, long displacement); /** + * Read a value of this stamp from memory. + */ + public Constant readConstantArrayElementForOffset(ConstantReflectionProvider constantReflection, JavaConstant constant, long displacement) { + return constantReflection.readConstantArrayElementForOffset(constant, displacement); + } + + /** * Tries to improve this stamp with the stamp given as parameter. If successful, returns the new * improved stamp. Otherwise, returns a stamp equal to this. * diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java Tue Dec 08 17:29:03 2015 -0800 @@ -94,6 +94,11 @@ } @Override + public boolean isCompatible(Constant constant) { + return false; + } + + @Override public Stamp empty() { // the void stamp is always empty return this; diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MetaspacePointerStamp.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MetaspacePointerStamp.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MetaspacePointerStamp.java Tue Dec 08 17:29:03 2015 -0800 @@ -23,6 +23,8 @@ package com.oracle.graal.hotspot.nodes.type; import jdk.vm.ci.common.JVMCIError; +import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant; +import jdk.vm.ci.meta.Constant; import jdk.vm.ci.meta.LIRKind; import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.ResolvedJavaType; @@ -49,6 +51,11 @@ } @Override + public boolean isCompatible(Constant constant) { + return (constant instanceof HotSpotMetaspaceConstant || constant.isDefaultForKind()); + } + + @Override public boolean hasValues() { return true; } diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java Tue Dec 08 17:29:03 2015 -0800 @@ -23,9 +23,12 @@ package com.oracle.graal.hotspot.nodes.type; import jdk.vm.ci.hotspot.HotSpotCompressedNullConstant; +import jdk.vm.ci.hotspot.HotSpotConstant; import jdk.vm.ci.hotspot.HotSpotMemoryAccessProvider; +import jdk.vm.ci.hotspot.HotSpotObjectConstant; import jdk.vm.ci.hotspot.HotSpotVMConfig.CompressEncoding; import jdk.vm.ci.meta.Constant; +import jdk.vm.ci.meta.ConstantReflectionProvider; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.LIRKind; import jdk.vm.ci.meta.MemoryAccessProvider; @@ -94,6 +97,15 @@ } @Override + public Constant readConstantArrayElementForOffset(ConstantReflectionProvider constantReflection, JavaConstant constant, long displacement) { + Constant result = super.readConstantArrayElementForOffset(constantReflection, constant, displacement); + if (result != null) { + result = ((HotSpotConstant) result).compress(); + } + return result; + } + + @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); @@ -124,4 +136,12 @@ return null; } } + + @Override + public boolean isCompatible(Constant other) { + if (other instanceof HotSpotObjectConstant) { + return ((HotSpotObjectConstant) other).isCompressed(); + } + return true; + } } diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Tue Dec 08 17:29:03 2015 -0800 @@ -32,14 +32,10 @@ import jdk.vm.ci.meta.LIRKind; import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.PrimitiveConstant; -import jdk.vm.ci.meta.VMConstant; import com.oracle.graal.compiler.common.type.AbstractObjectStamp; -import com.oracle.graal.compiler.common.type.AbstractPointerStamp; import com.oracle.graal.compiler.common.type.FloatStamp; -import com.oracle.graal.compiler.common.type.IllegalStamp; import com.oracle.graal.compiler.common.type.IntegerStamp; -import com.oracle.graal.compiler.common.type.PrimitiveStamp; import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.Node; @@ -74,23 +70,10 @@ */ public ConstantNode(Constant value, Stamp stamp) { super(TYPE, stamp); - assert stamp != null && isCompatible(value, stamp); + assert stamp != null && stamp.isCompatible(value) : stamp + " " + value; this.value = value; } - private static boolean isCompatible(Constant value, Stamp stamp) { - if (value instanceof VMConstant) { - assert stamp instanceof AbstractPointerStamp; - } else if (value instanceof PrimitiveConstant) { - if (((PrimitiveConstant) value).getJavaKind() == JavaKind.Illegal) { - assert stamp instanceof IllegalStamp; - } else { - assert stamp instanceof PrimitiveStamp; - } - } - return true; - } - /** * @return the constant value represented by this node */ diff -r 2d578cb15516 -r fea7e5ffe8ce graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/memory/ReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/memory/ReadNode.java Tue Dec 08 17:24:35 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/memory/ReadNode.java Tue Dec 08 17:29:03 2015 -0800 @@ -144,7 +144,7 @@ } } - Constant constant = tool.getConstantReflection().readConstantArrayElementForOffset(object.asJavaConstant(), displacement); + Constant constant = read.stamp().readConstantArrayElementForOffset(tool.getConstantReflection(), object.asJavaConstant(), displacement); if (constant != null) { return ConstantNode.forConstant(read.stamp(), constant, metaAccess); }