Mercurial > hg > truffle
changeset 15953:a750e0d83535
cache last receiver stamp in MethodCallTargetNode
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Wed, 28 May 2014 17:14:24 +0200 |
parents | b7748fffea09 |
children | cda2a7d1dcff |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java |
diffstat | 1 files changed, 10 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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;