> Am 25.02.2022 um 18:58 schrieb Jakub Jelinek via Gcc-patches > <gcc-patches@gcc.gnu.org>: > > Hi! > > Mark mentioned in the PR further 2 simplifications that also ICE > with complex types. > For these, eventually (but IMO GCC 13 materials) we could support it > for vector types if it would be uniform vector constants. > Currently integer_pow2p is true only for INTEGER_CSTs and COMPLEX_CSTs > and we can't use bit_and etc. for complex type. > > Bootstrapped/regtested on powerpc64le-linux and powerpc64-linux, ok > for trunk? Ok. Richard > 2022-02-25 Jakub Jelinek <ja...@redhat.com> > Marc Glisse <marc.gli...@inria.fr> > > PR tree-optimization/104675 > * match.pd (t * 2U / 2 -> t & (~0 / 2), t / 2U * 2 -> t & ~1): > Restrict simplifications to INTEGRAL_TYPE_P. > > * gcc.dg/pr104675-3.c : New test. > > --- gcc/match.pd.jj 2022-02-25 10:55:08.000000000 +0100 > +++ gcc/match.pd 2022-02-25 11:48:04.730110154 +0100 > @@ -731,7 +731,7 @@ (define_operator_list SYNC_FETCH_AND_AND > /* Simplify (unsigned t * 2)/2 -> unsigned t & 0x7FFFFFFF. */ > (simplify > (trunc_div (mult @0 integer_pow2p@1) @1) > - (if (TYPE_UNSIGNED (TREE_TYPE (@0))) > + (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && TYPE_UNSIGNED (TREE_TYPE (@0))) > (bit_and @0 { wide_int_to_tree > (type, wi::mask (TYPE_PRECISION (type) > - wi::exact_log2 (wi::to_wide (@1)), > @@ -740,7 +740,7 @@ (define_operator_list SYNC_FETCH_AND_AND > /* Simplify (unsigned t / 2) * 2 -> unsigned t & ~1. */ > (simplify > (mult (trunc_div @0 integer_pow2p@1) @1) > - (if (TYPE_UNSIGNED (TREE_TYPE (@0))) > + (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && TYPE_UNSIGNED (TREE_TYPE (@0))) > (bit_and @0 (negate @1)))) > > /* Simplify (t * 2) / 2) -> t. */ > --- gcc/testsuite/gcc.dg/pr104675-3.c.jj 2022-02-25 11:24:43.111619659 > +0100 > +++ gcc/testsuite/gcc.dg/pr104675-3.c 2022-02-25 11:26:35.406056600 +0100 > @@ -0,0 +1,29 @@ > +/* PR tree-optimization/104675 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2" } */ > + > +_Complex unsigned int > +foo (_Complex unsigned int x) > +{ > + return (x / 2) * 2; > +} > + > +_Complex unsigned int > +bar (_Complex unsigned int x) > +{ > + return (x * 2) / 2; > +} > + > +_Complex unsigned int > +baz (_Complex unsigned int x) > +{ > + _Complex unsigned int y = x / 2; > + return y * 2; > +} > + > +_Complex unsigned int > +qux (_Complex unsigned int x) > +{ > + _Complex unsigned int y = x * 2; > + return y / 2; > +} > > Jakub >
Re: [PATCH] match.pd: Further complex simplification fixes [PR104675]
Richard Biener via Gcc-patches Fri, 25 Feb 2022 11:05:24 -0800
- [PATCH] match.pd: Further complex simplific... Jakub Jelinek via Gcc-patches
- Re: [PATCH] match.pd: Further complex ... Richard Biener via Gcc-patches