While reviewing r17-632-g1c9808a71207eb, I missed that it was valid (in gimple)
to cast from a pointer to a smaller integral type. That meant with that
pattern we would get `ptr ^ ptr` which is invalid gimple.
This adds a check for integral type before applying this pattern.

Pushed as obvious after a bootstrap/test on x86_64-linux-gnu.

        PR tree-optimization/125453

gcc/ChangeLog:

        * match.pd (`(smaller)a ==/!= (smaller) b`): Reject
        non integral types.

gcc/testsuite/ChangeLog:

        * gcc.dg/torture/pr125453-1.c: New test.

Signed-off-by: Andrew Pinski <[email protected]>
---
 gcc/match.pd                              |  5 ++--
 gcc/testsuite/gcc.dg/torture/pr125453-1.c | 36 +++++++++++++++++++++++
 2 files changed, 39 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr125453-1.c

diff --git a/gcc/match.pd b/gcc/match.pd
index 0be4eff818b..8a2de136e7f 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -7817,8 +7817,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 
     /* For eq/ne with narrowing conversion:
        (T)(X) == (T)(Y) -> (T)(X ^ Y) == 0  */
-    (if (TYPE_PRECISION (TREE_TYPE (@0))
-         < TYPE_PRECISION (TREE_TYPE (@00))
+    (if (INTEGRAL_TYPE_P (TREE_TYPE (@00))
+        && (TYPE_PRECISION (TREE_TYPE (@0))
+             < TYPE_PRECISION (TREE_TYPE (@00)))
          && (cmp == EQ_EXPR || cmp == NE_EXPR)
          && types_match (TREE_TYPE (@00),
                          TREE_TYPE (@10)))
diff --git a/gcc/testsuite/gcc.dg/torture/pr125453-1.c 
b/gcc/testsuite/gcc.dg/torture/pr125453-1.c
new file mode 100644
index 00000000000..d4ee478253d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr125453-1.c
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fgimple" } */
+/* PR tree-optimization/125453 */
+
+int b[10];
+
+_Bool __GIMPLE f(int *c)
+{
+    unsigned t;
+    unsigned t1;
+    int t2;
+    _Bool t3;
+    t = (unsigned)c;
+    t1 = (unsigned)_Literal (char *)&b;
+    t = t - t1;
+    t2 = (int)t;
+    t3 = t2 != 0;
+    return t3;
+}
+
+
+
+int g1(void);
+int f1(const char *);
+
+void h(void) {
+  char b[1], *c;
+  int d, e;
+  for (d = 0, c = b; d < 3; d++, c++) {
+    g1();
+    if (d && e)
+      break;
+  }
+  *c = '\0';
+  f1(b);
+}
-- 
2.43.0

Reply via email to