annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java @ 22604:b00cc0475f31

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