OSDN Git Service

* config/elfos.h, config/spu/spu.c, tree-ssa-operands.h,
[pf3gnuchains/gcc-fork.git] / gcc / regclass.c
index 1f1e6c2..8a0bab1 100644 (file)
@@ -2176,13 +2176,28 @@ allocate_reg_info (size_t num_regs, int new_p, int renumber_p)
 
       if (!reg_n_info)
        {
-         VARRAY_REG_INIT (reg_n_info, regno_allocated, "reg_n_info");
+         reg_n_info = VEC_alloc (reg_info_p, heap, regno_allocated);
+         VEC_safe_grow (reg_info_p, heap, reg_n_info, regno_allocated);
+         memset (VEC_address (reg_info_p, reg_n_info), 0,
+                 sizeof (reg_info_p) * regno_allocated);
          renumber = xmalloc (size_renumber);
          reg_pref_buffer = XNEWVEC (struct reg_pref, regno_allocated);
        }
       else
        {
-         VARRAY_GROW (reg_n_info, regno_allocated);
+         size_t old_length = VEC_length (reg_info_p, reg_n_info);
+         if (old_length < regno_allocated)
+           {
+             reg_info_p *addr;
+             VEC_safe_grow (reg_info_p, heap, reg_n_info, regno_allocated);
+             addr = VEC_address (reg_info_p, reg_n_info);
+             memset (&addr[old_length], 0,
+                     sizeof (reg_info_p) * (regno_allocated - old_length));
+           }
+         else if (regno_allocated < old_length)
+           {
+             VEC_truncate (reg_info_p, reg_n_info, regno_allocated);
+           }
 
          if (new_p)            /* If we're zapping everything, no need to realloc.  */
            {
@@ -2238,7 +2253,8 @@ allocate_reg_info (size_t num_regs, int new_p, int renumber_p)
 
          for (i = min_index+local_min; i <= max; i++)
            {
-             VARRAY_REG (reg_n_info, i) = &reg_data->data[i-min_index];
+             VEC_replace (reg_info_p, reg_n_info, i,
+                          &reg_data->data[i-min_index]);
              REG_BASIC_BLOCK (i) = REG_BLOCK_UNKNOWN;
              renumber[i] = -1;
              reg_pref_buffer[i].prefclass = (char) NO_REGS;
@@ -2265,7 +2281,7 @@ free_reg_info (void)
       struct reg_info_data *reg_data;
       struct reg_info_data *reg_next;
 
-      VARRAY_FREE (reg_n_info);
+      VEC_free (reg_info_p, heap, reg_n_info);
       for (reg_data = reg_info_head; reg_data; reg_data = reg_next)
        {
          reg_next = reg_data->next;