Mercurial > hg > graal-compiler
changeset 21381:d339bcb65015
Single-implementer optimization is an optimistic optimization, even though it does not register an assumption
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Thu, 14 May 2015 16:06:42 -0700 |
parents | af9d0db304e8 |
children | e4a2ebb47271 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java |
diffstat | 1 files changed, 11 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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);