annotate graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PEGraphDecoder.java @ 20827:5bf195ce816a

New partial evaluator that works on encoded graphs (instead of on bytecodes)
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 08 Apr 2015 22:38:40 -0700
parents
children 891e3e7024b8
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 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.truffle;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
24
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
25 import static com.oracle.graal.compiler.common.GraalInternalError.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
26 import static com.oracle.graal.java.AbstractBytecodeParser.Options.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
27
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
28 import java.util.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
29
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
30 import com.oracle.graal.api.code.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
31 import com.oracle.graal.api.meta.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
32 import com.oracle.graal.api.replacements.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
33 import com.oracle.graal.debug.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
34 import com.oracle.graal.graph.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
35 import com.oracle.graal.graph.spi.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
36 import com.oracle.graal.graphbuilderconf.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
37 import com.oracle.graal.graphbuilderconf.InlineInvokePlugin.InlineInfo;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
38 import com.oracle.graal.graphbuilderconf.InvocationPlugins.InvocationPluginReceiver;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
39 import com.oracle.graal.java.*;
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.nodes.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
41 import com.oracle.graal.nodes.CallTargetNode.InvokeKind;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
42 import com.oracle.graal.nodes.extended.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
43 import com.oracle.graal.nodes.java.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
44 import com.oracle.graal.nodes.spi.*;
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.util.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
46 import com.oracle.graal.phases.common.inlining.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
47
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
48 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
49 * A graph decoder that performs partial evaluation, i.e., that performs method inlining and
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
50 * canonicalization/simplification of nodes during decoding.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
51 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
52 * Inlining and loop explosion are configured via the plugin mechanism also used by the
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
53 * {@link GraphBuilderPhase}. However, not all callback methods defined in
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
54 * {@link GraphBuilderContext} are available since decoding is more limited than graph building.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
55 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
56 * The standard {@link Canonicalizable#canonical node canonicalization} interface is used to
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
57 * canonicalize nodes during decoding. Additionally, {@link IfNode branches} and
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
58 * {@link IntegerSwitchNode switches} with constant conditions are simplified.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
59 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
60 public abstract class PEGraphDecoder extends GraphDecoder {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
61
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
62 protected final MetaAccessProvider metaAccess;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
63 protected final ConstantReflectionProvider constantReflection;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
64 protected final StampProvider stampProvider;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
65 protected final SnippetReflectionProvider snippetReflection;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
66
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
67 protected class PEMethodScope extends MethodScope {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
68 protected final ResolvedJavaMethod method;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
69 protected final Invoke invoke;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
70 protected final int inliningDepth;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
71
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
72 protected final LoopExplosionPlugin loopExplosionPlugin;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
73 protected final InvocationPlugins invocationPlugins;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
74 protected final InlineInvokePlugin inlineInvokePlugin;
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 ParameterPlugin parameterPlugin;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
76 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
77
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
78 protected FrameState outerFrameState;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
79 protected BytecodePosition bytecodePosition;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
80
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
81 protected PEMethodScope(StructuredGraph targetGraph, MethodScope caller, EncodedGraph encodedGraph, ResolvedJavaMethod method, Invoke invoke, int inliningDepth,
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
82 LoopExplosionPlugin loopExplosionPlugin, InvocationPlugins invocationPlugins, InlineInvokePlugin inlineInvokePlugin, ParameterPlugin parameterPlugin, ValueNode[] arguments) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
83 super(targetGraph, caller, encodedGraph, loopExplosionKind(method, loopExplosionPlugin));
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
84
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
85 this.method = method;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
86 this.invoke = invoke;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
87 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
88 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
89 this.invocationPlugins = invocationPlugins;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
90 this.inlineInvokePlugin = inlineInvokePlugin;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
91 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
92 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
93 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
94 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
95
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
96 protected class PECanonicalizerTool implements CanonicalizerTool {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
97 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
98 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
99 return metaAccess;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
100 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
101
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
102 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
103 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
104 return constantReflection;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
105 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
106
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
107 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
108 public boolean canonicalizeReads() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
109 return true;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
110 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
111
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
112 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
113 public boolean allUsagesAvailable() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
114 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
115 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
116 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
117
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
118 protected class PENonAppendGraphBuilderContext implements GraphBuilderContext {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
119 private final PEMethodScope methodScope;
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 public PENonAppendGraphBuilderContext(PEMethodScope methodScope) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
122 this.methodScope = methodScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
123 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
124
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
125 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
126 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
127 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
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 StampProvider getStampProvider() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
132 return stampProvider;
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 MetaAccessProvider getMetaAccess() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
137 return metaAccess;
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 ConstantReflectionProvider getConstantReflection() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
142 return constantReflection;
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 SnippetReflectionProvider getSnippetReflection() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
147 return snippetReflection;
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
161 public Replacement getReplacement() {
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
176 public void push(Kind kind, ValueNode value) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
181 public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
186 public FrameState createStateAfter() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
187 throw unimplemented();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
188 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
189
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
190 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
191 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
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 ResolvedJavaMethod getMethod() {
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 int bci() {
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 InvokeKind getInvokeKind() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
207 throw unimplemented();
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 JavaType getInvokeReturnType() {
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
216 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
217 protected final Invoke invoke;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
218 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
219 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
220
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
221 public PEAppendGraphBuilderContext(PEMethodScope methodScope, Invoke invoke, FixedWithNextNode lastInstr) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
222 super(methodScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
223 this.invoke = invoke;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
224 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
225 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
226
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
227 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
228 public void push(Kind kind, ValueNode value) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
229 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
230 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
231 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
232 pushedNode = value;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
233 }
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 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
236 public FrameState createStateAfter() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
237 return invoke.stateAfter().duplicate();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
238 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
239
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
240 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
241 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
242 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
243 return v;
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 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
246 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
247 updateLastInstruction(v);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
248 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
249 return added;
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
252 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
253 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
254 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
255 return v;
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 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
258 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
259 updateLastInstruction(v);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
260 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
261 return added;
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
264 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
265 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
266 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
267 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
268 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
269 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
270 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
271 lastInstr = fixedWithNextNode;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
272 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
273 lastInstr = null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
274 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
275 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
276 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
277 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
278
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
279 public PEGraphDecoder(MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection, StampProvider stampProvider, SnippetReflectionProvider snippetReflection) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
280 this.metaAccess = metaAccess;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
281 this.constantReflection = constantReflection;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
282 this.stampProvider = stampProvider;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
283 this.snippetReflection = snippetReflection;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
284 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
285
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
286 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
287 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
288 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
289 } 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
290 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
291 } 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
292 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
293 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
294 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
295 }
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 public void decode(StructuredGraph targetGraph, ResolvedJavaMethod method, LoopExplosionPlugin loopExplosionPlugin, InvocationPlugins invocationPlugins, InlineInvokePlugin inlineInvokePlugin,
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
299 ParameterPlugin parameterPlugin) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
300 PEMethodScope methodScope = new PEMethodScope(targetGraph, null, lookupEncodedGraph(method), method, null, 0, loopExplosionPlugin, invocationPlugins, inlineInvokePlugin, parameterPlugin, null);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
301 decode(methodScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
302 cleanupGraph(methodScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
303 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
304 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
305
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
306 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
307 protected void cleanupGraph(MethodScope methodScope) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
308 GraphBuilderPhase.connectLoopEndToBegin(methodScope.graph);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
309 super.cleanupGraph(methodScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
310 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
311
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
312 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
313 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
314 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
315
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
316 Debug.dump(methodScope.graph, "Loop iteration " + loopScope.loopIteration);
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 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
319 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
320 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
321 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
322 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
323 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
324 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
325 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
326 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
327
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
328 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
329 protected void simplifyInvoke(MethodScope s, LoopScope loopScope, int invokeOrderId, Invoke invoke) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
330 if (!(invoke.callTarget() instanceof MethodCallTargetNode)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
331 return;
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 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
334 MethodCallTargetNode callTarget = (MethodCallTargetNode) invoke.callTarget();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
335
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
336 // attempt to devirtualize the call
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
337 ResolvedJavaType contextType = (invoke.stateAfter() == null && invoke.stateDuring() == null) ? null : invoke.getContextType();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
338 ResolvedJavaMethod specialCallTarget = MethodCallTargetNode.findSpecialCallTarget(callTarget.invokeKind(), callTarget.receiver(), callTarget.targetMethod(), contextType);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
339 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
340 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
341 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
342 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
343
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
344 if (tryInvocationPlugin(methodScope, loopScope, invokeOrderId, invoke)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
345 return;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
346 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
347 if (tryInline(methodScope, loopScope, invokeOrderId, invoke)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
348 return;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
349 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
350
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
351 if (methodScope.inlineInvokePlugin != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
352 methodScope.inlineInvokePlugin.notifyOfNoninlinedInvoke(new PENonAppendGraphBuilderContext(methodScope), callTarget.targetMethod(), invoke);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
353 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
354 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
355
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
356 protected boolean tryInvocationPlugin(PEMethodScope methodScope, LoopScope loopScope, int invokeOrderId, Invoke invoke) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
357 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
358 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
359 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
360
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
361 MethodCallTargetNode callTarget = (MethodCallTargetNode) invoke.callTarget();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
362 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
363 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
364 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
365 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
366 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
367
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
368 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
369 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
370 FixedNode invokeNext = invoke.next();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
371 AbstractBeginNode invokeException = null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
372 if (invoke instanceof InvokeWithExceptionNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
373 invokeException = ((InvokeWithExceptionNode) invoke).exceptionEdge();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
374 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
375
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
376 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
377
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
378 PEAppendGraphBuilderContext graphBuilderContext = new PEAppendGraphBuilderContext(methodScope, invoke, invokePredecessor);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
379 InvocationPluginReceiver invocationPluginReceiver = new InvocationPluginReceiver(graphBuilderContext);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
380 if (InvocationPlugin.execute(graphBuilderContext, targetMethod, invocationPlugin, invocationPluginReceiver.init(targetMethod, arguments), arguments)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
381
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
382 if (graphBuilderContext.lastInstr != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
383 registerNode(loopScope, invokeOrderId, graphBuilderContext.pushedNode, true, true);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
384 invoke.asNode().replaceAtUsages(graphBuilderContext.pushedNode);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
385 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
386 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
387 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
388 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
389
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
390 deleteInvoke(invoke);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
391 if (invokeException != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
392 invokeException.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
393 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
394
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
395 if (graphBuilderContext.lastInstr != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
396 graphBuilderContext.lastInstr.setNext(invokeNext);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
397 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
398 invokeNext.replaceAtPredecessor(null);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
399 invokeNext.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
400 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
401 return true;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
402
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 /* Restore original state: invoke is in Graph. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
405 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
406 return false;
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 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
409
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
410 protected boolean tryInline(PEMethodScope methodScope, LoopScope loopScope, int invokeOrderId, Invoke invoke) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
411 if (methodScope.inlineInvokePlugin == null || !invoke.getInvokeKind().isDirect()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
412 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
413 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
414
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
415 MethodCallTargetNode callTarget = (MethodCallTargetNode) invoke.callTarget();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
416 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
417 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
418 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
419 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
420
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
421 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
422 GraphBuilderContext graphBuilderContext = new PENonAppendGraphBuilderContext(methodScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
423 InlineInfo inlineInfo = methodScope.inlineInvokePlugin.getInlineInfo(graphBuilderContext, targetMethod, arguments, callTarget.returnType());
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
424 if (inlineInfo == null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
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 assert !inlineInfo.isIntrinsic && !inlineInfo.isReplacement : "not supported";
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
428
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
429 ResolvedJavaMethod inlineMethod = inlineInfo.methodToInline;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
430 EncodedGraph graphToInline = lookupEncodedGraph(inlineMethod);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
431 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
432 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
433 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
434
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
435 int exceptionObjectOrderId = -1;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
436 if (invoke instanceof InvokeWithExceptionNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
437 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
438 * We need to have the regular next node (usually a KillingBeginNode) and the exception
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
439 * edge node (always an ExceptionObjectNode) fully decoded, because both can be changed
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
440 * or replaced as part of the inlining process. The GraphEncoder adds these two
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
441 * successors in a known order (first the regular next node, then the exception edge)
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
442 * that we can rely on here.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
443 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
444 assert ((InvokeWithExceptionNode) invoke).next().next() == null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
445 processNextNode(methodScope, loopScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
446 assert ((InvokeWithExceptionNode) invoke).next().next() != null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
447
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
448 assert ((InvokeWithExceptionNode) invoke).exceptionEdge().next() == null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
449 exceptionObjectOrderId = loopScope.nodesToProcess.nextSetBit(0);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
450 processNextNode(methodScope, loopScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
451 assert ((InvokeWithExceptionNode) invoke).exceptionEdge().next() != null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
452 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
453
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
454 PEMethodScope inlineScope = new PEMethodScope(methodScope.graph, methodScope, graphToInline, inlineMethod, invoke, methodScope.inliningDepth + 1, methodScope.loopExplosionPlugin,
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
455 methodScope.invocationPlugins, methodScope.inlineInvokePlugin, null, arguments);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
456 /* Do the actual inlining by decoding the inlineMethod */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
457 decode(inlineScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
458
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
459 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
460 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
461 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
462 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
463
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
464 FixedNode firstInlinedNode = inlineScope.startNode.next();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
465 /* The StartNode was only necessary as a placeholder during decoding. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
466 inlineScope.startNode.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
467
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
468 assert inlineScope.startNode.stateAfter() == null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
469 ValueNode returnValue = InliningUtil.finishInlining(invoke, methodScope.graph, firstInlinedNode, inlineScope.returnNodes, inlineScope.unwindNode, inlineScope.encodedGraph.getAssumptions(),
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
470 inlineScope.encodedGraph.getInlinedMethods(), null);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
471
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
472 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
473 * 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
474 * 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
475 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
476 registerNode(loopScope, invokeOrderId, returnValue, true, true);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
477 if (invoke instanceof InvokeWithExceptionNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
478 registerNode(loopScope, exceptionObjectOrderId, exceptionValue, true, true);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
479 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
480 deleteInvoke(invoke);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
481
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
482 methodScope.inlineInvokePlugin.postInline(inlineMethod);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
483 return true;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
484 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
485
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
486 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
487 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
488 * 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
489 * 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
490 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
491 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
492 invoke.asNode().safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
493 invoke.callTarget().safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
494 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
495 frameState.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
496 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
497 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
498
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
499 protected abstract EncodedGraph lookupEncodedGraph(ResolvedJavaMethod method);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
500
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
501 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
502 protected void simplifyFixedNode(MethodScope s, LoopScope loopScope, int nodeOrderId, FixedNode node) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
503 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
504
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
505 if (node instanceof IfNode && ((IfNode) node).condition() instanceof LogicConstantNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
506 IfNode ifNode = (IfNode) node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
507 boolean condition = ((LogicConstantNode) ifNode.condition()).getValue();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
508 AbstractBeginNode survivingSuccessor = ifNode.getSuccessor(condition);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
509 AbstractBeginNode deadSuccessor = ifNode.getSuccessor(!condition);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
510
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
511 methodScope.graph.removeSplit(ifNode, survivingSuccessor);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
512 assert deadSuccessor.next() == null : "must not be parsed yet";
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
513 deadSuccessor.safeDelete();
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 } else if (node instanceof IntegerSwitchNode && ((IntegerSwitchNode) node).value().isConstant()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
516 IntegerSwitchNode switchNode = (IntegerSwitchNode) node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
517 int value = switchNode.value().asJavaConstant().asInt();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
518 AbstractBeginNode survivingSuccessor = switchNode.successorAtKey(value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
519 List<Node> allSuccessors = switchNode.successors().snapshot();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
520
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
521 methodScope.graph.removeSplit(switchNode, survivingSuccessor);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
522 for (Node successor : allSuccessors) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
523 if (successor != survivingSuccessor) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
524 assert ((AbstractBeginNode) successor).next() == null : "must not be parsed yet";
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
525 successor.safeDelete();
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 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
528
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
529 } else if (node instanceof Canonicalizable) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
530 Node canonical = ((Canonicalizable) node).canonical(new PECanonicalizerTool());
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
531 if (canonical == null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
532 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
533 * This is a possible return value of canonicalization. However, we might need to
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
534 * add additional usages later on for which we need a node. Therefore, we just do
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
535 * nothing and leave the node in place.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
536 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
537 } else if (canonical != node) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
538 if (!canonical.isAlive()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
539 assert !canonical.isDeleted();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
540 canonical = methodScope.graph.addOrUniqueWithInputs(canonical);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
541 if (canonical instanceof FixedWithNextNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
542 methodScope.graph.addBeforeFixed(node, (FixedWithNextNode) canonical);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
543 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
544 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
545 GraphUtil.unlinkFixedNode((FixedWithNextNode) node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
546 node.replaceAtUsages(canonical);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
547 node.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
548 assert lookupNode(loopScope, nodeOrderId) == node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
549 registerNode(loopScope, nodeOrderId, canonical, true, false);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
550 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
551 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
552 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
553
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
554 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
555 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
556 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
557
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
558 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
559 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
560 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
561 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
562 return result;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
563
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
564 } else if (methodScope.parameterPlugin != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
565 GraphBuilderContext graphBuilderContext = new PENonAppendGraphBuilderContext(methodScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
566 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
567 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
568 return result;
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 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
571
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
572 } else if (node instanceof Canonicalizable) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
573 Node canonical = ((Canonicalizable) node).canonical(new PECanonicalizerTool());
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
574 if (canonical == null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
575 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
576 * This is a possible return value of canonicalization. However, we might need to
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
577 * add additional usages later on for which we need a node. Therefore, we just do
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
578 * nothing and leave the node in place.
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 } else if (canonical != node) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
581 if (!canonical.isAlive()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
582 assert !canonical.isDeleted();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
583 canonical = methodScope.graph.addOrUniqueWithInputs(canonical);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
584 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
585 assert node.hasNoUsages();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
586 // methodScope.graph.replaceFloating((FloatingNode) node, canonical);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
587 return canonical;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
588 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
589 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
590 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
591 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
592
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
593 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
594 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
595 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
596
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.isInlinedMethod()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
598 if (node instanceof SimpleInfopointNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
599 methodScope.bytecodePosition = InliningUtil.processSimpleInfopoint(methodScope.invoke, (SimpleInfopointNode) node, methodScope.bytecodePosition);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
600 return node;
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 (node instanceof FrameState) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
603 FrameState stateAtExceptionEdge = null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
604 if (methodScope.invoke instanceof InvokeWithExceptionNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
605 InvokeWithExceptionNode invokeWithException = ((InvokeWithExceptionNode) methodScope.invoke);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
606 ExceptionObjectNode obj = (ExceptionObjectNode) invokeWithException.exceptionEdge();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
607 stateAtExceptionEdge = obj.stateAfter();
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 if (methodScope.outerFrameState == null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
610 FrameState stateAtReturn = methodScope.invoke.stateAfter();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
611 Kind invokeReturnKind = methodScope.invoke.asNode().getKind();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
612 methodScope.outerFrameState = stateAtReturn.duplicateModifiedDuringCall(methodScope.invoke.bci(), invokeReturnKind);
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 return InliningUtil.processFrameState((FrameState) node, methodScope.invoke, methodScope.method, stateAtExceptionEdge, methodScope.outerFrameState, true);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
615
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
616 } else if (node instanceof MonitorIdNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
617 InliningUtil.processMonitorId(methodScope.invoke, (MonitorIdNode) node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
618 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
619 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
620 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
621
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
622 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
623 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
624 }