(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.c-torture/
execute/
20090113-3.c
       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