Mercurial > hg > truffle
annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java @ 21502:553445b73d99
Bugfix for Graph Decoder: ensure that guard dependencies to block begins are correctly re-wired during decoding
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Tue, 26 May 2015 16:19:16 -0700 |
parents | cd35fec33774 |
children | 31fc2fce38f3 |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
25 import static com.oracle.graal.compiler.common.GraalInternalError.*; |
21352
6d5a198d23e6
consolidated AbstractBytecodeParser into BytecodeParser
Doug Simon <doug.simon@oracle.com>
parents:
21343
diff
changeset
|
26 import static com.oracle.graal.java.GraphBuilderPhase.Options.*; |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
30 import com.oracle.graal.api.code.*; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
31 import com.oracle.graal.api.meta.*; |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
32 import com.oracle.graal.compiler.common.type.*; |
21430
cd35fec33774
more debug dumping in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
21352
diff
changeset
|
33 import com.oracle.graal.debug.*; |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
34 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
|
35 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
|
36 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
|
37 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
|
38 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
|
39 import com.oracle.graal.java.*; |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
40 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
|
41 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
|
42 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
|
43 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
|
44 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
|
45 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
|
46 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
|
47 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
48 /** |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
49 * 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
|
50 * 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
|
51 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
52 * 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
|
53 * {@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
|
54 * {@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
|
55 * |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
56 * 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
|
57 * 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
|
58 * {@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
|
59 */ |
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
|
60 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
|
61 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
62 protected class PEMethodScope extends MethodScope { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
63 /** 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:
20873
diff
changeset
|
64 protected final PEMethodScope caller; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
65 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
|
66 protected final ResolvedJavaMethod method; |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
67 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
|
68 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
|
69 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
70 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
|
71 protected final InvocationPlugins invocationPlugins; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
72 protected final InlineInvokePlugin inlineInvokePlugin; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
73 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
|
74 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
|
75 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
76 protected FrameState outerState; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
77 protected FrameState exceptionState; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
78 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
|
79 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
|
80 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
81 protected PEMethodScope(StructuredGraph targetGraph, PEMethodScope caller, LoopScope callerLoopScope, EncodedGraph encodedGraph, ResolvedJavaMethod method, InvokeData invokeData, |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
82 int inliningDepth, LoopExplosionPlugin loopExplosionPlugin, InvocationPlugins invocationPlugins, InlineInvokePlugin inlineInvokePlugin, ParameterPlugin parameterPlugin, |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
83 ValueNode[] arguments) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
84 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
|
85 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
86 this.caller = caller; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
87 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
|
88 this.method = method; |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
89 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
|
90 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
|
91 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
|
92 this.invocationPlugins = invocationPlugins; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
93 this.inlineInvokePlugin = inlineInvokePlugin; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
94 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
|
95 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
|
96 } |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
97 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
98 public boolean isInlinedMethod() { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
99 return caller != null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
100 } |
21295
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
101 |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
102 public BytecodePosition getBytecodePosition() { |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
103 if (bytecodePosition == null) { |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
104 ensureOuterStateDecoded(this); |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
105 ensureExceptionStateDecoded(this); |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
106 bytecodePosition = InliningUtil.processBytecodePosition(invokeData.invoke, null); |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
107 } |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
108 return bytecodePosition; |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
109 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
110 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
111 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
112 protected class PENonAppendGraphBuilderContext implements GraphBuilderContext { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
113 protected final PEMethodScope methodScope; |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
114 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
|
115 |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
116 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
|
117 this.methodScope = methodScope; |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
118 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
|
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 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
122 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
|
123 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
|
124 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
125 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
126 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
127 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
|
128 return stampProvider; |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
131 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
132 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
|
133 return metaAccess; |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
136 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
137 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
|
138 return constantReflection; |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
141 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
142 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
|
143 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
|
144 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
145 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
146 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
147 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
|
148 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
|
149 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
150 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
151 @Override |
21343
ce95a5e36927
removed unnecessary Intrinsic interface
Doug Simon <doug.simon@oracle.com>
parents:
21311
diff
changeset
|
152 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
|
153 return null; |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
156 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
157 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
|
158 throw unimplemented(); |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
161 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
162 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
|
163 throw unimplemented(); |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
166 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
167 public void push(Kind kind, ValueNode value) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
168 throw unimplemented(); |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
171 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
172 public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
173 throw unimplemented(); |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
176 @Override |
20873 | 177 public void intrinsify(ResolvedJavaMethod targetMethod, ResolvedJavaMethod substitute, ValueNode[] args) { |
178 throw unimplemented(); | |
179 } | |
180 | |
181 @Override | |
21280
b97ec8aec2c7
changed GraphBuilderContext.createStateAfter() to .setStateAfter(StateSplit)
Doug Simon <doug.simon@oracle.com>
parents:
21258
diff
changeset
|
182 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
|
183 throw unimplemented(); |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
186 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
187 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
|
188 throw unimplemented(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
189 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
190 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
191 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
192 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
|
193 throw unimplemented(); |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
196 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
197 public int bci() { |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
198 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
|
199 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
200 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
201 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
202 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
|
203 throw unimplemented(); |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
206 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
207 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
|
208 throw unimplemented(); |
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 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
211 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
212 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
|
213 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
|
214 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
|
215 |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
216 public PEAppendGraphBuilderContext(PEMethodScope inlineScope, FixedWithNextNode lastInstr) { |
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
217 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
|
218 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
|
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 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
222 public void push(Kind kind, ValueNode value) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
223 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
|
224 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
|
225 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
226 pushedNode = value; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
227 } |
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 @Override |
21280
b97ec8aec2c7
changed GraphBuilderContext.createStateAfter() to .setStateAfter(StateSplit)
Doug Simon <doug.simon@oracle.com>
parents:
21258
diff
changeset
|
230 public void setStateAfter(StateSplit stateSplit) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
231 Node stateAfter = decodeFloatingNode(methodScope.caller, methodScope.callerLoopScope, methodScope.invokeData.stateAfterOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
232 getGraph().add(stateAfter); |
21280
b97ec8aec2c7
changed GraphBuilderContext.createStateAfter() to .setStateAfter(StateSplit)
Doug Simon <doug.simon@oracle.com>
parents:
21258
diff
changeset
|
233 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
|
234 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
|
235 } |
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 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
238 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
|
239 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
|
240 return v; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
241 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
242 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
|
243 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
|
244 updateLastInstruction(v); |
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 return added; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
247 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
248 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
249 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
250 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
|
251 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
|
252 return v; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
253 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
254 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
|
255 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
|
256 updateLastInstruction(v); |
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 return added; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
259 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
260 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
261 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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 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
|
267 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
|
268 lastInstr = fixedWithNextNode; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
269 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
270 lastInstr = null; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
271 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
272 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
273 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
274 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
275 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
276 @NodeInfo |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
277 static class ExceptionPlaceholderNode extends ValueNode { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
278 public static final NodeClass<ExceptionPlaceholderNode> TYPE = NodeClass.create(ExceptionPlaceholderNode.class); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
279 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
280 public ExceptionPlaceholderNode() { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
281 super(TYPE, StampFactory.object()); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
282 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
283 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
284 |
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
|
285 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
|
286 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
|
287 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
288 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
289 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
|
290 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
|
291 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
|
292 } 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
|
293 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
|
294 } 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
|
295 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
|
296 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
297 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
|
298 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
299 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
300 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
301 public void decode(StructuredGraph targetGraph, ResolvedJavaMethod method, LoopExplosionPlugin loopExplosionPlugin, InvocationPlugins invocationPlugins, InlineInvokePlugin inlineInvokePlugin, |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
302 ParameterPlugin parameterPlugin) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
303 PEMethodScope methodScope = new PEMethodScope(targetGraph, null, null, lookupEncodedGraph(method), method, null, 0, loopExplosionPlugin, invocationPlugins, inlineInvokePlugin, |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
304 parameterPlugin, null); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
305 decode(methodScope, null); |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
306 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
|
307 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
|
308 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
309 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
310 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
311 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
|
312 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
|
313 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
314 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
|
315 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
|
316 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
|
317 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
|
318 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
319 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
|
320 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
321 } |
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 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
324 @Override |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
325 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
|
326 PEMethodScope methodScope = (PEMethodScope) s; |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
327 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
328 /* |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
329 * 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:
20873
diff
changeset
|
330 * 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:
20873
diff
changeset
|
331 */ |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
332 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:
20873
diff
changeset
|
333 CallTargetNode callTarget = (CallTargetNode) decodeFloatingNode(methodScope, loopScope, invokeData.callTargetOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
334 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
|
335 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
336 /* 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:
20873
diff
changeset
|
337 methodScope.graph.add(callTarget); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
338 registerNode(loopScope, invokeData.callTargetOrderId, callTarget, false, false); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
339 super.handleInvoke(methodScope, loopScope, invokeData); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
340 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
341 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
342 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
343 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
|
344 // attempt to devirtualize the call |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
345 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
|
346 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
|
347 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
|
348 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
|
349 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
350 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
351 if (tryInvocationPlugin(methodScope, loopScope, invokeData, callTarget)) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
352 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
|
353 } |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
354 if (tryInline(methodScope, loopScope, invokeData, callTarget)) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
355 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
|
356 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
357 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
358 if (methodScope.inlineInvokePlugin != null) { |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
359 methodScope.inlineInvokePlugin.notifyOfNoninlinedInvoke(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
|
360 } |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
361 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
|
362 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
363 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
364 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
|
365 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
|
366 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
367 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
368 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
369 Invoke invoke = invokeData.invoke; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
370 |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
371 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
|
372 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
|
373 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
|
374 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
375 } |
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 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
|
378 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
|
379 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
380 /* 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
|
381 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
|
382 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
383 PEMethodScope inlineScope = new PEMethodScope(methodScope.graph, methodScope, loopScope, null, targetMethod, invokeData, methodScope.inliningDepth + 1, methodScope.loopExplosionPlugin, |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
384 methodScope.invocationPlugins, methodScope.inlineInvokePlugin, null, arguments); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
385 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
|
386 InvocationPluginReceiver invocationPluginReceiver = new InvocationPluginReceiver(graphBuilderContext); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
387 |
20873 | 388 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
|
389 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
390 if (graphBuilderContext.lastInstr != null) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
391 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
|
392 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
|
393 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
|
394 } else { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
395 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
|
396 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
|
397 } |
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 deleteInvoke(invoke); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
400 return true; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
401 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
402 } else { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
403 /* 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
|
404 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
|
405 return false; |
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 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
409 protected boolean tryInline(PEMethodScope methodScope, LoopScope loopScope, InvokeData invokeData, MethodCallTargetNode callTarget) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
410 if (methodScope.inlineInvokePlugin == null || !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
|
411 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
412 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
413 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
414 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
|
415 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
|
416 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
417 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
418 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
419 ValueNode[] arguments = callTarget.arguments().toArray(new ValueNode[0]); |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
420 GraphBuilderContext graphBuilderContext = new PENonAppendGraphBuilderContext(methodScope, 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
|
421 InlineInfo inlineInfo = methodScope.inlineInvokePlugin.getInlineInfo(graphBuilderContext, targetMethod, arguments, callTarget.returnType()); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
422 if (inlineInfo == null) { |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
423 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
424 } |
21311
710fc7216c56
consolidated ReplacementContext and IntrinsicContext
Doug Simon <doug.simon@oracle.com>
parents:
21298
diff
changeset
|
425 assert !inlineInfo.isIntrinsic : "not supported"; |
20827
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 ResolvedJavaMethod inlineMethod = inlineInfo.methodToInline; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
428 EncodedGraph graphToInline = lookupEncodedGraph(inlineMethod); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
429 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
|
430 return false; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
431 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
432 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
433 Invoke invoke = invokeData.invoke; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
434 FixedNode invokeNode = invoke.asNode(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
435 FixedWithNextNode predecessor = (FixedWithNextNode) invokeNode.predecessor(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
436 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
|
437 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
438 PEMethodScope inlineScope = new PEMethodScope(methodScope.graph, methodScope, loopScope, graphToInline, inlineMethod, invokeData, methodScope.inliningDepth + 1, |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
439 methodScope.loopExplosionPlugin, methodScope.invocationPlugins, methodScope.inlineInvokePlugin, 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
|
440 /* Do the actual inlining by decoding the inlineMethod */ |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
441 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
|
442 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
443 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
|
444 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
|
445 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
|
446 } |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
447 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
|
448 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
449 if (invoke instanceof InvokeWithExceptionNode) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
450 InvokeWithExceptionNode invokeWithException = ((InvokeWithExceptionNode) invoke); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
451 assert invokeWithException.next() == null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
452 assert invokeWithException.exceptionEdge() == null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
453 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
454 if (unwindNode != null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
455 assert unwindNode.predecessor() != null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
456 Node n = makeStubNode(methodScope, loopScope, invokeData.exceptionNextOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
457 unwindNode.replaceAndDelete(n); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
458 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
459 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
460 } else { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
461 if (unwindNode != null && !unwindNode.isDeleted()) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
462 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:
20873
diff
changeset
|
463 unwindNode.replaceAndDelete(deoptimizeNode); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
464 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
465 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
466 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
467 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
|
468 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
469 ValueNode returnValue; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
470 List<ReturnNode> returnNodes = inlineScope.returnNodes; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
471 if (!returnNodes.isEmpty()) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
472 if (returnNodes.size() == 1) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
473 ReturnNode returnNode = returnNodes.get(0); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
474 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
|
475 FixedNode n = nodeAfterInvoke(methodScope, loopScope, invokeData, AbstractBeginNode.prevBegin(returnNode)); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
476 returnNode.replaceAndDelete(n); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
477 } else { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
478 AbstractMergeNode merge = methodScope.graph.add(new MergeNode()); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
479 merge.setStateAfter((FrameState) ensureNodeCreated(methodScope, loopScope, invokeData.stateAfterOrderId)); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
480 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
|
481 FixedNode n = nodeAfterInvoke(methodScope, loopScope, invokeData, merge); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
482 merge.setNext(n); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
483 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
484 } else { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
485 returnValue = null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
486 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
487 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
|
488 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
489 /* |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
490 * 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
|
491 * 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
|
492 */ |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
493 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
|
494 if (invoke instanceof InvokeWithExceptionNode) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
495 registerNode(loopScope, invokeData.exceptionOrderId, exceptionValue, true, true); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
496 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
497 if (inlineScope.exceptionPlaceholderNode != null) { |
21258
25d71cc054e5
Handle null exceptionValue in PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21075
diff
changeset
|
498 inlineScope.exceptionPlaceholderNode.replaceAtUsages(exceptionValue); |
25d71cc054e5
Handle null exceptionValue in PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21075
diff
changeset
|
499 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
|
500 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
501 deleteInvoke(invoke); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
502 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
503 methodScope.inlineInvokePlugin.postInline(inlineMethod); |
21430
cd35fec33774
more debug dumping in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
21352
diff
changeset
|
504 |
cd35fec33774
more debug dumping in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
21352
diff
changeset
|
505 if (Debug.isDumpEnabled() && DumpDuringGraphBuilding.getValue()) { |
cd35fec33774
more debug dumping in PEGraphDecoder
Lukas Stadler <lukas.stadler@oracle.com>
parents:
21352
diff
changeset
|
506 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
|
507 } |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
508 return true; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
509 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
510 |
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
|
511 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
|
512 assert lastBlock.isAlive(); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
513 FixedNode n; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
514 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
|
515 registerNode(loopScope, invokeData.nextOrderId, lastBlock, false, false); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
516 n = makeStubNode(methodScope, loopScope, invokeData.nextNextOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
517 } else { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
518 n = makeStubNode(methodScope, loopScope, invokeData.nextOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
519 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
520 return n; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
521 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
522 |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
523 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
|
524 /* |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
525 * 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
|
526 * 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
|
527 */ |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
528 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
|
529 invoke.asNode().safeDelete(); |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
530 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
|
531 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
|
532 frameState.safeDelete(); |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
533 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
534 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
535 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
536 protected abstract EncodedGraph lookupEncodedGraph(ResolvedJavaMethod method); |
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 @Override |
21295
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
539 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
|
540 PEMethodScope methodScope = (PEMethodScope) s; |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
541 if (node instanceof SimpleInfopointNode && methodScope.isInlinedMethod()) { |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
542 InliningUtil.processSimpleInfopoint(methodScope.invokeData.invoke, (SimpleInfopointNode) node, methodScope.getBytecodePosition()); |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
543 } |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
544 super.handleFixedNode(s, loopScope, nodeOrderId, node); |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
545 } |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
546 |
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
547 @Override |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
548 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
|
549 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
|
550 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
551 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
|
552 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
|
553 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
|
554 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
|
555 return result; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
556 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
557 } else if (methodScope.parameterPlugin != null) { |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
558 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
|
559 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
|
560 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
|
561 return result; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
562 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
563 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
564 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
565 } |
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
|
566 |
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
|
567 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
|
568 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
569 |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
570 protected void ensureOuterStateDecoded(PEMethodScope methodScope) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
571 if (methodScope.outerState == null && methodScope.caller != null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
572 FrameState stateAtReturn = methodScope.invokeData.invoke.stateAfter(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
573 if (stateAtReturn == null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
574 stateAtReturn = (FrameState) decodeFloatingNode(methodScope.caller, methodScope.callerLoopScope, methodScope.invokeData.stateAfterOrderId); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
575 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
576 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
577 Kind invokeReturnKind = methodScope.invokeData.invoke.asNode().getKind(); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
578 FrameState outerState = stateAtReturn.duplicateModified(methodScope.graph, methodScope.invokeData.invoke.bci(), stateAtReturn.rethrowException(), true, invokeReturnKind); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
579 |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
580 /* |
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
581 * 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:
20896
diff
changeset
|
582 * state. If not, we set the caller state here. |
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
583 */ |
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
584 if (outerState.outerFrameState() == null && methodScope.caller != null) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
585 ensureOuterStateDecoded(methodScope.caller); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
586 outerState.setOuterFrameState(methodScope.caller.outerState); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
587 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
588 methodScope.outerState = outerState; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
589 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
590 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
591 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
592 protected void ensureStateAfterDecoded(PEMethodScope methodScope) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
593 if (methodScope.invokeData.invoke.stateAfter() == null) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
594 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:
20873
diff
changeset
|
595 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
596 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
597 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
598 protected void ensureExceptionStateDecoded(PEMethodScope methodScope) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
599 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:
20873
diff
changeset
|
600 ensureStateAfterDecoded(methodScope); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
601 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
602 assert methodScope.exceptionPlaceholderNode == null; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
603 methodScope.exceptionPlaceholderNode = methodScope.graph.add(new ExceptionPlaceholderNode()); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
604 registerNode(methodScope.callerLoopScope, methodScope.invokeData.exceptionOrderId, methodScope.exceptionPlaceholderNode, false, false); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
605 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:
20873
diff
changeset
|
606 |
20985
eebb05f2d1e8
Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20896
diff
changeset
|
607 if (exceptionState.outerFrameState() == null && methodScope.caller != null) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
608 ensureOuterStateDecoded(methodScope.caller); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
609 exceptionState.setOuterFrameState(methodScope.caller.outerState); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
610 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
611 methodScope.exceptionState = exceptionState; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
612 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
613 } |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
614 |
20827
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
615 @Override |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
616 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
|
617 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
|
618 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
619 if (methodScope.isInlinedMethod()) { |
21295
3703ad7bf6b5
Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
21258
diff
changeset
|
620 if (node instanceof FrameState) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
621 FrameState frameState = (FrameState) node; |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
622 |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
623 ensureOuterStateDecoded(methodScope); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
624 if (frameState.bci < 0) { |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
625 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
|
626 } |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
627 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
|
628 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
629 } else if (node instanceof MonitorIdNode) { |
20896
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
630 ensureOuterStateDecoded(methodScope); |
c7f1ab98d950
Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
20873
diff
changeset
|
631 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
|
632 return node; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
633 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
634 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
635 |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
636 return node; |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
637 } |
5bf195ce816a
New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff
changeset
|
638 } |