2954 |
2954 |
2955 |
2955 |
2956 void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) { |
2956 void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) { |
2957 ciMethod* method = op->profiled_method(); |
2957 ciMethod* method = op->profiled_method(); |
2958 int bci = op->profiled_bci(); |
2958 int bci = op->profiled_bci(); |
|
2959 ciMethod* callee = op->profiled_callee(); |
2959 |
2960 |
2960 // Update counter for all call types |
2961 // Update counter for all call types |
2961 ciMethodData* md = method->method_data_or_null(); |
2962 ciMethodData* md = method->method_data_or_null(); |
2962 assert(md != NULL, "Sanity"); |
2963 assert(md != NULL, "Sanity"); |
2963 ciProfileData* data = md->bci_to_data(bci); |
2964 ciProfileData* data = md->bci_to_data(bci); |
2982 __ add(mdo, O7, mdo); |
2983 __ add(mdo, O7, mdo); |
2983 } |
2984 } |
2984 |
2985 |
2985 Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); |
2986 Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); |
2986 Bytecodes::Code bc = method->java_code_at_bci(bci); |
2987 Bytecodes::Code bc = method->java_code_at_bci(bci); |
|
2988 const bool callee_is_static = callee->is_loaded() && callee->is_static(); |
2987 // Perform additional virtual call profiling for invokevirtual and |
2989 // Perform additional virtual call profiling for invokevirtual and |
2988 // invokeinterface bytecodes |
2990 // invokeinterface bytecodes |
2989 if ((bc == Bytecodes::_invokevirtual || bc == Bytecodes::_invokeinterface) && |
2991 if ((bc == Bytecodes::_invokevirtual || bc == Bytecodes::_invokeinterface) && |
|
2992 !callee_is_static && // required for optimized MH invokes |
2990 C1ProfileVirtualCalls) { |
2993 C1ProfileVirtualCalls) { |
2991 assert(op->recv()->is_single_cpu(), "recv must be allocated"); |
2994 assert(op->recv()->is_single_cpu(), "recv must be allocated"); |
2992 Register recv = op->recv()->as_register(); |
2995 Register recv = op->recv()->as_register(); |
2993 assert_different_registers(mdo, tmp1, recv); |
2996 assert_different_registers(mdo, tmp1, recv); |
2994 assert(data->is_VirtualCallData(), "need VirtualCallData for virtual calls"); |
2997 assert(data->is_VirtualCallData(), "need VirtualCallData for virtual calls"); |