src/share/vm/ci/ciMethod.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/ci/ciMethod.cpp

src/share/vm/ci/ciMethod.cpp

Print this page
rev 6139 : 8031755: Type speculation should be used to optimize explicit null checks
Summary: feed profiling data about reference nullness to type speculation.
Reviewed-by:

*** 579,679 **** /** * Check whether profiling provides a type for the argument i to the * call at bci bci * ! * @param bci bci of the call ! * @param i argument number ! * @return profiled type * - * If the profile reports that the argument may be null, return false - * at least for now. */ ! ciKlass* ciMethod::argument_profiled_type(int bci, int i) { if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) { ciProfileData* data = method_data()->bci_to_data(bci); if (data != NULL) { if (data->is_VirtualCallTypeData()) { assert_virtual_call_type_ok(bci); ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData(); if (i >= call->number_of_arguments()) { ! return NULL; ! } ! ciKlass* type = call->valid_argument_type(i); ! if (type != NULL && !call->argument_maybe_null(i)) { ! return type; } } else if (data->is_CallTypeData()) { assert_call_type_ok(bci); ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData(); if (i >= call->number_of_arguments()) { ! return NULL; ! } ! ciKlass* type = call->valid_argument_type(i); ! if (type != NULL && !call->argument_maybe_null(i)) { ! return type; } } } } ! return NULL; } /** * Check whether profiling provides a type for the return value from * the call at bci bci * ! * @param bci bci of the call ! * @return profiled type * - * If the profile reports that the argument may be null, return false - * at least for now. */ ! ciKlass* ciMethod::return_profiled_type(int bci) { if (MethodData::profile_return() && method_data() != NULL && method_data()->is_mature()) { ciProfileData* data = method_data()->bci_to_data(bci); if (data != NULL) { if (data->is_VirtualCallTypeData()) { assert_virtual_call_type_ok(bci); ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData(); ! ciKlass* type = call->valid_return_type(); ! if (type != NULL && !call->return_maybe_null()) { ! return type; ! } } else if (data->is_CallTypeData()) { assert_call_type_ok(bci); ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData(); ! ciKlass* type = call->valid_return_type(); ! if (type != NULL && !call->return_maybe_null()) { ! return type; } } } ! } ! return NULL; } /** * Check whether profiling provides a type for the parameter i * ! * @param i parameter number ! * @return profiled type * - * If the profile reports that the argument may be null, return false - * at least for now. */ ! ciKlass* ciMethod::parameter_profiled_type(int i) { if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) { ciParametersTypeData* parameters = method_data()->parameters_type_data(); if (parameters != NULL && i < parameters->number_of_parameters()) { ! ciKlass* type = parameters->valid_parameter_type(i); ! if (type != NULL && !parameters->parameter_maybe_null(i)) { ! return type; ! } } } ! return NULL; } // ------------------------------------------------------------------ // ciMethod::find_monomorphic_target --- 579,674 ---- /** * Check whether profiling provides a type for the argument i to the * call at bci bci * ! * @param [in]bci bci of the call ! * @param [in]i argument number ! * @param [out]type profiled type of argument, NULL if none ! * @param [out]maybe_null true if null was seen for argument ! * @return true if profiling exists * */ ! bool ciMethod::argument_profiled_type(int bci, int i, ciKlass*& type, bool& maybe_null) { if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) { ciProfileData* data = method_data()->bci_to_data(bci); if (data != NULL) { if (data->is_VirtualCallTypeData()) { assert_virtual_call_type_ok(bci); ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData(); if (i >= call->number_of_arguments()) { ! return false; } + type = call->valid_argument_type(i); + maybe_null = call->argument_maybe_null(i); + return true; } else if (data->is_CallTypeData()) { assert_call_type_ok(bci); ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData(); if (i >= call->number_of_arguments()) { ! return false; } + type = call->valid_argument_type(i); + maybe_null = call->argument_maybe_null(i); + return true; } } } ! return false; } /** * Check whether profiling provides a type for the return value from * the call at bci bci * ! * @param [in]bci bci of the call ! * @param [out]type profiled type of argument, NULL if none ! * @param [out]maybe_null true if null was seen for argument ! * @return true if profiling exists * */ ! bool ciMethod::return_profiled_type(int bci, ciKlass*& type, bool& maybe_null) { if (MethodData::profile_return() && method_data() != NULL && method_data()->is_mature()) { ciProfileData* data = method_data()->bci_to_data(bci); if (data != NULL) { if (data->is_VirtualCallTypeData()) { assert_virtual_call_type_ok(bci); ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData(); ! type = call->valid_return_type(); ! maybe_null = call->return_maybe_null(); ! return true; } else if (data->is_CallTypeData()) { assert_call_type_ok(bci); ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData(); ! type = call->valid_return_type(); ! maybe_null = call->return_maybe_null(); ! return true; } } } ! return false; } /** * Check whether profiling provides a type for the parameter i * ! * @param [in]i parameter number ! * @param [out]type profiled type of parameter, NULL if none ! * @param [out]maybe_null true if null was seen for parameter ! * @return true if profiling exists * */ ! bool ciMethod::parameter_profiled_type(int i, ciKlass*& type, bool& maybe_null) { if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) { ciParametersTypeData* parameters = method_data()->parameters_type_data(); if (parameters != NULL && i < parameters->number_of_parameters()) { ! type = parameters->valid_parameter_type(i); ! maybe_null = parameters->parameter_maybe_null(i); ! return true; } } ! return false; } // ------------------------------------------------------------------ // ciMethod::find_monomorphic_target
src/share/vm/ci/ciMethod.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File