On Wed, Feb 8, 2023 at 10:15 PM Andrew Pinski via Gcc-patches
<[email protected]> wrote:
>
> The same problem as PR 88739 has crept in but
> this time in match.pd when simplifying bit_field_ref of
> an bit_insert. That is we are generating a BIT_FIELD_REF
> of a non-mode-precision integral type.
>
> OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
Hmm. Can we handle the case of the extraction exactly covering the
insertion separately then and simplify to plain @1?
Thanks,
Richard.
> PR tree-optimization/108688
>
> gcc/ChangeLog:
>
> * match.pd (bit_field_ref [bit_insert]):
> Avoid generating BIT_FIELD_REFs of non-mode-precision
> integral operands
>
> gcc/testsuite/ChangeLog:
>
> * gcc.c-torture/compile/pr108688-1.c: New test.
> ---
> gcc/match.pd | 4 +++-
> gcc/testsuite/gcc.c-torture/compile/pr108688-1.c | 15 +++++++++++++++
> 2 files changed, 18 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr108688-1.c
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index c9e8bebede2..d8353072822 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -7487,7 +7487,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> isize = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (@1)));
> }
> (switch
> - (if (wi::leu_p (wi::to_wide (@ipos), wi::to_wide (@rpos))
> + (if ((!INTEGRAL_TYPE_P (TREE_TYPE (@1))
> + || type_has_mode_precision_p (TREE_TYPE (@1)))
> + && wi::leu_p (wi::to_wide (@ipos), wi::to_wide (@rpos))
> && wi::leu_p (wi::to_wide (@rpos) + wi::to_wide (@rsize),
> wi::to_wide (@ipos) + isize))
> (BIT_FIELD_REF @1 @rsize { wide_int_to_tree (bitsizetype,
> diff --git a/gcc/testsuite/gcc.c-torture/compile/pr108688-1.c
> b/gcc/testsuite/gcc.c-torture/compile/pr108688-1.c
> new file mode 100644
> index 00000000000..43d782d62bd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.c-torture/compile/pr108688-1.c
> @@ -0,0 +1,15 @@
> +
> +
> +union U { signed int d : 7; signed int e : 2; } u;
> +int a, b;
> +
> +void
> +foo (void)
> +{
> + for (int i = 0; i < 64; i++)
> + {
> + u.d = a;
> + u.e ^= b;
> + }
> +}
> +
> --
> 2.17.1
>