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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 #include "config.h"
00279 #include "system.h"
00280 #include "coretypes.h"
00281 #include "tm.h"
00282 #include "rtl.h"
00283 #include "tm_p.h"
00284 #include "insn-config.h"
00285 #include "recog.h"
00286 #include "function.h"
00287 #include "regs.h"
00288 #include "output.h"
00289 #include "alloc-pool.h"
00290 #include "flags.h"
00291 #include "hard-reg-set.h"
00292 #include "basic-block.h"
00293 #include "sbitmap.h"
00294 #include "bitmap.h"
00295 #include "timevar.h"
00296 #include "df.h"
00297 #include "tree-pass.h"
00298
00299 static struct df *ddf = NULL;
00300 struct df *shared_df = NULL;
00301
00302 static void *df_get_bb_info (struct dataflow *, unsigned int);
00303 static void df_set_bb_info (struct dataflow *, unsigned int, void *);
00304
00305
00306
00307
00308
00309
00310
00311
00312 struct df *
00313 df_init (int flags)
00314 {
00315 struct df *df = XCNEW (struct df);
00316
00317
00318
00319 df_hard_reg_init ();
00320
00321
00322 df_scan_add_problem (df, flags);
00323 ddf = df;
00324 return df;
00325 }
00326
00327
00328
00329 struct dataflow *
00330 df_add_problem (struct df *df, struct df_problem *problem, int flags)
00331 {
00332 struct dataflow *dflow;
00333
00334
00335 if (problem->dependent_problem_fun)
00336 (problem->dependent_problem_fun) (df, 0);
00337
00338
00339
00340
00341 dflow = df->problems_by_index[problem->id];
00342 if (dflow)
00343 return dflow;
00344
00345
00346 dflow = XCNEW (struct dataflow);
00347 dflow->flags = flags;
00348 dflow->df = df;
00349 dflow->problem = problem;
00350 df->problems_in_order[df->num_problems_defined++] = dflow;
00351 df->problems_by_index[dflow->problem->id] = dflow;
00352
00353 return dflow;
00354 }
00355
00356
00357
00358
00359
00360 int
00361 df_set_flags (struct dataflow *dflow, int mask)
00362 {
00363 int old_flags = dflow->flags;
00364
00365 gcc_assert (!(mask & (~dflow->problem->changeable_flags)));
00366
00367 dflow->flags |= mask;
00368
00369 return old_flags;
00370 }
00371
00372
00373
00374
00375 int
00376 df_clear_flags (struct dataflow *dflow, int mask)
00377 {
00378 int old_flags = dflow->flags;
00379
00380 gcc_assert (!(mask & (~dflow->problem->changeable_flags)));
00381
00382 dflow->flags &= !mask;
00383
00384 return old_flags;
00385 }
00386
00387
00388
00389
00390
00391 void
00392 df_set_blocks (struct df *df, bitmap blocks)
00393 {
00394 if (blocks)
00395 {
00396 if (df->blocks_to_analyze)
00397 {
00398 int p;
00399 bitmap diff = BITMAP_ALLOC (NULL);
00400 bitmap_and_compl (diff, df->blocks_to_analyze, blocks);
00401 for (p = df->num_problems_defined - 1; p >= 0 ;p--)
00402 {
00403 struct dataflow *dflow = df->problems_in_order[p];
00404 if (dflow->problem->reset_fun)
00405 dflow->problem->reset_fun (dflow, df->blocks_to_analyze);
00406 else if (dflow->problem->free_bb_fun)
00407 {
00408 bitmap_iterator bi;
00409 unsigned int bb_index;
00410
00411 EXECUTE_IF_SET_IN_BITMAP (diff, 0, bb_index, bi)
00412 {
00413 basic_block bb = BASIC_BLOCK (bb_index);
00414 if (bb)
00415 {
00416 dflow->problem->free_bb_fun
00417 (dflow, bb, df_get_bb_info (dflow, bb_index));
00418 df_set_bb_info (dflow, bb_index, NULL);
00419 }
00420 }
00421 }
00422 }
00423
00424 BITMAP_FREE (diff);
00425 }
00426 else
00427 {
00428
00429
00430 struct dataflow *scan_dflow = df->problems_by_index [DF_SCAN];
00431 if (scan_dflow->problem_data)
00432 {
00433 bitmap blocks_to_reset = NULL;
00434 int p;
00435 for (p = df->num_problems_defined - 1; p >= 0 ;p--)
00436 {
00437 struct dataflow *dflow = df->problems_in_order[p];
00438 if (dflow->problem->reset_fun)
00439 {
00440 if (!blocks_to_reset)
00441 {
00442 basic_block bb;
00443 blocks_to_reset = BITMAP_ALLOC (NULL);
00444 FOR_ALL_BB(bb)
00445 {
00446 bitmap_set_bit (blocks_to_reset, bb->index);
00447 }
00448 }
00449 dflow->problem->reset_fun (dflow, blocks_to_reset);
00450 }
00451 }
00452 if (blocks_to_reset)
00453 BITMAP_FREE (blocks_to_reset);
00454 }
00455 df->blocks_to_analyze = BITMAP_ALLOC (NULL);
00456 }
00457 bitmap_copy (df->blocks_to_analyze, blocks);
00458 }
00459 else
00460 {
00461 if (df->blocks_to_analyze)
00462 {
00463 BITMAP_FREE (df->blocks_to_analyze);
00464 df->blocks_to_analyze = NULL;
00465 }
00466 }
00467 }
00468
00469
00470
00471
00472
00473
00474 void
00475 df_delete_basic_block (struct df *df, int bb_index)
00476 {
00477 basic_block bb = BASIC_BLOCK (bb_index);
00478 int i;
00479
00480 for (i = 0; i < df->num_problems_defined; i++)
00481 {
00482 struct dataflow *dflow = df->problems_in_order[i];
00483 if (dflow->problem->free_bb_fun)
00484 dflow->problem->free_bb_fun
00485 (dflow, bb, df_get_bb_info (dflow, bb_index));
00486 }
00487 }
00488
00489
00490
00491
00492
00493 void
00494 df_finish1 (struct df *df)
00495 {
00496 int i;
00497
00498 for (i = 0; i < df->num_problems_defined; i++)
00499 df->problems_in_order[i]->problem->free_fun (df->problems_in_order[i]);
00500
00501 free (df);
00502 }
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513 static void
00514 df_hybrid_search_forward (basic_block bb,
00515 struct dataflow *dataflow,
00516 bool single_pass)
00517 {
00518 int result_changed;
00519 int i = bb->index;
00520 edge e;
00521 edge_iterator ei;
00522
00523 SET_BIT (dataflow->visited, bb->index);
00524 gcc_assert (TEST_BIT (dataflow->pending, bb->index));
00525 RESET_BIT (dataflow->pending, i);
00526
00527
00528 if (EDGE_COUNT (bb->preds) > 0)
00529 FOR_EACH_EDGE (e, ei, bb->preds)
00530 {
00531 if (!TEST_BIT (dataflow->considered, e->src->index))
00532 continue;
00533
00534 dataflow->problem->con_fun_n (dataflow, e);
00535 }
00536 else if (dataflow->problem->con_fun_0)
00537 dataflow->problem->con_fun_0 (dataflow, bb);
00538
00539 result_changed = dataflow->problem->trans_fun (dataflow, i);
00540
00541 if (!result_changed || single_pass)
00542 return;
00543
00544 FOR_EACH_EDGE (e, ei, bb->succs)
00545 {
00546 if (e->dest->index == i)
00547 continue;
00548 if (!TEST_BIT (dataflow->considered, e->dest->index))
00549 continue;
00550 SET_BIT (dataflow->pending, e->dest->index);
00551 }
00552
00553 FOR_EACH_EDGE (e, ei, bb->succs)
00554 {
00555 if (e->dest->index == i)
00556 continue;
00557
00558 if (!TEST_BIT (dataflow->considered, e->dest->index))
00559 continue;
00560 if (!TEST_BIT (dataflow->visited, e->dest->index))
00561 df_hybrid_search_forward (e->dest, dataflow, single_pass);
00562 }
00563 }
00564
00565 static void
00566 df_hybrid_search_backward (basic_block bb,
00567 struct dataflow *dataflow,
00568 bool single_pass)
00569 {
00570 int result_changed;
00571 int i = bb->index;
00572 edge e;
00573 edge_iterator ei;
00574
00575 SET_BIT (dataflow->visited, bb->index);
00576 gcc_assert (TEST_BIT (dataflow->pending, bb->index));
00577 RESET_BIT (dataflow->pending, i);
00578
00579
00580 if (EDGE_COUNT (bb->succs) > 0)
00581 FOR_EACH_EDGE (e, ei, bb->succs)
00582 {
00583 if (!TEST_BIT (dataflow->considered, e->dest->index))
00584 continue;
00585
00586 dataflow->problem->con_fun_n (dataflow, e);
00587 }
00588 else if (dataflow->problem->con_fun_0)
00589 dataflow->problem->con_fun_0 (dataflow, bb);
00590
00591 result_changed = dataflow->problem->trans_fun (dataflow, i);
00592
00593 if (!result_changed || single_pass)
00594 return;
00595
00596 FOR_EACH_EDGE (e, ei, bb->preds)
00597 {
00598 if (e->src->index == i)
00599 continue;
00600
00601 if (!TEST_BIT (dataflow->considered, e->src->index))
00602 continue;
00603
00604 SET_BIT (dataflow->pending, e->src->index);
00605 }
00606
00607 FOR_EACH_EDGE (e, ei, bb->preds)
00608 {
00609 if (e->src->index == i)
00610 continue;
00611
00612 if (!TEST_BIT (dataflow->considered, e->src->index))
00613 continue;
00614
00615 if (!TEST_BIT (dataflow->visited, e->src->index))
00616 df_hybrid_search_backward (e->src, dataflow, single_pass);
00617 }
00618 }
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628 void
00629 df_iterative_dataflow (struct dataflow *dataflow,
00630 bitmap blocks_to_consider, bitmap blocks_to_init,
00631 int *blocks_in_postorder, int n_blocks,
00632 bool single_pass)
00633 {
00634 unsigned int idx;
00635 int i;
00636 sbitmap visited = sbitmap_alloc (last_basic_block);
00637 sbitmap pending = sbitmap_alloc (last_basic_block);
00638 sbitmap considered = sbitmap_alloc (last_basic_block);
00639 bitmap_iterator bi;
00640
00641 dataflow->visited = visited;
00642 dataflow->pending = pending;
00643 dataflow->considered = considered;
00644
00645 sbitmap_zero (visited);
00646 sbitmap_zero (pending);
00647 sbitmap_zero (considered);
00648
00649 gcc_assert (dataflow->problem->dir);
00650
00651 EXECUTE_IF_SET_IN_BITMAP (blocks_to_consider, 0, idx, bi)
00652 {
00653 SET_BIT (considered, idx);
00654 }
00655
00656 for (i = 0; i < n_blocks; i++)
00657 {
00658 idx = blocks_in_postorder[i];
00659 SET_BIT (pending, idx);
00660 };
00661
00662 dataflow->problem->init_fun (dataflow, blocks_to_init);
00663
00664 while (1)
00665 {
00666
00667
00668
00669
00670
00671
00672
00673
00674 if (dataflow->problem->dir == DF_FORWARD)
00675 {
00676 for (i = n_blocks - 1 ; i >= 0 ; i--)
00677 {
00678 idx = blocks_in_postorder[i];
00679
00680 if (TEST_BIT (pending, idx) && !TEST_BIT (visited, idx))
00681 df_hybrid_search_forward (BASIC_BLOCK (idx), dataflow, single_pass);
00682 }
00683 }
00684 else
00685 {
00686 for (i = 0; i < n_blocks; i++)
00687 {
00688 idx = blocks_in_postorder[i];
00689
00690 if (TEST_BIT (pending, idx) && !TEST_BIT (visited, idx))
00691 df_hybrid_search_backward (BASIC_BLOCK (idx), dataflow, single_pass);
00692 }
00693 }
00694
00695 if (sbitmap_first_set_bit (pending) == -1)
00696 break;
00697
00698 sbitmap_zero (visited);
00699 }
00700
00701 sbitmap_free (pending);
00702 sbitmap_free (visited);
00703 sbitmap_free (considered);
00704 }
00705
00706
00707
00708
00709
00710
00711 static unsigned
00712 df_prune_to_subcfg (int list[], unsigned len, bitmap blocks)
00713 {
00714 unsigned act, last;
00715
00716 for (act = 0, last = 0; act < len; act++)
00717 if (bitmap_bit_p (blocks, list[act]))
00718 list[last++] = list[act];
00719
00720 return last;
00721 }
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753 void
00754 df_analyze_problem (struct dataflow *dflow,
00755 bitmap blocks_to_consider,
00756 bitmap blocks_to_init,
00757 bitmap blocks_to_scan,
00758 int *postorder, int n_blocks, bool single_pass)
00759 {
00760
00761 if (dflow->problem->alloc_fun)
00762 dflow->problem->alloc_fun (dflow, blocks_to_scan, blocks_to_init);
00763
00764
00765
00766
00767
00768 if (dflow->problem->local_compute_fun)
00769 dflow->problem->local_compute_fun (dflow, blocks_to_consider, blocks_to_scan);
00770
00771
00772 if (dflow->problem->dataflow_fun)
00773 dflow->problem->dataflow_fun (dflow, blocks_to_consider, blocks_to_init,
00774 postorder, n_blocks, single_pass);
00775
00776
00777 if (dflow->problem->finalize_fun)
00778 dflow->problem->finalize_fun (dflow, blocks_to_consider);
00779 }
00780
00781
00782
00783
00784
00785 void
00786 df_analyze (struct df *df)
00787 {
00788 int *postorder = XNEWVEC (int, last_basic_block);
00789 bitmap current_all_blocks = BITMAP_ALLOC (NULL);
00790 int n_blocks;
00791 int i;
00792 bool everything;
00793
00794 n_blocks = post_order_compute (postorder, true);
00795
00796 if (n_blocks != n_basic_blocks)
00797 delete_unreachable_blocks ();
00798
00799 for (i = 0; i < n_blocks; i++)
00800 bitmap_set_bit (current_all_blocks, postorder[i]);
00801
00802
00803 if (!df->blocks_to_scan)
00804 df_rescan_blocks (df, NULL);
00805
00806
00807
00808 bitmap_and_into (df->blocks_to_scan, current_all_blocks);
00809
00810 if (df->blocks_to_analyze)
00811 {
00812 everything = false;
00813 bitmap_and_into (df->blocks_to_analyze, current_all_blocks);
00814 n_blocks = df_prune_to_subcfg (postorder, n_blocks, df->blocks_to_analyze);
00815 BITMAP_FREE (current_all_blocks);
00816 }
00817 else
00818 {
00819 everything = true;
00820 df->blocks_to_analyze = current_all_blocks;
00821 current_all_blocks = NULL;
00822 }
00823
00824
00825 for (i = 1; i < df->num_problems_defined; i++)
00826 df_analyze_problem (df->problems_in_order[i],
00827 df->blocks_to_analyze, df->blocks_to_analyze,
00828 df->blocks_to_scan,
00829 postorder, n_blocks, false);
00830
00831 if (everything)
00832 {
00833 BITMAP_FREE (df->blocks_to_analyze);
00834 df->blocks_to_analyze = NULL;
00835 }
00836
00837 BITMAP_FREE (df->blocks_to_scan);
00838 df->blocks_to_scan = NULL;
00839 free (postorder);
00840 }
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851 static void *
00852 df_get_bb_info (struct dataflow *dflow, unsigned int index)
00853 {
00854 return (struct df_scan_bb_info *) dflow->block_info[index];
00855 }
00856
00857
00858
00859
00860 static void
00861 df_set_bb_info (struct dataflow *dflow, unsigned int index,
00862 void *bb_info)
00863 {
00864 dflow->block_info[index] = bb_info;
00865 }
00866
00867
00868
00869
00870
00871 void
00872 df_compact_blocks (struct df *df)
00873 {
00874 int i, p;
00875 basic_block bb;
00876 void **problem_temps;
00877 int size = last_basic_block *sizeof (void *);
00878 problem_temps = xmalloc (size);
00879
00880 for (p = 0; p < df->num_problems_defined; p++)
00881 {
00882 struct dataflow *dflow = df->problems_in_order[p];
00883 if (dflow->problem->free_bb_fun)
00884 {
00885 df_grow_bb_info (dflow);
00886 memcpy (problem_temps, dflow->block_info, size);
00887
00888
00889
00890
00891 i = NUM_FIXED_BLOCKS;
00892 FOR_EACH_BB (bb)
00893 {
00894 df_set_bb_info (dflow, i, problem_temps[bb->index]);
00895 problem_temps[bb->index] = NULL;
00896 i++;
00897 }
00898 memset (dflow->block_info + i, 0,
00899 (last_basic_block - i) *sizeof (void *));
00900
00901
00902
00903 for (i = NUM_FIXED_BLOCKS; i < last_basic_block; i++)
00904 {
00905 basic_block bb = BASIC_BLOCK (i);
00906 if (problem_temps[i] && bb)
00907 dflow->problem->free_bb_fun
00908 (dflow, bb, problem_temps[i]);
00909 }
00910 }
00911 }
00912
00913 free (problem_temps);
00914
00915 i = NUM_FIXED_BLOCKS;
00916 FOR_EACH_BB (bb)
00917 {
00918 SET_BASIC_BLOCK (i, bb);
00919 bb->index = i;
00920 i++;
00921 }
00922
00923 gcc_assert (i == n_basic_blocks);
00924
00925 for (; i < last_basic_block; i++)
00926 SET_BASIC_BLOCK (i, NULL);
00927 }
00928
00929
00930
00931
00932
00933 void
00934 df_bb_replace (struct df *df, int old_index, basic_block new_block)
00935 {
00936 int p;
00937
00938 for (p = 0; p < df->num_problems_defined; p++)
00939 {
00940 struct dataflow *dflow = df->problems_in_order[p];
00941 if (dflow->block_info)
00942 {
00943 void *temp;
00944
00945 df_grow_bb_info (dflow);
00946
00947
00948
00949 temp = df_get_bb_info (dflow, old_index);
00950 df_set_bb_info (dflow, old_index,
00951 df_get_bb_info (dflow, new_block->index));
00952 df_set_bb_info (dflow, new_block->index, temp);
00953 }
00954 }
00955
00956 SET_BASIC_BLOCK (old_index, new_block);
00957 new_block->index = old_index;
00958 }
00959
00960
00961
00962
00963
00964
00965
00966
00967 struct df_ref *
00968 df_bb_regno_last_use_find (struct df *df, basic_block bb, unsigned int regno)
00969 {
00970 rtx insn;
00971 struct df_ref *use;
00972 unsigned int uid;
00973
00974 FOR_BB_INSNS_REVERSE (bb, insn)
00975 {
00976 if (!INSN_P (insn))
00977 continue;
00978
00979 uid = INSN_UID (insn);
00980 for (use = DF_INSN_UID_GET (df, uid)->uses; use; use = use->next_ref)
00981 if (DF_REF_REGNO (use) == regno)
00982 return use;
00983 }
00984 return NULL;
00985 }
00986
00987
00988
00989
00990 struct df_ref *
00991 df_bb_regno_first_def_find (struct df *df, basic_block bb, unsigned int regno)
00992 {
00993 rtx insn;
00994 struct df_ref *def;
00995 unsigned int uid;
00996
00997 FOR_BB_INSNS (bb, insn)
00998 {
00999 if (!INSN_P (insn))
01000 continue;
01001
01002 uid = INSN_UID (insn);
01003 for (def = DF_INSN_UID_GET (df, uid)->defs; def; def = def->next_ref)
01004 if (DF_REF_REGNO (def) == regno)
01005 return def;
01006 }
01007 return NULL;
01008 }
01009
01010
01011
01012
01013 struct df_ref *
01014 df_bb_regno_last_def_find (struct df *df, basic_block bb, unsigned int regno)
01015 {
01016 rtx insn;
01017 struct df_ref *def;
01018 unsigned int uid;
01019
01020 FOR_BB_INSNS_REVERSE (bb, insn)
01021 {
01022 if (!INSN_P (insn))
01023 continue;
01024
01025 uid = INSN_UID (insn);
01026 for (def = DF_INSN_UID_GET (df, uid)->defs; def; def = def->next_ref)
01027 if (DF_REF_REGNO (def) == regno)
01028 return def;
01029 }
01030
01031 return NULL;
01032 }
01033
01034
01035
01036 bool
01037 df_insn_regno_def_p (struct df *df, rtx insn, unsigned int regno)
01038 {
01039 unsigned int uid;
01040 struct df_ref *def;
01041
01042 uid = INSN_UID (insn);
01043 for (def = DF_INSN_UID_GET (df, uid)->defs; def; def = def->next_ref)
01044 if (DF_REF_REGNO (def) == regno)
01045 return true;
01046
01047 return false;
01048 }
01049
01050
01051
01052
01053
01054 struct df_ref *
01055 df_find_def (struct df *df, rtx insn, rtx reg)
01056 {
01057 unsigned int uid;
01058 struct df_ref *def;
01059
01060 if (GET_CODE (reg) == SUBREG)
01061 reg = SUBREG_REG (reg);
01062 gcc_assert (REG_P (reg));
01063
01064 uid = INSN_UID (insn);
01065 for (def = DF_INSN_UID_GET (df, uid)->defs; def; def = def->next_ref)
01066 if (rtx_equal_p (DF_REF_REAL_REG (def), reg))
01067 return def;
01068
01069 return NULL;
01070 }
01071
01072
01073
01074
01075 bool
01076 df_reg_defined (struct df *df, rtx insn, rtx reg)
01077 {
01078 return df_find_def (df, insn, reg) != NULL;
01079 }
01080
01081
01082
01083
01084
01085 struct df_ref *
01086 df_find_use (struct df *df, rtx insn, rtx reg)
01087 {
01088 unsigned int uid;
01089 struct df_ref *use;
01090
01091 if (GET_CODE (reg) == SUBREG)
01092 reg = SUBREG_REG (reg);
01093 gcc_assert (REG_P (reg));
01094
01095 uid = INSN_UID (insn);
01096 for (use = DF_INSN_UID_GET (df, uid)->uses; use; use = use->next_ref)
01097 if (rtx_equal_p (DF_REF_REAL_REG (use), reg))
01098 return use;
01099
01100 return NULL;
01101 }
01102
01103
01104
01105
01106 bool
01107 df_reg_used (struct df *df, rtx insn, rtx reg)
01108 {
01109 return df_find_use (df, insn, reg) != NULL;
01110 }
01111
01112
01113
01114
01115
01116
01117
01118 void
01119 df_dump (struct df *df, FILE *file)
01120 {
01121 int i;
01122
01123 if (!df || !file)
01124 return;
01125
01126 fprintf (file, "\n\n%s\n", current_function_name ());
01127 fprintf (file, "\nDataflow summary:\n");
01128 fprintf (file, "def_info->bitmap_size = %d, use_info->bitmap_size = %d\n",
01129 df->def_info.bitmap_size, df->use_info.bitmap_size);
01130
01131 for (i = 0; i < df->num_problems_defined; i++)
01132 df->problems_in_order[i]->problem->dump_fun (df->problems_in_order[i], file);
01133
01134 fprintf (file, "\n");
01135 }
01136
01137
01138 void
01139 df_refs_chain_dump (struct df_ref *ref, bool follow_chain, FILE *file)
01140 {
01141 fprintf (file, "{ ");
01142 while (ref)
01143 {
01144 fprintf (file, "%c%d(%d) ",
01145 DF_REF_REG_DEF_P (ref) ? 'd' : 'u',
01146 DF_REF_ID (ref),
01147 DF_REF_REGNO (ref));
01148 if (follow_chain)
01149 df_chain_dump (DF_REF_CHAIN (ref), file);
01150 ref = ref->next_ref;
01151 }
01152 fprintf (file, "}");
01153 }
01154
01155
01156
01157
01158 void
01159 df_regs_chain_dump (struct df *df ATTRIBUTE_UNUSED, struct df_ref *ref, FILE *file)
01160 {
01161 fprintf (file, "{ ");
01162 while (ref)
01163 {
01164 fprintf (file, "%c%d(%d) ",
01165 DF_REF_REG_DEF_P (ref) ? 'd' : 'u',
01166 DF_REF_ID (ref),
01167 DF_REF_REGNO (ref));
01168 ref = ref->next_reg;
01169 }
01170 fprintf (file, "}");
01171 }
01172
01173
01174 static void
01175 df_mws_dump (struct df_mw_hardreg *mws, FILE *file)
01176 {
01177 while (mws)
01178 {
01179 struct df_link *regs = mws->regs;
01180 fprintf (file, "%c%d(",
01181 (mws->type == DF_REF_REG_DEF) ? 'd' : 'u',
01182 DF_REF_REGNO (regs->ref));
01183 while (regs)
01184 {
01185 fprintf (file, "%d ", DF_REF_REGNO (regs->ref));
01186 regs = regs->next;
01187 }
01188
01189 fprintf (file, ") ");
01190 mws = mws->next;
01191 }
01192 }
01193
01194
01195 static void
01196 df_insn_uid_debug (struct df *df, unsigned int uid,
01197 bool follow_chain, FILE *file)
01198 {
01199 int bbi;
01200
01201 if (DF_INSN_UID_DEFS (df, uid))
01202 bbi = DF_REF_BBNO (DF_INSN_UID_DEFS (df, uid));
01203 else if (DF_INSN_UID_USES(df, uid))
01204 bbi = DF_REF_BBNO (DF_INSN_UID_USES (df, uid));
01205 else
01206 bbi = -1;
01207
01208 fprintf (file, "insn %d bb %d luid %d",
01209 uid, bbi, DF_INSN_UID_LUID (df, uid));
01210
01211 if (DF_INSN_UID_DEFS (df, uid))
01212 {
01213 fprintf (file, " defs ");
01214 df_refs_chain_dump (DF_INSN_UID_DEFS (df, uid), follow_chain, file);
01215 }
01216
01217 if (DF_INSN_UID_USES (df, uid))
01218 {
01219 fprintf (file, " uses ");
01220 df_refs_chain_dump (DF_INSN_UID_USES (df, uid), follow_chain, file);
01221 }
01222
01223 if (DF_INSN_UID_MWS (df, uid))
01224 {
01225 fprintf (file, " mws ");
01226 df_mws_dump (DF_INSN_UID_MWS (df, uid), file);
01227 }
01228 fprintf (file, "\n");
01229 }
01230
01231
01232 void
01233 df_insn_debug (struct df *df, rtx insn, bool follow_chain, FILE *file)
01234 {
01235 df_insn_uid_debug (df, INSN_UID (insn), follow_chain, file);
01236 }
01237
01238 void
01239 df_insn_debug_regno (struct df *df, rtx insn, FILE *file)
01240 {
01241 unsigned int uid;
01242 int bbi;
01243
01244 uid = INSN_UID (insn);
01245 if (DF_INSN_UID_DEFS (df, uid))
01246 bbi = DF_REF_BBNO (DF_INSN_UID_DEFS (df, uid));
01247 else if (DF_INSN_UID_USES(df, uid))
01248 bbi = DF_REF_BBNO (DF_INSN_UID_USES (df, uid));
01249 else
01250 bbi = -1;
01251
01252 fprintf (file, "insn %d bb %d luid %d defs ",
01253 uid, bbi, DF_INSN_LUID (df, insn));
01254 df_regs_chain_dump (df, DF_INSN_UID_DEFS (df, uid), file);
01255
01256 fprintf (file, " uses ");
01257 df_regs_chain_dump (df, DF_INSN_UID_USES (df, uid), file);
01258 fprintf (file, "\n");
01259 }
01260
01261 void
01262 df_regno_debug (struct df *df, unsigned int regno, FILE *file)
01263 {
01264 fprintf (file, "reg %d defs ", regno);
01265 df_regs_chain_dump (df, DF_REG_DEF_GET (df, regno)->reg_chain, file);
01266 fprintf (file, " uses ");
01267 df_regs_chain_dump (df, DF_REG_USE_GET (df, regno)->reg_chain, file);
01268 fprintf (file, "\n");
01269 }
01270
01271
01272 void
01273 df_ref_debug (struct df_ref *ref, FILE *file)
01274 {
01275 fprintf (file, "%c%d ",
01276 DF_REF_REG_DEF_P (ref) ? 'd' : 'u',
01277 DF_REF_ID (ref));
01278 fprintf (file, "reg %d bb %d insn %d flag %x chain ",
01279 DF_REF_REGNO (ref),
01280 DF_REF_BBNO (ref),
01281 DF_REF_INSN (ref) ? INSN_UID (DF_REF_INSN (ref)) : -1,
01282 DF_REF_FLAGS (ref));
01283 df_chain_dump (DF_REF_CHAIN (ref), file);
01284 fprintf (file, "\n");
01285 }
01286
01287
01288
01289 void
01290 debug_df_insn (rtx insn)
01291 {
01292 df_insn_debug (ddf, insn, true, stderr);
01293 debug_rtx (insn);
01294 }
01295
01296
01297 void
01298 debug_df_reg (rtx reg)
01299 {
01300 df_regno_debug (ddf, REGNO (reg), stderr);
01301 }
01302
01303
01304 void
01305 debug_df_regno (unsigned int regno)
01306 {
01307 df_regno_debug (ddf, regno, stderr);
01308 }
01309
01310
01311 void
01312 debug_df_ref (struct df_ref *ref)
01313 {
01314 df_ref_debug (ref, stderr);
01315 }
01316
01317
01318 void
01319 debug_df_defno (unsigned int defno)
01320 {
01321 df_ref_debug (DF_DEFS_GET (ddf, defno), stderr);
01322 }
01323
01324
01325 void
01326 debug_df_useno (unsigned int defno)
01327 {
01328 df_ref_debug (DF_USES_GET (ddf, defno), stderr);
01329 }
01330
01331
01332 void
01333 debug_df_chain (struct df_link *link)
01334 {
01335 df_chain_dump (link, stderr);
01336 fputc ('\n', stderr);
01337 }