# HG changeset patch # User Andreas Woess # Date 1380157478 -7200 # Node ID 63ee8dea4b80d8d7ce7df2fb7d9b25a0c9c84ff3 # Parent a28f24553ffaba4fd55f9659be8bb3aedcf05404 TruffleCache: do not cut off ControlFlowException constructors. diff -r a28f24553ffa -r 63ee8dea4b80 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Wed Sep 25 17:40:58 2013 -0700 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Thu Sep 26 03:04:38 2013 +0200 @@ -223,11 +223,11 @@ int nodeCountBefore = graph.getNodeCount(); int mark = graph.getMark(); InliningUtil.inline(methodCallTargetNode.invoke(), inlineGraph, false); - canonicalizer.applyIncremental(graph, context, mark); if (Debug.isDumpEnabled()) { int nodeCountAfter = graph.getNodeCount(); Debug.dump(graph, "After inlining %s %+d (%d)", methodCallTargetNode.targetMethod().toString(), nodeCountAfter - nodeCountBefore, nodeCountAfter); } + canonicalizer.applyIncremental(graph, context, mark); changed = true; } } diff -r a28f24553ffa -r 63ee8dea4b80 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java Wed Sep 25 17:40:58 2013 -0700 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java Thu Sep 26 03:04:38 2013 +0200 @@ -38,6 +38,7 @@ import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; import com.oracle.graal.nodes.util.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.common.*; @@ -200,7 +201,9 @@ private boolean tryCutOffRuntimeExceptions(MethodCallTargetNode methodCallTargetNode) { if (methodCallTargetNode.targetMethod().isConstructor()) { ResolvedJavaType runtimeException = metaAccessProvider.lookupJavaType(RuntimeException.class); - if (runtimeException.isAssignableFrom(methodCallTargetNode.targetMethod().getDeclaringClass())) { + ResolvedJavaType controlFlowException = metaAccessProvider.lookupJavaType(ControlFlowException.class); + ResolvedJavaType exceptionType = Objects.requireNonNull(ObjectStamp.typeOrNull(methodCallTargetNode.receiver().stamp())); + if (runtimeException.isAssignableFrom(methodCallTargetNode.targetMethod().getDeclaringClass()) && !controlFlowException.isAssignableFrom(exceptionType)) { DeoptimizeNode deoptNode = methodCallTargetNode.graph().add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.UnreachedCode)); FixedNode invokeNode = methodCallTargetNode.invoke().asNode(); invokeNode.replaceAtPredecessor(deoptNode);