Mercurial > hg > truffle
annotate src/share/vm/opto/escape.hpp @ 4849:520830f632e7
7131346: Parsing of boolean arguments to diagnostic commands is broken
Reviewed-by: dholmes, dcubed
author | fparain |
---|---|
date | Wed, 25 Jan 2012 10:32:29 -0800 |
parents | cc81b9c09bbb |
children | ee138854b3a6 |
rev | line source |
---|---|
0 | 1 /* |
2249 | 2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1101
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1101
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1101
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_OPTO_ESCAPE_HPP |
26 #define SHARE_VM_OPTO_ESCAPE_HPP | |
27 | |
28 #include "opto/addnode.hpp" | |
29 #include "opto/node.hpp" | |
30 #include "utilities/growableArray.hpp" | |
31 | |
0 | 32 // |
33 // Adaptation for C2 of the escape analysis algorithm described in: | |
34 // | |
65 | 35 // [Choi99] Jong-Deok Shoi, Manish Gupta, Mauricio Seffano, |
36 // Vugranam C. Sreedhar, Sam Midkiff, | |
37 // "Escape Analysis for Java", Procedings of ACM SIGPLAN | |
38 // OOPSLA Conference, November 1, 1999 | |
0 | 39 // |
40 // The flow-insensitive analysis described in the paper has been implemented. | |
41 // | |
65 | 42 // The analysis requires construction of a "connection graph" (CG) for |
43 // the method being analyzed. The nodes of the connection graph are: | |
0 | 44 // |
45 // - Java objects (JO) | |
46 // - Local variables (LV) | |
47 // - Fields of an object (OF), these also include array elements | |
48 // | |
49 // The CG contains 3 types of edges: | |
50 // | |
65 | 51 // - PointsTo (-P>) {LV, OF} to JO |
52 // - Deferred (-D>) from {LV, OF} to {LV, OF} | |
0 | 53 // - Field (-F>) from JO to OF |
54 // | |
55 // The following utility functions is used by the algorithm: | |
56 // | |
65 | 57 // PointsTo(n) - n is any CG node, it returns the set of JO that n could |
58 // point to. | |
0 | 59 // |
65 | 60 // The algorithm describes how to construct the connection graph |
61 // in the following 4 cases: | |
0 | 62 // |
63 // Case Edges Created | |
64 // | |
65 | 65 // (1) p = new T() LV -P> JO |
66 // (2) p = q LV -D> LV | |
67 // (3) p.f = q JO -F> OF, OF -D> LV | |
68 // (4) p = q.f JO -F> OF, LV -D> OF | |
0 | 69 // |
65 | 70 // In all these cases, p and q are local variables. For static field |
71 // references, we can construct a local variable containing a reference | |
72 // to the static memory. | |
0 | 73 // |
74 // C2 does not have local variables. However for the purposes of constructing | |
75 // the connection graph, the following IR nodes are treated as local variables: | |
76 // Phi (pointer values) | |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
77 // LoadP, LoadN |
65 | 78 // Proj#5 (value returned from callnodes including allocations) |
79 // CheckCastPP, CastPP | |
0 | 80 // |
65 | 81 // The LoadP, Proj and CheckCastPP behave like variables assigned to only once. |
82 // Only a Phi can have multiple assignments. Each input to a Phi is treated | |
0 | 83 // as an assignment to it. |
84 // | |
65 | 85 // The following node types are JavaObject: |
0 | 86 // |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
87 // phantom_object (general globally escaped object) |
0 | 88 // Allocate |
89 // AllocateArray | |
90 // Parm (for incoming arguments) | |
65 | 91 // CastX2P ("unsafe" operations) |
0 | 92 // CreateEx |
93 // ConP | |
94 // LoadKlass | |
65 | 95 // ThreadLocal |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
96 // CallStaticJava (which returns Object) |
0 | 97 // |
98 // AddP nodes are fields. | |
99 // | |
100 // After building the graph, a pass is made over the nodes, deleting deferred | |
101 // nodes and copying the edges from the target of the deferred edge to the | |
102 // source. This results in a graph with no deferred edges, only: | |
103 // | |
104 // LV -P> JO | |
65 | 105 // OF -P> JO (the object whose oop is stored in the field) |
0 | 106 // JO -F> OF |
107 // | |
108 // Then, for each node which is GlobalEscape, anything it could point to | |
109 // is marked GlobalEscape. Finally, for any node marked ArgEscape, anything | |
110 // it could point to is marked ArgEscape. | |
111 // | |
112 | |
113 class Compile; | |
114 class Node; | |
115 class CallNode; | |
116 class PhiNode; | |
117 class PhaseTransform; | |
118 class Type; | |
119 class TypePtr; | |
120 class VectorSet; | |
121 | |
122 class PointsToNode { | |
123 friend class ConnectionGraph; | |
124 public: | |
125 typedef enum { | |
65 | 126 UnknownType = 0, |
127 JavaObject = 1, | |
128 LocalVar = 2, | |
129 Field = 3 | |
0 | 130 } NodeType; |
131 | |
132 typedef enum { | |
133 UnknownEscape = 0, | |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
134 NoEscape = 1, // An object does not escape method or thread and it is |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
135 // not passed to call. It could be replaced with scalar. |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
136 ArgEscape = 2, // An object does not escape method or thread but it is |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
137 // passed as argument to call or referenced by argument |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
138 // and it does not escape during call. |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
139 GlobalEscape = 3 // An object escapes the method or thread. |
0 | 140 } EscapeState; |
141 | |
142 typedef enum { | |
143 UnknownEdge = 0, | |
144 PointsToEdge = 1, | |
145 DeferredEdge = 2, | |
146 FieldEdge = 3 | |
147 } EdgeType; | |
148 | |
149 private: | |
150 enum { | |
151 EdgeMask = 3, | |
152 EdgeShift = 2, | |
153 | |
154 INITIAL_EDGE_COUNT = 4 | |
155 }; | |
156 | |
157 NodeType _type; | |
158 EscapeState _escape; | |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
159 GrowableArray<uint>* _edges; // outgoing edges |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
160 Node* _node; // Ideal node corresponding to this PointsTo node. |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
161 int _offset; // Object fields offsets. |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
162 bool _scalar_replaceable; // Not escaped object could be replaced with scalar |
4122
cc81b9c09bbb
7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents:
4113
diff
changeset
|
163 bool _has_unknown_ptr; // Has edge to phantom_object |
0 | 164 |
165 public: | |
65 | 166 PointsToNode(): |
167 _type(UnknownType), | |
168 _escape(UnknownEscape), | |
169 _edges(NULL), | |
170 _node(NULL), | |
171 _offset(-1), | |
4122
cc81b9c09bbb
7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents:
4113
diff
changeset
|
172 _has_unknown_ptr(false), |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
173 _scalar_replaceable(true) {} |
0 | 174 |
175 | |
176 EscapeState escape_state() const { return _escape; } | |
177 NodeType node_type() const { return _type;} | |
178 int offset() { return _offset;} | |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
179 bool scalar_replaceable() { return _scalar_replaceable;} |
4122
cc81b9c09bbb
7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents:
4113
diff
changeset
|
180 bool has_unknown_ptr() { return _has_unknown_ptr;} |
0 | 181 |
182 void set_offset(int offs) { _offset = offs;} | |
183 void set_escape_state(EscapeState state) { _escape = state; } | |
184 void set_node_type(NodeType ntype) { | |
185 assert(_type == UnknownType || _type == ntype, "Can't change node type"); | |
186 _type = ntype; | |
187 } | |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
188 void set_scalar_replaceable(bool v) { _scalar_replaceable = v; } |
4122
cc81b9c09bbb
7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents:
4113
diff
changeset
|
189 void set_has_unknown_ptr() { _has_unknown_ptr = true; } |
0 | 190 |
191 // count of outgoing edges | |
192 uint edge_count() const { return (_edges == NULL) ? 0 : _edges->length(); } | |
244
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
193 |
0 | 194 // node index of target of outgoing edge "e" |
244
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
195 uint edge_target(uint e) const { |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
196 assert(_edges != NULL, "valid edge index"); |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
197 return (_edges->at(e) >> EdgeShift); |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
198 } |
0 | 199 // type of outgoing edge "e" |
244
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
200 EdgeType edge_type(uint e) const { |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
201 assert(_edges != NULL, "valid edge index"); |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
202 return (EdgeType) (_edges->at(e) & EdgeMask); |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
203 } |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
204 |
0 | 205 // add a edge of the specified type pointing to the specified target |
206 void add_edge(uint targIdx, EdgeType et); | |
244
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
207 |
0 | 208 // remove an edge of the specified type pointing to the specified target |
209 void remove_edge(uint targIdx, EdgeType et); | |
244
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
210 |
0 | 211 #ifndef PRODUCT |
253
b0fe4deeb9fb
6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
kvn
parents:
245
diff
changeset
|
212 void dump(bool print_state=true) const; |
0 | 213 #endif |
214 | |
215 }; | |
216 | |
217 class ConnectionGraph: public ResourceObj { | |
218 private: | |
244
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
219 GrowableArray<PointsToNode> _nodes; // Connection graph nodes indexed |
65 | 220 // by ideal node index. |
0 | 221 |
65 | 222 Unique_Node_List _delayed_worklist; // Nodes to be processed before |
223 // the call build_connection_graph(). | |
224 | |
1100
f96a1a986f7b
6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents:
293
diff
changeset
|
225 GrowableArray<MergeMemNode *> _mergemem_worklist; // List of all MergeMem nodes |
f96a1a986f7b
6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents:
293
diff
changeset
|
226 |
65 | 227 VectorSet _processed; // Records which nodes have been |
228 // processed. | |
0 | 229 |
65 | 230 bool _collecting; // Indicates whether escape information |
231 // is still being collected. If false, | |
232 // no new nodes will be processed. | |
233 | |
1921 | 234 bool _progress; // Indicates whether new Graph's edges |
235 // were created. | |
236 | |
65 | 237 uint _phantom_object; // Index of globally escaping object |
238 // that pointer values loaded from | |
239 // a field which has not been set | |
240 // are assumed to point to. | |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
241 uint _oop_null; // ConP(#NULL)->_idx |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
242 uint _noop_null; // ConN(#NULL)->_idx |
4113 | 243 Node* _pcmp_neq; // ConI(#CC_GT) |
244 Node* _pcmp_eq; // ConI(#CC_EQ) | |
65 | 245 |
246 Compile * _compile; // Compile object for current compilation | |
1634
60a14ad85270
6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents:
1552
diff
changeset
|
247 PhaseIterGVN * _igvn; // Value numbering |
0 | 248 |
244
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
249 // Address of an element in _nodes. Used when the element is to be modified |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
250 PointsToNode *ptnode_adr(uint idx) const { |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
251 // There should be no new ideal nodes during ConnectionGraph build, |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
252 // growableArray::adr_at() will throw assert otherwise. |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
253 return _nodes.adr_at(idx); |
0 | 254 } |
244
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
255 uint nodes_size() const { return _nodes.length(); } |
0 | 256 |
4122
cc81b9c09bbb
7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents:
4113
diff
changeset
|
257 bool is_null_ptr(uint idx) const { return (idx == _noop_null || idx == _oop_null); } |
cc81b9c09bbb
7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents:
4113
diff
changeset
|
258 |
65 | 259 // Add node to ConnectionGraph. |
260 void add_node(Node *n, PointsToNode::NodeType nt, PointsToNode::EscapeState es, bool done); | |
261 | |
0 | 262 // offset of a field reference |
65 | 263 int address_offset(Node* adr, PhaseTransform *phase); |
0 | 264 |
265 // compute the escape state for arguments to a call | |
266 void process_call_arguments(CallNode *call, PhaseTransform *phase); | |
267 | |
268 // compute the escape state for the return value of a call | |
269 void process_call_result(ProjNode *resproj, PhaseTransform *phase); | |
270 | |
65 | 271 // Populate Connection Graph with Ideal nodes. |
272 void record_for_escape_analysis(Node *n, PhaseTransform *phase); | |
0 | 273 |
65 | 274 // Build Connection Graph and set nodes escape state. |
275 void build_connection_graph(Node *n, PhaseTransform *phase); | |
0 | 276 |
277 // walk the connection graph starting at the node corresponding to "n" and | |
278 // add the index of everything it could point to, to "ptset". This may cause | |
279 // Phi's encountered to get (re)processed (which requires "phase".) | |
2249 | 280 VectorSet* PointsTo(Node * n); |
281 | |
282 // Reused structures for PointsTo(). | |
283 VectorSet pt_ptset; | |
284 VectorSet pt_visited; | |
285 GrowableArray<uint> pt_worklist; | |
0 | 286 |
287 // Edge manipulation. The "from_i" and "to_i" arguments are the | |
288 // node indices of the source and destination of the edge | |
289 void add_pointsto_edge(uint from_i, uint to_i); | |
290 void add_deferred_edge(uint from_i, uint to_i); | |
291 void add_field_edge(uint from_i, uint to_i, int offs); | |
292 | |
1921 | 293 // Add an edge of the specified type pointing to the specified target. |
294 // Set _progress if new edge is added. | |
295 void add_edge(PointsToNode *f, uint to_i, PointsToNode::EdgeType et) { | |
296 uint e_cnt = f->edge_count(); | |
297 f->add_edge(to_i, et); | |
298 _progress |= (f->edge_count() != e_cnt); | |
299 } | |
0 | 300 |
301 // Add an edge to node given by "to_i" from any field of adr_i whose offset | |
302 // matches "offset" A deferred edge is added if to_i is a LocalVar, and | |
303 // a pointsto edge is added if it is a JavaObject | |
304 void add_edge_from_fields(uint adr, uint to_i, int offs); | |
305 | |
65 | 306 // Add a deferred edge from node given by "from_i" to any field |
307 // of adr_i whose offset matches "offset" | |
0 | 308 void add_deferred_edge_to_fields(uint from_i, uint adr, int offs); |
309 | |
310 | |
311 // Remove outgoing deferred edges from the node referenced by "ni". | |
312 // Any outgoing edges from the target of the deferred edge are copied | |
313 // to "ni". | |
101
a6cb86dd209b
6681577: PIT: some VM tests fails with -XX:+AggressiveOpts in 6u5p b01
kvn
parents:
65
diff
changeset
|
314 void remove_deferred(uint ni, GrowableArray<uint>* deferred_edges, VectorSet* visited); |
0 | 315 |
316 Node_Array _node_map; // used for bookeeping during type splitting | |
317 // Used for the following purposes: | |
318 // Memory Phi - most recent unique Phi split out | |
319 // from this Phi | |
320 // MemNode - new memory input for this node | |
321 // ChecCastPP - allocation that this is a cast of | |
322 // allocation - CheckCastPP of the allocation | |
293
c3e045194476
6731641: assert(m->adr_type() == mach->adr_type(),"matcher should not change adr type")
kvn
parents:
253
diff
changeset
|
323 bool split_AddP(Node *addp, Node *base, PhaseGVN *igvn); |
0 | 324 PhiNode *create_split_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn, bool &new_created); |
325 PhiNode *split_memory_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn); | |
1101
7fee0a6cc6d4
6896727: nsk/logging/LoggingPermission/LoggingPermission/logperm002 fails with G1, EscapeAnalisys
kvn
parents:
1100
diff
changeset
|
326 void move_inst_mem(Node* n, GrowableArray<PhiNode *> &orig_phis, PhaseGVN *igvn); |
65 | 327 Node *find_inst_mem(Node *mem, int alias_idx,GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn); |
328 | |
0 | 329 // Propagate unique types created for unescaped allocated objects |
330 // through the graph | |
331 void split_unique_types(GrowableArray<Node *> &alloc_worklist); | |
332 | |
333 // manage entries in _node_map | |
334 void set_map(int idx, Node *n) { _node_map.map(idx, n); } | |
335 Node *get_map(int idx) { return _node_map[idx]; } | |
336 PhiNode *get_map_phi(int idx) { | |
337 Node *phi = _node_map[idx]; | |
338 return (phi == NULL) ? NULL : phi->as_Phi(); | |
339 } | |
340 | |
341 // Notify optimizer that a node has been modified | |
342 void record_for_optimizer(Node *n) { | |
1634
60a14ad85270
6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents:
1552
diff
changeset
|
343 _igvn->_worklist.push(n); |
4122
cc81b9c09bbb
7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents:
4113
diff
changeset
|
344 _igvn->add_users_to_worklist(n); |
0 | 345 } |
346 | |
347 // Set the escape state of a node | |
348 void set_escape_state(uint ni, PointsToNode::EscapeState es); | |
349 | |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
350 // Find fields initializing values for allocations. |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
351 void find_init_values(Node* n, VectorSet* visited, PhaseTransform* phase); |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
352 |
2249 | 353 // Adjust escape state after Connection Graph is built. |
4058
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
354 void adjust_escape_state(Node* n); |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
355 |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
356 // Propagate escape states to referenced nodes. |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
357 bool propagate_escape_state(GrowableArray<int>* cg_worklist, |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
358 GrowableArray<uint>* worklist, |
59e515ee9354
7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents:
2249
diff
changeset
|
359 PointsToNode::EscapeState esc_state); |
2249 | 360 |
4113 | 361 // Optimize objects compare. |
362 Node* optimize_ptr_compare(Node* n); | |
363 | |
2249 | 364 // Compute the escape information |
365 bool compute_escape(); | |
1100
f96a1a986f7b
6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents:
293
diff
changeset
|
366 |
0 | 367 public: |
1634
60a14ad85270
6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents:
1552
diff
changeset
|
368 ConnectionGraph(Compile *C, PhaseIterGVN *igvn); |
0 | 369 |
244
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
370 // Check for non-escaping candidates |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
371 static bool has_candidates(Compile *C); |
524eca34ea76
6684714: Optimize EA Connection Graph build performance
kvn
parents:
101
diff
changeset
|
372 |
1634
60a14ad85270
6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents:
1552
diff
changeset
|
373 // Perform escape analysis |
60a14ad85270
6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents:
1552
diff
changeset
|
374 static void do_analysis(Compile *C, PhaseIterGVN *igvn); |
60a14ad85270
6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents:
1552
diff
changeset
|
375 |
0 | 376 // escape state of a node |
1634
60a14ad85270
6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents:
1552
diff
changeset
|
377 PointsToNode::EscapeState escape_state(Node *n); |
60a14ad85270
6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents:
1552
diff
changeset
|
378 |
0 | 379 #ifndef PRODUCT |
380 void dump(); | |
381 #endif | |
382 }; | |
1972 | 383 |
384 #endif // SHARE_VM_OPTO_ESCAPE_HPP |