111
|
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
|
|
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" } } */
|