# HG changeset patch # User Doug Simon # Date 1424093573 -3600 # Node ID 7d924ac67522659e6a2694d13e568e4c7e19a8a6 # Parent e4d40c71954b3764e4bf1a760c6b11ff1fabe4a7 moved use of Replacements in GraphBuilderPhase.Instance into InlineInvokePlugins diff -r e4d40c71954b -r 7d924ac67522 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Feb 16 14:22:15 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Feb 16 14:32:53 2015 +0100 @@ -27,6 +27,7 @@ import static com.oracle.graal.bytecode.Bytecodes.*; import static com.oracle.graal.compiler.common.GraalOptions.*; import static com.oracle.graal.nodes.StructuredGraph.*; +import static java.lang.String.*; import java.util.*; @@ -73,7 +74,7 @@ @Override protected void run(StructuredGraph graph, HighTierContext context) { - new Instance(context.getMetaAccess(), context.getStampProvider(), null, null, context.getConstantReflection(), graphBuilderConfig, context.getOptimisticOptimizations()).run(graph); + new Instance(context.getMetaAccess(), context.getStampProvider(), null, context.getConstantReflection(), graphBuilderConfig, context.getOptimisticOptimizations()).run(graph); } public GraphBuilderConfiguration getGraphBuilderConfig() { @@ -94,8 +95,6 @@ private final ConstantReflectionProvider constantReflection; private final SnippetReflectionProvider snippetReflectionProvider; - private final Replacements replacements; - /** * Gets the graph being processed by this builder. */ @@ -103,21 +102,20 @@ return currentGraph; } - public Instance(MetaAccessProvider metaAccess, StampProvider stampProvider, SnippetReflectionProvider snippetReflectionProvider, Replacements replacements, - ConstantReflectionProvider constantReflection, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts) { + public Instance(MetaAccessProvider metaAccess, StampProvider stampProvider, SnippetReflectionProvider snippetReflectionProvider, ConstantReflectionProvider constantReflection, + GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts) { this.graphBuilderConfig = graphBuilderConfig; this.optimisticOpts = optimisticOpts; this.metaAccess = metaAccess; this.stampProvider = stampProvider; this.constantReflection = constantReflection; this.snippetReflectionProvider = snippetReflectionProvider; - this.replacements = replacements; assert metaAccess != null; } public Instance(MetaAccessProvider metaAccess, StampProvider stampProvider, ConstantReflectionProvider constantReflection, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts) { - this(metaAccess, stampProvider, null, null, constantReflection, graphBuilderConfig, optimisticOpts); + this(metaAccess, stampProvider, null, constantReflection, graphBuilderConfig, optimisticOpts); } @Override @@ -871,28 +869,8 @@ return; } - InlineInvokePlugin inlineInvokePlugin = graphBuilderConfig.getInlineInvokePlugin(); - if (inlineInvokePlugin != null && invokeKind.isDirect() && targetMethod.canBeInlined() && targetMethod.hasBytecodes() && - (replacements == null || (replacements.getMethodSubstitution(targetMethod) == null && replacements.getMacroSubstitution(targetMethod) == null))) { - - ResolvedJavaMethod inlinedMethod = inlineInvokePlugin.getInlinedMethod(this, targetMethod, args, returnType, currentDepth); - if (inlinedMethod != null) { - if (GraalOptions.TraceInlineDuringParsing.getValue()) { - int bci = this.bci(); - for (int i = 0; i < this.currentDepth; ++i) { - TTY.print(' '); - } - StackTraceElement stackTraceElement = this.method.asStackTraceElement(bci); - String s = String.format("%s (%s:%d)", method.getName(), stackTraceElement.getFileName(), stackTraceElement.getLineNumber()); - TTY.print(s); - TTY.println(" inlining call " + targetMethod.getName()); - } - - ResolvedJavaMethod inlinedTargetMethod = inlinedMethod; - parseAndInlineCallee(inlinedTargetMethod, args, parsingReplacement || inlinedMethod != targetMethod); - inlineInvokePlugin.postInline(inlinedTargetMethod); - return; - } + if (tryInline(args, targetMethod, invokeKind, returnType)) { + return; } MethodCallTargetNode callTarget = currentGraph.add(createMethodCallTarget(invokeKind, targetMethod, args, returnType)); @@ -939,6 +917,31 @@ return false; } + private boolean tryInline(ValueNode[] args, ResolvedJavaMethod targetMethod, InvokeKind invokeKind, JavaType returnType) { + InlineInvokePlugin plugin = graphBuilderConfig.getInlineInvokePlugin(); + if (plugin == null || !invokeKind.isDirect() || !targetMethod.canBeInlined()) { + return false; + } + ResolvedJavaMethod inlinedMethod = plugin.getInlinedMethod(this, targetMethod, args, returnType, currentDepth); + if (inlinedMethod != null) { + if (inlinedMethod != null) { + assert inlinedMethod.hasBytecodes(); + if (GraalOptions.TraceInlineDuringParsing.getValue()) { + int bci = this.bci(); + StackTraceElement ste = this.method.asStackTraceElement(bci); + TTY.println(format("%s%s (%s:%d) inlining call to %s", nSpaces(currentDepth), method.getName(), ste.getFileName(), ste.getLineNumber(), inlinedMethod.format("%h.%n(%p)"))); + } + parseAndInlineCallee(inlinedMethod, args, parsingReplacement || inlinedMethod != targetMethod); + plugin.postInline(inlinedMethod); + } + return true; + } else { + System.out.println("Could not inline invoke " + targetMethod.format("%H.%n(%p)")); + } + + return false; + } + private void parseAndInlineCallee(ResolvedJavaMethod targetMethod, ValueNode[] args, boolean isReplacement) { BytecodeParser parser = new BytecodeParser(metaAccess, targetMethod, graphBuilderConfig, optimisticOpts, INVOCATION_ENTRY_BCI, isReplacement); final FrameState[] lazyFrameState = new FrameState[1]; @@ -1833,4 +1836,8 @@ } } } + + static String nSpaces(int n) { + return n == 0 ? "" : format("%" + n + "s", ""); + } } diff -r e4d40c71954b -r 7d924ac67522 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 Feb 16 14:22:15 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Mon Feb 16 14:32:53 2015 +0100 @@ -187,16 +187,21 @@ private Stack inlining; private OptimizedDirectCallNode lastDirectCallNode; + private final Replacements replacements; - public InlineInvokePlugin(TruffleInlining inlining) { + public InlineInvokePlugin(TruffleInlining inlining, Replacements replacements) { this.inlining = new Stack<>(); this.inlining.push(inlining); + this.replacements = replacements; } public ResolvedJavaMethod getInlinedMethod(GraphBuilderContext builder, ResolvedJavaMethod original, ValueNode[] arguments, JavaType returnType, int depth) { if (original.getAnnotation(TruffleBoundary.class) != null) { return null; } + if (replacements != null && (replacements.getMethodSubstitutionMethod(original) != null || replacements.getMacroSubstitution(original) != null)) { + return null; + } if (original.equals(callSiteProxyMethod)) { ValueNode arg1 = arguments[0]; if (!arg1.isConstant()) { @@ -242,12 +247,11 @@ newConfig.setLoadFieldPlugin(new InterceptLoadFieldPlugin()); newConfig.setParameterPlugin(new InterceptReceiverPlugin(callTarget)); callTarget.setInlining(new TruffleInlining(callTarget, new DefaultInliningPolicy())); - newConfig.setInlineInvokePlugin(new InlineInvokePlugin(callTarget.getInlining())); + newConfig.setInlineInvokePlugin(new InlineInvokePlugin(callTarget.getInlining(), providers.getReplacements())); newConfig.setLoopExplosionPlugin(new LoopExplosionPlugin()); TruffleGraphBuilderPlugins.registerInvocationPlugins(providers.getMetaAccess(), newConfig.getInvocationPlugins()); long ms = System.currentTimeMillis(); - new GraphBuilderPhase.Instance(providers.getMetaAccess(), providers.getStampProvider(), this.snippetReflection, providers.getReplacements(), providers.getConstantReflection(), newConfig, - TruffleCompilerImpl.Optimizations).apply(graph); + new GraphBuilderPhase.Instance(providers.getMetaAccess(), providers.getStampProvider(), this.snippetReflection, providers.getConstantReflection(), newConfig, TruffleCompilerImpl.Optimizations).apply(graph); System.out.println("# ms: " + (System.currentTimeMillis() - ms)); Debug.dump(graph, "After FastPE");