annotate src/share/vm/ci/bcEscapeAnalyzer.cpp @ 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 bd02caa94611
children b4776199210f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
844
bd02caa94611 6862919: Update copyright year
xdono
parents: 726
diff changeset
2 * Copyright 2005-2009 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 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27 #include "incls/_bcEscapeAnalyzer.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
31 #define TRACE_BCEA(level, code) \
a61af66fc99e Initial load
duke
parents:
diff changeset
32 if (EstimateArgEscape && BCEATraceLevel >= level) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
33 code; \
a61af66fc99e Initial load
duke
parents:
diff changeset
34 }
a61af66fc99e Initial load
duke
parents:
diff changeset
35 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
36 #define TRACE_BCEA(level, code)
a61af66fc99e Initial load
duke
parents:
diff changeset
37 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // Maintain a map of which aguments a local variable or
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // stack slot may contain. In addition to tracking
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // arguments, it tracks two special values, "allocated"
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // which represents any object allocated in the current
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // method, and "unknown" which is any other object.
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Up to 30 arguments are handled, with the last one
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // representing summary information for any extra arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class BCEscapeAnalyzer::ArgumentMap {
a61af66fc99e Initial load
duke
parents:
diff changeset
47 uint _bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 enum {MAXBIT = 29,
a61af66fc99e Initial load
duke
parents:
diff changeset
49 ALLOCATED = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
50 UNKNOWN = 2};
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 uint int_to_bit(uint e) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 if (e > MAXBIT)
a61af66fc99e Initial load
duke
parents:
diff changeset
54 e = MAXBIT;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 return (1 << (e + 2));
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
59 ArgumentMap() { _bits = 0;}
a61af66fc99e Initial load
duke
parents:
diff changeset
60 void set_bits(uint bits) { _bits = bits;}
a61af66fc99e Initial load
duke
parents:
diff changeset
61 uint get_bits() const { return _bits;}
a61af66fc99e Initial load
duke
parents:
diff changeset
62 void clear() { _bits = 0;}
a61af66fc99e Initial load
duke
parents:
diff changeset
63 void set_all() { _bits = ~0u; }
a61af66fc99e Initial load
duke
parents:
diff changeset
64 bool is_empty() const { return _bits == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
65 bool contains(uint var) const { return (_bits & int_to_bit(var)) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
66 bool is_singleton(uint var) const { return (_bits == int_to_bit(var)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
67 bool contains_unknown() const { return (_bits & UNKNOWN) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
68 bool contains_allocated() const { return (_bits & ALLOCATED) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
69 bool contains_vars() const { return (_bits & (((1 << MAXBIT) -1) << 2)) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void set(uint var) { _bits = int_to_bit(var); }
a61af66fc99e Initial load
duke
parents:
diff changeset
71 void add(uint var) { _bits |= int_to_bit(var); }
a61af66fc99e Initial load
duke
parents:
diff changeset
72 void add_unknown() { _bits = UNKNOWN; }
a61af66fc99e Initial load
duke
parents:
diff changeset
73 void add_allocated() { _bits = ALLOCATED; }
a61af66fc99e Initial load
duke
parents:
diff changeset
74 void set_union(const ArgumentMap &am) { _bits |= am._bits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
75 void set_intersect(const ArgumentMap &am) { _bits |= am._bits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 void set_difference(const ArgumentMap &am) { _bits &= ~am._bits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77 void operator=(const ArgumentMap &am) { _bits = am._bits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
78 bool operator==(const ArgumentMap &am) { return _bits == am._bits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
79 bool operator!=(const ArgumentMap &am) { return _bits != am._bits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
80 };
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 class BCEscapeAnalyzer::StateInfo {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
84 ArgumentMap *_vars;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 ArgumentMap *_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 short _stack_height;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 short _max_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 bool _initialized;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 ArgumentMap empty_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 StateInfo() {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 empty_map.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
93 }
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 ArgumentMap raw_pop() { assert(_stack_height > 0, "stack underflow"); return _stack[--_stack_height]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
96 ArgumentMap apop() { return raw_pop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
97 void spop() { raw_pop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
98 void lpop() { spop(); spop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 void raw_push(ArgumentMap i) { assert(_stack_height < _max_stack, "stack overflow"); _stack[_stack_height++] = i; }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 void apush(ArgumentMap i) { raw_push(i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 void spush() { raw_push(empty_map); }
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void lpush() { spush(); spush(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 };
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void BCEscapeAnalyzer::set_returned(ArgumentMap vars) {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
107 for (int i = 0; i < _arg_size; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
108 if (vars.contains(i))
a61af66fc99e Initial load
duke
parents:
diff changeset
109 _arg_returned.set_bit(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 _return_local = _return_local && !(vars.contains_unknown() || vars.contains_allocated());
a61af66fc99e Initial load
duke
parents:
diff changeset
112 _return_allocated = _return_allocated && vars.contains_allocated() && !(vars.contains_unknown() || vars.contains_vars());
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // return true if any element of vars is an argument
a61af66fc99e Initial load
duke
parents:
diff changeset
116 bool BCEscapeAnalyzer::is_argument(ArgumentMap vars) {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
117 for (int i = 0; i < _arg_size; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
118 if (vars.contains(i))
a61af66fc99e Initial load
duke
parents:
diff changeset
119 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // return true if any element of vars is an arg_stack argument
a61af66fc99e Initial load
duke
parents:
diff changeset
125 bool BCEscapeAnalyzer::is_arg_stack(ArgumentMap vars){
a61af66fc99e Initial load
duke
parents:
diff changeset
126 if (_conservative)
a61af66fc99e Initial load
duke
parents:
diff changeset
127 return true;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
128 for (int i = 0; i < _arg_size; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 if (vars.contains(i) && _arg_stack.at(i))
a61af66fc99e Initial load
duke
parents:
diff changeset
130 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void BCEscapeAnalyzer::clear_bits(ArgumentMap vars, BitMap &bm) {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
136 for (int i = 0; i < _arg_size; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
137 if (vars.contains(i)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 bm.clear_bit(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
142
0
a61af66fc99e Initial load
duke
parents:
diff changeset
143 void BCEscapeAnalyzer::set_method_escape(ArgumentMap vars) {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 clear_bits(vars, _arg_local);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 void BCEscapeAnalyzer::set_global_escape(ArgumentMap vars) {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 clear_bits(vars, _arg_local);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 clear_bits(vars, _arg_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 if (vars.contains_allocated())
a61af66fc99e Initial load
duke
parents:
diff changeset
151 _allocated_escapes = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void BCEscapeAnalyzer::set_dirty(ArgumentMap vars) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 clear_bits(vars, _dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
158 void BCEscapeAnalyzer::set_modified(ArgumentMap vars, int offs, int size) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
159
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
160 for (int i = 0; i < _arg_size; i++) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
161 if (vars.contains(i)) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
162 set_arg_modified(i, offs, size);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
163 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
164 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
165 if (vars.contains_unknown())
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
166 _unknown_modified = true;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
167 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
168
0
a61af66fc99e Initial load
duke
parents:
diff changeset
169 bool BCEscapeAnalyzer::is_recursive_call(ciMethod* callee) {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 for (BCEscapeAnalyzer* scope = this; scope != NULL; scope = scope->_parent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 if (scope->method() == callee) {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
178 bool BCEscapeAnalyzer::is_arg_modified(int arg, int offset, int size_in_bytes) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
179 if (offset == OFFSET_ANY)
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
180 return _arg_modified[arg] != 0;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
181 assert(arg >= 0 && arg < _arg_size, "must be an argument.");
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
182 bool modified = false;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
183 int l = offset / HeapWordSize;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
184 int h = round_to(offset + size_in_bytes, HeapWordSize) / HeapWordSize;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
185 if (l > ARG_OFFSET_MAX)
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
186 l = ARG_OFFSET_MAX;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
187 if (h > ARG_OFFSET_MAX+1)
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
188 h = ARG_OFFSET_MAX + 1;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
189 for (int i = l; i < h; i++) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
190 modified = modified || (_arg_modified[arg] & (1 << i)) != 0;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
191 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
192 return modified;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
193 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
194
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
195 void BCEscapeAnalyzer::set_arg_modified(int arg, int offset, int size_in_bytes) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
196 if (offset == OFFSET_ANY) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
197 _arg_modified[arg] = (uint) -1;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
198 return;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
199 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
200 assert(arg >= 0 && arg < _arg_size, "must be an argument.");
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
201 int l = offset / HeapWordSize;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
202 int h = round_to(offset + size_in_bytes, HeapWordSize) / HeapWordSize;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
203 if (l > ARG_OFFSET_MAX)
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
204 l = ARG_OFFSET_MAX;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
205 if (h > ARG_OFFSET_MAX+1)
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
206 h = ARG_OFFSET_MAX + 1;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
207 for (int i = l; i < h; i++) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
208 _arg_modified[arg] |= (1 << i);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
209 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
210 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
211
0
a61af66fc99e Initial load
duke
parents:
diff changeset
212 void BCEscapeAnalyzer::invoke(StateInfo &state, Bytecodes::Code code, ciMethod* target, ciKlass* holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // retrieve information about the callee
a61af66fc99e Initial load
duke
parents:
diff changeset
216 ciInstanceKlass* klass = target->holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
217 ciInstanceKlass* calling_klass = method()->holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 ciInstanceKlass* callee_holder = ciEnv::get_instance_klass_for_declared_method_holder(holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 ciInstanceKlass* actual_recv = callee_holder;
a61af66fc99e Initial load
duke
parents:
diff changeset
220
154
09c2ba680204 6700102: c2 assertion "counter_changed,"failed dependencies, but counter didn't change")" with AggressiveOpts
kvn
parents: 78
diff changeset
221 // some methods are obviously bindable without any type checks so
09c2ba680204 6700102: c2 assertion "counter_changed,"failed dependencies, but counter didn't change")" with AggressiveOpts
kvn
parents: 78
diff changeset
222 // convert them directly to an invokespecial.
09c2ba680204 6700102: c2 assertion "counter_changed,"failed dependencies, but counter didn't change")" with AggressiveOpts
kvn
parents: 78
diff changeset
223 if (target->is_loaded() && !target->is_abstract() &&
09c2ba680204 6700102: c2 assertion "counter_changed,"failed dependencies, but counter didn't change")" with AggressiveOpts
kvn
parents: 78
diff changeset
224 target->can_be_statically_bound() && code == Bytecodes::_invokevirtual) {
09c2ba680204 6700102: c2 assertion "counter_changed,"failed dependencies, but counter didn't change")" with AggressiveOpts
kvn
parents: 78
diff changeset
225 code = Bytecodes::_invokespecial;
09c2ba680204 6700102: c2 assertion "counter_changed,"failed dependencies, but counter didn't change")" with AggressiveOpts
kvn
parents: 78
diff changeset
226 }
09c2ba680204 6700102: c2 assertion "counter_changed,"failed dependencies, but counter didn't change")" with AggressiveOpts
kvn
parents: 78
diff changeset
227
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // compute size of arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
229 int arg_size = target->arg_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
230 if (!target->is_loaded() && code == Bytecodes::_invokestatic) {
a61af66fc99e Initial load
duke
parents:
diff changeset
231 arg_size--;
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233 int arg_base = MAX2(state._stack_height - arg_size, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // direct recursive calls are skipped if they can be bound statically without introducing
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // dependencies and if parameters are passed at the same position as in the current method
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // other calls are skipped if there are no unescaped arguments passed to them
a61af66fc99e Initial load
duke
parents:
diff changeset
238 bool directly_recursive = (method() == target) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
239 (code != Bytecodes::_invokevirtual || target->is_final_method() || state._stack[arg_base] .is_empty());
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // check if analysis of callee can safely be skipped
a61af66fc99e Initial load
duke
parents:
diff changeset
242 bool skip_callee = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 for (i = state._stack_height - 1; i >= arg_base && skip_callee; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 ArgumentMap arg = state._stack[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
245 skip_callee = !is_argument(arg) || !is_arg_stack(arg) || (directly_recursive && arg.is_singleton(i - arg_base));
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 if (skip_callee) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 TRACE_BCEA(3, tty->print_cr("[EA] skipping method %s::%s", holder->name()->as_utf8(), target->name()->as_utf8()));
a61af66fc99e Initial load
duke
parents:
diff changeset
249 for (i = 0; i < arg_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 set_method_escape(state.raw_pop());
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
252 _unknown_modified = true; // assume the worst since we don't analyze the called method
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // determine actual method (use CHA if necessary)
a61af66fc99e Initial load
duke
parents:
diff changeset
257 ciMethod* inline_target = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 if (target->is_loaded() && klass->is_loaded()
a61af66fc99e Initial load
duke
parents:
diff changeset
259 && (klass->is_initialized() || klass->is_interface() && target->holder()->is_initialized())
a61af66fc99e Initial load
duke
parents:
diff changeset
260 && target->will_link(klass, callee_holder, code)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 if (code == Bytecodes::_invokestatic
a61af66fc99e Initial load
duke
parents:
diff changeset
262 || code == Bytecodes::_invokespecial
a61af66fc99e Initial load
duke
parents:
diff changeset
263 || code == Bytecodes::_invokevirtual && target->is_final_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 inline_target = target;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 inline_target = target->find_monomorphic_target(calling_klass, callee_holder, actual_recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 if (inline_target != NULL && !is_recursive_call(inline_target)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // analyze callee
a61af66fc99e Initial load
duke
parents:
diff changeset
272 BCEscapeAnalyzer analyzer(inline_target, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // adjust escape state of actual parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
275 bool must_record_dependencies = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 for (i = arg_size - 1; i >= 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 ArgumentMap arg = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
278 if (!is_argument(arg))
a61af66fc99e Initial load
duke
parents:
diff changeset
279 continue;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
280 for (int j = 0; j < _arg_size; j++) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
281 if (arg.contains(j)) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
282 _arg_modified[j] |= analyzer._arg_modified[i];
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
283 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
284 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
285 if (!is_arg_stack(arg)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // arguments have already been recognized as escaping
a61af66fc99e Initial load
duke
parents:
diff changeset
287 } else if (analyzer.is_arg_stack(i) && !analyzer.is_arg_returned(i)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 set_method_escape(arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
289 must_record_dependencies = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 set_global_escape(arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
294 _unknown_modified = _unknown_modified || analyzer.has_non_arg_side_affects();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // record dependencies if at least one parameter retained stack-allocatable
a61af66fc99e Initial load
duke
parents:
diff changeset
297 if (must_record_dependencies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 if (code == Bytecodes::_invokeinterface || code == Bytecodes::_invokevirtual && !target->is_final_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 _dependencies.append(actual_recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 _dependencies.append(inline_target);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302 _dependencies.appendAll(analyzer.dependencies());
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
305 TRACE_BCEA(1, tty->print_cr("[EA] virtual method %s is not monomorphic.",
a61af66fc99e Initial load
duke
parents:
diff changeset
306 target->name()->as_utf8()));
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // conservatively mark all actual parameters as escaping globally
a61af66fc99e Initial load
duke
parents:
diff changeset
308 for (i = 0; i < arg_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 ArgumentMap arg = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
310 if (!is_argument(arg))
a61af66fc99e Initial load
duke
parents:
diff changeset
311 continue;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
312 set_modified(arg, OFFSET_ANY, type2size[T_INT]*HeapWordSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
313 set_global_escape(arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
315 _unknown_modified = true; // assume the worst since we don't know the called method
0
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 bool BCEscapeAnalyzer::contains(uint arg_set1, uint arg_set2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 return ((~arg_set1) | arg_set2) == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 void BCEscapeAnalyzer::iterate_one_block(ciBlock *blk, StateInfo &state, GrowableArray<ciBlock *> &successors) {
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 blk->set_processed();
a61af66fc99e Initial load
duke
parents:
diff changeset
327 ciBytecodeStream s(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
328 int limit_bci = blk->limit_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
329 bool fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 ArgumentMap allocated_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 allocated_obj.add_allocated();
a61af66fc99e Initial load
duke
parents:
diff changeset
332 ArgumentMap unknown_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
333 unknown_obj.add_unknown();
a61af66fc99e Initial load
duke
parents:
diff changeset
334 ArgumentMap empty_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 s.reset_to_bci(blk->start_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
337 while (s.next() != ciBytecodeStream::EOBC() && s.cur_bci() < limit_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
338 fall_through = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
339 switch (s.cur_bc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 case Bytecodes::_nop:
a61af66fc99e Initial load
duke
parents:
diff changeset
341 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 case Bytecodes::_aconst_null:
a61af66fc99e Initial load
duke
parents:
diff changeset
343 state.apush(empty_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
344 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 case Bytecodes::_iconst_m1:
a61af66fc99e Initial load
duke
parents:
diff changeset
346 case Bytecodes::_iconst_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
347 case Bytecodes::_iconst_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
348 case Bytecodes::_iconst_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
349 case Bytecodes::_iconst_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
350 case Bytecodes::_iconst_4:
a61af66fc99e Initial load
duke
parents:
diff changeset
351 case Bytecodes::_iconst_5:
a61af66fc99e Initial load
duke
parents:
diff changeset
352 case Bytecodes::_fconst_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
353 case Bytecodes::_fconst_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
354 case Bytecodes::_fconst_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
355 case Bytecodes::_bipush:
a61af66fc99e Initial load
duke
parents:
diff changeset
356 case Bytecodes::_sipush:
a61af66fc99e Initial load
duke
parents:
diff changeset
357 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
358 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 case Bytecodes::_lconst_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
360 case Bytecodes::_lconst_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
361 case Bytecodes::_dconst_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
362 case Bytecodes::_dconst_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
363 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
364 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
365 case Bytecodes::_ldc:
a61af66fc99e Initial load
duke
parents:
diff changeset
366 case Bytecodes::_ldc_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
367 case Bytecodes::_ldc2_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
368 if (type2size[s.get_constant().basic_type()] == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
370 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
373 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
374 case Bytecodes::_aload:
a61af66fc99e Initial load
duke
parents:
diff changeset
375 state.apush(state._vars[s.get_index()]);
a61af66fc99e Initial load
duke
parents:
diff changeset
376 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 case Bytecodes::_iload:
a61af66fc99e Initial load
duke
parents:
diff changeset
378 case Bytecodes::_fload:
a61af66fc99e Initial load
duke
parents:
diff changeset
379 case Bytecodes::_iload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
380 case Bytecodes::_iload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
381 case Bytecodes::_iload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
382 case Bytecodes::_iload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
383 case Bytecodes::_fload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
384 case Bytecodes::_fload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
385 case Bytecodes::_fload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
386 case Bytecodes::_fload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
387 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
388 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 case Bytecodes::_lload:
a61af66fc99e Initial load
duke
parents:
diff changeset
390 case Bytecodes::_dload:
a61af66fc99e Initial load
duke
parents:
diff changeset
391 case Bytecodes::_lload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
392 case Bytecodes::_lload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
393 case Bytecodes::_lload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
394 case Bytecodes::_lload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
395 case Bytecodes::_dload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
396 case Bytecodes::_dload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
397 case Bytecodes::_dload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
398 case Bytecodes::_dload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
399 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
400 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
401 case Bytecodes::_aload_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
402 state.apush(state._vars[0]);
a61af66fc99e Initial load
duke
parents:
diff changeset
403 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 case Bytecodes::_aload_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
405 state.apush(state._vars[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
406 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
407 case Bytecodes::_aload_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
408 state.apush(state._vars[2]);
a61af66fc99e Initial load
duke
parents:
diff changeset
409 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
410 case Bytecodes::_aload_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
411 state.apush(state._vars[3]);
a61af66fc99e Initial load
duke
parents:
diff changeset
412 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
413 case Bytecodes::_iaload:
a61af66fc99e Initial load
duke
parents:
diff changeset
414 case Bytecodes::_faload:
a61af66fc99e Initial load
duke
parents:
diff changeset
415 case Bytecodes::_baload:
a61af66fc99e Initial load
duke
parents:
diff changeset
416 case Bytecodes::_caload:
a61af66fc99e Initial load
duke
parents:
diff changeset
417 case Bytecodes::_saload:
a61af66fc99e Initial load
duke
parents:
diff changeset
418 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
419 set_method_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
420 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
421 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 case Bytecodes::_laload:
a61af66fc99e Initial load
duke
parents:
diff changeset
423 case Bytecodes::_daload:
a61af66fc99e Initial load
duke
parents:
diff changeset
424 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 set_method_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
426 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
427 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
428 case Bytecodes::_aaload:
a61af66fc99e Initial load
duke
parents:
diff changeset
429 { state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
430 ArgumentMap array = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
431 set_method_escape(array);
a61af66fc99e Initial load
duke
parents:
diff changeset
432 state.apush(unknown_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
433 set_dirty(array);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
436 case Bytecodes::_istore:
a61af66fc99e Initial load
duke
parents:
diff changeset
437 case Bytecodes::_fstore:
a61af66fc99e Initial load
duke
parents:
diff changeset
438 case Bytecodes::_istore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
439 case Bytecodes::_istore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
440 case Bytecodes::_istore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
441 case Bytecodes::_istore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
442 case Bytecodes::_fstore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
443 case Bytecodes::_fstore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
444 case Bytecodes::_fstore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
445 case Bytecodes::_fstore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
446 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
447 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 case Bytecodes::_lstore:
a61af66fc99e Initial load
duke
parents:
diff changeset
449 case Bytecodes::_dstore:
a61af66fc99e Initial load
duke
parents:
diff changeset
450 case Bytecodes::_lstore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
451 case Bytecodes::_lstore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
452 case Bytecodes::_lstore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
453 case Bytecodes::_lstore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
454 case Bytecodes::_dstore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
455 case Bytecodes::_dstore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
456 case Bytecodes::_dstore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
457 case Bytecodes::_dstore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
458 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
459 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
460 case Bytecodes::_astore:
a61af66fc99e Initial load
duke
parents:
diff changeset
461 state._vars[s.get_index()] = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
462 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 case Bytecodes::_astore_0:
a61af66fc99e Initial load
duke
parents:
diff changeset
464 state._vars[0] = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
465 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
466 case Bytecodes::_astore_1:
a61af66fc99e Initial load
duke
parents:
diff changeset
467 state._vars[1] = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
468 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
469 case Bytecodes::_astore_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
470 state._vars[2] = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
471 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
472 case Bytecodes::_astore_3:
a61af66fc99e Initial load
duke
parents:
diff changeset
473 state._vars[3] = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
474 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 case Bytecodes::_iastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
476 case Bytecodes::_fastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
477 case Bytecodes::_bastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
478 case Bytecodes::_castore:
a61af66fc99e Initial load
duke
parents:
diff changeset
479 case Bytecodes::_sastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
480 {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
482 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
483 ArgumentMap arr = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
484 set_method_escape(arr);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
485 set_modified(arr, OFFSET_ANY, type2size[T_INT]*HeapWordSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
486 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488 case Bytecodes::_lastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
489 case Bytecodes::_dastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
490 {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
492 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
493 ArgumentMap arr = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
494 set_method_escape(arr);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
495 set_modified(arr, OFFSET_ANY, type2size[T_LONG]*HeapWordSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
496 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498 case Bytecodes::_aastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
499 {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 set_global_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
501 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
502 ArgumentMap arr = state.apop();
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
503 set_modified(arr, OFFSET_ANY, type2size[T_OBJECT]*HeapWordSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
504 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
506 case Bytecodes::_pop:
a61af66fc99e Initial load
duke
parents:
diff changeset
507 state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
508 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 case Bytecodes::_pop2:
a61af66fc99e Initial load
duke
parents:
diff changeset
510 state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
511 state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
512 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
513 case Bytecodes::_dup:
a61af66fc99e Initial load
duke
parents:
diff changeset
514 { ArgumentMap w1 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
515 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
516 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
518 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 case Bytecodes::_dup_x1:
a61af66fc99e Initial load
duke
parents:
diff changeset
520 { ArgumentMap w1 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
521 ArgumentMap w2 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
522 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
523 state.raw_push(w2);
a61af66fc99e Initial load
duke
parents:
diff changeset
524 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
526 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
527 case Bytecodes::_dup_x2:
a61af66fc99e Initial load
duke
parents:
diff changeset
528 { ArgumentMap w1 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
529 ArgumentMap w2 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
530 ArgumentMap w3 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
531 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
532 state.raw_push(w3);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 state.raw_push(w2);
a61af66fc99e Initial load
duke
parents:
diff changeset
534 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
537 case Bytecodes::_dup2:
a61af66fc99e Initial load
duke
parents:
diff changeset
538 { ArgumentMap w1 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
539 ArgumentMap w2 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
540 state.raw_push(w2);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
542 state.raw_push(w2);
a61af66fc99e Initial load
duke
parents:
diff changeset
543 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
546 case Bytecodes::_dup2_x1:
a61af66fc99e Initial load
duke
parents:
diff changeset
547 { ArgumentMap w1 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
548 ArgumentMap w2 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
549 ArgumentMap w3 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
550 state.raw_push(w2);
a61af66fc99e Initial load
duke
parents:
diff changeset
551 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
552 state.raw_push(w3);
a61af66fc99e Initial load
duke
parents:
diff changeset
553 state.raw_push(w2);
a61af66fc99e Initial load
duke
parents:
diff changeset
554 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
557 case Bytecodes::_dup2_x2:
a61af66fc99e Initial load
duke
parents:
diff changeset
558 { ArgumentMap w1 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
559 ArgumentMap w2 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
560 ArgumentMap w3 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
561 ArgumentMap w4 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
562 state.raw_push(w2);
a61af66fc99e Initial load
duke
parents:
diff changeset
563 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
564 state.raw_push(w4);
a61af66fc99e Initial load
duke
parents:
diff changeset
565 state.raw_push(w3);
a61af66fc99e Initial load
duke
parents:
diff changeset
566 state.raw_push(w2);
a61af66fc99e Initial load
duke
parents:
diff changeset
567 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
569 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
570 case Bytecodes::_swap:
a61af66fc99e Initial load
duke
parents:
diff changeset
571 { ArgumentMap w1 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
572 ArgumentMap w2 = state.raw_pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
573 state.raw_push(w1);
a61af66fc99e Initial load
duke
parents:
diff changeset
574 state.raw_push(w2);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
576 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
577 case Bytecodes::_iadd:
a61af66fc99e Initial load
duke
parents:
diff changeset
578 case Bytecodes::_fadd:
a61af66fc99e Initial load
duke
parents:
diff changeset
579 case Bytecodes::_isub:
a61af66fc99e Initial load
duke
parents:
diff changeset
580 case Bytecodes::_fsub:
a61af66fc99e Initial load
duke
parents:
diff changeset
581 case Bytecodes::_imul:
a61af66fc99e Initial load
duke
parents:
diff changeset
582 case Bytecodes::_fmul:
a61af66fc99e Initial load
duke
parents:
diff changeset
583 case Bytecodes::_idiv:
a61af66fc99e Initial load
duke
parents:
diff changeset
584 case Bytecodes::_fdiv:
a61af66fc99e Initial load
duke
parents:
diff changeset
585 case Bytecodes::_irem:
a61af66fc99e Initial load
duke
parents:
diff changeset
586 case Bytecodes::_frem:
a61af66fc99e Initial load
duke
parents:
diff changeset
587 case Bytecodes::_iand:
a61af66fc99e Initial load
duke
parents:
diff changeset
588 case Bytecodes::_ior:
a61af66fc99e Initial load
duke
parents:
diff changeset
589 case Bytecodes::_ixor:
a61af66fc99e Initial load
duke
parents:
diff changeset
590 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
591 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
592 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
593 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
594 case Bytecodes::_ladd:
a61af66fc99e Initial load
duke
parents:
diff changeset
595 case Bytecodes::_dadd:
a61af66fc99e Initial load
duke
parents:
diff changeset
596 case Bytecodes::_lsub:
a61af66fc99e Initial load
duke
parents:
diff changeset
597 case Bytecodes::_dsub:
a61af66fc99e Initial load
duke
parents:
diff changeset
598 case Bytecodes::_lmul:
a61af66fc99e Initial load
duke
parents:
diff changeset
599 case Bytecodes::_dmul:
a61af66fc99e Initial load
duke
parents:
diff changeset
600 case Bytecodes::_ldiv:
a61af66fc99e Initial load
duke
parents:
diff changeset
601 case Bytecodes::_ddiv:
a61af66fc99e Initial load
duke
parents:
diff changeset
602 case Bytecodes::_lrem:
a61af66fc99e Initial load
duke
parents:
diff changeset
603 case Bytecodes::_drem:
a61af66fc99e Initial load
duke
parents:
diff changeset
604 case Bytecodes::_land:
a61af66fc99e Initial load
duke
parents:
diff changeset
605 case Bytecodes::_lor:
a61af66fc99e Initial load
duke
parents:
diff changeset
606 case Bytecodes::_lxor:
a61af66fc99e Initial load
duke
parents:
diff changeset
607 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
608 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
609 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
610 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
611 case Bytecodes::_ishl:
a61af66fc99e Initial load
duke
parents:
diff changeset
612 case Bytecodes::_ishr:
a61af66fc99e Initial load
duke
parents:
diff changeset
613 case Bytecodes::_iushr:
a61af66fc99e Initial load
duke
parents:
diff changeset
614 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
615 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
616 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
617 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
618 case Bytecodes::_lshl:
a61af66fc99e Initial load
duke
parents:
diff changeset
619 case Bytecodes::_lshr:
a61af66fc99e Initial load
duke
parents:
diff changeset
620 case Bytecodes::_lushr:
a61af66fc99e Initial load
duke
parents:
diff changeset
621 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
622 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
623 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
624 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
625 case Bytecodes::_ineg:
a61af66fc99e Initial load
duke
parents:
diff changeset
626 case Bytecodes::_fneg:
a61af66fc99e Initial load
duke
parents:
diff changeset
627 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
628 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
629 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
630 case Bytecodes::_lneg:
a61af66fc99e Initial load
duke
parents:
diff changeset
631 case Bytecodes::_dneg:
a61af66fc99e Initial load
duke
parents:
diff changeset
632 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
633 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
634 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
635 case Bytecodes::_iinc:
a61af66fc99e Initial load
duke
parents:
diff changeset
636 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
637 case Bytecodes::_i2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
638 case Bytecodes::_i2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
639 case Bytecodes::_f2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
640 case Bytecodes::_f2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
641 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
642 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
643 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
644 case Bytecodes::_i2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
645 case Bytecodes::_f2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
646 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
647 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
648 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
649 case Bytecodes::_l2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
650 case Bytecodes::_l2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
651 case Bytecodes::_d2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
652 case Bytecodes::_d2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
653 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
654 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
655 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
656 case Bytecodes::_l2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
657 case Bytecodes::_d2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
658 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
659 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
660 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 case Bytecodes::_i2b:
a61af66fc99e Initial load
duke
parents:
diff changeset
662 case Bytecodes::_i2c:
a61af66fc99e Initial load
duke
parents:
diff changeset
663 case Bytecodes::_i2s:
a61af66fc99e Initial load
duke
parents:
diff changeset
664 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
665 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
666 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
667 case Bytecodes::_lcmp:
a61af66fc99e Initial load
duke
parents:
diff changeset
668 case Bytecodes::_dcmpl:
a61af66fc99e Initial load
duke
parents:
diff changeset
669 case Bytecodes::_dcmpg:
a61af66fc99e Initial load
duke
parents:
diff changeset
670 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
671 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
672 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
673 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
674 case Bytecodes::_fcmpl:
a61af66fc99e Initial load
duke
parents:
diff changeset
675 case Bytecodes::_fcmpg:
a61af66fc99e Initial load
duke
parents:
diff changeset
676 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
677 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
678 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
679 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
680 case Bytecodes::_ifeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
681 case Bytecodes::_ifne:
a61af66fc99e Initial load
duke
parents:
diff changeset
682 case Bytecodes::_iflt:
a61af66fc99e Initial load
duke
parents:
diff changeset
683 case Bytecodes::_ifge:
a61af66fc99e Initial load
duke
parents:
diff changeset
684 case Bytecodes::_ifgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
685 case Bytecodes::_ifle:
a61af66fc99e Initial load
duke
parents:
diff changeset
686 {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
688 int dest_bci = s.get_dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
689 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
690 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
691 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
692 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
694 case Bytecodes::_if_icmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
695 case Bytecodes::_if_icmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
696 case Bytecodes::_if_icmplt:
a61af66fc99e Initial load
duke
parents:
diff changeset
697 case Bytecodes::_if_icmpge:
a61af66fc99e Initial load
duke
parents:
diff changeset
698 case Bytecodes::_if_icmpgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
699 case Bytecodes::_if_icmple:
a61af66fc99e Initial load
duke
parents:
diff changeset
700 {
a61af66fc99e Initial load
duke
parents:
diff changeset
701 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
702 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
703 int dest_bci = s.get_dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
704 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
705 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
706 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
707 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
708 }
a61af66fc99e Initial load
duke
parents:
diff changeset
709 case Bytecodes::_if_acmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
710 case Bytecodes::_if_acmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
711 {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 set_method_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
713 set_method_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
714 int dest_bci = s.get_dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
715 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
716 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
717 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
718 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720 case Bytecodes::_goto:
a61af66fc99e Initial load
duke
parents:
diff changeset
721 {
a61af66fc99e Initial load
duke
parents:
diff changeset
722 int dest_bci = s.get_dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
723 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
724 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
725 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
726 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
727 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729 case Bytecodes::_jsr:
a61af66fc99e Initial load
duke
parents:
diff changeset
730 {
a61af66fc99e Initial load
duke
parents:
diff changeset
731 int dest_bci = s.get_dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
732 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
733 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
734 state.apush(empty_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
735 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
736 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
737 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
739 case Bytecodes::_ret:
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // we don't track the destination of a "ret" instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
741 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
742 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
743 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
744 case Bytecodes::_return:
a61af66fc99e Initial load
duke
parents:
diff changeset
745 assert(s.next_bci() == limit_bci, "return must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
746 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
747 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 case Bytecodes::_tableswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
749 {
a61af66fc99e Initial load
duke
parents:
diff changeset
750 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
751 Bytecode_tableswitch* switch_ = Bytecode_tableswitch_at(s.cur_bcp());
a61af66fc99e Initial load
duke
parents:
diff changeset
752 int len = switch_->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
753 int dest_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
754 for (int i = 0; i < len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 dest_bci = s.cur_bci() + switch_->dest_offset_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
756 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
757 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
758 }
a61af66fc99e Initial load
duke
parents:
diff changeset
759 dest_bci = s.cur_bci() + switch_->default_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
760 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
761 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
762 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
763 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
764 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
766 case Bytecodes::_lookupswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
767 {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
769 Bytecode_lookupswitch* switch_ = Bytecode_lookupswitch_at(s.cur_bcp());
a61af66fc99e Initial load
duke
parents:
diff changeset
770 int len = switch_->number_of_pairs();
a61af66fc99e Initial load
duke
parents:
diff changeset
771 int dest_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
772 for (int i = 0; i < len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
773 dest_bci = s.cur_bci() + switch_->pair_at(i)->offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
774 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
775 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
777 dest_bci = s.cur_bci() + switch_->default_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
778 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
779 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
780 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
781 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783 case Bytecodes::_ireturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
784 case Bytecodes::_freturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
785 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
786 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
787 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
788 case Bytecodes::_lreturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
789 case Bytecodes::_dreturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
790 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
791 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
793 case Bytecodes::_areturn:
a61af66fc99e Initial load
duke
parents:
diff changeset
794 set_returned(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
795 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
796 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
797 case Bytecodes::_getstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
798 case Bytecodes::_getfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
799 { bool will_link;
a61af66fc99e Initial load
duke
parents:
diff changeset
800 ciField* field = s.get_field(will_link);
a61af66fc99e Initial load
duke
parents:
diff changeset
801 BasicType field_type = field->type()->basic_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
802 if (s.cur_bc() != Bytecodes::_getstatic) {
a61af66fc99e Initial load
duke
parents:
diff changeset
803 set_method_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
804 }
a61af66fc99e Initial load
duke
parents:
diff changeset
805 if (field_type == T_OBJECT || field_type == T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 state.apush(unknown_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
807 } else if (type2size[field_type] == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
808 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
809 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
810 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812 }
a61af66fc99e Initial load
duke
parents:
diff changeset
813 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
814 case Bytecodes::_putstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
815 case Bytecodes::_putfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
816 { bool will_link;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 ciField* field = s.get_field(will_link);
a61af66fc99e Initial load
duke
parents:
diff changeset
818 BasicType field_type = field->type()->basic_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
819 if (field_type == T_OBJECT || field_type == T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
820 set_global_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
821 } else if (type2size[field_type] == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
822 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
823 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 state.lpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
826 if (s.cur_bc() != Bytecodes::_putstatic) {
a61af66fc99e Initial load
duke
parents:
diff changeset
827 ArgumentMap p = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
828 set_method_escape(p);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
829 set_modified(p, will_link ? field->offset() : OFFSET_ANY, type2size[field_type]*HeapWordSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
832 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
833 case Bytecodes::_invokevirtual:
a61af66fc99e Initial load
duke
parents:
diff changeset
834 case Bytecodes::_invokespecial:
a61af66fc99e Initial load
duke
parents:
diff changeset
835 case Bytecodes::_invokestatic:
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 196
diff changeset
836 case Bytecodes::_invokedynamic:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
837 case Bytecodes::_invokeinterface:
a61af66fc99e Initial load
duke
parents:
diff changeset
838 { bool will_link;
a61af66fc99e Initial load
duke
parents:
diff changeset
839 ciMethod* target = s.get_method(will_link);
a61af66fc99e Initial load
duke
parents:
diff changeset
840 ciKlass* holder = s.get_declared_method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
841 invoke(state, s.cur_bc(), target, holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
842 ciType* return_type = target->return_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
843 if (!return_type->is_primitive_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
844 state.apush(unknown_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
845 } else if (return_type->is_one_word()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
846 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
847 } else if (return_type->is_two_word()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
848 state.lpush();
a61af66fc99e Initial load
duke
parents:
diff changeset
849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
851 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 case Bytecodes::_new:
a61af66fc99e Initial load
duke
parents:
diff changeset
853 state.apush(allocated_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
854 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
855 case Bytecodes::_newarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
856 case Bytecodes::_anewarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
857 state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
858 state.apush(allocated_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
859 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
860 case Bytecodes::_multianewarray:
a61af66fc99e Initial load
duke
parents:
diff changeset
861 { int i = s.cur_bcp()[3];
a61af66fc99e Initial load
duke
parents:
diff changeset
862 while (i-- > 0) state.spop();
a61af66fc99e Initial load
duke
parents:
diff changeset
863 state.apush(allocated_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
864 }
a61af66fc99e Initial load
duke
parents:
diff changeset
865 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
866 case Bytecodes::_arraylength:
a61af66fc99e Initial load
duke
parents:
diff changeset
867 set_method_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
868 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
869 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
870 case Bytecodes::_athrow:
a61af66fc99e Initial load
duke
parents:
diff changeset
871 set_global_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
872 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
873 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
874 case Bytecodes::_checkcast:
a61af66fc99e Initial load
duke
parents:
diff changeset
875 { ArgumentMap obj = state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
876 set_method_escape(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
877 state.apush(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
879 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 case Bytecodes::_instanceof:
a61af66fc99e Initial load
duke
parents:
diff changeset
881 set_method_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
882 state.spush();
a61af66fc99e Initial load
duke
parents:
diff changeset
883 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 case Bytecodes::_monitorenter:
a61af66fc99e Initial load
duke
parents:
diff changeset
885 case Bytecodes::_monitorexit:
a61af66fc99e Initial load
duke
parents:
diff changeset
886 state.apop();
a61af66fc99e Initial load
duke
parents:
diff changeset
887 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
888 case Bytecodes::_wide:
a61af66fc99e Initial load
duke
parents:
diff changeset
889 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
890 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
891 case Bytecodes::_ifnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
892 case Bytecodes::_ifnonnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
893 {
a61af66fc99e Initial load
duke
parents:
diff changeset
894 set_method_escape(state.apop());
a61af66fc99e Initial load
duke
parents:
diff changeset
895 int dest_bci = s.get_dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
896 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
897 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
898 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
899 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
901 case Bytecodes::_goto_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
902 {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 int dest_bci = s.get_far_dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
904 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
905 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
906 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
907 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
908 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
909 }
a61af66fc99e Initial load
duke
parents:
diff changeset
910 case Bytecodes::_jsr_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
911 {
a61af66fc99e Initial load
duke
parents:
diff changeset
912 int dest_bci = s.get_far_dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
913 assert(_methodBlocks->is_block_start(dest_bci), "branch destination must start a block");
a61af66fc99e Initial load
duke
parents:
diff changeset
914 assert(s.next_bci() == limit_bci, "branch must end block");
a61af66fc99e Initial load
duke
parents:
diff changeset
915 state.apush(empty_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
916 successors.push(_methodBlocks->block_containing(dest_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
917 fall_through = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
918 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
920 case Bytecodes::_breakpoint:
a61af66fc99e Initial load
duke
parents:
diff changeset
921 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
922 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
923 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
924 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
925 }
a61af66fc99e Initial load
duke
parents:
diff changeset
926
a61af66fc99e Initial load
duke
parents:
diff changeset
927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
928 if (fall_through) {
a61af66fc99e Initial load
duke
parents:
diff changeset
929 int fall_through_bci = s.cur_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
930 if (fall_through_bci < _method->code_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 assert(_methodBlocks->is_block_start(fall_through_bci), "must fall through to block start.");
a61af66fc99e Initial load
duke
parents:
diff changeset
932 successors.push(_methodBlocks->block_containing(fall_through_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934 }
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936
a61af66fc99e Initial load
duke
parents:
diff changeset
937 void BCEscapeAnalyzer::merge_block_states(StateInfo *blockstates, ciBlock *dest, StateInfo *s_state) {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
938 StateInfo *d_state = blockstates + dest->index();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
939 int nlocals = _method->max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // exceptions may cause transfer of control to handlers in the middle of a
a61af66fc99e Initial load
duke
parents:
diff changeset
942 // block, so we don't merge the incoming state of exception handlers
a61af66fc99e Initial load
duke
parents:
diff changeset
943 if (dest->is_handler())
a61af66fc99e Initial load
duke
parents:
diff changeset
944 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
945 if (!d_state->_initialized ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 // destination not initialized, just copy
a61af66fc99e Initial load
duke
parents:
diff changeset
947 for (int i = 0; i < nlocals; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
948 d_state->_vars[i] = s_state->_vars[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
950 for (int i = 0; i < s_state->_stack_height; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
951 d_state->_stack[i] = s_state->_stack[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
953 d_state->_stack_height = s_state->_stack_height;
a61af66fc99e Initial load
duke
parents:
diff changeset
954 d_state->_max_stack = s_state->_max_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
955 d_state->_initialized = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
956 } else if (!dest->processed()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
957 // we have not yet walked the bytecodes of dest, we can merge
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // the states
a61af66fc99e Initial load
duke
parents:
diff changeset
959 assert(d_state->_stack_height == s_state->_stack_height, "computed stack heights must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
960 for (int i = 0; i < nlocals; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
961 d_state->_vars[i].set_union(s_state->_vars[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
963 for (int i = 0; i < s_state->_stack_height; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
964 d_state->_stack[i].set_union(s_state->_stack[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
966 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // the bytecodes of dest have already been processed, mark any
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // arguments in the source state which are not in the dest state
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // as global escape.
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // Future refinement: we only need to mark these variable to the
a61af66fc99e Initial load
duke
parents:
diff changeset
971 // maximum escape of any variables in dest state
a61af66fc99e Initial load
duke
parents:
diff changeset
972 assert(d_state->_stack_height == s_state->_stack_height, "computed stack heights must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
973 ArgumentMap extra_vars;
a61af66fc99e Initial load
duke
parents:
diff changeset
974 for (int i = 0; i < nlocals; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
975 ArgumentMap t;
a61af66fc99e Initial load
duke
parents:
diff changeset
976 t = s_state->_vars[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
977 t.set_difference(d_state->_vars[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
978 extra_vars.set_union(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
979 }
a61af66fc99e Initial load
duke
parents:
diff changeset
980 for (int i = 0; i < s_state->_stack_height; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 ArgumentMap t;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
982 //extra_vars |= !d_state->_vars[i] & s_state->_vars[i];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
983 t.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
984 t = s_state->_stack[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
985 t.set_difference(d_state->_stack[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
986 extra_vars.set_union(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
987 }
a61af66fc99e Initial load
duke
parents:
diff changeset
988 set_global_escape(extra_vars);
a61af66fc99e Initial load
duke
parents:
diff changeset
989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
990 }
a61af66fc99e Initial load
duke
parents:
diff changeset
991
a61af66fc99e Initial load
duke
parents:
diff changeset
992 void BCEscapeAnalyzer::iterate_blocks(Arena *arena) {
a61af66fc99e Initial load
duke
parents:
diff changeset
993 int numblocks = _methodBlocks->num_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
994 int stkSize = _method->max_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
995 int numLocals = _method->max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
996 StateInfo state;
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 int datacount = (numblocks + 1) * (stkSize + numLocals);
a61af66fc99e Initial load
duke
parents:
diff changeset
999 int datasize = datacount * sizeof(ArgumentMap);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1000 StateInfo *blockstates = (StateInfo *) arena->Amalloc(numblocks * sizeof(StateInfo));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 ArgumentMap *statedata = (ArgumentMap *) arena->Amalloc(datasize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 for (int i = 0; i < datacount; i++) ::new ((void*)&statedata[i]) ArgumentMap();
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 ArgumentMap *dp = statedata;
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 state._vars = dp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 dp += numLocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 state._stack = dp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 dp += stkSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 state._initialized = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 state._max_stack = stkSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 for (int i = 0; i < numblocks; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 blockstates[i]._vars = dp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 dp += numLocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 blockstates[i]._stack = dp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 dp += stkSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 blockstates[i]._initialized = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 blockstates[i]._stack_height = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 blockstates[i]._max_stack = stkSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 GrowableArray<ciBlock *> worklist(arena, numblocks / 4, 0, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 GrowableArray<ciBlock *> successors(arena, 4, 0, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 _methodBlocks->clear_processed();
a61af66fc99e Initial load
duke
parents:
diff changeset
1023
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 // initialize block 0 state from method signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 ArgumentMap allVars; // all oop arguments to method
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 ciSignature* sig = method()->signature();
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 int j = 0;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1028 ciBlock* first_blk = _methodBlocks->block_containing(0);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1029 int fb_i = first_blk->index();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 if (!method()->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 // record information for "this"
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1032 blockstates[fb_i]._vars[j].set(j);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 allVars.add(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 j++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 for (int i = 0; i < sig->count(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 ciType* t = sig->type_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 if (!t->is_primitive_type()) {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1039 blockstates[fb_i]._vars[j].set(j);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 allVars.add(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 j += t->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 }
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1044 blockstates[fb_i]._initialized = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 assert(j == _arg_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 ArgumentMap unknown_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 unknown_map.add_unknown();
a61af66fc99e Initial load
duke
parents:
diff changeset
1049
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1050 worklist.push(first_blk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 while(worklist.length() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 ciBlock *blk = worklist.pop();
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1053 StateInfo *blkState = blockstates + blk->index();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 if (blk->is_handler() || blk->is_ret_target()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // for an exception handler or a target of a ret instruction, we assume the worst case,
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1056 // that any variable could contain any argument
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 for (int i = 0; i < numLocals; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 state._vars[i] = allVars;
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 if (blk->is_handler()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 state._stack_height = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 state._stack_height = blkState->_stack_height;
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 for (int i = 0; i < state._stack_height; i++) {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1066 // ??? should this be unknown_map ???
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 state._stack[i] = allVars;
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 for (int i = 0; i < numLocals; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 state._vars[i] = blkState->_vars[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 for (int i = 0; i < blkState->_stack_height; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 state._stack[i] = blkState->_stack[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 state._stack_height = blkState->_stack_height;
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 iterate_one_block(blk, state, successors);
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // if this block has any exception handlers, push them
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 // onto successor list
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 if (blk->has_handler()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 DEBUG_ONLY(int handler_count = 0;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 int blk_start = blk->start_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 int blk_end = blk->limit_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 for (int i = 0; i < numblocks; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 ciBlock *b = _methodBlocks->block(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 if (b->is_handler()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 int ex_start = b->ex_start_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 int ex_end = b->ex_limit_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 if ((ex_start >= blk_start && ex_start < blk_end) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 (ex_end > blk_start && ex_end <= blk_end)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 successors.push(b);
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 DEBUG_ONLY(handler_count++;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 assert(handler_count > 0, "must find at least one handler");
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 // merge computed variable state with successors
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 while(successors.length() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 ciBlock *succ = successors.pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 merge_block_states(blockstates, succ, &state);
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 if (!succ->processed())
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 worklist.push(succ);
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1108
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 bool BCEscapeAnalyzer::do_analysis() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 Arena* arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 // identify basic blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 _methodBlocks = _method->get_method_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1113
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 iterate_blocks(arena);
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 // TEMPORARY
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1118
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 vmIntrinsics::ID iid = method()->intrinsic_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1121
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 if (iid == vmIntrinsics::_getClass ||
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1123 iid == vmIntrinsics::_fillInStackTrace ||
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 iid == vmIntrinsics::_hashCode)
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 return iid;
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 return vmIntrinsics::_none;
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 bool BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1131 ArgumentMap arg;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1132 arg.clear();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 switch (iid) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 case vmIntrinsics::_getClass:
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 _return_local = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 break;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1137 case vmIntrinsics::_fillInStackTrace:
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1138 arg.set(0); // 'this'
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1139 set_returned(arg);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1140 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 case vmIntrinsics::_hashCode:
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 // initialized state is correct
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 assert(false, "unexpected intrinsic");
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1149
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 void BCEscapeAnalyzer::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1152
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 // clear escape information (method may have been deoptimized)
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 methodData()->clear_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1155
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 // initialize escape state of object parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 ciSignature* sig = method()->signature();
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 int j = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 if (!method()->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 _arg_local.set_bit(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 _arg_stack.set_bit(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 j++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 for (i = 0; i < sig->count(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 ciType* t = sig->type_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 if (!t->is_primitive_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 _arg_local.set_bit(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 _arg_stack.set_bit(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 j += t->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 assert(j == _arg_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 // start with optimistic assumption
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 ciType *rt = _method->return_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 if (rt->is_primitive_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 _return_local = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 _return_allocated = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 _return_local = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 _return_allocated = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 _allocated_escapes = false;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1184 _unknown_modified = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1186
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 void BCEscapeAnalyzer::clear_escape_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 ciSignature* sig = method()->signature();
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 int arg_count = sig->count();
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 ArgumentMap var;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1191 if (!method()->is_static()) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1192 arg_count++; // allow for "this"
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1193 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 for (int i = 0; i < arg_count; i++) {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1195 set_arg_modified(i, OFFSET_ANY, 4);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 var.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 var.set(i);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1198 set_modified(var, OFFSET_ANY, 4);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 set_global_escape(var);
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 _arg_local.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 _arg_stack.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 _arg_returned.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 _return_local = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 _return_allocated = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 _allocated_escapes = true;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1207 _unknown_modified = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1209
a61af66fc99e Initial load
duke
parents:
diff changeset
1210
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 void BCEscapeAnalyzer::compute_escape_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 assert(!methodData()->has_escape_info(), "do not overwrite escape info");
a61af66fc99e Initial load
duke
parents:
diff changeset
1214
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 vmIntrinsics::ID iid = known_intrinsic();
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 // check if method can be analyzed
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 if (iid == vmIntrinsics::_none && (method()->is_abstract() || method()->is_native() || !method()->holder()->is_initialized()
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 || _level > MaxBCEAEstimateLevel
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 || method()->code_size() > MaxBCEAEstimateSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 if (BCEATraceLevel >= 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 tty->print("Skipping method because: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 if (method()->is_abstract())
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 tty->print_cr("method is abstract.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 else if (method()->is_native())
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 tty->print_cr("method is native.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 else if (!method()->holder()->is_initialized())
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 tty->print_cr("class of method is not initialized.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 else if (_level > MaxBCEAEstimateLevel)
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 tty->print_cr("level (%d) exceeds MaxBCEAEstimateLevel (%d).",
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 _level, MaxBCEAEstimateLevel);
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 else if (method()->code_size() > MaxBCEAEstimateSize)
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 tty->print_cr("code size (%d) exceeds MaxBCEAEstimateSize.",
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 method()->code_size(), MaxBCEAEstimateSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 clear_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1242
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 if (BCEATraceLevel >= 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 tty->print("[EA] estimating escape information for");
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 if (iid != vmIntrinsics::_none)
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 tty->print(" intrinsic");
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 method()->print_short_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 tty->print_cr(" (%d bytes)", method()->code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 bool success;
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1254
78
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1255 // Do not scan method if it has no object parameters and
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1256 // does not returns an object (_return_allocated is set in initialize()).
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1257 if (_arg_local.is_empty() && !_return_allocated) {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1258 // Clear all info since method's bytecode was not analysed and
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1259 // set pessimistic escape information.
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1260 clear_escape_info();
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1261 methodData()->set_eflag(methodDataOopDesc::allocated_escapes);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1262 methodData()->set_eflag(methodDataOopDesc::unknown_modified);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 methodData()->set_eflag(methodDataOopDesc::estimated);
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1266
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 if (iid != vmIntrinsics::_none)
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 success = compute_escape_for_intrinsic(iid);
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 success = do_analysis();
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1272
78
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1273 // don't store interprocedural escape information if it introduces
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1274 // dependencies or if method data is empty
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 if (!has_dependencies() && !methodData()->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 for (i = 0; i < _arg_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 if (_arg_local.at(i)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 assert(_arg_stack.at(i), "inconsistent escape info");
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 methodData()->set_arg_local(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 methodData()->set_arg_stack(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 } else if (_arg_stack.at(i)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 methodData()->set_arg_stack(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 if (_arg_returned.at(i)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 methodData()->set_arg_returned(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 }
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1288 methodData()->set_arg_modified(i, _arg_modified[i]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 if (_return_local) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 methodData()->set_eflag(methodDataOopDesc::return_local);
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 }
78
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1293 if (_return_allocated) {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1294 methodData()->set_eflag(methodDataOopDesc::return_allocated);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1295 }
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1296 if (_allocated_escapes) {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1297 methodData()->set_eflag(methodDataOopDesc::allocated_escapes);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1298 }
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1299 if (_unknown_modified) {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1300 methodData()->set_eflag(methodDataOopDesc::unknown_modified);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1301 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 methodData()->set_eflag(methodDataOopDesc::estimated);
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1305
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 void BCEscapeAnalyzer::read_escape_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 assert(methodData()->has_escape_info(), "no escape info available");
a61af66fc99e Initial load
duke
parents:
diff changeset
1308
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 // read escape information from method descriptor
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 for (int i = 0; i < _arg_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 _arg_local.at_put(i, methodData()->is_arg_local(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 _arg_stack.at_put(i, methodData()->is_arg_stack(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 _arg_returned.at_put(i, methodData()->is_arg_returned(i));
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1314 _arg_modified[i] = methodData()->arg_modified(i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 _return_local = methodData()->eflag_set(methodDataOopDesc::return_local);
78
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1317 _return_allocated = methodData()->eflag_set(methodDataOopDesc::return_allocated);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1318 _allocated_escapes = methodData()->eflag_set(methodDataOopDesc::allocated_escapes);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1319 _unknown_modified = methodData()->eflag_set(methodDataOopDesc::unknown_modified);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1322
78
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1323 #ifndef PRODUCT
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1324 void BCEscapeAnalyzer::dump() {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1325 tty->print("[EA] estimated escape information for");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1326 method()->print_short_name();
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1327 tty->print_cr(has_dependencies() ? " (not stored)" : "");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1328 tty->print(" non-escaping args: ");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1329 _arg_local.print_on(tty);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1330 tty->print(" stack-allocatable args: ");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1331 _arg_stack.print_on(tty);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1332 if (_return_local) {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1333 tty->print(" returned args: ");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1334 _arg_returned.print_on(tty);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1335 } else if (is_return_allocated()) {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1336 tty->print_cr(" return allocated value");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1337 } else {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1338 tty->print_cr(" return non-local value");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1339 }
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1340 tty->print(" modified args: ");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1341 for (int i = 0; i < _arg_size; i++) {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1342 if (_arg_modified[i] == 0)
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1343 tty->print(" 0");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1344 else
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1345 tty->print(" 0x%x", _arg_modified[i]);
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1346 }
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1347 tty->cr();
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1348 tty->print(" flags: ");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1349 if (_return_allocated)
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1350 tty->print(" return_allocated");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1351 if (_allocated_escapes)
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1352 tty->print(" allocated_escapes");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1353 if (_unknown_modified)
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1354 tty->print(" unknown_modified");
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1355 tty->cr();
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1356 }
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1357 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1358
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 BCEscapeAnalyzer::BCEscapeAnalyzer(ciMethod* method, BCEscapeAnalyzer* parent)
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 : _conservative(method == NULL || !EstimateArgEscape)
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 , _method(method)
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 , _methodData(method ? method->method_data() : NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 , _arg_size(method ? method->arg_size() : 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 , _stack()
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 , _arg_local(_arg_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 , _arg_stack(_arg_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 , _arg_returned(_arg_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 , _dirty(_arg_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 , _return_local(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 , _return_allocated(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 , _allocated_escapes(false)
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1372 , _unknown_modified(false)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 , _dependencies()
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 , _parent(parent)
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 , _level(parent == NULL ? 0 : parent->level() + 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 if (!_conservative) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 _arg_local.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 _arg_stack.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 _arg_returned.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 _dirty.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 Arena* arena = CURRENT_ENV->arena();
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1382 _arg_modified = (uint *) arena->Amalloc(_arg_size * sizeof(uint));
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
1383 Copy::zero_to_bytes(_arg_modified, _arg_size * sizeof(uint));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1384
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 if (methodData() == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 bool printit = _method->should_print_assembly();
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 if (methodData()->has_escape_info()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 TRACE_BCEA(2, tty->print_cr("[EA] Reading previous results for %s.%s",
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 method->holder()->name()->as_utf8(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 method->name()->as_utf8()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 read_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 TRACE_BCEA(2, tty->print_cr("[EA] computing results for %s.%s",
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 method->holder()->name()->as_utf8(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 method->name()->as_utf8()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1397
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 compute_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 methodData()->update_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 }
78
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1401 #ifndef PRODUCT
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1402 if (BCEATraceLevel >= 3) {
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1403 // dump escape information
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1404 dump();
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1405 }
e1e86702e43e 6680665: bytecode Escape Analyzer produces incorrect escape information for methods without oop arguments
kvn
parents: 45
diff changeset
1406 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1409
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 void BCEscapeAnalyzer::copy_dependencies(Dependencies *deps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 if(!has_dependencies())
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 for (int i = 0; i < _dependencies.length(); i+=2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 ciKlass *k = _dependencies[i]->as_klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 ciMethod *m = _dependencies[i+1]->as_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 deps->assert_unique_concrete_method(k, m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 }