src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File open Sdiff src/hotspot/cpu/x86

src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp

Print this page




3469 
3470 
3471 void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
3472   ciMethod* method = op->profiled_method();
3473   int bci          = op->profiled_bci();
3474   ciMethod* callee = op->profiled_callee();
3475 
3476   // Update counter for all call types
3477   ciMethodData* md = method->method_data_or_null();
3478   assert(md != NULL, "Sanity");
3479   ciProfileData* data = md->bci_to_data(bci);
3480   assert(data->is_CounterData(), "need CounterData for calls");
3481   assert(op->mdo()->is_single_cpu(),  "mdo must be allocated");
3482   Register mdo  = op->mdo()->as_register();
3483   __ mov_metadata(mdo, md->constant_encoding());
3484   Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
3485   Bytecodes::Code bc = method->java_code_at_bci(bci);
3486   const bool callee_is_static = callee->is_loaded() && callee->is_static();
3487   // Perform additional virtual call profiling for invokevirtual and
3488   // invokeinterface bytecodes
3489   if ((bc == Bytecodes::_invokevirtual || bc == Bytecodes::_invokeinterface) &&
3490       !callee_is_static &&  // required for optimized MH invokes

3491       C1ProfileVirtualCalls) {
3492     assert(op->recv()->is_single_cpu(), "recv must be allocated");
3493     Register recv = op->recv()->as_register();
3494     assert_different_registers(mdo, recv);
3495     assert(data->is_VirtualCallData(), "need VirtualCallData for virtual calls");
3496     ciKlass* known_klass = op->known_holder();
3497     if (C1OptimizeVirtualCallProfiling && known_klass != NULL) {
3498       // We know the type that will be seen at this call site; we can
3499       // statically update the MethodData* rather than needing to do
3500       // dynamic tests on the receiver type
3501 
3502       // NOTE: we should probably put a lock around this search to
3503       // avoid collisions by concurrent compilations
3504       ciVirtualCallData* vc_data = (ciVirtualCallData*) data;
3505       uint i;
3506       for (i = 0; i < VirtualCallData::row_limit(); i++) {
3507         ciKlass* receiver = vc_data->receiver(i);
3508         if (known_klass->equals(receiver)) {
3509           Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)));
3510           __ addptr(data_addr, DataLayout::counter_increment);




3469 
3470 
3471 void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
3472   ciMethod* method = op->profiled_method();
3473   int bci          = op->profiled_bci();
3474   ciMethod* callee = op->profiled_callee();
3475 
3476   // Update counter for all call types
3477   ciMethodData* md = method->method_data_or_null();
3478   assert(md != NULL, "Sanity");
3479   ciProfileData* data = md->bci_to_data(bci);
3480   assert(data->is_CounterData(), "need CounterData for calls");
3481   assert(op->mdo()->is_single_cpu(),  "mdo must be allocated");
3482   Register mdo  = op->mdo()->as_register();
3483   __ mov_metadata(mdo, md->constant_encoding());
3484   Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
3485   Bytecodes::Code bc = method->java_code_at_bci(bci);
3486   const bool callee_is_static = callee->is_loaded() && callee->is_static();
3487   // Perform additional virtual call profiling for invokevirtual and
3488   // invokeinterface bytecodes
3489   if (((bc == Bytecodes::_invokevirtual && !callee->can_be_statically_bound()) ||
3490         bc == Bytecodes::_invokeinterface) &&
3491       !callee_is_static &&  // Required for optimized MH invokes.
3492       C1ProfileVirtualCalls) {
3493     assert(op->recv()->is_single_cpu(), "recv must be allocated");
3494     Register recv = op->recv()->as_register();
3495     assert_different_registers(mdo, recv);
3496     assert(data->is_VirtualCallData(), "need VirtualCallData for virtual calls");
3497     ciKlass* known_klass = op->known_holder();
3498     if (C1OptimizeVirtualCallProfiling && known_klass != NULL) {
3499       // We know the type that will be seen at this call site; we can
3500       // statically update the MethodData* rather than needing to do
3501       // dynamic tests on the receiver type
3502 
3503       // NOTE: we should probably put a lock around this search to
3504       // avoid collisions by concurrent compilations
3505       ciVirtualCallData* vc_data = (ciVirtualCallData*) data;
3506       uint i;
3507       for (i = 0; i < VirtualCallData::row_limit(); i++) {
3508         ciKlass* receiver = vc_data->receiver(i);
3509         if (known_klass->equals(receiver)) {
3510           Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)));
3511           __ addptr(data_addr, DataLayout::counter_increment);


src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File