annotate src/share/vm/opto/escape.hpp @ 9126:bc26f978b0ce

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents 7eca5de9e0b6
children 90297adbda9d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
2 * Copyright (c) 2005, 2012, 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;
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
118 class PointsToNode;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
119 class Type;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 class TypePtr;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 class VectorSet;
a61af66fc99e Initial load
duke
parents:
diff changeset
122
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
123 class JavaObjectNode;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
124 class LocalVarNode;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
125 class FieldNode;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
126 class ArraycopyNode;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
127
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
128 // ConnectionGraph nodes
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
129 class PointsToNode : public ResourceObj {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
130 GrowableArray<PointsToNode*> _edges; // List of nodes this node points to
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
131 GrowableArray<PointsToNode*> _uses; // List of nodes which point to this node
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
132
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
133 const u1 _type; // NodeType
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
134 u1 _flags; // NodeFlags
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
135 u1 _escape; // EscapeState of object
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
136 u1 _fields_escape; // EscapeState of object's fields
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
137
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
138 Node* const _node; // Ideal node corresponding to this PointsTo node.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
139 const int _idx; // Cached ideal node's _idx
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
140
0
a61af66fc99e Initial load
duke
parents:
diff changeset
141 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
142 typedef enum {
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
143 UnknownType = 0,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
144 JavaObject = 1,
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
145 LocalVar = 2,
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
146 Field = 3,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
147 Arraycopy = 4
0
a61af66fc99e Initial load
duke
parents:
diff changeset
148 } NodeType;
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 typedef enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 UnknownEscape = 0,
4058
59e515ee9354 7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents: 2249
diff changeset
152 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
153 // 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
154 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
155 // 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
156 // and it does not escape during call.
59e515ee9354 7059047: EA: can't find initializing store with several CheckCastPP
kvn
parents: 2249
diff changeset
157 GlobalEscape = 3 // An object escapes the method or thread.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
158 } EscapeState;
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 typedef enum {
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
161 ScalarReplaceable = 1, // Not escaped object could be replaced with scalar
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
162 PointsToUnknown = 2, // Has edge to phantom_object
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
163 ArraycopySrc = 4, // Has edge from Arraycopy node
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
164 ArraycopyDst = 8 // Has edge to Arraycopy node
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
165 } NodeFlags;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
168 PointsToNode(Compile *C, Node* n, EscapeState es, NodeType type):
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
169 _edges(C->comp_arena(), 2, 0, NULL),
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
170 _uses (C->comp_arena(), 2, 0, NULL),
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
171 _node(n),
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
172 _idx(n->_idx),
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
173 _type((u1)type),
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
174 _escape((u1)es),
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
175 _fields_escape((u1)es),
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
176 _flags(ScalarReplaceable) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
177 assert(n != NULL && es != UnknownEscape, "sanity");
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
178 }
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
179
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
180 Node* ideal_node() const { return _node; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
181 int idx() const { return _idx; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
182
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
183 bool is_JavaObject() const { return _type == (u1)JavaObject; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
184 bool is_LocalVar() const { return _type == (u1)LocalVar; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
185 bool is_Field() const { return _type == (u1)Field; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
186 bool is_Arraycopy() const { return _type == (u1)Arraycopy; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
187
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
188 JavaObjectNode* as_JavaObject() { assert(is_JavaObject(),""); return (JavaObjectNode*)this; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
189 LocalVarNode* as_LocalVar() { assert(is_LocalVar(),""); return (LocalVarNode*)this; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
190 FieldNode* as_Field() { assert(is_Field(),""); return (FieldNode*)this; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
191 ArraycopyNode* as_Arraycopy() { assert(is_Arraycopy(),""); return (ArraycopyNode*)this; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
192
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
193 EscapeState escape_state() const { return (EscapeState)_escape; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
194 void set_escape_state(EscapeState state) { _escape = (u1)state; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
195
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
196 EscapeState fields_escape_state() const { return (EscapeState)_fields_escape; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
197 void set_fields_escape_state(EscapeState state) { _fields_escape = (u1)state; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
198
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
199 bool has_unknown_ptr() const { return (_flags & PointsToUnknown) != 0; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
200 void set_has_unknown_ptr() { _flags |= PointsToUnknown; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
201
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
202 bool arraycopy_src() const { return (_flags & ArraycopySrc) != 0; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
203 void set_arraycopy_src() { _flags |= ArraycopySrc; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
204 bool arraycopy_dst() const { return (_flags & ArraycopyDst) != 0; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
205 void set_arraycopy_dst() { _flags |= ArraycopyDst; }
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
206
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
207 bool scalar_replaceable() const { return (_flags & ScalarReplaceable) != 0;}
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
208 void set_scalar_replaceable(bool v) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
209 if (v)
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
210 _flags |= ScalarReplaceable;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
211 else
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
212 _flags &= ~ScalarReplaceable;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
213 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
214
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
215 int edge_count() const { return _edges.length(); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
216 PointsToNode* edge(int e) const { return _edges.at(e); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
217 bool add_edge(PointsToNode* edge) { return _edges.append_if_missing(edge); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
218
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
219 int use_count() const { return _uses.length(); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
220 PointsToNode* use(int e) const { return _uses.at(e); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
221 bool add_use(PointsToNode* use) { return _uses.append_if_missing(use); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
222
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
223 // Mark base edge use to distinguish from stored value edge.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
224 bool add_base_use(FieldNode* use) { return _uses.append_if_missing((PointsToNode*)((intptr_t)use + 1)); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
225 static bool is_base_use(PointsToNode* use) { return (((intptr_t)use) & 1); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
226 static PointsToNode* get_use_node(PointsToNode* use) { return (PointsToNode*)(((intptr_t)use) & ~1); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
227
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
228 // Return true if this node points to specified node or nodes it points to.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
229 bool points_to(JavaObjectNode* ptn) const;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
230
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
231 // Return true if this node points only to non-escaping allocations.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
232 bool non_escaping_allocation();
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
233
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
234 // Return true if one node points to an other.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
235 bool meet(PointsToNode* ptn);
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
236
0
a61af66fc99e Initial load
duke
parents:
diff changeset
237 #ifndef PRODUCT
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
238 NodeType node_type() const { return (NodeType)_type;}
253
b0fe4deeb9fb 6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
kvn
parents: 245
diff changeset
239 void dump(bool print_state=true) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
240 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 };
a61af66fc99e Initial load
duke
parents:
diff changeset
243
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
244 class LocalVarNode: public PointsToNode {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
245 public:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
246 LocalVarNode(Compile *C, Node* n, EscapeState es):
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
247 PointsToNode(C, n, es, LocalVar) {}
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
248 };
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
249
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
250 class JavaObjectNode: public PointsToNode {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
251 public:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
252 JavaObjectNode(Compile *C, Node* n, EscapeState es):
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
253 PointsToNode(C, n, es, JavaObject) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
254 if (es > NoEscape)
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
255 set_scalar_replaceable(false);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
256 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
257 };
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
258
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
259 class FieldNode: public PointsToNode {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
260 GrowableArray<PointsToNode*> _bases; // List of JavaObject nodes which point to this node
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
261 const int _offset; // Field's offset.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
262 const bool _is_oop; // Field points to object
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
263 bool _has_unknown_base; // Has phantom_object base
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
264 public:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
265 FieldNode(Compile *C, Node* n, EscapeState es, int offs, bool is_oop):
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
266 PointsToNode(C, n, es, Field),
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
267 _offset(offs), _is_oop(is_oop),
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
268 _has_unknown_base(false) {}
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
269
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
270 int offset() const { return _offset;}
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
271 bool is_oop() const { return _is_oop;}
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
272 bool has_unknown_base() const { return _has_unknown_base; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
273 void set_has_unknown_base() { _has_unknown_base = true; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
274
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
275 int base_count() const { return _bases.length(); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
276 PointsToNode* base(int e) const { return _bases.at(e); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
277 bool add_base(PointsToNode* base) { return _bases.append_if_missing(base); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
278 #ifdef ASSERT
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
279 // Return true if bases points to this java object.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
280 bool has_base(JavaObjectNode* ptn) const;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
281 #endif
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
282
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
283 };
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
284
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
285 class ArraycopyNode: public PointsToNode {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
286 public:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
287 ArraycopyNode(Compile *C, Node* n, EscapeState es):
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
288 PointsToNode(C, n, es, Arraycopy) {}
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
289 };
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
290
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
291 // Iterators for PointsTo node's edges:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
292 // for (EdgeIterator i(n); i.has_next(); i.next()) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
293 // PointsToNode* u = i.get();
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
294 class PointsToIterator: public StackObj {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
295 protected:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
296 const PointsToNode* node;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
297 const int cnt;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
298 int i;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
299 public:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
300 inline PointsToIterator(const PointsToNode* n, int cnt) : node(n), cnt(cnt), i(0) { }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
301 inline bool has_next() const { return i < cnt; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
302 inline void next() { i++; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
303 PointsToNode* get() const { ShouldNotCallThis(); return NULL; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
304 };
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
305
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
306 class EdgeIterator: public PointsToIterator {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
307 public:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
308 inline EdgeIterator(const PointsToNode* n) : PointsToIterator(n, n->edge_count()) { }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
309 inline PointsToNode* get() const { return node->edge(i); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
310 };
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
311
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
312 class UseIterator: public PointsToIterator {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
313 public:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
314 inline UseIterator(const PointsToNode* n) : PointsToIterator(n, n->use_count()) { }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
315 inline PointsToNode* get() const { return node->use(i); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
316 };
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
317
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
318 class BaseIterator: public PointsToIterator {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
319 public:
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
320 inline BaseIterator(const FieldNode* n) : PointsToIterator(n, n->base_count()) { }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
321 inline PointsToNode* get() const { return ((PointsToNode*)node)->as_Field()->base(i); }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
322 };
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
323
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
324
0
a61af66fc99e Initial load
duke
parents:
diff changeset
325 class ConnectionGraph: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 private:
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
327 GrowableArray<PointsToNode*> _nodes; // Map from ideal nodes to
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
328 // ConnectionGraph nodes.
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
329
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
330 GrowableArray<PointsToNode*> _worklist; // Nodes to be processed
1100
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 293
diff changeset
331
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
332 bool _collecting; // Indicates whether escape information
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
333 // is still being collected. If false,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
334 // no new nodes will be processed.
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
335
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
336 bool _verify; // verify graph
1921
e4fcbeb5a698 6991188: C2 Crashes while compiling method
kvn
parents: 1634
diff changeset
337
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
338 JavaObjectNode* phantom_obj; // Unknown object
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
339 JavaObjectNode* null_obj;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
340 Node* _pcmp_neq; // ConI(#CC_GT)
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
341 Node* _pcmp_eq; // ConI(#CC_EQ)
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
342
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
343 Compile* _compile; // Compile object for current compilation
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
344 PhaseIterGVN* _igvn; // Value numbering
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
345
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
346 Unique_Node_List ideal_nodes; // Used by CG construction and types splitting.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
348 // Address of an element in _nodes. Used when the element is to be modified
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
349 PointsToNode* ptnode_adr(int idx) const {
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
350 // There should be no new ideal nodes during ConnectionGraph build,
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
351 // growableArray::at() will throw assert otherwise.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
352 return _nodes.at(idx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
353 }
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
354 uint nodes_size() const { return _nodes.length(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
355
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
356 // Add nodes to ConnectionGraph.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
357 void add_local_var(Node* n, PointsToNode::EscapeState es);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
358 void add_java_object(Node* n, PointsToNode::EscapeState es);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
359 void add_field(Node* n, PointsToNode::EscapeState es, int offset);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
360 void add_arraycopy(Node* n, PointsToNode::EscapeState es, PointsToNode* src, PointsToNode* dst);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
361
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
362 // Compute the escape state for arguments to a call.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
363 void process_call_arguments(CallNode *call);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
364
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
365 // Add PointsToNode node corresponding to a call
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
366 void add_call_node(CallNode* call);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
367
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
368 // Map ideal node to existing PointsTo node (usually phantom_object).
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
369 void map_ideal_node(Node *n, PointsToNode* ptn) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
370 assert(ptn != NULL, "only existing PointsTo node");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
371 _nodes.at_put(n->_idx, ptn);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
372 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
373
6795
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6266
diff changeset
374 // Utility function for nodes that load an object
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6266
diff changeset
375 void add_objload_to_connection_graph(Node *n, Unique_Node_List *delayed_worklist);
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
376 // Create PointsToNode node and add it to Connection Graph.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
377 void add_node_to_connection_graph(Node *n, Unique_Node_List *delayed_worklist);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
378
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
379 // Add final simple edges to graph.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
380 void add_final_edges(Node *n);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
381
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
382 // Finish Graph construction.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
383 bool complete_connection_graph(GrowableArray<PointsToNode*>& ptnodes_worklist,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
384 GrowableArray<JavaObjectNode*>& non_escaped_worklist,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
385 GrowableArray<JavaObjectNode*>& java_objects_worklist,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
386 GrowableArray<FieldNode*>& oop_fields_worklist);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
387
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
388 #ifdef ASSERT
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
389 void verify_connection_graph(GrowableArray<PointsToNode*>& ptnodes_worklist,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
390 GrowableArray<JavaObjectNode*>& non_escaped_worklist,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
391 GrowableArray<JavaObjectNode*>& java_objects_worklist,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
392 GrowableArray<Node*>& addp_worklist);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
393 #endif
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
394
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
395 // Add all references to this JavaObject node.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
396 int add_java_object_edges(JavaObjectNode* jobj, bool populate_worklist);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
397
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
398 // Put node on worklist if it is (or was) not there.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
399 void add_to_worklist(PointsToNode* pt) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
400 _worklist.push(pt);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
401 return;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
402 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
403
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
404 // Put on worklist all uses of this node.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
405 void add_uses_to_worklist(PointsToNode* pt) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
406 for (UseIterator i(pt); i.has_next(); i.next())
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
407 _worklist.push(i.get());
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
408 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
409
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
410 // Put on worklist all field's uses and related field nodes.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
411 void add_field_uses_to_worklist(FieldNode* field);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
412
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
413 // Put on worklist all related field nodes.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
414 void add_fields_to_worklist(FieldNode* field, PointsToNode* base);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
415
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
416 // Find fields which have unknown value.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
417 int find_field_value(FieldNode* field);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
418
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
419 // Find fields initializing values for allocations.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
420 int find_init_values(JavaObjectNode* ptn, PointsToNode* init_val, PhaseTransform* phase);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
421
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
422 // Set the escape state of an object and its fields.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
423 void set_escape_state(PointsToNode* ptn, PointsToNode::EscapeState esc) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
424 // Don't change non-escaping state of NULL pointer.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
425 if (ptn != null_obj) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
426 if (ptn->escape_state() < esc)
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
427 ptn->set_escape_state(esc);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
428 if (ptn->fields_escape_state() < esc)
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
429 ptn->set_fields_escape_state(esc);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
430 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
431 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
432 void set_fields_escape_state(PointsToNode* ptn, PointsToNode::EscapeState esc) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
433 // Don't change non-escaping state of NULL pointer.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
434 if (ptn != null_obj) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
435 if (ptn->fields_escape_state() < esc)
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
436 ptn->set_fields_escape_state(esc);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
437 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
438 }
4122
cc81b9c09bbb 7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents: 4113
diff changeset
439
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
440 // Propagate GlobalEscape and ArgEscape escape states to all nodes
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
441 // and check that we still have non-escaping java objects.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
442 bool find_non_escaped_objects(GrowableArray<PointsToNode*>& ptnodes_worklist,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
443 GrowableArray<JavaObjectNode*>& non_escaped_worklist);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
444
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
445 // Adjust scalar_replaceable state after Connection Graph is built.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
446 void adjust_scalar_replaceable_state(JavaObjectNode* jobj);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
447
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
448 // Optimize ideal graph.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
449 void optimize_ideal_graph(GrowableArray<Node*>& ptr_cmp_worklist,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
450 GrowableArray<Node*>& storestore_worklist);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
451 // Optimize objects compare.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
452 Node* optimize_ptr_compare(Node* n);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
453
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
454 // Returns unique corresponding java object or NULL.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
455 JavaObjectNode* unique_java_object(Node *n);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
456
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
457 // Add an edge of the specified type pointing to the specified target.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
458 bool add_edge(PointsToNode* from, PointsToNode* to) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
459 assert(!from->is_Field() || from->as_Field()->is_oop(), "sanity");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
460
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
461 if (to == phantom_obj) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
462 if (from->has_unknown_ptr()) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
463 return false; // already points to phantom_obj
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
464 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
465 from->set_has_unknown_ptr();
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
466 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
467
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
468 bool is_new = from->add_edge(to);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
469 assert(to != phantom_obj || is_new, "sanity");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
470 if (is_new) { // New edge?
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
471 assert(!_verify, "graph is incomplete");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
472 is_new = to->add_use(from);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
473 assert(is_new, "use should be also new");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
474 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
475 return is_new;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
476 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
477
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
478 // Add an edge from Field node to its base and back.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
479 bool add_base(FieldNode* from, PointsToNode* to) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
480 assert(!to->is_Arraycopy(), "sanity");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
481 if (to == phantom_obj) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
482 if (from->has_unknown_base()) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
483 return false; // already has phantom_obj base
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
484 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
485 from->set_has_unknown_base();
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
486 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
487 bool is_new = from->add_base(to);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
488 assert(to != phantom_obj || is_new, "sanity");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
489 if (is_new) { // New edge?
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
490 assert(!_verify, "graph is incomplete");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
491 if (to == null_obj)
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
492 return is_new; // Don't add fields to NULL pointer.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
493 if (to->is_JavaObject()) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
494 is_new = to->add_edge(from);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
495 } else {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
496 is_new = to->add_base_use(from);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
497 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
498 assert(is_new, "use should be also new");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
499 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
500 return is_new;
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
501 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
502
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
503 // Add LocalVar node and edge if possible
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
504 void add_local_var_and_edge(Node* n, PointsToNode::EscapeState es, Node* to,
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
505 Unique_Node_List *delayed_worklist) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
506 PointsToNode* ptn = ptnode_adr(to->_idx);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
507 if (delayed_worklist != NULL) { // First iteration of CG construction
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
508 add_local_var(n, es);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
509 if (ptn == NULL) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
510 delayed_worklist->push(n);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
511 return; // Process it later.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
512 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
513 } else {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
514 assert(ptn != NULL, "node should be registered");
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
515 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
516 add_edge(ptnode_adr(n->_idx), ptn);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 5948
diff changeset
517 }
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
518 // Helper functions
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 5948
diff changeset
519 bool is_oop_field(Node* n, int offset, bool* unsafe);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 5948
diff changeset
520 static Node* get_addp_base(Node *addp);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 5948
diff changeset
521 static Node* find_second_addp(Node* addp, Node* n);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // offset of a field reference
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 0
diff changeset
523 int address_offset(Node* adr, PhaseTransform *phase);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
526 // Propagate unique types created for unescaped allocated objects
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
527 // through the graph
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
528 void split_unique_types(GrowableArray<Node *> &alloc_worklist);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
529
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
530 // Helper methods for unique types split.
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
531 bool split_AddP(Node *addp, Node *base);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
532
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
533 PhiNode *create_split_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist, bool &new_created);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
534 PhiNode *split_memory_phi(PhiNode *orig_phi, int alias_idx, GrowableArray<PhiNode *> &orig_phi_worklist);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
535
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
536 void move_inst_mem(Node* n, GrowableArray<PhiNode *> &orig_phis);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
537 Node* find_inst_mem(Node* mem, int alias_idx,GrowableArray<PhiNode *> &orig_phi_worklist);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
538 Node* step_through_mergemem(MergeMemNode *mmem, int alias_idx, const TypeOopPtr *toop);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
539
a61af66fc99e Initial load
duke
parents:
diff changeset
540
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
541 GrowableArray<MergeMemNode*> _mergemem_worklist; // List of all MergeMem nodes
0
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 Node_Array _node_map; // used for bookeeping during type splitting
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // Used for the following purposes:
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // Memory Phi - most recent unique Phi split out
a61af66fc99e Initial load
duke
parents:
diff changeset
546 // from this Phi
a61af66fc99e Initial load
duke
parents:
diff changeset
547 // MemNode - new memory input for this node
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // ChecCastPP - allocation that this is a cast of
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // allocation - CheckCastPP of the allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // manage entries in _node_map
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
552
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
553 void set_map(Node* from, Node* to) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
554 ideal_nodes.push(from);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
555 _node_map.map(from->_idx, to);
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
556 }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
557
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
558 Node* get_map(int idx) { return _node_map[idx]; }
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
559
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
560 PhiNode* get_map_phi(int idx) {
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
561 Node* phi = _node_map[idx];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
562 return (phi == NULL) ? NULL : phi->as_Phi();
a61af66fc99e Initial load
duke
parents:
diff changeset
563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
564
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // Notify optimizer that a node has been modified
a61af66fc99e Initial load
duke
parents:
diff changeset
566 void record_for_optimizer(Node *n) {
1634
60a14ad85270 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 1552
diff changeset
567 _igvn->_worklist.push(n);
4122
cc81b9c09bbb 7112478: after 7105605 JRuby bench_define_method_methods.rb fails with NPE
kvn
parents: 4113
diff changeset
568 _igvn->add_users_to_worklist(n);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
570
2249
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
571 // Compute the escape information
3763ca6579b7 7013538: Java memory leak with escape analysis
kvn
parents: 1972
diff changeset
572 bool compute_escape();
1100
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 293
diff changeset
573
0
a61af66fc99e Initial load
duke
parents:
diff changeset
574 public:
1634
60a14ad85270 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 1552
diff changeset
575 ConnectionGraph(Compile *C, PhaseIterGVN *igvn);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
576
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
577 // Check for non-escaping candidates
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
578 static bool has_candidates(Compile *C);
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 101
diff changeset
579
1634
60a14ad85270 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 1552
diff changeset
580 // Perform escape analysis
60a14ad85270 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 1552
diff changeset
581 static void do_analysis(Compile *C, PhaseIterGVN *igvn);
60a14ad85270 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 1552
diff changeset
582
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
583 bool not_global_escape(Node *n);
1634
60a14ad85270 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 1552
diff changeset
584
0
a61af66fc99e Initial load
duke
parents:
diff changeset
585 #ifndef PRODUCT
5948
ee138854b3a6 7147744: CTW: assert(false) failed: infinite EA connection graph build
kvn
parents: 4122
diff changeset
586 void dump(GrowableArray<PointsToNode*>& ptnodes_worklist);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
587 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
588 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
589
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1921
diff changeset
590 #endif // SHARE_VM_OPTO_ESCAPE_HPP