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:
parent
8afe9d5d2f
commit
e41103081b
1 changed files with 3 additions and 2 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue