00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "config.h"
00022 #include "system.h"
00023 #include "rtl.h"
00024 #include "flags.h"
00025 #include "hard-reg-set.h"
00026 #include "basic-block.h"
00027
00028
00029
00030
00031
00032 sbitmap
00033 sbitmap_alloc (n_elms)
00034 unsigned int n_elms;
00035 {
00036 unsigned int bytes, size, amt;
00037 sbitmap bmap;
00038
00039 size = SBITMAP_SET_SIZE (n_elms);
00040 bytes = size * sizeof (SBITMAP_ELT_TYPE);
00041 amt = (sizeof (struct simple_bitmap_def)
00042 + bytes - sizeof (SBITMAP_ELT_TYPE));
00043 bmap = (sbitmap) xmalloc (amt);
00044 bmap->n_bits = n_elms;
00045 bmap->size = size;
00046 bmap->bytes = bytes;
00047 return bmap;
00048 }
00049
00050
00051
00052
00053
00054 sbitmap
00055 sbitmap_resize (bmap, n_elms, def)
00056 sbitmap bmap;
00057 unsigned int n_elms;
00058 int def;
00059 {
00060 unsigned int bytes, size, amt;
00061 unsigned int last_bit;
00062
00063 size = SBITMAP_SET_SIZE (n_elms);
00064 bytes = size * sizeof (SBITMAP_ELT_TYPE);
00065 if (bytes > bmap->bytes)
00066 {
00067 amt = (sizeof (struct simple_bitmap_def)
00068 + bytes - sizeof (SBITMAP_ELT_TYPE));
00069 bmap = (sbitmap) xrealloc ((PTR) bmap, amt);
00070 }
00071
00072 if (n_elms > bmap->n_bits)
00073 {
00074 if (def)
00075 {
00076 memset ((PTR) (bmap->elms + bmap->size), -1, bytes - bmap->bytes);
00077
00078
00079 last_bit = bmap->n_bits % SBITMAP_ELT_BITS;
00080 if (last_bit)
00081 bmap->elms[bmap->size - 1]
00082 |= ~((SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit));
00083
00084
00085 last_bit = n_elms % SBITMAP_ELT_BITS;
00086 if (last_bit)
00087 bmap->elms[size - 1]
00088 &= (SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit);
00089 }
00090 else
00091 memset ((PTR) (bmap->elms + bmap->size), 0, bytes - bmap->bytes);
00092 }
00093 else if (n_elms < bmap->n_bits)
00094 {
00095
00096 last_bit = n_elms % SBITMAP_ELT_BITS;
00097 if (last_bit)
00098 bmap->elms[size - 1]
00099 &= (SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit);
00100 }
00101
00102 bmap->n_bits = n_elms;
00103 bmap->size = size;
00104 bmap->bytes = bytes;
00105 return bmap;
00106 }
00107
00108
00109
00110 sbitmap *
00111 sbitmap_vector_alloc (n_vecs, n_elms)
00112 unsigned int n_vecs, n_elms;
00113 {
00114 unsigned int i, bytes, offset, elm_bytes, size, amt, vector_bytes;
00115 sbitmap *bitmap_vector;
00116
00117 size = SBITMAP_SET_SIZE (n_elms);
00118 bytes = size * sizeof (SBITMAP_ELT_TYPE);
00119 elm_bytes = (sizeof (struct simple_bitmap_def)
00120 + bytes - sizeof (SBITMAP_ELT_TYPE));
00121 vector_bytes = n_vecs * sizeof (sbitmap *);
00122
00123
00124
00125
00126
00127
00128 {
00129
00130 struct { char x; SBITMAP_ELT_TYPE y; } align;
00131 int alignment = (char *) & align.y - & align.x;
00132 vector_bytes = (vector_bytes + alignment - 1) & ~ (alignment - 1);
00133 }
00134
00135 amt = vector_bytes + (n_vecs * elm_bytes);
00136 bitmap_vector = (sbitmap *) xmalloc (amt);
00137
00138 for (i = 0, offset = vector_bytes; i < n_vecs; i++, offset += elm_bytes)
00139 {
00140 sbitmap b = (sbitmap) ((char *) bitmap_vector + offset);
00141
00142 bitmap_vector[i] = b;
00143 b->n_bits = n_elms;
00144 b->size = size;
00145 b->bytes = bytes;
00146 }
00147
00148 return bitmap_vector;
00149 }
00150
00151
00152
00153 void
00154 sbitmap_copy (dst, src)
00155 sbitmap dst, src;
00156 {
00157 memcpy (dst->elms, src->elms, sizeof (SBITMAP_ELT_TYPE) * dst->size);
00158 }
00159
00160
00161 int
00162 sbitmap_equal (a, b)
00163 sbitmap a, b;
00164 {
00165 return !memcmp (a->elms, b->elms, sizeof (SBITMAP_ELT_TYPE) * a->size);
00166 }
00167
00168
00169
00170 void
00171 sbitmap_zero (bmap)
00172 sbitmap bmap;
00173 {
00174 memset ((PTR) bmap->elms, 0, bmap->bytes);
00175 }
00176
00177
00178
00179 void
00180 sbitmap_ones (bmap)
00181 sbitmap bmap;
00182 {
00183 unsigned int last_bit;
00184
00185 memset ((PTR) bmap->elms, -1, bmap->bytes);
00186
00187 last_bit = bmap->n_bits % SBITMAP_ELT_BITS;
00188 if (last_bit)
00189 bmap->elms[bmap->size - 1]
00190 = (SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit);
00191 }
00192
00193
00194
00195 void
00196 sbitmap_vector_zero (bmap, n_vecs)
00197 sbitmap *bmap;
00198 unsigned int n_vecs;
00199 {
00200 unsigned int i;
00201
00202 for (i = 0; i < n_vecs; i++)
00203 sbitmap_zero (bmap[i]);
00204 }
00205
00206
00207
00208 void
00209 sbitmap_vector_ones (bmap, n_vecs)
00210 sbitmap *bmap;
00211 unsigned int n_vecs;
00212 {
00213 unsigned int i;
00214
00215 for (i = 0; i < n_vecs; i++)
00216 sbitmap_ones (bmap[i]);
00217 }
00218
00219
00220
00221
00222
00223 bool
00224 sbitmap_union_of_diff_cg (dst, a, b, c)
00225 sbitmap dst, a, b, c;
00226 {
00227 unsigned int i, n = dst->size;
00228 sbitmap_ptr dstp = dst->elms;
00229 sbitmap_ptr ap = a->elms;
00230 sbitmap_ptr bp = b->elms;
00231 sbitmap_ptr cp = c->elms;
00232 SBITMAP_ELT_TYPE changed = 0;
00233
00234 for (i = 0; i < n; i++)
00235 {
00236 SBITMAP_ELT_TYPE tmp = *ap++ | (*bp++ & ~*cp++);
00237 changed |= *dstp ^ tmp;
00238 *dstp++ = tmp;
00239 }
00240
00241 return changed != 0;
00242 }
00243
00244 void
00245 sbitmap_union_of_diff (dst, a, b, c)
00246 sbitmap dst, a, b, c;
00247 {
00248 unsigned int i, n = dst->size;
00249 sbitmap_ptr dstp = dst->elms;
00250 sbitmap_ptr ap = a->elms;
00251 sbitmap_ptr bp = b->elms;
00252 sbitmap_ptr cp = c->elms;
00253
00254 for (i = 0; i < n; i++)
00255 *dstp++ = *ap++ | (*bp++ & ~*cp++);
00256 }
00257
00258
00259
00260 void
00261 sbitmap_not (dst, src)
00262 sbitmap dst, src;
00263 {
00264 unsigned int i, n = dst->size;
00265 sbitmap_ptr dstp = dst->elms;
00266 sbitmap_ptr srcp = src->elms;
00267
00268 for (i = 0; i < n; i++)
00269 *dstp++ = ~*srcp++;
00270 }
00271
00272
00273
00274
00275 void
00276 sbitmap_difference (dst, a, b)
00277 sbitmap dst, a, b;
00278 {
00279 unsigned int i, dst_size = dst->size;
00280 unsigned int min_size = dst->size;
00281 sbitmap_ptr dstp = dst->elms;
00282 sbitmap_ptr ap = a->elms;
00283 sbitmap_ptr bp = b->elms;
00284
00285
00286 if (a->size < dst_size)
00287 abort ();
00288
00289
00290 if (b->size < min_size)
00291 min_size = b->size;
00292 for (i = 0; i < min_size; i++)
00293 *dstp++ = *ap++ & (~*bp++);
00294
00295
00296 if (dst != a && i != dst_size)
00297 for (; i < dst_size; i++)
00298 *dstp++ = *ap++;
00299 }
00300
00301
00302
00303
00304 bool
00305 sbitmap_a_and_b_cg (dst, a, b)
00306 sbitmap dst, a, b;
00307 {
00308 unsigned int i, n = dst->size;
00309 sbitmap_ptr dstp = dst->elms;
00310 sbitmap_ptr ap = a->elms;
00311 sbitmap_ptr bp = b->elms;
00312 SBITMAP_ELT_TYPE changed = 0;
00313
00314 for (i = 0; i < n; i++)
00315 {
00316 SBITMAP_ELT_TYPE tmp = *ap++ & *bp++;
00317 changed = *dstp ^ tmp;
00318 *dstp++ = tmp;
00319 }
00320
00321 return changed != 0;
00322 }
00323
00324 void
00325 sbitmap_a_and_b (dst, a, b)
00326 sbitmap dst, a, b;
00327 {
00328 unsigned int i, n = dst->size;
00329 sbitmap_ptr dstp = dst->elms;
00330 sbitmap_ptr ap = a->elms;
00331 sbitmap_ptr bp = b->elms;
00332
00333 for (i = 0; i < n; i++)
00334 *dstp++ = *ap++ & *bp++;
00335 }
00336
00337
00338
00339
00340 bool
00341 sbitmap_a_xor_b_cg (dst, a, b)
00342 sbitmap dst, a, b;
00343 {
00344 unsigned int i, n = dst->size;
00345 sbitmap_ptr dstp = dst->elms;
00346 sbitmap_ptr ap = a->elms;
00347 sbitmap_ptr bp = b->elms;
00348 SBITMAP_ELT_TYPE changed = 0;
00349
00350 for (i = 0; i < n; i++)
00351 {
00352 SBITMAP_ELT_TYPE tmp = *ap++ ^ *bp++;
00353 changed = *dstp ^ tmp;
00354 *dstp++ = tmp;
00355 }
00356
00357 return changed != 0;
00358 }
00359
00360 void
00361 sbitmap_a_xor_b (dst, a, b)
00362 sbitmap dst, a, b;
00363 {
00364 unsigned int i, n = dst->size;
00365 sbitmap_ptr dstp = dst->elms;
00366 sbitmap_ptr ap = a->elms;
00367 sbitmap_ptr bp = b->elms;
00368
00369 for (i = 0; i < n; i++)
00370 *dstp++ = *ap++ ^ *bp++;
00371 }
00372
00373
00374
00375
00376 bool
00377 sbitmap_a_or_b_cg (dst, a, b)
00378 sbitmap dst, a, b;
00379 {
00380 unsigned int i, n = dst->size;
00381 sbitmap_ptr dstp = dst->elms;
00382 sbitmap_ptr ap = a->elms;
00383 sbitmap_ptr bp = b->elms;
00384 SBITMAP_ELT_TYPE changed = 0;
00385
00386 for (i = 0; i < n; i++)
00387 {
00388 SBITMAP_ELT_TYPE tmp = *ap++ | *bp++;
00389 changed = *dstp ^ tmp;
00390 *dstp++ = tmp;
00391 }
00392
00393 return changed != 0;
00394 }
00395
00396 void
00397 sbitmap_a_or_b (dst, a, b)
00398 sbitmap dst, a, b;
00399 {
00400 unsigned int i, n = dst->size;
00401 sbitmap_ptr dstp = dst->elms;
00402 sbitmap_ptr ap = a->elms;
00403 sbitmap_ptr bp = b->elms;
00404
00405 for (i = 0; i < n; i++)
00406 *dstp++ = *ap++ | *bp++;
00407 }
00408
00409
00410
00411 bool
00412 sbitmap_a_subset_b_p (a, b)
00413 sbitmap a, b;
00414 {
00415 unsigned int i, n = a->size;
00416 sbitmap_ptr ap, bp;
00417
00418 for (ap = a->elms, bp = b->elms, i = 0; i < n; i++, ap++, bp++)
00419 if ((*ap | *bp) != *bp)
00420 return false;
00421
00422 return true;
00423 }
00424
00425
00426
00427
00428 bool
00429 sbitmap_a_or_b_and_c_cg (dst, a, b, c)
00430 sbitmap dst, a, b, c;
00431 {
00432 unsigned int i, n = dst->size;
00433 sbitmap_ptr dstp = dst->elms;
00434 sbitmap_ptr ap = a->elms;
00435 sbitmap_ptr bp = b->elms;
00436 sbitmap_ptr cp = c->elms;
00437 SBITMAP_ELT_TYPE changed = 0;
00438
00439 for (i = 0; i < n; i++)
00440 {
00441 SBITMAP_ELT_TYPE tmp = *ap++ | (*bp++ & *cp++);
00442 changed |= *dstp ^ tmp;
00443 *dstp++ = tmp;
00444 }
00445
00446 return changed != 0;
00447 }
00448
00449 void
00450 sbitmap_a_or_b_and_c (dst, a, b, c)
00451 sbitmap dst, a, b, c;
00452 {
00453 unsigned int i, n = dst->size;
00454 sbitmap_ptr dstp = dst->elms;
00455 sbitmap_ptr ap = a->elms;
00456 sbitmap_ptr bp = b->elms;
00457 sbitmap_ptr cp = c->elms;
00458
00459 for (i = 0; i < n; i++)
00460 *dstp++ = *ap++ | (*bp++ & *cp++);
00461 }
00462
00463
00464
00465
00466 bool
00467 sbitmap_a_and_b_or_c_cg (dst, a, b, c)
00468 sbitmap dst, a, b, c;
00469 {
00470 unsigned int i, n = dst->size;
00471 sbitmap_ptr dstp = dst->elms;
00472 sbitmap_ptr ap = a->elms;
00473 sbitmap_ptr bp = b->elms;
00474 sbitmap_ptr cp = c->elms;
00475 SBITMAP_ELT_TYPE changed = 0;
00476
00477 for (i = 0; i < n; i++)
00478 {
00479 SBITMAP_ELT_TYPE tmp = *ap++ & (*bp++ | *cp++);
00480 changed |= *dstp ^ tmp;
00481 *dstp++ = tmp;
00482 }
00483
00484 return changed != 0;
00485 }
00486
00487 void
00488 sbitmap_a_and_b_or_c (dst, a, b, c)
00489 sbitmap dst, a, b, c;
00490 {
00491 unsigned int i, n = dst->size;
00492 sbitmap_ptr dstp = dst->elms;
00493 sbitmap_ptr ap = a->elms;
00494 sbitmap_ptr bp = b->elms;
00495 sbitmap_ptr cp = c->elms;
00496
00497 for (i = 0; i < n; i++)
00498 *dstp++ = *ap++ & (*bp++ | *cp++);
00499 }
00500
00501 #ifdef IN_GCC
00502
00503
00504
00505 void
00506 sbitmap_intersection_of_succs (dst, src, bb)
00507 sbitmap dst;
00508 sbitmap *src;
00509 int bb;
00510 {
00511 basic_block b = BASIC_BLOCK (bb);
00512 unsigned int set_size = dst->size;
00513 edge e;
00514
00515 for (e = b->succ; e != 0; e = e->succ_next)
00516 {
00517 if (e->dest == EXIT_BLOCK_PTR)
00518 continue;
00519
00520 sbitmap_copy (dst, src[e->dest->index]);
00521 break;
00522 }
00523
00524 if (e == 0)
00525 sbitmap_ones (dst);
00526 else
00527 for (e = e->succ_next; e != 0; e = e->succ_next)
00528 {
00529 unsigned int i;
00530 sbitmap_ptr p, r;
00531
00532 if (e->dest == EXIT_BLOCK_PTR)
00533 continue;
00534
00535 p = src[e->dest->index]->elms;
00536 r = dst->elms;
00537 for (i = 0; i < set_size; i++)
00538 *r++ &= *p++;
00539 }
00540 }
00541
00542
00543
00544
00545 void
00546 sbitmap_intersection_of_preds (dst, src, bb)
00547 sbitmap dst;
00548 sbitmap *src;
00549 int bb;
00550 {
00551 basic_block b = BASIC_BLOCK (bb);
00552 unsigned int set_size = dst->size;
00553 edge e;
00554
00555 for (e = b->pred; e != 0; e = e->pred_next)
00556 {
00557 if (e->src == ENTRY_BLOCK_PTR)
00558 continue;
00559
00560 sbitmap_copy (dst, src[e->src->index]);
00561 break;
00562 }
00563
00564 if (e == 0)
00565 sbitmap_ones (dst);
00566 else
00567 for (e = e->pred_next; e != 0; e = e->pred_next)
00568 {
00569 unsigned int i;
00570 sbitmap_ptr p, r;
00571
00572 if (e->src == ENTRY_BLOCK_PTR)
00573 continue;
00574
00575 p = src[e->src->index]->elms;
00576 r = dst->elms;
00577 for (i = 0; i < set_size; i++)
00578 *r++ &= *p++;
00579 }
00580 }
00581
00582
00583
00584
00585 void
00586 sbitmap_union_of_succs (dst, src, bb)
00587 sbitmap dst;
00588 sbitmap *src;
00589 int bb;
00590 {
00591 basic_block b = BASIC_BLOCK (bb);
00592 unsigned int set_size = dst->size;
00593 edge e;
00594
00595 for (e = b->succ; e != 0; e = e->succ_next)
00596 {
00597 if (e->dest == EXIT_BLOCK_PTR)
00598 continue;
00599
00600 sbitmap_copy (dst, src[e->dest->index]);
00601 break;
00602 }
00603
00604 if (e == 0)
00605 sbitmap_zero (dst);
00606 else
00607 for (e = e->succ_next; e != 0; e = e->succ_next)
00608 {
00609 unsigned int i;
00610 sbitmap_ptr p, r;
00611
00612 if (e->dest == EXIT_BLOCK_PTR)
00613 continue;
00614
00615 p = src[e->dest->index]->elms;
00616 r = dst->elms;
00617 for (i = 0; i < set_size; i++)
00618 *r++ |= *p++;
00619 }
00620 }
00621
00622
00623
00624
00625 void
00626 sbitmap_union_of_preds (dst, src, bb)
00627 sbitmap dst;
00628 sbitmap *src;
00629 int bb;
00630 {
00631 basic_block b = BASIC_BLOCK (bb);
00632 unsigned int set_size = dst->size;
00633 edge e;
00634
00635 for (e = b->pred; e != 0; e = e->pred_next)
00636 {
00637 if (e->src== ENTRY_BLOCK_PTR)
00638 continue;
00639
00640 sbitmap_copy (dst, src[e->src->index]);
00641 break;
00642 }
00643
00644 if (e == 0)
00645 sbitmap_zero (dst);
00646 else
00647 for (e = e->pred_next; e != 0; e = e->pred_next)
00648 {
00649 unsigned int i;
00650 sbitmap_ptr p, r;
00651
00652 if (e->src == ENTRY_BLOCK_PTR)
00653 continue;
00654
00655 p = src[e->src->index]->elms;
00656 r = dst->elms;
00657 for (i = 0; i < set_size; i++)
00658 *r++ |= *p++;
00659 }
00660 }
00661 #endif
00662
00663
00664
00665 int
00666 sbitmap_first_set_bit (bmap)
00667 sbitmap bmap;
00668 {
00669 unsigned int n;
00670
00671 EXECUTE_IF_SET_IN_SBITMAP (bmap, 0, n, { return n; });
00672 return -1;
00673 }
00674
00675
00676
00677 int
00678 sbitmap_last_set_bit (bmap)
00679 sbitmap bmap;
00680 {
00681 int i;
00682 SBITMAP_ELT_TYPE *ptr = bmap->elms;
00683
00684 for (i = bmap->size - 1; i >= 0; i--)
00685 {
00686 SBITMAP_ELT_TYPE word = ptr[i];
00687
00688 if (word != 0)
00689 {
00690 unsigned int index = (i + 1) * SBITMAP_ELT_BITS - 1;
00691 SBITMAP_ELT_TYPE mask
00692 = (SBITMAP_ELT_TYPE) 1 << (SBITMAP_ELT_BITS - 1);
00693
00694 while (1)
00695 {
00696 if ((word & mask) != 0)
00697 return index;
00698
00699 mask >>= 1;
00700 index--;
00701 }
00702 }
00703 }
00704
00705 return -1;
00706 }
00707
00708 void
00709 dump_sbitmap (file, bmap)
00710 FILE *file;
00711 sbitmap bmap;
00712 {
00713 unsigned int i, n, j;
00714 unsigned int set_size = bmap->size;
00715 unsigned int total_bits = bmap->n_bits;
00716
00717 fprintf (file, " ");
00718 for (i = n = 0; i < set_size && n < total_bits; i++)
00719 for (j = 0; j < SBITMAP_ELT_BITS && n < total_bits; j++, n++)
00720 {
00721 if (n != 0 && n % 10 == 0)
00722 fprintf (file, " ");
00723
00724 fprintf (file, "%d",
00725 (bmap->elms[i] & ((SBITMAP_ELT_TYPE) 1 << j)) != 0);
00726 }
00727
00728 fprintf (file, "\n");
00729 }
00730
00731 void
00732 dump_sbitmap_file (file, bmap)
00733 FILE *file;
00734 sbitmap bmap;
00735 {
00736 unsigned int i, pos;
00737
00738 fprintf (file, "n_bits = %d, set = {", bmap->n_bits);
00739
00740 for (pos = 30, i = 0; i < bmap->n_bits; i++)
00741 if (TEST_BIT (bmap, i))
00742 {
00743 if (pos > 70)
00744 {
00745 fprintf (file, "\n ");
00746 pos = 0;
00747 }
00748
00749 fprintf (file, "%d ", i);
00750 pos += 2 + (i >= 10) + (i >= 100) + (i >= 1000);
00751 }
00752
00753 fprintf (file, "}\n");
00754 }
00755
00756 void
00757 debug_sbitmap (bmap)
00758 sbitmap bmap;
00759 {
00760 dump_sbitmap_file (stderr, bmap);
00761 }
00762
00763 void
00764 dump_sbitmap_vector (file, title, subtitle, bmaps, n_maps)
00765 FILE *file;
00766 const char *title, *subtitle;
00767 sbitmap *bmaps;
00768 int n_maps;
00769 {
00770 int bb;
00771
00772 fprintf (file, "%s\n", title);
00773 for (bb = 0; bb < n_maps; bb++)
00774 {
00775 fprintf (file, "%s %d\n", subtitle, bb);
00776 dump_sbitmap (file, bmaps[bb]);
00777 }
00778
00779 fprintf (file, "\n");
00780 }