Mercurial > hg > graal-compiler
comparison src/share/vm/oops/methodDataOop.cpp @ 45:48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
Summary: Use MDO to cache arguments escape state determined by the byte code escape analyzer.
Reviewed-by: never
author | kvn |
---|---|
date | Tue, 11 Mar 2008 19:00:38 -0700 |
parents | a61af66fc99e |
children | d1605aabd0a1 |
comparison
equal
deleted
inserted
replaced
44:52fed2ec0afb | 45:48a3fa21394b |
---|---|
30 // | 30 // |
31 // Overlay for generic profiling data. | 31 // Overlay for generic profiling data. |
32 | 32 |
33 // Some types of data layouts need a length field. | 33 // Some types of data layouts need a length field. |
34 bool DataLayout::needs_array_len(u1 tag) { | 34 bool DataLayout::needs_array_len(u1 tag) { |
35 return (tag == multi_branch_data_tag); | 35 return (tag == multi_branch_data_tag) || (tag == arg_info_data_tag); |
36 } | 36 } |
37 | 37 |
38 // Perform generic initialization of the data. More specific | 38 // Perform generic initialization of the data. More specific |
39 // initialization occurs in overrides of ProfileData::post_initialize. | 39 // initialization occurs in overrides of ProfileData::post_initialize. |
40 void DataLayout::initialize(u1 tag, u2 bci, int cell_count) { | 40 void DataLayout::initialize(u1 tag, u2 bci, int cell_count) { |
402 count_at(i), displacement_at(i)); | 402 count_at(i), displacement_at(i)); |
403 } | 403 } |
404 } | 404 } |
405 #endif | 405 #endif |
406 | 406 |
407 #ifndef PRODUCT | |
408 void ArgInfoData::print_data_on(outputStream* st) { | |
409 print_shared(st, "ArgInfoData"); | |
410 int nargs = number_of_args(); | |
411 for (int i = 0; i < nargs; i++) { | |
412 st->print(" 0x%x", arg_modified(i)); | |
413 } | |
414 st->cr(); | |
415 } | |
416 | |
417 #endif | |
407 // ================================================================== | 418 // ================================================================== |
408 // methodDataOop | 419 // methodDataOop |
409 // | 420 // |
410 // A methodDataOop holds information which has been collected about | 421 // A methodDataOop holds information which has been collected about |
411 // a method. | 422 // a method. |
506 | 517 |
507 // Add some extra DataLayout cells (at least one) to track stray traps. | 518 // Add some extra DataLayout cells (at least one) to track stray traps. |
508 int extra_data_count = compute_extra_data_count(data_size, empty_bc_count); | 519 int extra_data_count = compute_extra_data_count(data_size, empty_bc_count); |
509 object_size += extra_data_count * DataLayout::compute_size_in_bytes(0); | 520 object_size += extra_data_count * DataLayout::compute_size_in_bytes(0); |
510 | 521 |
522 // Add a cell to record information about modified arguments. | |
523 int arg_size = method->size_of_parameters(); | |
524 object_size += DataLayout::compute_size_in_bytes(arg_size+1); | |
511 return object_size; | 525 return object_size; |
512 } | 526 } |
513 | 527 |
514 // Compute the size of the methodDataOop necessary to store | 528 // Compute the size of the methodDataOop necessary to store |
515 // profiling information about a given method. Size is in words | 529 // profiling information about a given method. Size is in words |
624 return new RetData(data_layout); | 638 return new RetData(data_layout); |
625 case DataLayout::branch_data_tag: | 639 case DataLayout::branch_data_tag: |
626 return new BranchData(data_layout); | 640 return new BranchData(data_layout); |
627 case DataLayout::multi_branch_data_tag: | 641 case DataLayout::multi_branch_data_tag: |
628 return new MultiBranchData(data_layout); | 642 return new MultiBranchData(data_layout); |
643 case DataLayout::arg_info_data_tag: | |
644 return new ArgInfoData(data_layout); | |
629 }; | 645 }; |
630 } | 646 } |
631 | 647 |
632 // Iteration over data. | 648 // Iteration over data. |
633 ProfileData* methodDataOopDesc::next_data(ProfileData* current) { | 649 ProfileData* methodDataOopDesc::next_data(ProfileData* current) { |
679 _data_size = data_size; | 695 _data_size = data_size; |
680 int object_size = in_bytes(data_offset()) + data_size; | 696 int object_size = in_bytes(data_offset()) + data_size; |
681 | 697 |
682 // Add some extra DataLayout cells (at least one) to track stray traps. | 698 // Add some extra DataLayout cells (at least one) to track stray traps. |
683 int extra_data_count = compute_extra_data_count(data_size, empty_bc_count); | 699 int extra_data_count = compute_extra_data_count(data_size, empty_bc_count); |
684 object_size += extra_data_count * DataLayout::compute_size_in_bytes(0); | 700 int extra_size = extra_data_count * DataLayout::compute_size_in_bytes(0); |
701 | |
702 // Add a cell to record information about modified arguments. | |
703 // Set up _args_modified array after traps cells so that | |
704 // the code for traps cells works. | |
705 DataLayout *dp = data_layout_at(data_size + extra_size); | |
706 | |
707 int arg_size = method->size_of_parameters(); | |
708 dp->initialize(DataLayout::arg_info_data_tag, 0, arg_size+1); | |
709 | |
710 object_size += extra_size + DataLayout::compute_size_in_bytes(arg_size+1); | |
685 | 711 |
686 // Set an initial hint. Don't use set_hint_di() because | 712 // Set an initial hint. Don't use set_hint_di() because |
687 // first_di() may be out of bounds if data_size is 0. | 713 // first_di() may be out of bounds if data_size is 0. |
688 // In that situation, _hint_di is never used, but at | 714 // In that situation, _hint_di is never used, but at |
689 // least well-defined. | 715 // least well-defined. |
762 DataLayout* avail = NULL; | 788 DataLayout* avail = NULL; |
763 for (; dp < end; dp = next_extra(dp)) { | 789 for (; dp < end; dp = next_extra(dp)) { |
764 // No need for "OrderAccess::load_acquire" ops, | 790 // No need for "OrderAccess::load_acquire" ops, |
765 // since the data structure is monotonic. | 791 // since the data structure is monotonic. |
766 if (dp->tag() == DataLayout::no_tag) break; | 792 if (dp->tag() == DataLayout::no_tag) break; |
793 if (dp->tag() == DataLayout::arg_info_data_tag) { | |
794 dp = end; // ArgInfoData is at the end of extra data section. | |
795 break; | |
796 } | |
767 if (dp->bci() == bci) { | 797 if (dp->bci() == bci) { |
768 assert(dp->tag() == DataLayout::bit_data_tag, "sane"); | 798 assert(dp->tag() == DataLayout::bit_data_tag, "sane"); |
769 return new BitData(dp); | 799 return new BitData(dp); |
770 } | 800 } |
771 } | 801 } |
783 return new BitData(dp); | 813 return new BitData(dp); |
784 } | 814 } |
785 return NULL; | 815 return NULL; |
786 } | 816 } |
787 | 817 |
818 ArgInfoData *methodDataOopDesc::arg_info() { | |
819 DataLayout* dp = extra_data_base(); | |
820 DataLayout* end = extra_data_limit(); | |
821 for (; dp < end; dp = next_extra(dp)) { | |
822 if (dp->tag() == DataLayout::arg_info_data_tag) | |
823 return new ArgInfoData(dp); | |
824 } | |
825 return NULL; | |
826 } | |
827 | |
788 #ifndef PRODUCT | 828 #ifndef PRODUCT |
789 void methodDataOopDesc::print_data_on(outputStream* st) { | 829 void methodDataOopDesc::print_data_on(outputStream* st) { |
790 ResourceMark rm; | 830 ResourceMark rm; |
791 ProfileData* data = first_data(); | 831 ProfileData* data = first_data(); |
792 for ( ; is_valid(data); data = next_data(data)) { | 832 for ( ; is_valid(data); data = next_data(data)) { |
793 st->print("%d", dp_to_di(data->dp())); | 833 st->print("%d", dp_to_di(data->dp())); |
794 st->fill_to(6); | 834 st->fill_to(6); |
795 data->print_data_on(st); | 835 data->print_data_on(st); |
796 } | 836 } |
837 st->print_cr("--- Extra data:"); | |
797 DataLayout* dp = extra_data_base(); | 838 DataLayout* dp = extra_data_base(); |
798 DataLayout* end = extra_data_limit(); | 839 DataLayout* end = extra_data_limit(); |
799 for (; dp < end; dp = next_extra(dp)) { | 840 for (; dp < end; dp = next_extra(dp)) { |
800 // No need for "OrderAccess::load_acquire" ops, | 841 // No need for "OrderAccess::load_acquire" ops, |
801 // since the data structure is monotonic. | 842 // since the data structure is monotonic. |
802 if (dp->tag() == DataLayout::no_tag) break; | 843 if (dp->tag() == DataLayout::no_tag) continue; |
803 if (dp == extra_data_base()) | 844 if (dp->tag() == DataLayout::bit_data_tag) { |
804 st->print_cr("--- Extra data:"); | 845 data = new BitData(dp); |
805 data = new BitData(dp); | 846 } else { |
847 assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo"); | |
848 data = new ArgInfoData(dp); | |
849 dp = end; // ArgInfoData is at the end of extra data section. | |
850 } | |
806 st->print("%d", dp_to_di(data->dp())); | 851 st->print("%d", dp_to_di(data->dp())); |
807 st->fill_to(6); | 852 st->fill_to(6); |
808 data->print_data_on(st); | 853 data->print_data_on(st); |
809 } | 854 } |
810 } | 855 } |