1 /* PR middle-end/78257 - missing memcmp optimization with constant arrays
2 { dg-do compile }
3 { dg-options "-O -Wall -fdump-tree-optimized" } */
4
5 #define A "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" \
6 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" \
7 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" \
8 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" \
9 "0"
10
11 const char a257[sizeof A - 1] = A;
12 const char a258[sizeof A] = A;
13
14 _Static_assert (sizeof A == 258);
15 _Static_assert (sizeof a257 == 257);
16
17 /* Verify that initializers longer than 256 characters (an internal limit
18 on the size of a buffer used to store representations in) are handled. */
19
20 void eq_256plus (void)
21 {
22 int n = 0;
23
24 n += __builtin_memcmp (a257, A, sizeof a257);
25 n += __builtin_memcmp (a257 + 1, A + 1, sizeof a257 - 1);
26 n += __builtin_memcmp (a257 + 2, A + 2, sizeof a257 - 2);
27 n += __builtin_memcmp (a257 + 127, A + 127, sizeof a257 - 127);
28 n += __builtin_memcmp (a257 + 128, A + 128, sizeof a257 - 128);
29 n += __builtin_memcmp (a257 + 255, A + 255, 2);
30 n += __builtin_memcmp (a257 + 256, A + 256, 1);
31
32 n += __builtin_memcmp (a258, A, sizeof a257);
33 n += __builtin_memcmp (a258 + 1, A + 1, sizeof a257 - 1);
34 n += __builtin_memcmp (a258 + 2, A + 2, sizeof a257 - 2);
35 n += __builtin_memcmp (a258 + 127, A + 127, sizeof a257 - 127);
36 n += __builtin_memcmp (a258 + 128, A + 128, sizeof a257 - 128);
37 n += __builtin_memcmp (a258 + 256, A + 256, 2);
38 n += __builtin_memcmp (a258 + 257, A + 257, 1);
39
40 if (n)
41 __builtin_abort ();
42 }
43
44 #define X "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" \
45 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" \
46 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" \
47 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" \
48 "1"
49
50 void lt_256plus (void)
51 {
52 int n = 0;
53
54 n += 0 > __builtin_memcmp (a257, X, sizeof a257);
55 n += 0 > __builtin_memcmp (a257 + 1, X + 1, sizeof a257 - 1);
56 n += 0 > __builtin_memcmp (a257 + 2, X + 2, sizeof a257 - 2);
57 n += 0 > __builtin_memcmp (a257 + 127, X + 127, sizeof a257 - 127);
58 n += 0 > __builtin_memcmp (a257 + 128, X + 128, sizeof a257 - 128);
59 n += 0 > __builtin_memcmp (a257 + 255, X + 255, 2);
60 n += 0 > __builtin_memcmp (a257 + 256, X + 256, 1);
61
62 n += 0 > __builtin_memcmp (a258, X, sizeof a258);
63 n += 0 > __builtin_memcmp (a258 + 1, X + 1, sizeof a258 - 1);
64 n += 0 > __builtin_memcmp (a258 + 2, X + 2, sizeof a258 - 2);
65 n += 0 > __builtin_memcmp (a258 + 127, X + 127, sizeof a257 - 127);
66 n += 0 > __builtin_memcmp (a258 + 128, X + 128, sizeof a257 - 128);
67 n += 0 > __builtin_memcmp (a258 + 256, X + 256, 2);
68 n += 0 == __builtin_memcmp (a258 + 257, X + 257, 1);
69
70 if (n != 14)
71 __builtin_abort ();
72 }