1 /* PR tree-optimization/92226 - live nul char store to array eliminated
2 { dg-do run }
3 { dg-options "-O2 -Wall" } */
4
5 #include "strlenopt.h"
6
7 #define NOIPA __attribute__ ((noipa))
8
9 unsigned nfails;
10
11 char a[8];
12
test(int line,const char * func,size_t expect)13 void test (int line, const char *func, size_t expect)
14 {
15 size_t len = strlen (a);
16 if (len == expect)
17 return;
18
19 ++nfails;
20
21 __builtin_printf ("assertion failed in %s on line %i: "
22 "strlen (\"%s\") == %zu, got %zu\n",
23 func, line, a, expect, len);
24 }
25
str(size_t n)26 NOIPA const char* str (size_t n)
27 {
28 return "9876543210" + 10 - n;
29 }
30
31 #define T(name, CMPEXP, LEN, IDX, EXPECT) \
32 NOIPA static void name (void) \
33 { \
34 const char *s = str (LEN); \
35 if (strlen (s) CMPEXP) \
36 { \
37 strcpy (a, s); \
38 a[IDX] = 0; \
39 test (__LINE__, #name, EXPECT); \
40 } \
41 } typedef void dummy_type
42
43
44 T (len_eq_1_store_nul_0, == 1, 1, 0, 0);
45 T (len_eq_1_store_nul_1, == 1, 1, 1, 1);
46 T (len_eq_1_store_nul_2, == 1, 1, 2, 1);
47 T (len_eq_1_store_nul_3, == 1, 1, 3, 1);
48 T (len_eq_1_store_nul_4, == 1, 1, 4, 1);
49
50 T (len_eq_2_store_nul_0, == 2, 2, 0, 0);
51 T (len_eq_2_store_nul_1, == 2, 2, 1, 1);
52 T (len_eq_2_store_nul_2, == 2, 2, 2, 2);
53 T (len_eq_2_store_nul_3, == 2, 2, 3, 2);
54 T (len_eq_2_store_nul_4, == 2, 2, 4, 2);
55
56 T (len_eq_3_store_nul_0, == 3, 3, 0, 0);
57 T (len_eq_3_store_nul_1, == 3, 3, 1, 1);
58 T (len_eq_3_store_nul_2, == 3, 3, 2, 2);
59 T (len_eq_3_store_nul_3, == 3, 3, 3, 3);
60 T (len_eq_3_store_nul_4, == 3, 3, 4, 3);
61
62
63 T (len_gt_1_store_nul_0, > 2, 2, 0, 0);
64 T (len_gt_1_store_nul_1, > 2, 2, 1, 1);
65 T (len_gt_1_store_nul_2, > 2, 2, 2, 2);
66 T (len_gt_1_store_nul_3, > 2, 2, 3, 2);
67 T (len_gt_1_store_nul_4, > 2, 2, 4, 2);
68
69 T (len_gt_2_store_nul_0, > 2, 3, 0, 0);
70 T (len_gt_2_store_nul_1, > 2, 3, 1, 1);
71 T (len_gt_2_store_nul_2, > 2, 3, 2, 2);
72 T (len_gt_2_store_nul_3, > 2, 3, 3, 3);
73 T (len_gt_2_store_nul_4, > 2, 3, 4, 3);
74
75 T (len_gt_3_store_nul_0, > 2, 4, 0, 0);
76 T (len_gt_3_store_nul_1, > 2, 4, 1, 1);
77 T (len_gt_3_store_nul_2, > 2, 4, 2, 2);
78 T (len_gt_3_store_nul_3, > 2, 4, 3, 3);
79 T (len_gt_3_store_nul_4, > 2, 4, 4, 4);
80
81
82 T (len_1_lt_4_store_nul_0, < 4, 1, 0, 0);
83 T (len_1_lt_4_store_nul_1, < 4, 1, 1, 1);
84 T (len_1_lt_4_store_nul_2, < 4, 1, 2, 1);
85 T (len_1_lt_4_store_nul_3, < 4, 1, 3, 1);
86 T (len_1_lt_4_store_nul_4, < 4, 1, 4, 1);
87 T (len_1_lt_4_store_nul_5, < 4, 1, 5, 1);
88 T (len_1_lt_4_store_nul_6, < 4, 1, 6, 1);
89 T (len_1_lt_4_store_nul_7, < 4, 1, 7, 1);
90
91 T (len_2_lt_4_store_nul_0, < 4, 2, 0, 0);
92 T (len_2_lt_4_store_nul_1, < 4, 2, 1, 1);
93 T (len_2_lt_4_store_nul_2, < 4, 2, 2, 2);
94 T (len_2_lt_4_store_nul_3, < 4, 2, 3, 2);
95 T (len_2_lt_4_store_nul_4, < 4, 2, 4, 2);
96 T (len_2_lt_4_store_nul_5, < 4, 2, 5, 2);
97 T (len_2_lt_4_store_nul_6, < 4, 2, 6, 2);
98 T (len_2_lt_4_store_nul_7, < 4, 2, 7, 2);
99
100 T (len_3_lt_4_store_nul_0, < 4, 3, 0, 0);
101 T (len_3_lt_4_store_nul_1, < 4, 3, 1, 1);
102 T (len_3_lt_4_store_nul_2, < 4, 3, 2, 2);
103 T (len_3_lt_4_store_nul_3, < 4, 3, 3, 3);
104 T (len_3_lt_4_store_nul_4, < 4, 3, 4, 3);
105 T (len_3_lt_4_store_nul_5, < 4, 3, 5, 3);
106 T (len_3_lt_4_store_nul_6, < 4, 3, 6, 3);
107 T (len_3_lt_4_store_nul_7, < 4, 3, 7, 3);
108
109 T (len_7_lt_8_store_nul_0, < 8, 7, 0, 0);
110 T (len_7_lt_8_store_nul_1, < 8, 7, 1, 1);
111 T (len_7_lt_8_store_nul_2, < 8, 7, 2, 2);
112 T (len_7_lt_8_store_nul_3, < 8, 7, 3, 3);
113 T (len_7_lt_8_store_nul_4, < 8, 7, 4, 4);
114 T (len_7_lt_8_store_nul_5, < 8, 7, 5, 5);
115 T (len_7_lt_8_store_nul_6, < 8, 7, 6, 6);
116 T (len_7_lt_8_store_nul_7, < 8, 7, 7, 7);
117
118
main(void)119 int main (void)
120 {
121 len_eq_1_store_nul_0 ();
122 len_eq_1_store_nul_1 ();
123 len_eq_1_store_nul_2 ();
124 len_eq_1_store_nul_3 ();
125 len_eq_1_store_nul_4 ();
126
127 len_eq_2_store_nul_0 ();
128 len_eq_2_store_nul_1 ();
129 len_eq_2_store_nul_2 ();
130 len_eq_2_store_nul_3 ();
131 len_eq_2_store_nul_4 ();
132
133 len_eq_3_store_nul_0 ();
134 len_eq_3_store_nul_1 ();
135 len_eq_3_store_nul_2 ();
136 len_eq_3_store_nul_3 ();
137 len_eq_3_store_nul_4 ();
138
139
140 len_gt_1_store_nul_0 ();
141 len_gt_1_store_nul_1 ();
142 len_gt_1_store_nul_2 ();
143 len_gt_1_store_nul_3 ();
144 len_gt_1_store_nul_4 ();
145
146 len_gt_2_store_nul_0 ();
147 len_gt_2_store_nul_1 ();
148 len_gt_2_store_nul_2 ();
149 len_gt_2_store_nul_3 ();
150 len_gt_2_store_nul_4 ();
151
152 len_gt_3_store_nul_0 ();
153 len_gt_3_store_nul_1 ();
154 len_gt_3_store_nul_2 ();
155 len_gt_3_store_nul_3 ();
156 len_gt_3_store_nul_4 ();
157
158 len_1_lt_4_store_nul_0 ();
159 len_1_lt_4_store_nul_1 ();
160 len_1_lt_4_store_nul_2 ();
161 len_1_lt_4_store_nul_3 ();
162 len_1_lt_4_store_nul_4 ();
163 len_1_lt_4_store_nul_5 ();
164 len_1_lt_4_store_nul_6 ();
165 len_1_lt_4_store_nul_7 ();
166
167 len_2_lt_4_store_nul_0 ();
168 len_2_lt_4_store_nul_1 ();
169 len_2_lt_4_store_nul_2 ();
170 len_2_lt_4_store_nul_3 ();
171 len_2_lt_4_store_nul_4 ();
172 len_2_lt_4_store_nul_5 ();
173 len_2_lt_4_store_nul_6 ();
174 len_2_lt_4_store_nul_7 ();
175
176 len_3_lt_4_store_nul_0 ();
177 len_3_lt_4_store_nul_1 ();
178 len_3_lt_4_store_nul_2 ();
179 len_3_lt_4_store_nul_3 ();
180 len_3_lt_4_store_nul_4 ();
181 len_3_lt_4_store_nul_5 ();
182 len_3_lt_4_store_nul_6 ();
183 len_3_lt_4_store_nul_7 ();
184
185 len_7_lt_8_store_nul_0 ();
186 len_7_lt_8_store_nul_1 ();
187 len_7_lt_8_store_nul_2 ();
188 len_7_lt_8_store_nul_3 ();
189 len_7_lt_8_store_nul_4 ();
190 len_7_lt_8_store_nul_5 ();
191 len_7_lt_8_store_nul_6 ();
192 len_7_lt_8_store_nul_7 ();
193
194 if (nfails)
195 abort ();
196 }
197