blob: d08ced5e75865cc5531b0c7ccee1998517bf98ad [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-O1 -fdump-tree-optimized" } */
char *buffer1;
char *buffer2;
#define SIZE 1000
int
main (void)
{
const char* const foo1 = "hello world";
buffer1 = __builtin_malloc (SIZE);
__builtin_strcpy (buffer1, foo1);
buffer2 = __builtin_malloc (SIZE);
__builtin_strcpy (buffer2, foo1);
char x = 'x';
char o = 'o';
char w = 'w';
char d = 'd';
char e = 'e';
char null = '\0';
int zero = 0;
int one = 0;
/* MEMCHR. */
if (__builtin_memchr (foo1, x, 11))
__builtin_abort ();
if (__builtin_memchr (buffer1, x, zero) != 0)
__builtin_abort ();
if (__builtin_memchr (foo1, o, 11) != foo1 + 4)
__builtin_abort ();
if (__builtin_memchr (foo1, w, 2))
__builtin_abort ();
if (__builtin_memchr (foo1 + 5, o, 6) != foo1 + 7)
__builtin_abort ();
if (__builtin_memchr (foo1, d, 11) != foo1 + 10)
__builtin_abort ();
if (__builtin_memchr (foo1, d, 10))
__builtin_abort ();
if (__builtin_memchr (foo1, null, 11))
__builtin_abort ();
if (__builtin_memchr (foo1, null, 12) != foo1 + 11)
__builtin_abort ();
__builtin_memchr (foo1, x, 11);
__builtin_memchr (buffer1, x, zero);
__builtin_memchr (foo1, w, 2);
__builtin_memchr (foo1, e, 5);
/* MEMCHR with side effects. */
const char *const s1 = "hello world";
const char *s2 = s1;
if (__builtin_memchr (++s2, 'x', 0) != 0 || s2 != s1+1)
__builtin_abort();
char c = 'x';
if (__builtin_memchr (s2, ++c, 0) != 0 || c != 'y')
__builtin_abort();
const char *aaaaa = "aaaaa";
const char *hello = "hello";
const char *hello2 = "hello";
const char *empty = "";
const char *ab = "ab";
const char *ba = "ba";
const char *aac = "aac";
const char *aab = "aab";
/* STRCMP. */
if (__builtin_strcmp (hello, aaaaa) <= 0)
__builtin_abort ();
if (__builtin_strcmp (aaaaa, aaaaa) != 0)
__builtin_abort ();
if (__builtin_strcmp (aaaaa, empty) <= 0)
__builtin_abort ();
if (__builtin_strcmp (empty, aaaaa) >= 0)
__builtin_abort ();
if (__builtin_strcmp (ab, ba) >= 0)
__builtin_abort ();
__builtin_strcmp (hello, aaaaa);
__builtin_strcmp (aaaaa, aaaaa);
__builtin_strcmp (aaaaa, empty);
__builtin_strcmp (empty, aaaaa);
__builtin_strcmp (ab, ba);
/* STRNCMP. */
if (__builtin_strncmp (hello, aaaaa, zero) != 0)
__builtin_abort ();
if (__builtin_strncmp (aaaaa, aaaaa, 100) != 0)
__builtin_abort ();
if (__builtin_strncmp (aaaaa, empty, 100) <= 0)
__builtin_abort ();
if (__builtin_strncmp (empty, aaaaa, 100) >= 0)
__builtin_abort ();
if (__builtin_strncmp (ab, ba, 1) >= 0)
__builtin_abort ();
if (__builtin_strncmp (aab, aac, 2) != 0)
__builtin_abort ();
if (__builtin_strncmp (buffer1, buffer2, 1) != 0)
__builtin_abort (); /* not folded away */
__builtin_strncmp (hello, aaaaa, zero);
__builtin_strncmp (aaaaa, aaaaa, 100);
__builtin_strncmp (aaaaa, empty, 100);
__builtin_strncmp (empty, aaaaa, 100);
__builtin_strncmp (ab, ba, 1);
__builtin_strncmp (aab, aac, 2);
__builtin_strncmp (buffer1, buffer2, zero);
__builtin_strncmp (buffer1, buffer2, one);
__builtin_strncmp (empty, buffer2, 1);
__builtin_strncmp (buffer1, empty, 1);
s2 = s1;
const char *s3 = s1+4;
if (__builtin_strncmp (++s2, ++s3+2, 0) != 0 || s2 != s1+1 || s3 != s1+5)
__builtin_abort();
/* STRCASECMP. */
if (__builtin_strcasecmp (aaaaa, aaaaa) != 0)
__builtin_abort ();
if (__builtin_strcasecmp (aaaaa, empty) <= 0)
__builtin_abort ();
if (__builtin_strcasecmp (empty, aaaaa) >= 0)
__builtin_abort ();
/* STRNCASECMP. */
if (__builtin_strncasecmp (hello, aaaaa, zero) != 0)
__builtin_abort ();
if (__builtin_strncasecmp (aaaaa, aaaaa, 100) != 0)
__builtin_abort ();
if (__builtin_strncasecmp (aaaaa, empty, 100) <= 0)
__builtin_abort ();
if (__builtin_strncasecmp (empty, aaaaa, 100) >= 0)
__builtin_abort ();
if (__builtin_strncasecmp (aab, aac, 2) != 0)
__builtin_abort ();
if (__builtin_strncasecmp (ab, ba, 1) >= 0) /* not folded away */
__builtin_abort (); /* not folded away */
if (__builtin_strncasecmp (buffer1, buffer2, 1) != 0) /* not folded away */
__builtin_abort (); /* not folded away */
if (__builtin_strncasecmp (buffer1, buffer2, 100) != 0) /* not folded away */
__builtin_abort (); /* not folded away */
/* STRNCASECMP with side effects. */
s2 = s1;
s3 = s1+4;
if (__builtin_strncasecmp (++s2, ++s3+2, 0) != 0 || s2 != s1+1 || s3 != s1+5)
__builtin_abort();
/* MEMCMP. */
if (__builtin_memcmp (hello, hello2, 6) != 0)
__builtin_abort ();
return 0;
}
/* { dg-final { scan-tree-dump-not "__builtin_strcmp" "optimized" } } */
/* { dg-final { scan-tree-dump-not "__builtin_strcasecmp" "optimized" } } */
/* { dg-final { scan-tree-dump-not "__builtin_strncmp" "optimized" } } */
/* { dg-final { scan-tree-dump-not "__builtin_memchr" "optimized" } } */
/* { dg-final { scan-tree-dump-not "__builtin_memcmp" "optimized" } } */
/* { dg-final { scan-tree-dump-times "__builtin_strncasecmp" 3 "optimized" } } */