https://gcc.gnu.org/g:c73b71d6bc7e106714bec94d13f877c6027d9531

commit r17-3165-gc73b71d6bc7e106714bec94d13f877c6027d9531
Author: Kael Andrew Alonzo Franco <[email protected]>
Date:   Sat Aug 8 21:59:24 2026 -0400

    middle-end: If supported, use __builtin_*. [PR126625]
    
    hwint.cc reflect_hwi uses a naive for loop approach to
    emulate __builtin_bitreverse64 ().
    This is slow compared to using __builtin_bitreverse64 () plus bitshift.
    This is useful for bootstrapping GCC since r17-523.
    Also add assert on BITWIDTH <= 64.
    
    For reflect_hwi and ira-color.cc, add STAGE0_CXX_HAS_BUILTIN
    in system.h to test for specific builtins.
    
    Bootstrapped and regtested on x86_64-pc-linux-gnu.
    
            PR middle-end/126625
    
    gcc/ChangeLog:
    
            * hwint.cc (reflect_hwi): Use STAGE0_CXX_HAS_BUILTIN
            for __builtin_bitreverse64.
            * ira-color.cc (HAS_SMUL_OVERFLOW): Remove
            and use STAGE0_CXX_HAS_BUILTIN instead.
            * system.h (STAGE0_CXX_HAS_BUILTIN): New macro.
    
    Signed-off-by: Kael Andrew Franco <[email protected]>

Diff:
---
 gcc/hwint.cc     | 13 ++++++++++++-
 gcc/ira-color.cc |  7 +------
 gcc/system.h     |  8 ++++++++
 3 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/gcc/hwint.cc b/gcc/hwint.cc
index f3b3e7b84080..da7bc05f0859 100644
--- a/gcc/hwint.cc
+++ b/gcc/hwint.cc
@@ -189,12 +189,21 @@ least_common_multiple (HOST_WIDE_INT a, HOST_WIDE_INT b)
   return mul_hwi (abs_hwi (a) / gcd (a, b), abs_hwi (b));
 }
 
-/* Reflect (reverse) the bits of a given VALUE within a specified BITWIDTH.  */
+/* Reflect (reverse) the bits of a given VALUE within a specified BITWIDTH <= 
64.  */
 
 unsigned HOST_WIDE_INT
 reflect_hwi (unsigned HOST_WIDE_INT value, unsigned bitwidth)
 {
+  if (bitwidth == 0)
+    return 0;
+
+  gcc_checking_assert (bitwidth <= 64);
+
+#if STAGE0_CXX_HAS_BUILTIN (bitreverse64)
+  return __builtin_bitreverse64 (value) >> (64 - bitwidth);
+#else
   unsigned HOST_WIDE_INT reflected_value = 0;
+
   /* Loop through each bit in the specified BITWIDTH.  */
   for (size_t i = 0; i < bitwidth; i++)
     {
@@ -204,5 +213,7 @@ reflect_hwi (unsigned HOST_WIDE_INT value, unsigned 
bitwidth)
       reflected_value |= (value & 1);
       value >>= 1;
     }
+
   return reflected_value;
+#endif
 }
diff --git a/gcc/ira-color.cc b/gcc/ira-color.cc
index 2b389b5aab1c..866d5b6bec33 100644
--- a/gcc/ira-color.cc
+++ b/gcc/ira-color.cc
@@ -3154,14 +3154,9 @@ setup_allocno_priorities (ira_allocno_t 
*consideration_allocnos, int n)
       ira_assert (mult >= 0);
       mult *= ira_reg_class_max_nregs[ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)];
       diff = ALLOCNO_MEMORY_COST (a) - ALLOCNO_CLASS_COST (a);
-#ifdef __has_builtin
-#if __has_builtin(__builtin_smul_overflow)
-#define HAS_SMUL_OVERFLOW
-#endif
-#endif
       /* Multiplication can overflow for very large functions.
         Check the overflow and constrain the result if necessary: */
-#ifdef HAS_SMUL_OVERFLOW
+#if STAGE0_CXX_HAS_BUILTIN (smul_overflow)
       if (__builtin_smul_overflow (mult, diff, &priority)
          || priority < -INT_MAX)
        priority = diff >= 0 ? INT_MAX : -INT_MAX;
diff --git a/gcc/system.h b/gcc/system.h
index f0fa062d469b..08fefd6f0549 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -22,6 +22,14 @@ along with GCC; see the file COPYING3.  If not see
 #ifndef GCC_SYSTEM_H
 #define GCC_SYSTEM_H
 
+/* True if __builtin_* () is supported.
+   This is done for optimizing GCC itself.  */
+#ifdef __has_builtin
+# define STAGE0_CXX_HAS_BUILTIN(NAME) __has_builtin (__builtin_ ## NAME)
+#else
+# define STAGE0_CXX_HAS_BUILTIN(NAME) 0
+#endif
+
 /* Define this so that inttypes.h defines the PRI?64 macros even
    when compiling with a C++ compiler.  Define it here so in the
    event inttypes.h gets pulled in by another header it is already

Reply via email to