This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Always treat sext_hwi and zext_hwi as inline


Richard Sandiford <rdsandiford@googlemail.com> wrote:
>At the moment there are two copies of sext_hwi and zext_hwi, one inline
>for !ENABLE_CHECKING and one out-of-line for ENABLE_CHECKING.  However,
>there are several wide-int callers where it's obvious from context that
>the precision is <= HOST_BITS_PER_WIDE_INT, so if the functions are
>inline for ENABLE_CHECKING, the assert can often be compiled away.
>
>This improves the ENABLE_CHECKING code for some query functions on
>wide-int branch.  Tested on x86_64-linux-gnu.  OK for mainline?

Ok.  
>Thanks,
>Richard
>
>
>gcc/
>	* system.h: Move hwint.h include further down.
>	* hwint.h (sext_hwi, zext_hwi): Define unconditionally.  Add
>	gcc_checking_asserts.
>	* hwint.c (sext_hwi, zext_hwi): Delete ENABLE_CHECKING versions.
>
>Index: gcc/hwint.c
>===================================================================
>--- gcc/hwint.c	2013-08-21 19:28:49.560621645 +0100
>+++ gcc/hwint.c	2013-10-19 20:05:43.399978400 +0100
>@@ -204,35 +204,3 @@ least_common_multiple (HOST_WIDE_INT a,
> {
>   return mul_hwi (abs_hwi (a) / gcd (a, b), abs_hwi (b));
> }
>-
>-#ifdef ENABLE_CHECKING
>-/* Sign extend SRC starting from PREC.  */
>-
>-HOST_WIDE_INT
>-sext_hwi (HOST_WIDE_INT src, unsigned int prec)
>-{
>-  gcc_checking_assert (prec <= HOST_BITS_PER_WIDE_INT);
>-
>-  if (prec == HOST_BITS_PER_WIDE_INT)
>-    return src;
>-  else
>-    {
>-      int shift = HOST_BITS_PER_WIDE_INT - prec;
>-      return (src << shift) >> shift;
>-    }
>-}
>-
>-/* Zero extend SRC starting from PREC.  */
>-
>-unsigned HOST_WIDE_INT
>-zext_hwi (unsigned HOST_WIDE_INT src, unsigned int prec)
>-{
>-  gcc_checking_assert (prec <= HOST_BITS_PER_WIDE_INT);
>-
>-  if (prec == HOST_BITS_PER_WIDE_INT)
>-    return src;
>-  else
>-    return src & (((HOST_WIDE_INT)1 << prec) - 1);
>-}
>-
>-#endif
>Index: gcc/hwint.h
>===================================================================
>--- gcc/hwint.h	2013-09-05 20:55:31.192518091 +0100
>+++ gcc/hwint.h	2013-10-19 20:05:23.469855942 +0100
>@@ -322,9 +322,6 @@ extern HOST_WIDE_INT least_common_multip
> 
> /* Sign extend SRC starting from PREC.  */
> 
>-#ifdef ENABLE_CHECKING
>-extern HOST_WIDE_INT sext_hwi (HOST_WIDE_INT, unsigned int);
>-#else
> static inline HOST_WIDE_INT
> sext_hwi (HOST_WIDE_INT src, unsigned int prec)
> {
>@@ -332,24 +329,23 @@ sext_hwi (HOST_WIDE_INT src, unsigned in
>     return src;
>   else
>     {
>+      gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
>       int shift = HOST_BITS_PER_WIDE_INT - prec;
>       return (src << shift) >> shift;
>     }
> }
>-#endif
> 
> /* Zero extend SRC starting from PREC.  */
>-#ifdef ENABLE_CHECKING
>-extern unsigned HOST_WIDE_INT zext_hwi (unsigned HOST_WIDE_INT,
>unsigned int);
>-#else
> static inline unsigned HOST_WIDE_INT
> zext_hwi (unsigned HOST_WIDE_INT src, unsigned int prec)
> {
>   if (prec == HOST_BITS_PER_WIDE_INT)
>     return src;
>   else
>-    return src & (((HOST_WIDE_INT)1 << prec) - 1);
>+    {
>+      gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
>+      return src & (((HOST_WIDE_INT) 1 << prec) - 1);
>+    }
> }
>-#endif
> 
> #endif /* ! GCC_HWINT_H */
>Index: gcc/system.h
>===================================================================
>--- gcc/system.h	2013-09-07 10:19:22.797432289 +0100
>+++ gcc/system.h	2013-10-19 20:06:14.417170260 +0100
>@@ -272,9 +272,6 @@ #define ICE_EXIT_CODE 4
> # include <limits.h>
> #endif
> 
>-/* Get definitions of HOST_WIDE_INT and HOST_WIDEST_INT.  */
>-#include "hwint.h"
>-
> /* A macro to determine whether a VALUE lies inclusively within a
>    certain range without evaluating the VALUE more than once.  This
>    macro won't warn if the VALUE is unsigned and the LOWER bound is
>@@ -1066,4 +1063,7 @@ #define DEBUG_FUNCTION
> #define DEBUG_VARIABLE
> #endif
> 
>+/* Get definitions of HOST_WIDE_INT and HOST_WIDEST_INT.  */
>+#include "hwint.h"
>+
> #endif /* ! GCC_SYSTEM_H */

Abs_hwi might be treated the same. IIRC it is out of line as the assert macros were not available in hwi.h.

Thanks,
Richard.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]