OSDN Git Service

* sbitmap.c (sbitmap_resize): New function.
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Feb 2003 19:35:08 +0000 (19:35 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Feb 2003 19:35:08 +0000 (19:35 +0000)
* 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

gcc/ChangeLog
gcc/recog.c
gcc/sbitmap.c
gcc/sbitmap.h

index ce62913..d791614 100644 (file)
@@ -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
index 6206be1..6f4a733 100644 (file)
@@ -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)
index 8514a22..e79ff94 100644 (file)
@@ -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 *
index d39759e..42e466e 100644 (file)
@@ -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));