[{"id":3677594,"web_url":"http://patchwork.ozlabs.org/comment/3677594/","msgid":"<11po881q-qrq7-q160-958o-5qs7po1os88q@fhfr.qr>","list_archive_url":null,"date":"2026-04-15T11:05:17","subject":"Re: [PATCH] bitintlower: Padding bit fixes, part 1 [PR123635]","submitter":{"id":4338,"url":"http://patchwork.ozlabs.org/api/people/4338/","name":"Richard Biener","email":"rguenther@suse.de"},"content":"On Wed, 15 Apr 2026, Jakub Jelinek wrote:\n\n> Hi!\n> \n> x86_64/ia32/aarch64 say padding bits of _BitInt values have unspecified\n> values, and until GCC 16 those were the only supported _BitInt targets.\n> In GCC 16, we've added _BitInt support for some further arches,\n> loongarch, riscv, s390x and arm and all of them chose to specify the\n> padding bits (require zero or sign extension depending on whether the\n> type is signed or unsigned).\n> s390x is big-endian, on the other side has abi_limb_mode the same as\n> limb_mode, so the extension is always just within the same limb.\n> loongarch chose to require weird extension, only within the same limb\n> but not abi limb, so the current extensions are also mostly ok.\n> riscv and arm both use abi_limb_mode larger than limb_)mode and require\n> extension, which means that say for _BitInt(513) one needs to sign extend\n> not just within the limb corresponding to bit 512 (32-bit on arm, 64-bit\n> on loongarch), but within the whole abi limb (64-bit on arm, 128-bit on\n> loongarch), which means when working with the usual limbs we need to\n> extend another whole 32-bit or 64-bit limb above the one we'd normally\n> extend.\n> \n> The following patch tweaks the bitint_info, so that it differentiates\n> between the different extension possibilities (x86_64/ia32/aarch64 0,\n> loongarch 1, arm/riscv 2, s390x doesn't really matter if 1 or 2, but\n> chose to document 2 and in gimple-lower-bitint.cc treat it as 1).\n> And then for a subset of lowerings handle it even for the\n> bitint_extended == 2 cases.\n> In particular, this patch handles the mergeable stmts (like +/- and many\n> others which walk from least significant limb to most significant limb\n> and can handle 2 limbs in a loop), including the separate_ext extension\n> (where a mergeable operation is then extended to much wider _BitInt,\n> handled by handling normally the mergeable operation, remembering if\n> we should zero or sign extend (and whether to 0 or -1) and then in a\n> separate loop or straight line code store the 0s or -1s), division/modulo\n> (these are done by forcing larger prec on the output, modulo result\n> should never be larger than the first operand and same sign, division\n> of negative minimum by -1 is UB and otherwise also should be never larger\n> than first operand), signed multiplication (again, done by extending\n> prec because signed multiplication overflow is UB), unsigned multiplication\n> (this one can't be handled that way because unsigned mult overflow wraps,\n> so we need to pass exact lhs prec, so the code stores zero limb when\n> needed), and conversions from floating point (binary or decimal) to _BitInt\n> (signed or unsigned), those again are supposed to store minimum or maximum\n> value on overflow and so lhs prec needs to be maintained, so the code\n> for unsigned result clears one limb when needed or for signed result\n> right shifts the second most significant limb by limb prec - 1 and stores\n> that into most significant limb.\n> \n> Bootstrapped/regtested on x86_64-linux, i686-linux, aarch64-linux and\n> s390x-linux, ok for trunk if somebody tests this on arm-linux-gnueabi or\n> riscv*-linux?\n\nOK, but can we use an enum for the extend type please?\n\nRichard.\n\n> Note, <<, >>, add/sub overflow and mul overflow at least aren't done in\n> this patch, to be resolved incrementally.\n> \n> 2026-04-15  Jakub Jelinek  <jakub@redhat.com>\n> \n> \tPR middle-end/123635\n> \t* target.h (struct bitint_info): Change extend type from bool\n> \tto unsigned char and document it.\n> \t* gimple-lower-bitint.cc (bitint_extended): Change type from bool\n> \tto unsigned char.\n> \t(bitint_precision_kind): Change bitint_extended to 1 from 2 if\n> \tlimb_mode is the same as abi_limb_mode.\n> \t(bitint_large_huge::limb_access_type): For bitint_extended == 2\n> \tallow access to the most significant limb solely with padding\n> \tbits if present.\n> \t(bitint_large_huge::lower_mergeable_stmt): Handle bitint_extended == 2\n> \textension if needed.\n> \t(bitint_large_huge::lower_muldiv_stmt): Likewise.\n> \t(bitint_large_huge::lower_float_conv_stmt): Likewise.\n> \t* config/aarch64/aarch64.cc (aarch64_bitint_type_info): Set\n> \tinfo->extended to 0 rather than false.\n> \t* config/arm/arm.cc (arm_bitint_type_info): Set\n> \tinfo->extended to 2 rather than true.\n> \t* config/i386/i386.cc (ix86_bitint_type_info): Set\n> \tinfo->extended to 0 rather than false.\n> \t* config/loongarch/loongarch.cc (loongarch_bitint_type_info): Set\n> \tinfo->extended to 1 rather than true.\n> \t* config/riscv/riscv.cc (riscv_bitint_type_info): Set\n> \tinfo->extended to 2 rather than true.\n> \t* config/s390/s390.cc (s390_bitint_type_info): Likewise.\n> \n> \t* gcc.dg/bitintext.h: Handle __riscv__ like __arm__.\n> \t* gcc.dg/torture/bitint-86.c: New test.\n> \t* gcc.dg/torture/bitint-87.c: New test.\n> \n> --- gcc/target.h.jj\t2026-03-27 10:17:14.548323983 +0100\n> +++ gcc/target.h\t2026-04-14 12:46:32.676679315 +0200\n> @@ -72,9 +72,13 @@ union cumulative_args_t { void *p; };\n>     as series of abi_limb_mode CEIL (N, GET_MODE_PRECISION (abi_limb_mode))\n>     limbs, ordered from least significant to most significant if !big_endian,\n>     otherwise from most significant to least significant.  If extended is\n> -   false, the bits above or equal to N are undefined when stored in a register\n> -   or memory, otherwise they are zero or sign extended depending on if\n> -   it is unsigned _BitInt(N) or _BitInt(N) / signed _BitInt(N).\n> +   0, the bits above or equal to N are undefined when stored in a register\n> +   or memory, if extended is 2, they are zero or sign extended depending on if\n> +   it is unsigned _BitInt(N) or _BitInt(N) / signed _BitInt(N), if extended is\n> +   1, then bits above or equal to N and below\n> +   M = CEIL (N, GET_MODE_PRECISION (limb_mode)) * GET_MODE_PRECISION (limb_mode)\n> +   are zero or sign extended as specified above and bits above or equal to M\n> +   are undefined.\n>     limb_mode is either the same as abi_limb_mode, or some narrower mode\n>     in which _BitInt lowering should actually perform operations in and\n>     what libgcc _BitInt helpers should use.\n> @@ -87,7 +91,7 @@ union cumulative_args_t { void *p; };\n>  struct bitint_info {\n>    machine_mode abi_limb_mode, limb_mode;\n>    bool big_endian;\n> -  bool extended;\n> +  unsigned char extended;\n>  };\n>  \n>  /* Types of memory operation understood by the \"by_pieces\" infrastructure.\n> --- gcc/gimple-lower-bitint.cc.jj\t2026-04-14 09:27:02.221287531 +0200\n> +++ gcc/gimple-lower-bitint.cc\t2026-04-14 18:45:43.191371265 +0200\n> @@ -77,7 +77,8 @@ enum bitint_prec_kind {\n>  \n>  static int small_max_prec, mid_min_prec, large_min_prec, huge_min_prec;\n>  static int limb_prec, abi_limb_prec;\n> -static bool bitint_big_endian, bitint_extended;\n> +static bool bitint_big_endian;\n> +static int bitint_extended;\n>  \n>  /* Categorize _BitInt(PREC) as small, middle, large or huge.  */\n>  \n> @@ -104,6 +105,8 @@ bitint_precision_kind (int prec)\n>      }\n>    bitint_big_endian = info.big_endian;\n>    bitint_extended = info.extended;\n> +  if (info.limb_mode == info.abi_limb_mode && bitint_extended == 2)\n> +    bitint_extended = 1;\n>    if (!large_min_prec\n>        && GET_MODE_PRECISION (limb_mode) <= MAX_FIXED_MODE_SIZE)\n>      large_min_prec = MAX_FIXED_MODE_SIZE + 1;\n> @@ -599,7 +602,11 @@ bitint_large_huge::limb_access_type (tre\n>      return m_limb_type;\n>    unsigned HOST_WIDE_INT i = tree_to_uhwi (idx);\n>    unsigned int prec = TYPE_PRECISION (type);\n> -  gcc_assert (i * limb_prec < prec);\n> +  gcc_assert (i * limb_prec < prec\n> +\t      || (bitint_extended == 2\n> +\t\t  && abi_limb_prec > limb_prec\n> +\t\t  && i * limb_prec\n> +\t\t     < CEIL (prec, abi_limb_prec) * abi_limb_prec));\n>    if (bitint_big_endian\n>        ? (i != 0 || (prec % limb_prec) == 0)\n>        : (i + 1) * limb_prec <= prec)\n> @@ -2870,6 +2877,16 @@ bitint_large_huge::lower_mergeable_stmt\n>      = (prec != (unsigned) TYPE_PRECISION (type)\n>         && (CEIL ((unsigned) TYPE_PRECISION (type), limb_prec)\n>  \t   > CEIL (prec, limb_prec)));\n> +  if (bitint_extended == 2\n> +      && !eq_p\n> +      && abi_limb_prec > limb_prec\n> +      && ((CEIL ((unsigned) TYPE_PRECISION (type), abi_limb_prec)\n> +\t   * abi_limb_prec / limb_prec) > CEIL (prec, limb_prec)))\n> +    {\n> +      if (prec == (unsigned) TYPE_PRECISION (type))\n> +\tsext = !TYPE_UNSIGNED (type);\n> +      separate_ext = true;\n> +    }\n>    unsigned dst_idx_off = 0;\n>    if (separate_ext && bitint_big_endian)\n>      dst_idx_off = (CEIL ((unsigned) TYPE_PRECISION (type), limb_prec)\n> @@ -3107,6 +3124,11 @@ bitint_large_huge::lower_mergeable_stmt\n>        kind = bitint_precision_kind (type);\n>        unsigned start = CEIL (prec, limb_prec);\n>        prec = TYPE_PRECISION (type);\n> +      if (bitint_extended == 2 && abi_limb_prec > limb_prec)\n> +\t{\n> +\t  prec = CEIL (prec, abi_limb_prec) * abi_limb_prec;\n> +\t  kind = bitint_precision_kind (prec);\n> +\t}\n>        unsigned total = CEIL (prec, limb_prec);\n>        idx = idx_first = idx_next = NULL_TREE;\n>        if (prec <= (start + 2 + (bo_shift != 0)) * limb_prec)\n> @@ -3964,6 +3986,7 @@ bitint_large_huge::lower_muldiv_stmt (tr\n>    gcc_assert (TREE_CODE (type) == BITINT_TYPE\n>  \t      && bitint_precision_kind (type) >= bitint_prec_large);\n>    int prec = TYPE_PRECISION (type), prec1, prec2;\n> +  bool zero_ms_limb = false;\n>    rhs1 = handle_operand_addr (rhs1, stmt, NULL, &prec1);\n>    rhs2 = handle_operand_addr (rhs2, stmt, NULL, &prec2);\n>    if (obj == NULL_TREE)\n> @@ -3979,6 +4002,18 @@ bitint_large_huge::lower_muldiv_stmt (tr\n>        lhs = force_gimple_operand_gsi (&m_gsi, lhs, true,\n>  \t\t\t\t      NULL_TREE, true, GSI_SAME_STMT);\n>      }\n> +  if (bitint_extended == 2\n> +      && abi_limb_prec > limb_prec\n> +      && (CEIL (prec, abi_limb_prec) * abi_limb_prec\n> +\t  > CEIL (prec, limb_prec) * limb_prec))\n> +    {\n> +      /* unsigned multiplication needs to wrap around, so we can't\n> +\t increase prec.  */\n> +      if (rhs_code == MULT_EXPR && TYPE_UNSIGNED (type))\n> +\tzero_ms_limb = true;\n> +      else\n> +\tprec = CEIL (prec, abi_limb_prec) * abi_limb_prec;\n> +    }\n>    tree sitype = lang_hooks.types.type_for_mode (SImode, 0);\n>    gimple *g;\n>    switch (rhs_code)\n> @@ -4032,6 +4067,13 @@ bitint_large_huge::lower_muldiv_stmt (tr\n>  \t  add_eh_edge (e2->src, e1);\n>  \t}\n>      }\n> +  if (zero_ms_limb)\n> +    {\n> +      unsigned int i = CEIL (prec, abi_limb_prec) * abi_limb_prec / limb_prec;\n> +      g = gimple_build_assign (limb_access (type, obj, size_int (i - 1), true),\n> +\t\t\t       build_zero_cst (m_limb_type));\n> +      insert_before (g);\n> +    }\n>  }\n>  \n>  /* Lower large/huge _BitInt conversion to/from floating point.  */\n> @@ -4046,8 +4088,15 @@ bitint_large_huge::lower_float_conv_stmt\n>    gimple *g;\n>    if (rhs_code == FIX_TRUNC_EXPR)\n>      {\n> -      int prec = TYPE_PRECISION (TREE_TYPE (lhs));\n> -      if (!TYPE_UNSIGNED (TREE_TYPE (lhs)))\n> +      tree type = TREE_TYPE (lhs);\n> +      int prec = TYPE_PRECISION (type);\n> +      bool extend_ms_limb = false;\n> +      if (bitint_extended == 2\n> +\t  && abi_limb_prec > limb_prec\n> +\t  && (CEIL (prec, abi_limb_prec) * abi_limb_prec\n> +\t      > CEIL (prec, limb_prec) * limb_prec))\n> +\textend_ms_limb = true;\n> +      if (!TYPE_UNSIGNED (type))\n>  \tprec = -prec;\n>        if (obj == NULL_TREE)\n>  \t{\n> @@ -4081,6 +4130,32 @@ bitint_large_huge::lower_float_conv_stmt\n>  \t\t\t\t      lhs, build_int_cst (sitype, prec),\n>  \t\t\t\t      rhs1);\n>        insert_before (g);\n> +      if (extend_ms_limb)\n> +\t{\n> +\t  unsigned int i\n> +\t    = (CEIL (prec < 0 ? -prec : prec, abi_limb_prec)\n> +\t       * abi_limb_prec / limb_prec);\n> +\t  tree val;\n> +\t  if (prec < 0)\n> +\t    {\n> +\t      g = gimple_build_assign (make_ssa_name (m_limb_type),\n> +\t\t\t\t       limb_access (type, obj,\n> +\t\t\t\t\t\t    size_int (i - 2),\n> +\t\t\t\t\t\t    true));\n> +\t      insert_before (g);\n> +\t      g = gimple_build_assign (make_ssa_name (m_limb_type),\n> +\t\t\t\t       RSHIFT_EXPR, gimple_assign_lhs (g),\n> +\t\t\t\t       build_int_cst (unsigned_type_node,\n> +\t\t\t\t\t\t      limb_prec - 1));\n> +\t      insert_before (g);\n> +\t      val = gimple_assign_lhs (g);\n> +\t    }\n> +\t  else\n> +\t    val = build_zero_cst (m_limb_type);\n> +\t  g = gimple_build_assign (limb_access (type, obj, size_int (i - 1),\n> +\t\t\t\t\t\ttrue), val);\n> +\t  insert_before (g);\n> +\t}\n>      }\n>    else\n>      {\n> --- gcc/config/aarch64/aarch64.cc.jj\t2026-04-10 08:45:20.699812103 +0200\n> +++ gcc/config/aarch64/aarch64.cc\t2026-04-14 13:05:23.358474454 +0200\n> @@ -30497,7 +30497,7 @@ aarch64_bitint_type_info (int n, struct\n>    else\n>      info->abi_limb_mode = info->limb_mode;\n>    info->big_endian = TARGET_BIG_END;\n> -  info->extended = false;\n> +  info->extended = 0;\n>    return true;\n>  }\n>  \n> --- gcc/config/arm/arm.cc.jj\t2026-03-30 11:56:53.023841345 +0200\n> +++ gcc/config/arm/arm.cc\t2026-04-14 13:05:31.620334159 +0200\n> @@ -35933,7 +35933,7 @@ arm_bitint_type_info (int n, struct biti\n>    else\n>      info->abi_limb_mode = info->limb_mode;\n>    info->big_endian = TARGET_BIG_END;\n> -  info->extended = true;\n> +  info->extended = 2;\n>    return true;\n>  }\n>  \n> --- gcc/config/i386/i386.cc.jj\t2026-04-14 08:39:48.626636548 +0200\n> +++ gcc/config/i386/i386.cc\t2026-04-14 13:05:37.917227233 +0200\n> @@ -27719,7 +27719,7 @@ ix86_bitint_type_info (int n, struct bit\n>      info->limb_mode = DImode;\n>    info->abi_limb_mode = info->limb_mode;\n>    info->big_endian = false;\n> -  info->extended = false;\n> +  info->extended = 0;\n>    return true;\n>  }\n>  \n> --- gcc/config/loongarch/loongarch.cc.jj\t2026-04-02 14:18:31.926538351 +0200\n> +++ gcc/config/loongarch/loongarch.cc\t2026-04-14 13:05:41.762161943 +0200\n> @@ -11391,7 +11391,7 @@ loongarch_bitint_type_info (int n, struc\n>      info->abi_limb_mode = TImode;\n>  \n>    info->big_endian = false;\n> -  info->extended = true;\n> +  info->extended = 1;\n>    return true;\n>  }\n>  \n> --- gcc/config/riscv/riscv.cc.jj\t2026-04-10 08:45:20.701812067 +0200\n> +++ gcc/config/riscv/riscv.cc\t2026-04-14 13:05:46.023089589 +0200\n> @@ -14926,7 +14926,7 @@ riscv_bitint_type_info (int n, struct bi\n>      info->abi_limb_mode = DImode;\n>  \n>    info->big_endian = TARGET_BIG_ENDIAN;\n> -  info->extended = true;\n> +  info->extended = 2;\n>    return true;\n>  }\n>  \n> --- gcc/config/s390/s390.cc.jj\t2026-04-01 19:09:38.325343788 +0200\n> +++ gcc/config/s390/s390.cc\t2026-04-14 13:05:49.527030090 +0200\n> @@ -18851,7 +18851,7 @@ s390_bitint_type_info (int n, struct bit\n>      info->limb_mode = DImode;\n>    info->abi_limb_mode = info->limb_mode;\n>    info->big_endian = true;\n> -  info->extended = true;\n> +  info->extended = 2;\n>    return true;\n>  }\n>  \n> --- gcc/testsuite/gcc.dg/bitintext.h.jj\t2026-03-27 10:17:16.871286076 +0100\n> +++ gcc/testsuite/gcc.dg/bitintext.h\t2026-04-14 12:26:15.243964985 +0200\n> @@ -16,7 +16,7 @@ do_copy (void *p, const void *q, __SIZE_\n>  #define CEIL(x,y) (((x) + (y) - 1) / (y))\n>  \n>  /* Promote a _BitInt type to include its padding bits.  */\n> -#if defined (__s390x__) || defined(__arm__)\n> +#if defined (__s390x__) || defined(__arm__) || defined(__riscv__)\n>  #define PROMOTED_SIZE(x) sizeof (x)\n>  #elif defined(__loongarch__)\n>  #define PROMOTED_SIZE(x) (sizeof (x) > 8 ? CEIL (S (x), 64) * 8 : sizeof (x))\n> @@ -24,7 +24,8 @@ do_copy (void *p, const void *q, __SIZE_\n>  \n>  /* Macro to test whether (on targets where psABI requires it) _BitInt\n>     with padding bits have those filled with sign or zero extension.  */\n> -#if defined(__s390x__) || defined(__arm__) || defined(__loongarch__)\n> +#if defined(__s390x__) || defined(__arm__) || defined(__loongarch__) \\\n> +    || defined(__riscv__)\n>  #define BEXTC1(x, uns) \\\n>    do {\t\t\t\t\t\t\t  \\\n>      uns _BitInt(PROMOTED_SIZE (x) * __CHAR_BIT__) __x;\t  \\\n> --- gcc/testsuite/gcc.dg/torture/bitint-86.c.jj\t2026-04-14 13:52:03.448042878 +0200\n> +++ gcc/testsuite/gcc.dg/torture/bitint-86.c\t2026-04-14 15:49:40.833426638 +0200\n> @@ -0,0 +1,96 @@\n> +/* PR middle-end/123635 */\n> +/* { dg-do run { target bitint } } */\n> +/* { dg-require-effective-target sync_char_short } */\n> +/* { dg-options \"-std=c23 -pedantic-errors\" } */\n> +/* { dg-skip-if \"\" { ! run_expensive_tests }  { \"*\" } { \"-O0\" \"-O2\" } } */\n> +/* { dg-skip-if \"\" { ! run_expensive_tests } { \"-flto\" } { \"\" } } */\n> +\n> +#if __BITINT_MAXWIDTH__ >= 1025\n> +_BitInt(513) a, b, c, d;\n> +unsigned _BitInt(513) e, f, g, h;\n> +_BitInt(1025) i, j, k, l;\n> +unsigned _BitInt(1025) m, n, o, p;\n> +#endif\n> +\n> +#include \"../bitintext.h\"\n> +\n> +#if __BITINT_MAXWIDTH__ >= 1025\n> +[[gnu::noipa]] void\n> +f1 (_BitInt(513) q, _BitInt(513) r, _BitInt(513) s,\n> +    unsigned _BitInt(513) t, unsigned _BitInt(513) u, unsigned _BitInt(513) v)\n> +{\n> +  a = q + r;\n> +  BEXTC (a);\n> +  b = r + s;\n> +  BEXTC (b);\n> +  c = q - r;\n> +  BEXTC (c);\n> +  d = q - s;\n> +  BEXTC (d);\n> +  e = t + u;\n> +  BEXTC (e);\n> +  f = u + v;\n> +  BEXTC (f);\n> +  g = t - u;\n> +  BEXTC (g);\n> +  h = t - v;\n> +  BEXTC (h);\n> +}\n> +\n> +[[gnu::noipa]] void\n> +f2 (_BitInt(513) q, _BitInt(513) r, _BitInt(513) s,\n> +    unsigned _BitInt(513) t, unsigned _BitInt(513) u, unsigned _BitInt(513) v)\n> +{\n> +  i = q + r;\n> +  BEXTC (i);\n> +  j = r + s;\n> +  BEXTC (j);\n> +  k = q - r;\n> +  BEXTC (k);\n> +  l = q - s;\n> +  BEXTC (l);\n> +  m = t + u;\n> +  BEXTC (m);\n> +  n = u + v;\n> +  BEXTC (n);\n> +  o = t - u;\n> +  BEXTC (o);\n> +  p = t - v;\n> +  BEXTC (p);\n> +}\n> +#endif\n> +\n> +int\n> +main ()\n> +{\n> +#if __BITINT_MAXWIDTH__ >= 1025\n> +  __builtin_memset (&a, 0x55, sizeof (a));\n> +  __builtin_memset (&b, 0xaa, sizeof (b));\n> +  __builtin_memset (&c, 0x55, sizeof (c));\n> +  __builtin_memset (&d, 0xaa, sizeof (d));\n> +  __builtin_memset (&e, 0x55, sizeof (e));\n> +  __builtin_memset (&f, 0xaa, sizeof (f));\n> +  __builtin_memset (&g, 0x55, sizeof (g));\n> +  __builtin_memset (&h, 0xaa, sizeof (h));\n> +  f1 (-2639616085193412675089727272130019765984398127278861998378045997173219392866835944828454559654047247059773556852593471531433454810831298259785611283536204wb,\n> +      -7234121192495298112713936268702056205915537824658323839255206188456944966709752205781440683757949161649123152428620619997014209098183677328840647884700332wb,\n> +      8654283549227219676537451326576929768614001427323560383705131223498505581982738964879437520020436012891649083646965651378407397436785749860023553778646861wb,\n> +      15046745594550617619205422464231805109110883864578289024439083517871820578179553927615539526791313634437787081814763432804808038115388367331529035246240655uwb,\n> +      20633637828717837096174917874088391607464281656818868213468970773994599068609617673436080725569780340050358299419252926775025136778754971701553110169281151uwb,\n> +      513612209045189503622076474995216606086383139671427104179978688982034117764664711277072795083902951564358998498109412142322138933760173628255697435284781uwb);\n> +  __builtin_memset (&i, 0x55, sizeof (i));\n> +  __builtin_memset (&j, 0xaa, sizeof (j));\n> +  __builtin_memset (&k, 0x55, sizeof (k));\n> +  __builtin_memset (&l, 0xaa, sizeof (l));\n> +  __builtin_memset (&m, 0x55, sizeof (m));\n> +  __builtin_memset (&n, 0xaa, sizeof (n));\n> +  __builtin_memset (&o, 0x55, sizeof (o));\n> +  __builtin_memset (&p, 0xaa, sizeof (p));\n> +  f2 (-2639616085193412675089727272130019765984398127278861998378045997173219392866835944828454559654047247059773556852593471531433454810831298259785611283536204wb,\n> +      -7234121192495298112713936268702056205915537824658323839255206188456944966709752205781440683757949161649123152428620619997014209098183677328840647884700332wb,\n> +      8654283549227219676537451326576929768614001427323560383705131223498505581982738964879437520020436012891649083646965651378407397436785749860023553778646861wb,\n> +      15046745594550617619205422464231805109110883864578289024439083517871820578179553927615539526791313634437787081814763432804808038115388367331529035246240655uwb,\n> +      20633637828717837096174917874088391607464281656818868213468970773994599068609617673436080725569780340050358299419252926775025136778754971701553110169281151uwb,\n> +      513612209045189503622076474995216606086383139671427104179978688982034117764664711277072795083902951564358998498109412142322138933760173628255697435284781uwb);\n> +#endif\n> +}\n> --- gcc/testsuite/gcc.dg/torture/bitint-87.c.jj\t2026-04-14 15:48:02.591099982 +0200\n> +++ gcc/testsuite/gcc.dg/torture/bitint-87.c\t2026-04-14 15:56:45.479193714 +0200\n> @@ -0,0 +1,85 @@\n> +/* PR middle-end/123635 */\n> +/* { dg-do run { target bitint } } */\n> +/* { dg-require-effective-target sync_char_short } */\n> +/* { dg-options \"-std=c23 -pedantic-errors\" } */\n> +/* { dg-skip-if \"\" { ! run_expensive_tests }  { \"*\" } { \"-O0\" \"-O2\" } } */\n> +/* { dg-skip-if \"\" { ! run_expensive_tests } { \"-flto\" } { \"\" } } */\n> +\n> +#if __BITINT_MAXWIDTH__ >= 513\n> +_BitInt(513) a, b, c, d;\n> +unsigned _BitInt(513) e, f, g, h;\n> +_BitInt(513) i, j, k;\n> +unsigned _BitInt(513) l, m, n;\n> +#endif\n> +\n> +#include \"../bitintext.h\"\n> +\n> +#if __BITINT_MAXWIDTH__ >= 513\n> +[[gnu::noipa]] void\n> +f1 (_BitInt(513) q, _BitInt(513) r, _BitInt(513) s,\n> +    unsigned _BitInt(513) t, unsigned _BitInt(513) u, unsigned _BitInt(513) v)\n> +{\n> +  a = q * r;\n> +  BEXTC (a);\n> +  b = r * s;\n> +  BEXTC (b);\n> +  c = q / r;\n> +  BEXTC (c);\n> +  d = q / s;\n> +  BEXTC (d);\n> +  e = t * u;\n> +  BEXTC (e);\n> +  f = u * v;\n> +  BEXTC (f);\n> +  g = t / u;\n> +  BEXTC (g);\n> +  h = t / v;\n> +  BEXTC (h);\n> +}\n> +\n> +[[gnu::noipa]] void\n> +f2 (float q, double r, long double s, float t, double u, long double v)\n> +{\n> +  i = q;\n> +  BEXTC (i);\n> +  j = r;\n> +  BEXTC (j);\n> +  k = s;\n> +  BEXTC (k);\n> +  l = t;\n> +  BEXTC (l);\n> +  m = u;\n> +  BEXTC (m);\n> +  n = v;\n> +  BEXTC (n);\n> +}\n> +#endif\n> +\n> +int\n> +main ()\n> +{\n> +#if __BITINT_MAXWIDTH__ >= 513\n> +  __builtin_memset (&a, 0x55, sizeof (a));\n> +  __builtin_memset (&b, 0xaa, sizeof (b));\n> +  __builtin_memset (&c, 0x55, sizeof (c));\n> +  __builtin_memset (&d, 0xaa, sizeof (d));\n> +  __builtin_memset (&e, 0x55, sizeof (e));\n> +  __builtin_memset (&f, 0xaa, sizeof (f));\n> +  __builtin_memset (&g, 0x55, sizeof (g));\n> +  __builtin_memset (&h, 0xaa, sizeof (h));\n> +  f1 (-53323980256963787505256507743137477556434962931963225515943461794698643113423wb,\n> +      -10076482373458251489901780456236592759327822657780415144730546867053397315531wb,\n> +      9430367348600775477158545473775377451258484445522540280907903691748059121081wb,\n> +      15046745594550617619205422464231805109110883864578289024439083517871820578179553927615539526791313634437787081814763432804808038115388367331529035246240655uwb,\n> +      20633637828717837096174917874088391607464281656818868213468970773994599068609617673436080725569780340050358299419252926775025136778754971701553110169281uwb,\n> +      5136122090451895036220764749952166060863831396714271041799786889820341177646647112770727950839029515643589984981094121423221389337601736282556974uwb);\n> +  __builtin_memset (&i, 0x55, sizeof (i));\n> +  __builtin_memset (&j, 0xaa, sizeof (j));\n> +  __builtin_memset (&k, 0x55, sizeof (k));\n> +  __builtin_memset (&l, 0xaa, sizeof (l));\n> +  __builtin_memset (&m, 0x55, sizeof (m));\n> +  __builtin_memset (&n, 0xaa, sizeof (n));\n> +  f2 (12345678.5f, -234567891234567.125, 123465987893275.53244532L,\n> +      12345678.5f, 234567891234567.125, 123465987893275.53244532L);\n> +#endif\n> +}\n> \n> \tJakub\n> \n>","headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256\n header.s=susede2_rsa header.b=Ilbx4irK;\n\tdkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=iy90FRwS;\n\tdkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de\n header.a=rsa-sha256 header.s=susede2_rsa header.b=Ilbx4irK;\n\tdkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=iy90FRwS;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256\n header.s=susede2_rsa header.b=Ilbx4irK;\n\tdkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=iy90FRwS;\n\tdkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de\n header.a=rsa-sha256 header.s=susede2_rsa header.b=Ilbx4irK;\n\tdkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=iy90FRwS","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=suse.de","sourceware.org; spf=pass smtp.mailfrom=suse.de","server2.sourceware.org;\n arc=none smtp.remote-ip=195.135.223.131","smtp-out2.suse.de;\n\tnone"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fwdby3KTHz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 21:05:50 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 952504BA2E17\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 11:05:48 +0000 (GMT)","from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131])\n by sourceware.org (Postfix) with ESMTPS id A75814BA540B\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 11:05:18 +0000 (GMT)","from murzim.nue2.suse.org (unknown [10.168.4.243])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by smtp-out2.suse.de (Postfix) with ESMTPS id 8EF1A5BE1B;\n Wed, 15 Apr 2026 11:05:17 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 952504BA2E17","OpenDKIM Filter v2.11.0 sourceware.org A75814BA540B"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org A75814BA540B","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org A75814BA540B","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776251118; cv=none;\n b=lhAyNDid71wYBS8KF7PbzOelwwQe92DV09fVV+f8b89SfukfRtzhMOwpJCJNaZumI6xkgIIhGrGhAJpPeXDnEUjf3mE/X3XYFUmmWPFI8o8UZPbBYgVqbNzYY0Z22bm4xUyIBruPgA3M/9jqiyPjUajpu0LvRS/dMqeGMYDC3cU=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776251118; c=relaxed/simple;\n bh=BwtGrH3S2kX4St3gS+pC2d04MJyoU6kYtQctyQP8eWI=;\n h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:Date:\n From:To:Subject:Message-ID:MIME-Version;\n b=TDi0EIW19RKOmvoPpYPQ1hBJZfezZE0q4ZTQXY1cmcNmM0hn6QLmZCmHxD13QPlf8EN8XnWi6o8zGDus3duFQA91jQLPBsY215nGOsT8W6E0UrqMCjnUVaMWSyyHtgxH/X0o+8XERGZ6Mt+qIAEhCI8TKq5j/5iMpMyWJjDXchE=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1776251117;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=XgkOQ096lPI94cG0JAJ49v10LDQ0eHHQYIpeJUzkvKg=;\n b=Ilbx4irKjPUWIylSJZsYJQuc75XGFY5/IiMfWutM87U2kh7GCtK4pg0SAqJNe6V2x2LQpk\n zNe2zKRpTfRyboj5Ct5UDchKolFLJ0q0yy5NbSj3y9OXo+xHduBGECHdmh1yKOGfN9S7XF\n +57Z0mIC2VWokNZbjK3S940tgTev3mo=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1776251117;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=XgkOQ096lPI94cG0JAJ49v10LDQ0eHHQYIpeJUzkvKg=;\n b=iy90FRwScybb4/D7NfRo8N6Z45fm+8solr4qHU4Vv+EElI4YoA63SHIVnNCLPr9b57CBaS\n 83YDUIt6ARrT/xBQ==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1776251117;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=XgkOQ096lPI94cG0JAJ49v10LDQ0eHHQYIpeJUzkvKg=;\n b=Ilbx4irKjPUWIylSJZsYJQuc75XGFY5/IiMfWutM87U2kh7GCtK4pg0SAqJNe6V2x2LQpk\n zNe2zKRpTfRyboj5Ct5UDchKolFLJ0q0yy5NbSj3y9OXo+xHduBGECHdmh1yKOGfN9S7XF\n +57Z0mIC2VWokNZbjK3S940tgTev3mo=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1776251117;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=XgkOQ096lPI94cG0JAJ49v10LDQ0eHHQYIpeJUzkvKg=;\n b=iy90FRwScybb4/D7NfRo8N6Z45fm+8solr4qHU4Vv+EElI4YoA63SHIVnNCLPr9b57CBaS\n 83YDUIt6ARrT/xBQ=="],"Date":"Wed, 15 Apr 2026 13:05:17 +0200 (CEST)","From":"Richard Biener <rguenther@suse.de>","To":"Jakub Jelinek <jakub@redhat.com>","cc":"gcc-patches@gcc.gnu.org,\n Andre Simoes Dias Vieira <Andre.SimoesDiasVieira@arm.com>,\n Palmer Dabbelt <palmer@dabbelt.com>, Robin Dapp <rdapp.gcc@gmail.com>","Subject":"Re: [PATCH] bitintlower: Padding bit fixes, part 1 [PR123635]","In-Reply-To":"<ad9geEOhFRyA9Fwq@tucnak>","Message-ID":"<11po881q-qrq7-q160-958o-5qs7po1os88q@fhfr.qr>","References":"<ad9geEOhFRyA9Fwq@tucnak>","MIME-Version":"1.0","Content-Type":"text/plain; charset=US-ASCII","X-Spamd-Result":"default: False [-2.80 / 50.00]; BAYES_HAM(-3.00)[100.00%];\n SUSPICIOUS_RECIPS(1.50)[]; NEURAL_HAM_LONG(-1.00)[-1.000];\n NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain];\n FUZZY_RATELIMITED(0.00)[rspamd.com]; ARC_NA(0.00)[];\n MIME_TRACE(0.00)[0:+]; TO_DN_SOME(0.00)[];\n MISSING_XM_UA(0.00)[]; TAGGED_RCPT(0.00)[];\n FREEMAIL_ENVRCPT(0.00)[gmail.com]; RCPT_COUNT_FIVE(0.00)[5];\n FROM_HAS_DN(0.00)[];\n FREEMAIL_CC(0.00)[gcc.gnu.org,arm.com,dabbelt.com,gmail.com];\n RCVD_COUNT_ZERO(0.00)[0]; FROM_EQ_ENVFROM(0.00)[];\n DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n TO_MATCH_ENVRCPT_ALL(0.00)[];\n DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:email]","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"}}]