(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
strlenopt-19.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2 -fdump-tree-strlen" } */
       3  
       4  #include "strlenopt.h"
       5  
       6  __attribute__((noinline, noclone)) char *
       7  fn1 (int x, int y, int z)
       8  {
       9    static char buf[40];
      10    const char *p;
      11    switch (x)
      12      {
      13      case 0:
      14        p = "abcd";
      15        /* Prevent cswitch optimization.  */
      16        asm volatile ("" : : : "memory");
      17        break;
      18      case 1:
      19        p = "efgh";
      20        break;
      21      case 2:
      22        p = "ijkl";
      23        break;
      24      default:
      25        p = "mnop";
      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 = "abcdefghijklmnop" + (i < 3 ? i : 3) * 4;
      54        const char *q;
      55        fn1 (i ? 0 : 1, 1, 1);
      56        q = fn1 (i, 0, 0);
      57        if (memcmp (q, p + 1, 3) != 0 || memcmp (q + 3, "RST", 4) != 0)
      58  	abort ();
      59        fn1 (i ? 0 : 1, 0, 1);
      60        q = fn1 (i, 1, 0);
      61        if (memcmp (q, p, 4) != 0 || memcmp (q + 4, "HIJKLMN", 8) != 0)
      62  	abort ();
      63        fn1 (i ? 0 : 1, 1, 0);
      64        q = fn1 (i, 0, 1);
      65        if (memcmp (q, p + 1, 3) != 0 || memcmp (q + 3, "OPQ", 4) != 0)
      66  	abort ();
      67        fn1 (i ? 0 : 1, 0, 0);
      68        q = fn1 (i, 1, 1);
      69        if (memcmp (q, p, 4) != 0 || memcmp (q + 4, "ABCDEFG", 8) != 0)
      70  	abort ();
      71      }
      72    return 0;
      73  }
      74  
      75  /* { dg-final { scan-tree-dump-times "strlen \\(" 0 "strlen1" } } */
      76  /* { dg-final { scan-tree-dump-times "memcpy \\(" 6 "strlen1" } } */
      77  /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen1" } } */
      78  /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen1" } } */
      79  /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen1" } } */
      80  /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen1" } } */