aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/postreload-gcse.c14
-rw-r--r--gcc/profile-count.h2
3 files changed, 20 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2588ce2..cb50bad 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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.
2018-11-07 Chenghua Xu <paul.hua.gm@gmail.com>
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
diff --git a/gcc/profile-count.h b/gcc/profile-count.h
index f4d0c340..5d3bcc7 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;