# HG changeset patch # User Lukas Stadler # Date 1401290064 -7200 # Node ID a750e0d83535576518ab90f29e9f392c4f7c3122 # Parent b7748fffea09f58363e2df1d25058ab03a983d58 cache last receiver stamp in MethodCallTargetNode diff -r b7748fffea09 -r a750e0d83535 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 Wed May 28 17:14:24 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java Wed May 28 17:14:24 2014 +0200 @@ -42,6 +42,8 @@ private ResolvedJavaMethod targetMethod; private InvokeKind invokeKind; + private transient Stamp lastCanonicalizedReceiverStamp; + /** * @param arguments */ @@ -138,12 +140,17 @@ } // check if the type of the receiver can narrow the result - ValueNode receiver = receiver(); - ResolvedJavaType type = StampTool.typeOrNull(receiver); + Stamp receiverStamp = receiver().stamp(); + if (receiverStamp.equals(lastCanonicalizedReceiverStamp)) { + return this; + } + lastCanonicalizedReceiverStamp = receiverStamp; + + ResolvedJavaType type = StampTool.typeOrNull(receiverStamp); if (type != null && (invoke().stateAfter() != null || invoke().stateDuring() != null)) { // either the holder class is exact, or the receiver object has an exact type ResolvedJavaMethod resolvedMethod = type.resolveMethod(targetMethod, invoke().getContextType()); - if (resolvedMethod != null && (resolvedMethod.canBeStaticallyBound() || StampTool.isExactType(receiver))) { + if (resolvedMethod != null && (resolvedMethod.canBeStaticallyBound() || StampTool.isExactType(receiverStamp))) { invokeKind = InvokeKind.Special; targetMethod = resolvedMethod; return this;