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 }