libgcc: Use may_alias attribute in bitint handlers
Checks
Commit Message
Hi!
As discussed on IRC, the following patch uses may_alias attribute, so that
on targets like aarch64 where abi_limb_mode != limb_mode the library
accesses the limbs (half limbs of the ABI) in the arrays with conservative
alias set.
So far tested on x86_64-linux with
make check-gcc check-g++ -j32 -k GCC_TEST_RUN_EXPENSIVE=1 RUNTESTFLAGS="GCC_TEST_RUN_EXPENSIVE=1 dg.exp='*bitint* pr112673.c builtin-stdc-bit-*.c pr112566-2.c pr112511.c' dg-torture.exp=*bitint* dfp.exp=*bitint*"
Ok for trunk if it passes full bootstrap/regtest?
2024-01-11 Jakub Jelinek <jakub@redhat.com>
* libgcc2.h (UBILtype): New typedef with may_alias attribute.
(__mulbitint3, __divmodbitint4): Use UBILtype * instead of
UWtype * and const UBILtype * instead of const UWtype *.
* libgcc2.c (bitint_reduce_prec, bitint_mul_1, bitint_addmul_1,
__mulbitint3, bitint_negate, bitint_submul_1, __divmodbitint4):
Likewise.
* soft-fp/bitint.h (UBILtype): Change define into a typedef with
may_alias attribute.
Jakub
Comments
On Thu, 11 Jan 2024, Jakub Jelinek wrote:
> Hi!
>
> As discussed on IRC, the following patch uses may_alias attribute, so that
> on targets like aarch64 where abi_limb_mode != limb_mode the library
> accesses the limbs (half limbs of the ABI) in the arrays with conservative
> alias set.
>
> So far tested on x86_64-linux with
> make check-gcc check-g++ -j32 -k GCC_TEST_RUN_EXPENSIVE=1 RUNTESTFLAGS="GCC_TEST_RUN_EXPENSIVE=1 dg.exp='*bitint* pr112673.c builtin-stdc-bit-*.c pr112566-2.c pr112511.c' dg-torture.exp=*bitint* dfp.exp=*bitint*"
> Ok for trunk if it passes full bootstrap/regtest?
OK.
Richard.
> 2024-01-11 Jakub Jelinek <jakub@redhat.com>
>
> * libgcc2.h (UBILtype): New typedef with may_alias attribute.
> (__mulbitint3, __divmodbitint4): Use UBILtype * instead of
> UWtype * and const UBILtype * instead of const UWtype *.
> * libgcc2.c (bitint_reduce_prec, bitint_mul_1, bitint_addmul_1,
> __mulbitint3, bitint_negate, bitint_submul_1, __divmodbitint4):
> Likewise.
> * soft-fp/bitint.h (UBILtype): Change define into a typedef with
> may_alias attribute.
>
> --- libgcc/libgcc2.h.jj 2024-01-03 12:07:28.134370411 +0100
> +++ libgcc/libgcc2.h 2024-01-11 08:42:02.417235956 +0100
> @@ -402,10 +402,12 @@ extern UDWtype __udivmoddi4 (UDWtype, UD
> #if (defined(__BITINT_MAXWIDTH__) \
> && (defined(L_mulbitint3) || defined(L_divmodbitint4)))
> /* _BitInt support. */
> -extern void __mulbitint3 (UWtype *, SItype, const UWtype *, SItype,
> - const UWtype *, SItype);
> -extern void __divmodbitint4 (UWtype *, SItype, UWtype *, SItype,
> - const UWtype *, SItype, const UWtype *, SItype);
> +typedef UWtype __attribute__((__may_alias__)) UBILtype;
> +extern void __mulbitint3 (UBILtype *, SItype, const UBILtype *, SItype,
> + const UBILtype *, SItype);
> +extern void __divmodbitint4 (UBILtype *, SItype, UBILtype *, SItype,
> + const UBILtype *, SItype, const UBILtype *,
> + SItype);
> #endif
>
> /* __negdi2 is static inline when building other libgcc2 portions. */
> --- libgcc/libgcc2.c.jj 2024-01-03 12:07:29.323353753 +0100
> +++ libgcc/libgcc2.c 2024-01-11 08:44:56.260727411 +0100
> @@ -1309,7 +1309,7 @@ __udivdi3 (UDWtype n, UDWtype d)
> some narrower _BitInt value, reduce precision. */
>
> static inline __attribute__((__always_inline__)) SItype
> -bitint_reduce_prec (const UWtype **p, SItype prec)
> +bitint_reduce_prec (const UBILtype **p, SItype prec)
> {
> UWtype mslimb;
> SItype i;
> @@ -1421,7 +1421,7 @@ bitint_reduce_prec (const UWtype **p, SI
> /* D = S * L. */
>
> static UWtype
> -bitint_mul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
> +bitint_mul_1 (UBILtype *d, const UBILtype *s, UWtype l, SItype n)
> {
> UWtype sv, hi, lo, c = 0;
> do
> @@ -1440,7 +1440,7 @@ bitint_mul_1 (UWtype *d, const UWtype *s
> /* D += S * L. */
>
> static UWtype
> -bitint_addmul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
> +bitint_addmul_1 (UBILtype *d, const UBILtype *s, UWtype l, SItype n)
> {
> UWtype sv, hi, lo, c = 0;
> do
> @@ -1465,9 +1465,9 @@ bitint_addmul_1 (UWtype *d, const UWtype
> positive. */
>
> void
> -__mulbitint3 (UWtype *ret, SItype retprec,
> - const UWtype *u, SItype uprec,
> - const UWtype *v, SItype vprec)
> +__mulbitint3 (UBILtype *ret, SItype retprec,
> + const UBILtype *u, SItype uprec,
> + const UBILtype *v, SItype vprec)
> {
> uprec = bitint_reduce_prec (&u, uprec);
> vprec = bitint_reduce_prec (&v, vprec);
> @@ -1480,7 +1480,7 @@ __mulbitint3 (UWtype *ret, SItype retpre
> || (avprec > auprec && !(uprec >= 0 && vprec < 0)))
> {
> SItype p;
> - const UWtype *t;
> + const UBILtype *t;
> p = uprec; uprec = vprec; vprec = p;
> p = auprec; auprec = avprec; avprec = p;
> t = u; u = v; v = t;
> @@ -1643,7 +1643,7 @@ __mulbitint3 (UWtype *ret, SItype retpre
> /* D = -S. */
>
> static void
> -bitint_negate (UWtype *d, const UWtype *s, SItype n)
> +bitint_negate (UBILtype *d, const UBILtype *s, SItype n)
> {
> UWtype c = 1;
> do
> @@ -1660,7 +1660,7 @@ bitint_negate (UWtype *d, const UWtype *
> /* D -= S * L. */
>
> static UWtype
> -bitint_submul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
> +bitint_submul_1 (UBILtype *d, const UBILtype *s, UWtype l, SItype n)
> {
> UWtype sv, hi, lo, c = 0;
> do
> @@ -1687,10 +1687,10 @@ bitint_submul_1 (UWtype *d, const UWtype
> should be 0. */
>
> void
> -__divmodbitint4 (UWtype *q, SItype qprec,
> - UWtype *r, SItype rprec,
> - const UWtype *u, SItype uprec,
> - const UWtype *v, SItype vprec)
> +__divmodbitint4 (UBILtype *q, SItype qprec,
> + UBILtype *r, SItype rprec,
> + const UBILtype *u, SItype uprec,
> + const UBILtype *v, SItype vprec)
> {
> uprec = bitint_reduce_prec (&u, uprec);
> vprec = bitint_reduce_prec (&v, vprec);
> @@ -1747,7 +1747,7 @@ __divmodbitint4 (UWtype *q, SItype qprec
> if (qn >= qn2)
> qn2 = 0;
> USItype sz = un + 1 + vn + qn2;
> - UWtype *buf = __builtin_alloca (sz * sizeof (UWtype));
> + UBILtype *buf = __builtin_alloca (sz * sizeof (UWtype));
> USItype uidx, vidx;
> #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
> uidx = un - 1;
> @@ -1768,9 +1768,9 @@ __divmodbitint4 (UWtype *q, SItype qprec
> __builtin_memcpy (buf + un + 1, v, vn * sizeof (UWtype));
> if (vp)
> buf[un + 1 + BITINT_END (0, vn - 1)] &= (((UWtype) 1 << vp) - 1);
> - UWtype *u2 = buf;
> - UWtype *v2 = u2 + un + 1;
> - UWtype *q2 = v2 + vn;
> + UBILtype *u2 = buf;
> + UBILtype *v2 = u2 + un + 1;
> + UBILtype *q2 = v2 + vn;
> if (!qn2)
> q2 = q + BITINT_END (qn - (un - vn + 1), 0);
>
> --- libgcc/soft-fp/bitint.h.jj 2023-09-06 17:42:14.501093073 +0200
> +++ libgcc/soft-fp/bitint.h 2024-01-11 08:39:09.590746494 +0100
> @@ -33,19 +33,19 @@ see the files COPYING3 and COPYING.RUNTI
> #if BIL_UNITS_PER_WORD == 8
> #define BIL_TYPE_SIZE (8 * __CHAR_BIT__)
> #define BILtype DItype
> -#define UBILtype UDItype
> +typedef UDItype __attribute__ ((__may_alias__)) UBILtype;
> #elif BIL_UNITS_PER_WORD == 4
> #define BIL_TYPE_SIZE (4 * __CHAR_BIT__)
> #define BILtype SItype
> -#define UBILtype USItype
> +typedef USItype __attribute__ ((__may_alias__)) UBILtype;
> #elif BIL_UNITS_PER_WORD == 2
> #define BIL_TYPE_SIZE (2 * __CHAR_BIT__)
> #define BILtype HItype
> -#define UBILtype UHItype
> +typedef UHItype __attribute__ ((__may_alias__)) UBILtype;
> #else
> #define BIL_TYPE_SIZE __CHAR_BIT__
> #define BILtype QItype
> -#define UBILtype UQItype
> +typedef UQItype __attribute__ ((__may_alias__)) UBILtype;
> #endif
>
> /* If *P is zero or sign extended (the latter only for PREC < 0) from
>
> Jakub
>
>
@@ -402,10 +402,12 @@ extern UDWtype __udivmoddi4 (UDWtype, UD
#if (defined(__BITINT_MAXWIDTH__) \
&& (defined(L_mulbitint3) || defined(L_divmodbitint4)))
/* _BitInt support. */
-extern void __mulbitint3 (UWtype *, SItype, const UWtype *, SItype,
- const UWtype *, SItype);
-extern void __divmodbitint4 (UWtype *, SItype, UWtype *, SItype,
- const UWtype *, SItype, const UWtype *, SItype);
+typedef UWtype __attribute__((__may_alias__)) UBILtype;
+extern void __mulbitint3 (UBILtype *, SItype, const UBILtype *, SItype,
+ const UBILtype *, SItype);
+extern void __divmodbitint4 (UBILtype *, SItype, UBILtype *, SItype,
+ const UBILtype *, SItype, const UBILtype *,
+ SItype);
#endif
/* __negdi2 is static inline when building other libgcc2 portions. */
@@ -1309,7 +1309,7 @@ __udivdi3 (UDWtype n, UDWtype d)
some narrower _BitInt value, reduce precision. */
static inline __attribute__((__always_inline__)) SItype
-bitint_reduce_prec (const UWtype **p, SItype prec)
+bitint_reduce_prec (const UBILtype **p, SItype prec)
{
UWtype mslimb;
SItype i;
@@ -1421,7 +1421,7 @@ bitint_reduce_prec (const UWtype **p, SI
/* D = S * L. */
static UWtype
-bitint_mul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
+bitint_mul_1 (UBILtype *d, const UBILtype *s, UWtype l, SItype n)
{
UWtype sv, hi, lo, c = 0;
do
@@ -1440,7 +1440,7 @@ bitint_mul_1 (UWtype *d, const UWtype *s
/* D += S * L. */
static UWtype
-bitint_addmul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
+bitint_addmul_1 (UBILtype *d, const UBILtype *s, UWtype l, SItype n)
{
UWtype sv, hi, lo, c = 0;
do
@@ -1465,9 +1465,9 @@ bitint_addmul_1 (UWtype *d, const UWtype
positive. */
void
-__mulbitint3 (UWtype *ret, SItype retprec,
- const UWtype *u, SItype uprec,
- const UWtype *v, SItype vprec)
+__mulbitint3 (UBILtype *ret, SItype retprec,
+ const UBILtype *u, SItype uprec,
+ const UBILtype *v, SItype vprec)
{
uprec = bitint_reduce_prec (&u, uprec);
vprec = bitint_reduce_prec (&v, vprec);
@@ -1480,7 +1480,7 @@ __mulbitint3 (UWtype *ret, SItype retpre
|| (avprec > auprec && !(uprec >= 0 && vprec < 0)))
{
SItype p;
- const UWtype *t;
+ const UBILtype *t;
p = uprec; uprec = vprec; vprec = p;
p = auprec; auprec = avprec; avprec = p;
t = u; u = v; v = t;
@@ -1643,7 +1643,7 @@ __mulbitint3 (UWtype *ret, SItype retpre
/* D = -S. */
static void
-bitint_negate (UWtype *d, const UWtype *s, SItype n)
+bitint_negate (UBILtype *d, const UBILtype *s, SItype n)
{
UWtype c = 1;
do
@@ -1660,7 +1660,7 @@ bitint_negate (UWtype *d, const UWtype *
/* D -= S * L. */
static UWtype
-bitint_submul_1 (UWtype *d, const UWtype *s, UWtype l, SItype n)
+bitint_submul_1 (UBILtype *d, const UBILtype *s, UWtype l, SItype n)
{
UWtype sv, hi, lo, c = 0;
do
@@ -1687,10 +1687,10 @@ bitint_submul_1 (UWtype *d, const UWtype
should be 0. */
void
-__divmodbitint4 (UWtype *q, SItype qprec,
- UWtype *r, SItype rprec,
- const UWtype *u, SItype uprec,
- const UWtype *v, SItype vprec)
+__divmodbitint4 (UBILtype *q, SItype qprec,
+ UBILtype *r, SItype rprec,
+ const UBILtype *u, SItype uprec,
+ const UBILtype *v, SItype vprec)
{
uprec = bitint_reduce_prec (&u, uprec);
vprec = bitint_reduce_prec (&v, vprec);
@@ -1747,7 +1747,7 @@ __divmodbitint4 (UWtype *q, SItype qprec
if (qn >= qn2)
qn2 = 0;
USItype sz = un + 1 + vn + qn2;
- UWtype *buf = __builtin_alloca (sz * sizeof (UWtype));
+ UBILtype *buf = __builtin_alloca (sz * sizeof (UWtype));
USItype uidx, vidx;
#if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
uidx = un - 1;
@@ -1768,9 +1768,9 @@ __divmodbitint4 (UWtype *q, SItype qprec
__builtin_memcpy (buf + un + 1, v, vn * sizeof (UWtype));
if (vp)
buf[un + 1 + BITINT_END (0, vn - 1)] &= (((UWtype) 1 << vp) - 1);
- UWtype *u2 = buf;
- UWtype *v2 = u2 + un + 1;
- UWtype *q2 = v2 + vn;
+ UBILtype *u2 = buf;
+ UBILtype *v2 = u2 + un + 1;
+ UBILtype *q2 = v2 + vn;
if (!qn2)
q2 = q + BITINT_END (qn - (un - vn + 1), 0);
@@ -33,19 +33,19 @@ see the files COPYING3 and COPYING.RUNTI
#if BIL_UNITS_PER_WORD == 8
#define BIL_TYPE_SIZE (8 * __CHAR_BIT__)
#define BILtype DItype
-#define UBILtype UDItype
+typedef UDItype __attribute__ ((__may_alias__)) UBILtype;
#elif BIL_UNITS_PER_WORD == 4
#define BIL_TYPE_SIZE (4 * __CHAR_BIT__)
#define BILtype SItype
-#define UBILtype USItype
+typedef USItype __attribute__ ((__may_alias__)) UBILtype;
#elif BIL_UNITS_PER_WORD == 2
#define BIL_TYPE_SIZE (2 * __CHAR_BIT__)
#define BILtype HItype
-#define UBILtype UHItype
+typedef UHItype __attribute__ ((__may_alias__)) UBILtype;
#else
#define BIL_TYPE_SIZE __CHAR_BIT__
#define BILtype QItype
-#define UBILtype UQItype
+typedef UQItype __attribute__ ((__may_alias__)) UBILtype;
#endif
/* If *P is zero or sign extended (the latter only for PREC < 0) from