annotate gcc/testsuite/gcc.dg/strlenopt-54.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* PR tree-optimization/86042 - missing strlen optimization after second strcpy
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 { dg-options "-O2 -Wall -fdump-tree-optimized" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 #include "strlenopt.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 #define CAT(x, y) x ## y
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 #define CONCAT(x, y) CAT (x, y)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 #define FAILNAME(name) CONCAT (call_ ## name ##_on_line_, __LINE__)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 #define FAIL(name) do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 extern void FAILNAME (name) (void); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 FAILNAME (name)(); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 /* Macro to emit a call to function named
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 call_in_true_branch_not_eliminated_on_line_NNN()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 for each call that's expected to be eliminated. The dg-final
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 scan-tree-dump-time directive at the bottom of the test verifies
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 that no such call appears in output. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 #define ELIM(expr) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 if (!(expr)) FAIL (in_true_branch_not_eliminated); else (void)0
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 void elim_after_duplicate_strcpy (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 #define T(N, assign, off, str, r0, r1) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 char a[N]; \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 strcpy (a, assign); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 unsigned n0 = strlen (a); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 strcpy (a + off, str); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 unsigned n1 = strlen (a); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 ELIM (n0 == r0 && n1 == r1); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 T (2, "", 0, "1", 0, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 T (2, "1", 0, "2", 1, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 T (2, "1", 1, "", 1, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 T (3, "\0", 0, "1", 0, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 T (3, "1", 1, "2", 1, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 T (3, "12", 0, "23", 2, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 T (3, "12", 1, "3", 2, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 T (3, "12", 2, "", 2, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 T (4, "1", 1, "23", 1, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 T (4, "12", 1, "23", 2, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 T (4, "123", 0, "234", 3, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 T (4, "123", 1, "34", 3, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 T (4, "123", 2, "4", 3, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 T (4, "123", 3, "", 3, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 T (5, "1234", 0, "1", 4, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 T (5, "1234", 0, "12", 4, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 T (5, "1234", 0, "123", 4, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 T (5, "1234", 0, "1234", 4, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 T (5, "123", 1, "234", 3, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 T (6, "123", 2, "234", 3, 5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 void elim_after_init_memcpy (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 #undef T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 #define T(init, off, str, n, res) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 char a[] = init; \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 memcpy (a + off, str, n); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 ELIM (strlen (a) == res); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 T ("\0", 0, "1", 2, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 T ("\0\0", 0, "12", 3, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 #define INIT { '1', '2', '3', '4' }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 T (INIT, 0, "", 1, 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 T (INIT, 0, "1", 2, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 T (INIT, 0, "12", 3, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 T (INIT, 0, "123", 4, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 T ("1234", 0, "2", 1, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 T ("1234", 0, "23", 2, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 T ("1234", 0, "234", 3, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 T ("1234", 0, "2345", 4, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 T ("1234", 0, "2345", 5, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 T ("1234", 1, "2", 1, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 T ("1234", 1, "23", 2, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 T ("1234", 1, "234", 3, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 T ("1234", 1, "234", 4, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 T ("1234", 2, "3", 1, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 T ("1234", 2, "3", 2, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 T ("1234", 2, "34", 2, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 T ("1234", 2, "34", 3, 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 T ("12\00034", 0, "1", 1, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 T ("12\00034", 0, "1", 2, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 T ("AB\000CD", 0, "ab", 2, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 T ("AB\000CD", 0, "ab", 3, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 T ("AB\000CD", 0, "ab\000c", 4, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 /* { dg-final { scan-tree-dump-times "strlen" 0 "optimized" } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 { dg-final { scan-tree-dump-times "call_in_true_branch_not_eliminated" 0 "optimized" } } */