00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "config.h"
00026 #include "system.h"
00027 #include "coretypes.h"
00028 #include "tm.h"
00029 #include "toplev.h"
00030 #include "rtl.h"
00031 #include "tm_p.h"
00032 #include "hard-reg-set.h"
00033 #include "regs.h"
00034 #include "function.h"
00035 #include "flags.h"
00036 #include "insn-config.h"
00037 #include "insn-attr.h"
00038 #include "except.h"
00039 #include "toplev.h"
00040 #include "recog.h"
00041 #include "sched-int.h"
00042 #include "params.h"
00043 #include "cselib.h"
00044 #include "df.h"
00045
00046
00047 static regset reg_pending_sets;
00048 static regset reg_pending_clobbers;
00049 static regset reg_pending_uses;
00050
00051
00052
00053
00054 enum reg_pending_barrier_mode
00055 {
00056 NOT_A_BARRIER = 0,
00057 MOVE_BARRIER,
00058 TRUE_BARRIER
00059 };
00060
00061 static enum reg_pending_barrier_mode reg_pending_barrier;
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 static bitmap_head *true_dependency_cache;
00077 static bitmap_head *anti_dependency_cache;
00078 static bitmap_head *output_dependency_cache;
00079 int cache_size;
00080
00081
00082
00083
00084
00085 #ifdef ENABLE_CHECKING
00086 static bitmap_head *forward_dependency_cache;
00087 #endif
00088
00089 static int deps_may_trap_p (rtx);
00090 static void add_dependence_list (rtx, rtx, enum reg_note);
00091 static void add_dependence_list_and_free (rtx, rtx *, enum reg_note);
00092 static void delete_all_dependences (rtx);
00093 static void fixup_sched_groups (rtx);
00094
00095 static void flush_pending_lists (struct deps *, rtx, int, int);
00096 static void sched_analyze_1 (struct deps *, rtx, rtx);
00097 static void sched_analyze_2 (struct deps *, rtx, rtx);
00098 static void sched_analyze_insn (struct deps *, rtx, rtx, rtx);
00099
00100 static rtx sched_get_condition (rtx);
00101 static int conditions_mutex_p (rtx, rtx);
00102
00103
00104
00105 static int
00106 deps_may_trap_p (rtx mem)
00107 {
00108 rtx addr = XEXP (mem, 0);
00109
00110 if (REG_P (addr) && REGNO (addr) >= FIRST_PSEUDO_REGISTER)
00111 {
00112 rtx t = get_reg_known_value (REGNO (addr));
00113 if (t)
00114 addr = t;
00115 }
00116 return rtx_addr_can_trap_p (addr);
00117 }
00118
00119
00120
00121
00122 rtx
00123 find_insn_list (rtx insn, rtx list)
00124 {
00125 while (list)
00126 {
00127 if (XEXP (list, 0) == insn)
00128 return list;
00129 list = XEXP (list, 1);
00130 }
00131 return 0;
00132 }
00133
00134
00135
00136 static rtx
00137 sched_get_condition (rtx insn)
00138 {
00139 rtx pat = PATTERN (insn);
00140 rtx src;
00141
00142 if (pat == 0)
00143 return 0;
00144
00145 if (GET_CODE (pat) == COND_EXEC)
00146 return COND_EXEC_TEST (pat);
00147
00148 if (!any_condjump_p (insn) || !onlyjump_p (insn))
00149 return 0;
00150
00151 src = SET_SRC (pc_set (insn));
00152 #if 0
00153
00154
00155
00156
00157 if (XEXP (src, 2) == pc_rtx)
00158 return XEXP (src, 0);
00159 else if (XEXP (src, 1) == pc_rtx)
00160 {
00161 rtx cond = XEXP (src, 0);
00162 enum rtx_code revcode = reversed_comparison_code (cond, insn);
00163
00164 if (revcode == UNKNOWN)
00165 return 0;
00166 return gen_rtx_fmt_ee (revcode, GET_MODE (cond), XEXP (cond, 0),
00167 XEXP (cond, 1));
00168 }
00169 #endif
00170
00171 return 0;
00172 }
00173
00174
00175
00176 static int
00177 conditions_mutex_p (rtx cond1, rtx cond2)
00178 {
00179 if (COMPARISON_P (cond1)
00180 && COMPARISON_P (cond2)
00181 && GET_CODE (cond1) == reversed_comparison_code (cond2, NULL)
00182 && XEXP (cond1, 0) == XEXP (cond2, 0)
00183 && XEXP (cond1, 1) == XEXP (cond2, 1))
00184 return 1;
00185 return 0;
00186 }
00187
00188
00189
00190
00191
00192
00193 int
00194 add_dependence (rtx insn, rtx elem, enum reg_note dep_type)
00195 {
00196 rtx link;
00197 int present_p;
00198 rtx cond1, cond2;
00199
00200
00201 if (insn == elem)
00202 return 0;
00203
00204
00205
00206
00207 if (NOTE_P (elem))
00208 return 0;
00209
00210
00211
00212
00213
00214
00215 if (!CALL_P (insn) && !CALL_P (elem))
00216 {
00217 cond1 = sched_get_condition (insn);
00218 cond2 = sched_get_condition (elem);
00219 if (cond1 && cond2
00220 && conditions_mutex_p (cond1, cond2)
00221
00222
00223 && !modified_in_p (cond1, elem)
00224
00225
00226 && !modified_in_p (cond2, insn))
00227 return 0;
00228 }
00229
00230 present_p = 1;
00231 #ifdef INSN_SCHEDULING
00232
00233
00234 #if 0
00235
00236
00237
00238
00239 if (CALL_P (insn)
00240 && (INSN_BB (elem) != INSN_BB (insn)))
00241 return 0;
00242 #endif
00243
00244
00245
00246
00247 if (true_dependency_cache != NULL)
00248 {
00249 enum reg_note present_dep_type = 0;
00250
00251 gcc_assert (anti_dependency_cache);
00252 gcc_assert (output_dependency_cache);
00253 if (bitmap_bit_p (&true_dependency_cache[INSN_LUID (insn)],
00254 INSN_LUID (elem)))
00255
00256 ;
00257 else if (bitmap_bit_p (&anti_dependency_cache[INSN_LUID (insn)],
00258 INSN_LUID (elem)))
00259 present_dep_type = REG_DEP_ANTI;
00260 else if (bitmap_bit_p (&output_dependency_cache[INSN_LUID (insn)],
00261 INSN_LUID (elem)))
00262 present_dep_type = REG_DEP_OUTPUT;
00263 else
00264 present_p = 0;
00265 if (present_p && (int) dep_type >= (int) present_dep_type)
00266 return 0;
00267 }
00268 #endif
00269
00270
00271 if (present_p)
00272 for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
00273 if (XEXP (link, 0) == elem)
00274 {
00275 #ifdef INSN_SCHEDULING
00276
00277
00278 if (true_dependency_cache != NULL)
00279 {
00280 enum reg_note kind = REG_NOTE_KIND (link);
00281 switch (kind)
00282 {
00283 case REG_DEP_ANTI:
00284 bitmap_clear_bit (&anti_dependency_cache[INSN_LUID (insn)],
00285 INSN_LUID (elem));
00286 break;
00287 case REG_DEP_OUTPUT:
00288 gcc_assert (output_dependency_cache);
00289 bitmap_clear_bit (&output_dependency_cache[INSN_LUID (insn)],
00290 INSN_LUID (elem));
00291 break;
00292 default:
00293 gcc_unreachable ();
00294 }
00295 }
00296 #endif
00297
00298
00299
00300 if ((int) dep_type < (int) REG_NOTE_KIND (link))
00301 PUT_REG_NOTE_KIND (link, dep_type);
00302
00303 #ifdef INSN_SCHEDULING
00304
00305
00306 if (true_dependency_cache != NULL)
00307 {
00308 if ((int) REG_NOTE_KIND (link) == 0)
00309 bitmap_set_bit (&true_dependency_cache[INSN_LUID (insn)],
00310 INSN_LUID (elem));
00311 else if (REG_NOTE_KIND (link) == REG_DEP_ANTI)
00312 bitmap_set_bit (&anti_dependency_cache[INSN_LUID (insn)],
00313 INSN_LUID (elem));
00314 else if (REG_NOTE_KIND (link) == REG_DEP_OUTPUT)
00315 bitmap_set_bit (&output_dependency_cache[INSN_LUID (insn)],
00316 INSN_LUID (elem));
00317 }
00318 #endif
00319 return 0;
00320 }
00321
00322
00323 link = alloc_INSN_LIST (elem, LOG_LINKS (insn));
00324 LOG_LINKS (insn) = link;
00325
00326
00327 PUT_REG_NOTE_KIND (link, dep_type);
00328
00329 #ifdef INSN_SCHEDULING
00330
00331
00332 if (true_dependency_cache != NULL)
00333 {
00334 if ((int) dep_type == 0)
00335 bitmap_set_bit (&true_dependency_cache[INSN_LUID (insn)], INSN_LUID (elem));
00336 else if (dep_type == REG_DEP_ANTI)
00337 bitmap_set_bit (&anti_dependency_cache[INSN_LUID (insn)], INSN_LUID (elem));
00338 else if (dep_type == REG_DEP_OUTPUT)
00339 bitmap_set_bit (&output_dependency_cache[INSN_LUID (insn)], INSN_LUID (elem));
00340 }
00341 #endif
00342 return 1;
00343 }
00344
00345
00346
00347 static void
00348 add_dependence_list (rtx insn, rtx list, enum reg_note dep_type)
00349 {
00350 for (; list; list = XEXP (list, 1))
00351 add_dependence (insn, XEXP (list, 0), dep_type);
00352 }
00353
00354
00355
00356 static void
00357 add_dependence_list_and_free (rtx insn, rtx *listp, enum reg_note dep_type)
00358 {
00359 rtx list, next;
00360 for (list = *listp, *listp = NULL; list ; list = next)
00361 {
00362 next = XEXP (list, 1);
00363 add_dependence (insn, XEXP (list, 0), dep_type);
00364 free_INSN_LIST_node (list);
00365 }
00366 }
00367
00368
00369
00370 static void
00371 delete_all_dependences (rtx insn)
00372 {
00373
00374
00375 #ifdef INSN_SCHEDULING
00376 if (true_dependency_cache != NULL)
00377 {
00378 bitmap_clear (&true_dependency_cache[INSN_LUID (insn)]);
00379 bitmap_clear (&anti_dependency_cache[INSN_LUID (insn)]);
00380 bitmap_clear (&output_dependency_cache[INSN_LUID (insn)]);
00381 }
00382 #endif
00383
00384 free_INSN_LIST_list (&LOG_LINKS (insn));
00385 }
00386
00387
00388
00389
00390
00391
00392
00393 static void
00394 fixup_sched_groups (rtx insn)
00395 {
00396 rtx link;
00397
00398 for (link = LOG_LINKS (insn); link ; link = XEXP (link, 1))
00399 {
00400 rtx i = insn;
00401 do
00402 {
00403 i = prev_nonnote_insn (i);
00404
00405 if (XEXP (link, 0) == i)
00406 goto next_link;
00407 } while (SCHED_GROUP_P (i));
00408 add_dependence (i, XEXP (link, 0), REG_NOTE_KIND (link));
00409 next_link:;
00410 }
00411
00412 delete_all_dependences (insn);
00413
00414 if (BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (prev_nonnote_insn (insn)))
00415 add_dependence (insn, prev_nonnote_insn (insn), REG_DEP_ANTI);
00416 }
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433 static void
00434 add_insn_mem_dependence (struct deps *deps, rtx *insn_list, rtx *mem_list,
00435 rtx insn, rtx mem)
00436 {
00437 rtx link;
00438
00439 link = alloc_INSN_LIST (insn, *insn_list);
00440 *insn_list = link;
00441
00442 if (current_sched_info->use_cselib)
00443 {
00444 mem = shallow_copy_rtx (mem);
00445 XEXP (mem, 0) = cselib_subst_to_values (XEXP (mem, 0));
00446 }
00447 link = alloc_EXPR_LIST (VOIDmode, canon_rtx (mem), *mem_list);
00448 *mem_list = link;
00449
00450 deps->pending_lists_length++;
00451 }
00452
00453
00454
00455
00456
00457 static void
00458 flush_pending_lists (struct deps *deps, rtx insn, int for_read,
00459 int for_write)
00460 {
00461 if (for_write)
00462 {
00463 add_dependence_list_and_free (insn, &deps->pending_read_insns,
00464 REG_DEP_ANTI);
00465 free_EXPR_LIST_list (&deps->pending_read_mems);
00466 }
00467
00468 add_dependence_list_and_free (insn, &deps->pending_write_insns,
00469 for_read ? REG_DEP_ANTI : REG_DEP_OUTPUT);
00470 free_EXPR_LIST_list (&deps->pending_write_mems);
00471 deps->pending_lists_length = 0;
00472
00473 add_dependence_list_and_free (insn, &deps->last_pending_memory_flush,
00474 for_read ? REG_DEP_ANTI : REG_DEP_OUTPUT);
00475 deps->last_pending_memory_flush = alloc_INSN_LIST (insn, NULL_RTX);
00476 deps->pending_flush_length = 1;
00477 }
00478
00479
00480
00481
00482
00483 static void
00484 sched_analyze_1 (struct deps *deps, rtx x, rtx insn)
00485 {
00486 int regno;
00487 rtx dest = XEXP (x, 0);
00488 enum rtx_code code = GET_CODE (x);
00489
00490 if (dest == 0)
00491 return;
00492
00493 if (GET_CODE (dest) == PARALLEL)
00494 {
00495 int i;
00496
00497 for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
00498 if (XEXP (XVECEXP (dest, 0, i), 0) != 0)
00499 sched_analyze_1 (deps,
00500 gen_rtx_CLOBBER (VOIDmode,
00501 XEXP (XVECEXP (dest, 0, i), 0)),
00502 insn);
00503
00504 if (GET_CODE (x) == SET)
00505 sched_analyze_2 (deps, SET_SRC (x), insn);
00506 return;
00507 }
00508
00509 while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG
00510 || GET_CODE (dest) == ZERO_EXTRACT)
00511 {
00512 if (GET_CODE (dest) == STRICT_LOW_PART
00513 || GET_CODE (dest) == ZERO_EXTRACT
00514 || read_modify_subreg_p (dest))
00515 {
00516
00517
00518
00519
00520
00521
00522 sched_analyze_2 (deps, XEXP (dest, 0), insn);
00523 }
00524 if (GET_CODE (dest) == ZERO_EXTRACT)
00525 {
00526
00527 sched_analyze_2 (deps, XEXP (dest, 1), insn);
00528 sched_analyze_2 (deps, XEXP (dest, 2), insn);
00529 }
00530 dest = XEXP (dest, 0);
00531 }
00532
00533 if (REG_P (dest))
00534 {
00535 regno = REGNO (dest);
00536
00537
00538
00539 if (regno < FIRST_PSEUDO_REGISTER)
00540 {
00541 int i = hard_regno_nregs[regno][GET_MODE (dest)];
00542 if (code == SET)
00543 {
00544 while (--i >= 0)
00545 SET_REGNO_REG_SET (reg_pending_sets, regno + i);
00546 }
00547 else
00548 {
00549 while (--i >= 0)
00550 SET_REGNO_REG_SET (reg_pending_clobbers, regno + i);
00551 }
00552 }
00553
00554
00555
00556 else if (regno >= deps->max_reg)
00557 {
00558 gcc_assert (GET_CODE (PATTERN (insn)) == USE
00559 || GET_CODE (PATTERN (insn)) == CLOBBER);
00560 }
00561 else
00562 {
00563 if (code == SET)
00564 SET_REGNO_REG_SET (reg_pending_sets, regno);
00565 else
00566 SET_REGNO_REG_SET (reg_pending_clobbers, regno);
00567
00568
00569
00570
00571 if (!reload_completed && get_reg_known_equiv_p (regno))
00572 {
00573 rtx t = get_reg_known_value (regno);
00574 if (MEM_P (t))
00575 sched_analyze_2 (deps, XEXP (t, 0), insn);
00576 }
00577
00578
00579
00580 if (REG_N_CALLS_CROSSED (regno) == 0)
00581 add_dependence_list (insn, deps->last_function_call, REG_DEP_ANTI);
00582 }
00583 }
00584 else if (MEM_P (dest))
00585 {
00586
00587 rtx t = dest;
00588
00589 if (current_sched_info->use_cselib)
00590 {
00591 t = shallow_copy_rtx (dest);
00592 cselib_lookup (XEXP (t, 0), Pmode, 1);
00593 XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0));
00594 }
00595 t = canon_rtx (t);
00596
00597 if (deps->pending_lists_length > MAX_PENDING_LIST_LENGTH)
00598 {
00599
00600
00601
00602
00603
00604 flush_pending_lists (deps, insn, false, true);
00605 }
00606 else
00607 {
00608 rtx pending, pending_mem;
00609
00610 pending = deps->pending_read_insns;
00611 pending_mem = deps->pending_read_mems;
00612 while (pending)
00613 {
00614 if (anti_dependence (XEXP (pending_mem, 0), t))
00615 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
00616
00617 pending = XEXP (pending, 1);
00618 pending_mem = XEXP (pending_mem, 1);
00619 }
00620
00621 pending = deps->pending_write_insns;
00622 pending_mem = deps->pending_write_mems;
00623 while (pending)
00624 {
00625 if (output_dependence (XEXP (pending_mem, 0), t))
00626 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
00627
00628 pending = XEXP (pending, 1);
00629 pending_mem = XEXP (pending_mem, 1);
00630 }
00631
00632 add_dependence_list (insn, deps->last_pending_memory_flush,
00633 REG_DEP_ANTI);
00634
00635 add_insn_mem_dependence (deps, &deps->pending_write_insns,
00636 &deps->pending_write_mems, insn, dest);
00637 }
00638 sched_analyze_2 (deps, XEXP (dest, 0), insn);
00639 }
00640
00641
00642 if (GET_CODE (x) == SET)
00643 sched_analyze_2 (deps, SET_SRC (x), insn);
00644 }
00645
00646
00647
00648 static void
00649 sched_analyze_2 (struct deps *deps, rtx x, rtx insn)
00650 {
00651 int i;
00652 int j;
00653 enum rtx_code code;
00654 const char *fmt;
00655
00656 if (x == 0)
00657 return;
00658
00659 code = GET_CODE (x);
00660
00661 switch (code)
00662 {
00663 case CONST_INT:
00664 case CONST_DOUBLE:
00665 case CONST_VECTOR:
00666 case SYMBOL_REF:
00667 case CONST:
00668 case LABEL_REF:
00669
00670
00671
00672 return;
00673
00674 #ifdef HAVE_cc0
00675 case CC0:
00676
00677 SCHED_GROUP_P (insn) = 1;
00678
00679
00680 CANT_MOVE (prev_nonnote_insn (insn)) = 1;
00681 return;
00682 #endif
00683
00684 case REG:
00685 {
00686 int regno = REGNO (x);
00687 if (regno < FIRST_PSEUDO_REGISTER)
00688 {
00689 int i = hard_regno_nregs[regno][GET_MODE (x)];
00690 while (--i >= 0)
00691 SET_REGNO_REG_SET (reg_pending_uses, regno + i);
00692 }
00693
00694
00695
00696 else if (regno >= deps->max_reg)
00697 {
00698 gcc_assert (GET_CODE (PATTERN (insn)) == USE
00699 || GET_CODE (PATTERN (insn)) == CLOBBER);
00700 }
00701 else
00702 {
00703 SET_REGNO_REG_SET (reg_pending_uses, regno);
00704
00705
00706
00707
00708 if (!reload_completed && get_reg_known_equiv_p (regno))
00709 {
00710 rtx t = get_reg_known_value (regno);
00711 if (MEM_P (t))
00712 sched_analyze_2 (deps, XEXP (t, 0), insn);
00713 }
00714
00715
00716
00717
00718 if (REG_N_CALLS_CROSSED (regno) == 0)
00719 deps->sched_before_next_call
00720 = alloc_INSN_LIST (insn, deps->sched_before_next_call);
00721 }
00722 return;
00723 }
00724
00725 case MEM:
00726 {
00727
00728 rtx u;
00729 rtx pending, pending_mem;
00730 rtx t = x;
00731
00732 if (current_sched_info->use_cselib)
00733 {
00734 t = shallow_copy_rtx (t);
00735 cselib_lookup (XEXP (t, 0), Pmode, 1);
00736 XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0));
00737 }
00738 t = canon_rtx (t);
00739 pending = deps->pending_read_insns;
00740 pending_mem = deps->pending_read_mems;
00741 while (pending)
00742 {
00743 if (read_dependence (XEXP (pending_mem, 0), t))
00744 add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI);
00745
00746 pending = XEXP (pending, 1);
00747 pending_mem = XEXP (pending_mem, 1);
00748 }
00749
00750 pending = deps->pending_write_insns;
00751 pending_mem = deps->pending_write_mems;
00752 while (pending)
00753 {
00754 if (true_dependence (XEXP (pending_mem, 0), VOIDmode,
00755 t, rtx_varies_p))
00756 add_dependence (insn, XEXP (pending, 0), 0);
00757
00758 pending = XEXP (pending, 1);
00759 pending_mem = XEXP (pending_mem, 1);
00760 }
00761
00762 for (u = deps->last_pending_memory_flush; u; u = XEXP (u, 1))
00763 if (!JUMP_P (XEXP (u, 0))
00764 || deps_may_trap_p (x))
00765 add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI);
00766
00767
00768
00769 add_insn_mem_dependence (deps, &deps->pending_read_insns,
00770 &deps->pending_read_mems, insn, x);
00771
00772
00773 sched_analyze_2 (deps, XEXP (x, 0), insn);
00774 return;
00775 }
00776
00777
00778 case TRAP_IF:
00779 flush_pending_lists (deps, insn, true, false);
00780 break;
00781
00782 case ASM_OPERANDS:
00783 case ASM_INPUT:
00784 case UNSPEC_VOLATILE:
00785 {
00786
00787
00788
00789
00790
00791
00792
00793 if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
00794 reg_pending_barrier = TRUE_BARRIER;
00795
00796
00797
00798
00799
00800
00801 if (code == ASM_OPERANDS)
00802 {
00803 for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
00804 sched_analyze_2 (deps, ASM_OPERANDS_INPUT (x, j), insn);
00805 return;
00806 }
00807 break;
00808 }
00809
00810 case PRE_DEC:
00811 case POST_DEC:
00812 case PRE_INC:
00813 case POST_INC:
00814
00815
00816
00817
00818
00819
00820 sched_analyze_2 (deps, XEXP (x, 0), insn);
00821 sched_analyze_1 (deps, x, insn);
00822 return;
00823
00824 case POST_MODIFY:
00825 case PRE_MODIFY:
00826
00827 sched_analyze_2 (deps, XEXP (x, 0), insn);
00828 sched_analyze_2 (deps, XEXP (x, 1), insn);
00829 sched_analyze_1 (deps, x, insn);
00830 return;
00831
00832 default:
00833 break;
00834 }
00835
00836
00837 fmt = GET_RTX_FORMAT (code);
00838 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
00839 {
00840 if (fmt[i] == 'e')
00841 sched_analyze_2 (deps, XEXP (x, i), insn);
00842 else if (fmt[i] == 'E')
00843 for (j = 0; j < XVECLEN (x, i); j++)
00844 sched_analyze_2 (deps, XVECEXP (x, i, j), insn);
00845 }
00846 }
00847
00848
00849
00850 static void
00851 sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes)
00852 {
00853 RTX_CODE code = GET_CODE (x);
00854 rtx link;
00855 unsigned i;
00856 reg_set_iterator rsi;
00857
00858 if (code == COND_EXEC)
00859 {
00860 sched_analyze_2 (deps, COND_EXEC_TEST (x), insn);
00861
00862
00863
00864 x = COND_EXEC_CODE (x);
00865 code = GET_CODE (x);
00866 }
00867 if (code == SET || code == CLOBBER)
00868 {
00869 sched_analyze_1 (deps, x, insn);
00870
00871
00872
00873
00874 if (code == CLOBBER)
00875 add_dependence_list (insn, deps->last_function_call, REG_DEP_OUTPUT);
00876 }
00877 else if (code == PARALLEL)
00878 {
00879 for (i = XVECLEN (x, 0); i--;)
00880 {
00881 rtx sub = XVECEXP (x, 0, i);
00882 code = GET_CODE (sub);
00883
00884 if (code == COND_EXEC)
00885 {
00886 sched_analyze_2 (deps, COND_EXEC_TEST (sub), insn);
00887 sub = COND_EXEC_CODE (sub);
00888 code = GET_CODE (sub);
00889 }
00890 if (code == SET || code == CLOBBER)
00891 sched_analyze_1 (deps, sub, insn);
00892 else
00893 sched_analyze_2 (deps, sub, insn);
00894 }
00895 }
00896 else
00897 sched_analyze_2 (deps, x, insn);
00898
00899
00900 if (CALL_P (insn))
00901 {
00902 for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
00903 {
00904 if (GET_CODE (XEXP (link, 0)) == CLOBBER)
00905 sched_analyze_1 (deps, XEXP (link, 0), insn);
00906 else
00907 sched_analyze_2 (deps, XEXP (link, 0), insn);
00908 }
00909 if (find_reg_note (insn, REG_SETJMP, NULL))
00910 reg_pending_barrier = MOVE_BARRIER;
00911 }
00912
00913 if (JUMP_P (insn))
00914 {
00915 rtx next;
00916 next = next_nonnote_insn (insn);
00917 if (next && BARRIER_P (next))
00918 reg_pending_barrier = TRUE_BARRIER;
00919 else
00920 {
00921 rtx pending, pending_mem;
00922 regset_head tmp_uses, tmp_sets;
00923 INIT_REG_SET (&tmp_uses);
00924 INIT_REG_SET (&tmp_sets);
00925
00926 (*current_sched_info->compute_jump_reg_dependencies)
00927 (insn, &deps->reg_conditional_sets, &tmp_uses, &tmp_sets);
00928
00929 EXECUTE_IF_SET_IN_REG_SET (&tmp_uses, 0, i, rsi)
00930 {
00931 struct deps_reg *reg_last = &deps->reg_last[i];
00932 add_dependence_list (insn, reg_last->sets, REG_DEP_ANTI);
00933 add_dependence_list (insn, reg_last->clobbers, REG_DEP_ANTI);
00934 reg_last->uses_length++;
00935 reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
00936 }
00937 IOR_REG_SET (reg_pending_sets, &tmp_sets);
00938
00939 CLEAR_REG_SET (&tmp_uses);
00940 CLEAR_REG_SET (&tmp_sets);
00941
00942
00943
00944
00945
00946 pending = deps->pending_write_insns;
00947 pending_mem = deps->pending_write_mems;
00948 while (pending)
00949 {
00950 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
00951 pending = XEXP (pending, 1);
00952 pending_mem = XEXP (pending_mem, 1);
00953 }
00954
00955 pending = deps->pending_read_insns;
00956 pending_mem = deps->pending_read_mems;
00957 while (pending)
00958 {
00959 if (MEM_VOLATILE_P (XEXP (pending_mem, 0)))
00960 add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT);
00961 pending = XEXP (pending, 1);
00962 pending_mem = XEXP (pending_mem, 1);
00963 }
00964
00965 add_dependence_list (insn, deps->last_pending_memory_flush,
00966 REG_DEP_ANTI);
00967 }
00968 }
00969
00970
00971
00972
00973
00974 if (loop_notes)
00975 {
00976 rtx link;
00977
00978
00979 link = loop_notes;
00980 while (XEXP (link, 1))
00981 {
00982 gcc_assert (INTVAL (XEXP (link, 0)) == NOTE_INSN_LOOP_BEG
00983 || INTVAL (XEXP (link, 0)) == NOTE_INSN_LOOP_END);
00984
00985 reg_pending_barrier = MOVE_BARRIER;
00986 link = XEXP (link, 1);
00987 }
00988 XEXP (link, 1) = REG_NOTES (insn);
00989 REG_NOTES (insn) = loop_notes;
00990 }
00991
00992
00993
00994
00995 if (can_throw_internal (insn))
00996 reg_pending_barrier = MOVE_BARRIER;
00997
00998
00999 if (reg_pending_barrier)
01000 {
01001
01002
01003 if (GET_CODE (PATTERN (insn)) == COND_EXEC)
01004 {
01005 EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
01006 {
01007 struct deps_reg *reg_last = &deps->reg_last[i];
01008 add_dependence_list (insn, reg_last->uses, REG_DEP_ANTI);
01009 add_dependence_list
01010 (insn, reg_last->sets,
01011 reg_pending_barrier == TRUE_BARRIER ? 0 : REG_DEP_ANTI);
01012 add_dependence_list
01013 (insn, reg_last->clobbers,
01014 reg_pending_barrier == TRUE_BARRIER ? 0 : REG_DEP_ANTI);
01015 }
01016 }
01017 else
01018 {
01019 EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
01020 {
01021 struct deps_reg *reg_last = &deps->reg_last[i];
01022 add_dependence_list_and_free (insn, ®_last->uses,
01023 REG_DEP_ANTI);
01024 add_dependence_list_and_free
01025 (insn, ®_last->sets,
01026 reg_pending_barrier == TRUE_BARRIER ? 0 : REG_DEP_ANTI);
01027 add_dependence_list_and_free
01028 (insn, ®_last->clobbers,
01029 reg_pending_barrier == TRUE_BARRIER ? 0 : REG_DEP_ANTI);
01030 reg_last->uses_length = 0;
01031 reg_last->clobbers_length = 0;
01032 }
01033 }
01034
01035 for (i = 0; i < (unsigned)deps->max_reg; i++)
01036 {
01037 struct deps_reg *reg_last = &deps->reg_last[i];
01038 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
01039 SET_REGNO_REG_SET (&deps->reg_last_in_use, i);
01040 }
01041
01042 flush_pending_lists (deps, insn, true, true);
01043 CLEAR_REG_SET (&deps->reg_conditional_sets);
01044 reg_pending_barrier = NOT_A_BARRIER;
01045 }
01046 else
01047 {
01048
01049
01050 if (GET_CODE (PATTERN (insn)) == COND_EXEC)
01051 {
01052 EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
01053 {
01054 struct deps_reg *reg_last = &deps->reg_last[i];
01055 add_dependence_list (insn, reg_last->sets, 0);
01056 add_dependence_list (insn, reg_last->clobbers, 0);
01057 reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
01058 reg_last->uses_length++;
01059 }
01060 EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i, rsi)
01061 {
01062 struct deps_reg *reg_last = &deps->reg_last[i];
01063 add_dependence_list (insn, reg_last->sets, REG_DEP_OUTPUT);
01064 add_dependence_list (insn, reg_last->uses, REG_DEP_ANTI);
01065 reg_last->clobbers = alloc_INSN_LIST (insn, reg_last->clobbers);
01066 reg_last->clobbers_length++;
01067 }
01068 EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, rsi)
01069 {
01070 struct deps_reg *reg_last = &deps->reg_last[i];
01071 add_dependence_list (insn, reg_last->sets, REG_DEP_OUTPUT);
01072 add_dependence_list (insn, reg_last->clobbers, REG_DEP_OUTPUT);
01073 add_dependence_list (insn, reg_last->uses, REG_DEP_ANTI);
01074 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
01075 SET_REGNO_REG_SET (&deps->reg_conditional_sets, i);
01076 }
01077 }
01078 else
01079 {
01080 EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
01081 {
01082 struct deps_reg *reg_last = &deps->reg_last[i];
01083 add_dependence_list (insn, reg_last->sets, 0);
01084 add_dependence_list (insn, reg_last->clobbers, 0);
01085 reg_last->uses_length++;
01086 reg_last->uses = alloc_INSN_LIST (insn, reg_last->uses);
01087 }
01088 EXECUTE_IF_SET_IN_REG_SET (reg_pending_clobbers, 0, i, rsi)
01089 {
01090 struct deps_reg *reg_last = &deps->reg_last[i];
01091 if (reg_last->uses_length > MAX_PENDING_LIST_LENGTH
01092 || reg_last->clobbers_length > MAX_PENDING_LIST_LENGTH)
01093 {
01094 add_dependence_list_and_free (insn, ®_last->sets,
01095 REG_DEP_OUTPUT);
01096 add_dependence_list_and_free (insn, ®_last->uses,
01097 REG_DEP_ANTI);
01098 add_dependence_list_and_free (insn, ®_last->clobbers,
01099 REG_DEP_OUTPUT);
01100 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
01101 reg_last->clobbers_length = 0;
01102 reg_last->uses_length = 0;
01103 }
01104 else
01105 {
01106 add_dependence_list (insn, reg_last->sets, REG_DEP_OUTPUT);
01107 add_dependence_list (insn, reg_last->uses, REG_DEP_ANTI);
01108 }
01109 reg_last->clobbers_length++;
01110 reg_last->clobbers = alloc_INSN_LIST (insn, reg_last->clobbers);
01111 }
01112 EXECUTE_IF_SET_IN_REG_SET (reg_pending_sets, 0, i, rsi)
01113 {
01114 struct deps_reg *reg_last = &deps->reg_last[i];
01115 add_dependence_list_and_free (insn, ®_last->sets,
01116 REG_DEP_OUTPUT);
01117 add_dependence_list_and_free (insn, ®_last->clobbers,
01118 REG_DEP_OUTPUT);
01119 add_dependence_list_and_free (insn, ®_last->uses,
01120 REG_DEP_ANTI);
01121 reg_last->sets = alloc_INSN_LIST (insn, reg_last->sets);
01122 reg_last->uses_length = 0;
01123 reg_last->clobbers_length = 0;
01124 CLEAR_REGNO_REG_SET (&deps->reg_conditional_sets, i);
01125 }
01126 }
01127
01128 IOR_REG_SET (&deps->reg_last_in_use, reg_pending_uses);
01129 IOR_REG_SET (&deps->reg_last_in_use, reg_pending_clobbers);
01130 IOR_REG_SET (&deps->reg_last_in_use, reg_pending_sets);
01131 }
01132 CLEAR_REG_SET (reg_pending_uses);
01133 CLEAR_REG_SET (reg_pending_clobbers);
01134 CLEAR_REG_SET (reg_pending_sets);
01135
01136
01137
01138
01139
01140 if (deps->libcall_block_tail_insn)
01141 {
01142 SCHED_GROUP_P (insn) = 1;
01143 CANT_MOVE (insn) = 1;
01144 }
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155 if (deps->in_post_call_group_p)
01156 {
01157 rtx tmp, set = single_set (insn);
01158 int src_regno, dest_regno;
01159
01160 if (set == NULL)
01161 goto end_call_group;
01162
01163 tmp = SET_DEST (set);
01164 if (GET_CODE (tmp) == SUBREG)
01165 tmp = SUBREG_REG (tmp);
01166 if (REG_P (tmp))
01167 dest_regno = REGNO (tmp);
01168 else
01169 goto end_call_group;
01170
01171 tmp = SET_SRC (set);
01172 if (GET_CODE (tmp) == SUBREG)
01173 tmp = SUBREG_REG (tmp);
01174 if ((GET_CODE (tmp) == PLUS
01175 || GET_CODE (tmp) == MINUS)
01176 && REG_P (XEXP (tmp, 0))
01177 && REGNO (XEXP (tmp, 0)) == STACK_POINTER_REGNUM
01178 && dest_regno == STACK_POINTER_REGNUM)
01179 src_regno = STACK_POINTER_REGNUM;
01180 else if (REG_P (tmp))
01181 src_regno = REGNO (tmp);
01182 else
01183 goto end_call_group;
01184
01185 if (src_regno < FIRST_PSEUDO_REGISTER
01186 || dest_regno < FIRST_PSEUDO_REGISTER)
01187 {
01188 if (deps->in_post_call_group_p == post_call_initial)
01189 deps->in_post_call_group_p = post_call;
01190
01191 SCHED_GROUP_P (insn) = 1;
01192 CANT_MOVE (insn) = 1;
01193 }
01194 else
01195 {
01196 end_call_group:
01197 deps->in_post_call_group_p = not_post_call;
01198 }
01199 }
01200
01201
01202 if (SCHED_GROUP_P (insn))
01203 fixup_sched_groups (insn);
01204 }
01205
01206
01207
01208
01209 void
01210 sched_analyze (struct deps *deps, rtx head, rtx tail)
01211 {
01212 rtx insn;
01213 rtx loop_notes = 0;
01214
01215 if (current_sched_info->use_cselib)
01216 cselib_init (true);
01217
01218
01219
01220
01221 if (! reload_completed && !LABEL_P (head))
01222 {
01223 insn = prev_nonnote_insn (head);
01224 if (insn && CALL_P (insn))
01225 deps->in_post_call_group_p = post_call_initial;
01226 }
01227 for (insn = head;; insn = NEXT_INSN (insn))
01228 {
01229 rtx link, end_seq, r0, set;
01230
01231 if (NONJUMP_INSN_P (insn) || JUMP_P (insn))
01232 {
01233
01234 free_INSN_LIST_list (&LOG_LINKS (insn));
01235
01236
01237
01238 if (JUMP_P (insn))
01239 {
01240
01241 if (deps->pending_flush_length++ > MAX_PENDING_LIST_LENGTH)
01242 flush_pending_lists (deps, insn, true, true);
01243 else
01244 deps->last_pending_memory_flush
01245 = alloc_INSN_LIST (insn, deps->last_pending_memory_flush);
01246 }
01247 sched_analyze_insn (deps, PATTERN (insn), insn, loop_notes);
01248 loop_notes = 0;
01249 }
01250 else if (CALL_P (insn))
01251 {
01252 int i;
01253
01254 CANT_MOVE (insn) = 1;
01255
01256
01257 free_INSN_LIST_list (&LOG_LINKS (insn));
01258
01259 if (find_reg_note (insn, REG_SETJMP, NULL))
01260 {
01261
01262
01263 reg_pending_barrier = MOVE_BARRIER;
01264 }
01265 else
01266 {
01267 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
01268
01269 if (global_regs[i])
01270 {
01271 SET_REGNO_REG_SET (reg_pending_sets, i);
01272 SET_REGNO_REG_SET (reg_pending_uses, i);
01273 }
01274
01275
01276
01277
01278 else if (HARD_REGNO_CALL_PART_CLOBBERED (i, reg_raw_mode[i])
01279 || TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
01280 SET_REGNO_REG_SET (reg_pending_clobbers, i);
01281
01282
01283
01284 else if (fixed_regs[i])
01285 SET_REGNO_REG_SET (reg_pending_uses, i);
01286
01287
01288
01289
01290
01291 else if (i == FRAME_POINTER_REGNUM
01292 || (i == HARD_FRAME_POINTER_REGNUM
01293 && (! reload_completed || frame_pointer_needed)))
01294 SET_REGNO_REG_SET (reg_pending_uses, i);
01295 }
01296
01297
01298
01299 add_dependence_list_and_free (insn, &deps->sched_before_next_call,
01300 REG_DEP_ANTI);
01301
01302 sched_analyze_insn (deps, PATTERN (insn), insn, loop_notes);
01303 loop_notes = 0;
01304
01305
01306
01307
01308
01309 flush_pending_lists (deps, insn, true, !CONST_OR_PURE_CALL_P (insn));
01310
01311
01312 free_INSN_LIST_list (&deps->last_function_call);
01313 deps->last_function_call = alloc_INSN_LIST (insn, NULL_RTX);
01314
01315
01316
01317 if (! reload_completed)
01318 deps->in_post_call_group_p = post_call;
01319 }
01320
01321
01322
01323 if (NOTE_P (insn))
01324 gcc_assert (NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_BEG
01325 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_EH_REGION_END);
01326
01327
01328
01329
01330 if (NOTE_P (insn)
01331 && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
01332 || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END))
01333 {
01334 loop_notes = alloc_EXPR_LIST (REG_SAVE_NOTE,
01335 GEN_INT (NOTE_LINE_NUMBER (insn)),
01336 loop_notes);
01337 CONST_OR_PURE_CALL_P (loop_notes) = CONST_OR_PURE_CALL_P (insn);
01338 }
01339
01340 if (current_sched_info->use_cselib)
01341 cselib_process_insn (insn);
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354 if (!reload_completed
01355
01356
01357 && deps->libcall_block_tail_insn == 0
01358
01359 && NONJUMP_INSN_P (insn)
01360 && GET_CODE (PATTERN (insn)) == CLOBBER
01361 && (r0 = XEXP (PATTERN (insn), 0), REG_P (r0))
01362 && REG_P (XEXP (PATTERN (insn), 0))
01363
01364 && (link = find_reg_note (insn, REG_LIBCALL, NULL_RTX)) != 0
01365 && (end_seq = XEXP (link, 0)) != 0
01366
01367
01368
01369 && (set = single_set (end_seq)) != 0
01370 && SET_DEST (set) == r0 && SET_SRC (set) == r0
01371
01372
01373 && find_reg_note (end_seq, REG_EQUAL, NULL_RTX) != 0
01374 && find_reg_note (end_seq, REG_RETVAL, NULL_RTX) != 0)
01375 deps->libcall_block_tail_insn = XEXP (link, 0);
01376
01377
01378
01379 if (deps->libcall_block_tail_insn == insn)
01380 deps->libcall_block_tail_insn = 0;
01381
01382 if (insn == tail)
01383 {
01384 if (current_sched_info->use_cselib)
01385 cselib_finish ();
01386 return;
01387 }
01388 }
01389 gcc_unreachable ();
01390 }
01391
01392
01393
01394
01395
01396 void
01397 add_forward_dependence (rtx from, rtx to, enum reg_note dep_type)
01398 {
01399 rtx new_link;
01400
01401 #ifdef ENABLE_CHECKING
01402
01403
01404
01405
01406
01407
01408 gcc_assert (!NOTE_P (from));
01409 gcc_assert (!INSN_DELETED_P (from));
01410 if (forward_dependency_cache)
01411 gcc_assert (!bitmap_bit_p (&forward_dependency_cache[INSN_LUID (from)],
01412 INSN_LUID (to)));
01413 else
01414 gcc_assert (!find_insn_list (to, INSN_DEPEND (from)));
01415
01416
01417 if (forward_dependency_cache != NULL)
01418 bitmap_bit_p (&forward_dependency_cache[INSN_LUID (from)],
01419 INSN_LUID (to));
01420 #endif
01421
01422 new_link = alloc_INSN_LIST (to, INSN_DEPEND (from));
01423
01424 PUT_REG_NOTE_KIND (new_link, dep_type);
01425
01426 INSN_DEPEND (from) = new_link;
01427 INSN_DEP_COUNT (to) += 1;
01428 }
01429
01430
01431
01432
01433
01434 void
01435 compute_forward_dependences (rtx head, rtx tail)
01436 {
01437 rtx insn, link;
01438 rtx next_tail;
01439
01440 next_tail = NEXT_INSN (tail);
01441 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
01442 {
01443 if (! INSN_P (insn))
01444 continue;
01445
01446 for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
01447 add_forward_dependence (XEXP (link, 0), insn, REG_NOTE_KIND (link));
01448 }
01449 }
01450
01451
01452
01453
01454 void
01455 init_deps (struct deps *deps)
01456 {
01457 int max_reg = (reload_completed ? FIRST_PSEUDO_REGISTER : max_reg_num ());
01458
01459 deps->max_reg = max_reg;
01460 deps->reg_last = xcalloc (max_reg, sizeof (struct deps_reg));
01461 INIT_REG_SET (&deps->reg_last_in_use);
01462 INIT_REG_SET (&deps->reg_conditional_sets);
01463
01464 deps->pending_read_insns = 0;
01465 deps->pending_read_mems = 0;
01466 deps->pending_write_insns = 0;
01467 deps->pending_write_mems = 0;
01468 deps->pending_lists_length = 0;
01469 deps->pending_flush_length = 0;
01470 deps->last_pending_memory_flush = 0;
01471 deps->last_function_call = 0;
01472 deps->sched_before_next_call = 0;
01473 deps->in_post_call_group_p = not_post_call;
01474 deps->libcall_block_tail_insn = 0;
01475 }
01476
01477
01478
01479 void
01480 free_deps (struct deps *deps)
01481 {
01482 unsigned i;
01483 reg_set_iterator rsi;
01484
01485 free_INSN_LIST_list (&deps->pending_read_insns);
01486 free_EXPR_LIST_list (&deps->pending_read_mems);
01487 free_INSN_LIST_list (&deps->pending_write_insns);
01488 free_EXPR_LIST_list (&deps->pending_write_mems);
01489 free_INSN_LIST_list (&deps->last_pending_memory_flush);
01490
01491
01492
01493
01494 EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
01495 {
01496 struct deps_reg *reg_last = &deps->reg_last[i];
01497 if (reg_last->uses)
01498 free_INSN_LIST_list (®_last->uses);
01499 if (reg_last->sets)
01500 free_INSN_LIST_list (®_last->sets);
01501 if (reg_last->clobbers)
01502 free_INSN_LIST_list (®_last->clobbers);
01503 }
01504 CLEAR_REG_SET (&deps->reg_last_in_use);
01505 CLEAR_REG_SET (&deps->reg_conditional_sets);
01506
01507 free (deps->reg_last);
01508 }
01509
01510
01511
01512
01513
01514 void
01515 init_dependency_caches (int luid)
01516 {
01517
01518
01519
01520
01521
01522
01523 if (luid / n_basic_blocks > 100 * 5)
01524 {
01525 int i;
01526 true_dependency_cache = xmalloc (luid * sizeof (bitmap_head));
01527 anti_dependency_cache = xmalloc (luid * sizeof (bitmap_head));
01528 output_dependency_cache = xmalloc (luid * sizeof (bitmap_head));
01529 #ifdef ENABLE_CHECKING
01530 forward_dependency_cache = xmalloc (luid * sizeof (bitmap_head));
01531 #endif
01532 for (i = 0; i < luid; i++)
01533 {
01534 bitmap_initialize (&true_dependency_cache[i], 0);
01535 bitmap_initialize (&anti_dependency_cache[i], 0);
01536 bitmap_initialize (&output_dependency_cache[i], 0);
01537 #ifdef ENABLE_CHECKING
01538 bitmap_initialize (&forward_dependency_cache[i], 0);
01539 #endif
01540 }
01541 cache_size = luid;
01542 }
01543 }
01544
01545
01546
01547 void
01548 free_dependency_caches (void)
01549 {
01550 if (true_dependency_cache)
01551 {
01552 int i;
01553
01554 for (i = 0; i < cache_size; i++)
01555 {
01556 bitmap_clear (&true_dependency_cache[i]);
01557 bitmap_clear (&anti_dependency_cache[i]);
01558 bitmap_clear (&output_dependency_cache[i]);
01559 #ifdef ENABLE_CHECKING
01560 bitmap_clear (&forward_dependency_cache[i]);
01561 #endif
01562 }
01563 free (true_dependency_cache);
01564 true_dependency_cache = NULL;
01565 free (anti_dependency_cache);
01566 anti_dependency_cache = NULL;
01567 free (output_dependency_cache);
01568 output_dependency_cache = NULL;
01569 #ifdef ENABLE_CHECKING
01570 free (forward_dependency_cache);
01571 forward_dependency_cache = NULL;
01572 #endif
01573 }
01574 }
01575
01576
01577
01578
01579 void
01580 init_deps_global (void)
01581 {
01582 reg_pending_sets = ALLOC_REG_SET (®_obstack);
01583 reg_pending_clobbers = ALLOC_REG_SET (®_obstack);
01584 reg_pending_uses = ALLOC_REG_SET (®_obstack);
01585 reg_pending_barrier = NOT_A_BARRIER;
01586 }
01587
01588
01589
01590 void
01591 finish_deps_global (void)
01592 {
01593 FREE_REG_SET (reg_pending_sets);
01594 FREE_REG_SET (reg_pending_clobbers);
01595 FREE_REG_SET (reg_pending_uses);
01596 }