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)