changeset 23148:fea7e5ffe8ce

Ensure that the stamp is respected when folding reads from arrays
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Tue, 08 Dec 2015 17:29:03 -0800
parents 2d578cb15516
children cca72677127b
files graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/RawPointerStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/Stamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MetaspacePointerStamp.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/memory/ReadNode.java
diffstat 11 files changed, 99 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- 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() {
--- 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";
     }
--- 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;
--- 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();
     }
--- 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");
     }
--- 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.
      *
--- 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;
--- 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;
     }
--- 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;
+    }
 }
--- 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
      */
--- 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);
                 }