aboutsummaryrefslogtreecommitdiff
path: root/gcc/postreload-gcse.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-11-07 10:33:22 +0100
committerMartin Liska <marxin@gcc.gnu.org>2018-11-07 09:33:22 +0000
commit907050e34f4d1b5471e738cf5a718a8c6f50e334 (patch)
treedeb77b6e57768a9edb6812fdbddb78321929cfb2 /gcc/postreload-gcse.c
parent9cfc08c0491270417557f00998857722c405f0b3 (diff)
downloadgcc-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.c14
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