Fix undefined behaviour in profile_count::differs_from_p

This patch avoid overflow in profile_count::differs_from_p and also makes it to
return false from one of the values is undefined while other is defined.

gcc/ChangeLog:

	* profile-count.cc (profile_count::differs_from_p): Fix overflow and
	handling of undefined values.
This commit is contained in:
Jan Hubicka 2023-08-10 18:35:13 +02:00
parent 8afe9d5d2f
commit e41103081b

View file

@ -128,13 +128,14 @@ profile_count::differs_from_p (profile_count other) const
{ {
gcc_checking_assert (compatible_p (other)); gcc_checking_assert (compatible_p (other));
if (!initialized_p () || !other.initialized_p ()) if (!initialized_p () || !other.initialized_p ())
return false; return initialized_p () != other.initialized_p ();
if ((uint64_t)m_val - (uint64_t)other.m_val < 100 if ((uint64_t)m_val - (uint64_t)other.m_val < 100
|| (uint64_t)other.m_val - (uint64_t)m_val < 100) || (uint64_t)other.m_val - (uint64_t)m_val < 100)
return false; return false;
if (!other.m_val) if (!other.m_val)
return true; return true;
int64_t ratio = (int64_t)m_val * 100 / other.m_val; uint64_t ratio;
safe_scale_64bit (m_val, 100, other.m_val, &ratio);
return ratio < 99 || ratio > 101; return ratio < 99 || ratio > 101;
} }