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

Message ID 1623202328-13664-1-git-send-email-apinski@marvell.com
State New
Headers show
Series
  • [1/2] Fix PR 100925: Limit some a?CST1:CST2 optimizations to intergal types only
Related show

Commit Message

Jonathan Wakely via Gcc-patches June 9, 2021, 1:32 a.m.
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.

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

-- 
2.27.0

Comments

Jonathan Wakely via Gcc-patches June 9, 2021, 11:10 a.m. | #1
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

>

Patch

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();
+}