1 /* PR tree-optimization/91996 - fold non-constant strlen relational expressions
3 { dg-options "-O2 -Wall -Wno-unused-local-typedefs" } */
5 typedef __SIZE_TYPE__
size_t;
7 #define NOIPA __attribute__ ((noipa))
9 #define CONCAT(a, b) a ## b
10 #define CAT(a, b) CONCAT (a, b)
12 /* Used in tests where EXPR is expected to be folded to false. */
16 CAT (CAT (test_on_line_, __LINE__), _not_eliminated)(void); \
17 CAT (CAT (test_on_line_, __LINE__), _not_eliminated)(); \
18 } typedef void dummy_type
21 /* Set the alignment for targets that depend on it in order to
22 optimize away the ELIM calls. See pr92128. */
23 __attribute__ ((aligned(4))) char a
[32], b
[32];
27 __builtin_strncpy (a
, "abcdefgh", sizeof a
);
28 __builtin_strncpy (b
, "0123456789", sizeof b
);
31 NOIPA
void fail (const char *func
)
33 __builtin_printf ("failure in %s\n", func
);
37 NOIPA
void test_global_cpy_4 (void)
39 size_t blen
= __builtin_strlen (b
);
43 __builtin_memcpy (d
, b
, 4);
45 size_t dlen
= __builtin_strlen (d
);
46 if (dlen
!= 8) // cannot be eliminated
51 NOIPA
void test_global_cpy_10 (void)
53 size_t blen
= __builtin_strlen (b
);
57 __builtin_memcpy (d
, b
, 10);
59 size_t dlen
= __builtin_strlen (d
);
60 if (dlen
!= 10) // cannot be eliminated
61 fail ("test_global_cpy_10");
64 NOIPA
void test_global_cpy_11 (void)
66 size_t blen
= __builtin_strlen (b
);
70 __builtin_memcpy (d
, b
, 11);
72 size_t dlen
= __builtin_strlen (d
);
73 if (dlen
!= 10) // cannot be eliminated
74 fail ("test_global_cpy_11");
77 NOIPA
void test_global_cpy_20 (void)
79 size_t blen
= __builtin_strlen (b
);
83 __builtin_memcpy (d
, b
, 20);
85 size_t dlen
= __builtin_strlen (d
);
86 if (dlen
!= 10) // cannot be eliminated
87 fail ("test_global_cpy_20");
90 NOIPA
void test_local_cpy_4 (void)
92 size_t blen
= __builtin_strlen (b
);
95 /* Set the alignment for targets that depend on it in order to
96 optimize away the ELIM calls. See pr92128. */
97 __attribute__ ((aligned(4))) char a
[10] = "abcdefgh";
99 __builtin_memcpy (d
, b
, 4);
101 size_t dlen
= __builtin_strlen (d
);
105 NOIPA
void test_local_cpy_10 (void)
107 size_t blen
= __builtin_strlen (b
);
108 if (blen
< 9) return;
110 char a
[32] = "abcdefgh";
112 __builtin_memcpy (d
, b
, 10);
114 /* B can be longer than 9 and A can initially be longer than 10
115 so the test below cannot be eliminated. */
116 size_t dlen
= __builtin_strlen (d
);
118 fail ("test_local_cpy_10");
121 NOIPA
void test_local_cpy_11 (void)
123 size_t blen
= __builtin_strlen (b
);
124 if (blen
< 9) return;
126 char a
[32] = "abcdefgh";
128 __builtin_memcpy (d
, b
, 11);
130 size_t dlen
= __builtin_strlen (d
);
132 fail ("test_global_cpy_20");
135 NOIPA
void test_local_cpy_20 (void)
137 size_t blen
= __builtin_strlen (b
);
138 if (blen
< 9) return;
140 char a
[32] = "abcdefgh";
142 __builtin_memcpy (d
, b
, 20);
144 size_t dlen
= __builtin_strlen (d
);
146 fail ("test_global_cpy_20");
149 NOIPA
void test_global_length_eq (void)
151 size_t blen
= __builtin_strlen (b
);
152 if (blen
!= 10) return;
154 size_t alen
= __builtin_strlen (a
);
155 if (alen
!= 8) return;
158 __builtin_memcpy (d
, b
, 4);
160 size_t dlen
= __builtin_strlen (d
);
165 NOIPA
void test_global_length_gt (void)
167 size_t blen
= __builtin_strlen (b
);
168 if (blen
< 9) return;
170 size_t alen
= __builtin_strlen (a
);
171 if (alen
< 8) return;
174 __builtin_memcpy (d
, b
, 4);
176 size_t dlen
= __builtin_strlen (d
);
180 #define TEST(name) do { init (); test_ ## name (); } while (0)
190 TEST (global_cpy_10
);
191 TEST (global_cpy_11
);
192 TEST (global_cpy_20
);
193 TEST (global_length_eq
);
194 TEST (global_length_gt
);