1 /* PR middle-end/78257 - missing memcmp optimization with constant arrays
3 { dg-options "-O -Wall -fdump-tree-optimized" } */
5 #define assert(e) ((e) ? (void)0 : __builtin_abort ())
7 typedef __INT32_TYPE__
int32_t;
9 extern int memcmp (const void*, const void*, __SIZE_TYPE__
);
11 const int32_t i_0
= 0;
12 const int32_t j_0
= 0;
16 const char *pi
= (char*)&i_0
, *pj
= (char*)&j_0
;
19 n
+= 0 == memcmp (pi
, pj
, sizeof (int32_t));
20 n
+= 0 == memcmp (pi
+ 1, pj
+ 1, sizeof (int32_t) - 1);
21 n
+= 0 == memcmp (pi
+ 2, pj
+ 2, sizeof (int32_t) - 2);
22 n
+= 0 == memcmp (pi
+ 3, pj
+ 3, sizeof (int32_t) - 3);
23 n
+= 0 == memcmp (pi
+ 4, pj
+ 4, sizeof (int32_t) - 4);
29 const int32_t i1234
= 1234;
30 const int32_t j1234
= 1234;
32 void eq_i1234_j1245 (void)
34 const char *pi
= (char*)&i1234
, *pj
= (char*)&j1234
;
37 n
+= 0 == memcmp (pi
, pj
, sizeof (int32_t));
38 n
+= 0 == memcmp (pi
+ 1, pj
+ 1, sizeof (int32_t) - 1);
39 n
+= 0 == memcmp (pi
+ 2, pj
+ 2, sizeof (int32_t) - 2);
40 n
+= 0 == memcmp (pi
+ 3, pj
+ 3, sizeof (int32_t) - 3);
41 n
+= 0 == memcmp (pi
+ 4, pj
+ 4, sizeof (int32_t) - 4);
47 const int32_t a1
[2] = { 1234 };
48 const int32_t b1
[2] = { 1234 };
52 const char *pi
= (char*)&a1
, *pj
= (char*)&b1
;
53 int n
= 0, nb
= sizeof a1
;
55 n
+= 0 == memcmp (pi
, pj
, nb
);
56 n
+= 0 == memcmp (pi
+ 1, pj
+ 1, nb
- 1);
57 n
+= 0 == memcmp (pi
+ 2, pj
+ 2, nb
- 2);
58 n
+= 0 == memcmp (pi
+ 3, pj
+ 3, nb
- 3);
59 n
+= 0 == memcmp (pi
+ 4, pj
+ 4, nb
- 4);
60 n
+= 0 == memcmp (pi
+ 5, pj
+ 5, nb
- 5);
61 n
+= 0 == memcmp (pi
+ 6, pj
+ 6, nb
- 6);
62 n
+= 0 == memcmp (pi
+ 7, pj
+ 7, nb
- 7);
63 n
+= 0 == memcmp (pi
+ 8, pj
+ 8, nb
- 8);
68 const int32_t a2
[2] = { 1234 };
69 const int32_t b2
[2] = { 1234, 0 };
73 const char *pi
= (char*)&a2
, *pj
= (char*)&b2
;
74 int n
= 0, nb
= sizeof a2
;
76 n
+= 0 == memcmp (pi
, pj
, nb
);
77 n
+= 0 == memcmp (pi
+ 1, pj
+ 1, nb
- 1);
78 n
+= 0 == memcmp (pi
+ 2, pj
+ 2, nb
- 2);
79 n
+= 0 == memcmp (pi
+ 3, pj
+ 3, nb
- 3);
80 n
+= 0 == memcmp (pi
+ 4, pj
+ 4, nb
- 4);
81 n
+= 0 == memcmp (pi
+ 5, pj
+ 5, nb
- 5);
82 n
+= 0 == memcmp (pi
+ 6, pj
+ 6, nb
- 6);
83 n
+= 0 == memcmp (pi
+ 7, pj
+ 7, nb
- 7);
84 n
+= 0 == memcmp (pi
+ 8, pj
+ 8, nb
- 8);
90 const int32_t a5
[5] = { [3] = 1234, [1] = 0 };
91 const int32_t b5
[5] = { 0, 0, 0, 1234 };
95 int n
= 0, b
= sizeof a5
;
96 const char *pi
= (char*)a5
, *pj
= (char*)b5
;
98 n
+= 0 == memcmp (pi
, pj
, b
);
99 n
+= 0 == memcmp (pi
+ 1, pj
+ 1, b
- 1);
100 n
+= 0 == memcmp (pi
+ 2, pj
+ 2, b
- 2);
101 n
+= 0 == memcmp (pi
+ 3, pj
+ 3, b
- 3);
103 n
+= 0 == memcmp (pi
+ 4, pj
+ 4, b
- 4);
104 n
+= 0 == memcmp (pi
+ 5, pj
+ 5, b
- 5);
105 n
+= 0 == memcmp (pi
+ 6, pj
+ 6, b
- 6);
106 n
+= 0 == memcmp (pi
+ 7, pj
+ 7, b
- 7);
108 n
+= 0 == memcmp (pi
+ 8, pj
+ 8, b
- 8);
109 n
+= 0 == memcmp (pi
+ 9, pj
+ 9, b
- 9);
110 n
+= 0 == memcmp (pi
+ 10, pj
+ 10, b
- 10);
111 n
+= 0 == memcmp (pi
+ 11, pj
+ 11, b
- 11);
113 n
+= 0 == memcmp (pi
+ 12, pj
+ 12, b
- 12);
114 n
+= 0 == memcmp (pi
+ 13, pj
+ 13, b
- 13);
115 n
+= 0 == memcmp (pi
+ 14, pj
+ 14, b
- 14);
116 n
+= 0 == memcmp (pi
+ 15, pj
+ 15, b
- 15);
118 n
+= 0 == memcmp (pi
+ 16, pj
+ 16, b
- 16);
119 n
+= 0 == memcmp (pi
+ 17, pj
+ 17, b
- 17);
120 n
+= 0 == memcmp (pi
+ 18, pj
+ 18, b
- 18);
121 n
+= 0 == memcmp (pi
+ 19, pj
+ 19, b
- 19);
127 const int32_t a19
[19] = { [13] = 13, [8] = 8, [4] = 4, [1] = 1 };
128 const int32_t b19
[19] = { 0, 1, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 13 };
130 void eq_a19_b19 (void)
132 int n
= 0, b
= sizeof a19
;
133 const char *pi
= (char*)a19
, *pj
= (char*)b19
;
135 n
+= 0 == memcmp (pi
, pj
, b
);
136 n
+= 0 == memcmp (pi
+ 1, pj
+ 1, b
- 1);
137 n
+= 0 == memcmp (pi
+ 2, pj
+ 2, b
- 2);
138 n
+= 0 == memcmp (pi
+ 3, pj
+ 3, b
- 3);
140 n
+= 0 == memcmp (pi
+ 14, pj
+ 14, b
- 14);
141 n
+= 0 == memcmp (pi
+ 15, pj
+ 15, b
- 15);
142 n
+= 0 == memcmp (pi
+ 16, pj
+ 16, b
- 16);
143 n
+= 0 == memcmp (pi
+ 17, pj
+ 17, b
- 17);
145 n
+= 0 == memcmp (pi
+ 28, pj
+ 28, b
- 28);
146 n
+= 0 == memcmp (pi
+ 29, pj
+ 29, b
- 29);
147 n
+= 0 == memcmp (pi
+ 30, pj
+ 30, b
- 30);
148 n
+= 0 == memcmp (pi
+ 31, pj
+ 31, b
- 31);
150 n
+= 0 == memcmp (pi
+ 42, pj
+ 42, b
- 42);
151 n
+= 0 == memcmp (pi
+ 43, pj
+ 43, b
- 43);
152 n
+= 0 == memcmp (pi
+ 44, pj
+ 44, b
- 44);
153 n
+= 0 == memcmp (pi
+ 45, pj
+ 45, b
- 45);
155 n
+= 0 == memcmp (pi
+ 56, pj
+ 56, b
- 56);
156 n
+= 0 == memcmp (pi
+ 57, pj
+ 57, b
- 57);
157 n
+= 0 == memcmp (pi
+ 58, pj
+ 58, b
- 58);
158 n
+= 0 == memcmp (pi
+ 59, pj
+ 59, b
- 59);
164 const int32_t A20
[20] = { [13] = 14, [8] = 8, [4] = 4, [1] = 1 };
165 const int32_t b20
[20] = { 0, 1, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 13 };
167 void gt_A20_b20 (void)
169 int n
= memcmp (A20
, b20
, sizeof A20
) > 0;
173 const int32_t a21
[21] = { [13] = 12, [8] = 8, [4] = 4, [1] = 1 };
174 const int32_t B21
[21] = { 0, 1, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 13 };
176 void lt_a21_B21 (void)
178 int n
= memcmp (a21
, B21
, sizeof a21
) < 0;
183 /* { dg-final { scan-tree-dump-not "abort" "optimized" } } */