modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/pr65401.c (about)

     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  }