--- old/src/hotspot/share/gc/g1/survRateGroup.hpp 2019-11-19 15:51:10.825029042 +0100 +++ new/src/hotspot/share/gc/g1/survRateGroup.hpp 2019-11-19 15:51:10.609027701 +0100 @@ -25,24 +25,24 @@ #ifndef SHARE_GC_G1_SURVRATEGROUP_HPP #define SHARE_GC_G1_SURVRATEGROUP_HPP +#include "gc/g1/g1Predictions.hpp" #include "utilities/numberSeq.hpp" -class G1Predictions; - class SurvRateGroup : public CHeapObj { -private: size_t _stats_arrays_length; double* _accum_surv_rate_pred; double _last_pred; - TruncatedSeq** _surv_rate_pred; + TruncatedSeq** _surv_rate_predictors; - int _all_regions_allocated; - size_t _region_num; - size_t _setup_seq_num; + size_t _num_added_regions; // The number of regions in this SurvRateGroup void fill_in_last_surv_rates(); void finalize_predictions(const G1Predictions& predictor); + public: + static const int InvalidAgeIndex = -1; + static bool is_valid_age_index(int age) { return age >= 0; } + SurvRateGroup(); void reset(); void start_adding_regions(); @@ -50,42 +50,34 @@ void record_surviving_words(int age_in_group, size_t surv_words); void all_surviving_words_recorded(const G1Predictions& predictor, bool update_predictors); - size_t region_num() const { return _region_num; } - double accum_surv_rate_pred(int age) const { - assert(age >= 0, "must be"); + assert(_stats_arrays_length > 0, "invariant" ); + assert(is_valid_age_index(age), "must be"); if ((size_t)age < _stats_arrays_length) return _accum_surv_rate_pred[age]; else { - double diff = (double) (age - _stats_arrays_length + 1); - return _accum_surv_rate_pred[_stats_arrays_length-1] + diff * _last_pred; + double diff = (double)(age - _stats_arrays_length + 1); + return _accum_surv_rate_pred[_stats_arrays_length - 1] + diff * _last_pred; } } - TruncatedSeq* get_seq(size_t age) const { - if (age >= _setup_seq_num) { - guarantee( _setup_seq_num > 0, "invariant" ); - age = _setup_seq_num-1; - } - TruncatedSeq* seq = _surv_rate_pred[age]; - guarantee( seq != NULL, "invariant" ); - return seq; + double surv_rate_pred(G1Predictions const& predictor, int age) const { + assert(is_valid_age_index(age), "must be"); + + age = MIN2(age, (int)_stats_arrays_length - 1); + + return predictor.get_new_unit_prediction(_surv_rate_predictors[age]); } int next_age_index() { - ++_region_num; - return (int) ++_all_regions_allocated; + return (int)++_num_added_regions; } int age_in_group(int age_index) const { - int ret = (int) (_all_regions_allocated - age_index); - assert( ret >= 0, "invariant" ); - return ret; + int result = (int)(_num_added_regions - age_index); + assert(is_valid_age_index(result), "invariant" ); + return result; } - void finished_recalculating_age_indexes() { - _all_regions_allocated = 0; - } - }; #endif // SHARE_GC_G1_SURVRATEGROUP_HPP