modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/20090113-3.c (about) 1 struct obstack {}; 2 struct bitmap_head_def; 3 typedef struct bitmap_head_def *bitmap; 4 typedef const struct bitmap_head_def *const_bitmap; 5 typedef unsigned long BITMAP_WORD; 6 7 typedef struct bitmap_obstack 8 { 9 struct bitmap_element_def *elements; 10 struct bitmap_head_def *heads; 11 struct obstack obstack; 12 } bitmap_obstack; 13 typedef struct bitmap_element_def 14 { 15 struct bitmap_element_def *next; 16 struct bitmap_element_def *prev; 17 unsigned int indx; 18 BITMAP_WORD bits[(2)]; 19 } bitmap_element; 20 21 struct bitmap_descriptor; 22 23 typedef struct bitmap_head_def { 24 bitmap_element *first; 25 bitmap_element *current; 26 unsigned int indx; 27 bitmap_obstack *obstack; 28 } bitmap_head; 29 30 bitmap_element bitmap_zero_bits; 31 32 typedef struct 33 { 34 bitmap_element *elt1; 35 bitmap_element *elt2; 36 unsigned word_no; 37 BITMAP_WORD bits; 38 } bitmap_iterator; 39 40 static __attribute__((noinline)) void 41 bmp_iter_set_init (bitmap_iterator *bi, const_bitmap map, 42 unsigned start_bit, unsigned *bit_no) 43 { 44 bi->elt1 = map->first; 45 bi->elt2 = ((void *)0); 46 47 while (1) 48 { 49 if (!bi->elt1) 50 { 51 bi->elt1 = &bitmap_zero_bits; 52 break; 53 } 54 55 if (bi->elt1->indx >= start_bit / (128u)) 56 break; 57 bi->elt1 = bi->elt1->next; 58 } 59 60 if (bi->elt1->indx != start_bit / (128u)) 61 start_bit = bi->elt1->indx * (128u); 62 63 bi->word_no = start_bit / 64u % (2); 64 bi->bits = bi->elt1->bits[bi->word_no]; 65 bi->bits >>= start_bit % 64u; 66 67 start_bit += !bi->bits; 68 69 *bit_no = start_bit; 70 } 71 72 static __inline__ __attribute__((always_inline)) void 73 bmp_iter_next (bitmap_iterator *bi, unsigned *bit_no) 74 { 75 bi->bits >>= 1; 76 *bit_no += 1; 77 } 78 79 static __inline__ __attribute__((always_inline)) unsigned char 80 bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no) 81 { 82 if (bi->bits) 83 { 84 while (!(bi->bits & 1)) 85 { 86 bi->bits >>= 1; 87 *bit_no += 1; 88 } 89 return 1; 90 } 91 92 *bit_no = ((*bit_no + 64u - 1) / 64u * 64u); 93 bi->word_no++; 94 95 while (1) 96 { 97 while (bi->word_no != (2)) 98 { 99 bi->bits = bi->elt1->bits[bi->word_no]; 100 if (bi->bits) 101 { 102 while (!(bi->bits & 1)) 103 { 104 bi->bits >>= 1; 105 *bit_no += 1; 106 } 107 return 1; 108 } 109 *bit_no += 64u; 110 bi->word_no++; 111 } 112 113 bi->elt1 = bi->elt1->next; 114 if (!bi->elt1) 115 return 0; 116 *bit_no = bi->elt1->indx * (128u); 117 bi->word_no = 0; 118 } 119 } 120 121 static void __attribute__((noinline)) 122 foobar (bitmap_head *live_throughout) 123 { 124 bitmap_iterator rsi; 125 unsigned int regno; 126 for (bmp_iter_set_init (&(rsi), (live_throughout), (0), &(regno)); 127 bmp_iter_set (&(rsi), &(regno)); 128 bmp_iter_next (&(rsi), &(regno))) 129 ; 130 } 131 int main() 132 { 133 bitmap_element elem = { (void *)0, (void *)0, 0, { 1, 1 } }; 134 bitmap_head live_throughout = { &elem, &elem, 0, (void *)0 }; 135 foobar (&live_throughout); 136 return 0; 137 } 138