Mercurial > hg > graal-compiler
annotate graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java @ 14947:3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Wed, 02 Apr 2014 10:06:49 +0200 |
parents | ea57ed7085cf |
children | bc72e5ed9752 |
rev | line source |
---|---|
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1 /* |
9003
a8fea2979e63
eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents:
8660
diff
changeset
|
2 * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
4 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
8 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
14 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
18 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
21 * questions. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
22 */ |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
23 package com.oracle.graal.java; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
24 |
11839
0e2cceed1caf
Temporarily move encodeDeoptActionAndReason to MetaAccessProvider
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11837
diff
changeset
|
25 import static com.oracle.graal.api.meta.DeoptimizationAction.*; |
8227
ce91d45f0b1b
uses static import to reduce noise
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
26 import static com.oracle.graal.api.meta.DeoptimizationReason.*; |
5568
fdf19fa15ce4
Split bytecode utilities into separate project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5547
diff
changeset
|
27 import static com.oracle.graal.bytecode.Bytecodes.*; |
9675
a54720257b76
replaced MonitorEnterStub and MonitorExitStub with use of RuntimeCallStub
Doug Simon <doug.simon@oracle.com>
parents:
9601
diff
changeset
|
28 import static com.oracle.graal.java.GraphBuilderPhase.RuntimeCalls.*; |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9837
diff
changeset
|
29 import static com.oracle.graal.phases.GraalOptions.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
30 import static java.lang.reflect.Modifier.*; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
31 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
32 import java.lang.reflect.*; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
33 import java.util.*; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
34 |
5510
426c605c9d3c
Move cri.ci to api.code.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5507
diff
changeset
|
35 import com.oracle.graal.api.code.*; |
5507
dc71b06d09f8
Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5506
diff
changeset
|
36 import com.oracle.graal.api.meta.*; |
8610
5407d1dd6450
API to access nullness profiling information for instanceof, checkcast, and aastore
Christian Haeubl <haeubl@ssw.jku.at>
parents:
8461
diff
changeset
|
37 import com.oracle.graal.api.meta.ProfilingInfo.TriState; |
6539
2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
6534
diff
changeset
|
38 import com.oracle.graal.api.meta.ResolvedJavaType.Representation; |
5568
fdf19fa15ce4
Split bytecode utilities into separate project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5547
diff
changeset
|
39 import com.oracle.graal.bytecode.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
40 import com.oracle.graal.debug.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
41 import com.oracle.graal.graph.*; |
14922
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14906
diff
changeset
|
42 import com.oracle.graal.graph.Node.ValueNumberable; |
14827
2ed3233503b8
Starting point of the baseline bytecode parser
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14826
diff
changeset
|
43 import com.oracle.graal.java.BciBlockMapping.BciBlock; |
5256
1e153fdac9fb
Fix and simplify exception handling in the bytecode parser
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5255
diff
changeset
|
44 import com.oracle.graal.java.BciBlockMapping.ExceptionDispatchBlock; |
14533
e5235120893c
split BciBlockMapping liveness calculation into fast and slow path
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14521
diff
changeset
|
45 import com.oracle.graal.java.BciBlockMapping.LocalLiveness; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
46 import com.oracle.graal.nodes.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
47 import com.oracle.graal.nodes.calc.*; |
14000
958c99d0790c
Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents:
13938
diff
changeset
|
48 import com.oracle.graal.nodes.calc.FloatConvertNode.FloatConvert; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
49 import com.oracle.graal.nodes.extended.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
50 import com.oracle.graal.nodes.java.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
51 import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
52 import com.oracle.graal.nodes.type.*; |
5210
e3e7542d78b7
Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5160
diff
changeset
|
53 import com.oracle.graal.nodes.util.*; |
6525
2c913b643422
rename packages in graal.phases to match project name
Doug Simon <doug.simon@oracle.com>
parents:
6521
diff
changeset
|
54 import com.oracle.graal.phases.*; |
13585 | 55 import com.oracle.graal.phases.tiers.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
56 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
57 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
58 * The {@code GraphBuilder} class parses the bytecode of a method and builds the IR graph. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
59 */ |
13585 | 60 public class GraphBuilderPhase extends BasePhase<HighTierContext> { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
61 |
7558
223f645acb9b
added compilation rate measurements on top of existing metric/timer facility - enabled with -Dgraal.benchmark.compilation=true
Doug Simon <doug.simon@oracle.com>
parents:
7530
diff
changeset
|
62 public static final class RuntimeCalls { |
223f645acb9b
added compilation rate measurements on top of existing metric/timer facility - enabled with -Dgraal.benchmark.compilation=true
Doug Simon <doug.simon@oracle.com>
parents:
7530
diff
changeset
|
63 |
14045
7b5269608cb3
put tighter types on some builtin operations
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
14024
diff
changeset
|
64 public static final ForeignCallDescriptor CREATE_NULL_POINTER_EXCEPTION = new ForeignCallDescriptor("createNullPointerException", NullPointerException.class); |
14579
c98fa2ed91d9
fix return type of createOutOfBoundsException foreign call
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14533
diff
changeset
|
65 public static final ForeignCallDescriptor CREATE_OUT_OF_BOUNDS_EXCEPTION = new ForeignCallDescriptor("createOutOfBoundsException", ArrayIndexOutOfBoundsException.class, int.class); |
7558
223f645acb9b
added compilation rate measurements on top of existing metric/timer facility - enabled with -Dgraal.benchmark.compilation=true
Doug Simon <doug.simon@oracle.com>
parents:
7530
diff
changeset
|
66 } |
6521
2a0c9f20baa1
consolidated framework for runtime and stub calls and moved declaration of descriptors for such calls to the source file in which they are used
Doug Simon <doug.simon@oracle.com>
parents:
6511
diff
changeset
|
67 |
5109
6766253384bf
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5105
diff
changeset
|
68 private final GraphBuilderConfiguration graphBuilderConfig; |
11639
fe748819e31c
removed the IterableNodeType marker interface from BlockPlaceholderNode (GRAAL-471)
Doug Simon <doug.simon@oracle.com>
parents:
11631
diff
changeset
|
69 |
13585 | 70 public GraphBuilderPhase(GraphBuilderConfiguration graphBuilderConfig) { |
5109
6766253384bf
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5105
diff
changeset
|
71 this.graphBuilderConfig = graphBuilderConfig; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
72 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
73 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
74 @Override |
13585 | 75 protected void run(StructuredGraph graph, HighTierContext context) { |
76 new Instance(context.getMetaAccess(), graphBuilderConfig, context.getOptimisticOptimizations()).run(graph); | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
77 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
78 |
13585 | 79 public static class Instance extends Phase { |
80 | |
81 private LineNumberTable lnt; | |
82 private int previousLineNumber; | |
83 private int currentLineNumber; | |
84 | |
85 protected StructuredGraph currentGraph; | |
86 | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
87 private final MetaAccessProvider metaAccess; |
13585 | 88 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
89 private BytecodeParser parser; |
13585 | 90 |
91 private ValueNode methodSynchronizedObject; | |
92 private ExceptionDispatchBlock unwindBlock; | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
93 |
13585 | 94 private FixedWithNextNode lastInstr; // the last instruction added |
95 | |
96 private final GraphBuilderConfiguration graphBuilderConfig; | |
97 private final OptimisticOptimizations optimisticOpts; | |
98 | |
99 /** | |
100 * Node that marks the begin of block during bytecode parsing. When a block is identified | |
101 * the first time as a jump target, the placeholder is created and used as the successor for | |
102 * the jump. When the block is seen the second time, a {@link MergeNode} is created to | |
103 * correctly merge the now two different predecessor states. | |
104 */ | |
14758
c612c2742a4f
extend graph builder and CompilationResult for substrateVM
Erik Eckstein <erik.eckstein@oracle.com>
parents:
14746
diff
changeset
|
105 protected static class BlockPlaceholderNode extends FixedWithNextNode { |
13585 | 106 |
107 /* | |
108 * Cannot be explicitly declared as a Node type since it is not an input; would cause | |
109 * the !NODE_CLASS.isAssignableFrom(type) guarantee in | |
110 * NodeClass.FieldScanner.scanField() to fail. | |
111 */ | |
112 private final Object nextPlaceholder; | |
113 | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
114 public BlockPlaceholderNode(BytecodeParser builder) { |
13585 | 115 super(StampFactory.forVoid()); |
116 nextPlaceholder = builder.placeholders; | |
117 builder.placeholders = this; | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
118 } |
13585 | 119 |
120 BlockPlaceholderNode nextPlaceholder() { | |
121 return (BlockPlaceholderNode) nextPlaceholder; | |
122 } | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
123 } |
13585 | 124 |
14827
2ed3233503b8
Starting point of the baseline bytecode parser
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14826
diff
changeset
|
125 private BciBlock[] loopHeaders; |
14533
e5235120893c
split BciBlockMapping liveness calculation into fast and slow path
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14521
diff
changeset
|
126 private LocalLiveness liveness; |
13585 | 127 |
128 /** | |
129 * Gets the current frame state being processed by this builder. | |
130 */ | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
131 protected AbstractFrameStateBuilder<ValueNode> getCurrentFrameState() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
132 return parser.getFrameState(); |
13585 | 133 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
134 |
13585 | 135 /** |
136 * Gets the graph being processed by this builder. | |
137 */ | |
138 protected StructuredGraph getGraph() { | |
139 return currentGraph; | |
140 } | |
141 | |
142 public Instance(MetaAccessProvider metaAccess, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts) { | |
143 this.graphBuilderConfig = graphBuilderConfig; | |
144 this.optimisticOpts = optimisticOpts; | |
145 this.metaAccess = metaAccess; | |
146 assert metaAccess != null; | |
147 } | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
148 |
13585 | 149 @Override |
150 protected void run(StructuredGraph graph) { | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
151 ResolvedJavaMethod method = graph.method(); |
13585 | 152 if (graphBuilderConfig.eagerInfopointMode()) { |
153 lnt = method.getLineNumberTable(); | |
154 previousLineNumber = -1; | |
155 } | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
156 int entryBCI = graph.getEntryBCI(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
157 ProfilingInfo profilingInfo = method.getProfilingInfo(); |
13585 | 158 assert method.getCode() != null : "method must contain bytecodes: " + method; |
159 unwindBlock = null; | |
160 methodSynchronizedObject = null; | |
161 this.currentGraph = graph; | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
162 HIRFrameStateBuilder frameState = new HIRFrameStateBuilder(method, graph, graphBuilderConfig.eagerResolving()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
163 this.parser = new BytecodeParser(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, new BytecodeStream(method.getCode()), profilingInfo, method.getConstantPool(), |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
164 entryBCI); |
13585 | 165 TTY.Filter filter = new TTY.Filter(PrintFilter.getValue(), method); |
166 try { | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
167 parser.build(); |
13585 | 168 } finally { |
169 filter.remove(); | |
170 } | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
171 parser = null; |
13585 | 172 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
173 |
13585 | 174 @Override |
175 protected String getDetailedName() { | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
176 return getName() + " " + MetaUtil.format("%H.%n(%p):%r", parser.getMethod()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
177 } |
13585 | 178 |
179 public static class ExceptionInfo { | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
180 |
13585 | 181 public final FixedWithNextNode exceptionEdge; |
182 public final ValueNode exception; | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
183 |
13585 | 184 public ExceptionInfo(FixedWithNextNode exceptionEdge, ValueNode exception) { |
185 this.exceptionEdge = exceptionEdge; | |
186 this.exception = exception; | |
187 } | |
188 } | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
189 |
13585 | 190 private static class Target { |
191 | |
192 FixedNode fixed; | |
14792
b9805a622546
Created abstract class FrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14068
diff
changeset
|
193 HIRFrameStateBuilder state; |
13585 | 194 |
14792
b9805a622546
Created abstract class FrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14068
diff
changeset
|
195 public Target(FixedNode fixed, HIRFrameStateBuilder state) { |
13585 | 196 this.fixed = fixed; |
197 this.state = state; | |
198 } | |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6699
diff
changeset
|
199 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6699
diff
changeset
|
200 |
14902
c25b121d36ec
Rename BytecodeParseHelper to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14901
diff
changeset
|
201 class BytecodeParser extends AbstractBytecodeParser<ValueNode, HIRFrameStateBuilder> { |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
202 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
203 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
204 * Head of placeholder list. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
205 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
206 public BlockPlaceholderNode placeholders; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
207 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
208 public BytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
209 HIRFrameStateBuilder frameState, BytecodeStream stream, ProfilingInfo profilingInfo, ConstantPool constantPool, int entryBCI) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
210 super(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, stream, profilingInfo, constantPool, entryBCI); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
211 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
212 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
213 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
214 protected void build() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
215 if (PrintProfilingInformation.getValue()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
216 TTY.println("Profiling info for " + MetaUtil.format("%H.%n(%p)", method)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
217 TTY.println(MetaUtil.indent(MetaUtil.profileToString(profilingInfo, method, CodeUtil.NEW_LINE), " ")); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
218 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
219 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
220 try (Indent indent = Debug.logAndIndent("build graph for %s", method)) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
221 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
222 // compute the block map, setup exception handlers and get the entrypoint(s) |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
223 BciBlockMapping blockMap = BciBlockMapping.create(method); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
224 loopHeaders = blockMap.loopHeaders; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
225 liveness = blockMap.liveness; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
226 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
227 lastInstr = currentGraph.start(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
228 if (isSynchronized(method.getModifiers())) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
229 // add a monitor enter to the start block |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
230 currentGraph.start().setStateAfter(frameState.create(FrameState.BEFORE_BCI)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
231 methodSynchronizedObject = synchronizedObject(frameState, method); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
232 lastInstr = genMonitorEnter(methodSynchronizedObject); |
5210
e3e7542d78b7
Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5160
diff
changeset
|
233 } |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
234 frameState.clearNonLiveLocals(blockMap.startBlock, liveness, true); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
235 ((StateSplit) lastInstr).setStateAfter(frameState.create(0)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
236 finishPrepare(lastInstr); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
237 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
238 if (graphBuilderConfig.eagerInfopointMode()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
239 InfopointNode ipn = currentGraph.add(new InfopointNode(InfopointReason.METHOD_START, frameState.create(0))); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
240 lastInstr.setNext(ipn); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
241 lastInstr = ipn; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
242 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
243 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
244 currentBlock = blockMap.startBlock; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
245 blockMap.startBlock.entryState = frameState; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
246 if (blockMap.startBlock.isLoopHeader) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
247 /* |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
248 * TODO(lstadler,gduboscq) createTarget might not be safe at this position, |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
249 * since it expects currentBlock, etc. to be set up correctly. A better |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
250 * solution to this problem of start blocks that are loop headers would be |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
251 * to create a dummy block in BciBlockMapping. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
252 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
253 appendGoto(createTarget(blockMap.startBlock, frameState)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
254 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
255 blockMap.startBlock.firstInstruction = lastInstr; |
13585 | 256 } |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7522
diff
changeset
|
257 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
258 for (BciBlock block : blockMap.blocks) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
259 processBlock(block); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
260 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
261 processBlock(unwindBlock); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
262 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
263 Debug.dump(currentGraph, "After bytecode parsing"); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
264 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
265 connectLoopEndToBegin(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
266 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
267 // remove Placeholders |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
268 for (BlockPlaceholderNode n = placeholders; n != null; n = n.nextPlaceholder()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
269 if (!n.isDeleted()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
270 currentGraph.removeFixed(n); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
271 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
272 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
273 placeholders = null; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
274 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
275 // remove dead FrameStates |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
276 for (Node n : currentGraph.getNodes(FrameState.class)) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
277 if (n.usages().isEmpty() && n.predecessor() == null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
278 n.safeDelete(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
279 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
280 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
281 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
282 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
283 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
284 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
285 * A hook for derived classes to modify the graph start instruction or append new |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
286 * instructions to it. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
287 * |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
288 * @param startInstr The start instruction of the graph. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
289 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
290 protected void finishPrepare(FixedWithNextNode startInstr) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
291 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
292 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
293 private BciBlock unwindBlock(int bci) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
294 if (unwindBlock == null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
295 unwindBlock = new ExceptionDispatchBlock(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
296 unwindBlock.startBci = -1; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
297 unwindBlock.endBci = -1; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
298 unwindBlock.deoptBci = bci; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
299 unwindBlock.setId(Integer.MAX_VALUE); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
300 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
301 return unwindBlock; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
302 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
303 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
304 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
305 * @param type the unresolved type of the constant |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
306 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
307 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
308 protected void handleUnresolvedLoadConstant(JavaType type) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
309 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
310 append(new DeoptimizeNode(InvalidateRecompile, Unresolved)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
311 frameState.push(Kind.Object, appendConstant(Constant.NULL_OBJECT)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
312 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
313 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
314 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
315 * @param type the unresolved type of the type check |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
316 * @param object the object value whose type is being checked against {@code type} |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
317 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
318 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
319 protected void handleUnresolvedCheckCast(JavaType type, ValueNode object) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
320 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
321 append(new FixedGuardNode(currentGraph.unique(new IsNullNode(object)), Unresolved, InvalidateRecompile)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
322 frameState.apush(appendConstant(Constant.NULL_OBJECT)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
323 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
324 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
325 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
326 * @param type the unresolved type of the type check |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
327 * @param object the object value whose type is being checked against {@code type} |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
328 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
329 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
330 protected void handleUnresolvedInstanceOf(JavaType type, ValueNode object) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
331 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
332 BlockPlaceholderNode successor = currentGraph.add(new BlockPlaceholderNode(this)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
333 DeoptimizeNode deopt = currentGraph.add(new DeoptimizeNode(InvalidateRecompile, Unresolved)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
334 append(new IfNode(currentGraph.unique(new IsNullNode(object)), successor, deopt, 1)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
335 lastInstr = successor; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
336 frameState.ipush(appendConstant(Constant.INT_0)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
337 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
338 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
339 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
340 * @param type the type being instantiated |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
341 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
342 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
343 protected void handleUnresolvedNewInstance(JavaType type) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
344 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
345 append(new DeoptimizeNode(InvalidateRecompile, Unresolved)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
346 frameState.apush(appendConstant(Constant.NULL_OBJECT)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
347 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
348 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
349 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
350 * @param type the type of the array being instantiated |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
351 * @param length the length of the array |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
352 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
353 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
354 protected void handleUnresolvedNewObjectArray(JavaType type, ValueNode length) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
355 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
356 append(new DeoptimizeNode(InvalidateRecompile, Unresolved)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
357 frameState.apush(appendConstant(Constant.NULL_OBJECT)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
358 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
359 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
360 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
361 * @param type the type being instantiated |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
362 * @param dims the dimensions for the multi-array |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
363 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
364 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
365 protected void handleUnresolvedNewMultiArray(JavaType type, List<ValueNode> dims) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
366 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
367 append(new DeoptimizeNode(InvalidateRecompile, Unresolved)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
368 frameState.apush(appendConstant(Constant.NULL_OBJECT)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
369 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
370 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
371 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
372 * @param field the unresolved field |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
373 * @param receiver the object containing the field or {@code null} if {@code field} is |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
374 * static |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
375 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
376 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
377 protected void handleUnresolvedLoadField(JavaField field, ValueNode receiver) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
378 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
379 Kind kind = field.getKind(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
380 append(new DeoptimizeNode(InvalidateRecompile, Unresolved)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
381 frameState.push(kind.getStackKind(), appendConstant(Constant.defaultForKind(kind))); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
382 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
383 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
384 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
385 * @param field the unresolved field |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
386 * @param value the value being stored to the field |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
387 * @param receiver the object containing the field or {@code null} if {@code field} is |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
388 * static |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
389 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
390 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
391 protected void handleUnresolvedStoreField(JavaField field, ValueNode value, ValueNode receiver) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
392 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
393 append(new DeoptimizeNode(InvalidateRecompile, Unresolved)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
394 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
395 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
396 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
397 * @param representation |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
398 * @param type |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
399 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
400 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
401 protected void handleUnresolvedExceptionType(Representation representation, JavaType type) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
402 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
403 append(new DeoptimizeNode(InvalidateRecompile, Unresolved)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
404 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
405 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
406 protected void handleUnresolvedInvoke(JavaMethod javaMethod, InvokeKind invokeKind) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
407 assert !graphBuilderConfig.eagerResolving(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
408 boolean withReceiver = invokeKind != InvokeKind.Static; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
409 append(new DeoptimizeNode(InvalidateRecompile, Unresolved)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
410 frameState.popArguments(javaMethod.getSignature().getParameterSlots(withReceiver), javaMethod.getSignature().getParameterCount(withReceiver)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
411 Kind kind = javaMethod.getSignature().getReturnKind(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
412 if (kind != Kind.Void) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
413 frameState.push(kind.getStackKind(), appendConstant(Constant.defaultForKind(kind))); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
414 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
415 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
416 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
417 private DispatchBeginNode handleException(ValueNode exceptionObject, int bci) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
418 assert bci == FrameState.BEFORE_BCI || bci == bci() : "invalid bci"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
419 Debug.log("Creating exception dispatch edges at %d, exception object=%s, exception seen=%s", bci, exceptionObject, profilingInfo.getExceptionSeen(bci)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
420 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
421 BciBlock dispatchBlock = currentBlock.exceptionDispatchBlock(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
422 /* |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
423 * The exception dispatch block is always for the last bytecode of a block, so if we |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
424 * are not at the endBci yet, there is no exception handler for this bci and we can |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
425 * unwind immediately. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
426 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
427 if (bci != currentBlock.endBci || dispatchBlock == null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
428 dispatchBlock = unwindBlock(bci); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
429 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
430 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
431 HIRFrameStateBuilder dispatchState = frameState.copy(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
432 dispatchState.clearStack(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
433 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
434 DispatchBeginNode dispatchBegin; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
435 if (exceptionObject == null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
436 dispatchBegin = currentGraph.add(new ExceptionObjectNode(metaAccess)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
437 dispatchState.apush(dispatchBegin); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
438 dispatchState.setRethrowException(true); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
439 dispatchBegin.setStateAfter(dispatchState.create(bci)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
440 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
441 dispatchBegin = currentGraph.add(new DispatchBeginNode()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
442 dispatchBegin.setStateAfter(dispatchState.create(bci)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
443 dispatchState.apush(exceptionObject); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
444 dispatchState.setRethrowException(true); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
445 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
446 FixedNode target = createTarget(dispatchBlock, dispatchState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
447 finishInstruction(dispatchBegin, dispatchState).setNext(target); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
448 return dispatchBegin; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
449 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
450 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
451 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
452 protected ValueNode genLoadIndexed(ValueNode array, ValueNode index, Kind kind) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
453 return new LoadIndexedNode(array, index, kind); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
454 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
455 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
456 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
457 protected ValueNode genStoreIndexed(ValueNode array, ValueNode index, Kind kind, ValueNode value) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
458 return new StoreIndexedNode(array, index, kind, value); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
459 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
460 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
461 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
462 protected ValueNode genIntegerAdd(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
463 return new IntegerAddNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
464 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
465 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
466 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
467 protected ValueNode genIntegerSub(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
468 return new IntegerSubNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
469 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
470 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
471 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
472 protected ValueNode genIntegerMul(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
473 return new IntegerMulNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
474 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
475 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
476 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
477 protected ValueNode genFloatAdd(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
478 return new FloatAddNode(StampFactory.forKind(kind), x, y, isStrictFP); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
479 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
480 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
481 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
482 protected ValueNode genFloatSub(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
483 return new FloatSubNode(StampFactory.forKind(kind), x, y, isStrictFP); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
484 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
485 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
486 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
487 protected ValueNode genFloatMul(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
488 return new FloatMulNode(StampFactory.forKind(kind), x, y, isStrictFP); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
489 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
490 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
491 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
492 protected ValueNode genFloatDiv(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
493 return new FloatDivNode(StampFactory.forKind(kind), x, y, isStrictFP); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
494 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
495 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
496 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
497 protected ValueNode genFloatRem(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
498 return new FloatRemNode(StampFactory.forKind(kind), x, y, isStrictFP); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
499 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
500 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
501 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
502 protected ValueNode genIntegerDiv(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
503 return new IntegerDivNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
504 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
505 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
506 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
507 protected ValueNode genIntegerRem(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
508 return new IntegerRemNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
509 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
510 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
511 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
512 protected ValueNode genNegateOp(ValueNode x) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
513 return (new NegateNode(x)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
514 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
515 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
516 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
517 protected ValueNode genLeftShift(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
518 return new LeftShiftNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
519 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
520 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
521 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
522 protected ValueNode genRightShift(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
523 return new RightShiftNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
524 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
525 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
526 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
527 protected ValueNode genUnsignedRightShift(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
528 return new UnsignedRightShiftNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
529 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
530 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
531 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
532 protected ValueNode genAnd(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
533 return new AndNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
534 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
535 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
536 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
537 protected ValueNode genOr(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
538 return new OrNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
539 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
540 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
541 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
542 protected ValueNode genXor(Kind kind, ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
543 return new XorNode(StampFactory.forKind(kind), x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
544 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
545 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
546 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
547 protected ValueNode genNormalizeCompare(ValueNode x, ValueNode y, boolean isUnorderedLess) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
548 return new NormalizeCompareNode(x, y, isUnorderedLess); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
549 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
550 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
551 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
552 protected ValueNode genFloatConvert(FloatConvert op, ValueNode input) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
553 return new FloatConvertNode(op, input); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
554 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
555 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
556 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
557 protected ValueNode genNarrow(ValueNode input, int bitCount) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
558 return new NarrowNode(input, bitCount); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
559 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
560 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
561 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
562 protected ValueNode genSignExtend(ValueNode input, int bitCount) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
563 return new SignExtendNode(input, bitCount); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
564 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
565 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
566 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
567 protected ValueNode genZeroExtend(ValueNode input, int bitCount) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
568 return new ZeroExtendNode(input, bitCount); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
569 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
570 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
571 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
572 protected ValueNode genObjectEquals(ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
573 return new ObjectEqualsNode(x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
574 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
575 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
576 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
577 protected ValueNode genIntegerEquals(ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
578 return new IntegerEqualsNode(x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
579 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
580 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
581 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
582 protected ValueNode genIntegerLessThan(ValueNode x, ValueNode y) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
583 return new IntegerLessThanNode(x, y); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
584 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
585 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
586 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
587 protected ValueNode genUnique(ValueNode x) { |
14904 | 588 return (ValueNode) currentGraph.unique((Node & ValueNumberable) x); |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
589 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
590 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
591 protected ValueNode genIf(ValueNode condition, ValueNode falseSuccessor, ValueNode trueSuccessor, double d) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
592 return new IfNode((LogicNode) condition, (FixedNode) falseSuccessor, (FixedNode) trueSuccessor, d); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
593 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
594 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
595 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
596 protected void genThrow() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
597 ValueNode exception = frameState.apop(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
598 append(new FixedGuardNode(currentGraph.unique(new IsNullNode(exception)), NullCheckException, InvalidateReprofile, true)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
599 lastInstr.setNext(handleException(exception, bci())); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
600 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
601 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
602 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
603 protected ValueNode genCheckCast(ResolvedJavaType type, ValueNode object, JavaTypeProfile profileForTypeCheck, boolean b) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
604 return new CheckCastNode(type, object, profileForTypeCheck, b); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
605 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
606 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
607 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
608 protected ValueNode genInstanceOf(ResolvedJavaType type, ValueNode object, JavaTypeProfile profileForTypeCheck) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
609 return new InstanceOfNode(type, object, profileForTypeCheck); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
610 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
611 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
612 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
613 protected ValueNode genConditional(ValueNode x) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
614 return new ConditionalNode((LogicNode) x); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
615 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
616 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
617 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
618 protected NewInstanceNode createNewInstance(ResolvedJavaType type, boolean fillContents) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
619 return new NewInstanceNode(type, fillContents); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
620 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
621 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
622 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
623 protected NewArrayNode createNewArray(ResolvedJavaType elementType, ValueNode length, boolean fillContents) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
624 return new NewArrayNode(elementType, length, fillContents); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
625 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
626 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
627 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
628 protected NewMultiArrayNode createNewMultiArray(ResolvedJavaType type, List<ValueNode> dimensions) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
629 return new NewMultiArrayNode(type, dimensions.toArray(new ValueNode[0])); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
630 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
631 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
632 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
633 protected ValueNode genLoadField(ValueNode receiver, ResolvedJavaField field) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
634 return new LoadFieldNode(receiver, field); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
635 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
636 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
637 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
638 protected void emitNullCheck(ValueNode receiver) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
639 if (ObjectStamp.isObjectNonNull(receiver.stamp())) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
640 return; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
641 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
642 BlockPlaceholderNode trueSucc = currentGraph.add(new BlockPlaceholderNode(this)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
643 BlockPlaceholderNode falseSucc = currentGraph.add(new BlockPlaceholderNode(this)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
644 append(new IfNode(currentGraph.unique(new IsNullNode(receiver)), trueSucc, falseSucc, 0.01)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
645 lastInstr = falseSucc; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
646 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
647 if (OmitHotExceptionStacktrace.getValue()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
648 ValueNode exception = ConstantNode.forObject(cachedNullPointerException, metaAccess, currentGraph); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
649 trueSucc.setNext(handleException(exception, bci())); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
650 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
651 DeferredForeignCallNode call = currentGraph.add(new DeferredForeignCallNode(CREATE_NULL_POINTER_EXCEPTION)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
652 call.setStamp(StampFactory.exactNonNull(metaAccess.lookupJavaType(CREATE_NULL_POINTER_EXCEPTION.getResultType()))); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
653 call.setStateAfter(frameState.create(bci())); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
654 trueSucc.setNext(call); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
655 call.setNext(handleException(call, bci())); |
5210
e3e7542d78b7
Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5160
diff
changeset
|
656 } |
13585 | 657 } |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
658 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
659 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
660 protected void emitBoundsCheck(ValueNode index, ValueNode length) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
661 BlockPlaceholderNode trueSucc = currentGraph.add(new BlockPlaceholderNode(this)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
662 BlockPlaceholderNode falseSucc = currentGraph.add(new BlockPlaceholderNode(this)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
663 append(new IfNode(currentGraph.unique(new IntegerBelowThanNode(index, length)), trueSucc, falseSucc, 0.99)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
664 lastInstr = trueSucc; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
665 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
666 if (OmitHotExceptionStacktrace.getValue()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
667 ValueNode exception = ConstantNode.forObject(cachedArrayIndexOutOfBoundsException, metaAccess, currentGraph); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
668 falseSucc.setNext(handleException(exception, bci())); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
669 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
670 DeferredForeignCallNode call = currentGraph.add(new DeferredForeignCallNode(CREATE_OUT_OF_BOUNDS_EXCEPTION, index)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
671 call.setStamp(StampFactory.exactNonNull(metaAccess.lookupJavaType(CREATE_OUT_OF_BOUNDS_EXCEPTION.getResultType()))); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
672 call.setStateAfter(frameState.create(bci())); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
673 falseSucc.setNext(call); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
674 call.setNext(handleException(call, bci())); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
675 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
676 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
677 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
678 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
679 protected ValueNode genArrayLength(ValueNode x) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
680 return new ArrayLengthNode(x); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
681 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
682 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
683 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
684 protected ValueNode genStoreField(ValueNode receiver, ResolvedJavaField field, ValueNode value) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
685 return new StoreFieldNode(receiver, field, value); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
686 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
687 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
688 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
689 protected void genInvokeStatic(JavaMethod target) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
690 if (target instanceof ResolvedJavaMethod) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
691 ResolvedJavaMethod resolvedTarget = (ResolvedJavaMethod) target; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
692 ResolvedJavaType holder = resolvedTarget.getDeclaringClass(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
693 if (!holder.isInitialized() && ResolveClassBeforeStaticInvoke.getValue()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
694 handleUnresolvedInvoke(target, InvokeKind.Static); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
695 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
696 ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterSlots(false), resolvedTarget.getSignature().getParameterCount(false)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
697 appendInvoke(InvokeKind.Static, resolvedTarget, args); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
698 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
699 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
700 handleUnresolvedInvoke(target, InvokeKind.Static); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
701 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
702 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
703 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
704 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
705 protected void genInvokeInterface(JavaMethod target) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
706 if (target instanceof ResolvedJavaMethod) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
707 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterSlots(true), target.getSignature().getParameterCount(true)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
708 appendInvoke(InvokeKind.Interface, (ResolvedJavaMethod) target, args); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
709 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
710 handleUnresolvedInvoke(target, InvokeKind.Interface); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
711 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
712 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
713 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
714 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
715 protected void genInvokeDynamic(JavaMethod target) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
716 if (target instanceof ResolvedJavaMethod) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
717 Object appendix = constantPool.lookupAppendix(stream.readCPI4(), Bytecodes.INVOKEDYNAMIC); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
718 if (appendix != null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
719 frameState.apush(ConstantNode.forObject(appendix, metaAccess, currentGraph)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
720 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
721 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterSlots(false), target.getSignature().getParameterCount(false)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
722 appendInvoke(InvokeKind.Static, (ResolvedJavaMethod) target, args); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
723 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
724 handleUnresolvedInvoke(target, InvokeKind.Static); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
725 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
726 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
727 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
728 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
729 protected void genInvokeVirtual(JavaMethod target) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
730 if (target instanceof ResolvedJavaMethod) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
731 /* |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
732 * Special handling for runtimes that rewrite an invocation of |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
733 * MethodHandle.invoke(...) or MethodHandle.invokeExact(...) to a static |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
734 * adapter. HotSpot does this - see |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
735 * https://wikis.oracle.com/display/HotSpotInternals/Method+handles |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
736 * +and+invokedynamic |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
737 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
738 boolean hasReceiver = !isStatic(((ResolvedJavaMethod) target).getModifiers()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
739 Object appendix = constantPool.lookupAppendix(stream.readCPI(), Bytecodes.INVOKEVIRTUAL); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
740 if (appendix != null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
741 frameState.apush(ConstantNode.forObject(appendix, metaAccess, currentGraph)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
742 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
743 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterSlots(hasReceiver), target.getSignature().getParameterCount(hasReceiver)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
744 if (hasReceiver) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
745 appendInvoke(InvokeKind.Virtual, (ResolvedJavaMethod) target, args); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
746 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
747 appendInvoke(InvokeKind.Static, (ResolvedJavaMethod) target, args); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
748 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
749 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
750 handleUnresolvedInvoke(target, InvokeKind.Virtual); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
751 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
752 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
753 } |
5210
e3e7542d78b7
Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5160
diff
changeset
|
754 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
755 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
756 protected void genInvokeSpecial(JavaMethod target) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
757 if (target instanceof ResolvedJavaMethod) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
758 assert target != null; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
759 assert target.getSignature() != null; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
760 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterSlots(true), target.getSignature().getParameterCount(true)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
761 appendInvoke(InvokeKind.Special, (ResolvedJavaMethod) target, args); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
762 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
763 handleUnresolvedInvoke(target, InvokeKind.Special); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
764 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
765 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
766 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
767 private void appendInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
768 Kind resultType = targetMethod.getSignature().getReturnKind(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
769 if (DeoptALot.getValue()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
770 append(new DeoptimizeNode(DeoptimizationAction.None, RuntimeConstraint)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
771 frameState.pushReturn(resultType, ConstantNode.defaultForKind(resultType, currentGraph)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
772 return; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
773 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
774 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
775 JavaType returnType = targetMethod.getSignature().getReturnType(method.getDeclaringClass()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
776 if (graphBuilderConfig.eagerResolving()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
777 returnType = returnType.resolve(targetMethod.getDeclaringClass()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
778 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
779 if (invokeKind != InvokeKind.Static) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
780 emitExplicitExceptions(args[0], null); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
781 if (invokeKind != InvokeKind.Special && this.optimisticOpts.useTypeCheckHints()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
782 JavaTypeProfile profile = profilingInfo.getTypeProfile(bci()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
783 args[0] = TypeProfileProxyNode.create(args[0], profile); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
784 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
785 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
786 MethodCallTargetNode callTarget = currentGraph.add(createMethodCallTarget(invokeKind, targetMethod, args, returnType)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
787 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
788 // be conservative if information was not recorded (could result in endless |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
789 // recompiles |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
790 // otherwise) |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
791 if (graphBuilderConfig.omitAllExceptionEdges() || (optimisticOpts.useExceptionProbability() && profilingInfo.getExceptionSeen(bci()) == TriState.FALSE)) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
792 createInvoke(callTarget, resultType); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
793 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
794 assert bci() == currentBlock.endBci; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
795 frameState.clearNonLiveLocals(currentBlock, liveness, false); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
796 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
797 InvokeWithExceptionNode invoke = createInvokeWithException(callTarget, resultType); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
798 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
799 BciBlock nextBlock = currentBlock.getSuccessor(0); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
800 invoke.setNext(createTarget(nextBlock, frameState)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
801 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
802 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
803 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
804 protected MethodCallTargetNode createMethodCallTarget(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, JavaType returnType) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
805 return new MethodCallTargetNode(invokeKind, targetMethod, args, returnType); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
806 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
807 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
808 protected InvokeNode createInvoke(CallTargetNode callTarget, Kind resultType) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
809 InvokeNode invoke = append(new InvokeNode(callTarget, bci())); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
810 frameState.pushReturn(resultType, invoke); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
811 return invoke; |
5210
e3e7542d78b7
Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5160
diff
changeset
|
812 } |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
813 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
814 protected InvokeWithExceptionNode createInvokeWithException(CallTargetNode callTarget, Kind resultType) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
815 DispatchBeginNode exceptionEdge = handleException(null, bci()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
816 InvokeWithExceptionNode invoke = append(new InvokeWithExceptionNode(callTarget, exceptionEdge, bci())); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
817 frameState.pushReturn(resultType, invoke); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
818 BciBlock nextBlock = currentBlock.getSuccessor(0); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
819 invoke.setStateAfter(frameState.create(nextBlock.startBci)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
820 return invoke; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
821 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
822 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
823 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
824 protected void genReturn(ValueNode x) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
825 frameState.setRethrowException(false); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
826 frameState.clearStack(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
827 if (graphBuilderConfig.eagerInfopointMode()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
828 append(new InfopointNode(InfopointReason.METHOD_END, frameState.create(bci()))); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
829 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
830 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
831 synchronizedEpilogue(FrameState.AFTER_BCI, x); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
832 if (frameState.lockDepth() != 0) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
833 throw new BailoutException("unbalanced monitors"); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
834 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
835 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
836 append(new ReturnNode(x)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
837 } |
13585 | 838 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
839 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
840 protected MonitorEnterNode genMonitorEnter(ValueNode x) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
841 MonitorIdNode monitorId = currentGraph.add(new MonitorIdNode(frameState.lockDepth())); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
842 MonitorEnterNode monitorEnter = append(new MonitorEnterNode(x, monitorId)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
843 frameState.pushLock(x, monitorId); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
844 return monitorEnter; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
845 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
846 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
847 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
848 protected MonitorExitNode genMonitorExit(ValueNode x, ValueNode returnValue) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
849 MonitorIdNode monitorId = frameState.peekMonitorId(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
850 ValueNode lockedObject = frameState.popLock(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
851 if (GraphUtil.originalValue(lockedObject) != GraphUtil.originalValue(x)) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
852 throw new BailoutException("unbalanced monitors: mismatch at monitorexit, %s != %s", GraphUtil.originalValue(x), GraphUtil.originalValue(lockedObject)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
853 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
854 MonitorExitNode monitorExit = append(new MonitorExitNode(x, monitorId, returnValue)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
855 return monitorExit; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
856 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
857 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
858 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
859 protected void genJsr(int dest) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
860 BciBlock successor = currentBlock.jsrSuccessor; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
861 assert successor.startBci == dest : successor.startBci + " != " + dest + " @" + bci(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
862 JsrScope scope = currentBlock.jsrScope; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
863 if (!successor.jsrScope.pop().equals(scope)) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
864 throw new JsrNotSupportedBailout("unstructured control flow (internal limitation)"); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
865 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
866 if (successor.jsrScope.nextReturnAddress() != getStream().nextBCI()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
867 throw new JsrNotSupportedBailout("unstructured control flow (internal limitation)"); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
868 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
869 frameState.push(Kind.Int, ConstantNode.forInt(getStream().nextBCI(), currentGraph)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
870 appendGoto(createTarget(successor, frameState)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
871 } |
13585 | 872 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
873 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
874 protected void genRet(int localIndex) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
875 BciBlock successor = currentBlock.retSuccessor; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
876 ValueNode local = frameState.loadLocal(localIndex); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
877 JsrScope scope = currentBlock.jsrScope; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
878 int retAddress = scope.nextReturnAddress(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
879 append(new FixedGuardNode(currentGraph.unique(new IntegerEqualsNode(local, ConstantNode.forInt(retAddress, currentGraph))), JavaSubroutineMismatch, InvalidateReprofile)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
880 if (!successor.jsrScope.equals(scope.pop())) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
881 throw new JsrNotSupportedBailout("unstructured control flow (ret leaves more than one scope)"); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
882 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
883 appendGoto(createTarget(successor, frameState)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
884 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
885 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
886 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
887 protected void setBlockSuccessor(ValueNode switchNode, int i, ValueNode createBlockTarget) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
888 ((IntegerSwitchNode) switchNode).setBlockSuccessor(i, (AbstractBeginNode) createBlockTarget); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
889 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
890 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
891 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
892 protected ValueNode genIntegerSwitch(ValueNode value, int size, int[] keys, double[] keyProbabilities, int[] keySuccessors) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
893 return new IntegerSwitchNode(value, size, keys, keyProbabilities, keySuccessors); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
894 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
895 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
896 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
897 protected ConstantNode appendConstant(Constant constant) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
898 assert constant != null; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
899 return ConstantNode.forConstant(constant, metaAccess, currentGraph); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
900 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
901 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
902 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
903 protected ValueNode append(ValueNode v) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
904 if (v instanceof ControlSinkNode) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
905 return append((ControlSinkNode) v); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
906 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
907 if (v instanceof ControlSplitNode) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
908 return append((ControlSplitNode) v); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
909 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
910 if (v instanceof FixedWithNextNode) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
911 return append((FixedWithNextNode) v); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
912 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
913 if (v instanceof FloatingNode) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
914 return append((FloatingNode) v); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
915 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
916 throw GraalInternalError.shouldNotReachHere("Can not append Node of type: " + v.getClass().getName()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
917 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
918 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
919 private <T extends ControlSinkNode> T append(T fixed) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
920 assert !fixed.isAlive() && !fixed.isDeleted() : "instruction should not have been appended yet"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
921 assert lastInstr.next() == null : "cannot append instruction to instruction which isn't end (" + lastInstr + "->" + lastInstr.next() + ")"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
922 T added = currentGraph.add(fixed); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
923 lastInstr.setNext(added); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
924 lastInstr = null; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
925 return added; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
926 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
927 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
928 private <T extends ControlSplitNode> T append(T fixed) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
929 assert !fixed.isAlive() && !fixed.isDeleted() : "instruction should not have been appended yet"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
930 assert lastInstr.next() == null : "cannot append instruction to instruction which isn't end (" + lastInstr + "->" + lastInstr.next() + ")"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
931 T added = currentGraph.add(fixed); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
932 lastInstr.setNext(added); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
933 lastInstr = null; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
934 return added; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
935 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
936 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
937 protected <T extends FixedWithNextNode> T append(T fixed) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
938 assert !fixed.isAlive() && !fixed.isDeleted() : "instruction should not have been appended yet"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
939 assert lastInstr.next() == null : "cannot append instruction to instruction which isn't end (" + lastInstr + "->" + lastInstr.next() + ")"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
940 T added = currentGraph.add(fixed); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
941 lastInstr.setNext(added); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
942 lastInstr = added; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
943 return added; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
944 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
945 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
946 private <T extends FloatingNode> T append(T v) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
947 assert !(v instanceof ConstantNode); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
948 T added = currentGraph.unique(v); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
949 return added; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
950 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
951 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
952 private Target checkLoopExit(FixedNode target, BciBlock targetBlock, HIRFrameStateBuilder state) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
953 if (currentBlock != null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
954 long exits = currentBlock.loops & ~targetBlock.loops; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
955 if (exits != 0) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
956 LoopExitNode firstLoopExit = null; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
957 LoopExitNode lastLoopExit = null; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
958 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
959 int pos = 0; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
960 ArrayList<BciBlock> exitLoops = new ArrayList<>(Long.bitCount(exits)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
961 do { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
962 long lMask = 1L << pos; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
963 if ((exits & lMask) != 0) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
964 exitLoops.add(loopHeaders[pos]); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
965 exits &= ~lMask; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
966 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
967 pos++; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
968 } while (exits != 0); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
969 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
970 Collections.sort(exitLoops, new Comparator<BciBlock>() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
971 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
972 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
973 public int compare(BciBlock o1, BciBlock o2) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
974 return Long.bitCount(o2.loops) - Long.bitCount(o1.loops); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
975 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
976 }); |
5210
e3e7542d78b7
Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5160
diff
changeset
|
977 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
978 int bci = targetBlock.startBci; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
979 if (targetBlock instanceof ExceptionDispatchBlock) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
980 bci = ((ExceptionDispatchBlock) targetBlock).deoptBci; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
981 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
982 HIRFrameStateBuilder newState = state.copy(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
983 for (BciBlock loop : exitLoops) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
984 LoopBeginNode loopBegin = (LoopBeginNode) loop.firstInstruction; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
985 LoopExitNode loopExit = currentGraph.add(new LoopExitNode(loopBegin)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
986 if (lastLoopExit != null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
987 lastLoopExit.setNext(loopExit); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
988 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
989 if (firstLoopExit == null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
990 firstLoopExit = loopExit; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
991 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
992 lastLoopExit = loopExit; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
993 Debug.log("Target %s (%s) Exits %s, scanning framestates...", targetBlock, target, loop); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
994 newState.insertLoopProxies(loopExit, loop.entryState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
995 loopExit.setStateAfter(newState.create(bci)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
996 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
997 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
998 lastLoopExit.setNext(target); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
999 return new Target(firstLoopExit, newState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1000 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1001 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1002 return new Target(target, state); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1003 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1004 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1005 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1006 protected ValueNode genDeoptimization() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1007 return currentGraph.add(new DeoptimizeNode(InvalidateReprofile, UnreachedCode)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1008 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1009 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1010 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1011 protected FixedNode createTarget(double probability, BciBlock block, AbstractFrameStateBuilder<ValueNode> stateAfter) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1012 ValueNode fixed = super.createTarget(probability, block, stateAfter); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1013 assert fixed instanceof FixedNode; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1014 return (FixedNode) fixed; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1015 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1016 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1017 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1018 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1019 protected FixedNode createTarget(BciBlock block, AbstractFrameStateBuilder<ValueNode> abstractState) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1020 assert abstractState instanceof HIRFrameStateBuilder; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1021 HIRFrameStateBuilder state = (HIRFrameStateBuilder) abstractState; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1022 assert block != null && state != null; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1023 assert !block.isExceptionEntry || state.stackSize() == 1; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1024 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1025 if (block.firstInstruction == null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1026 /* |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1027 * This is the first time we see this block as a branch target. Create and |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1028 * return a placeholder that later can be replaced with a MergeNode when we see |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1029 * this block again. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1030 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1031 block.firstInstruction = currentGraph.add(new BlockPlaceholderNode(this)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1032 Target target = checkLoopExit(block.firstInstruction, block, state); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1033 FixedNode result = target.fixed; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1034 block.entryState = target.state == state ? state.copy() : target.state; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1035 block.entryState.clearNonLiveLocals(block, liveness, true); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1036 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1037 Debug.log("createTarget %s: first visit, result: %s", block, block.firstInstruction); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1038 return result; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1039 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1040 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1041 // We already saw this block before, so we have to merge states. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1042 if (!block.entryState.isCompatibleWith(state)) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1043 throw new BailoutException("stacks do not match; bytecodes would not verify"); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1044 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1045 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1046 if (block.firstInstruction instanceof LoopBeginNode) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1047 assert block.isLoopHeader && currentBlock.getId() >= block.getId() : "must be backward branch"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1048 /* |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1049 * Backward loop edge. We need to create a special LoopEndNode and merge with |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1050 * the loop begin node created before. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1051 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1052 LoopBeginNode loopBegin = (LoopBeginNode) block.firstInstruction; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1053 Target target = checkLoopExit(currentGraph.add(new LoopEndNode(loopBegin)), block, state); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1054 FixedNode result = target.fixed; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1055 block.entryState.merge(loopBegin, target.state); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1056 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1057 Debug.log("createTarget %s: merging backward branch to loop header %s, result: %s", block, loopBegin, result); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1058 return result; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1059 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1060 assert currentBlock == null || currentBlock.getId() < block.getId() : "must not be backward branch"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1061 assert block.firstInstruction.next() == null : "bytecodes already parsed for block"; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1062 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1063 if (block.firstInstruction instanceof BlockPlaceholderNode) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1064 /* |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1065 * This is the second time we see this block. Create the actual MergeNode and |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1066 * the End Node for the already existing edge. For simplicity, we leave the |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1067 * placeholder in the graph and just append the new nodes after the placeholder. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1068 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1069 BlockPlaceholderNode placeholder = (BlockPlaceholderNode) block.firstInstruction; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1070 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1071 // The EndNode for the already existing edge. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1072 AbstractEndNode end = currentGraph.add(new EndNode()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1073 // The MergeNode that replaces the placeholder. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1074 MergeNode mergeNode = currentGraph.add(new MergeNode()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1075 FixedNode next = placeholder.next(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1076 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1077 placeholder.setNext(end); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1078 mergeNode.addForwardEnd(end); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1079 mergeNode.setNext(next); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1080 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1081 block.firstInstruction = mergeNode; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1082 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1083 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1084 MergeNode mergeNode = (MergeNode) block.firstInstruction; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1085 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1086 // The EndNode for the newly merged edge. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1087 AbstractEndNode newEnd = currentGraph.add(new EndNode()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1088 Target target = checkLoopExit(newEnd, block, state); |
13585 | 1089 FixedNode result = target.fixed; |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1090 block.entryState.merge(mergeNode, target.state); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1091 mergeNode.addForwardEnd(newEnd); |
13585 | 1092 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1093 Debug.log("createTarget %s: merging state, result: %s", block, result); |
13585 | 1094 return result; |
1095 } | |
1096 | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1097 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1098 * Returns a block begin node with the specified state. If the specified probability is |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1099 * 0, the block deoptimizes immediately. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1100 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1101 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1102 protected AbstractBeginNode createBlockTarget(double probability, BciBlock block, AbstractFrameStateBuilder<ValueNode> stateAfter) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1103 FixedNode target = createTarget(probability, block, stateAfter); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1104 AbstractBeginNode begin = AbstractBeginNode.begin(target); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1105 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1106 assert !(target instanceof DeoptimizeNode && begin.stateAfter() != null) : "We are not allowed to set the stateAfter of the begin node, because we have to deoptimize " |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1107 + "to a bci _before_ the actual if, so that the interpreter can update the profiling information."; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1108 return begin; |
13585 | 1109 } |
5051
2ab527c53dba
another fix for goto's deopt case
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5050
diff
changeset
|
1110 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1111 private ValueNode synchronizedObject(HIRFrameStateBuilder state, ResolvedJavaMethod target) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1112 if (isStatic(target.getModifiers())) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1113 return appendConstant(target.getDeclaringClass().getEncoding(Representation.JavaClass)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1114 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1115 return state.loadLocal(0); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1116 } |
13585 | 1117 } |
1118 | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1119 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1120 protected void processBlock(BciBlock block) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1121 // Ignore blocks that have no predecessors by the time their bytecodes are parsed |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1122 if (block == null || block.firstInstruction == null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1123 Debug.log("Ignoring block %s", block); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1124 return; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1125 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1126 try (Indent indent = Debug.logAndIndent("Parsing block %s firstInstruction: %s loopHeader: %b", block, block.firstInstruction, block.isLoopHeader)) { |
5026
b11561111585
Remove FrameStateAccess: Make FrameState immutable and move all modification logic into FrameStateBuilder
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4997
diff
changeset
|
1127 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1128 lastInstr = block.firstInstruction; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1129 frameState = block.entryState; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1130 parser.setCurrentFrameState(frameState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1131 currentBlock = block; |
4614
a3882fd1ae61
Make it possible to have multiple LoopEnds per LoopBegin
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4554
diff
changeset
|
1132 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1133 frameState.cleanupDeletedPhis(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1134 if (lastInstr instanceof MergeNode) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1135 int bci = block.startBci; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1136 if (block instanceof ExceptionDispatchBlock) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1137 bci = ((ExceptionDispatchBlock) block).deoptBci; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1138 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1139 ((MergeNode) lastInstr).setStateAfter(frameState.create(bci)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1140 } |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14851
diff
changeset
|
1141 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1142 if (block == unwindBlock) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1143 frameState.setRethrowException(false); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1144 createUnwind(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1145 } else if (block instanceof ExceptionDispatchBlock) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1146 createExceptionDispatch((ExceptionDispatchBlock) block); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1147 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1148 frameState.setRethrowException(false); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1149 iterateBytecodesForBlock(block); |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14851
diff
changeset
|
1150 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14851
diff
changeset
|
1151 } |
13585 | 1152 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1153 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1154 private void connectLoopEndToBegin() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1155 for (LoopBeginNode begin : currentGraph.getNodes(LoopBeginNode.class)) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1156 if (begin.loopEnds().isEmpty()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1157 // @formatter:off |
5026
b11561111585
Remove FrameStateAccess: Make FrameState immutable and move all modification logic into FrameStateBuilder
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4997
diff
changeset
|
1158 // Remove loop header without loop ends. |
b11561111585
Remove FrameStateAccess: Make FrameState immutable and move all modification logic into FrameStateBuilder
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4997
diff
changeset
|
1159 // This can happen with degenerated loops like this one: |
b11561111585
Remove FrameStateAccess: Make FrameState immutable and move all modification logic into FrameStateBuilder
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4997
diff
changeset
|
1160 // for (;;) { |
b11561111585
Remove FrameStateAccess: Make FrameState immutable and move all modification logic into FrameStateBuilder
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4997
diff
changeset
|
1161 // try { |
b11561111585
Remove FrameStateAccess: Make FrameState immutable and move all modification logic into FrameStateBuilder
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4997
diff
changeset
|
1162 // break; |
b11561111585
Remove FrameStateAccess: Make FrameState immutable and move all modification logic into FrameStateBuilder
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4997
diff
changeset
|
1163 // } catch (UnresolvedException iioe) { |
b11561111585
Remove FrameStateAccess: Make FrameState immutable and move all modification logic into FrameStateBuilder
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4997
diff
changeset
|
1164 // } |
b11561111585
Remove FrameStateAccess: Make FrameState immutable and move all modification logic into FrameStateBuilder
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4997
diff
changeset
|
1165 // } |
7522
4cc0efe5cffe
disabled auto-formatting of manually formatted code
Doug Simon <doug.simon@oracle.com>
parents:
7305
diff
changeset
|
1166 // @formatter:on |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1167 assert begin.forwardEndCount() == 1; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1168 currentGraph.reduceDegenerateLoopBegin(begin); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1169 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1170 GraphUtil.normalizeLoopBegin(begin); |
13585 | 1171 } |
9003
a8fea2979e63
eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents:
8660
diff
changeset
|
1172 } |
a8fea2979e63
eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents:
8660
diff
changeset
|
1173 } |
a8fea2979e63
eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents:
8660
diff
changeset
|
1174 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1175 private void createUnwind() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1176 assert frameState.stackSize() == 1 : frameState; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1177 ValueNode exception = frameState.apop(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1178 append(new FixedGuardNode(currentGraph.unique(new IsNullNode(exception)), NullCheckException, InvalidateReprofile, true)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1179 synchronizedEpilogue(FrameState.AFTER_EXCEPTION_BCI, null); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1180 append(new UnwindNode(exception)); |
13585 | 1181 } |
1182 | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1183 private void synchronizedEpilogue(int bci, ValueNode returnValue) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1184 if (Modifier.isSynchronized(method.getModifiers())) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1185 MonitorExitNode monitorExit = genMonitorExit(methodSynchronizedObject, returnValue); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1186 if (returnValue != null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1187 frameState.push(returnValue.getKind(), returnValue); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1188 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1189 monitorExit.setStateAfter(frameState.create(bci)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1190 assert !frameState.rethrowException(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1191 } |
6676
090868cbcda6
Graal infrastructure for OnStackReplacement
Lukas Stadler <lukas.stadler@jku.at>
parents:
6648
diff
changeset
|
1192 } |
13585 | 1193 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1194 private void createExceptionDispatch(ExceptionDispatchBlock block) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1195 assert frameState.stackSize() == 1 : frameState; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1196 if (block.handler.isCatchAll()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1197 assert block.getSuccessorCount() == 1; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1198 appendGoto(createTarget(block.getSuccessor(0), frameState)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1199 return; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1200 } |
13585 | 1201 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1202 JavaType catchType = block.handler.getCatchType(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1203 if (graphBuilderConfig.eagerResolving()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1204 catchType = lookupType(block.handler.catchTypeCPI(), INSTANCEOF); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1205 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1206 boolean initialized = (catchType instanceof ResolvedJavaType); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1207 if (initialized && graphBuilderConfig.getSkippedExceptionTypes() != null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1208 ResolvedJavaType resolvedCatchType = (ResolvedJavaType) catchType; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1209 for (ResolvedJavaType skippedType : graphBuilderConfig.getSkippedExceptionTypes()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1210 if (skippedType.isAssignableFrom(resolvedCatchType)) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1211 BciBlock nextBlock = block.getSuccessorCount() == 1 ? unwindBlock(block.deoptBci) : block.getSuccessor(1); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1212 ValueNode exception = frameState.stackAt(0); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1213 FixedNode trueSuccessor = currentGraph.add(new DeoptimizeNode(InvalidateReprofile, UnreachedCode)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1214 FixedNode nextDispatch = createTarget(nextBlock, frameState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1215 append(new IfNode(currentGraph.unique(new InstanceOfNode((ResolvedJavaType) catchType, exception, null)), trueSuccessor, nextDispatch, 0)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1216 return; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1217 } |
13585 | 1218 } |
1219 } | |
5256
1e153fdac9fb
Fix and simplify exception handling in the bytecode parser
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5255
diff
changeset
|
1220 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1221 if (initialized) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1222 BciBlock nextBlock = block.getSuccessorCount() == 1 ? unwindBlock(block.deoptBci) : block.getSuccessor(1); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1223 ValueNode exception = frameState.stackAt(0); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1224 CheckCastNode checkCast = currentGraph.add(new CheckCastNode((ResolvedJavaType) catchType, exception, null, false)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1225 frameState.apop(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1226 frameState.push(Kind.Object, checkCast); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1227 FixedNode catchSuccessor = createTarget(block.getSuccessor(0), frameState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1228 frameState.apop(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1229 frameState.push(Kind.Object, exception); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1230 FixedNode nextDispatch = createTarget(nextBlock, frameState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1231 checkCast.setNext(catchSuccessor); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1232 append(new IfNode(currentGraph.unique(new InstanceOfNode((ResolvedJavaType) catchType, exception, null)), checkCast, nextDispatch, 0.5)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1233 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1234 handleUnresolvedExceptionType(Representation.ObjectHub, catchType); |
13585 | 1235 } |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1236 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1237 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1238 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1239 protected void appendGoto(ValueNode targetNode) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1240 assert targetNode instanceof FixedNode; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1241 FixedNode target = (FixedNode) targetNode; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1242 if (lastInstr != null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1243 lastInstr.setNext(target); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1244 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1245 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1246 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1247 private boolean isBlockEnd(Node n) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1248 return n instanceof ControlSplitNode || n instanceof ControlSinkNode; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1249 } |
13585 | 1250 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1251 @Override |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1252 protected void iterateBytecodesForBlock(BciBlock block) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1253 if (block.isLoopHeader) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1254 // Create the loop header block, which later will merge the backward branches of |
14901
b4d069921b5f
BytecodeParseHelper clean up.
Josef Eisl <josef.eisl@jku.at>
parents:
14900
diff
changeset
|
1255 // the |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1256 // loop. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1257 AbstractEndNode preLoopEnd = currentGraph.add(new EndNode()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1258 LoopBeginNode loopBegin = currentGraph.add(new LoopBeginNode()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1259 lastInstr.setNext(preLoopEnd); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1260 // Add the single non-loop predecessor of the loop header. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1261 loopBegin.addForwardEnd(preLoopEnd); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1262 lastInstr = loopBegin; |
13585 | 1263 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1264 // Create phi functions for all local variables and operand stack slots. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1265 frameState.insertLoopPhis(loopBegin); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1266 loopBegin.setStateAfter(frameState.create(block.startBci)); |
13585 | 1267 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1268 /* |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1269 * We have seen all forward branches. All subsequent backward branches will |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1270 * merge to the loop header. This ensures that the loop header has exactly one |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1271 * non-loop predecessor. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1272 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1273 block.firstInstruction = loopBegin; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1274 /* |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1275 * We need to preserve the frame state builder of the loop header so that we can |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1276 * merge values for phi functions, so make a copy of it. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1277 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1278 block.entryState = frameState.copy(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1279 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1280 Debug.log(" created loop header %s", loopBegin); |
13585 | 1281 } |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1282 assert lastInstr.next() == null : "instructions already appended at block " + block; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1283 Debug.log(" frameState: %s", frameState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1284 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1285 lastInstr = finishInstruction(lastInstr, frameState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1286 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1287 int endBCI = stream.endBCI(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1288 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1289 stream.setBCI(block.startBci); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1290 int bci = block.startBci; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1291 BytecodesParsed.add(block.endBci - bci); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1292 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1293 while (bci < endBCI) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1294 if (graphBuilderConfig.eagerInfopointMode() && lnt != null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1295 currentLineNumber = lnt.getLineNumber(bci); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1296 if (currentLineNumber != previousLineNumber) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1297 append(new InfopointNode(InfopointReason.LINE_NUMBER, frameState.create(bci))); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1298 previousLineNumber = currentLineNumber; |
13585 | 1299 } |
1300 } | |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1301 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1302 // read the opcode |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1303 int opcode = stream.currentBC(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1304 traceState(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1305 traceInstruction(bci, opcode, bci == block.startBci); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1306 if (bci == entryBCI) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1307 if (block.jsrScope != JsrScope.EMPTY_SCOPE) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1308 throw new BailoutException("OSR into a JSR scope is not supported"); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1309 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1310 EntryMarkerNode x = append(new EntryMarkerNode()); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1311 frameState.insertProxies(x); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1312 x.setStateAfter(frameState.create(bci)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1313 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1314 processBytecode(bci, opcode); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1315 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1316 if (lastInstr == null || isBlockEnd(lastInstr) || lastInstr.next() != null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1317 break; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1318 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1319 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1320 stream.next(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1321 bci = stream.currentBCI(); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1322 |
13585 | 1323 if (bci > block.endBci) { |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1324 frameState.clearNonLiveLocals(currentBlock, liveness, false); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1325 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1326 if (lastInstr instanceof StateSplit) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1327 if (lastInstr.getClass() == AbstractBeginNode.class) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1328 // BeginNodes do not need a frame state |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1329 } else { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1330 StateSplit stateSplit = (StateSplit) lastInstr; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1331 if (stateSplit.stateAfter() == null) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1332 stateSplit.setStateAfter(frameState.create(bci)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1333 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1334 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1335 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1336 lastInstr = finishInstruction(lastInstr, frameState); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1337 if (bci < endBCI) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1338 if (bci > block.endBci) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1339 assert !block.getSuccessor(0).isExceptionEntry; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1340 assert block.numNormalSuccessors() == 1; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1341 // we fell through to the next block, add a goto and break |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1342 appendGoto(createTarget(block.getSuccessor(0), frameState)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1343 break; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1344 } |
5375
3035b6b881d9
removed stateAfter field from FixedWithNextNode - now only StateSplit implementations have this field
Doug Simon <doug.simon@oracle.com>
parents:
5373
diff
changeset
|
1345 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1346 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1347 } |
13585 | 1348 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1349 /** |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1350 * A hook for derived classes to modify the last instruction or add other instructions. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1351 * |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1352 * @param instr The last instruction (= fixed node) which was added. |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1353 * @param state The current frame state. |
14906 | 1354 * @return Returns the (new) last instruction. |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1355 */ |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1356 protected FixedWithNextNode finishInstruction(FixedWithNextNode instr, HIRFrameStateBuilder state) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1357 return instr; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1358 } |
14758
c612c2742a4f
extend graph builder and CompilationResult for substrateVM
Erik Eckstein <erik.eckstein@oracle.com>
parents:
14746
diff
changeset
|
1359 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1360 private void traceState() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1361 if (traceLevel >= TRACELEVEL_STATE && Debug.isLogEnabled()) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1362 Debug.log(String.format("| state [nr locals = %d, stack depth = %d, method = %s]", frameState.localsSize(), frameState.stackSize(), method)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1363 for (int i = 0; i < frameState.localsSize(); ++i) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1364 ValueNode value = frameState.localAt(i); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1365 Debug.log(String.format("| local[%d] = %-8s : %s", i, value == null ? "bogus" : value.getKind().getJavaName(), value)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1366 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1367 for (int i = 0; i < frameState.stackSize(); ++i) { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1368 ValueNode value = frameState.stackAt(i); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1369 Debug.log(String.format("| stack[%d] = %-8s : %s", i, value == null ? "bogus" : value.getKind().getJavaName(), value)); |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1370 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1371 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1372 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1373 |
14947
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1374 @Override |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1375 protected void ifNode(ValueNode x, Condition cond, ValueNode y) { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1376 // assert !x.isDeleted() && !y.isDeleted(); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1377 // assert currentBlock.numNormalSuccessors() == 2; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1378 assert currentBlock.getSuccessors().size() == 2; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1379 BciBlock trueBlock = currentBlock.getSuccessors().get(0); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1380 BciBlock falseBlock = currentBlock.getSuccessors().get(1); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1381 if (trueBlock == falseBlock) { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1382 appendGoto(createTarget(trueBlock, frameState)); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1383 return; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1384 } |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1385 |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1386 double probability = profilingInfo.getBranchTakenProbability(bci()); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1387 if (probability < 0) { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1388 assert probability == -1 : "invalid probability"; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1389 Debug.log("missing probability in %s at bci %d", method, bci()); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1390 probability = 0.5; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1391 } |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1392 |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1393 if (!optimisticOpts.removeNeverExecutedCode()) { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1394 if (probability == 0) { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1395 probability = 0.0000001; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1396 } else if (probability == 1) { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1397 probability = 0.999999; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1398 } |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1399 } |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1400 |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1401 // the mirroring and negation operations get the condition into canonical form |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1402 boolean mirror = cond.canonicalMirror(); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1403 boolean negate = cond.canonicalNegate(); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1404 |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1405 ValueNode a = mirror ? y : x; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1406 ValueNode b = mirror ? x : y; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1407 |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1408 ValueNode condition; |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1409 assert !a.getKind().isNumericFloat(); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1410 if (cond == Condition.EQ || cond == Condition.NE) { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1411 if (a.getKind() == Kind.Object) { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1412 condition = genObjectEquals(a, b); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1413 } else { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1414 condition = genIntegerEquals(a, b); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1415 } |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1416 } else { |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1417 assert a.getKind() != Kind.Object && !cond.isUnsigned(); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1418 condition = genIntegerLessThan(a, b); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1419 } |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1420 condition = genUnique(condition); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1421 |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1422 ValueNode trueSuccessor = createBlockTarget(probability, trueBlock, frameState); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1423 ValueNode falseSuccessor = createBlockTarget(1 - probability, falseBlock, frameState); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1424 |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1425 ValueNode ifNode = negate ? genIf(condition, falseSuccessor, trueSuccessor, 1 - probability) : genIf(condition, trueSuccessor, falseSuccessor, probability); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1426 append(ifNode); |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1427 } |
3825cf50cc5a
AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents:
14922
diff
changeset
|
1428 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1429 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1430 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1431 } |