summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/strlenopt-32.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.dg/strlenopt-32.c')
-rw-r--r--gcc/testsuite/gcc.dg/strlenopt-32.c193
1 files changed, 193 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/strlenopt-32.c b/gcc/testsuite/gcc.dg/strlenopt-32.c
new file mode 100644
index 00000000000..08eb6bc2b08
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/strlenopt-32.c
@@ -0,0 +1,193 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fdump-tree-strlen" } */
+
+#include "strlenopt.h"
+
+char temp[30];
+volatile int v;
+
+size_t __attribute__ ((noinline, noclone))
+f1 (void)
+{
+ char a[30];
+ v += 1;
+ memcpy (a, "1234567", 7);
+ memcpy (a + 7, "89abcdefg", 9);
+ memcpy (a + 16, "h", 2);
+ return strlen (a); // This strlen should be optimized into 17.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f2 (char *a)
+{
+ v += 2;
+ memcpy (a, "1234567", 7);
+ memcpy (a + 7, "89abcdefg", 9);
+ memcpy (a + 16, "h", 2);
+ return strlen (a); // This strlen should be optimized into 17.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f3 (void)
+{
+ char a[30];
+ v += 3;
+ a[0] = '1';
+ memcpy (a + 1, "2345678", 8);
+ return strlen (a); // This strlen should be optimized into 8.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f4 (char *a)
+{
+ v += 4;
+ a[0] = '1';
+ memcpy (a + 1, "2345678", 8);
+ return strlen (a); // This strlen should be optimized into 8.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f5 (void)
+{
+ char a[30];
+ v += 5;
+ a[0] = '1';
+ a[1] = '2';
+ a[2] = '3';
+ memcpy (a + 3, "456", 3);
+ a[6] = '7';
+ a[7] = 0;
+ return strlen (a); // This strlen should be optimized into 7.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f6 (char *a)
+{
+ v += 6;
+ a[0] = '1';
+ a[1] = '2';
+ a[2] = '3';
+ memcpy (a + 3, "456", 3);
+ a[6] = '7';
+ a[7] = 0;
+ return strlen (a); // This strlen should be optimized into 7.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f7 (void)
+{
+ char a[30];
+ v += 7;
+ strcpy (a, "abcde");
+ int len1 = strlen (a);
+ a[2] = '_';
+ int len2 = strlen (a);
+ return len1 + len2; // This should be optimized into 10.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f8 (char *a)
+{
+ v += 8;
+ strcpy (a, "abcde");
+ int len1 = strlen (a);
+ a[2] = '_';
+ int len2 = strlen (a);
+ return len1 + len2; // This should be optimized into 10.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f9 (char b)
+{
+ char a[30];
+ v += 9;
+ strcpy (a, "foo.bar");
+ a[4] = b;
+ a[3] = 0;
+ return strlen (a); // This should be optimized into 3.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f10 (char *a, char b)
+{
+ v += 10;
+ strcpy (a, "foo.bar");
+ a[4] = b;
+ a[3] = 0;
+ return strlen (a); // This should be optimized into 3.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f11 (void)
+{
+ char a[30];
+ v += 11;
+ strcpy (temp, "123456");
+ memcpy (a, temp, 7);
+ return strlen (a); // This should be optimized into 6.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f12 (char *a)
+{
+ v += 12;
+ strcpy (temp, "123456");
+ memcpy (a, temp, 7);
+ return strlen (a); // This should be optimized into 6.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f13 (void)
+{
+ char a[30];
+ v += 13;
+ strcpy (temp, "1234567");
+ memcpy (a, temp, 7);
+ a[7] = 0;
+ return strlen (a); // This should be optimized into 7.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f14 (char *a)
+{
+ v += 14;
+ strcpy (temp, "1234567");
+ memcpy (a, temp, 7);
+ a[7] = 0;
+ return strlen (a); // This should be optimized into 7.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f15 (void)
+{
+ char a[30];
+ v += 15;
+ strcpy (temp, "12345679");
+ memcpy (a, temp, 7);
+ a[7] = 0;
+ return strlen (a); // This should be optimized into 7.
+}
+
+size_t __attribute__ ((noinline, noclone))
+f16 (char *a)
+{
+ v += 16;
+ strcpy (temp, "123456789");
+ memcpy (a, temp, 7);
+ a[7] = 0;
+ return strlen (a); // This should be optimized into 7.
+}
+
+int
+main ()
+{
+ char a[30];
+ if (f1 () != 17 || f2 (a) != 17 || f3 () != 8 || f4 (a) != 8
+ || f5 () != 7 || f6 (a) != 7 || f7 () != 10 || f8 (a) != 10
+ || f9 ('_') != 3 || f10 (a, '_') != 3 || f11 () != 6 || f12 (a) != 6
+ || f13 () != 7 || f14 (a) != 7 || f15 () != 7 || f16 (a) != 7)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "strlen \\(" 0 "strlen" } } */