annotate src/share/vm/opto/escape.hpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents c3e045194476
children f96a1a986f7b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 101
diff changeset
2 * Copyright 2005-2008 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 //
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // Adaptation for C2 of the escape analysis algorithm described in:
a61af66fc99e Initial load
duke
parents:
diff changeset
27 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
28 // [Choi99] Jong-Deok Shoi, Manish Gupta, Mauricio Seffano,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
29 // Vugranam C. Sreedhar, Sam Midkiff,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
30 // "Escape Analysis for Java", Procedings of ACM SIGPLAN
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
31 // OOPSLA Conference, November 1, 1999
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32 //
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // The flow-insensitive analysis described in the paper has been implemented.
a61af66fc99e Initial load
duke
parents:
diff changeset
34 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
35 // The analysis requires construction of a "connection graph" (CG) for
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
36 // the method being analyzed. The nodes of the connection graph are:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
37 //
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // - Java objects (JO)
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // - Local variables (LV)
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // - Fields of an object (OF), these also include array elements
a61af66fc99e Initial load
duke
parents:
diff changeset
41 //
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // The CG contains 3 types of edges:
a61af66fc99e Initial load
duke
parents:
diff changeset
43 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
44 // - PointsTo (-P>) {LV, OF} to JO
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
45 // - Deferred (-D>) from {LV, OF} to {LV, OF}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // - Field (-F>) from JO to OF
a61af66fc99e Initial load
duke
parents:
diff changeset
47 //
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // The following utility functions is used by the algorithm:
a61af66fc99e Initial load
duke
parents:
diff changeset
49 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
50 // 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
51 // point to.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
53 // The algorithm describes how to construct the connection graph
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
54 // in the following 4 cases:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55 //
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Case Edges Created
a61af66fc99e Initial load
duke
parents:
diff changeset
57 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
58 // (1) p = new T() LV -P> JO
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
59 // (2) p = q LV -D> LV
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
60 // (3) p.f = q JO -F> OF, OF -D> LV
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
61 // (4) p = q.f JO -F> OF, LV -D> OF
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
63 // 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
64 // references, we can construct a local variable containing a reference
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
65 // to the static memory.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
66 //
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // C2 does not have local variables. However for the purposes of constructing
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // the connection graph, the following IR nodes are treated as local variables:
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // Phi (pointer values)
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // LoadP
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
71 // Proj#5 (value returned from callnodes including allocations)
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
72 // CheckCastPP, CastPP
0
a61af66fc99e Initial load
duke
parents:
diff changeset
73 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
74 // 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
75 // Only a Phi can have multiple assignments. Each input to a Phi is treated
0
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // as an assignment to it.
a61af66fc99e Initial load
duke
parents:
diff changeset
77 //
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
78 // The following node types are JavaObject:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 //
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // top()
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // Allocate
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // AllocateArray
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Parm (for incoming arguments)
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
84 // CastX2P ("unsafe" operations)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // CreateEx
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // ConP
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // LoadKlass
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
88 // ThreadLocal
0
a61af66fc99e Initial load
duke
parents:
diff changeset
89 //
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // AddP nodes are fields.
a61af66fc99e Initial load
duke
parents:
diff changeset
91 //
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // After building the graph, a pass is made over the nodes, deleting deferred
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // nodes and copying the edges from the target of the deferred edge to the
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // source. This results in a graph with no deferred edges, only:
a61af66fc99e Initial load
duke
parents:
diff changeset
95 //
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // LV -P> JO
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
97 // OF -P> JO (the object whose oop is stored in the field)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // JO -F> OF
a61af66fc99e Initial load
duke
parents:
diff changeset
99 //
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // Then, for each node which is GlobalEscape, anything it could point to
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // is marked GlobalEscape. Finally, for any node marked ArgEscape, anything
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // it could point to is marked ArgEscape.
a61af66fc99e Initial load
duke
parents:
diff changeset
103 //
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 class Compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 class Node;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 class CallNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 class PhiNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 class PhaseTransform;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 class Type;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 class TypePtr;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 class VectorSet;
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 class PointsToNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 friend class ConnectionGraph;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
117 typedef enum {
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
118 UnknownType = 0,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
119 JavaObject = 1,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
120 LocalVar = 2,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
121 Field = 3
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 } NodeType;
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 typedef enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 UnknownEscape = 0,
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
126 NoEscape = 1, // A scalar replaceable object with unique type.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
127 ArgEscape = 2, // An object passed as argument or referenced by
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
128 // argument (and not globally escape during call).
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
129 GlobalEscape = 3 // An object escapes the method and thread.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 } EscapeState;
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 UnknownEdge = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
134 PointsToEdge = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 DeferredEdge = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 FieldEdge = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
137 } EdgeType;
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
140 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 EdgeMask = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
142 EdgeShift = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 INITIAL_EDGE_COUNT = 4
a61af66fc99e Initial load
duke
parents:
diff changeset
145 };
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 NodeType _type;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 EscapeState _escape;
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
149 GrowableArray<uint>* _edges; // outgoing edges
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 public:
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
152 Node* _node; // Ideal node corresponding to this PointsTo node.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
153 int _offset; // Object fields offsets.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
154 bool _scalar_replaceable;// Not escaped object could be replaced with scalar
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
155 bool _hidden_alias; // This node is an argument to a function.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
156 // which may return it creating a hidden alias.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
158 PointsToNode():
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
159 _type(UnknownType),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
160 _escape(UnknownEscape),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
161 _edges(NULL),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
162 _node(NULL),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
163 _offset(-1),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
164 _scalar_replaceable(true),
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
165 _hidden_alias(false) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 EscapeState escape_state() const { return _escape; }
a61af66fc99e Initial load
duke
parents:
diff changeset
169 NodeType node_type() const { return _type;}
a61af66fc99e Initial load
duke
parents:
diff changeset
170 int offset() { return _offset;}
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 void set_offset(int offs) { _offset = offs;}
a61af66fc99e Initial load
duke
parents:
diff changeset
173 void set_escape_state(EscapeState state) { _escape = state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
174 void set_node_type(NodeType ntype) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 assert(_type == UnknownType || _type == ntype, "Can't change node type");
a61af66fc99e Initial load
duke
parents:
diff changeset
176 _type = ntype;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // count of outgoing edges
a61af66fc99e Initial load
duke
parents:
diff changeset
180 uint edge_count() const { return (_edges == NULL) ? 0 : _edges->length(); }
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
181
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // node index of target of outgoing edge "e"
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
183 uint edge_target(uint e) const {
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
184 assert(_edges != NULL, "valid edge index");
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
185 return (_edges->at(e) >> EdgeShift);
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
186 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // type of outgoing edge "e"
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
188 EdgeType edge_type(uint e) const {
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
189 assert(_edges != NULL, "valid edge index");
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
190 return (EdgeType) (_edges->at(e) & EdgeMask);
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
191 }
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
192
0
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // add a edge of the specified type pointing to the specified target
a61af66fc99e Initial load
duke
parents:
diff changeset
194 void add_edge(uint targIdx, EdgeType et);
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
195
0
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // remove an edge of the specified type pointing to the specified target
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void remove_edge(uint targIdx, EdgeType et);
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
198
0
a61af66fc99e Initial load
duke
parents:
diff changeset
199 #ifndef PRODUCT
253
b0fe4deeb9fb 6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
kvn
parents: 245
diff changeset
200 void dump(bool print_state=true) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
201 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 };
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 class ConnectionGraph: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 private:
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
207 GrowableArray<PointsToNode> _nodes; // Connection graph nodes indexed
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
208 // by ideal node index.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
209
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
210 Unique_Node_List _delayed_worklist; // Nodes to be processed before
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
211 // the call build_connection_graph().
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
212
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
213 VectorSet _processed; // Records which nodes have been
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
214 // processed.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
215
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
216 bool _collecting; // Indicates whether escape information
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
217 // is still being collected. If false,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
218 // no new nodes will be processed.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
219
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
220 uint _phantom_object; // Index of globally escaping object
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
221 // that pointer values loaded from
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
222 // a field which has not been set
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
223 // are assumed to point to.
253
b0fe4deeb9fb 6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
kvn
parents: 245
diff changeset
224 uint _oop_null; // ConP(#NULL)
b0fe4deeb9fb 6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
kvn
parents: 245
diff changeset
225 uint _noop_null; // ConN(#NULL)
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
226
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
227 Compile * _compile; // Compile object for current compilation
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
229 // 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
230 PointsToNode *ptnode_adr(uint idx) const {
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
231 // There should be no new ideal nodes during ConnectionGraph build,
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
232 // growableArray::adr_at() will throw assert otherwise.
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
233 return _nodes.adr_at(idx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
235 uint nodes_size() const { return _nodes.length(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
236
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
237 // Add node to ConnectionGraph.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
238 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
239
0
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // offset of a field reference
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
241 int address_offset(Node* adr, PhaseTransform *phase);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // compute the escape state for arguments to a call
a61af66fc99e Initial load
duke
parents:
diff changeset
244 void process_call_arguments(CallNode *call, PhaseTransform *phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // compute the escape state for the return value of a call
a61af66fc99e Initial load
duke
parents:
diff changeset
247 void process_call_result(ProjNode *resproj, PhaseTransform *phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
248
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
249 // Populate Connection Graph with Ideal nodes.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
250 void record_for_escape_analysis(Node *n, PhaseTransform *phase);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
251
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
252 // Build Connection Graph and set nodes escape state.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
253 void build_connection_graph(Node *n, PhaseTransform *phase);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // walk the connection graph starting at the node corresponding to "n" and
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // add the index of everything it could point to, to "ptset". This may cause
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // Phi's encountered to get (re)processed (which requires "phase".)
a61af66fc99e Initial load
duke
parents:
diff changeset
258 void PointsTo(VectorSet &ptset, Node * n, PhaseTransform *phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Edge manipulation. The "from_i" and "to_i" arguments are the
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // node indices of the source and destination of the edge
a61af66fc99e Initial load
duke
parents:
diff changeset
262 void add_pointsto_edge(uint from_i, uint to_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 void add_deferred_edge(uint from_i, uint to_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 void add_field_edge(uint from_i, uint to_i, int offs);
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // Add an edge to node given by "to_i" from any field of adr_i whose offset
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // matches "offset" A deferred edge is added if to_i is a LocalVar, and
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // a pointsto edge is added if it is a JavaObject
a61af66fc99e Initial load
duke
parents:
diff changeset
270 void add_edge_from_fields(uint adr, uint to_i, int offs);
a61af66fc99e Initial load
duke
parents:
diff changeset
271
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
272 // 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
273 // of adr_i whose offset matches "offset"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
274 void add_deferred_edge_to_fields(uint from_i, uint adr, int offs);
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Remove outgoing deferred edges from the node referenced by "ni".
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // Any outgoing edges from the target of the deferred edge are copied
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // to "ni".
101
a6cb86dd209b 6681577: PIT: some VM tests fails with -XX:+AggressiveOpts in 6u5p b01
kvn
parents: 65
diff changeset
280 void remove_deferred(uint ni, GrowableArray<uint>* deferred_edges, VectorSet* visited);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 Node_Array _node_map; // used for bookeeping during type splitting
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // Used for the following purposes:
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // Memory Phi - most recent unique Phi split out
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // from this Phi
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // MemNode - new memory input for this node
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // ChecCastPP - allocation that this is a cast of
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // 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
289 bool split_AddP(Node *addp, Node *base, PhaseGVN *igvn);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290 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
291 PhiNode *split_memory_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, PhaseGVN *igvn);
a61af66fc99e Initial load
duke
parents:
diff changeset
292 Node *find_mem(Node *mem, int alias_idx, PhaseGVN *igvn);
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
293 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
294
0
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // Propagate unique types created for unescaped allocated objects
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // through the graph
a61af66fc99e Initial load
duke
parents:
diff changeset
297 void split_unique_types(GrowableArray<Node *> &alloc_worklist);
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // manage entries in _node_map
a61af66fc99e Initial load
duke
parents:
diff changeset
300 void set_map(int idx, Node *n) { _node_map.map(idx, n); }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 void set_map_phi(int idx, PhiNode *p) { _node_map.map(idx, (Node *) p); }
a61af66fc99e Initial load
duke
parents:
diff changeset
302 Node *get_map(int idx) { return _node_map[idx]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 PhiNode *get_map_phi(int idx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 Node *phi = _node_map[idx];
a61af66fc99e Initial load
duke
parents:
diff changeset
305 return (phi == NULL) ? NULL : phi->as_Phi();
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Notify optimizer that a node has been modified
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // Node: This assumes that escape analysis is run before
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // PhaseIterGVN creation
a61af66fc99e Initial load
duke
parents:
diff changeset
311 void record_for_optimizer(Node *n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 _compile->record_for_igvn(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Set the escape state of a node
a61af66fc99e Initial load
duke
parents:
diff changeset
316 void set_escape_state(uint ni, PointsToNode::EscapeState es);
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
319 ConnectionGraph(Compile *C);
a61af66fc99e Initial load
duke
parents:
diff changeset
320
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
321 // Check for non-escaping candidates
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
322 static bool has_candidates(Compile *C);
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
323
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
324 // Compute the escape information
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
325 bool compute_escape();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // escape state of a node
a61af66fc99e Initial load
duke
parents:
diff changeset
328 PointsToNode::EscapeState escape_state(Node *n, PhaseTransform *phase);
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
329 // other information we have collected
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
330 bool is_scalar_replaceable(Node *n) {
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
331 if (_collecting || (n->_idx >= nodes_size()))
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
332 return false;
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
333 PointsToNode* ptn = ptnode_adr(n->_idx);
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
334 return ptn->escape_state() == PointsToNode::NoEscape && ptn->_scalar_replaceable;
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
335 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 bool hidden_alias(Node *n) {
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
338 if (_collecting || (n->_idx >= nodes_size()))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
339 return true;
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
340 PointsToNode* ptn = ptnode_adr(n->_idx);
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
341 return (ptn->escape_state() != PointsToNode::NoEscape) || ptn->_hidden_alias;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
345 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
346 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
347 };