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
--- /dev/null
+/* 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" } } */
--- /dev/null
+/* 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" } } */