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

     1  extern void abort (void);
     2  
     3  typedef struct PgHdr PgHdr;
     4  typedef unsigned char u8;
     5  struct PgHdr {
     6  int y;
     7  struct {
     8   unsigned int pgno;
     9   PgHdr *pNextHash, *pPrevHash;
    10   PgHdr *pNextFree, *pPrevFree;
    11   PgHdr *pNextAll;
    12   u8 inJournal;
    13   short int nRef;
    14   PgHdr *pDirty, *pPrevDirty;
    15   unsigned int notUsed;
    16  } x;
    17  };
    18  PgHdr **xx;
    19  volatile int vx;
    20  static inline PgHdr *merge_pagelist(PgHdr *pA, PgHdr *pB)
    21  {
    22   PgHdr result;
    23   PgHdr *pTail;
    24   xx = &result.x.pDirty;
    25   pTail = &result;
    26   while( pA && pB ){
    27     if( pA->x.pgno<pB->x.pgno ){
    28       pTail->x.pDirty = pA;
    29       pTail = pA;
    30       pA = pA->x.pDirty;
    31     }else{
    32       pTail->x.pDirty = pB;
    33       pTail = pB;
    34       pB = pB->x.pDirty;
    35     }
    36     vx = (*xx)->y;
    37   }
    38   if( pA ){
    39     pTail->x.pDirty = pA;
    40   }else if( pB ){
    41     pTail->x.pDirty = pB;
    42   }else{
    43     pTail->x.pDirty = 0;
    44   }
    45   return result.x.pDirty;
    46  }
    47  
    48  PgHdr * __attribute__((noinline)) sort_pagelist(PgHdr *pIn)
    49  {
    50   PgHdr *a[25], *p;
    51   int i;
    52   __builtin_memset (a, 0, sizeof (a));
    53   while( pIn ){
    54     p = pIn;
    55     pIn = p->x.pDirty;
    56     p->x.pDirty = 0;
    57     for(i=0; i<25 -1; i++){
    58       if( a[i]==0 ){
    59         a[i] = p;
    60         break;
    61       }else{
    62         p = merge_pagelist(a[i], p);
    63         a[i] = 0;
    64         a[i] = 0;
    65       }
    66     }
    67     if( i==25 -1 ){
    68       a[i] = merge_pagelist(a[i], p);
    69     }
    70   }
    71   p = a[0];
    72   for(i=1; i<25; i++){
    73     p = merge_pagelist (p, a[i]);
    74   }
    75   return p;
    76  }
    77  
    78  int main()
    79  {
    80   PgHdr a[5];
    81   PgHdr *p;
    82   a[0].x.pgno = 5;
    83   a[0].x.pDirty = &a[1];
    84   a[1].x.pgno = 4;
    85   a[1].x.pDirty = &a[2];
    86   a[2].x.pgno = 1;
    87   a[2].x.pDirty = &a[3];
    88   a[3].x.pgno = 3;
    89   a[3].x.pDirty = 0;
    90   p = sort_pagelist (&a[0]);
    91   if (p->x.pDirty == p)
    92     abort ();
    93   return 0;
    94  }