middle-end: use MAX_FIXED_MODE_SIZE instead of precidion of TImode/DImode
Checks
Commit Message
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?
2023-09-20 Jakub Jelinek <jakub@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.
Jakub
Comments
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 <jakub@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
>
>
@@ -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)))
@@ -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;
@@ -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);
}
}
@@ -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)
@@ -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);
}