Mercurial > hg > graal-compiler
annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java @ 22604:b00cc0475f31
Update jvmci import: Refactoring: Rename Kind to JavaKind.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Tue, 08 Sep 2015 19:57:39 +0200 |
parents | d003c4c1782b |
children | 96e21d85bea9 |
rev | line source |
---|---|
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
1 /* |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
2 * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
4 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
8 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
14 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
18 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
21 * questions. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
22 */ |
21075
d094ea7e0433
Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21001
diff
changeset
|
23 package com.oracle.graal.replacements; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
24 |
21609
2221d959de64
Make BytecodeParser a top-level class to avoid excessive indentation of two class nesting levels
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21608
diff
changeset
|
25 import static com.oracle.graal.java.BytecodeParser.Options.*; |
22054 | 26 import static jdk.internal.jvmci.common.JVMCIError.*; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
27 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
28 import java.util.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
29 |
22054 | 30 import jdk.internal.jvmci.code.*; |
22418
d003c4c1782b
do not use the (possibly uninitialized) InvokeNode.stateAfter to fill BytecodePosition in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
22400
diff
changeset
|
31 |
22300
7b4a47fcc4c0
Move most of jdk.internal.jvmci.debug back into com.oracle.graal.debug
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
22129
diff
changeset
|
32 import com.oracle.graal.debug.*; |
22418
d003c4c1782b
do not use the (possibly uninitialized) InvokeNode.stateAfter to fill BytecodePosition in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
22400
diff
changeset
|
33 |
22054 | 34 import jdk.internal.jvmci.meta.*; |
35 import jdk.internal.jvmci.options.*; | |
36 | |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
37 import com.oracle.graal.compiler.common.type.*; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
38 import com.oracle.graal.graph.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
39 import com.oracle.graal.graph.spi.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
40 import com.oracle.graal.graphbuilderconf.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
41 import com.oracle.graal.graphbuilderconf.InlineInvokePlugin.InlineInfo; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
42 import com.oracle.graal.graphbuilderconf.InvocationPlugins.InvocationPluginReceiver; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
43 import com.oracle.graal.java.*; |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
44 import com.oracle.graal.nodeinfo.*; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
45 import com.oracle.graal.nodes.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
46 import com.oracle.graal.nodes.CallTargetNode.InvokeKind; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
47 import com.oracle.graal.nodes.extended.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
48 import com.oracle.graal.nodes.java.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
49 import com.oracle.graal.nodes.spi.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
50 import com.oracle.graal.phases.common.inlining.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
51 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
52 /** |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
53 * A graph decoder that performs partial evaluation, i.e., that performs method inlining and |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
54 * canonicalization/simplification of nodes during decoding. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
55 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
56 * Inlining and loop explosion are configured via the plugin mechanism also used by the |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
57 * {@link GraphBuilderPhase}. However, not all callback methods defined in |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
58 * {@link GraphBuilderContext} are available since decoding is more limited than graph building. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
59 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
60 * The standard {@link Canonicalizable#canonical node canonicalization} interface is used to |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
61 * canonicalize nodes during decoding. Additionally, {@link IfNode branches} and |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
62 * {@link IntegerSwitchNode switches} with constant conditions are simplified. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
63 */ |
21075
d094ea7e0433
Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21001
diff
changeset
|
64 public abstract class PEGraphDecoder extends SimplifyingGraphDecoder { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
65 |
21930
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
66 public static class Options { |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
67 @Option(help = "Maximum inlining depth during partial evaluation before reporting an infinite recursion")// |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
68 public static final OptionValue<Integer> InliningDepthError = new OptionValue<>(200); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
69 } |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
70 |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
71 protected class PEMethodScope extends MethodScope { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
72 /** The state of the caller method. Only non-null during method inlining. */ |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
73 protected final PEMethodScope caller; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
74 protected final LoopScope callerLoopScope; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
75 protected final ResolvedJavaMethod method; |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
76 protected final InvokeData invokeData; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
77 protected final int inliningDepth; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
78 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
79 protected final LoopExplosionPlugin loopExplosionPlugin; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
80 protected final InvocationPlugins invocationPlugins; |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
81 protected final InlineInvokePlugin[] inlineInvokePlugins; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
82 protected final ParameterPlugin parameterPlugin; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
83 protected final ValueNode[] arguments; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
84 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
85 protected FrameState outerState; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
86 protected FrameState exceptionState; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
87 protected ExceptionPlaceholderNode exceptionPlaceholderNode; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
88 protected BytecodePosition bytecodePosition; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
89 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
90 protected PEMethodScope(StructuredGraph targetGraph, PEMethodScope caller, LoopScope callerLoopScope, EncodedGraph encodedGraph, ResolvedJavaMethod method, InvokeData invokeData, |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
91 int inliningDepth, LoopExplosionPlugin loopExplosionPlugin, InvocationPlugins invocationPlugins, InlineInvokePlugin[] inlineInvokePlugins, ParameterPlugin parameterPlugin, |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
92 ValueNode[] arguments) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
93 super(targetGraph, encodedGraph, loopExplosionKind(method, loopExplosionPlugin)); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
94 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
95 this.caller = caller; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
96 this.callerLoopScope = callerLoopScope; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
97 this.method = method; |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
98 this.invokeData = invokeData; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
99 this.inliningDepth = inliningDepth; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
100 this.loopExplosionPlugin = loopExplosionPlugin; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
101 this.invocationPlugins = invocationPlugins; |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
102 this.inlineInvokePlugins = inlineInvokePlugins; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
103 this.parameterPlugin = parameterPlugin; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
104 this.arguments = arguments; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
105 } |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
106 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
107 public boolean isInlinedMethod() { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
108 return caller != null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
109 } |
21295
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
110 |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
111 public BytecodePosition getBytecodePosition() { |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
112 if (bytecodePosition == null) { |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
113 ensureOuterStateDecoded(this); |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
114 ensureExceptionStateDecoded(this); |
22418
d003c4c1782b
do not use the (possibly uninitialized) InvokeNode.stateAfter to fill BytecodePosition in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
22400
diff
changeset
|
115 bytecodePosition = new BytecodePosition(FrameState.toBytecodePosition(outerState), method, invokeData.invoke.bci()); |
21295
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
116 } |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
117 return bytecodePosition; |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
118 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
119 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
120 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
121 protected class PENonAppendGraphBuilderContext implements GraphBuilderContext { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
122 protected final PEMethodScope methodScope; |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
123 protected final Invoke invoke; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
124 |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
125 public PENonAppendGraphBuilderContext(PEMethodScope methodScope, Invoke invoke) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
126 this.methodScope = methodScope; |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
127 this.invoke = invoke; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
128 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
129 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
130 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
131 public BailoutException bailout(String string) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
132 throw new BailoutException(string); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
133 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
134 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
135 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
136 public StampProvider getStampProvider() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
137 return stampProvider; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
138 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
139 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
140 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
141 public MetaAccessProvider getMetaAccess() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
142 return metaAccess; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
143 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
144 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
145 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
146 public ConstantReflectionProvider getConstantReflection() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
147 return constantReflection; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
148 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
149 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
150 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
151 public StructuredGraph getGraph() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
152 return methodScope.graph; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
153 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
154 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
155 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
156 public int getDepth() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
157 return methodScope.inliningDepth; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
158 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
159 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
160 @Override |
21343
ce95a5e36927
removed unnecessary Intrinsic interface
Doug Simon <doug.simon@oracle.com>
parents:
21311
diff
changeset
|
161 public IntrinsicContext getIntrinsic() { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
162 return null; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
163 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
164 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
165 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
166 public <T extends ValueNode> T append(T value) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
167 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
168 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
169 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
170 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
171 public <T extends ValueNode> T recursiveAppend(T value) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
172 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
173 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
174 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
175 @Override |
22604
b00cc0475f31
Update jvmci import: Refactoring: Rename Kind to JavaKind.
Roland Schatz <roland.schatz@oracle.com>
parents:
22418
diff
changeset
|
176 public void push(JavaKind kind, ValueNode value) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
177 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
178 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
179 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
180 @Override |
22058
555c6a8db46b
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
Doug Simon <doug.simon@oracle.com>
parents:
22054
diff
changeset
|
181 public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, boolean inlineEverything) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
182 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
183 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
184 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
185 @Override |
20863 | 186 public void intrinsify(ResolvedJavaMethod targetMethod, ResolvedJavaMethod substitute, ValueNode[] args) { |
187 throw unimplemented(); | |
188 } | |
189 | |
190 @Override | |
21280
b97ec8aec2c7
changed GraphBuilderContext.createStateAfter() to .setStateAfter(StateSplit)
Doug Simon <doug.simon@oracle.com>
parents:
21258
diff
changeset
|
191 public void setStateAfter(StateSplit stateSplit) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
192 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
193 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
194 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
195 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
196 public GraphBuilderContext getParent() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
197 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
198 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
199 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
200 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
201 public ResolvedJavaMethod getMethod() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
202 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
203 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
204 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
205 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
206 public int bci() { |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
207 return invoke.bci(); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
208 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
209 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
210 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
211 public InvokeKind getInvokeKind() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
212 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
213 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
214 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
215 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
216 public JavaType getInvokeReturnType() { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
217 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
218 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
219 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
220 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
221 protected class PEAppendGraphBuilderContext extends PENonAppendGraphBuilderContext { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
222 protected FixedWithNextNode lastInstr; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
223 protected ValueNode pushedNode; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
224 |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
225 public PEAppendGraphBuilderContext(PEMethodScope inlineScope, FixedWithNextNode lastInstr) { |
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
226 super(inlineScope, inlineScope.invokeData.invoke); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
227 this.lastInstr = lastInstr; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
228 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
229 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
230 @Override |
22604
b00cc0475f31
Update jvmci import: Refactoring: Rename Kind to JavaKind.
Roland Schatz <roland.schatz@oracle.com>
parents:
22418
diff
changeset
|
231 public void push(JavaKind kind, ValueNode value) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
232 if (pushedNode != null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
233 throw unimplemented("Only one push is supported"); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
234 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
235 pushedNode = value; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
236 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
237 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
238 @Override |
21280
b97ec8aec2c7
changed GraphBuilderContext.createStateAfter() to .setStateAfter(StateSplit)
Doug Simon <doug.simon@oracle.com>
parents:
21258
diff
changeset
|
239 public void setStateAfter(StateSplit stateSplit) { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
240 Node stateAfter = decodeFloatingNode(methodScope.caller, methodScope.callerLoopScope, methodScope.invokeData.stateAfterOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
241 getGraph().add(stateAfter); |
21280
b97ec8aec2c7
changed GraphBuilderContext.createStateAfter() to .setStateAfter(StateSplit)
Doug Simon <doug.simon@oracle.com>
parents:
21258
diff
changeset
|
242 FrameState fs = (FrameState) handleFloatingNodeAfterAdd(methodScope.caller, methodScope.callerLoopScope, stateAfter); |
b97ec8aec2c7
changed GraphBuilderContext.createStateAfter() to .setStateAfter(StateSplit)
Doug Simon <doug.simon@oracle.com>
parents:
21258
diff
changeset
|
243 stateSplit.setStateAfter(fs); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
244 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
245 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
246 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
247 public <T extends ValueNode> T append(T v) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
248 if (v.graph() != null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
249 return v; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
250 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
251 T added = getGraph().addOrUnique(v); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
252 if (added == v) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
253 updateLastInstruction(v); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
254 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
255 return added; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
256 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
257 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
258 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
259 public <T extends ValueNode> T recursiveAppend(T v) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
260 if (v.graph() != null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
261 return v; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
262 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
263 T added = getGraph().addOrUniqueWithInputs(v); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
264 if (added == v) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
265 updateLastInstruction(v); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
266 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
267 return added; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
268 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
269 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
270 private <T extends ValueNode> void updateLastInstruction(T v) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
271 if (v instanceof FixedNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
272 FixedNode fixedNode = (FixedNode) v; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
273 lastInstr.setNext(fixedNode); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
274 if (fixedNode instanceof FixedWithNextNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
275 FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) fixedNode; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
276 assert fixedWithNextNode.next() == null : "cannot append instruction to instruction which isn't end"; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
277 lastInstr = fixedWithNextNode; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
278 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
279 lastInstr = null; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
280 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
281 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
282 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
283 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
284 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
285 @NodeInfo |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
286 static class ExceptionPlaceholderNode extends ValueNode { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
287 public static final NodeClass<ExceptionPlaceholderNode> TYPE = NodeClass.create(ExceptionPlaceholderNode.class); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
288 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
289 public ExceptionPlaceholderNode() { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
290 super(TYPE, StampFactory.object()); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
291 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
292 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
293 |
21001
acc86d08e1cc
Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20985
diff
changeset
|
294 public PEGraphDecoder(MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection, StampProvider stampProvider, Architecture architecture) { |
21075
d094ea7e0433
Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21001
diff
changeset
|
295 super(metaAccess, constantReflection, stampProvider, true, architecture); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
296 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
297 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
298 protected static LoopExplosionKind loopExplosionKind(ResolvedJavaMethod method, LoopExplosionPlugin loopExplosionPlugin) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
299 if (loopExplosionPlugin == null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
300 return LoopExplosionKind.NONE; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
301 } else if (loopExplosionPlugin.shouldMergeExplosions(method)) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
302 return LoopExplosionKind.MERGE_EXPLODE; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
303 } else if (loopExplosionPlugin.shouldExplodeLoops(method)) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
304 return LoopExplosionKind.FULL_EXPLODE; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
305 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
306 return LoopExplosionKind.NONE; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
307 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
308 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
309 |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
310 public void decode(StructuredGraph targetGraph, ResolvedJavaMethod method, LoopExplosionPlugin loopExplosionPlugin, InvocationPlugins invocationPlugins, InlineInvokePlugin[] inlineInvokePlugins, |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
311 ParameterPlugin parameterPlugin) { |
22129
769e2e74e4f3
added support for inlining intrinsics to PEGraphDecoder (GRAAL-1170)
Doug Simon <doug.simon@oracle.com>
parents:
22105
diff
changeset
|
312 PEMethodScope methodScope = new PEMethodScope(targetGraph, null, null, lookupEncodedGraph(method, false), method, null, 0, loopExplosionPlugin, invocationPlugins, inlineInvokePlugins, |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
313 parameterPlugin, null); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
314 decode(methodScope, null); |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
315 cleanupGraph(methodScope, null); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
316 methodScope.graph.verify(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
317 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
318 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
319 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
320 protected void checkLoopExplosionIteration(MethodScope s, LoopScope loopScope) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
321 PEMethodScope methodScope = (PEMethodScope) s; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
322 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
323 if (loopScope.loopIteration > MaximumLoopExplosionCount.getValue()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
324 String message = "too many loop explosion iterations - does the explosion not terminate for method " + methodScope.method + "?"; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
325 if (FailedLoopExplosionIsFatal.getValue()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
326 throw new RuntimeException(message); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
327 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
328 throw new BailoutException(message); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
329 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
330 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
331 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
332 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
333 @Override |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
334 protected void handleInvoke(MethodScope s, LoopScope loopScope, InvokeData invokeData) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
335 PEMethodScope methodScope = (PEMethodScope) s; |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
336 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
337 /* |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
338 * Decode the call target, but do not add it to the graph yet. This avoids adding usages for |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
339 * all the arguments, which are expensive to remove again when we can inline the method. |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
340 */ |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
341 assert invokeData.invoke.callTarget() == null : "callTarget edge is ignored during decoding of Invoke"; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
342 CallTargetNode callTarget = (CallTargetNode) decodeFloatingNode(methodScope, loopScope, invokeData.callTargetOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
343 if (!(callTarget instanceof MethodCallTargetNode) || !trySimplifyInvoke(methodScope, loopScope, invokeData, (MethodCallTargetNode) callTarget)) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
344 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
345 /* We know that we need an invoke, so now we can add the call target to the graph. */ |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
346 methodScope.graph.add(callTarget); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
347 registerNode(loopScope, invokeData.callTargetOrderId, callTarget, false, false); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
348 super.handleInvoke(methodScope, loopScope, invokeData); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
349 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
350 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
351 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
352 protected boolean trySimplifyInvoke(PEMethodScope methodScope, LoopScope loopScope, InvokeData invokeData, MethodCallTargetNode callTarget) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
353 // attempt to devirtualize the call |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
354 ResolvedJavaMethod specialCallTarget = MethodCallTargetNode.findSpecialCallTarget(callTarget.invokeKind(), callTarget.receiver(), callTarget.targetMethod(), invokeData.contextType); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
355 if (specialCallTarget != null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
356 callTarget.setTargetMethod(specialCallTarget); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
357 callTarget.setInvokeKind(InvokeKind.Special); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
358 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
359 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
360 if (tryInvocationPlugin(methodScope, loopScope, invokeData, callTarget)) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
361 return true; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
362 } |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
363 if (tryInline(methodScope, loopScope, invokeData, callTarget)) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
364 return true; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
365 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
366 |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
367 for (InlineInvokePlugin plugin : methodScope.inlineInvokePlugins) { |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
368 plugin.notifyNotInlined(new PENonAppendGraphBuilderContext(methodScope, invokeData.invoke), callTarget.targetMethod(), invokeData.invoke); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
369 } |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
370 return false; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
371 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
372 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
373 protected boolean tryInvocationPlugin(PEMethodScope methodScope, LoopScope loopScope, InvokeData invokeData, MethodCallTargetNode callTarget) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
374 if (methodScope.invocationPlugins == null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
375 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
376 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
377 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
378 Invoke invoke = invokeData.invoke; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
379 |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
380 ResolvedJavaMethod targetMethod = callTarget.targetMethod(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
381 InvocationPlugin invocationPlugin = methodScope.invocationPlugins.lookupInvocation(targetMethod); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
382 if (invocationPlugin == null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
383 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
384 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
385 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
386 ValueNode[] arguments = callTarget.arguments().toArray(new ValueNode[0]); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
387 FixedWithNextNode invokePredecessor = (FixedWithNextNode) invoke.asNode().predecessor(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
388 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
389 /* Remove invoke from graph so that invocation plugin can append nodes to the predecessor. */ |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
390 invoke.asNode().replaceAtPredecessor(null); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
391 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
392 PEMethodScope inlineScope = new PEMethodScope(methodScope.graph, methodScope, loopScope, null, targetMethod, invokeData, methodScope.inliningDepth + 1, methodScope.loopExplosionPlugin, |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
393 methodScope.invocationPlugins, methodScope.inlineInvokePlugins, null, arguments); |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
394 PEAppendGraphBuilderContext graphBuilderContext = new PEAppendGraphBuilderContext(inlineScope, invokePredecessor); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
395 InvocationPluginReceiver invocationPluginReceiver = new InvocationPluginReceiver(graphBuilderContext); |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
396 |
20863 | 397 if (invocationPlugin.execute(graphBuilderContext, targetMethod, invocationPluginReceiver.init(targetMethod, arguments), arguments)) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
398 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
399 if (graphBuilderContext.lastInstr != null) { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
400 registerNode(loopScope, invokeData.invokeOrderId, graphBuilderContext.pushedNode, true, true); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
401 invoke.asNode().replaceAtUsages(graphBuilderContext.pushedNode); |
21502
553445b73d99
Bugfix for Graph Decoder: ensure that guard dependencies to block begins are correctly re-wired during decoding
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21430
diff
changeset
|
402 graphBuilderContext.lastInstr.setNext(nodeAfterInvoke(methodScope, loopScope, invokeData, AbstractBeginNode.prevBegin(graphBuilderContext.lastInstr))); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
403 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
404 assert graphBuilderContext.pushedNode == null : "Why push a node when the invoke does not return anyway?"; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
405 invoke.asNode().replaceAtUsages(null); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
406 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
407 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
408 deleteInvoke(invoke); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
409 return true; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
410 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
411 } else { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
412 /* Intrinsification failed, restore original state: invoke is in Graph. */ |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
413 invokePredecessor.setNext(invoke.asNode()); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
414 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
415 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
416 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
417 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
418 protected boolean tryInline(PEMethodScope methodScope, LoopScope loopScope, InvokeData invokeData, MethodCallTargetNode callTarget) { |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
419 if (!callTarget.invokeKind().isDirect()) { |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
420 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
421 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
422 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
423 ResolvedJavaMethod targetMethod = callTarget.targetMethod(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
424 if (!targetMethod.canBeInlined()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
425 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
426 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
427 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
428 ValueNode[] arguments = callTarget.arguments().toArray(new ValueNode[0]); |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
429 GraphBuilderContext graphBuilderContext = new PENonAppendGraphBuilderContext(methodScope, invokeData.invoke); |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
430 |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
431 for (InlineInvokePlugin plugin : methodScope.inlineInvokePlugins) { |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
432 InlineInfo inlineInfo = plugin.shouldInlineInvoke(graphBuilderContext, targetMethod, arguments, callTarget.returnType()); |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
433 if (inlineInfo != null) { |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
434 if (inlineInfo.getMethodToInline() == null) { |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
435 return false; |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
436 } else { |
22129
769e2e74e4f3
added support for inlining intrinsics to PEGraphDecoder (GRAAL-1170)
Doug Simon <doug.simon@oracle.com>
parents:
22105
diff
changeset
|
437 return doInline(methodScope, loopScope, invokeData, inlineInfo, arguments); |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
438 } |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
439 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
440 } |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
441 return false; |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
442 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
443 |
22129
769e2e74e4f3
added support for inlining intrinsics to PEGraphDecoder (GRAAL-1170)
Doug Simon <doug.simon@oracle.com>
parents:
22105
diff
changeset
|
444 protected boolean doInline(PEMethodScope methodScope, LoopScope loopScope, InvokeData invokeData, InlineInfo inlineInfo, ValueNode[] arguments) { |
769e2e74e4f3
added support for inlining intrinsics to PEGraphDecoder (GRAAL-1170)
Doug Simon <doug.simon@oracle.com>
parents:
22105
diff
changeset
|
445 ResolvedJavaMethod inlineMethod = inlineInfo.getMethodToInline(); |
769e2e74e4f3
added support for inlining intrinsics to PEGraphDecoder (GRAAL-1170)
Doug Simon <doug.simon@oracle.com>
parents:
22105
diff
changeset
|
446 EncodedGraph graphToInline = lookupEncodedGraph(inlineMethod, inlineInfo.isIntrinsic()); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
447 if (graphToInline == null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
448 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
449 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
450 |
21930
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
451 if (methodScope.inliningDepth > Options.InliningDepthError.getValue()) { |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
452 throw tooDeepInlining(methodScope); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
453 } |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
454 |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
455 for (InlineInvokePlugin plugin : methodScope.inlineInvokePlugins) { |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
456 plugin.notifyBeforeInline(inlineMethod); |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
457 } |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
458 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
459 Invoke invoke = invokeData.invoke; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
460 FixedNode invokeNode = invoke.asNode(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
461 FixedWithNextNode predecessor = (FixedWithNextNode) invokeNode.predecessor(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
462 invokeNode.replaceAtPredecessor(null); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
463 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
464 PEMethodScope inlineScope = new PEMethodScope(methodScope.graph, methodScope, loopScope, graphToInline, inlineMethod, invokeData, methodScope.inliningDepth + 1, |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
465 methodScope.loopExplosionPlugin, methodScope.invocationPlugins, methodScope.inlineInvokePlugins, null, arguments); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
466 /* Do the actual inlining by decoding the inlineMethod */ |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
467 decode(inlineScope, predecessor); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
468 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
469 ValueNode exceptionValue = null; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
470 if (inlineScope.unwindNode != null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
471 exceptionValue = inlineScope.unwindNode.exception(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
472 } |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
473 UnwindNode unwindNode = inlineScope.unwindNode; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
474 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
475 if (invoke instanceof InvokeWithExceptionNode) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
476 InvokeWithExceptionNode invokeWithException = ((InvokeWithExceptionNode) invoke); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
477 assert invokeWithException.next() == null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
478 assert invokeWithException.exceptionEdge() == null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
479 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
480 if (unwindNode != null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
481 assert unwindNode.predecessor() != null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
482 Node n = makeStubNode(methodScope, loopScope, invokeData.exceptionNextOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
483 unwindNode.replaceAndDelete(n); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
484 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
485 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
486 } else { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
487 if (unwindNode != null && !unwindNode.isDeleted()) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
488 DeoptimizeNode deoptimizeNode = methodScope.graph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.NotCompiledExceptionHandler)); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
489 unwindNode.replaceAndDelete(deoptimizeNode); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
490 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
491 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
492 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
493 assert invoke.next() == null; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
494 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
495 ValueNode returnValue; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
496 List<ReturnNode> returnNodes = inlineScope.returnNodes; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
497 if (!returnNodes.isEmpty()) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
498 if (returnNodes.size() == 1) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
499 ReturnNode returnNode = returnNodes.get(0); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
500 returnValue = returnNode.result(); |
21502
553445b73d99
Bugfix for Graph Decoder: ensure that guard dependencies to block begins are correctly re-wired during decoding
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21430
diff
changeset
|
501 FixedNode n = nodeAfterInvoke(methodScope, loopScope, invokeData, AbstractBeginNode.prevBegin(returnNode)); |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
502 returnNode.replaceAndDelete(n); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
503 } else { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
504 AbstractMergeNode merge = methodScope.graph.add(new MergeNode()); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
505 merge.setStateAfter((FrameState) ensureNodeCreated(methodScope, loopScope, invokeData.stateAfterOrderId)); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
506 returnValue = InliningUtil.mergeReturns(merge, returnNodes, null); |
21502
553445b73d99
Bugfix for Graph Decoder: ensure that guard dependencies to block begins are correctly re-wired during decoding
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21430
diff
changeset
|
507 FixedNode n = nodeAfterInvoke(methodScope, loopScope, invokeData, merge); |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
508 merge.setNext(n); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
509 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
510 } else { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
511 returnValue = null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
512 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
513 invokeNode.replaceAtUsages(returnValue); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
514 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
515 /* |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
516 * Usage the handles that we have on the return value and the exception to update the |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
517 * orderId->Node table. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
518 */ |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
519 registerNode(loopScope, invokeData.invokeOrderId, returnValue, true, true); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
520 if (invoke instanceof InvokeWithExceptionNode) { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
521 registerNode(loopScope, invokeData.exceptionOrderId, exceptionValue, true, true); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
522 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
523 if (inlineScope.exceptionPlaceholderNode != null) { |
21258
25d71cc054e5
Handle null exceptionValue in PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21075
diff
changeset
|
524 inlineScope.exceptionPlaceholderNode.replaceAtUsages(exceptionValue); |
25d71cc054e5
Handle null exceptionValue in PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21075
diff
changeset
|
525 inlineScope.exceptionPlaceholderNode.safeDelete(); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
526 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
527 deleteInvoke(invoke); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
528 |
21608
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
529 for (InlineInvokePlugin plugin : methodScope.inlineInvokePlugins) { |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
530 plugin.notifyAfterInline(inlineMethod); |
4a8d4ee0fdd6
Allow multiple ParameterPlugin and InlineInvokePlugin in graph builder plugins; cleanup InlineInvokePlugin and implementations, including in Truffle
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21567
diff
changeset
|
531 } |
21430
cd35fec33774
more debug dumping in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
21352
diff
changeset
|
532 |
cd35fec33774
more debug dumping in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
21352
diff
changeset
|
533 if (Debug.isDumpEnabled() && DumpDuringGraphBuilding.getValue()) { |
cd35fec33774
more debug dumping in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
21352
diff
changeset
|
534 Debug.dump(methodScope.graph, "Inline finished: " + inlineMethod.getDeclaringClass().getUnqualifiedName() + "." + inlineMethod.getName()); |
cd35fec33774
more debug dumping in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
21352
diff
changeset
|
535 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
536 return true; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
537 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
538 |
21930
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
539 private static RuntimeException tooDeepInlining(PEMethodScope methodScope) { |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
540 HashMap<ResolvedJavaMethod, Integer> methodCounts = new HashMap<>(); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
541 for (PEMethodScope cur = methodScope; cur != null; cur = cur.caller) { |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
542 Integer oldCount = methodCounts.get(cur.method); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
543 methodCounts.put(cur.method, oldCount == null ? 1 : oldCount + 1); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
544 } |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
545 |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
546 List<Map.Entry<ResolvedJavaMethod, Integer>> methods = new ArrayList<>(methodCounts.entrySet()); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
547 methods.sort((e1, e2) -> -Integer.compare(e1.getValue(), e2.getValue())); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
548 |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
549 StringBuilder msg = new StringBuilder("Too deep inlining, probably caused by recursive inlining. Inlined methods ordered by inlining frequency:"); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
550 for (Map.Entry<ResolvedJavaMethod, Integer> entry : methods) { |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
551 msg.append(System.lineSeparator()).append(entry.getKey().format("%H.%n(%p) [")).append(entry.getValue()).append("]"); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
552 } |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
553 throw new BailoutException(msg.toString()); |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
554 } |
b09503284ac8
Limit inlining depth during partial evaluation to avoid StackOverflowError, provide useful error message instead
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21609
diff
changeset
|
555 |
21502
553445b73d99
Bugfix for Graph Decoder: ensure that guard dependencies to block begins are correctly re-wired during decoding
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21430
diff
changeset
|
556 public FixedNode nodeAfterInvoke(PEMethodScope methodScope, LoopScope loopScope, InvokeData invokeData, AbstractBeginNode lastBlock) { |
553445b73d99
Bugfix for Graph Decoder: ensure that guard dependencies to block begins are correctly re-wired during decoding
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21430
diff
changeset
|
557 assert lastBlock.isAlive(); |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
558 FixedNode n; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
559 if (invokeData.invoke instanceof InvokeWithExceptionNode) { |
21502
553445b73d99
Bugfix for Graph Decoder: ensure that guard dependencies to block begins are correctly re-wired during decoding
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21430
diff
changeset
|
560 registerNode(loopScope, invokeData.nextOrderId, lastBlock, false, false); |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
561 n = makeStubNode(methodScope, loopScope, invokeData.nextNextOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
562 } else { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
563 n = makeStubNode(methodScope, loopScope, invokeData.nextOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
564 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
565 return n; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
566 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
567 |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
568 private static void deleteInvoke(Invoke invoke) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
569 /* |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
570 * Clean up unused nodes. We cannot just call killCFG on the invoke node because that can |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
571 * kill too much: nodes that are decoded later can use values that appear unused by now. |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
572 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
573 FrameState frameState = invoke.stateAfter(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
574 invoke.asNode().safeDelete(); |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
575 assert invoke.callTarget() == null : "must not have been added to the graph yet"; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
576 if (frameState != null && frameState.hasNoUsages()) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
577 frameState.safeDelete(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
578 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
579 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
580 |
22129
769e2e74e4f3
added support for inlining intrinsics to PEGraphDecoder (GRAAL-1170)
Doug Simon <doug.simon@oracle.com>
parents:
22105
diff
changeset
|
581 protected abstract EncodedGraph lookupEncodedGraph(ResolvedJavaMethod method, boolean isIntrinsic); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
582 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
583 @Override |
21295
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
584 protected void handleFixedNode(MethodScope s, LoopScope loopScope, int nodeOrderId, FixedNode node) { |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
585 PEMethodScope methodScope = (PEMethodScope) s; |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
586 if (node instanceof SimpleInfopointNode && methodScope.isInlinedMethod()) { |
22418
d003c4c1782b
do not use the (possibly uninitialized) InvokeNode.stateAfter to fill BytecodePosition in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
22400
diff
changeset
|
587 InliningUtil.addSimpleInfopointCaller((SimpleInfopointNode) node, methodScope.getBytecodePosition()); |
21295
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
588 } |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
589 super.handleFixedNode(s, loopScope, nodeOrderId, node); |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
590 } |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
591 |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
592 @Override |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
593 protected Node handleFloatingNodeBeforeAdd(MethodScope s, LoopScope loopScope, Node node) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
594 PEMethodScope methodScope = (PEMethodScope) s; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
595 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
596 if (node instanceof ParameterNode) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
597 if (methodScope.arguments != null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
598 Node result = methodScope.arguments[((ParameterNode) node).index()]; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
599 assert result != null; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
600 return result; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
601 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
602 } else if (methodScope.parameterPlugin != null) { |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
603 GraphBuilderContext graphBuilderContext = new PENonAppendGraphBuilderContext(methodScope, null); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
604 Node result = methodScope.parameterPlugin.interceptParameter(graphBuilderContext, ((ParameterNode) node).index(), ((ParameterNode) node).stamp()); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
605 if (result != null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
606 return result; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
607 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
608 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
609 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
610 } |
21075
d094ea7e0433
Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21001
diff
changeset
|
611 |
d094ea7e0433
Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21001
diff
changeset
|
612 return super.handleFloatingNodeBeforeAdd(methodScope, loopScope, node); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
613 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
614 |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
615 protected void ensureOuterStateDecoded(PEMethodScope methodScope) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
616 if (methodScope.outerState == null && methodScope.caller != null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
617 FrameState stateAtReturn = methodScope.invokeData.invoke.stateAfter(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
618 if (stateAtReturn == null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
619 stateAtReturn = (FrameState) decodeFloatingNode(methodScope.caller, methodScope.callerLoopScope, methodScope.invokeData.stateAfterOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
620 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
621 |
22604
b00cc0475f31
Update jvmci import: Refactoring: Rename Kind to JavaKind.
Roland Schatz <roland.schatz@oracle.com>
parents:
22418
diff
changeset
|
622 JavaKind invokeReturnKind = methodScope.invokeData.invoke.asNode().getStackKind(); |
21567
f41409c6ff26
Do not rely on single/double slot information from the Kind of the value in a local variable or expression stack entry. With word type rewriting during parsing, long values can be single slot values when they are rewritten from Object values.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
21557
diff
changeset
|
623 FrameState outerState = stateAtReturn.duplicateModified(methodScope.graph, methodScope.invokeData.invoke.bci(), stateAtReturn.rethrowException(), true, invokeReturnKind, null, null); |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
624 |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
625 /* |
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
626 * When the encoded graph has methods inlining, we can already have a proper caller |
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
627 * state. If not, we set the caller state here. |
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
628 */ |
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
629 if (outerState.outerFrameState() == null && methodScope.caller != null) { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
630 ensureOuterStateDecoded(methodScope.caller); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
631 outerState.setOuterFrameState(methodScope.caller.outerState); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
632 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
633 methodScope.outerState = outerState; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
634 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
635 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
636 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
637 protected void ensureStateAfterDecoded(PEMethodScope methodScope) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
638 if (methodScope.invokeData.invoke.stateAfter() == null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
639 methodScope.invokeData.invoke.setStateAfter((FrameState) ensureNodeCreated(methodScope.caller, methodScope.callerLoopScope, methodScope.invokeData.stateAfterOrderId)); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
640 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
641 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
642 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
643 protected void ensureExceptionStateDecoded(PEMethodScope methodScope) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
644 if (methodScope.exceptionState == null && methodScope.caller != null && methodScope.invokeData.invoke instanceof InvokeWithExceptionNode) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
645 ensureStateAfterDecoded(methodScope); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
646 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
647 assert methodScope.exceptionPlaceholderNode == null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
648 methodScope.exceptionPlaceholderNode = methodScope.graph.add(new ExceptionPlaceholderNode()); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
649 registerNode(methodScope.callerLoopScope, methodScope.invokeData.exceptionOrderId, methodScope.exceptionPlaceholderNode, false, false); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
650 FrameState exceptionState = (FrameState) ensureNodeCreated(methodScope.caller, methodScope.callerLoopScope, methodScope.invokeData.exceptionStateOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
651 |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20899
diff
changeset
|
652 if (exceptionState.outerFrameState() == null && methodScope.caller != null) { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
653 ensureOuterStateDecoded(methodScope.caller); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
654 exceptionState.setOuterFrameState(methodScope.caller.outerState); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
655 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
656 methodScope.exceptionState = exceptionState; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
657 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
658 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
659 |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
660 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
661 protected Node handleFloatingNodeAfterAdd(MethodScope s, LoopScope loopScope, Node node) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
662 PEMethodScope methodScope = (PEMethodScope) s; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
663 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
664 if (methodScope.isInlinedMethod()) { |
21295
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
665 if (node instanceof FrameState) { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
666 FrameState frameState = (FrameState) node; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
667 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
668 ensureOuterStateDecoded(methodScope); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
669 if (frameState.bci < 0) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
670 ensureExceptionStateDecoded(methodScope); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
671 } |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
672 return InliningUtil.processFrameState(frameState, methodScope.invokeData.invoke, methodScope.method, methodScope.exceptionState, methodScope.outerState, true); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
673 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
674 } else if (node instanceof MonitorIdNode) { |
20899
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
675 ensureOuterStateDecoded(methodScope); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20863
diff
changeset
|
676 InliningUtil.processMonitorId(methodScope.outerState, (MonitorIdNode) node); |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
677 return node; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
678 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
679 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
680 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
681 return node; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
682 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
683 } |