Mercurial > hg > graal-jvmci-8
comparison src/share/vm/ci/ciMethodData.cpp @ 12875:d13d7aba8c12
8023657: New type profiling points: arguments to call
Summary: x86 interpreter and c1 type profiling for arguments at calls
Reviewed-by: kvn, twisti
author | roland |
---|---|
date | Wed, 09 Oct 2013 16:32:21 +0200 |
parents | c775af091fe9 |
children | ce0cc25bc5e2 |
comparison
equal
deleted
inserted
replaced
12874:46ef27bcacb3 | 12875:d13d7aba8c12 |
---|---|
123 ciReplay::initialize(this); | 123 ciReplay::initialize(this); |
124 } | 124 } |
125 #endif | 125 #endif |
126 } | 126 } |
127 | 127 |
128 void ciReceiverTypeData::translate_receiver_data_from(ProfileData* data) { | 128 void ciReceiverTypeData::translate_receiver_data_from(const ProfileData* data) { |
129 for (uint row = 0; row < row_limit(); row++) { | 129 for (uint row = 0; row < row_limit(); row++) { |
130 Klass* k = data->as_ReceiverTypeData()->receiver(row); | 130 Klass* k = data->as_ReceiverTypeData()->receiver(row); |
131 if (k != NULL) { | 131 if (k != NULL) { |
132 ciKlass* klass = CURRENT_ENV->get_klass(k); | 132 ciKlass* klass = CURRENT_ENV->get_klass(k); |
133 set_receiver(row, klass); | 133 set_receiver(row, klass); |
134 } | 134 } |
135 } | 135 } |
136 } | 136 } |
137 | 137 |
138 | |
139 void ciTypeStackSlotEntries::translate_type_data_from(const TypeStackSlotEntries* entries) { | |
140 for (int i = 0; i < number_of_arguments(); i++) { | |
141 intptr_t k = entries->type(i); | |
142 TypeStackSlotEntries::set_type(i, translate_klass(k)); | |
143 } | |
144 } | |
138 | 145 |
139 // Get the data at an arbitrary (sort of) data index. | 146 // Get the data at an arbitrary (sort of) data index. |
140 ciProfileData* ciMethodData::data_at(int data_index) { | 147 ciProfileData* ciMethodData::data_at(int data_index) { |
141 if (out_of_bounds(data_index)) { | 148 if (out_of_bounds(data_index)) { |
142 return NULL; | 149 return NULL; |
164 return new ciBranchData(data_layout); | 171 return new ciBranchData(data_layout); |
165 case DataLayout::multi_branch_data_tag: | 172 case DataLayout::multi_branch_data_tag: |
166 return new ciMultiBranchData(data_layout); | 173 return new ciMultiBranchData(data_layout); |
167 case DataLayout::arg_info_data_tag: | 174 case DataLayout::arg_info_data_tag: |
168 return new ciArgInfoData(data_layout); | 175 return new ciArgInfoData(data_layout); |
176 case DataLayout::call_type_data_tag: | |
177 return new ciCallTypeData(data_layout); | |
178 case DataLayout::virtual_call_type_data_tag: | |
179 return new ciVirtualCallTypeData(data_layout); | |
169 }; | 180 }; |
170 } | 181 } |
171 | 182 |
172 // Iteration over data. | 183 // Iteration over data. |
173 ciProfileData* ciMethodData::next_data(ciProfileData* current) { | 184 ciProfileData* ciMethodData::next_data(ciProfileData* current) { |
283 void ciMethodData::set_would_profile(bool p) { | 294 void ciMethodData::set_would_profile(bool p) { |
284 VM_ENTRY_MARK; | 295 VM_ENTRY_MARK; |
285 MethodData* mdo = get_MethodData(); | 296 MethodData* mdo = get_MethodData(); |
286 if (mdo != NULL) { | 297 if (mdo != NULL) { |
287 mdo->set_would_profile(p); | 298 mdo->set_would_profile(p); |
299 } | |
300 } | |
301 | |
302 void ciMethodData::set_argument_type(int bci, int i, ciKlass* k) { | |
303 VM_ENTRY_MARK; | |
304 MethodData* mdo = get_MethodData(); | |
305 if (mdo != NULL) { | |
306 ProfileData* data = mdo->bci_to_data(bci); | |
307 if (data->is_CallTypeData()) { | |
308 data->as_CallTypeData()->set_argument_type(i, k->get_Klass()); | |
309 } else { | |
310 assert(data->is_VirtualCallTypeData(), "no arguments!"); | |
311 data->as_VirtualCallTypeData()->set_argument_type(i, k->get_Klass()); | |
312 } | |
288 } | 313 } |
289 } | 314 } |
290 | 315 |
291 bool ciMethodData::has_escape_info() { | 316 bool ciMethodData::has_escape_info() { |
292 return eflag_set(MethodData::estimated); | 317 return eflag_set(MethodData::estimated); |
476 st->fill_to(6); | 501 st->fill_to(6); |
477 data->print_data_on(st); | 502 data->print_data_on(st); |
478 } | 503 } |
479 } | 504 } |
480 | 505 |
481 void ciReceiverTypeData::print_receiver_data_on(outputStream* st) { | 506 void ciTypeEntries::print_ciklass(outputStream* st, intptr_t k) { |
507 if (TypeEntries::is_type_none(k)) { | |
508 st->print("none"); | |
509 } else if (TypeEntries::is_type_unknown(k)) { | |
510 st->print("unknown"); | |
511 } else { | |
512 valid_ciklass(k)->print_name_on(st); | |
513 } | |
514 if (TypeEntries::was_null_seen(k)) { | |
515 st->print(" (null seen)"); | |
516 } | |
517 } | |
518 | |
519 void ciTypeStackSlotEntries::print_data_on(outputStream* st) const { | |
520 _pd->tab(st, true); | |
521 st->print("argument types"); | |
522 for (int i = 0; i < number_of_arguments(); i++) { | |
523 _pd->tab(st); | |
524 st->print("%d: stack (%u) ", i, stack_slot(i)); | |
525 print_ciklass(st, type(i)); | |
526 st->cr(); | |
527 } | |
528 } | |
529 | |
530 void ciCallTypeData::print_data_on(outputStream* st) const { | |
531 print_shared(st, "ciCallTypeData"); | |
532 args()->print_data_on(st); | |
533 } | |
534 | |
535 void ciReceiverTypeData::print_receiver_data_on(outputStream* st) const { | |
482 uint row; | 536 uint row; |
483 int entries = 0; | 537 int entries = 0; |
484 for (row = 0; row < row_limit(); row++) { | 538 for (row = 0; row < row_limit(); row++) { |
485 if (receiver(row) != NULL) entries++; | 539 if (receiver(row) != NULL) entries++; |
486 } | 540 } |
492 st->print_cr("(%u)", receiver_count(row)); | 546 st->print_cr("(%u)", receiver_count(row)); |
493 } | 547 } |
494 } | 548 } |
495 } | 549 } |
496 | 550 |
497 void ciReceiverTypeData::print_data_on(outputStream* st) { | 551 void ciReceiverTypeData::print_data_on(outputStream* st) const { |
498 print_shared(st, "ciReceiverTypeData"); | 552 print_shared(st, "ciReceiverTypeData"); |
499 print_receiver_data_on(st); | 553 print_receiver_data_on(st); |
500 } | 554 } |
501 | 555 |
502 void ciVirtualCallData::print_data_on(outputStream* st) { | 556 void ciVirtualCallData::print_data_on(outputStream* st) const { |
503 print_shared(st, "ciVirtualCallData"); | 557 print_shared(st, "ciVirtualCallData"); |
504 rtd_super()->print_receiver_data_on(st); | 558 rtd_super()->print_receiver_data_on(st); |
505 } | 559 } |
560 | |
561 void ciVirtualCallTypeData::print_data_on(outputStream* st) const { | |
562 print_shared(st, "ciVirtualCallTypeData"); | |
563 rtd_super()->print_receiver_data_on(st); | |
564 args()->print_data_on(st); | |
565 } | |
506 #endif | 566 #endif |