annotate src/share/vm/opto/escape.hpp @ 4710:41406797186b

7113012: G1: rename not-fully-young GCs as "mixed" Summary: Renamed partially-young GCs as mixed and fully-young GCs as young. Change all external output that includes those terms (GC log and GC ergo log) as well as any comments, fields, methods, etc. The changeset also includes very minor code tidying up (added some curly brackets). Reviewed-by: johnc, brutisso
author tonyp
date Fri, 16 Dec 2011 02:14:27 -0500
parents cc81b9c09bbb
children ee138854b3a6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2249
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
25 #ifndef SHARE_VM_OPTO_ESCAPE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
26 #define SHARE_VM_OPTO_ESCAPE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
28 #include "opto/addnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
29 #include "opto/node.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
30 #include "utilities/growableArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
31
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32 //
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // Adaptation for C2 of the escape analysis algorithm described in:
a61af66fc99e Initial load
duke
parents:
diff changeset
34 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
35 // [Choi99] Jong-Deok Shoi, Manish Gupta, Mauricio Seffano,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
36 // Vugranam C. Sreedhar, Sam Midkiff,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
37 // "Escape Analysis for Java", Procedings of ACM SIGPLAN
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
38 // OOPSLA Conference, November 1, 1999
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39 //
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // The flow-insensitive analysis described in the paper has been implemented.
a61af66fc99e Initial load
duke
parents:
diff changeset
41 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
42 // The analysis requires construction of a "connection graph" (CG) for
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
43 // the method being analyzed. The nodes of the connection graph are:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
44 //
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // - Java objects (JO)
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // - Local variables (LV)
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // - Fields of an object (OF), these also include array elements
a61af66fc99e Initial load
duke
parents:
diff changeset
48 //
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // The CG contains 3 types of edges:
a61af66fc99e Initial load
duke
parents:
diff changeset
50 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
51 // - PointsTo (-P>) {LV, OF} to JO
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
52 // - Deferred (-D>) from {LV, OF} to {LV, OF}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // - Field (-F>) from JO to OF
a61af66fc99e Initial load
duke
parents:
diff changeset
54 //
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // The following utility functions is used by the algorithm:
a61af66fc99e Initial load
duke
parents:
diff changeset
56 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
57 // PointsTo(n) - n is any CG node, it returns the set of JO that n could
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
58 // point to.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
59 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
60 // The algorithm describes how to construct the connection graph
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
61 // in the following 4 cases:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 //
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // Case Edges Created
a61af66fc99e Initial load
duke
parents:
diff changeset
64 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
65 // (1) p = new T() LV -P> JO
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
66 // (2) p = q LV -D> LV
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
67 // (3) p.f = q JO -F> OF, OF -D> LV
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
68 // (4) p = q.f JO -F> OF, LV -D> OF
0
a61af66fc99e Initial load
duke
parents:
diff changeset
69 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
70 // In all these cases, p and q are local variables. For static field
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
71 // references, we can construct a local variable containing a reference
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
72 // to the static memory.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
73 //
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // C2 does not have local variables. However for the purposes of constructing
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // the connection graph, the following IR nodes are treated as local variables:
a61af66fc99e Initial load
duke
parents:
diff changeset
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
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
78 // Proj#5 (value returned from callnodes including allocations)
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
79 // CheckCastPP, CastPP
0
a61af66fc99e Initial load
duke
parents:
diff changeset
80 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
81 // The LoadP, Proj and CheckCastPP behave like variables assigned to only once.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
82 // Only a Phi can have multiple assignments. Each input to a Phi is treated
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // as an assignment to it.
a61af66fc99e Initial load
duke
parents:
diff changeset
84 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
85 // The following node types are JavaObject:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // Allocate
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // AllocateArray
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Parm (for incoming arguments)
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
91 // CastX2P ("unsafe" operations)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // CreateEx
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // ConP
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // LoadKlass
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
97 //
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // AddP nodes are fields.
a61af66fc99e Initial load
duke
parents:
diff changeset
99 //
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // After building the graph, a pass is made over the nodes, deleting deferred
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // nodes and copying the edges from the target of the deferred edge to the
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // source. This results in a graph with no deferred edges, only:
a61af66fc99e Initial load
duke
parents:
diff changeset
103 //
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // LV -P> JO
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
105 // OF -P> JO (the object whose oop is stored in the field)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // JO -F> OF
a61af66fc99e Initial load
duke
parents:
diff changeset
107 //
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // Then, for each node which is GlobalEscape, anything it could point to
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // is marked GlobalEscape. Finally, for any node marked ArgEscape, anything
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // it could point to is marked ArgEscape.
a61af66fc99e Initial load
duke
parents:
diff changeset
111 //
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 class Compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 class Node;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 class CallNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 class PhiNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 class PhaseTransform;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 class Type;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 class TypePtr;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 class VectorSet;
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 class PointsToNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 friend class ConnectionGraph;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
125 typedef enum {
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
126 UnknownType = 0,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
127 JavaObject = 1,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
128 LocalVar = 2,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
129 Field = 3
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 } NodeType;
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 typedef enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
140 } EscapeState;
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 typedef enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 UnknownEdge = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
144 PointsToEdge = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
145 DeferredEdge = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
146 FieldEdge = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
147 } EdgeType;
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
150 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 EdgeMask = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
152 EdgeShift = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 INITIAL_EDGE_COUNT = 4
a61af66fc99e Initial load
duke
parents:
diff changeset
155 };
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 NodeType _type;
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 public:
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
166 PointsToNode():
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
167 _type(UnknownType),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
168 _escape(UnknownEscape),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
169 _edges(NULL),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
170 _node(NULL),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 EscapeState escape_state() const { return _escape; }
a61af66fc99e Initial load
duke
parents:
diff changeset
177 NodeType node_type() const { return _type;}
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 void set_offset(int offs) { _offset = offs;}
a61af66fc99e Initial load
duke
parents:
diff changeset
183 void set_escape_state(EscapeState state) { _escape = state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
184 void set_node_type(NodeType ntype) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 assert(_type == UnknownType || _type == ntype, "Can't change node type");
a61af66fc99e Initial load
duke
parents:
diff changeset
186 _type = ntype;
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // count of outgoing edges
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // add a edge of the specified type pointing to the specified target
a61af66fc99e Initial load
duke
parents:
diff changeset
206 void add_edge(uint targIdx, EdgeType et);
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
207
0
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // remove an edge of the specified type pointing to the specified target
a61af66fc99e Initial load
duke
parents:
diff changeset
209 void remove_edge(uint targIdx, EdgeType et);
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
210
0
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
213 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 };
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 class ConnectionGraph: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
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
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
220 // by ideal node index.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
221
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
222 Unique_Node_List _delayed_worklist; // Nodes to be processed before
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
223 // the call build_connection_graph().
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
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
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
227 VectorSet _processed; // Records which nodes have been
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
228 // processed.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
229
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
230 bool _collecting; // Indicates whether escape information
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
231 // is still being collected. If false,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
232 // no new nodes will be processed.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
233
1921
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
234 bool _progress; // Indicates whether new Graph's edges
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
235 // were created.
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
236
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
237 uint _phantom_object; // Index of globally escaping object
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
238 // that pointer values loaded from
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
239 // a field which has not been set
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
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
8c57262447d3 7105605: Use EA info to optimize pointers compare
kvn
parents: 4058
diff changeset
243 Node* _pcmp_neq; // ConI(#CC_GT)
8c57262447d3 7105605: Use EA info to optimize pointers compare
kvn
parents: 4058
diff changeset
244 Node* _pcmp_eq; // ConI(#CC_EQ)
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
245
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
255 uint nodes_size() const { return _nodes.length(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
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
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
259 // Add node to ConnectionGraph.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
260 void add_node(Node *n, PointsToNode::NodeType nt, PointsToNode::EscapeState es, bool done);
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
261
0
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // offset of a field reference
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
263 int address_offset(Node* adr, PhaseTransform *phase);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // compute the escape state for arguments to a call
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void process_call_arguments(CallNode *call, PhaseTransform *phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // compute the escape state for the return value of a call
a61af66fc99e Initial load
duke
parents:
diff changeset
269 void process_call_result(ProjNode *resproj, PhaseTransform *phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
270
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
271 // Populate Connection Graph with Ideal nodes.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
272 void record_for_escape_analysis(Node *n, PhaseTransform *phase);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
273
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
274 // Build Connection Graph and set nodes escape state.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
275 void build_connection_graph(Node *n, PhaseTransform *phase);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // walk the connection graph starting at the node corresponding to "n" and
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // add the index of everything it could point to, to "ptset". This may cause
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // Phi's encountered to get (re)processed (which requires "phase".)
2249
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
280 VectorSet* PointsTo(Node * n);
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
281
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
282 // Reused structures for PointsTo().
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
283 VectorSet pt_ptset;
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
284 VectorSet pt_visited;
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
285 GrowableArray<uint> pt_worklist;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Edge manipulation. The "from_i" and "to_i" arguments are the
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // node indices of the source and destination of the edge
a61af66fc99e Initial load
duke
parents:
diff changeset
289 void add_pointsto_edge(uint from_i, uint to_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 void add_deferred_edge(uint from_i, uint to_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 void add_field_edge(uint from_i, uint to_i, int offs);
a61af66fc99e Initial load
duke
parents:
diff changeset
292
1921
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
293 // Add an edge of the specified type pointing to the specified target.
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
294 // Set _progress if new edge is added.
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
295 void add_edge(PointsToNode *f, uint to_i, PointsToNode::EdgeType et) {
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
296 uint e_cnt = f->edge_count();
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
297 f->add_edge(to_i, et);
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
298 _progress |= (f->edge_count() != e_cnt);
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
299 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // Add an edge to node given by "to_i" from any field of adr_i whose offset
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // matches "offset" A deferred edge is added if to_i is a LocalVar, and
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // a pointsto edge is added if it is a JavaObject
a61af66fc99e Initial load
duke
parents:
diff changeset
304 void add_edge_from_fields(uint adr, uint to_i, int offs);
a61af66fc99e Initial load
duke
parents:
diff changeset
305
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
306 // Add a deferred edge from node given by "from_i" to any field
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
307 // of adr_i whose offset matches "offset"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
308 void add_deferred_edge_to_fields(uint from_i, uint adr, int offs);
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Remove outgoing deferred edges from the node referenced by "ni".
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // Any outgoing edges from the target of the deferred edge are copied
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 Node_Array _node_map; // used for bookeeping during type splitting
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // Used for the following purposes:
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Memory Phi - most recent unique Phi split out
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // from this Phi
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // MemNode - new memory input for this node
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // ChecCastPP - allocation that this is a cast of
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
324 PhiNode *create_split_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn, bool &new_created);
a61af66fc99e Initial load
duke
parents:
diff changeset
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
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
327 Node *find_inst_mem(Node *mem, int alias_idx,GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn);
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
328
0
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Propagate unique types created for unescaped allocated objects
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // through the graph
a61af66fc99e Initial load
duke
parents:
diff changeset
331 void split_unique_types(GrowableArray<Node *> &alloc_worklist);
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // manage entries in _node_map
a61af66fc99e Initial load
duke
parents:
diff changeset
334 void set_map(int idx, Node *n) { _node_map.map(idx, n); }
a61af66fc99e Initial load
duke
parents:
diff changeset
335 Node *get_map(int idx) { return _node_map[idx]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
336 PhiNode *get_map_phi(int idx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 Node *phi = _node_map[idx];
a61af66fc99e Initial load
duke
parents:
diff changeset
338 return (phi == NULL) ? NULL : phi->as_Phi();
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // Notify optimizer that a node has been modified
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // Set the escape state of a node
a61af66fc99e Initial load
duke
parents:
diff changeset
348 void set_escape_state(uint ni, PointsToNode::EscapeState es);
a61af66fc99e Initial load
duke
parents:
diff changeset
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
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
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
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
360
4113
8c57262447d3 7105605: Use EA info to optimize pointers compare
kvn
parents: 4058
diff changeset
361 // Optimize objects compare.
8c57262447d3 7105605: Use EA info to optimize pointers compare
kvn
parents: 4058
diff changeset
362 Node* optimize_ptr_compare(Node* n);
8c57262447d3 7105605: Use EA info to optimize pointers compare
kvn
parents: 4058
diff changeset
363
2249
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
364 // Compute the escape information
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
365 bool compute_escape();
1100
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 293
diff changeset
366
0
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
379 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
380 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
381 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
382 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
383
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
384 #endif // SHARE_VM_OPTO_ESCAPE_HPP