(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
strlenopt-18g.c
       1  /* This test needs runtime that provides stpcpy function.  */
       2  /* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
       3  /* { dg-options "-O2 -fdump-tree-strlen" } */
       4  
       5  #define USE_GNU
       6  #include "strlenopt.h"
       7  
       8  __attribute__((noinline, noclone)) char *
       9  fn1 (int x, int y, int z)
      10  {
      11    static char buf[40];
      12    const char *p;
      13    switch (x)
      14      {
      15      case 0:
      16        p = "abcd";
      17        break;
      18      case 1:
      19        p = "efgh";
      20        break;
      21      case 2:
      22        p = "ijkl";
      23        break;
      24      default:
      25        p = "mnopq";
      26        break;
      27      }
      28    if (y)
      29      {
      30        strcpy (buf, p);
      31        if (z)
      32  	strcat (buf, "ABCDEFG");
      33        else
      34  	strcat (buf, "HIJKLMN");
      35      }
      36    else
      37      {
      38        strcpy (buf, p + 1);
      39        if (z)
      40  	strcat (buf, "OPQ");
      41        else
      42  	strcat (buf, "RST");
      43      }
      44    return buf;
      45  }
      46  
      47  int
      48  main ()
      49  {
      50    int i;
      51    for (i = 0; i < 5; i++)
      52      {
      53        const char *p = "abcdefghijklmnopq" + (i < 3 ? i : 3) * 4;
      54        const char *q;
      55        int j = i >= 3;
      56        fn1 (i ? 0 : 1, 1, 1);
      57        q = fn1 (i, 0, 0);
      58        if (memcmp (q, p + 1, 3 + j) != 0 || memcmp (q + 3 + j, "RST", 4) != 0)
      59  	abort ();
      60        fn1 (i ? 0 : 1, 0, 1);
      61        q = fn1 (i, 1, 0);
      62        if (memcmp (q, p, 4 + j) != 0 || memcmp (q + 4 + j, "HIJKLMN", 8) != 0)
      63  	abort ();
      64        fn1 (i ? 0 : 1, 1, 0);
      65        q = fn1 (i, 0, 1);
      66        if (memcmp (q, p + 1, 3 + j) != 0 || memcmp (q + 3 + j, "OPQ", 4) != 0)
      67  	abort ();
      68        fn1 (i ? 0 : 1, 0, 0);
      69        q = fn1 (i, 1, 1);
      70        if (memcmp (q, p, 4 + j) != 0 || memcmp (q + 4 + j, "ABCDEFG", 8) != 0)
      71  	abort ();
      72      }
      73    return 0;
      74  }
      75  
      76  /* { dg-final { scan-tree-dump-times "strlen \\(" 0 "strlen1" } } */
      77  /* { dg-final { scan-tree-dump-times "memcpy \\(" 4 "strlen1" } } */
      78  /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen1" } } */
      79  /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen1" } } */
      80  /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen1" } } */
      81  /* { dg-final { scan-tree-dump-times "stpcpy \\(" 2 "strlen1" } } */