On Wed, 20 Sep 2023, Jakub Jelinek wrote:

> Hi!
> 
> On Tue, Sep 19, 2023 at 05:50:59PM +0100, Richard Sandiford wrote:
> > How about using MAX_FIXED_MODE_SIZE for things like this?
> 
> Seems like a good idea.
> 
> The following patch does that.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 2023-09-20  Jakub Jelinek  <ja...@redhat.com>
> 
>       * match.pd ((x << c) >> c): Use MAX_FIXED_MODE_SIZE instead of
>       GET_MODE_PRECISION of TImode or DImode depending on whether
>       TImode is supported scalar mode.
>       * gimple-lower-bitint.cc (bitint_precision_kind): Likewise.
>       * expr.cc (expand_expr_real_1): Likewise.
>       * tree-ssa-sccvn.cc (eliminate_dom_walker::eliminate_stmt): Likewise.
>       * ubsan.cc (ubsan_encode_value, ubsan_type_descriptor): Likewise.
> 
> --- gcc/match.pd.jj   2023-09-19 19:47:23.969430272 +0200
> +++ gcc/match.pd      2023-09-19 20:08:17.341559409 +0200
> @@ -4124,9 +4124,7 @@ (define_operator_list SYNC_FETCH_AND_AND
>      (with {
>        int width = element_precision (type) - tree_to_uhwi (@1);
>        tree stype = NULL_TREE;
> -      scalar_int_mode mode = (targetm.scalar_mode_supported_p (TImode)
> -                           ? TImode : DImode);
> -      if (width <= GET_MODE_PRECISION (mode))
> +      if (width <= MAX_FIXED_MODE_SIZE)
>       stype = build_nonstandard_integer_type (width, 0);
>       }
>       (if (stype && (width == 1 || type_has_mode_precision_p (stype)))
> --- gcc/gimple-lower-bitint.cc.jj     2023-09-08 11:29:20.105768005 +0200
> +++ gcc/gimple-lower-bitint.cc        2023-09-19 20:01:50.927782331 +0200
> @@ -100,21 +100,19 @@ bitint_precision_kind (int prec)
>        small_max_prec = prec;
>        return bitint_prec_small;
>      }
> -  scalar_int_mode arith_mode = (targetm.scalar_mode_supported_p (TImode)
> -                             ? TImode : DImode);
>    if (!large_min_prec
> -      && GET_MODE_PRECISION (arith_mode) > GET_MODE_PRECISION (limb_mode))
> -    large_min_prec = GET_MODE_PRECISION (arith_mode) + 1;
> +      && GET_MODE_PRECISION (limb_mode) < MAX_FIXED_MODE_SIZE)
> +    large_min_prec = MAX_FIXED_MODE_SIZE + 1;
>    if (!limb_prec)
>      limb_prec = GET_MODE_PRECISION (limb_mode);
>    if (!huge_min_prec)
>      {
> -      if (4 * limb_prec >= GET_MODE_PRECISION (arith_mode))
> +      if (4 * limb_prec >= MAX_FIXED_MODE_SIZE)
>       huge_min_prec = 4 * limb_prec;
>        else
> -     huge_min_prec = GET_MODE_PRECISION (arith_mode) + 1;
> +     huge_min_prec = MAX_FIXED_MODE_SIZE + 1;
>      }
> -  if (prec <= GET_MODE_PRECISION (arith_mode))
> +  if (prec <= MAX_FIXED_MODE_SIZE)
>      {
>        if (!mid_min_prec || prec < mid_min_prec)
>       mid_min_prec = prec;
> --- gcc/expr.cc.jj    2023-09-08 11:29:20.101768059 +0200
> +++ gcc/expr.cc       2023-09-19 20:00:12.788108832 +0200
> @@ -11044,17 +11044,11 @@ expand_expr_real_1 (tree exp, rtx target
>           scalar_int_mode limb_mode
>             = as_a <scalar_int_mode> (info.limb_mode);
>           unsigned int limb_prec = GET_MODE_PRECISION (limb_mode);
> -         if (prec > limb_prec)
> +         if (prec > limb_prec && prec > MAX_FIXED_MODE_SIZE)
>             {
> -             scalar_int_mode arith_mode
> -               = (targetm.scalar_mode_supported_p (TImode)
> -                  ? TImode : DImode);
> -             if (prec > GET_MODE_PRECISION (arith_mode))
> -               {
> -                 /* Emit large/huge _BitInt INTEGER_CSTs into memory.  */
> -                 exp = tree_output_constant_def (exp);
> -                 return expand_expr (exp, target, VOIDmode, modifier);
> -               }
> +             /* Emit large/huge _BitInt INTEGER_CSTs into memory.  */
> +             exp = tree_output_constant_def (exp);
> +             return expand_expr (exp, target, VOIDmode, modifier);
>             }
>         }
>  
> --- gcc/tree-ssa-sccvn.cc.jj  2023-09-18 15:14:48.987358112 +0200
> +++ gcc/tree-ssa-sccvn.cc     2023-09-19 20:02:53.160941163 +0200
> @@ -7004,10 +7004,7 @@ eliminate_dom_walker::eliminate_stmt (ba
>         && !type_has_mode_precision_p (TREE_TYPE (lhs)))
>       {
>         if (TREE_CODE (TREE_TYPE (lhs)) == BITINT_TYPE
> -           && (TYPE_PRECISION (TREE_TYPE (lhs))
> -               > (targetm.scalar_mode_supported_p (TImode)
> -                  ? GET_MODE_PRECISION (TImode)
> -                  : GET_MODE_PRECISION (DImode))))
> +           && TYPE_PRECISION (TREE_TYPE (lhs)) > MAX_FIXED_MODE_SIZE)
>           lookup_lhs = NULL_TREE;
>         else if (TREE_CODE (lhs) == COMPONENT_REF
>                  || TREE_CODE (lhs) == MEM_REF)
> --- gcc/ubsan.cc.jj   2023-09-08 11:29:20.136767581 +0200
> +++ gcc/ubsan.cc      2023-09-19 20:06:56.118657251 +0200
> @@ -136,13 +136,10 @@ ubsan_encode_value (tree t, enum ubsan_e
>       }
>        else
>       {
> -       scalar_int_mode arith_mode
> -         = (targetm.scalar_mode_supported_p (TImode) ? TImode : DImode);
> -       if (TYPE_PRECISION (type) > GET_MODE_PRECISION (arith_mode))
> +       if (TYPE_PRECISION (type) > MAX_FIXED_MODE_SIZE)
>           return build_zero_cst (pointer_sized_int_node);
> -       type
> -         = build_nonstandard_integer_type (GET_MODE_PRECISION (arith_mode),
> -                                           TYPE_UNSIGNED (type));
> +       type = build_nonstandard_integer_type (MAX_FIXED_MODE_SIZE,
> +                                              TYPE_UNSIGNED (type));
>         t = fold_build1 (NOP_EXPR, type, t);
>       }
>      }
> @@ -381,14 +378,9 @@ ubsan_type_descriptor (tree type, enum u
>      {
>        /* Temporary hack for -fsanitize=shift with _BitInt(129) and more.
>        libubsan crashes if it is not TK_Integer type.  */
> -      if (TREE_CODE (type) == BITINT_TYPE)
> -     {
> -       scalar_int_mode arith_mode
> -         = (targetm.scalar_mode_supported_p (TImode)
> -            ? TImode : DImode);
> -       if (TYPE_PRECISION (type) > GET_MODE_PRECISION (arith_mode))
> -         type3 = build_qualified_type (type, TYPE_QUAL_CONST);
> -     }
> +      if (TREE_CODE (type) == BITINT_TYPE
> +       && TYPE_PRECISION (type) > MAX_FIXED_MODE_SIZE)
> +     type3 = build_qualified_type (type, TYPE_QUAL_CONST);
>        if (type3 == type)
>       pstyle = UBSAN_PRINT_NORMAL;
>      }
> @@ -523,16 +515,10 @@ ubsan_type_descriptor (tree type, enum u
>        tkind = 0x0000;
>        break;
>      case BITINT_TYPE:
> -      {
> -     /* FIXME: libubsan right now only supports _BitInts which
> -        fit into DImode or TImode.  */
> -     scalar_int_mode arith_mode = (targetm.scalar_mode_supported_p (TImode)
> -                                   ? TImode : DImode);
> -     if (TYPE_PRECISION (eltype) <= GET_MODE_PRECISION (arith_mode))
> -       tkind = 0x0000;
> -     else
> -       tkind = 0xffff;
> -      }
> +      if (TYPE_PRECISION (eltype) <= MAX_FIXED_MODE_SIZE)
> +     tkind = 0x0000;
> +      else
> +     tkind = 0xffff;
>        break;
>      case REAL_TYPE:
>        /* FIXME: libubsan right now only supports float, double and
> @@ -553,9 +539,7 @@ ubsan_type_descriptor (tree type, enum u
>    if (pstyle == UBSAN_PRINT_FORCE_INT)
>      {
>        tkind = 0x0000;
> -      scalar_int_mode arith_mode = (targetm.scalar_mode_supported_p (TImode)
> -                                 ? TImode : DImode);
> -      tree t = lang_hooks.types.type_for_mode (arith_mode,
> +      tree t = build_nonstandard_integer_type (MAX_FIXED_MODE_SIZE,
>                                              TYPE_UNSIGNED (eltype));
>        tinfo = get_ubsan_type_info_for_type (t);
>      }
> 
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to