annotate graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java @ 18996:46c2e70d54ad

Make AbstractMergeNode abstract and introduce concrete subclass MergeNode.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 28 Jan 2015 01:06:39 +0100
parents a2cb19764970
children 2ccaaf5a6be4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1 /*
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 17450
diff changeset
2 * Copyright (c) 2009, 2014, 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.*;
15259
d90e5c22ba55 Move GraalOptions to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents: 15220
diff changeset
28 import static com.oracle.graal.compiler.common.GraalOptions.*;
15470
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15311
diff changeset
29
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
30 import java.util.*;
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
31
5510
426c605c9d3c Move cri.ci to api.code.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5507
diff changeset
32 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
33 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
34 import com.oracle.graal.api.meta.ProfilingInfo.TriState;
5568
fdf19fa15ce4 Split bytecode utilities into separate project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5547
diff changeset
35 import com.oracle.graal.bytecode.*;
15193
96bb07a5d667 Spit up and move GraalInternalError.
Josef Eisl <josef.eisl@jku.at>
parents: 15145
diff changeset
36 import com.oracle.graal.compiler.common.*;
15200
97eed257999b Move Condition to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents: 15193
diff changeset
37 import com.oracle.graal.compiler.common.calc.*;
15261
882f4cb7cfcf Move Stamps to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents: 15260
diff changeset
38 import com.oracle.graal.compiler.common.type.*;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
39 import com.oracle.graal.debug.*;
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
40 import com.oracle.graal.graph.*;
14922
ea57ed7085cf Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents: 14906
diff changeset
41 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
42 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
43 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
44 import com.oracle.graal.java.BciBlockMapping.LocalLiveness;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
45 import com.oracle.graal.nodes.*;
16563
1e63cb55f61d Move InvokeKind from MethodCallTargetNode to CallTargetNode
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16490
diff changeset
46 import com.oracle.graal.nodes.CallTargetNode.InvokeKind;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
47 import com.oracle.graal.nodes.calc.*;
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
48 import com.oracle.graal.nodes.extended.*;
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
49 import com.oracle.graal.nodes.java.*;
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
50 import com.oracle.graal.nodes.type.*;
5210
e3e7542d78b7 Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5160
diff changeset
51 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
52 import com.oracle.graal.phases.*;
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
53 import com.oracle.graal.phases.tiers.*;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
54
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
55 /**
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
56 * 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
57 */
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
58 public class GraphBuilderPhase extends BasePhase<HighTierContext> {
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
59
5109
6766253384bf more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents: 5105
diff changeset
60 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
61
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
62 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
63 this.graphBuilderConfig = graphBuilderConfig;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
64 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
65
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
66 @Override
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
67 protected void run(StructuredGraph graph, HighTierContext context) {
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
68 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
69 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
70
16573
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
71 public GraphBuilderConfiguration getGraphBuilderConfig() {
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
72 return graphBuilderConfig;
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
73 }
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
74
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
75 public static class Instance extends Phase {
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
76
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
77 protected StructuredGraph currentGraph;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
78
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
79 private final MetaAccessProvider metaAccess;
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
80
18918
e8fd0342d9c4 GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18917
diff changeset
81 private ResolvedJavaMethod rootMethod;
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
82
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
83 private final GraphBuilderConfiguration graphBuilderConfig;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
84 private final OptimisticOptimizations optimisticOpts;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
85
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
86 /**
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
87 * Gets the graph being processed by this builder.
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
88 */
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
89 protected StructuredGraph getGraph() {
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
90 return currentGraph;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
91 }
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
92
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
93 public Instance(MetaAccessProvider metaAccess, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts) {
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
94 this.graphBuilderConfig = graphBuilderConfig;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
95 this.optimisticOpts = optimisticOpts;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
96 this.metaAccess = metaAccess;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
97 assert metaAccess != null;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
98 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
99
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
100 @Override
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
101 protected void run(StructuredGraph graph) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
102 ResolvedJavaMethod method = graph.method();
18918
e8fd0342d9c4 GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18917
diff changeset
103 this.rootMethod = method;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
104 int entryBCI = graph.getEntryBCI();
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
105 assert method.getCode() != null : "method must contain bytecodes: " + method;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
106 this.currentGraph = graph;
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
107 HIRFrameStateBuilder frameState = new HIRFrameStateBuilder(method, graph, null);
18918
e8fd0342d9c4 GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18917
diff changeset
108 frameState.initializeForMethodStart(graphBuilderConfig.eagerResolving());
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
109 TTY.Filter filter = new TTY.Filter(PrintFilter.getValue(), method);
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
110 try {
18920
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
111 BytecodeParser parser = new BytecodeParser(metaAccess, method, graphBuilderConfig, optimisticOpts, entryBCI);
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
112 parser.build(0, graph.start(), frameState);
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
113
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
114 parser.connectLoopEndToBegin();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
115
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
116 // remove dead parameters
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
117 for (ParameterNode param : currentGraph.getNodes(ParameterNode.class)) {
18937
ff232ff8d028 Add utility Node#hasNoUsages.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18925
diff changeset
118 if (param.hasNoUsages()) {
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
119 assert param.inputs().isEmpty();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
120 param.safeDelete();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
121 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
122 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
123 } finally {
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
124 filter.remove();
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
125 }
15470
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15311
diff changeset
126
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15311
diff changeset
127 ComputeLoopFrequenciesClosure.compute(graph);
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
128 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
129
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
130 @Override
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
131 protected String getDetailedName() {
18918
e8fd0342d9c4 GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18917
diff changeset
132 return getName() + " " + rootMethod.format("%H.%n(%p):%r");
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
133 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
134
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
135 private static class Target {
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
136
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
137 FixedNode fixed;
14792
b9805a622546 Created abstract class FrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents: 14068
diff changeset
138 HIRFrameStateBuilder state;
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
139
14792
b9805a622546 Created abstract class FrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents: 14068
diff changeset
140 public Target(FixedNode fixed, HIRFrameStateBuilder state) {
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
141 this.fixed = fixed;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
142 this.state = state;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
143 }
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6699
diff changeset
144 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6699
diff changeset
145
15837
6fe57ff3f02c Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15470
diff changeset
146 public 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
147
15032
c9bf91560c82 BciBlock: make entryState abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 15030
diff changeset
148 private BciBlock[] loopHeaders;
c9bf91560c82 BciBlock: make entryState abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 15030
diff changeset
149 private LocalLiveness liveness;
18920
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
150 protected final int entryBCI;
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
151 private int currentDepth;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
152
18920
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
153 private LineNumberTable lnt;
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
154 private int previousLineNumber;
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
155 private int currentLineNumber;
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
156
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
157 private ValueNode methodSynchronizedObject;
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
158 private ExceptionDispatchBlock unwindBlock;
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
159 private BciBlock returnBlock;
18925
14599c77560a Do not always allocate monitorId NodeInputList. Allow null NodeInputList.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18923
diff changeset
160
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
161 private ValueNode returnValue;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
162 private FixedWithNextNode beforeReturnNode;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
163 private ValueNode unwindValue;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
164 private FixedWithNextNode beforeUnwindNode;
18920
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
165
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
166 private FixedWithNextNode lastInstr; // the last instruction added
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
167
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
168 public BytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, int entryBCI) {
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
169 super(metaAccess, method, graphBuilderConfig, optimisticOpts);
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
170 this.entryBCI = entryBCI;
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
171
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
172 if (graphBuilderConfig.insertNonSafepointDebugInfo()) {
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
173 lnt = method.getLineNumberTable();
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
174 previousLineNumber = -1;
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
175 }
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
176 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
177
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
178 public ValueNode getReturnValue() {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
179 return returnValue;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
180 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
181
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
182 public FixedWithNextNode getBeforeReturnNode() {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
183 return this.beforeReturnNode;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
184 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
185
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
186 public ValueNode getUnwindValue() {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
187 return unwindValue;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
188 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
189
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
190 public FixedWithNextNode getBeforeUnwindNode() {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
191 return this.beforeUnwindNode;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
192 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
193
18920
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
194 protected void build(int depth, FixedWithNextNode startInstruction, HIRFrameStateBuilder startFrameState) {
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
195 this.currentDepth = depth;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
196 if (PrintProfilingInformation.getValue()) {
16480
10c12d09a8d2 moved format(String format, JavaMethod method) from MetaUtil to be a default method in JavaMethod
Doug Simon <doug.simon@oracle.com>
parents: 16385
diff changeset
197 TTY.println("Profiling info for " + method.format("%H.%n(%p)"));
16490
cac0a7d1c325 moved profileToString(ProfilingInfo info, ResolvedJavaMethod method, String sep) from MetaUtil to be a default method in ProfilingInfo
Doug Simon <doug.simon@oracle.com>
parents: 16480
diff changeset
198 TTY.println(MetaUtil.indent(profilingInfo.toString(method, CodeUtil.NEW_LINE), " "));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
199 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
200
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
201 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
202
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
203 // compute the block map, setup exception handlers and get the entrypoint(s)
17131
4e15850b67bb Make liveness analysis configurable by graph builder configuration
Christian Wimmer <christian.wimmer@oracle.com>
parents: 17084
diff changeset
204 BciBlockMapping blockMap = BciBlockMapping.create(method, graphBuilderConfig.doLivenessAnalysis());
18817
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
205 loopHeaders = blockMap.getLoopHeaders();
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
206 liveness = blockMap.liveness;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
207
18919
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
208 lastInstr = startInstruction;
18920
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
209 this.setCurrentFrameState(startFrameState);
18919
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
210
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
211 if (startInstruction == currentGraph.start()) {
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
212 StartNode startNode = currentGraph.start();
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
213 if (method.isSynchronized()) {
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
214 startNode.setStateAfter(frameState.create(BytecodeFrame.BEFORE_BCI));
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
215 } else {
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
216 frameState.clearNonLiveLocals(blockMap.startBlock, liveness, true);
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
217 assert bci() == 0;
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
218 startNode.setStateAfter(frameState.create(bci()));
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
219 }
0061f550ef31 Make starting node a parameter in the GraphBuilder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18918
diff changeset
220 }
18918
e8fd0342d9c4 GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18917
diff changeset
221
15267
98d45600222c Add ResolvedJavaMethod.isSynchronized
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15266
diff changeset
222 if (method.isSynchronized()) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
223 // 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
224 methodSynchronizedObject = synchronizedObject(frameState, method);
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
225 MonitorEnterNode monitorEnter = genMonitorEnter(methodSynchronizedObject);
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
226 frameState.clearNonLiveLocals(blockMap.startBlock, liveness, true);
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
227 assert bci() == 0;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
228 monitorEnter.setStateAfter(frameState.create(bci()));
5210
e3e7542d78b7 Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5160
diff changeset
229 }
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
230
16573
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
231 if (graphBuilderConfig.insertNonSafepointDebugInfo()) {
18916
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
232 append(createInfoPointNode(InfopointReason.METHOD_START));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
233 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
234
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
235 currentBlock = blockMap.startBlock;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
236 blockMap.startBlock.entryState = frameState;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
237 if (blockMap.startBlock.isLoopHeader) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
238 appendGoto(createTarget(blockMap.startBlock, frameState));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
239 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
240 blockMap.startBlock.firstInstruction = lastInstr;
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
241 }
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7522
diff changeset
242
18820
ade7699e160e Calculate blocks immediately in correct order.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18818
diff changeset
243 for (BciBlock block : blockMap.getBlocks()) {
18918
e8fd0342d9c4 GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18917
diff changeset
244 processBlock(this, block);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
245 }
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
246 processBlock(this, returnBlock);
18918
e8fd0342d9c4 GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18917
diff changeset
247 processBlock(this, unwindBlock);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
248
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
249 Debug.dump(currentGraph, "After bytecode parsing");
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
250
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
251 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
252 }
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
253
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
254 private BciBlock returnBlock(int bci) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
255 if (returnBlock == null) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
256 returnBlock = new BciBlock();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
257 returnBlock.startBci = bci;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
258 returnBlock.endBci = bci;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
259 returnBlock.setId(Integer.MAX_VALUE);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
260 }
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
261 return returnBlock;
14900
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
15220
ccf0c5a1edf1 Use a synthetic BCI instead of a random BCI (the first parsed bytecode that could throw an exception) for the exception unwind block
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15200
diff changeset
264 private BciBlock unwindBlock() {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
265 if (unwindBlock == null) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
266 unwindBlock = new ExceptionDispatchBlock();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
267 unwindBlock.startBci = -1;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
268 unwindBlock.endBci = -1;
15267
98d45600222c Add ResolvedJavaMethod.isSynchronized
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15266
diff changeset
269 unwindBlock.deoptBci = method.isSynchronized() ? BytecodeFrame.UNWIND_BCI : BytecodeFrame.AFTER_EXCEPTION_BCI;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
270 unwindBlock.setId(Integer.MAX_VALUE);
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 return unwindBlock;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
273 }
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 /**
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
276 * @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
277 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
278 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
279 protected void handleUnresolvedLoadConstant(JavaType type) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
280 assert !graphBuilderConfig.eagerResolving();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
281 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
14900
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 * @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
286 * @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
287 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
288 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
289 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
290 assert !graphBuilderConfig.eagerResolving();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
291 append(new FixedGuardNode(currentGraph.unique(new IsNullNode(object)), Unresolved, InvalidateRecompile));
18490
ca81508f2a19 Generalize NULL handling to work on arbitrary pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18374
diff changeset
292 frameState.apush(appendConstant(JavaConstant.NULL_POINTER));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
293 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
294
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
295 /**
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
296 * @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
297 * @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
298 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
299 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
300 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
301 assert !graphBuilderConfig.eagerResolving();
18994
8b4ef818169c Make AbstractBeginNode an abstract class and create concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18993
diff changeset
302 AbstractBeginNode successor = currentGraph.add(new BeginNode());
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
303 DeoptimizeNode deopt = currentGraph.add(new DeoptimizeNode(InvalidateRecompile, Unresolved));
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
304 append(new IfNode(currentGraph.unique(new IsNullNode(object)), successor, deopt, 1));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
305 lastInstr = successor;
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 17450
diff changeset
306 frameState.ipush(appendConstant(JavaConstant.INT_0));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
307 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
308
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
309 /**
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
310 * @param type the type being instantiated
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
311 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
312 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
313 protected void handleUnresolvedNewInstance(JavaType type) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
314 assert !graphBuilderConfig.eagerResolving();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
315 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
316 }
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 /**
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
319 * @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
320 * @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
321 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
322 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
323 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
324 assert !graphBuilderConfig.eagerResolving();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
325 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
326 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
327
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 * @param type the type being instantiated
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
330 * @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
331 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
332 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
333 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
334 assert !graphBuilderConfig.eagerResolving();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
335 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
336 }
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 * @param field the unresolved field
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
340 * @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
341 * static
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
342 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
343 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
344 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
345 assert !graphBuilderConfig.eagerResolving();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
346 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
14900
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 field the unresolved field
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
351 * @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
352 * @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
353 * static
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
354 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
355 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
356 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
357 assert !graphBuilderConfig.eagerResolving();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
358 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
14900
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 /**
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
362 * @param type
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
18361
6ac7e9c85be6 Split getEncoding into two methods.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
365 protected void handleUnresolvedExceptionType(JavaType type) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
366 assert !graphBuilderConfig.eagerResolving();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
367 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
368 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
369
16340
e7af30d6ae5b remove frame state manipulation after a DeoptimizeNode is appended as the state will never be used; remove unused ParameterNodes from a graph
Doug Simon <doug.simon@oracle.com>
parents: 16215
diff changeset
370 /**
e7af30d6ae5b remove frame state manipulation after a DeoptimizeNode is appended as the state will never be used; remove unused ParameterNodes from a graph
Doug Simon <doug.simon@oracle.com>
parents: 16215
diff changeset
371 * @param javaMethod
e7af30d6ae5b remove frame state manipulation after a DeoptimizeNode is appended as the state will never be used; remove unused ParameterNodes from a graph
Doug Simon <doug.simon@oracle.com>
parents: 16215
diff changeset
372 * @param invokeKind
e7af30d6ae5b remove frame state manipulation after a DeoptimizeNode is appended as the state will never be used; remove unused ParameterNodes from a graph
Doug Simon <doug.simon@oracle.com>
parents: 16215
diff changeset
373 */
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
374 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
375 assert !graphBuilderConfig.eagerResolving();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
376 append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
377 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
378
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
379 private DispatchBeginNode handleException(ValueNode exceptionObject, int bci) {
15263
0b25b81414c9 Move various bci constants from FrameState (gral.nodes) to BytecodeFrame (graal.api.code)
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15261
diff changeset
380 assert bci == BytecodeFrame.BEFORE_BCI || bci == bci() : "invalid bci";
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
381 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
382
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
383 BciBlock dispatchBlock = currentBlock.exceptionDispatchBlock();
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 * 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
386 * 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
387 * unwind immediately.
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
388 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
389 if (bci != currentBlock.endBci || dispatchBlock == null) {
15220
ccf0c5a1edf1 Use a synthetic BCI instead of a random BCI (the first parsed bytecode that could throw an exception) for the exception unwind block
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15200
diff changeset
390 dispatchBlock = unwindBlock();
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
391 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
392
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
393 HIRFrameStateBuilder dispatchState = frameState.copy();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
394 dispatchState.clearStack();
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 DispatchBeginNode dispatchBegin;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
397 if (exceptionObject == null) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
398 dispatchBegin = currentGraph.add(new ExceptionObjectNode(metaAccess));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
399 dispatchState.apush(dispatchBegin);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
400 dispatchState.setRethrowException(true);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
401 dispatchBegin.setStateAfter(dispatchState.create(bci));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
402 } else {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
403 dispatchBegin = currentGraph.add(new DispatchBeginNode());
15837
6fe57ff3f02c Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15470
diff changeset
404 dispatchState.apush(exceptionObject);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
405 dispatchBegin.setStateAfter(dispatchState.create(bci));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
406 dispatchState.setRethrowException(true);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
407 }
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
408 FixedNode target = createTarget(dispatchBlock, dispatchState);
15837
6fe57ff3f02c Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15470
diff changeset
409 FixedWithNextNode finishedDispatch = finishInstruction(dispatchBegin, dispatchState);
6fe57ff3f02c Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15470
diff changeset
410 finishedDispatch.setNext(target);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
411 return dispatchBegin;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
412 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
413
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
414 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
415 protected ValueNode genLoadIndexed(ValueNode array, ValueNode index, Kind kind) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
416 return new LoadIndexedNode(array, index, kind);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
417 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
418
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
419 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
420 protected ValueNode genStoreIndexed(ValueNode array, ValueNode index, Kind kind, ValueNode value) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
421 return new StoreIndexedNode(array, index, kind, value);
14900
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
424 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
425 protected ValueNode genIntegerAdd(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
426 return new AddNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
427 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
428
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
429 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
430 protected ValueNode genIntegerSub(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
431 return new SubNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
432 }
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
435 protected ValueNode genIntegerMul(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
436 return new MulNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
437 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
438
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
439 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
440 protected ValueNode genFloatAdd(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
441 return new AddNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
442 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
443
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
444 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
445 protected ValueNode genFloatSub(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
446 return new SubNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
447 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
448
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
449 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
450 protected ValueNode genFloatMul(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
451 return new MulNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
452 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
453
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
454 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
455 protected ValueNode genFloatDiv(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
456 return new DivNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
457 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
458
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
459 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
460 protected ValueNode genFloatRem(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
461 return new RemNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
462 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
463
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
464 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
465 protected ValueNode genIntegerDiv(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
466 return new IntegerDivNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
467 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
468
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
469 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
470 protected ValueNode genIntegerRem(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
471 return new IntegerRemNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
472 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
473
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
474 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
475 protected ValueNode genNegateOp(ValueNode x) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
476 return (new NegateNode(x));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
477 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
478
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
479 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
480 protected ValueNode genLeftShift(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
481 return new LeftShiftNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
482 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
483
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
484 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
485 protected ValueNode genRightShift(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
486 return new RightShiftNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
487 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
488
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
489 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
490 protected ValueNode genUnsignedRightShift(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
491 return new UnsignedRightShiftNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
492 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
493
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
494 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
495 protected ValueNode genAnd(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
496 return new AndNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
497 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
498
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
499 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
500 protected ValueNode genOr(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
501 return new OrNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
502 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
503
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
504 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
505 protected ValueNode genXor(Kind kind, ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
506 return new XorNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
507 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
508
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
509 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
510 protected ValueNode genNormalizeCompare(ValueNode x, ValueNode y, boolean isUnorderedLess) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
511 return new NormalizeCompareNode(x, y, isUnorderedLess);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
512 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
513
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
514 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
515 protected ValueNode genFloatConvert(FloatConvert op, ValueNode input) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
516 return new FloatConvertNode(op, input);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
517 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
518
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
519 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
520 protected ValueNode genNarrow(ValueNode input, int bitCount) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
521 return new NarrowNode(input, bitCount);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
522 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
523
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
524 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
525 protected ValueNode genSignExtend(ValueNode input, int bitCount) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
526 return new SignExtendNode(input, bitCount);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
527 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
528
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
529 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
530 protected ValueNode genZeroExtend(ValueNode input, int bitCount) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
531 return new ZeroExtendNode(input, bitCount);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
532 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
533
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
534 @Override
15030
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
535 protected void genGoto() {
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
536 appendGoto(createTarget(currentBlock.getSuccessors().get(0), frameState));
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
537 assert currentBlock.numNormalSuccessors() == 1;
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
538 }
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
539
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
540 @Override
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
541 protected ValueNode genObjectEquals(ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
542 return new ObjectEqualsNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
543 }
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
546 protected ValueNode genIntegerEquals(ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
547 return new IntegerEqualsNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
548 }
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
551 protected ValueNode genIntegerLessThan(ValueNode x, ValueNode y) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
552 return new IntegerLessThanNode(x, y);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
553 }
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
556 protected ValueNode genUnique(ValueNode x) {
14904
162d8fe89017 Revert 3e9a8ef2e0e1.
Josef Eisl <josef.eisl@jku.at>
parents: 14902
diff changeset
557 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
558 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
559
14948
bc72e5ed9752 AbstractBytecodeParser: rename ifNode to genIf.
Josef Eisl <josef.eisl@jku.at>
parents: 14947
diff changeset
560 protected ValueNode genIfNode(ValueNode condition, ValueNode falseSuccessor, ValueNode trueSuccessor, double d) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
561 return new IfNode((LogicNode) condition, (FixedNode) falseSuccessor, (FixedNode) trueSuccessor, d);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
562 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
563
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
564 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
565 protected void genThrow() {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
566 ValueNode exception = frameState.apop();
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
567 append(new FixedGuardNode(currentGraph.unique(new IsNullNode(exception)), NullCheckException, InvalidateReprofile, true));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
568 lastInstr.setNext(handleException(exception, bci()));
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
15837
6fe57ff3f02c Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15470
diff changeset
572 protected ValueNode createCheckCast(ResolvedJavaType type, ValueNode object, JavaTypeProfile profileForTypeCheck, boolean forStoreCheck) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
573 return new CheckCastNode(type, object, profileForTypeCheck, forStoreCheck);
14900
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
15837
6fe57ff3f02c Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15470
diff changeset
577 protected ValueNode createInstanceOf(ResolvedJavaType type, ValueNode object, JavaTypeProfile profileForTypeCheck) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
578 return new InstanceOfNode(type, object, profileForTypeCheck);
14900
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 genConditional(ValueNode x) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
583 return new ConditionalNode((LogicNode) x);
14900
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 NewInstanceNode createNewInstance(ResolvedJavaType type, boolean fillContents) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
588 return new NewInstanceNode(type, fillContents);
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
592 protected NewArrayNode createNewArray(ResolvedJavaType elementType, ValueNode length, boolean fillContents) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
593 return new NewArrayNode(elementType, length, fillContents);
14900
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
596 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
597 protected NewMultiArrayNode createNewMultiArray(ResolvedJavaType type, List<ValueNode> dimensions) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
598 return new NewMultiArrayNode(type, dimensions.toArray(new ValueNode[0]));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
599 }
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
602 protected ValueNode genLoadField(ValueNode receiver, ResolvedJavaField field) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
603 return new LoadFieldNode(receiver, field);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
604 }
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
607 protected void emitNullCheck(ValueNode receiver) {
18490
ca81508f2a19 Generalize NULL handling to work on arbitrary pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18374
diff changeset
608 if (StampTool.isPointerNonNull(receiver.stamp())) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
609 return;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
610 }
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
611 BytecodeExceptionNode exception = currentGraph.add(new BytecodeExceptionNode(metaAccess, NullPointerException.class));
18994
8b4ef818169c Make AbstractBeginNode an abstract class and create concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18993
diff changeset
612 AbstractBeginNode falseSucc = currentGraph.add(new BeginNode());
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
613 append(new IfNode(currentGraph.unique(new IsNullNode(receiver)), exception, falseSucc, 0.01));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
614 lastInstr = falseSucc;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
615
15018
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 14973
diff changeset
616 exception.setStateAfter(frameState.create(bci()));
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 14973
diff changeset
617 exception.setNext(handleException(exception, bci()));
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
618 }
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
619
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
620 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
621 protected void emitBoundsCheck(ValueNode index, ValueNode length) {
18994
8b4ef818169c Make AbstractBeginNode an abstract class and create concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18993
diff changeset
622 AbstractBeginNode trueSucc = currentGraph.add(new BeginNode());
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
623 BytecodeExceptionNode exception = currentGraph.add(new BytecodeExceptionNode(metaAccess, ArrayIndexOutOfBoundsException.class, index));
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
624 append(new IfNode(currentGraph.unique(new IntegerBelowNode(index, length)), trueSucc, exception, 0.99));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
625 lastInstr = trueSucc;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
626
15018
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 14973
diff changeset
627 exception.setStateAfter(frameState.create(bci()));
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 14973
diff changeset
628 exception.setNext(handleException(exception, bci()));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
629 }
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
632 protected ValueNode genArrayLength(ValueNode x) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
633 return new ArrayLengthNode(x);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
634 }
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
637 protected ValueNode genStoreField(ValueNode receiver, ResolvedJavaField field, ValueNode value) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
638 return new StoreFieldNode(receiver, field, value);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
639 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
640
16385
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
641 /**
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
642 * Ensure that concrete classes are at least linked before generating an invoke.
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
643 * Interfaces may never be linked so simply return true for them.
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
644 *
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
645 * @param target
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
646 * @return true if the declared holder is an interface or is linked
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
647 */
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
648 private boolean callTargetIsResolved(JavaMethod target) {
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
649 if (target instanceof ResolvedJavaMethod) {
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
650 ResolvedJavaMethod resolvedTarget = (ResolvedJavaMethod) target;
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
651 ResolvedJavaType resolvedType = resolvedTarget.getDeclaringClass();
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
652 return resolvedType.isInterface() || resolvedType.isLinked();
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
653 }
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
654 return false;
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
655 }
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
656
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
657 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
658 protected void genInvokeStatic(JavaMethod target) {
16385
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
659 if (callTargetIsResolved(target)) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
660 ResolvedJavaMethod resolvedTarget = (ResolvedJavaMethod) target;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
661 ResolvedJavaType holder = resolvedTarget.getDeclaringClass();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
662 if (!holder.isInitialized() && ResolveClassBeforeStaticInvoke.getValue()) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
663 handleUnresolvedInvoke(target, InvokeKind.Static);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
664 } else {
18374
8971259db8ed Eliminated the need for Signature.getParameterSlots()
Christian Wimmer <christian.wimmer@oracle.com>
parents: 18361
diff changeset
665 ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterCount(false));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
666 appendInvoke(InvokeKind.Static, resolvedTarget, args);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
667 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
668 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
669 handleUnresolvedInvoke(target, InvokeKind.Static);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
670 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
671 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
672
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
673 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
674 protected void genInvokeInterface(JavaMethod target) {
16385
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
675 if (callTargetIsResolved(target)) {
18374
8971259db8ed Eliminated the need for Signature.getParameterSlots()
Christian Wimmer <christian.wimmer@oracle.com>
parents: 18361
diff changeset
676 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(true));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
677 appendInvoke(InvokeKind.Interface, (ResolvedJavaMethod) target, args);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
678 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
679 handleUnresolvedInvoke(target, InvokeKind.Interface);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
680 }
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 void genInvokeDynamic(JavaMethod target) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
685 if (target instanceof ResolvedJavaMethod) {
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 17450
diff changeset
686 JavaConstant appendix = constantPool.lookupAppendix(stream.readCPI4(), Bytecodes.INVOKEDYNAMIC);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
687 if (appendix != null) {
15018
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 14973
diff changeset
688 frameState.apush(ConstantNode.forConstant(appendix, metaAccess, currentGraph));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
689 }
18374
8971259db8ed Eliminated the need for Signature.getParameterSlots()
Christian Wimmer <christian.wimmer@oracle.com>
parents: 18361
diff changeset
690 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(false));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
691 appendInvoke(InvokeKind.Static, (ResolvedJavaMethod) target, args);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
692 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
693 handleUnresolvedInvoke(target, InvokeKind.Static);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
694 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
695 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
696
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
697 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
698 protected void genInvokeVirtual(JavaMethod target) {
16385
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
699 if (callTargetIsResolved(target)) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
700 /*
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
701 * 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
702 * 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
703 * adapter. HotSpot does this - see
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
704 * 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
705 * +and+invokedynamic
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
706 */
15311
820c6d353358 added ModifiersProvider as superinterface for ResolvedJava[Method|Field|Type] and implemented all checks against modifiers as default methods
Doug Simon <doug.simon@oracle.com>
parents: 15294
diff changeset
707 boolean hasReceiver = !((ResolvedJavaMethod) target).isStatic();
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 17450
diff changeset
708 JavaConstant appendix = constantPool.lookupAppendix(stream.readCPI(), Bytecodes.INVOKEVIRTUAL);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
709 if (appendix != null) {
15018
db4254246f9a Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 14973
diff changeset
710 frameState.apush(ConstantNode.forConstant(appendix, metaAccess, currentGraph));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
711 }
18374
8971259db8ed Eliminated the need for Signature.getParameterSlots()
Christian Wimmer <christian.wimmer@oracle.com>
parents: 18361
diff changeset
712 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(hasReceiver));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
713 if (hasReceiver) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
714 appendInvoke(InvokeKind.Virtual, (ResolvedJavaMethod) target, args);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
715 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
716 appendInvoke(InvokeKind.Static, (ResolvedJavaMethod) target, args);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
717 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
718 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
719 handleUnresolvedInvoke(target, InvokeKind.Virtual);
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
722 }
5210
e3e7542d78b7 Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5160
diff changeset
723
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
724 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
725 protected void genInvokeSpecial(JavaMethod target) {
16385
e0f77d30ad07 ensure the declared method holder is at least linked before emitting an invoke
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16340
diff changeset
726 if (callTargetIsResolved(target)) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
727 assert target != null;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
728 assert target.getSignature() != null;
18374
8971259db8ed Eliminated the need for Signature.getParameterSlots()
Christian Wimmer <christian.wimmer@oracle.com>
parents: 18361
diff changeset
729 ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(true));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
730 appendInvoke(InvokeKind.Special, (ResolvedJavaMethod) target, args);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
731 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
732 handleUnresolvedInvoke(target, InvokeKind.Special);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
733 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
734 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
735
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
736 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
737 Kind resultType = targetMethod.getSignature().getReturnKind();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
738 if (DeoptALot.getValue()) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
739 append(new DeoptimizeNode(DeoptimizationAction.None, RuntimeConstraint));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
740 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
741 return;
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
744 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
745 if (graphBuilderConfig.eagerResolving()) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
746 returnType = returnType.resolve(targetMethod.getDeclaringClass());
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
747 }
18822
fad37aaed6d2 Add utilities isDirect and isIndirect to InvokeKind.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18821
diff changeset
748 if (invokeKind.hasReceiver()) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
749 emitExplicitExceptions(args[0], null);
18822
fad37aaed6d2 Add utilities isDirect and isIndirect to InvokeKind.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18821
diff changeset
750 if (invokeKind.isIndirect() && this.optimisticOpts.useTypeCheckHints()) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
751 JavaTypeProfile profile = profilingInfo.getTypeProfile(bci());
16895
06c15e88d383 added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents: 16841
diff changeset
752 args[0] = TypeProfileProxyNode.proxify(args[0], profile);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
753 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
754 }
18822
fad37aaed6d2 Add utilities isDirect and isIndirect to InvokeKind.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18821
diff changeset
755
18912
9536c47658a2 Introduce new option InlineDuringParsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18845
diff changeset
756 if (GraalOptions.InlineDuringParsing.getValue() && invokeKind.isDirect() && targetMethod.canBeInlined() && targetMethod.hasBytecodes()) {
18921
13e43d2a413e Initialize frame state builder created for parse time inlining correctly.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18920
diff changeset
757 if (targetMethod.getCode().length <= GraalOptions.TrivialInliningSize.getValue() && currentDepth < GraalOptions.InlineDuringParsingMaxDepth.getValue() &&
13e43d2a413e Initialize frame state builder created for parse time inlining correctly.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18920
diff changeset
758 graphBuilderConfig.shouldInlineTrivial()) {
13e43d2a413e Initialize frame state builder created for parse time inlining correctly.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18920
diff changeset
759 BytecodeParser parser = new BytecodeParser(metaAccess, targetMethod, graphBuilderConfig, optimisticOpts, StructuredGraph.INVOCATION_ENTRY_BCI);
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
760 final FrameState[] lazyFrameState = new FrameState[1];
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
761 HIRFrameStateBuilder startFrameState = new HIRFrameStateBuilder(targetMethod, currentGraph, () -> {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
762 if (lazyFrameState[0] == null) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
763 lazyFrameState[0] = frameState.create(bci());
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
764 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
765 return lazyFrameState[0];
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
766 });
18921
13e43d2a413e Initialize frame state builder created for parse time inlining correctly.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18920
diff changeset
767 startFrameState.initializeFromArgumentsArray(args);
13e43d2a413e Initialize frame state builder created for parse time inlining correctly.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18920
diff changeset
768 parser.build(currentDepth + 1, this.lastInstr, startFrameState);
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
769
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
770 FixedWithNextNode calleeBeforeReturnNode = parser.getBeforeReturnNode();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
771 this.lastInstr = calleeBeforeReturnNode;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
772 if (calleeBeforeReturnNode != null) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
773 ValueNode calleeReturnValue = parser.getReturnValue();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
774 if (calleeReturnValue != null) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
775 frameState.push(calleeReturnValue.getKind().getStackKind(), calleeReturnValue);
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
776 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
777 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
778
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
779 FixedWithNextNode calleeBeforeUnwindNode = parser.getBeforeUnwindNode();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
780 if (calleeBeforeUnwindNode != null) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
781 ValueNode calleeUnwindValue = parser.getUnwindValue();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
782 assert calleeUnwindValue != null;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
783 calleeBeforeUnwindNode.setNext(handleException(calleeUnwindValue, bci()));
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
784 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
785
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
786 return;
18912
9536c47658a2 Introduce new option InlineDuringParsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18845
diff changeset
787 }
9536c47658a2 Introduce new option InlineDuringParsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18845
diff changeset
788 }
9536c47658a2 Introduce new option InlineDuringParsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18845
diff changeset
789
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
790 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
791
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
792 // be conservative if information was not recorded (could result in endless
18822
fad37aaed6d2 Add utilities isDirect and isIndirect to InvokeKind.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18821
diff changeset
793 // recompiles otherwise)
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
794 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
795 createInvoke(callTarget, resultType);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
796 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
797 InvokeWithExceptionNode invoke = createInvokeWithException(callTarget, resultType);
18993
480bd3b1adcd Rename BeginNode => AbstractBeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18937
diff changeset
798 AbstractBeginNode beginNode = currentGraph.add(new KillingBeginNode(LocationIdentity.ANY_LOCATION));
18831
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
799 invoke.setNext(beginNode);
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
800 lastInstr = beginNode;
14900
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) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
805 return new MethodCallTargetNode(invokeKind, targetMethod, args, returnType);
14900
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) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
809 InvokeNode invoke = append(new InvokeNode(callTarget, bci()));
14900
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());
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
816 InvokeWithExceptionNode invoke = append(new InvokeWithExceptionNode(callTarget, exceptionEdge, bci()));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
817 frameState.pushReturn(resultType, invoke);
18831
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
818 invoke.setStateAfter(frameState.create(stream.nextBCI()));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
819 return invoke;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
820 }
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 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
823 protected void genReturn(ValueNode x) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
824 frameState.setRethrowException(false);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
825 frameState.clearStack();
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
826
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
827 if (this.currentDepth == 0) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
828 beforeReturn(x);
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
829 append(new ReturnNode(x));
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
830 } else {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
831 if (x != null) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
832 frameState.push(x.getKind(), x);
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
833 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
834 appendGoto(createTarget(returnBlock(bci()), frameState));
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
835 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
836 }
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
837
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
838 private void beforeReturn(ValueNode x) {
16573
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
839 if (graphBuilderConfig.insertNonSafepointDebugInfo()) {
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
840 append(createInfoPointNode(InfopointReason.METHOD_END));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
841 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
842
15263
0b25b81414c9 Move various bci constants from FrameState (gral.nodes) to BytecodeFrame (graal.api.code)
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15261
diff changeset
843 synchronizedEpilogue(BytecodeFrame.AFTER_BCI, x);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
844 if (frameState.lockDepth() != 0) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
845 throw new BailoutException("unbalanced monitors");
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 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
848
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
849 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
850 protected MonitorEnterNode genMonitorEnter(ValueNode x) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
851 MonitorIdNode monitorId = currentGraph.add(new MonitorIdNode(frameState.lockDepth()));
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
852 MonitorEnterNode monitorEnter = append(new MonitorEnterNode(x, monitorId));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
853 frameState.pushLock(x, monitorId);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
854 return monitorEnter;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
855 }
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 @Override
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
858 protected MonitorExitNode genMonitorExit(ValueNode x, ValueNode escapedReturnValue) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
859 MonitorIdNode monitorId = frameState.peekMonitorId();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
860 ValueNode lockedObject = frameState.popLock();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
861 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
862 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
863 }
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
864 MonitorExitNode monitorExit = append(new MonitorExitNode(x, monitorId, escapedReturnValue));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
865 return monitorExit;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
866 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
867
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
868 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
869 protected void genJsr(int dest) {
18818
adf3a8581a67 Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18817
diff changeset
870 BciBlock successor = currentBlock.getJsrSuccessor();
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
871 assert successor.startBci == dest : successor.startBci + " != " + dest + " @" + bci();
18818
adf3a8581a67 Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18817
diff changeset
872 JsrScope scope = currentBlock.getJsrScope();
17084
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
873 int nextBci = getStream().nextBCI();
18818
adf3a8581a67 Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18817
diff changeset
874 if (!successor.getJsrScope().pop().equals(scope)) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
875 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
876 }
18818
adf3a8581a67 Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18817
diff changeset
877 if (successor.getJsrScope().nextReturnAddress() != nextBci) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
878 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
879 }
17084
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
880 ConstantNode nextBciNode = getJsrConstant(nextBci);
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
881 frameState.push(Kind.Int, nextBciNode);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
882 appendGoto(createTarget(successor, frameState));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
883 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
884
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
885 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
886 protected void genRet(int localIndex) {
18818
adf3a8581a67 Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18817
diff changeset
887 BciBlock successor = currentBlock.getRetSuccessor();
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
888 ValueNode local = frameState.loadLocal(localIndex);
18818
adf3a8581a67 Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18817
diff changeset
889 JsrScope scope = currentBlock.getJsrScope();
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
890 int retAddress = scope.nextReturnAddress();
17084
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
891 ConstantNode returnBciNode = getJsrConstant(retAddress);
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
892 LogicNode guard = new IntegerEqualsNode(local, returnBciNode);
17084
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
893 guard = currentGraph.unique(guard);
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
894 append(new FixedGuardNode(guard, JavaSubroutineMismatch, InvalidateReprofile));
18818
adf3a8581a67 Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18817
diff changeset
895 if (!successor.getJsrScope().equals(scope.pop())) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
896 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
897 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
898 appendGoto(createTarget(successor, frameState));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
899 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
900
17084
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
901 private ConstantNode getJsrConstant(long bci) {
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 17450
diff changeset
902 JavaConstant nextBciConstant = new RawConstant(bci);
17084
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
903 Stamp nextBciStamp = StampFactory.forConstant(nextBciConstant);
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
904 ConstantNode nextBciNode = new ConstantNode(nextBciConstant, nextBciStamp);
17084
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
905 return currentGraph.unique(nextBciNode);
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
906 }
26f5733fb645 Fix the endianess issue, when using JSR/RET instruction and deoptimization happens in this subroutine
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 16982
diff changeset
907
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
908 @Override
15028
7ee9decb2784 AbstractBytecodeParser: rework genIntegerSwitch.
Josef Eisl <josef.eisl@jku.at>
parents: 15027
diff changeset
909 protected void genIntegerSwitch(ValueNode value, ArrayList<BciBlock> actualSuccessors, int[] keys, double[] keyProbabilities, int[] keySuccessors) {
7ee9decb2784 AbstractBytecodeParser: rework genIntegerSwitch.
Josef Eisl <josef.eisl@jku.at>
parents: 15027
diff changeset
910 double[] successorProbabilities = successorProbabilites(actualSuccessors.size(), keySuccessors, keyProbabilities);
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
911 IntegerSwitchNode switchNode = append(new IntegerSwitchNode(value, actualSuccessors.size(), keys, keyProbabilities, keySuccessors));
15028
7ee9decb2784 AbstractBytecodeParser: rework genIntegerSwitch.
Josef Eisl <josef.eisl@jku.at>
parents: 15027
diff changeset
912 for (int i = 0; i < actualSuccessors.size(); i++) {
7ee9decb2784 AbstractBytecodeParser: rework genIntegerSwitch.
Josef Eisl <josef.eisl@jku.at>
parents: 15027
diff changeset
913 switchNode.setBlockSuccessor(i, createBlockTarget(successorProbabilities[i], actualSuccessors.get(i), frameState));
7ee9decb2784 AbstractBytecodeParser: rework genIntegerSwitch.
Josef Eisl <josef.eisl@jku.at>
parents: 15027
diff changeset
914 }
14900
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
917 @Override
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 17450
diff changeset
918 protected ConstantNode appendConstant(JavaConstant constant) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
919 assert constant != null;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
920 return ConstantNode.forConstant(constant, metaAccess, currentGraph);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
921 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
922
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
923 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
924 protected ValueNode append(ValueNode v) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
925 if (v instanceof ControlSinkNode) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
926 return append((ControlSinkNode) v);
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 if (v instanceof ControlSplitNode) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
929 return append((ControlSplitNode) v);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
930 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
931 if (v instanceof FixedWithNextNode) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
932 return append((FixedWithNextNode) v);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
933 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
934 if (v instanceof FloatingNode) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
935 return append((FloatingNode) v);
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 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
938 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
939
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
940 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
941 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
942 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
943 T added = currentGraph.add(fixed);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
944 lastInstr.setNext(added);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
945 lastInstr = null;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
946 return added;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
947 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
948
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
949 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
950 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
951 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
952 T added = currentGraph.add(fixed);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
953 lastInstr.setNext(added);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
954 lastInstr = null;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
955 return added;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
956 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
957
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
958 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
959 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
960 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
961 T added = currentGraph.add(fixed);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
962 lastInstr.setNext(added);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
963 lastInstr = added;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
964 return added;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
965 }
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 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
968 assert !(v instanceof ConstantNode);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
969 T added = currentGraph.unique(v);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
970 return added;
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
973 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
974 if (currentBlock != null) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
975 long exits = currentBlock.loops & ~targetBlock.loops;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
976 if (exits != 0) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
977 LoopExitNode firstLoopExit = null;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
978 LoopExitNode lastLoopExit = null;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
979
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
980 int pos = 0;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
981 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
982 do {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
983 long lMask = 1L << pos;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
984 if ((exits & lMask) != 0) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
985 exitLoops.add(loopHeaders[pos]);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
986 exits &= ~lMask;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
987 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
988 pos++;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
989 } while (exits != 0);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
990
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
991 Collections.sort(exitLoops, new Comparator<BciBlock>() {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
992
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
993 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
994 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
995 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
996 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
997 });
5210
e3e7542d78b7 Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5160
diff changeset
998
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
999 int bci = targetBlock.startBci;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1000 if (targetBlock instanceof ExceptionDispatchBlock) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1001 bci = ((ExceptionDispatchBlock) targetBlock).deoptBci;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1002 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1003 HIRFrameStateBuilder newState = state.copy();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1004 for (BciBlock loop : exitLoops) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1005 LoopBeginNode loopBegin = (LoopBeginNode) loop.firstInstruction;
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1006 LoopExitNode loopExit = currentGraph.add(new LoopExitNode(loopBegin));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1007 if (lastLoopExit != null) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1008 lastLoopExit.setNext(loopExit);
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 if (firstLoopExit == null) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1011 firstLoopExit = loopExit;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1012 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1013 lastLoopExit = loopExit;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1014 Debug.log("Target %s (%s) Exits %s, scanning framestates...", targetBlock, target, loop);
15032
c9bf91560c82 BciBlock: make entryState abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 15030
diff changeset
1015 newState.insertLoopProxies(loopExit, (HIRFrameStateBuilder) loop.entryState);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1016 loopExit.setStateAfter(newState.create(bci));
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1019 lastLoopExit.setNext(target);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1020 return new Target(firstLoopExit, newState);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1021 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1022 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1023 return new Target(target, state);
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
15030
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
1026 private FixedNode createTarget(double probability, BciBlock block, HIRFrameStateBuilder stateAfter) {
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
1027 assert probability >= 0 && probability <= 1.01 : probability;
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
1028 if (isNeverExecutedCode(probability)) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1029 return currentGraph.add(new DeoptimizeNode(InvalidateReprofile, UnreachedCode));
15030
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
1030 } else {
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
1031 assert block != null;
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
1032 return createTarget(block, stateAfter);
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
1033 }
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1034 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1035
15030
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
1036 private FixedNode createTarget(BciBlock block, HIRFrameStateBuilder state) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1037 assert block != null && state != null;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1038 assert !block.isExceptionEntry || state.stackSize() == 1;
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 if (block.firstInstruction == null) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1041 /*
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1042 * 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
1043 * 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
1044 * this block again.
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1045 */
18828
161503950494 Avoid insertion of block placeholder node. Use begin node instead.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18825
diff changeset
1046 FixedNode targetNode;
18994
8b4ef818169c Make AbstractBeginNode an abstract class and create concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18993
diff changeset
1047 block.firstInstruction = currentGraph.add(new BeginNode());
18828
161503950494 Avoid insertion of block placeholder node. Use begin node instead.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18825
diff changeset
1048 targetNode = block.firstInstruction;
161503950494 Avoid insertion of block placeholder node. Use begin node instead.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18825
diff changeset
1049 Target target = checkLoopExit(targetNode, block, state);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1050 FixedNode result = target.fixed;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1051 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
1052 block.entryState.clearNonLiveLocals(block, liveness, true);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1053
18828
161503950494 Avoid insertion of block placeholder node. Use begin node instead.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18825
diff changeset
1054 Debug.log("createTarget %s: first visit, result: %s", block, targetNode);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1055 return result;
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1058 // We already saw this block before, so we have to merge states.
15032
c9bf91560c82 BciBlock: make entryState abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 15030
diff changeset
1059 if (!((HIRFrameStateBuilder) block.entryState).isCompatibleWith(state)) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1060 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
1061 }
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 LoopBeginNode) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1064 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
1065 /*
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1066 * 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
1067 * the loop begin node created before.
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 LoopBeginNode loopBegin = (LoopBeginNode) block.firstInstruction;
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1070 Target target = checkLoopExit(currentGraph.add(new LoopEndNode(loopBegin)), block, state);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1071 FixedNode result = target.fixed;
15032
c9bf91560c82 BciBlock: make entryState abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 15030
diff changeset
1072 ((HIRFrameStateBuilder) block.entryState).merge(loopBegin, target.state);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1073
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1074 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
1075 return result;
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 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
1078 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
1079
18995
a2cb19764970 Rename MergeNode to AbstractMergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18994
diff changeset
1080 if (block.firstInstruction instanceof AbstractBeginNode && !(block.firstInstruction instanceof AbstractMergeNode)) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1081 /*
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1082 * 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
1083 * 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
1084 * 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
1085 */
18993
480bd3b1adcd Rename BeginNode => AbstractBeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18937
diff changeset
1086 AbstractBeginNode placeholder = (AbstractBeginNode) block.firstInstruction;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1087
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1088 // The EndNode for the already existing edge.
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1089 AbstractEndNode end = currentGraph.add(new EndNode());
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1090 // The MergeNode that replaces the placeholder.
18996
46c2e70d54ad Make AbstractMergeNode abstract and introduce concrete subclass MergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18995
diff changeset
1091 AbstractMergeNode mergeNode = currentGraph.add(new MergeNode());
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1092 FixedNode next = placeholder.next();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1093
18831
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
1094 if (placeholder.predecessor() instanceof ControlSplitNode) {
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
1095 placeholder.setNext(end);
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
1096 } else {
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
1097 placeholder.replaceAtPredecessor(end);
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
1098 placeholder.safeDelete();
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
1099 }
c142633a6304 Fix regression in graph builder related to removal of placeholder nodes. Do not create successor blocks for invokes without exception handler successor.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18828
diff changeset
1100
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1101 mergeNode.addForwardEnd(end);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1102 mergeNode.setNext(next);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1103
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1104 block.firstInstruction = mergeNode;
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
18995
a2cb19764970 Rename MergeNode to AbstractMergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18994
diff changeset
1107 AbstractMergeNode mergeNode = (AbstractMergeNode) block.firstInstruction;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1108
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1109 // The EndNode for the newly merged edge.
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1110 AbstractEndNode newEnd = currentGraph.add(new EndNode());
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1111 Target target = checkLoopExit(newEnd, block, state);
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1112 FixedNode result = target.fixed;
15032
c9bf91560c82 BciBlock: make entryState abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 15030
diff changeset
1113 ((HIRFrameStateBuilder) block.entryState).merge(mergeNode, target.state);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1114 mergeNode.addForwardEnd(newEnd);
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1115
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1116 Debug.log("createTarget %s: merging state, result: %s", block, result);
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1117 return result;
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1118 }
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1119
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1120 /**
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1121 * 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
1122 * 0, the block deoptimizes immediately.
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1123 */
18993
480bd3b1adcd Rename BeginNode => AbstractBeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18937
diff changeset
1124 private AbstractBeginNode createBlockTarget(double probability, BciBlock block, HIRFrameStateBuilder stateAfter) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1125 FixedNode target = createTarget(probability, block, stateAfter);
18994
8b4ef818169c Make AbstractBeginNode an abstract class and create concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18993
diff changeset
1126 AbstractBeginNode begin = BeginNode.begin(target);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1127
15145
df2ef5204f2b Remove AbstractBeginNode, move the framestate from AbstractBeginNode to BeginStateSplitNode.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15032
diff changeset
1128 assert !(target instanceof DeoptimizeNode && begin instanceof BeginStateSplitNode && ((BeginStateSplitNode) begin).stateAfter() != null) : "We are not allowed to set the stateAfter of the begin node, because we have to deoptimize "
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1129 + "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
1130 return begin;
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1131 }
5051
2ab527c53dba another fix for goto's deopt case
Christian Haeubl <christian.haeubl@oracle.com>
parents: 5050
diff changeset
1132
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1133 private ValueNode synchronizedObject(HIRFrameStateBuilder state, ResolvedJavaMethod target) {
15311
820c6d353358 added ModifiersProvider as superinterface for ResolvedJava[Method|Field|Type] and implemented all checks against modifiers as default methods
Doug Simon <doug.simon@oracle.com>
parents: 15294
diff changeset
1134 if (target.isStatic()) {
18361
6ac7e9c85be6 Split getEncoding into two methods.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
1135 return appendConstant(target.getDeclaringClass().getJavaClass());
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1136 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1137 return state.loadLocal(0);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1138 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1139 }
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1140
18918
e8fd0342d9c4 GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18917
diff changeset
1141 protected void processBlock(BytecodeParser parser, BciBlock block) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1142 // 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
1143 if (block == null || block.firstInstruction == null) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1144 Debug.log("Ignoring block %s", block);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1145 return;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1146 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1147 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
1148
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1149 lastInstr = block.firstInstruction;
15032
c9bf91560c82 BciBlock: make entryState abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 15030
diff changeset
1150 frameState = (HIRFrameStateBuilder) block.entryState;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1151 parser.setCurrentFrameState(frameState);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1152 currentBlock = block;
4614
a3882fd1ae61 Make it possible to have multiple LoopEnds per LoopBegin
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 4554
diff changeset
1153
18995
a2cb19764970 Rename MergeNode to AbstractMergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18994
diff changeset
1154 if (lastInstr instanceof AbstractMergeNode) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1155 int bci = block.startBci;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1156 if (block instanceof ExceptionDispatchBlock) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1157 bci = ((ExceptionDispatchBlock) block).deoptBci;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1158 }
18995
a2cb19764970 Rename MergeNode to AbstractMergeNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18994
diff changeset
1159 ((AbstractMergeNode) lastInstr).setStateAfter(frameState.create(bci));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1160 }
14871
667710021ea1 removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents: 14851
diff changeset
1161
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1162 if (block == returnBlock) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1163 Kind returnKind = method.getSignature().getReturnKind().getStackKind();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1164 ValueNode x = returnKind == Kind.Void ? null : frameState.pop(returnKind);
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1165 assert frameState.stackSize() == 0;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1166 beforeReturn(x);
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1167 this.returnValue = x;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1168 this.beforeReturnNode = this.lastInstr;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1169 } else if (block == unwindBlock) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1170 if (currentDepth == 0) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1171 frameState.setRethrowException(false);
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1172 createUnwind();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1173 } else {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1174 ValueNode exception = frameState.apop();
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1175 this.unwindValue = exception;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1176 this.beforeUnwindNode = this.lastInstr;
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1177 }
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1178 } else if (block instanceof ExceptionDispatchBlock) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1179 createExceptionDispatch((ExceptionDispatchBlock) block);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1180 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1181 frameState.setRethrowException(false);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1182 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
1183 }
667710021ea1 removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents: 14851
diff changeset
1184 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1185 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1186
18916
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1187 /**
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1188 * Remove loop header without loop ends. This can happen with degenerated loops like
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1189 * this one:
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1190 *
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1191 * <pre>
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1192 * for (;;) {
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1193 * try {
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1194 * break;
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1195 * } catch (UnresolvedException iioe) {
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1196 * }
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1197 * }
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1198 * </pre>
66669e016466 Small clean up in GraphBuilderPhase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18915
diff changeset
1199 */
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1200 private void connectLoopEndToBegin() {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1201 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
1202 if (begin.loopEnds().isEmpty()) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1203 assert begin.forwardEndCount() == 1;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1204 currentGraph.reduceDegenerateLoopBegin(begin);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1205 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1206 GraphUtil.normalizeLoopBegin(begin);
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1207 }
9003
a8fea2979e63 eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents: 8660
diff changeset
1208 }
a8fea2979e63 eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents: 8660
diff changeset
1209 }
a8fea2979e63 eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents: 8660
diff changeset
1210
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1211 private void createUnwind() {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1212 assert frameState.stackSize() == 1 : frameState;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1213 ValueNode exception = frameState.apop();
15263
0b25b81414c9 Move various bci constants from FrameState (gral.nodes) to BytecodeFrame (graal.api.code)
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15261
diff changeset
1214 synchronizedEpilogue(BytecodeFrame.AFTER_EXCEPTION_BCI, null);
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1215 append(new UnwindNode(exception));
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1216 }
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1217
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1218 private void synchronizedEpilogue(int bci, ValueNode currentReturnValue) {
15267
98d45600222c Add ResolvedJavaMethod.isSynchronized
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15266
diff changeset
1219 if (method.isSynchronized()) {
18922
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1220 MonitorExitNode monitorExit = genMonitorExit(methodSynchronizedObject, currentReturnValue);
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1221 if (currentReturnValue != null) {
fede93375dcb Initial version of inlining during parsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18921
diff changeset
1222 frameState.push(currentReturnValue.getKind(), currentReturnValue);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1223 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1224 monitorExit.setStateAfter(frameState.create(bci));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1225 assert !frameState.rethrowException();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1226 }
6676
090868cbcda6 Graal infrastructure for OnStackReplacement
Lukas Stadler <lukas.stadler@jku.at>
parents: 6648
diff changeset
1227 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1228
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1229 private void createExceptionDispatch(ExceptionDispatchBlock block) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1230 assert frameState.stackSize() == 1 : frameState;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1231 if (block.handler.isCatchAll()) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1232 assert block.getSuccessorCount() == 1;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1233 appendGoto(createTarget(block.getSuccessor(0), frameState));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1234 return;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1235 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1236
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1237 JavaType catchType = block.handler.getCatchType();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1238 if (graphBuilderConfig.eagerResolving()) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1239 catchType = lookupType(block.handler.catchTypeCPI(), INSTANCEOF);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1240 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1241 boolean initialized = (catchType instanceof ResolvedJavaType);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1242 if (initialized && graphBuilderConfig.getSkippedExceptionTypes() != null) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1243 ResolvedJavaType resolvedCatchType = (ResolvedJavaType) catchType;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1244 for (ResolvedJavaType skippedType : graphBuilderConfig.getSkippedExceptionTypes()) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1245 if (skippedType.isAssignableFrom(resolvedCatchType)) {
15220
ccf0c5a1edf1 Use a synthetic BCI instead of a random BCI (the first parsed bytecode that could throw an exception) for the exception unwind block
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15200
diff changeset
1246 BciBlock nextBlock = block.getSuccessorCount() == 1 ? unwindBlock() : block.getSuccessor(1);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1247 ValueNode exception = frameState.stackAt(0);
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1248 FixedNode trueSuccessor = currentGraph.add(new DeoptimizeNode(InvalidateReprofile, UnreachedCode));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1249 FixedNode nextDispatch = createTarget(nextBlock, frameState);
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1250 append(new IfNode(currentGraph.unique(new InstanceOfNode((ResolvedJavaType) catchType, exception, null)), trueSuccessor, nextDispatch, 0));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1251 return;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1252 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1253 }
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1254 }
5256
1e153fdac9fb Fix and simplify exception handling in the bytecode parser
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents: 5255
diff changeset
1255
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1256 if (initialized) {
15220
ccf0c5a1edf1 Use a synthetic BCI instead of a random BCI (the first parsed bytecode that could throw an exception) for the exception unwind block
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15200
diff changeset
1257 BciBlock nextBlock = block.getSuccessorCount() == 1 ? unwindBlock() : block.getSuccessor(1);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1258 ValueNode exception = frameState.stackAt(0);
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1259 CheckCastNode checkCast = currentGraph.add(new CheckCastNode((ResolvedJavaType) catchType, exception, null, false));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1260 frameState.apop();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1261 frameState.push(Kind.Object, checkCast);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1262 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
1263 frameState.apop();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1264 frameState.push(Kind.Object, exception);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1265 FixedNode nextDispatch = createTarget(nextBlock, frameState);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1266 checkCast.setNext(catchSuccessor);
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1267 append(new IfNode(currentGraph.unique(new InstanceOfNode((ResolvedJavaType) catchType, exception, null)), checkCast, nextDispatch, 0.5));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1268 } else {
18361
6ac7e9c85be6 Split getEncoding into two methods.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
1269 handleUnresolvedExceptionType(catchType);
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1270 }
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1271 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1272
15030
e098038093d5 AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents: 15029
diff changeset
1273 private void appendGoto(FixedNode target) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1274 if (lastInstr != null) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1275 lastInstr.setNext(target);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1276 }
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1279 private boolean isBlockEnd(Node n) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1280 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
1281 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1282
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1283 @Override
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1284 protected void iterateBytecodesForBlock(BciBlock block) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1285 if (block.isLoopHeader) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1286 // Create the loop header block, which later will merge the backward branches of
18912
9536c47658a2 Introduce new option InlineDuringParsing.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18845
diff changeset
1287 // the loop.
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1288 AbstractEndNode preLoopEnd = currentGraph.add(new EndNode());
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1289 LoopBeginNode loopBegin = currentGraph.add(new LoopBeginNode());
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1290 lastInstr.setNext(preLoopEnd);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1291 // 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
1292 loopBegin.addForwardEnd(preLoopEnd);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1293 lastInstr = loopBegin;
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1294
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1295 // 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
1296 frameState.insertLoopPhis(loopBegin);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1297 loopBegin.setStateAfter(frameState.create(block.startBci));
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1298
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1299 /*
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1300 * 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
1301 * 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
1302 * non-loop predecessor.
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1303 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1304 block.firstInstruction = loopBegin;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1305 /*
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1306 * 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
1307 * 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
1308 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1309 block.entryState = frameState.copy();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1310
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1311 Debug.log(" created loop header %s", loopBegin);
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1312 }
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1313 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
1314 Debug.log(" frameState: %s", frameState);
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 lastInstr = finishInstruction(lastInstr, frameState);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1317
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1318 int endBCI = stream.endBCI();
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.setBCI(block.startBci);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1321 int bci = block.startBci;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1322 BytecodesParsed.add(block.endBci - bci);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1323
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1324 while (bci < endBCI) {
16573
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
1325 if (graphBuilderConfig.insertNonSafepointDebugInfo() && lnt != null) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1326 currentLineNumber = lnt.getLineNumber(bci);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1327 if (currentLineNumber != previousLineNumber) {
16573
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
1328 append(createInfoPointNode(InfopointReason.LINE_NUMBER));
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1329 previousLineNumber = currentLineNumber;
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1330 }
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1331 }
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1332
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1333 // read the opcode
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1334 int opcode = stream.currentBC();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1335 traceState();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1336 traceInstruction(bci, opcode, bci == block.startBci);
18920
4af661af76fd Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18919
diff changeset
1337 if (currentDepth == 0 && bci == entryBCI) {
18818
adf3a8581a67 Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18817
diff changeset
1338 if (block.getJsrScope() != JsrScope.EMPTY_SCOPE) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1339 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
1340 }
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1341 EntryMarkerNode x = append(new EntryMarkerNode());
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1342 frameState.insertProxies(x);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1343 x.setStateAfter(frameState.create(bci));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1344 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1345 processBytecode(bci, opcode);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1346
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1347 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
1348 break;
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
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1351 stream.next();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1352 bci = stream.currentBCI();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1353
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1354 if (bci > block.endBci) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1355 frameState.clearNonLiveLocals(currentBlock, liveness, false);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1356 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1357 if (lastInstr instanceof StateSplit) {
18993
480bd3b1adcd Rename BeginNode => AbstractBeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18937
diff changeset
1358 if (lastInstr.getClass() == AbstractBeginNode.class) {
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1359 // 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
1360 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1361 StateSplit stateSplit = (StateSplit) lastInstr;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1362 if (stateSplit.stateAfter() == null) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1363 stateSplit.setStateAfter(frameState.create(bci));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1364 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1365 }
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 lastInstr = finishInstruction(lastInstr, frameState);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1368 if (bci < endBCI) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1369 if (bci > block.endBci) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1370 assert !block.getSuccessor(0).isExceptionEntry;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1371 assert block.numNormalSuccessors() == 1;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1372 // 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
1373 appendGoto(createTarget(block.getSuccessor(0), frameState));
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1374 break;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1375 }
5375
3035b6b881d9 removed stateAfter field from FixedWithNextNode - now only StateSplit implementations have this field
Doug Simon <doug.simon@oracle.com>
parents: 5373
diff changeset
1376 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1377 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1378 }
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13584
diff changeset
1379
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1380 /**
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1381 * 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
1382 *
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1383 * @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
1384 * @param state The current frame state.
14906
f3a5036cc13c javadoc fixes
Bernhard Urban <bernhard.urban@jku.at>
parents: 14904
diff changeset
1385 * @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
1386 */
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1387 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
1388 return instr;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1389 }
14758
c612c2742a4f extend graph builder and CompilationResult for substrateVM
Erik Eckstein <erik.eckstein@oracle.com>
parents: 14746
diff changeset
1390
16573
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
1391 private InfopointNode createInfoPointNode(InfopointReason reason) {
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
1392 if (graphBuilderConfig.insertFullDebugInfo()) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1393 return new FullInfopointNode(reason, frameState.create(bci()));
16573
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
1394 } else {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18833
diff changeset
1395 return new SimpleInfopointNode(reason, new BytecodePosition(null, method, bci()));
16573
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
1396 }
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
1397 }
a2ec1ac769e4 Add simple infopoint nodes which do not contain debugging informations for values. Use them when shouldDebugNonSafepoints is true.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 16563
diff changeset
1398
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1399 private void traceState() {
18817
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1400 if (Debug.isEnabled() && Options.TraceBytecodeParserLevel.getValue() >= TRACELEVEL_STATE && Debug.isLogEnabled()) {
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1401 traceStateHelper();
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1402 }
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1403 }
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1404
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1405 private void traceStateHelper() {
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1406 Debug.log(String.format("| state [nr locals = %d, stack depth = %d, method = %s]", frameState.localsSize(), frameState.stackSize(), method));
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1407 for (int i = 0; i < frameState.localsSize(); ++i) {
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1408 ValueNode value = frameState.localAt(i);
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1409 Debug.log(String.format("| local[%d] = %-8s : %s", i, value == null ? "bogus" : value.getKind().getJavaName(), value));
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1410 }
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1411 for (int i = 0; i < frameState.stackSize(); ++i) {
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1412 ValueNode value = frameState.stackAt(i);
b51cfbc2bd07 Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
1413 Debug.log(String.format("| stack[%d] = %-8s : %s", i, value == null ? "bogus" : value.getKind().getJavaName(), value));
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1414 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1415 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1416
14947
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1417 @Override
14948
bc72e5ed9752 AbstractBytecodeParser: rename ifNode to genIf.
Josef Eisl <josef.eisl@jku.at>
parents: 14947
diff changeset
1418 protected void genIf(ValueNode x, Condition cond, ValueNode y) {
14947
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1419 // assert !x.isDeleted() && !y.isDeleted();
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1420 // assert currentBlock.numNormalSuccessors() == 2;
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1421 assert currentBlock.getSuccessors().size() == 2;
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1422 BciBlock trueBlock = currentBlock.getSuccessors().get(0);
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1423 BciBlock falseBlock = currentBlock.getSuccessors().get(1);
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1424 if (trueBlock == falseBlock) {
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1425 appendGoto(createTarget(trueBlock, frameState));
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1426 return;
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
16886
b61b88c9c103 Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16841
diff changeset
1429 double probability = branchProbability();
14947
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1430
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1431 // 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
1432 boolean mirror = cond.canonicalMirror();
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1433 boolean negate = cond.canonicalNegate();
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1434
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1435 ValueNode a = mirror ? y : x;
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1436 ValueNode b = mirror ? x : y;
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1437
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1438 ValueNode condition;
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1439 assert !a.getKind().isNumericFloat();
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1440 if (cond == Condition.EQ || cond == Condition.NE) {
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1441 if (a.getKind() == Kind.Object) {
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1442 condition = genObjectEquals(a, b);
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1443 } else {
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1444 condition = genIntegerEquals(a, b);
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1445 }
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1446 } else {
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1447 assert a.getKind() != Kind.Object && !cond.isUnsigned();
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1448 condition = genIntegerLessThan(a, b);
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1449 }
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1450 condition = genUnique(condition);
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1451
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1452 ValueNode trueSuccessor = createBlockTarget(probability, trueBlock, frameState);
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1453 ValueNode falseSuccessor = createBlockTarget(1 - probability, falseBlock, frameState);
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1454
14948
bc72e5ed9752 AbstractBytecodeParser: rename ifNode to genIf.
Josef Eisl <josef.eisl@jku.at>
parents: 14947
diff changeset
1455 ValueNode ifNode = negate ? genIfNode(condition, falseSuccessor, trueSuccessor, 1 - probability) : genIfNode(condition, trueSuccessor, falseSuccessor, probability);
14947
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1456 append(ifNode);
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1457 }
3825cf50cc5a AbstractBytecodeParser: make ifNode abstract.
Josef Eisl <josef.eisl@jku.at>
parents: 14922
diff changeset
1458
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1459 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1460 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1461 }