Mercurial > hg > graal-compiler
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); } }