/* Reduced from analyzer ICE seen with git-2.39.0's pack-bitmap.c when bounds-checking the result of __builtin_ctzll. */ #include #include typedef uint64_t eword_t; struct ewah_bitmap; struct ewah_iterator { /* [...] */ }; struct bitmap; void ewah_iterator_init(struct ewah_iterator *it, struct ewah_bitmap *parent); int ewah_iterator_next(eword_t *next, struct ewah_iterator *it); void bitmap_set(struct bitmap *self, size_t pos); int rebuild_bitmap(const uint32_t *reposition, struct ewah_bitmap *source, struct bitmap *dest) { uint32_t pos = 0; struct ewah_iterator it; eword_t word; ewah_iterator_init(&it, source); while (ewah_iterator_next(&word, &it)) { uint32_t offset, bit_pos; for (offset = 0; offset < (sizeof(eword_t) * 8); ++offset) { if ((word >> offset) == 0) break; offset += __builtin_ctzll(word >> offset); bit_pos = reposition[pos + offset]; if (bit_pos > 0) bitmap_set(dest, bit_pos - 1); else return -1; } pos += (sizeof(eword_t) * 8); } return 0; }