(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
memcmp-4.c
       1  /* PR middle-end/78257 - missing memcmp optimization with constant arrays
       2     { dg-do compile }
       3     { dg-options "-O -Wall -fdump-tree-optimized" } */
       4  
       5  typedef __INT8_TYPE__  int8_t;
       6  typedef __INT16_TYPE__ int16_t;
       7  typedef __INT32_TYPE__ int32_t;
       8  typedef __SIZE_TYPE__  size_t;
       9  
      10  extern int memcmp (const void*, const void*, size_t);
      11  
      12  /* Verify that initializers for flexible array members are handled
      13     correctly.  */
      14  
      15  struct Si16_x
      16  {
      17    int16_t n, a[];
      18  };
      19  
      20  const struct Si16_x si16_4 =
      21    {
      22     0x1112, { 0x2122, 0x3132, 0x4142 }
      23    };
      24  
      25  const char si16_4_rep[] =
      26    {
      27     0x12, 0x11, 0x22, 0x21, 0x32, 0x31, 0x42, 0x41
      28    };
      29  
      30  void eq_si16_x (void)
      31  {
      32    int n = 0, b = sizeof si16_4_rep;
      33    const char *p = (const char*)&si16_4, *q = si16_4_rep;
      34  
      35    n += memcmp (p,      q,      b);
      36    n += memcmp (p + 1,  q + 1,  b - 1);
      37    n += memcmp (p + 2,  q + 2,  b - 2);
      38    n += memcmp (p + 3,  q + 3,  b - 3);
      39    n += memcmp (p + 4,  q + 4,  b - 4);
      40    n += memcmp (p + 5,  q + 5,  b - 5);
      41    n += memcmp (p + 6,  q + 6,  b - 6);
      42    n += memcmp (p + 7,  q + 7,  b - 7);
      43    n += memcmp (p + 8,  q + 8,  b - 8);
      44  
      45    p = (const char*)&si16_4.n;
      46  
      47    n += memcmp (p,      q,          b);
      48    n += memcmp (p + 1,  q + 1,  b - 1);
      49    n += memcmp (p + 2,  q + 2,  b - 2);
      50    n += memcmp (p + 3,  q + 3,  b - 3);
      51    n += memcmp (p + 4,  q + 4,  b - 4);
      52    n += memcmp (p + 5,  q + 5,  b - 5);
      53    n += memcmp (p + 6,  q + 6,  b - 6);
      54    n += memcmp (p + 7,  q + 7,  b - 7);
      55    n += memcmp (p + 8,  q + 8,  b - 8);
      56  
      57    p = (const char*)si16_4.a;
      58    q = si16_4_rep + 2;
      59  
      60    n += memcmp (p,      q,      b - 2);
      61    n += memcmp (p + 1,  q + 1,  b - 3);
      62    n += memcmp (p + 2,  q + 2,  b - 4);
      63    n += memcmp (p + 3,  q + 3,  b - 5);
      64    n += memcmp (p + 4,  q + 4,  b - 6);
      65    n += memcmp (p + 5,  q + 5,  b - 7);
      66    n += memcmp (p + 6,  q + 6,  b - 8);
      67  
      68    p = (const char*)&si16_4.a[1];
      69    q = si16_4_rep + 4;
      70  
      71    n += memcmp (p,      q,      b - 4);
      72    n += memcmp (p + 1,  q + 1,  b - 5);
      73    n += memcmp (p + 2,  q + 2,  b - 6);
      74    n += memcmp (p + 3,  q + 3,  b - 7);
      75    n += memcmp (p + 4,  q + 4,  b - 8);
      76  
      77    if (n != 0)
      78      __builtin_abort ();
      79  }
      80  
      81  /* { dg-final { scan-tree-dump-not "abort" "optimized" } } */