On Wed, Feb 8, 2023 at 10:15 PM Andrew Pinski via Gcc-patches <gcc-patches@gcc.gnu.org> 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 >