changeset 13488:83adefeb8e5c

The runtime cannot always compare two constants
author Christian Wimmer <christian.wimmer@oracle.com>
date Fri, 27 Dec 2013 15:12:12 -0800
parents c5449c0d5909
children 780d53499ca2
files graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ConstantReflectionProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/Condition.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java
diffstat 5 files changed, 24 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ConstantReflectionProvider.java	Fri Dec 27 15:11:12 2013 -0800
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ConstantReflectionProvider.java	Fri Dec 27 15:12:12 2013 -0800
@@ -28,12 +28,13 @@
 public interface ConstantReflectionProvider {
 
     /**
-     * Compares two constants for equality. The equality relationship is symmetric.
+     * Compares two constants for equality. The equality relationship is symmetric. If the constants
+     * cannot be compared at this point, the return value is {@code null};
      * 
      * @return {@code true} if the two parameters represent the same runtime object, {@code false}
-     *         otherwise
+     *         if they are different, or {@code null} if the parameters cannot be compared.
      */
-    boolean constantEquals(Constant x, Constant y);
+    Boolean constantEquals(Constant x, Constant y);
 
     /**
      * Returns the length of an array that is wrapped in a {@link Constant} object. If {@code array}
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java	Fri Dec 27 15:11:12 2013 -0800
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java	Fri Dec 27 15:12:12 2013 -0800
@@ -43,7 +43,7 @@
     }
 
     @Override
-    public boolean constantEquals(Constant x, Constant y) {
+    public Boolean constantEquals(Constant x, Constant y) {
         return x.equals(y);
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Fri Dec 27 15:11:12 2013 -0800
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Fri Dec 27 15:12:12 2013 -0800
@@ -320,7 +320,10 @@
 
     private static boolean valuesDistinct(ConstantReflectionProvider constantReflection, ValueNode a, ValueNode b) {
         if (a.isConstant() && b.isConstant()) {
-            return !constantReflection.constantEquals(a.asConstant(), b.asConstant());
+            Boolean equal = constantReflection.constantEquals(a.asConstant(), b.asConstant());
+            if (equal != null) {
+                return !equal.booleanValue();
+            }
         }
 
         Stamp stampA = a.stamp();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/Condition.java	Fri Dec 27 15:11:12 2013 -0800
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/Condition.java	Fri Dec 27 15:12:12 2013 -0800
@@ -399,13 +399,16 @@
                 }
             }
             case Object: {
-                switch (this) {
-                    case EQ:
-                        return constantReflection.constantEquals(lt, rt);
-                    case NE:
-                        return !constantReflection.constantEquals(lt, rt);
-                    default:
-                        throw new GraalInternalError("expected condition: %s", this);
+                Boolean equal = constantReflection.constantEquals(lt, rt);
+                if (equal != null) {
+                    switch (this) {
+                        case EQ:
+                            return equal.booleanValue();
+                        case NE:
+                            return !equal.booleanValue();
+                        default:
+                            throw new GraalInternalError("expected condition: %s", this);
+                    }
                 }
             }
             case Float: {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java	Fri Dec 27 15:11:12 2013 -0800
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java	Fri Dec 27 15:12:12 2013 -0800
@@ -105,7 +105,11 @@
             for (int i = 0; i < keyCount(); i++) {
                 Constant typeHub = keyAt(i);
                 assert constant.getKind() == typeHub.getKind();
-                if (tool.getConstantReflection().constantEquals(constant, typeHub)) {
+                Boolean equal = tool.getConstantReflection().constantEquals(constant, typeHub);
+                if (equal == null) {
+                    /* We don't know if this key is a match or not, so we cannot simplify. */
+                    return;
+                } else if (equal.booleanValue()) {
                     survivingEdge = keySuccessorIndex(i);
                 }
             }