# HG changeset patch # User Thomas Wuerthinger # Date 1373223691 -7200 # Node ID a71fa3b8553b0625498d2492b57b00770c62252c # Parent 90a7a58bf54fedd83b59377af1f25a7cec13c7ce Fix Truffle cache to handle macro nodes correctly. diff -r 90a7a58bf54f -r a71fa3b8553b 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 Sun Jul 07 21:01:05 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java Sun Jul 07 21:01:31 2013 +0200 @@ -216,25 +216,25 @@ if (invoke.callTarget() instanceof MethodCallTargetNode) { final MethodCallTargetNode methodCallTargetNode = (MethodCallTargetNode) invoke.callTarget(); if ((methodCallTargetNode.invokeKind() == InvokeKind.Special || methodCallTargetNode.invokeKind() == InvokeKind.Static) && - !Modifier.isNative(methodCallTargetNode.targetMethod().getModifiers())) { - if (methodCallTargetNode.targetMethod().getAnnotation(ExplodeLoop.class) != null) { - // Do not inline explode loop methods, they need canonicalization and forced - // unrolling. - return invoke.asNode(); - } - StructuredGraph inlinedGraph = Debug.scope("ExpandInvoke", methodCallTargetNode.targetMethod(), new Callable() { + !Modifier.isNative(methodCallTargetNode.targetMethod().getModifiers()) && methodCallTargetNode.targetMethod().getAnnotation(ExplodeLoop.class) == null) { + Class macroSubstitution = replacements.getMacroSubstitution(methodCallTargetNode.targetMethod()); + if (macroSubstitution != null) { + return InliningUtil.inlineMacroNode(invoke, methodCallTargetNode.targetMethod(), methodCallTargetNode.graph(), macroSubstitution); + } else { + StructuredGraph inlinedGraph = Debug.scope("ExpandInvoke", methodCallTargetNode.targetMethod(), new Callable() { - public StructuredGraph call() { - StructuredGraph inlineGraph = replacements.getMethodSubstitution(methodCallTargetNode.targetMethod()); - if (inlineGraph == null) { - inlineGraph = parseGraph(methodCallTargetNode.targetMethod()); + public StructuredGraph call() { + StructuredGraph inlineGraph = replacements.getMethodSubstitution(methodCallTargetNode.targetMethod()); + if (inlineGraph == null) { + inlineGraph = parseGraph(methodCallTargetNode.targetMethod()); + } + return inlineGraph; } - return inlineGraph; - } - }); - FixedNode fixedNode = (FixedNode) invoke.predecessor(); - InliningUtil.inline(invoke, inlinedGraph, true); - return fixedNode; + }); + FixedNode fixedNode = (FixedNode) invoke.predecessor(); + InliningUtil.inline(invoke, inlinedGraph, true); + return fixedNode; + } } } return invoke.asNode();