Fix UBSAN in postreload-gcse.c (PR rtl-optimization/87868).

2018-11-07  Martin Liska  <mliska@suse.cz>

	PR rtl-optimization/87868
	* postreload-gcse.c (eliminate_partially_redundant_load): Set
	threshold to max_count if we would overflow.
	* profile-count.h: Make max_count a public constant.

From-SVN: r265869
This commit is contained in:
Martin Liska 2018-11-07 10:33:22 +01:00 committed by Martin Liska
parent 9cfc08c049
commit 907050e34f
3 changed files with 20 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2018-11-07 Martin Liska <mliska@suse.cz>
PR rtl-optimization/87868
* postreload-gcse.c (eliminate_partially_redundant_load): Set
threshold to max_count if we would overflow.
* profile-count.h: Make max_count a public constant.
2018-11-07 Martin Liska <mliska@suse.cz>
* mem-stats.h: Fix GNU coding style.

View File

@ -1170,8 +1170,18 @@ eliminate_partially_redundant_load (basic_block bb, rtx_insn *insn,
if (ok_count.to_gcov_type ()
< GCSE_AFTER_RELOAD_PARTIAL_FRACTION * not_ok_count.to_gcov_type ())
goto cleanup;
if (ok_count.to_gcov_type ()
< GCSE_AFTER_RELOAD_CRITICAL_FRACTION * critical_count.to_gcov_type ())
gcov_type threshold;
#if (GCC_VERSION >= 5000)
if (__builtin_mul_overflow (GCSE_AFTER_RELOAD_CRITICAL_FRACTION,
critical_count.to_gcov_type (), &threshold))
threshold = profile_count::max_count;
#else
threshold
= GCSE_AFTER_RELOAD_CRITICAL_FRACTION * critical_count.to_gcov_type ();
#endif
if (ok_count.to_gcov_type () < threshold)
goto cleanup;
/* Generate moves to the loaded register from where

View File

@ -641,8 +641,8 @@ public:
type to hold various extra stages. */
static const int n_bits = 61;
private:
static const uint64_t max_count = ((uint64_t) 1 << n_bits) - 2;
private:
static const uint64_t uninitialized_count = ((uint64_t) 1 << n_bits) - 1;
uint64_t m_val : n_bits;