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