From e01857197b5fbd660903fe8c0b4c6387780afe10 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 28 Nov 2019 14:50:19 +0000 Subject: [PATCH] Fix previous commit (that included unrelated changes) This patch fixes profile updates while cloning. When new clone is produced its global profile is subtracted from the original function. If the original function profile drops to 0 we want to switch from global profiles to global0 profiles which is implemented by combine_with_ipa_count_within. However this is done on all edges independnetly and it may happen that we end up combining global and globa0 profiles in one functions which is not a good idea. This implements profile_count::combine_with_ipa_count_within which is able to take into account that the counter is inside function with a given count. * profile-count.h (profile_count::combine_with_ipa_count_within): Declare. * profile-count.c (profile_count::combine_with_ipa_count_within): New. * cgraphclones.c (cgraph_edge::clone, cgraph_node::create_clone): Use it. From-SVN: r278811 --- gcc/cgraphclones.c | 7 ----- gcc/profile-count.c | 67 --------------------------------------------- gcc/profile-count.h | 31 ++++----------------- 3 files changed, 5 insertions(+), 100 deletions(-) diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 64ff1c0654b..a79491e0b88 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -80,11 +80,6 @@ along with GCC; see the file COPYING3. If not see #include "tree-inline.h" #include "dumpfile.h" #include "gimple-pretty-print.h" -#include "alloc-pool.h" -#include "symbol-summary.h" -#include "tree-vrp.h" -#include "ipa-prop.h" -#include "ipa-fnsummary.h" /* Create clone of edge in the node N represented by CALL_EXPR the callgraph. */ @@ -274,8 +269,6 @@ cgraph_node::expand_all_artificial_thunks () thunk->thunk.thunk_p = false; thunk->analyze (); } - ipa_analyze_node (thunk); - inline_analyze_function (thunk); thunk->expand_all_artificial_thunks (); } else diff --git a/gcc/profile-count.c b/gcc/profile-count.c index d0800b29d70..e91f9cbd26d 100644 --- a/gcc/profile-count.c +++ b/gcc/profile-count.c @@ -32,7 +32,6 @@ along with GCC; see the file COPYING3. If not see #include "cgraph.h" #include "wide-int.h" #include "sreal.h" -#include "selftest.h" /* Names from profile_quality enum values. */ @@ -292,7 +291,6 @@ profile_count::to_cgraph_frequency (profile_count entry_bb_count) const return 0; gcc_checking_assert (entry_bb_count.initialized_p ()); uint64_t scale; - gcc_checking_assert (compatible_p (entry_bb_count)); if (!safe_scale_64bit (!entry_bb_count.m_val ? m_val + 1 : m_val, CGRAPH_FREQ_BASE, MAX (1, entry_bb_count.m_val), &scale)) return CGRAPH_FREQ_MAX; @@ -330,7 +328,6 @@ profile_count::to_sreal_scale (profile_count in, bool *known) const return 0; if (m_val == in.m_val) return 1; - gcc_checking_assert (compatible_p (in)); if (!in.m_val) { @@ -376,8 +373,6 @@ profile_count::adjust_for_ipa_scaling (profile_count *num, profile_count profile_count::combine_with_ipa_count (profile_count ipa) { - if (!initialized_p ()) - return *this; ipa = ipa.ipa (); if (ipa.nonzero_p ()) return ipa; @@ -447,65 +442,3 @@ profile_probability::combine_with_count (profile_count count1, else return *this * even () + other * even (); } - -#if CHECKING_P -namespace selftest { - -/* Verify non-trivial type conversions for IPA scaling. This happens often - during inlining. */ - -static void -profile_count_verify_ipa_scaling (void) -{ - profile_count cnt1 = profile_count::from_gcov_type (4).global0 (); - profile_count cnt2 = profile_count::from_gcov_type (2); - profile_count cnt3 = profile_count::from_gcov_type (8); - profile_count cnt4 = cnt3.apply_scale (cnt1, cnt2); - - /* Result should be 16 with GUESSED_GLOBAL0. */ - ASSERT_EQ (cnt4.ipa (), profile_count::zero ()); - ASSERT_EQ (cnt4.to_gcov_type (), 16); - - cnt1 = profile_count::from_gcov_type (4).global0adjusted (); - cnt4 = cnt3.apply_scale (cnt1, cnt2); - /* Result should be 16 with GUESSED_GLOBAL0_ADJUSTED. */ - ASSERT_EQ (cnt4.ipa (), profile_count::adjusted_zero ()); - ASSERT_EQ (cnt4.to_gcov_type (), 16); -} - -/* Verify non-trivial cases of sreal scale calculations. */ - -static void -profile_count_verify_to_sreal_scale (void) -{ - profile_count cnt1 = profile_count::from_gcov_type (4).global0 (); - profile_count cnt2 = profile_count::from_gcov_type (8); - - /* If count is globally 0 it should have 0 scale in non-zero global count. */ - ASSERT_EQ (cnt1.to_sreal_scale (cnt2), 0); -} - -/* Verify non-trivial cases of probability_in calculations. */ - -static void -profile_count_verify_probability_in (void) -{ - /*profile_count cnt1 = profile_count::from_gcov_type (4).global0 (); - profile_count cnt2 = profile_count::from_gcov_type (8);*/ - - /* If count is globally 0 it should have 0 probability in non-zero global - count. */ - /*ASSERT_EQ (cnt1.probability_in (cnt2), profile_probability::never ());*/ -} - -/* Run all of the selftests within this file. */ - -void profile_count_c_tests (void) -{ - profile_count_verify_ipa_scaling (); - profile_count_verify_to_sreal_scale (); - profile_count_verify_probability_in (); -} - -} -#endif diff --git a/gcc/profile-count.h b/gcc/profile-count.h index 9af8d606bc4..967c5ec1a12 100644 --- a/gcc/profile-count.h +++ b/gcc/profile-count.h @@ -700,7 +700,6 @@ private: uint64_t UINT64_BIT_FIELD_ALIGN m_val : n_bits; #undef UINT64_BIT_FIELD_ALIGN enum profile_quality m_quality : 3; -public: /* Return true if both values can meaningfully appear in single function body. We have either all counters in function local or global, otherwise @@ -712,18 +711,9 @@ public: if (*this == zero () || other == zero ()) return true; - /* Do not allow nonzero global profile together with local guesses - that are globally0. */ - if (ipa ().nonzero_p () - && !(other.ipa () == other)) - return false; - if (other.ipa ().nonzero_p () - && !(ipa () == *this)) - return false; - return ipa_p () == other.ipa_p (); } - +public: /* Used for counters which are expected to be never executed. */ static profile_count zero () { @@ -1002,14 +992,6 @@ public: profile_count max (profile_count other) const { - profile_count val = *this; - - /* Always prefer nonzero IPA counts over local counts. */ - if (ipa ().nonzero_p () || other.ipa ().nonzero_p ()) - { - val = ipa (); - other = other.ipa (); - } if (!initialized_p ()) return other; if (!other.initialized_p ()) @@ -1019,8 +1001,8 @@ public: if (other == zero ()) return *this; gcc_checking_assert (compatible_p (other)); - if (val.m_val < other.m_val || (m_val == other.m_val - && val.m_quality < other.m_quality)) + if (m_val < other.m_val || (m_val == other.m_val + && m_quality < other.m_quality)) return other; return *this; } @@ -1079,7 +1061,6 @@ public: { if (*this == zero ()) return *this; - if (num == zero ()) return num; if (!initialized_p () || !num.initialized_p () || !den.initialized_p ()) @@ -1094,9 +1075,7 @@ public: ret.m_val = MIN (val, max_count); ret.m_quality = MIN (MIN (MIN (m_quality, ADJUSTED), num.m_quality), den.m_quality); - /* Be sure that ret is not local or global0 type - if num is global. */ - if (num.ipa_p () && (!ret.ipa_p () || !(ret.ipa () == ret))) + if (num.ipa_p () && !ret.ipa_p ()) ret.m_quality = MIN (num.m_quality, GUESSED); return ret; } @@ -1174,8 +1153,8 @@ public: if (*this == overall && m_quality == PRECISE) return profile_probability::always (); profile_probability ret; - gcc_checking_assert (compatible_p (overall)); + if (overall.m_val < m_val) { ret.m_val = profile_probability::max_probability; -- 2.30.2