diff options
author | Vladimir N. Makarov <vmakarov@redhat.com> | 2021-12-02 10:55:59 -0500 |
---|---|---|
committer | Vladimir N. Makarov <vmakarov@redhat.com> | 2021-12-02 11:00:56 -0500 |
commit | 7d02c8bf75980fa2468f4167a82dd3a619e35cb4 (patch) | |
tree | 3f2797293178cf754ec0b59795fde17923d229f1 | |
parent | a27940feffbbff172d8ec84ee825e1997b3d0210 (diff) | |
download | gcc-7d02c8bf75980fa2468f4167a82dd3a619e35cb4.zip gcc-7d02c8bf75980fa2468f4167a82dd3a619e35cb4.tar.gz gcc-7d02c8bf75980fa2468f4167a82dd3a619e35cb4.tar.bz2 |
[PR103437] Use long long multiplication as backup for overflow processing
__builtin_smul_overflow can be unavailable for some C++ compilers.
Add long long multiplication as backup for overflow processing.
gcc/ChangeLog:
PR rtl-optimization/103437
* ira-color.c (setup_allocno_priorities): Use long long
multiplication as backup for overflow processing.
-rw-r--r-- | gcc/ira-color.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/ira-color.c b/gcc/ira-color.c index 1f80cbe..3b19a58 100644 --- a/gcc/ira-color.c +++ b/gcc/ira-color.c @@ -2797,6 +2797,7 @@ static void setup_allocno_priorities (ira_allocno_t *consideration_allocnos, int n) { int i, length, nrefs, priority, max_priority, mult, diff; + bool overflow_backup_p = true; ira_allocno_t a; max_priority = 0; @@ -2811,9 +2812,25 @@ setup_allocno_priorities (ira_allocno_t *consideration_allocnos, int n) diff = ALLOCNO_MEMORY_COST (a) - ALLOCNO_CLASS_COST (a); /* Multiplication can overflow for very large functions. Check the overflow and constrain the result if necessary: */ +#ifdef __has_builtin +#if __has_builtin(__builtin_smul_overflow) + overflow_backup_p = false; if (__builtin_smul_overflow (mult, diff, &priority) || priority <= -INT_MAX) priority = diff >= 0 ? INT_MAX : -INT_MAX; +#endif +#endif + if (overflow_backup_p) + { + static_assert + (sizeof (long long) >= 2 * sizeof (int), + "overflow code does not work for such int and long long sizes"); + long long priorityll = (long long) mult * diff; + if (priorityll < -INT_MAX || priorityll > INT_MAX) + priority = diff >= 0 ? INT_MAX : -INT_MAX; + else + priority = priorityll; + } allocno_priorities[ALLOCNO_NUM (a)] = priority; if (priority < 0) priority = -priority; |