This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Always treat sext_hwi and zext_hwi as inline
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Richard Sandiford <rdsandiford at googlemail dot com>,gcc-patches at gcc dot gnu dot org
- Date: Sun, 20 Oct 2013 14:46:32 +0200
- Subject: Re: Always treat sext_hwi and zext_hwi as inline
- Authentication-results: sourceware.org; auth=none
- References: <8761ss5jd3 dot fsf at talisman dot default>
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.