From 7d02c8bf75980fa2468f4167a82dd3a619e35cb4 Mon Sep 17 00:00:00 2001 From: "Vladimir N. Makarov" Date: Thu, 2 Dec 2021 10:55:59 -0500 Subject: [PATCH] [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. --- gcc/ira-color.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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; -- 2.7.4