# HG changeset patch # User Lukas Stadler # Date 1412858632 -7200 # Node ID 5949340cc50e633f2fba63a0af0a25b6ef13bf69 # Parent 763a34f283f9171eb911acf7d7e6a763b7c4859a only optimize identity-less comparisons for Integer and Long diff -r 763a34f283f9 -r 5949340cc50e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ObjectEqualsNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ObjectEqualsNode.java Thu Oct 09 13:26:17 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ObjectEqualsNode.java Thu Oct 09 14:43:52 2014 +0200 @@ -122,13 +122,18 @@ */ tool.replaceWithValue(LogicConstantNode.contradiction(graph())); } else if (!xIdentity && !yIdentity) { - // both are virtual without identity: check contents - assert stateX.getVirtualObject().entryCount() == 1 && stateY.getVirtualObject().entryCount() == 1; - assert stateX.getVirtualObject().type().equals(stateY.getVirtualObject().type()); - assert stateX.getVirtualObject().entryKind(0).getStackKind() == Kind.Int || stateX.getVirtualObject().entryKind(0) == Kind.Long; - IntegerEqualsNode equals = IntegerEqualsNode.create(stateX.getEntry(0), stateY.getEntry(0)); - tool.addNode(equals); - tool.replaceWithValue(equals); + ResolvedJavaType type = stateX.getVirtualObject().type(); + if (type.equals(stateY.getVirtualObject().type())) { + MetaAccessProvider metaAccess = tool.getMetaAccessProvider(); + if (type.equals(metaAccess.lookupJavaType(Integer.class)) || type.equals(metaAccess.lookupJavaType(Long.class))) { + // both are virtual without identity: check contents + assert stateX.getVirtualObject().entryCount() == 1 && stateY.getVirtualObject().entryCount() == 1; + assert stateX.getVirtualObject().entryKind(0).getStackKind() == Kind.Int || stateX.getVirtualObject().entryKind(0) == Kind.Long; + IntegerEqualsNode equals = IntegerEqualsNode.create(stateX.getEntry(0), stateY.getEntry(0)); + tool.addNode(equals); + tool.replaceWithValue(equals); + } + } } else { // both are virtual with identity: check if they refer to the same object tool.replaceWithValue(LogicConstantNode.forBoolean(stateX == stateY, graph()));