Patchwork Always treat sext_hwi and zext_hwi as inline

login
register
mail settings
Submitter Richard Sandiford
Date Oct. 20, 2013, 10:26 a.m.
Message ID <8761ss5jd3.fsf@talisman.default>
Download mbox | patch
Permalink /patch/284959/
State New
Headers show

Comments

Richard Sandiford - Oct. 20, 2013, 10:26 a.m.
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?

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.
Richard Guenther - Oct. 20, 2013, 12:46 p.m.
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.

Patch

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 */