# HG changeset patch # User Tom Rodriguez # Date 1403571855 25200 # Node ID 5785eca138b08f340d4476a8b144751b4d4816fd # Parent 3ee8c2cb629c374f080c4f3953f7673da202bac5 improve tracking of nodes to canonicalize after inlining diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MonitorSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MonitorSnippets.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MonitorSnippets.java Mon Jun 23 18:04:15 2014 -0700 @@ -501,7 +501,7 @@ graph.addAfterFixed(graph.start(), invoke); StructuredGraph inlineeGraph = providers.getReplacements().getSnippet(initCounter.getMethod()); - InliningUtil.inline(invoke, inlineeGraph, false); + InliningUtil.inline(invoke, inlineeGraph, false, null); List rets = graph.getNodes(ReturnNode.class).snapshot(); for (ReturnNode ret : rets) { @@ -520,7 +520,7 @@ inlineeGraph = template(args).copySpecializedGraph(); // inlineeGraph = replacements.getSnippet(checkCounter.getMethod()); - InliningUtil.inline(invoke, inlineeGraph, false); + InliningUtil.inline(invoke, inlineeGraph, false, null); } } } diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java Mon Jun 23 18:04:15 2014 -0700 @@ -223,8 +223,10 @@ * @param inlineGraph the graph that the invoke will be replaced with * @param receiverNullCheck true if a null check needs to be generated for non-static inlinings, * false if no such check is required + * @param canonicalizedNodes if non-null then append to this list any nodes which should be + * canonicalized after inlining */ - public static Map inline(Invoke invoke, StructuredGraph inlineGraph, boolean receiverNullCheck) { + public static Map inline(Invoke invoke, StructuredGraph inlineGraph, boolean receiverNullCheck, List canonicalizedNodes) { final NodeInputList parameters = invoke.callTarget().arguments(); FixedNode invokeNode = invoke.asNode(); StructuredGraph graph = invokeNode.graph(); @@ -339,7 +341,7 @@ } MergeNode merge = graph.add(new MergeNode()); merge.setStateAfter(stateAfter); - ValueNode returnValue = mergeReturns(merge, returnDuplicates); + ValueNode returnValue = mergeReturns(merge, returnDuplicates, canonicalizedNodes); invokeNode.replaceAtUsages(returnValue); merge.setNext(n); } @@ -438,7 +440,7 @@ } } - public static ValueNode mergeReturns(MergeNode merge, List returnNodes) { + public static ValueNode mergeReturns(MergeNode merge, List returnNodes, List canonicalizedNodes) { PhiNode returnValuePhi = null; for (ReturnNode returnNode : returnNodes) { @@ -449,6 +451,9 @@ if (returnNode.result() != null) { if (returnValuePhi == null) { returnValuePhi = merge.graph().addWithoutUnique(new ValuePhiNode(returnNode.result().stamp().unrestricted(), merge)); + if (canonicalizedNodes != null) { + canonicalizedNodes.add(returnValuePhi); + } } returnValuePhi.addInput(returnNode.result()); } diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/AbstractInlineInfo.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/AbstractInlineInfo.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/AbstractInlineInfo.java Mon Jun 23 18:04:15 2014 -0700 @@ -54,22 +54,22 @@ } protected static Collection inline(Invoke invoke, ResolvedJavaMethod concrete, Inlineable inlineable, Assumptions assumptions, boolean receiverNullCheck) { - Collection parameterUsages = new ArrayList<>(); + List canonicalizeNodes = new ArrayList<>(); if (inlineable instanceof InlineableGraph) { StructuredGraph calleeGraph = ((InlineableGraph) inlineable).getGraph(); - Map duplicateMap = InliningUtil.inline(invoke, calleeGraph, receiverNullCheck); - getInlinedParameterUsages(parameterUsages, calleeGraph, duplicateMap); + Map duplicateMap = InliningUtil.inline(invoke, calleeGraph, receiverNullCheck, canonicalizeNodes); + getInlinedParameterUsages(canonicalizeNodes, calleeGraph, duplicateMap); } else { assert inlineable instanceof InlineableMacroNode; Class macroNodeClass = ((InlineableMacroNode) inlineable).getMacroNodeClass(); FixedWithNextNode macroNode = InliningUtil.inlineMacroNode(invoke, concrete, macroNodeClass); - parameterUsages.add(macroNode); + canonicalizeNodes.add(macroNode); } InliningUtil.InlinedBytecodes.add(concrete.getCodeSize()); assumptions.recordMethodContents(concrete); - return parameterUsages; + return canonicalizeNodes; } public static void getInlinedParameterUsages(Collection parameterUsages, StructuredGraph calleeGraph, Map duplicateMap) { diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java Mon Jun 23 18:04:15 2014 -0700 @@ -272,13 +272,16 @@ } } - Collection parameterUsages = new ArrayList<>(); + Collection canonicalizeNodes = new ArrayList<>(); // do the actual inlining for every invoke for (int i = 0; i < numberOfMethods; i++) { Invoke invokeForInlining = (Invoke) successors[i].next(); - parameterUsages.addAll(inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false)); + canonicalizeNodes.addAll(inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false)); } - return parameterUsages; + if (returnValuePhi != null) { + canonicalizeNodes.add(returnValuePhi); + } + return canonicalizeNodes; } private int getTypeCount(int concreteMethodIndex) { diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/GraphKit.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/GraphKit.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/GraphKit.java Mon Jun 23 18:04:15 2014 -0700 @@ -208,7 +208,7 @@ ResolvedJavaMethod method = ((MethodCallTargetNode) invoke.callTarget()).targetMethod(); ReplacementsImpl repl = new ReplacementsImpl(providers, snippetReflection, new Assumptions(false), providers.getCodeCache().getTarget()); StructuredGraph calleeGraph = repl.makeGraph(method, null, method, null, FrameStateProcessing.CollapseFrameForSingleSideEffect); - InliningUtil.inline(invoke, calleeGraph, false); + InliningUtil.inline(invoke, calleeGraph, false, null); } protected void pushStructure(Structure structure) { diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Mon Jun 23 18:04:15 2014 -0700 @@ -589,7 +589,7 @@ if (isInlinable(substitutedMethod)) { final StructuredGraph originalGraph = buildInitialGraph(substitutedMethod); Mark mark = graph.getMark(); - InliningUtil.inline(callTarget.invoke(), originalGraph, true); + InliningUtil.inline(callTarget.invoke(), originalGraph, true, null); for (MethodCallTargetNode inlinedCallTarget : graph.getNewNodes(mark).filter(MethodCallTargetNode.class)) { if (doNotInline == null) { doNotInline = new HashSet<>(); @@ -623,7 +623,7 @@ targetGraph = parseGraph(callee, policy, inliningDepth + 1); } Object beforeInlineData = beforeInline(callTarget, targetGraph); - InliningUtil.inline(callTarget.invoke(), targetGraph, true); + InliningUtil.inline(callTarget.invoke(), targetGraph, true, null); Debug.dump(graph, "after inlining %s", callee); afterInline(graph, targetGraph, beforeInlineData); } diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Mon Jun 23 18:04:15 2014 -0700 @@ -704,7 +704,7 @@ this.memoryMap = memMaps.get(0); } else { MergeNode merge = snippet.add(new MergeNode()); - ValueNode returnValue = InliningUtil.mergeReturns(merge, returnNodes); + ValueNode returnValue = InliningUtil.mergeReturns(merge, returnNodes, null); this.returnNode = snippet.add(new ReturnNode(returnValue)); this.memoryMap = FloatingReadPhase.mergeMemoryMaps(merge, memMaps); merge.setNext(this.returnNode); diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Mon Jun 23 18:04:15 2014 -0700 @@ -142,7 +142,7 @@ ((Lowerable) nonNullReceiver).lower(tool); } } - InliningUtil.inline(invoke, replacementGraph, false); + InliningUtil.inline(invoke, replacementGraph, false, null); Debug.dump(graph(), "After inlining replacement %s", replacementGraph); } else { invoke.lower(tool); diff -r 3ee8c2cb629c -r 5785eca138b0 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 Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Mon Jun 23 18:04:15 2014 -0700 @@ -214,7 +214,7 @@ expansionLogger.preExpand(methodCallTargetNode, inlineGraph); } List canonicalizedNodes = methodCallTargetNode.invoke().asNode().usages().snapshot(); - Map inlined = InliningUtil.inline(methodCallTargetNode.invoke(), inlineGraph, false); + Map inlined = InliningUtil.inline(methodCallTargetNode.invoke(), inlineGraph, false, canonicalizedNodes); if (TraceTruffleExpansion.getValue()) { expansionLogger.postExpand(inlined); } diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java Mon Jun 23 18:04:15 2014 -0700 @@ -244,7 +244,7 @@ ", must annotate such calls with @CompilerDirectives.SlowPath!")); } Invoke invoke = methodCallTargetNode.invoke(); - InliningUtil.inline(invoke, inlineGraph, true); + InliningUtil.inline(invoke, inlineGraph, true, null); } private boolean tryCutOffRuntimeExceptions(MethodCallTargetNode methodCallTargetNode) { diff -r 3ee8c2cb629c -r 5785eca138b0 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/ReplaceIntrinsicsPhase.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/ReplaceIntrinsicsPhase.java Mon Jun 23 18:02:56 2014 -0700 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/ReplaceIntrinsicsPhase.java Mon Jun 23 18:04:15 2014 -0700 @@ -54,7 +54,7 @@ } else { StructuredGraph inlineGraph = replacements.getMethodSubstitution(methodCallTarget.targetMethod()); if (inlineGraph != null) { - InliningUtil.inline(methodCallTarget.invoke(), inlineGraph, true); + InliningUtil.inline(methodCallTarget.invoke(), inlineGraph, true, null); Debug.dump(graph, "After inlining %s", methodCallTarget.targetMethod().toString()); } }