PR middle-end/97956 - ICE due to type mismatch in pointer_plus_expr during memchr...
authorMartin Sebor <msebor@redhat.com>
Wed, 25 Nov 2020 18:00:10 +0000 (11:00 -0700)
committerMartin Sebor <msebor@redhat.com>
Wed, 25 Nov 2020 18:02:11 +0000 (11:02 -0700)
gcc/ChangeLog:

PR middle-end/97956
* gimple-fold.c (gimple_fold_builtin_memchr): Use sizetype for pointer
offsets.

gcc/testsuite/ChangeLog:

PR middle-end/97956
* gcc.dg/memchr-3.c: New test.

gcc/gimple-fold.c
gcc/testsuite/gcc.dg/memchr-3.c [new file with mode: 0644]

index 40fc7e4a3af0194eb0233b7066c76d9f79b15912..58b6ea42a7e208fc04d3194fac9f46f4dfdf652d 100644 (file)
@@ -2689,7 +2689,7 @@ gimple_fold_builtin_memchr (gimple_stmt_iterator *gsi)
          gimple_seq stmts = NULL;
          if (lhs != NULL_TREE)
            {
-             tree offset_cst = build_int_cst (TREE_TYPE (len), offset);
+             tree offset_cst = build_int_cst (sizetype, offset);
              gassign *stmt = gimple_build_assign (lhs, POINTER_PLUS_EXPR,
                                                   arg1, offset_cst);
              gimple_seq_add_stmt_without_update (&stmts, stmt);
diff --git a/gcc/testsuite/gcc.dg/memchr-3.c b/gcc/testsuite/gcc.dg/memchr-3.c
new file mode 100644 (file)
index 0000000..c38d9cf
--- /dev/null
@@ -0,0 +1,25 @@
+/* PR middle-end/97956 - ICE due to type mismatch in pointer_plus_expr
+   during memchr folding
+   { dg-do compile }
+   { dg-options "-O2 -Wall" } */
+
+typedef __INT8_TYPE__  int8_t;
+typedef __INT32_TYPE__ int32_t;
+
+extern void* memchr (const void*, int, long);
+
+struct SX
+{
+  int32_t n;
+  int8_t a[];
+};
+
+const struct SX sx = { 0x1221 };
+const char sx_rep[] = { };
+
+void test_find (void)
+{
+  int n = 0, nb = (const char*)&sx.a - (const char*)&sx;
+  const char *p = (const char*)&sx, *q = sx_rep;
+  n += p + 1 == memchr (p, q[1], nb);
+}