diff options
author | Martin Liska <mliska@suse.cz> | 2018-11-07 10:33:22 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-11-07 09:33:22 +0000 |
commit | 907050e34f4d1b5471e738cf5a718a8c6f50e334 (patch) | |
tree | deb77b6e57768a9edb6812fdbddb78321929cfb2 /gcc/postreload-gcse.c | |
parent | 9cfc08c0491270417557f00998857722c405f0b3 (diff) | |
download | gcc-907050e34f4d1b5471e738cf5a718a8c6f50e334.zip gcc-907050e34f4d1b5471e738cf5a718a8c6f50e334.tar.gz gcc-907050e34f4d1b5471e738cf5a718a8c6f50e334.tar.bz2 |
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
Diffstat (limited to 'gcc/postreload-gcse.c')
-rw-r--r-- | gcc/postreload-gcse.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c index b569931..399970c 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 |