On Sat, Aug 02, 2025 at 05:14:23PM +0800, Yang Yujie wrote:
> A widening cast from a signed _BitInt operand to an unsigned _BitInt
> type involves filling the extra limb(s) with sign extension.
> On a target that wants _BitInts extended in memory, if this unsigned
> type has a partial limb, the unused part of it should be zeroed.
> 
> e.g. Assuming limb_mode == E_DImode, at the end of
> 
>   void
>   test (unsigned _BitInt(519) *t, _BitInt(512) x)
>   {
>     *t = -x;
>   }
> 
> the most significant limb of *t should be masked with 0x7f.
> 
> This patch also fixes gcc.dg/torture/bitint-16.c, which aborts at -O2
> when the extension on load is optimized away.
> 
> gcc/ChangeLog:
> 
>       * gimple-lower-bitint.cc (bitint_large_huge::lower_mergeable_stmt):
>       zero-extend the partial limb of any unsigned _BitInt LHS assigned

ChangeLog entry should start with capital letter, so Zero-extend
> new file mode 100644
> index 00000000000..b106dd36ef1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/torture/bitint-83.c
> @@ -0,0 +1,52 @@
> +/* Derived from a test in gcc.dg/torture/bitint-16.c */
> +/* { dg-do run { target bitint } } */
> +/* { dg-options "-std=c23 -pedantic-errors" } */
> +/* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
> +/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */
> +
> +#include "../bitintext.h"
> +
> +#define BASIC_TESTS \
> +  TEST(8)        \
> +  TEST(16)       \
> +  TEST(32)       \

The above 3 are certainly ok always, C23 requires that BITINT_MAXWIDTH
is at least ULLONG_WIDTH and ULLONG_WIDTH has minimum 64.

> +  TEST(64)       \
> +  TEST(128)

The above aren't, 64 + 7 is more than 64 and 128 + 7 even more.
> +
> +#if __BITINT_MAXWIDTH__ >= 512

You're using _BitInt(N + 7), so this should
be #if __BITINT_MAXWIDTH__ >= 519

> +#define __ALL_TESTS__ \

Why __ around the macro name?  Just use ALL_TESTS

> +  BASIC_TESTS              \
> +  TEST(256)        \
> +  TEST(512)
> +#elif __BITINT_MAXWIDTH__ >= 256

I wouldn't bother with >= 256 (256 + 7) case, perhaps there will be targets
with only <= 64 or <= 128 support (though hopefully not), others should
have maximum around 64K.  Just I want to make sure the tests are compilable
also with other compilers etc. and clearly state their needs.

So, I'd go with
#if __BITINT_MAXWIDTH__ >= 519
#define ALL_TESTS \
  BASIC_TESTS           \
  TEST(64)              \
  TEST(128)             \
  TEST(256)             \
  TEST(512)
#else
#define ALL_TESTS BASIC_TESTS
#endif

        Jakub

Reply via email to