PR tree-optimization/81627
[official-gcc.git] / gcc / testsuite / gcc.dg / tree-ssa / builtins-folding-gimple.c
blobd08ced5e75865cc5531b0c7ccee1998517bf98ad
1 /* { dg-do run } */
2 /* { dg-options "-O1 -fdump-tree-optimized" } */
4 char *buffer1;
5 char *buffer2;
7 #define SIZE 1000
9 int
10 main (void)
12 const char* const foo1 = "hello world";
14 buffer1 = __builtin_malloc (SIZE);
15 __builtin_strcpy (buffer1, foo1);
16 buffer2 = __builtin_malloc (SIZE);
17 __builtin_strcpy (buffer2, foo1);
19 char x = 'x';
20 char o = 'o';
21 char w = 'w';
22 char d = 'd';
23 char e = 'e';
24 char null = '\0';
26 int zero = 0;
27 int one = 0;
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 ();
49 __builtin_memchr (foo1, x, 11);
50 __builtin_memchr (buffer1, x, zero);
51 __builtin_memchr (foo1, w, 2);
52 __builtin_memchr (foo1, e, 5);
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();
60 char c = 'x';
61 if (__builtin_memchr (s2, ++c, 0) != 0 || c != 'y')
62 __builtin_abort();
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";
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 ();
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);
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 */
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);
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();
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 ();
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 */
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();
155 /* MEMCMP. */
156 if (__builtin_memcmp (hello, hello2, 6) != 0)
157 __builtin_abort ();
159 return 0;
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" } } */