(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.c-torture/
execute/
pr65401.c
       1  /* PR rtl-optimization/65401 */
       2  
       3  struct S { unsigned short s[64]; };
       4  
       5  __attribute__((noinline, noclone)) void
       6  foo (struct S *x)
       7  {
       8    unsigned int i;
       9    unsigned char *s;
      10  
      11    s = (unsigned char *) x->s;
      12    for (i = 0; i < 64; i++)
      13      x->s[i] = s[i * 2] | (s[i * 2 + 1] << 8);
      14  }  
      15  
      16  __attribute__((noinline, noclone)) void
      17  bar (struct S *x)
      18  {
      19    unsigned int i;
      20    unsigned char *s;
      21  
      22    s = (unsigned char *) x->s;
      23    for (i = 0; i < 64; i++)
      24      x->s[i] = (s[i * 2] << 8) | s[i * 2 + 1];
      25  }  
      26  
      27  int
      28  main ()
      29  {
      30    unsigned int i;
      31    struct S s;
      32    if (sizeof (unsigned short) != 2)
      33      return 0;
      34    for (i = 0; i < 64; i++)
      35      s.s[i] = i + ((64 - i) << 8);
      36    foo (&s);
      37  #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
      38    for (i = 0; i < 64; i++)
      39      if (s.s[i] != (64 - i) + (i << 8))
      40        __builtin_abort ();
      41  #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
      42    for (i = 0; i < 64; i++)
      43      if (s.s[i] != i + ((64 - i) << 8))
      44        __builtin_abort ();
      45  #endif
      46    for (i = 0; i < 64; i++)
      47      s.s[i] = i + ((64 - i) << 8);
      48    bar (&s);
      49  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
      50    for (i = 0; i < 64; i++)
      51      if (s.s[i] != (64 - i) + (i << 8))
      52        __builtin_abort ();
      53  #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
      54    for (i = 0; i < 64; i++)
      55      if (s.s[i] != i + ((64 - i) << 8))
      56        __builtin_abort ();
      57  #endif
      58    return 0;
      59  }