# HG changeset patch # User Christian Wimmer # Date 1388185932 28800 # Node ID 83adefeb8e5c1e53efc1837999638a5aba5a37bc # Parent c5449c0d59091d9e769ec68378978d5838fe6d59 The runtime cannot always compare two constants diff -r c5449c0d5909 -r 83adefeb8e5c graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ConstantReflectionProvider.java --- 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} diff -r c5449c0d5909 -r 83adefeb8e5c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java --- 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); } diff -r c5449c0d5909 -r 83adefeb8e5c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java --- 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(); diff -r c5449c0d5909 -r 83adefeb8e5c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/Condition.java --- 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: { diff -r c5449c0d5909 -r 83adefeb8e5c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java --- 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); } }