annotate src/share/vm/ci/bcEscapeAnalyzer.cpp @ 20543:e7d0505c8a30

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