annotate src/share/vm/ci/ciMethodData.cpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents d1605aabd0a1
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 45
diff changeset
2 * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_ciMethodData.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // ciMethodData
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // ciMethodData::ciMethodData
a61af66fc99e Initial load
duke
parents:
diff changeset
32 //
a61af66fc99e Initial load
duke
parents:
diff changeset
33 ciMethodData::ciMethodData(methodDataHandle h_md) : ciObject(h_md) {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 assert(h_md() != NULL, "no null method data");
a61af66fc99e Initial load
duke
parents:
diff changeset
35 Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord));
a61af66fc99e Initial load
duke
parents:
diff changeset
36 _data = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 _data_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 _extra_data_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 _current_mileage = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 _state = empty_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 _saw_free_extra_data = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // Set an initial hint. Don't use set_hint_di() because
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // first_di() may be out of bounds if data_size is 0.
a61af66fc99e Initial load
duke
parents:
diff changeset
44 _hint_di = first_di();
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
45 // Initialize the escape information (to "don't know.");
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
46 _eflags = _arg_local = _arg_stack = _arg_returned = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
47 }
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // ciMethodData::ciMethodData
a61af66fc99e Initial load
duke
parents:
diff changeset
51 //
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // No methodDataOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 ciMethodData::ciMethodData() : ciObject() {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord));
a61af66fc99e Initial load
duke
parents:
diff changeset
55 _data = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 _data_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _extra_data_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _current_mileage = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 _state = empty_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 _saw_free_extra_data = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Set an initial hint. Don't use set_hint_di() because
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // first_di() may be out of bounds if data_size is 0.
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _hint_di = first_di();
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
64 // Initialize the escape information (to "don't know.");
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
65 _eflags = _arg_local = _arg_stack = _arg_returned = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
66 }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 void ciMethodData::load_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 methodDataOop mdo = get_methodDataOop();
a61af66fc99e Initial load
duke
parents:
diff changeset
70 if (mdo == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // To do: don't copy the data if it is not "ripe" -- require a minimum #
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // of invocations.
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // Snapshot the data -- actually, take an approximate snapshot of
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // the data. Any concurrently executing threads may be changing the
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // data as we copy it.
a61af66fc99e Initial load
duke
parents:
diff changeset
78 int skip_header = oopDesc::header_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 Copy::disjoint_words((HeapWord*) mdo + skip_header,
a61af66fc99e Initial load
duke
parents:
diff changeset
80 (HeapWord*) &_orig + skip_header,
a61af66fc99e Initial load
duke
parents:
diff changeset
81 sizeof(_orig) / HeapWordSize - skip_header);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 DEBUG_ONLY(*_orig.adr_method() = NULL); // no dangling oops, please
a61af66fc99e Initial load
duke
parents:
diff changeset
83 Arena* arena = CURRENT_ENV->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _data_size = mdo->data_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _extra_data_size = mdo->extra_data_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 int total_size = _data_size + _extra_data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 _data = (intptr_t *) arena->Amalloc(total_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 Copy::disjoint_words((HeapWord*) mdo->data_base(), (HeapWord*) _data, total_size / HeapWordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Traverse the profile data, translating any oops into their
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // ci equivalents.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 ciProfileData* ci_data = first_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
94 ProfileData* data = mdo->first_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
95 while (is_valid(ci_data)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 ci_data->translate_from(data);
a61af66fc99e Initial load
duke
parents:
diff changeset
97 ci_data = next_data(ci_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 data = mdo->next_data(data);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // Note: Extra data are all BitData, and do not need translation.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 _current_mileage = methodDataOopDesc::mileage_of(mdo->method());
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _state = mdo->is_mature()? mature_state: immature_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _eflags = mdo->eflags();
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _arg_local = mdo->arg_local();
a61af66fc99e Initial load
duke
parents:
diff changeset
106 _arg_stack = mdo->arg_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 _arg_returned = mdo->arg_returned();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void ciReceiverTypeData::translate_receiver_data_from(ProfileData* data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 for (uint row = 0; row < row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 klassOop k = data->as_ReceiverTypeData()->receiver(row);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 if (k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 ciKlass* klass = CURRENT_ENV->get_object(k)->as_klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
115 set_receiver(row, klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Get the data at an arbitrary (sort of) data index.
a61af66fc99e Initial load
duke
parents:
diff changeset
122 ciProfileData* ciMethodData::data_at(int data_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 if (out_of_bounds(data_index)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126 DataLayout* data_layout = data_layout_at(data_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 switch (data_layout->tag()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 case DataLayout::no_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
130 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
131 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 case DataLayout::bit_data_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
134 return new ciBitData(data_layout);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 case DataLayout::counter_data_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
136 return new ciCounterData(data_layout);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 case DataLayout::jump_data_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
138 return new ciJumpData(data_layout);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 case DataLayout::receiver_type_data_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
140 return new ciReceiverTypeData(data_layout);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 case DataLayout::virtual_call_data_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
142 return new ciVirtualCallData(data_layout);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 case DataLayout::ret_data_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
144 return new ciRetData(data_layout);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 case DataLayout::branch_data_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
146 return new ciBranchData(data_layout);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 case DataLayout::multi_branch_data_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
148 return new ciMultiBranchData(data_layout);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
149 case DataLayout::arg_info_data_tag:
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
150 return new ciArgInfoData(data_layout);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
151 };
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // Iteration over data.
a61af66fc99e Initial load
duke
parents:
diff changeset
155 ciProfileData* ciMethodData::next_data(ciProfileData* current) {
a61af66fc99e Initial load
duke
parents:
diff changeset
156 int current_index = dp_to_di(current->dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
157 int next_index = current_index + current->size_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
158 ciProfileData* next = data_at(next_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 return next;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // Translate a bci to its corresponding data, or NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
163 ciProfileData* ciMethodData::bci_to_data(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
164 ciProfileData* data = data_before(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 for ( ; is_valid(data); data = next_data(data)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 if (data->bci() == bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 set_hint_di(dp_to_di(data->dp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
168 return data;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 } else if (data->bci() > bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // bci_to_extra_data(bci) ...
a61af66fc99e Initial load
duke
parents:
diff changeset
174 DataLayout* dp = data_layout_at(data_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
175 DataLayout* end = data_layout_at(data_size() + extra_data_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
176 for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 if (dp->tag() == DataLayout::no_tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 _saw_free_extra_data = true; // observed an empty slot (common case)
a61af66fc99e Initial load
duke
parents:
diff changeset
179 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
181 if (dp->tag() == DataLayout::arg_info_data_tag) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
182 break; // ArgInfoData is at the end of extra data section.
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
183 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 if (dp->bci() == bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 assert(dp->tag() == DataLayout::bit_data_tag, "sane");
a61af66fc99e Initial load
duke
parents:
diff changeset
186 return new ciBitData(dp);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Conservatively decode the trap_state of a ciProfileData.
a61af66fc99e Initial load
duke
parents:
diff changeset
193 int ciMethodData::has_trap_at(ciProfileData* data, int reason) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 typedef Deoptimization::DeoptReason DR_t;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 int per_bc_reason
a61af66fc99e Initial load
duke
parents:
diff changeset
196 = Deoptimization::reason_recorded_per_bytecode_if_any((DR_t) reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
197 if (trap_count(reason) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // Impossible for this trap to have occurred, regardless of trap_state.
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Note: This happens if the MDO is empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
200 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 } else if (per_bc_reason == Deoptimization::Reason_none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // We cannot conclude anything; a trap happened somewhere, maybe here.
a61af66fc99e Initial load
duke
parents:
diff changeset
203 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 } else if (data == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // No profile here, not even an extra_data record allocated on the fly.
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // If there are empty extra_data records, and there had been a trap,
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // there would have been a non-null data pointer. If there are no
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // free extra_data records, we must return a conservative -1.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 if (_saw_free_extra_data)
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return 0; // Q.E.D.
a61af66fc99e Initial load
duke
parents:
diff changeset
211 else
a61af66fc99e Initial load
duke
parents:
diff changeset
212 return -1; // bail with a conservative answer
a61af66fc99e Initial load
duke
parents:
diff changeset
213 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 return Deoptimization::trap_state_has_reason(data->trap_state(), per_bc_reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 int ciMethodData::trap_recompiled_at(ciProfileData* data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 if (data == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 return (_saw_free_extra_data? 0: -1); // (see previous method)
a61af66fc99e Initial load
duke
parents:
diff changeset
221 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 return Deoptimization::trap_state_is_recompiled(data->trap_state())? 1: 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 void ciMethodData::clear_escape_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
228 methodDataOop mdo = get_methodDataOop();
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
229 if (mdo != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 mdo->clear_escape_info();
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
231 ArgInfoData *aid = arg_info();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
232 int arg_count = (aid == NULL) ? 0 : aid->number_of_args();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
233 for (int i = 0; i < arg_count; i++) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
234 set_arg_modified(i, 0);
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 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
237 _eflags = _arg_local = _arg_stack = _arg_returned = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // copy our escape info to the methodDataOop if it exists
a61af66fc99e Initial load
duke
parents:
diff changeset
241 void ciMethodData::update_escape_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
242 VM_ENTRY_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 methodDataOop mdo = get_methodDataOop();
a61af66fc99e Initial load
duke
parents:
diff changeset
244 if ( mdo != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
245 mdo->set_eflags(_eflags);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 mdo->set_arg_local(_arg_local);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 mdo->set_arg_stack(_arg_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 mdo->set_arg_returned(_arg_returned);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
249 int arg_count = mdo->method()->size_of_parameters();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
250 for (int i = 0; i < arg_count; i++) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
251 mdo->set_arg_modified(i, arg_modified(i));
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
252 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 bool ciMethodData::has_escape_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 return eflag_set(methodDataOopDesc::estimated);
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 void ciMethodData::set_eflag(methodDataOopDesc::EscapeFlag f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 set_bits(_eflags, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 void ciMethodData::clear_eflag(methodDataOopDesc::EscapeFlag f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 clear_bits(_eflags, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 bool ciMethodData::eflag_set(methodDataOopDesc::EscapeFlag f) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 return mask_bits(_eflags, f) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 void ciMethodData::set_arg_local(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 set_nth_bit(_arg_local, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 void ciMethodData::set_arg_stack(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 set_nth_bit(_arg_stack, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void ciMethodData::set_arg_returned(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 set_nth_bit(_arg_returned, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
284 void ciMethodData::set_arg_modified(int arg, uint val) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
285 ArgInfoData *aid = arg_info();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
286 if (aid == NULL)
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
287 return;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
288 assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number");
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
289 aid->set_arg_modified(arg, val);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
290 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
291
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292 bool ciMethodData::is_arg_local(int i) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
293 return is_set_nth_bit(_arg_local, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 bool ciMethodData::is_arg_stack(int i) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 return is_set_nth_bit(_arg_stack, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 bool ciMethodData::is_arg_returned(int i) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 return is_set_nth_bit(_arg_returned, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
304 uint ciMethodData::arg_modified(int arg) const {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
305 ArgInfoData *aid = arg_info();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
306 if (aid == NULL)
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
307 return 0;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
308 assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number");
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
309 return aid->arg_modified(arg);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
310 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
311
0
a61af66fc99e Initial load
duke
parents:
diff changeset
312 ByteSize ciMethodData::offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // Get offset within methodDataOop of the data array
a61af66fc99e Initial load
duke
parents:
diff changeset
314 ByteSize data_offset = methodDataOopDesc::data_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // Get cell offset of the ProfileData within data array
a61af66fc99e Initial load
duke
parents:
diff changeset
317 int cell_offset = dp_to_di(data->dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Add in counter_offset, the # of bytes into the ProfileData of counter or flag
a61af66fc99e Initial load
duke
parents:
diff changeset
320 int offset = in_bytes(data_offset) + cell_offset + in_bytes(slot_offset_in_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 return in_ByteSize(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
325 ciArgInfoData *ciMethodData::arg_info() const {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
326 // Should be last, have to skip all traps.
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
327 DataLayout* dp = data_layout_at(data_size());
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
328 DataLayout* end = data_layout_at(data_size() + extra_data_size());
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
329 for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
330 if (dp->tag() == DataLayout::arg_info_data_tag)
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
331 return new ciArgInfoData(dp);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
332 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
333 return NULL;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
334 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
335
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
336
0
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // Implementation of the print method.
a61af66fc99e Initial load
duke
parents:
diff changeset
338 void ciMethodData::print_impl(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 ciObject::print_impl(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
343 void ciMethodData::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 print_data_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 void ciMethodData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 ciProfileData* data;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 for (data = first_data(); is_valid(data); data = next_data(data)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 st->print("%d", dp_to_di(data->dp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
352 st->fill_to(6);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 data->print_data_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
355 st->print_cr("--- Extra data:");
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
356 DataLayout* dp = data_layout_at(data_size());
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
357 DataLayout* end = data_layout_at(data_size() + extra_data_size());
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
358 for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
359 if (dp->tag() == DataLayout::no_tag) continue;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
360 if (dp->tag() == DataLayout::bit_data_tag) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
361 data = new BitData(dp);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
362 } else {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
363 assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo");
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
364 data = new ciArgInfoData(dp);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
365 dp = end; // ArgInfoData is at the end of extra data section.
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
366 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
367 st->print("%d", dp_to_di(data->dp()));
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
368 st->fill_to(6);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
369 data->print_data_on(st);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
370 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 void ciReceiverTypeData::print_receiver_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
374 uint row;
a61af66fc99e Initial load
duke
parents:
diff changeset
375 int entries = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
376 for (row = 0; row < row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 if (receiver(row) != NULL) entries++;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379 st->print_cr("count(%u) entries(%u)", count(), entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
380 for (row = 0; row < row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 if (receiver(row) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
382 tab(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
383 receiver(row)->print_name_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
384 st->print_cr("(%u)", receiver_count(row));
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 void ciReceiverTypeData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 print_shared(st, "ciReceiverTypeData");
a61af66fc99e Initial load
duke
parents:
diff changeset
391 print_receiver_data_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 void ciVirtualCallData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 print_shared(st, "ciVirtualCallData");
a61af66fc99e Initial load
duke
parents:
diff changeset
396 rtd_super()->print_receiver_data_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
398 #endif