aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-fold.c2
-rw-r--r--gcc/testsuite/gcc.dg/memchr-2.c41
-rw-r--r--gcc/testsuite/gcc.dg/memcmp-6.c47
3 files changed, 89 insertions, 1 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index db56cb6..dcc1b56 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -2670,7 +2670,7 @@ gimple_fold_builtin_memchr (gimple_stmt_iterator *gsi)
if (r == NULL)
{
tree mem_size, offset_node;
- string_constant (arg1, &offset_node, &mem_size, NULL);
+ byte_representation (arg1, &offset_node, &mem_size, NULL);
unsigned HOST_WIDE_INT offset = (offset_node == NULL_TREE)
? 0 : tree_to_uhwi (offset_node);
/* MEM_SIZE is the size of the array the string literal
diff --git a/gcc/testsuite/gcc.dg/memchr-2.c b/gcc/testsuite/gcc.dg/memchr-2.c
new file mode 100644
index 0000000..61357f9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/memchr-2.c
@@ -0,0 +1,41 @@
+/* PR tree-optimization/96670 - ICE on memchr with an empty initializer
+ { dg-do compile }
+ { dg-options "-O -Wall -fdump-tree-optimized" } */
+
+struct {
+ int i, j;
+} const s = { };
+
+void memchr_success_unused (void)
+{
+ int n = (char *)&s.j - (char *)&s;
+ char *p = (char *)&s;
+ __builtin_memchr (p, '\0', n);
+}
+
+void memchr_success_used (void)
+{
+ int n = (char *)&s.j - (char *)&s;
+ char *p = (char *)&s;
+ if (&s != __builtin_memchr (p, '\0', n))
+ __builtin_abort ();
+}
+
+void memchr_fail_unused (void)
+{
+ int n = (char *)&s.j - (char *)&s;
+ char *p = (char *)&s;
+ __builtin_memchr (p, '\5', n);
+}
+
+void memchr_fail_used (void)
+{
+ int n = (char *)&s.j - (char *)&s;
+ char *p = (char *)&s;
+ if (__builtin_memchr (p, '\5', n))
+ __builtin_abort ();
+}
+
+/* { dg-prune-output "\\\[-Wunused-value" }
+ { dg-final { scan-tree-dump-not "abort" "optimized" } }
+ { dg-final { scan-tree-dump-not "memcmp \\(" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/memcmp-6.c b/gcc/testsuite/gcc.dg/memcmp-6.c
new file mode 100644
index 0000000..d573526
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/memcmp-6.c
@@ -0,0 +1,47 @@
+/* PR tree-optimization/96670 - ICE on memchr with an empty initializer
+ { dg-do compile }
+ { dg-options "-O -Wall -fdump-tree-optimized" } */
+
+struct {
+ int i, j;
+} const s = { };
+
+const char a[sizeof s] = { };
+
+void memcmp_success_unused (void)
+{
+ int n = (char *)&s.j - (char *)&s;
+ char *p = (char *)&s;
+ __builtin_memcmp (p, a, n);
+ __builtin_memcmp (a, p, n);
+}
+
+void memcmp_success_used (void)
+{
+ int n = (char *)&s.j - (char *)&s;
+ char *p = (char *)&s;
+ if (__builtin_memcmp (p, a, n)
+ || __builtin_memcmp (a, p, n))
+ __builtin_abort ();
+}
+
+void memcmp_fail_unused (void)
+{
+ int n = (char *)&s.j - (char *)&s;
+ char *p = (char *)&s;
+ __builtin_memcmp (p, a, n);
+ __builtin_memcmp (a, p, n);
+}
+
+void memcmp_fail_used (void)
+{
+ int n = (char *)&s.j - (char *)&s;
+ char *p = (char *)&s;
+ if (__builtin_memcmp (p, a, n)
+ || __builtin_memcmp (a, p, n))
+ __builtin_abort ();
+}
+
+/* { dg-prune-output "\\\[-Wunused-value" }
+ { dg-final { scan-tree-dump-not "abort" "optimized" } }
+ { dg-final { scan-tree-dump-not "memcmp \\\(" "optimized" } } */