Mercurial > hg > truffle
diff graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java @ 7510:225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Tue, 22 Jan 2013 11:29:40 +0100 |
parents | 42b6e0905881 |
children | 5e3d1a68664e 417bd4ca6e4a |
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Mon Jan 21 12:23:55 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Tue Jan 22 11:29:40 2013 +0100 @@ -200,16 +200,36 @@ return computeInliningLevel(invoke); } - protected static StructuredGraph getGraph(final ResolvedJavaMethod concrete, final InliningCallback callback) { + protected static void inline(Invoke invoke, ResolvedJavaMethod concrete, InliningCallback callback, Assumptions assumptions, boolean receiverNullCheck) { + Class< ? extends FixedWithNextNode> macroNodeClass = getMacroNodeClass(concrete); + if (macroNodeClass != null) { + StructuredGraph graph = (StructuredGraph) invoke.graph(); + assert invoke instanceof InvokeNode; + FixedWithNextNode macroNode; + try { + macroNode = macroNodeClass.getConstructor(InvokeNode.class).newInstance(invoke); + } catch (ReflectiveOperationException | IllegalArgumentException | SecurityException e) { + throw new GraalInternalError(e).addContext(invoke.node()).addContext("macroSubstitution", macroNodeClass); + } + CallTargetNode callTarget = invoke.callTarget(); + graph.replaceFixedWithFixed((InvokeNode) invoke, graph.add(macroNode)); + GraphUtil.killWithUnusedFloatingInputs(callTarget); + } else { + StructuredGraph calleeGraph = getIntrinsicGraph(concrete); + if (calleeGraph == null) { + calleeGraph = getGraph(concrete, callback); + } + assumptions.recordMethodContents(concrete); + InliningUtil.inline(invoke, calleeGraph, receiverNullCheck); + } + } + + private static StructuredGraph getGraph(final ResolvedJavaMethod concrete, final InliningCallback callback) { return Debug.scope("GetInliningGraph", concrete, new Callable<StructuredGraph>() { @Override public StructuredGraph call() throws Exception { - StructuredGraph result = getIntrinsicGraph(concrete); - if (result == null) { - assert !Modifier.isNative(concrete.getModifiers()); - result = callback.buildGraph(concrete); - } - return result; + assert !Modifier.isNative(concrete.getModifiers()); + return callback.buildGraph(concrete); } }); } @@ -229,9 +249,7 @@ @Override public void inline(StructuredGraph compilerGraph, GraalCodeCacheProvider runtime, InliningCallback callback, Assumptions assumptions) { - StructuredGraph graph = getGraph(concrete, callback); - assumptions.recordMethodContents(concrete); - InliningUtil.inline(invoke, graph, true); + inline(invoke, concrete, callback, assumptions, true); } @Override @@ -283,9 +301,7 @@ graph.addBeforeFixed(invoke.node(), guard); graph.addBeforeFixed(invoke.node(), anchor); - StructuredGraph calleeGraph = getGraph(concrete, callback); - assumptions.recordMethodContents(concrete); - InliningUtil.inline(invoke, calleeGraph, false); + inline(invoke, concrete, callback, assumptions, false); } @Override @@ -405,14 +421,7 @@ GraphUtil.killCFG(invokeWithExceptionNode.exceptionEdge()); } - // get all graphs and record assumptions assert invoke.node().isAlive(); - StructuredGraph[] calleeGraphs = new StructuredGraph[numberOfMethods]; - for (int i = 0; i < numberOfMethods; i++) { - ResolvedJavaMethod concrete = concretes.get(i); - calleeGraphs[i] = getGraph(concrete, callback); - assumptions.recordMethodContents(concrete); - } // replace the invoke with a switch on the type of the actual receiver Kind hubKind = invoke.methodCallTarget().targetMethod().getDeclaringClass().getEncoding(Representation.ObjectHub).getKind(); @@ -439,8 +448,8 @@ PiNode anchoredReceiver = createAnchoredReceiver(graph, node, commonType, receiver, exact); invokeForInlining.callTarget().replaceFirstInput(receiver, anchoredReceiver); - StructuredGraph calleeGraph = calleeGraphs[i]; - InliningUtil.inline(invokeForInlining, calleeGraph, false); + inline(invokeForInlining, concretes.get(i), callback, assumptions, false); + replacements.add(anchoredReceiver); } if (shouldFallbackToInvoke()) { @@ -512,9 +521,7 @@ calleeEntryNode.setNext(invoke.node()); ResolvedJavaMethod concrete = concretes.get(0); - StructuredGraph calleeGraph = getGraph(concrete, callback); - assumptions.recordMethodContents(concrete); - InliningUtil.inline(invoke, calleeGraph, false); + inline(invoke, concrete, callback, assumptions, false); } private FixedNode createDispatchOnType(StructuredGraph graph, LoadHubNode hub, BeginNode[] successors) { @@ -1043,8 +1050,7 @@ } public static boolean canIntrinsify(ResolvedJavaMethod target) { - StructuredGraph intrinsicGraph = getIntrinsicGraph(target); - return intrinsicGraph != null; + return getIntrinsicGraph(target) != null || getMacroNodeClass(target) != null; } public static StructuredGraph getIntrinsicGraph(ResolvedJavaMethod target) { @@ -1058,4 +1064,9 @@ return target.getCompiledCodeSize(); } } + + public static Class< ? extends FixedWithNextNode> getMacroNodeClass(ResolvedJavaMethod target) { + Object result = target.getCompilerStorage().get(Node.class); + return result == null ? null : ((Class< ? >) result).asSubclass(FixedWithNextNode.class); + } }