commit 0eb22e619c294efb0f007178a230cac413dccb87 Author: Vladimir N. Makarov Date: Thu Dec 2 10:55:59 2021 -0500 [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. diff --git a/gcc/ira-color.c b/gcc/ira-color.c index 1f80cbea0e2..3b19a58e1f0 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;