1 /* PR tree-optimization/90879 - fold zero-equality of strcmp between
2    a longer string and a smaller array
3    { dg-do compile }
4    { dg-options "-O2 -Wall -Wno-string-compare -fdump-tree-optimized -ftrack-macro-expansion=0" } */
5 
6 #include "strlenopt.h"
7 
8 #define A(expr)                                                 \
9   ((expr)                                                       \
10    ? (void)0                                                    \
11    : (__builtin_printf ("assertion failed on line %i: %s\n",    \
12                         __LINE__, #expr),                       \
13       __builtin_abort ()))
14 
15 void clobber (void*, ...);
16 
17 struct S { char a4[4], c; };
18 
19 extern char a4[4];
20 extern char b4[4];
21 
22 /* Verify that comparison of string literals with arrays with unknown
23    content but size that prevents them from comparing equal is folded
24    to a constant.  */
25 
test_array_lit(void)26 void test_array_lit (void)
27 {
28   A (strcmp (a4, "1234")); clobber (a4);
29   A (strcmp (a4, "12345")); clobber (a4);
30   A (strcmp (a4, "123456")); clobber (a4);
31   A (strcmp ("1234", a4)); clobber (a4);
32   A (strcmp ("12345", a4)); clobber (a4);
33   A (strcmp ("123456", a4)); clobber (a4);
34 }
35 
test_memarray_lit(struct S * p)36 void test_memarray_lit (struct S *p)
37 {
38 #if 0
39   /* Member arrays not handled due to the fix for PR 92765.  */
40   A (strcmp (p->a4, "1234"));
41   A (strcmp (p->a4, "12345"));
42   A (strcmp (p->a4, "123456"));
43 
44   A (strcmp ("1234", p->a4));
45   A (strcmp ("12345", p->a4));
46   A (strcmp ("123456", p->a4));
47 #endif
48 }
49 
50 /* Verify that the equality of empty strings is folded.  */
51 
test_empty_string(void)52 void test_empty_string (void)
53 {
54   A (0 == strcmp ("", ""));
55 
56   *a4 = '\0';
57   A (0 == strcmp (a4, ""));
58   A (0 == strcmp ("", a4));
59   A (0 == strcmp (a4, a4));
60 
61   char s[8] = "";
62   A (0 == strcmp (a4, s));
63 
64   a4[1] = '\0';
65   b4[1] = '\0';
66   A (0 == strcmp (a4 + 1, b4 + 1));
67 
68   a4[2] = '\0';
69   b4[2] = '\0';
70   A (0 == strcmp (&a4[2], &b4[2]));
71 
72 #if 0
73   /* The following isn't handled yet due to PR 92155.  */
74   clobber (a4, b4);
75 
76   memset (a4, 0, sizeof a4);
77   memset (b4, 0, sizeof b4);
78   A (0 == strcmp (a4, b4));
79 #endif
80 }
81 
82 /* Verify that comparison of dynamically created strings with unknown
83    arrays is folded.  */
84 
test_array_copy(void)85 void test_array_copy (void)
86 {
87   char s[8];
88   strcpy (s, "1234");
89   A (strcmp (a4, s));
90 
91   strcpy (s, "12345");
92   A (strlen (s) == 5);
93   A (strcmp (a4, s)); clobber (a4);
94 
95   strcpy (s, "123456");
96   A (strcmp (a4, s)); clobber (a4);
97 
98   strcpy (s, "1234");
99   A (strcmp (s, a4)); clobber (a4);
100 
101   strcpy (s, "12345");
102   A (strcmp (s, a4)); clobber (a4);
103 
104   strcpy (s, "123456");
105   A (strcmp (s, a4)); clobber (a4);
106 }
107 
108 
test_array_bounded(void)109 void test_array_bounded (void)
110 {
111   A (strncmp (a4, "12345", 5)); clobber (a4);
112   A (strncmp ("54321", a4, 5)); clobber (a4);
113 
114   A (strncmp (a4, "123456", 5)); clobber (a4);
115   A (strncmp ("654321", a4, 5)); clobber (a4);
116 }
117 
test_array_copy_bounded(void)118 void test_array_copy_bounded (void)
119 {
120   char s[8];
121   strcpy (s, "12345");
122   A (strncmp (a4, s, 5)); clobber (a4);
123   strcpy (s, "54321");
124   A (strncmp (s, a4, 5)); clobber (a4);
125 
126   strcpy (s, "123456");
127   A (strncmp (a4, s, 5)); clobber (a4);
128   strcpy (s, "654321");
129   A (strncmp (s, a4, 5)); clobber (a4);
130 }
131 
132 /* { dg-final { scan-tree-dump-not "abort|strcmp|strncmp" "optimized" } } */
133