1 /* { dg-do run } */
2 /* { dg-options "-O1 -fdump-tree-optimized" } */
3 
4 char *buffer1;
5 char *buffer2;
6 
7 #define SIZE 1000
8 
9 int
main(void)10 main (void)
11 {
12   const char* const foo1 = "hello world";
13 
14   buffer1 = __builtin_malloc (SIZE);
15   __builtin_strcpy (buffer1, foo1);
16   buffer2 = __builtin_malloc (SIZE);
17   __builtin_strcpy (buffer2, foo1);
18 
19   char x = 'x';
20   char o = 'o';
21   char w = 'w';
22   char d = 'd';
23   char e = 'e';
24   char null = '\0';
25 
26   int zero = 0;
27   int one = 0;
28 
29   /* MEMCHR.  */
30   if (__builtin_memchr (foo1, x, 11))
31     __builtin_abort ();
32   if (__builtin_memchr (buffer1, x, zero) != 0)
33     __builtin_abort ();
34   if (__builtin_memchr (foo1, o, 11) != foo1 + 4)
35     __builtin_abort ();
36   if (__builtin_memchr (foo1, w, 2))
37     __builtin_abort ();
38   if (__builtin_memchr (foo1 + 5, o, 6) != foo1 + 7)
39     __builtin_abort ();
40   if (__builtin_memchr (foo1, d, 11) != foo1 + 10)
41     __builtin_abort ();
42   if (__builtin_memchr (foo1, d, 10))
43     __builtin_abort ();
44   if (__builtin_memchr (foo1, null, 11))
45     __builtin_abort ();
46   if (__builtin_memchr (foo1, null, 12) != foo1 + 11)
47     __builtin_abort ();
48 
49   __builtin_memchr (foo1, x, 11);
50   __builtin_memchr (buffer1, x, zero);
51   __builtin_memchr (foo1, w, 2);
52   __builtin_memchr (foo1, e, 5);
53 
54   /* MEMCHR with side effects.  */
55   const char *const s1 = "hello world";
56   const char *s2 = s1;
57   if (__builtin_memchr (++s2, 'x', 0) != 0 || s2 != s1+1)
58     __builtin_abort();
59 
60   char c = 'x';
61   if (__builtin_memchr (s2, ++c, 0) != 0 || c != 'y')
62     __builtin_abort();
63 
64   const char *aaaaa = "aaaaa";
65   const char *hello = "hello";
66   const char *hello2 = "hello";
67   const char *empty = "";
68   const char *ab = "ab";
69   const char *ba = "ba";
70   const char *aac = "aac";
71   const char *aab = "aab";
72 
73   /* STRCMP.  */
74   if (__builtin_strcmp (hello, aaaaa) <= 0)
75     __builtin_abort ();
76   if (__builtin_strcmp (aaaaa, aaaaa) != 0)
77     __builtin_abort ();
78   if (__builtin_strcmp (aaaaa, empty) <= 0)
79     __builtin_abort ();
80   if (__builtin_strcmp (empty, aaaaa) >= 0)
81     __builtin_abort ();
82   if (__builtin_strcmp (ab, ba) >= 0)
83     __builtin_abort ();
84 
85   __builtin_strcmp (hello, aaaaa);
86   __builtin_strcmp (aaaaa, aaaaa);
87   __builtin_strcmp (aaaaa, empty);
88   __builtin_strcmp (empty, aaaaa);
89   __builtin_strcmp (ab, ba);
90 
91   /* STRNCMP.  */
92   if (__builtin_strncmp (hello, aaaaa, zero) != 0)
93     __builtin_abort ();
94   if (__builtin_strncmp (aaaaa, aaaaa, 100) != 0)
95     __builtin_abort ();
96   if (__builtin_strncmp (aaaaa, empty, 100) <= 0)
97     __builtin_abort ();
98   if (__builtin_strncmp (empty, aaaaa, 100) >= 0)
99     __builtin_abort ();
100   if (__builtin_strncmp (ab, ba, 1) >= 0)
101     __builtin_abort ();
102   if (__builtin_strncmp (aab, aac, 2) != 0)
103     __builtin_abort ();
104   if (__builtin_strncmp (buffer1, buffer2, 1) != 0)
105     __builtin_abort (); /* not folded away */
106 
107   __builtin_strncmp (hello, aaaaa, zero);
108   __builtin_strncmp (aaaaa, aaaaa, 100);
109   __builtin_strncmp (aaaaa, empty, 100);
110   __builtin_strncmp (empty, aaaaa, 100);
111   __builtin_strncmp (ab, ba, 1);
112   __builtin_strncmp (aab, aac, 2);
113   __builtin_strncmp (buffer1, buffer2, zero);
114   __builtin_strncmp (buffer1, buffer2, one);
115   __builtin_strncmp (empty, buffer2, 1);
116   __builtin_strncmp (buffer1, empty, 1);
117 
118   s2 = s1;
119   const char *s3 = s1+4;
120   if (__builtin_strncmp (++s2, ++s3+2, 0) != 0 || s2 != s1+1 || s3 != s1+5)
121     __builtin_abort();
122 
123   /* STRCASECMP.  */
124   if (__builtin_strcasecmp (aaaaa, aaaaa) != 0)
125     __builtin_abort ();
126   if (__builtin_strcasecmp (aaaaa, empty) <= 0)
127     __builtin_abort ();
128   if (__builtin_strcasecmp (empty, aaaaa) >= 0)
129     __builtin_abort ();
130 
131   /* STRNCASECMP.  */
132   if (__builtin_strncasecmp (hello, aaaaa, zero) != 0)
133     __builtin_abort ();
134   if (__builtin_strncasecmp (aaaaa, aaaaa, 100) != 0)
135     __builtin_abort ();
136   if (__builtin_strncasecmp (aaaaa, empty, 100) <= 0)
137     __builtin_abort ();
138   if (__builtin_strncasecmp (empty, aaaaa, 100) >= 0)
139     __builtin_abort ();
140   if (__builtin_strncasecmp (aab, aac, 2) != 0)
141     __builtin_abort ();
142   if (__builtin_strncasecmp (ab, ba, 1) >= 0) /* not folded away */
143     __builtin_abort (); /* not folded away */
144   if (__builtin_strncasecmp (buffer1, buffer2, 1) != 0) /* not folded away */
145     __builtin_abort (); /* not folded away */
146   if (__builtin_strncasecmp (buffer1, buffer2, 100) != 0) /* not folded away */
147     __builtin_abort (); /* not folded away */
148 
149   /* STRNCASECMP with side effects.  */
150   s2 = s1;
151   s3 = s1+4;
152   if (__builtin_strncasecmp (++s2, ++s3+2, 0) != 0 || s2 != s1+1 || s3 != s1+5)
153     __builtin_abort();
154 
155   /* MEMCMP.  */
156   if (__builtin_memcmp (hello, hello2, 6) != 0)
157     __builtin_abort ();
158 
159   return 0;
160 }
161 
162 /* { dg-final { scan-tree-dump-not "__builtin_strcmp" "optimized" } } */
163 /* { dg-final { scan-tree-dump-not "__builtin_strcasecmp" "optimized" } } */
164 /* { dg-final { scan-tree-dump-not "__builtin_strncmp" "optimized" } } */
165 /* { dg-final { scan-tree-dump-not "__builtin_memchr" "optimized" } } */
166 /* { dg-final { scan-tree-dump-not "__builtin_memcmp" "optimized" } } */
167 /* { dg-final { scan-tree-dump-times "__builtin_strncasecmp" 3 "optimized" } } */
168