diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-02-18 19:35:08 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-02-18 19:35:08 +0000 |
commit | e52a3bedc98dd99019f94952357e0ca46c34501b (patch) | |
tree | de15fe52360bf719ed5c0a49ace9daae5c91c295 /gcc | |
parent | 8c960e2a9be4a8806a2e4ba8164c3e7aff63817f (diff) | |
download | gcc-e52a3bedc98dd99019f94952357e0ca46c34501b.tar.gz |
* sbitmap.c (sbitmap_resize): New function.
* sbitmap.h (sbitmap_resize): Prototype here.
* recog.c (split_all_insns): Use sbitmap_resize.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@63058 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/recog.c | 13 | ||||
-rw-r--r-- | gcc/sbitmap.c | 60 | ||||
-rw-r--r-- | gcc/sbitmap.h | 3 |
4 files changed, 68 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ce6291318cd..d791614a133 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-02-18 Roger Sayle <roger@eyesopen.com> + + * sbitmap.c (sbitmap_resize): New function. + * sbitmap.h (sbitmap_resize): Prototype here. + * recog.c (split_all_insns): Use sbitmap_resize. + 2003-02-18 Kazu Hirata <kazu@cs.umass.edu> * config/h8300/h8300.md (*zero_extendhisi2_h8300): Fix the diff --git a/gcc/recog.c b/gcc/recog.c index 6206be1700c..6f4a73335e2 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -2883,18 +2883,7 @@ split_all_insns (upd_life) find_many_sub_basic_blocks (blocks); if (old_last_basic_block != last_basic_block && upd_life) - { - sbitmap new_blocks = sbitmap_alloc (last_basic_block); - - sbitmap_copy (new_blocks, blocks); - while (old_last_basic_block < last_basic_block) - { - SET_BIT (new_blocks, old_last_basic_block); - old_last_basic_block++; - } - sbitmap_free (blocks); - new_blocks = blocks; - } + blocks = sbitmap_resize (blocks, last_basic_block, 1); } if (changed && upd_life) diff --git a/gcc/sbitmap.c b/gcc/sbitmap.c index 8514a221227..e79ff940812 100644 --- a/gcc/sbitmap.c +++ b/gcc/sbitmap.c @@ -1,5 +1,5 @@ /* Simple bitmaps. - Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. This file is part of GCC. @@ -49,6 +49,64 @@ sbitmap_alloc (n_elms) return bmap; } +/* Resize a simple bitmap BMAP to N_ELMS bits. If increasing the + size of BMAP, clear the new bits to zero if the DEF argument + is zero, and set them to one otherwise. */ + +sbitmap +sbitmap_resize (bmap, n_elms, def) + sbitmap bmap; + unsigned int n_elms; + int def; +{ + unsigned int bytes, size, amt; + unsigned int last_bit; + + size = SBITMAP_SET_SIZE (n_elms); + bytes = size * sizeof (SBITMAP_ELT_TYPE); + if (bytes > bmap->bytes) + { + amt = (sizeof (struct simple_bitmap_def) + + bytes - sizeof (SBITMAP_ELT_TYPE)); + bmap = (sbitmap) xrealloc ((PTR) bmap, amt); + } + + if (n_elms > bmap->n_bits) + { + if (def) + { + memset ((PTR) (bmap->elms + bmap->size), -1, bytes - bmap->bytes); + + /* Set the new bits if the original last element. */ + last_bit = bmap->n_bits % SBITMAP_ELT_BITS; + if (last_bit) + bmap->elms[bmap->size - 1] + |= ~((SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit)); + + /* Clear the unused bit in the new last element. */ + last_bit = n_elms % SBITMAP_ELT_BITS; + if (last_bit) + bmap->elms[size - 1] + &= (SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit); + } + else + memset ((PTR) (bmap->elms + bmap->size), 0, bytes - bmap->bytes); + } + else if (n_elms < bmap->n_bits) + { + /* Clear the surplus bits in the last word. */ + last_bit = n_elms % SBITMAP_ELT_BITS; + if (last_bit) + bmap->elms[size - 1] + &= (SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit); + } + + bmap->n_bits = n_elms; + bmap->size = size; + bmap->bytes = bytes; + return bmap; +} + /* Allocate a vector of N_VECS bitmaps of N_ELMS bits. */ sbitmap * diff --git a/gcc/sbitmap.h b/gcc/sbitmap.h index d39759e00f2..42e466e437e 100644 --- a/gcc/sbitmap.h +++ b/gcc/sbitmap.h @@ -1,5 +1,5 @@ /* Simple bitmaps. - Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. This file is part of GCC. @@ -125,6 +125,7 @@ extern void dump_sbitmap_vector PARAMS ((FILE *, const char *, int)); extern sbitmap sbitmap_alloc PARAMS ((unsigned int)); extern sbitmap *sbitmap_vector_alloc PARAMS ((unsigned int, unsigned int)); +extern sbitmap sbitmap_resize PARAMS ((sbitmap, unsigned int, int)); extern void sbitmap_copy PARAMS ((sbitmap, sbitmap)); extern int sbitmap_equal PARAMS ((sbitmap, sbitmap)); extern void sbitmap_zero PARAMS ((sbitmap)); |