# HG changeset patch # User Doug Simon # Date 1435016632 -7200 # Node ID 555c6a8db46b34d38579de671b22faf9a31b7bc5 # Parent 62fa6ad33667514873c0df712697c4f3c9cf6e04 added support for forced recursive inlining when a MethodHandle intrinsic is replaced with a resolved target and the MemberName suffix is dropped from the replacement invocation diff -r 62fa6ad33667 -r 555c6a8db46b graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/GraphBuilderContext.java --- a/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/GraphBuilderContext.java Tue Jun 23 01:16:35 2015 +0200 +++ b/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/GraphBuilderContext.java Tue Jun 23 01:43:52 2015 +0200 @@ -120,8 +120,10 @@ * @param invokeKind the kind of the replacement invocation * @param targetMethod the target of the replacement invocation * @param args the arguments to the replacement invocation + * @param forceInlineEverything specifies if all invocations encountered in the scope of + * handling the replaced invoke are to be force inlined */ - void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args); + void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, boolean forceInlineEverything); /** * Intrinsifies an invocation of a given method by inlining the bytecodes of a given diff -r 62fa6ad33667 -r 555c6a8db46b graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java Tue Jun 23 01:16:35 2015 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java Tue Jun 23 01:43:52 2015 +0200 @@ -1244,8 +1244,16 @@ return currentInvokeReturnType; } - public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) { - appendInvoke(invokeKind, targetMethod, args); + private boolean forceInliningEverything; + + public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, boolean inlineEverything) { + boolean previous = forceInliningEverything; + forceInliningEverything = previous || inlineEverything; + try { + appendInvoke(invokeKind, targetMethod, args); + } finally { + forceInliningEverything = previous; + } } private void appendInvoke(InvokeKind initialInvokeKind, ResolvedJavaMethod initialTargetMethod, ValueNode[] args) { @@ -1418,10 +1426,15 @@ } private boolean tryInline(ValueNode[] args, ResolvedJavaMethod targetMethod, JavaType returnType) { - boolean canBeInlined = parsingIntrinsic() || targetMethod.canBeInlined(); + boolean canBeInlined = forceInliningEverything || parsingIntrinsic() || targetMethod.canBeInlined(); if (!canBeInlined) { return false; } + + if (forceInliningEverything) { + return inline(targetMethod, targetMethod, false, args); + } + for (InlineInvokePlugin plugin : graphBuilderConfig.getPlugins().getInlineInvokePlugins()) { InlineInfo inlineInfo = plugin.shouldInlineInvoke(this, targetMethod, args, returnType); if (inlineInfo != null) { diff -r 62fa6ad33667 -r 555c6a8db46b graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/IntrinsicGraphBuilder.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/IntrinsicGraphBuilder.java Tue Jun 23 01:16:35 2015 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/IntrinsicGraphBuilder.java Tue Jun 23 01:43:52 2015 +0200 @@ -133,7 +133,7 @@ returnValue = value; } - public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) { + public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, boolean forceInlineEverything) { throw JVMCIError.shouldNotReachHere(); } diff -r 62fa6ad33667 -r 555c6a8db46b graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MethodHandlePlugin.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MethodHandlePlugin.java Tue Jun 23 01:16:35 2015 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MethodHandlePlugin.java Tue Jun 23 01:43:52 2015 +0200 @@ -61,7 +61,12 @@ for (int i = 0; i < argumentsList.size(); ++i) { argumentsList.initialize(i, b.recursiveAppend(argumentsList.get(i))); } - b.handleReplacedInvoke(invoke.getInvokeKind(), callTarget.targetMethod(), argumentsList.toArray(new ValueNode[argumentsList.size()])); + + // If a MemberName suffix argument is dropped, the replaced call cannot + // deoptimized since the necessary frame state cannot be reconstructed. + // As such, it needs to recursively inline everything. + boolean inlineEverything = args.length != argumentsList.size(); + b.handleReplacedInvoke(invoke.getInvokeKind(), callTarget.targetMethod(), argumentsList.toArray(new ValueNode[argumentsList.size()]), inlineEverything); } return true; } diff -r 62fa6ad33667 -r 555c6a8db46b graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java Tue Jun 23 01:16:35 2015 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java Tue Jun 23 01:43:52 2015 +0200 @@ -176,7 +176,7 @@ } @Override - public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) { + public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, boolean inlineEverything) { throw unimplemented(); }