On Wed, Jun 9, 2021 at 3:32 AM apinski--- via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > From: Andrew Pinski <apin...@marvell.com> > > The problem here is with offset (and pointer) types is we produce > a negative expression when this optimization hits. > It is easier to disable this optimization for all non-integeral types > instead of finding an integer type which is the same precission as the > type to do the negative expression on it. > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
OK. > gcc/ChangeLog: > > PR tree-optimization/100925 > * match.pd (a ? CST1 : CST2): Limit transformations > that would produce a negative to integeral types only. > Change !POINTER_TYPE_P to INTEGRAL_TYPE_P also. > > gcc/testsuite/ChangeLog: > > * g++.dg/torture/pr100925.C: New test. > --- > gcc/match.pd | 8 ++++---- > gcc/testsuite/g++.dg/torture/pr100925.C | 24 ++++++++++++++++++++++++ > 2 files changed, 28 insertions(+), 4 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/torture/pr100925.C > > diff --git a/gcc/match.pd b/gcc/match.pd > index d06ff170684..bf22bc3a198 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -3733,10 +3733,10 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (if (integer_onep (@1)) > (convert (convert:boolean_type_node @0))) > /* a ? -1 : 0 -> -a. */ > - (if (integer_all_onesp (@1)) > + (if (INTEGRAL_TYPE_P (type) && integer_all_onesp (@1)) > (negate (convert (convert:boolean_type_node @0)))) > /* a ? powerof2cst : 0 -> a << (log2(powerof2cst)) */ > - (if (!POINTER_TYPE_P (type) && integer_pow2p (@1)) > + (if (INTEGRAL_TYPE_P (type) && integer_pow2p (@1)) > (with { > tree shift = build_int_cst (integer_type_node, tree_log2 (@1)); > } > @@ -3750,10 +3750,10 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (if (integer_onep (@2)) > (convert (bit_xor (convert:boolean_type_node @0) { booltrue; } ))) > /* a ? -1 : 0 -> -(!a). */ > - (if (integer_all_onesp (@2)) > + (if (INTEGRAL_TYPE_P (type) && integer_all_onesp (@2)) > (negate (convert (bit_xor (convert:boolean_type_node @0) { booltrue; } > )))) > /* a ? powerof2cst : 0 -> (!a) << (log2(powerof2cst)) */ > - (if (!POINTER_TYPE_P (type) && integer_pow2p (@2)) > + (if (INTEGRAL_TYPE_P (type) && integer_pow2p (@2)) > (with { > tree shift = build_int_cst (integer_type_node, tree_log2 (@2)); > } > diff --git a/gcc/testsuite/g++.dg/torture/pr100925.C > b/gcc/testsuite/g++.dg/torture/pr100925.C > new file mode 100644 > index 00000000000..de13950dca0 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/torture/pr100925.C > @@ -0,0 +1,24 @@ > +// { dg-do compile } > + > +struct QScopedPointerDeleter { > + static void cleanup(int *); > +}; > +class QScopedPointer { > + typedef int *QScopedPointer::*RestrictedBool; > + > +public: > + operator RestrictedBool() { return d ? nullptr : &QScopedPointer::d; } > + void reset() { > + if (d) > + QScopedPointerDeleter::cleanup(d); > + } > + int *d; > +}; > +class DOpenGLPaintDevicePrivate { > +public: > + QScopedPointer fbo; > +} DOpenGLPaintDeviceresize_d; > +void DOpenGLPaintDeviceresize() { > + if (DOpenGLPaintDeviceresize_d.fbo) > + DOpenGLPaintDeviceresize_d.fbo.reset(); > +} > -- > 2.27.0 >