111
|
1 /* { dg-do run } */
|
|
2 /* { dg-options "-O2 -fdump-tree-strlen" } */
|
|
3
|
|
4 #include "strlenopt.h"
|
|
5
|
|
6 __attribute__((noinline, noclone)) char *
|
|
7 fn1 (int x, int y, int z)
|
|
8 {
|
|
9 static char buf[40];
|
|
10 const char *p;
|
|
11 switch (x)
|
|
12 {
|
|
13 case 0:
|
|
14 p = "abcd";
|
|
15 /* Prevent cswitch optimization. */
|
|
16 asm volatile ("" : : : "memory");
|
|
17 break;
|
|
18 case 1:
|
|
19 p = "efgh";
|
|
20 break;
|
|
21 case 2:
|
|
22 p = "ijkl";
|
|
23 break;
|
|
24 default:
|
|
25 p = "mnop";
|
|
26 break;
|
|
27 }
|
|
28 if (y)
|
|
29 {
|
|
30 strcpy (buf, p);
|
|
31 if (z)
|
|
32 strcat (buf, "ABCDEFG");
|
|
33 else
|
|
34 strcat (buf, "HIJKLMN");
|
|
35 }
|
|
36 else
|
|
37 {
|
|
38 strcpy (buf, p + 1);
|
|
39 if (z)
|
|
40 strcat (buf, "OPQ");
|
|
41 else
|
|
42 strcat (buf, "RST");
|
|
43 }
|
|
44 return buf;
|
|
45 }
|
|
46
|
|
47 int
|
|
48 main ()
|
|
49 {
|
|
50 int i;
|
|
51 for (i = 0; i < 5; i++)
|
|
52 {
|
|
53 const char *p = "abcdefghijklmnop" + (i < 3 ? i : 3) * 4;
|
|
54 const char *q;
|
|
55 fn1 (i ? 0 : 1, 1, 1);
|
|
56 q = fn1 (i, 0, 0);
|
|
57 if (memcmp (q, p + 1, 3) != 0 || memcmp (q + 3, "RST", 4) != 0)
|
|
58 abort ();
|
|
59 fn1 (i ? 0 : 1, 0, 1);
|
|
60 q = fn1 (i, 1, 0);
|
|
61 if (memcmp (q, p, 4) != 0 || memcmp (q + 4, "HIJKLMN", 8) != 0)
|
|
62 abort ();
|
|
63 fn1 (i ? 0 : 1, 1, 0);
|
|
64 q = fn1 (i, 0, 1);
|
|
65 if (memcmp (q, p + 1, 3) != 0 || memcmp (q + 3, "OPQ", 4) != 0)
|
|
66 abort ();
|
|
67 fn1 (i ? 0 : 1, 0, 0);
|
|
68 q = fn1 (i, 1, 1);
|
|
69 if (memcmp (q, p, 4) != 0 || memcmp (q + 4, "ABCDEFG", 8) != 0)
|
|
70 abort ();
|
|
71 }
|
|
72 return 0;
|
|
73 }
|
|
74
|
|
75 /* { dg-final { scan-tree-dump-times "strlen \\(" 0 "strlen" } } */
|
|
76 /* { dg-final { scan-tree-dump-times "memcpy \\(" 6 "strlen" } } */
|
|
77 /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen" } } */
|
|
78 /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */
|
|
79 /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */
|
|
80 /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen" } } */
|