2007-10-27 Richard Guenther <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / gcc.c-torture / execute / pr33870.c
blob9189b4a905458fc4b0ec9c725bef774b35a42ac1
1 extern void abort (void);
3 typedef struct PgHdr PgHdr;
4 typedef unsigned char u8;
5 struct PgHdr {
6 unsigned int pgno;
7 PgHdr *pNextHash, *pPrevHash;
8 PgHdr *pNextFree, *pPrevFree;
9 PgHdr *pNextAll;
10 u8 inJournal;
11 short int nRef;
12 PgHdr *pDirty, *pPrevDirty;
13 unsigned int notUsed;
16 static inline PgHdr *merge_pagelist(PgHdr *pA, PgHdr *pB)
18 PgHdr result;
19 PgHdr *pTail;
20 pTail = &result;
21 while( pA && pB ){
22 if( pA->pgno<pB->pgno ){
23 pTail->pDirty = pA;
24 pTail = pA;
25 pA = pA->pDirty;
26 }else{
27 pTail->pDirty = pB;
28 pTail = pB;
29 pB = pB->pDirty;
32 if( pA ){
33 pTail->pDirty = pA;
34 }else if( pB ){
35 pTail->pDirty = pB;
36 }else{
37 pTail->pDirty = 0;
39 return result.pDirty;
42 PgHdr * __attribute__((noinline)) sort_pagelist(PgHdr *pIn)
44 PgHdr *a[25], *p;
45 int i;
46 __builtin_memset (a, 0, sizeof (a));
47 while( pIn ){
48 p = pIn;
49 pIn = p->pDirty;
50 p->pDirty = 0;
51 for(i=0; i<25 -1; i++){
52 if( a[i]==0 ){
53 a[i] = p;
54 break;
55 }else{
56 p = merge_pagelist(a[i], p);
57 a[i] = 0;
60 if( i==25 -1 ){
61 a[i] = merge_pagelist(a[i], p);
64 p = a[0];
65 for(i=1; i<25; i++){
66 p = merge_pagelist (p, a[i]);
68 return p;
71 int main()
73 PgHdr a[5];
74 PgHdr *p;
75 a[0].pgno = 5;
76 a[0].pDirty = &a[1];
77 a[1].pgno = 4;
78 a[1].pDirty = &a[2];
79 a[2].pgno = 1;
80 a[2].pDirty = &a[3];
81 a[3].pgno = 3;
82 a[3].pDirty = 0;
83 p = sort_pagelist (&a[0]);
84 if (p->pDirty == p)
85 abort ();
86 return 0;