From e360ab394f9e67d79095b9d01fc1d68af0007bbc Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Tue, 18 Feb 2003 19:35:08 +0000 Subject: [PATCH] sbitmap.c (sbitmap_resize): New function. * sbitmap.c (sbitmap_resize): New function. * sbitmap.h (sbitmap_resize): Prototype here. * recog.c (split_all_insns): Use sbitmap_resize. From-SVN: r63058 --- gcc/ChangeLog | 6 ++++++ gcc/recog.c | 13 +---------- gcc/sbitmap.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++- 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 + + * 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 * 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)); -- 2.30.2