# HG changeset patch # User Christian Wimmer # Date 1431644802 25200 # Node ID d339bcb65015b2d1d1198960c521d5ca56527354 # Parent af9d0db304e897bef55f12a730607648796db4d8 Single-implementer optimization is an optimistic optimization, even though it does not register an assumption diff -r af9d0db304e8 -r d339bcb65015 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java Thu May 14 16:05:02 2015 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java Thu May 14 16:06:42 2015 -0700 @@ -175,7 +175,7 @@ * interface methods calls. */ if (declaredReceiverType.isInterface()) { - tryCheckCastSingleImplementor(receiver, declaredReceiverType); + tryCheckCastSingleImplementor(graph().getAssumptions(), receiver, declaredReceiverType); } if (receiver instanceof UncheckedInterfaceProvider) { @@ -184,14 +184,22 @@ if (uncheckedStamp != null) { ResolvedJavaType uncheckedReceiverType = StampTool.typeOrNull(uncheckedStamp); if (uncheckedReceiverType.isInterface()) { - tryCheckCastSingleImplementor(receiver, uncheckedReceiverType); + tryCheckCastSingleImplementor(graph().getAssumptions(), receiver, uncheckedReceiverType); } } } } } - private void tryCheckCastSingleImplementor(ValueNode receiver, ResolvedJavaType declaredReceiverType) { + private void tryCheckCastSingleImplementor(Assumptions assumptions, ValueNode receiver, ResolvedJavaType declaredReceiverType) { + if (assumptions == null) { + /* + * Even though we are not registering an assumption (see comment below), the + * optimization is only valid when speculative optimizations are enabled. + */ + return; + } + ResolvedJavaType singleImplementor = declaredReceiverType.getSingleImplementor(); if (singleImplementor != null && !singleImplementor.equals(declaredReceiverType)) { ResolvedJavaMethod singleImplementorMethod = singleImplementor.resolveMethod(targetMethod(), invoke().getContextType(), true);