1 /* PR middle-end/78257 - missing memcmp optimization with constant arrays
3 { dg-options "-O -Wall -fdump-tree-optimized" } */
5 typedef __INT8_TYPE__
int8_t;
6 typedef __INT16_TYPE__
int16_t;
7 typedef __INT32_TYPE__
int32_t;
8 typedef __SIZE_TYPE__
size_t;
10 extern int memcmp (const void*, const void*, size_t);
12 /* Verify that initializers for flexible array members are handled
20 const struct Si16_x si16_4
=
22 0x1112, { 0x2122, 0x3132, 0x4142 }
25 const char si16_4_rep
[] =
27 0x12, 0x11, 0x22, 0x21, 0x32, 0x31, 0x42, 0x41
32 int n
= 0, b
= sizeof si16_4_rep
;
33 const char *p
= (const char*)&si16_4
, *q
= si16_4_rep
;
35 n
+= memcmp (p
, q
, b
);
36 n
+= memcmp (p
+ 1, q
+ 1, b
- 1);
37 n
+= memcmp (p
+ 2, q
+ 2, b
- 2);
38 n
+= memcmp (p
+ 3, q
+ 3, b
- 3);
39 n
+= memcmp (p
+ 4, q
+ 4, b
- 4);
40 n
+= memcmp (p
+ 5, q
+ 5, b
- 5);
41 n
+= memcmp (p
+ 6, q
+ 6, b
- 6);
42 n
+= memcmp (p
+ 7, q
+ 7, b
- 7);
43 n
+= memcmp (p
+ 8, q
+ 8, b
- 8);
45 p
= (const char*)&si16_4
.n
;
47 n
+= memcmp (p
, q
, b
);
48 n
+= memcmp (p
+ 1, q
+ 1, b
- 1);
49 n
+= memcmp (p
+ 2, q
+ 2, b
- 2);
50 n
+= memcmp (p
+ 3, q
+ 3, b
- 3);
51 n
+= memcmp (p
+ 4, q
+ 4, b
- 4);
52 n
+= memcmp (p
+ 5, q
+ 5, b
- 5);
53 n
+= memcmp (p
+ 6, q
+ 6, b
- 6);
54 n
+= memcmp (p
+ 7, q
+ 7, b
- 7);
55 n
+= memcmp (p
+ 8, q
+ 8, b
- 8);
57 p
= (const char*)si16_4
.a
;
60 n
+= memcmp (p
, q
, b
- 2);
61 n
+= memcmp (p
+ 1, q
+ 1, b
- 3);
62 n
+= memcmp (p
+ 2, q
+ 2, b
- 4);
63 n
+= memcmp (p
+ 3, q
+ 3, b
- 5);
64 n
+= memcmp (p
+ 4, q
+ 4, b
- 6);
65 n
+= memcmp (p
+ 5, q
+ 5, b
- 7);
66 n
+= memcmp (p
+ 6, q
+ 6, b
- 8);
68 p
= (const char*)&si16_4
.a
[1];
71 n
+= memcmp (p
, q
, b
- 4);
72 n
+= memcmp (p
+ 1, q
+ 1, b
- 5);
73 n
+= memcmp (p
+ 2, q
+ 2, b
- 6);
74 n
+= memcmp (p
+ 3, q
+ 3, b
- 7);
75 n
+= memcmp (p
+ 4, q
+ 4, b
- 8);
81 /* { dg-final { scan-tree-dump-not "abort" "optimized" } } */