[PATCH 1/2] Fix PR 100925: Limit some a?CST1:CST2 optimizations to intergal types only

Richard Biener richard.guenther@gmail.com
Wed Jun 9 11:10:41 GMT 2021


On Wed, Jun 9, 2021 at 3:32 AM apinski--- via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> From: Andrew Pinski <apinski@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
>


More information about the Gcc-patches mailing list