From: marxin Date: Wed, 7 Nov 2018 09:33:22 +0000 (+0000) Subject: Fix UBSAN in postreload-gcse.c (PR rtl-optimization/87868). X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fc018a4c8e4f0882eee07a875ebc94c1d0beb3e9;p=thirdparty%2Fgcc.git Fix UBSAN in postreload-gcse.c (PR rtl-optimization/87868). 2018-11-07 Martin Liska 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@265869 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2588ce226dcc..cb50bad54ad2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-11-07 Martin Liska + + 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 * mem-stats.h: Fix GNU coding style. diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c index b56993183d02..399970c368ae 100644 --- a/gcc/postreload-gcse.c +++ b/gcc/postreload-gcse.c @@ -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 diff --git a/gcc/profile-count.h b/gcc/profile-count.h index f4d0c340a0a9..5d3bcc75f6d8 100644 --- a/gcc/profile-count.h +++ b/gcc/profile-count.h @@ -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;