OSDN Git Service

* recog.c (validate_replace_rtx_subexp): Remove.
[pf3gnuchains/gcc-fork.git] / gcc / df-core.c
1 /* Allocation for dataflow support routines.
2    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3    Free Software Foundation, Inc.
4    Originally contributed by Michael P. Hayes 
5              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
6    Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
7              and Kenneth Zadeck (zadeck@naturalbridge.com).
8
9 This file is part of GCC.
10
11 GCC is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free
13 Software Foundation; either version 2, or (at your option) any later
14 version.
15
16 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17 WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19 for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING.  If not, write to the Free
23 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
24 02110-1301, USA.  
25 */
26
27 /*
28 OVERVIEW:
29
30 The files in this collection (df*.c,df.h) provide a general framework
31 for solving dataflow problems.  The global dataflow is performed using
32 a good implementation of iterative dataflow analysis.
33
34 The file df-problems.c provides problem instance for the most common
35 dataflow problems: reaching defs, upward exposed uses, live variables,
36 uninitialized variables, def-use chains, and use-def chains.  However,
37 the interface allows other dataflow problems to be defined as well.
38
39
40 USAGE:
41
42 Here is an example of using the dataflow routines.
43
44       struct df *df;
45
46       df = df_init (init_flags);
47       
48       df_add_problem (df, problem);
49
50       df_set_blocks (df, blocks);
51
52       df_rescan_blocks (df, blocks);
53
54       df_analyze (df);
55
56       df_dump (df, stderr);
57
58       df_finish (df);
59
60
61
62 DF_INIT simply creates a poor man's object (df) that needs to be
63 passed to all the dataflow routines.  df_finish destroys this object
64 and frees up any allocated memory.
65
66 There are two flags that can be passed to df_init:
67
68 DF_NO_SCAN means that no scanning of the rtl code is performed.  This
69 is used if the problem instance is to do it's own scanning.
70
71 DF_HARD_REGS means that the scanning is to build information about
72 both pseudo registers and hardware registers.  Without this
73 information, the problems will be solved only on pseudo registers.
74
75
76
77 DF_ADD_PROBLEM adds a problem, defined by an instance to struct
78 df_problem, to the set of problems solved in this instance of df.  All
79 calls to add a problem for a given instance of df must occur before
80 the first call to DF_RESCAN_BLOCKS or DF_ANALYZE.
81
82 For all of the problems defined in df-problems.c, there are
83 convienence functions named DF_*_ADD_PROBLEM.
84
85
86 Problems can be dependent on other problems.  For instance, solving
87 def-use or use-def chains is dependant on solving reaching
88 definitions. As long as these dependancies are listed in the problem
89 definition, the order of adding the problems is not material.
90 Otherwise, the problems will be solved in the order of calls to
91 df_add_problem.  Note that it is not necessary to have a problem.  In
92 that case, df will just be used to do the scanning.
93
94
95
96 DF_SET_BLOCKS is an optional call used to define a region of the
97 function on which the analysis will be performed.  The normal case is
98 to analyze the entire function and no call to df_set_blocks is made.
99
100 When a subset is given, the analysis behaves as if the function only
101 contains those blocks and any edges that occur directly between the
102 blocks in the set.  Care should be taken to call df_set_blocks right
103 before the call to analyze in order to eliminate the possiblity that
104 optimizations that reorder blocks invalidate the bitvector.
105
106
107
108 DF_RESCAN_BLOCKS is an optional call that causes the scanner to be
109  (re)run over the set of blocks passed in.  If blocks is NULL, the entire
110 function (or all of the blocks defined in df_set_blocks) is rescanned.
111 If blocks contains blocks that were not defined in the call to
112 df_set_blocks, these blocks are added to the set of blocks.
113
114
115 DF_ANALYZE causes all of the defined problems to be (re)solved.  It
116 does not cause blocks to be (re)scanned at the rtl level unless no
117 prior call is made to df_rescan_blocks.
118
119
120 DF_DUMP can then be called to dump the information produce to some
121 file.
122
123
124
125 DF_FINISH causes all of the datastructures to be cleaned up and freed.
126 The df_instance is also freed and its pointer should be NULLed.
127
128
129
130
131 Scanning produces a `struct df_ref' data structure (ref) is allocated
132 for every register reference (def or use) and this records the insn
133 and bb the ref is found within.  The refs are linked together in
134 chains of uses and defs for each insn and for each register.  Each ref
135 also has a chain field that links all the use refs for a def or all
136 the def refs for a use.  This is used to create use-def or def-use
137 chains.
138
139 Different optimizations have different needs.  Ultimately, only
140 register allocation and schedulers should be using the bitmaps
141 produced for the live register and uninitialized register problems.
142 The rest of the backend should be upgraded to using and maintaining
143 the linked information such as def use or use def chains.
144
145
146
147 PHILOSOPHY:
148
149 While incremental bitmaps are not worthwhile to maintain, incremental
150 chains may be perfectly reasonable.  The fastest way to build chains
151 from scratch or after significant modifications is to build reaching
152 definitions (RD) and build the chains from this.
153
154 However, general algorithms for maintaining use-def or def-use chains
155 are not practical.  The amount of work to recompute the chain any
156 chain after an arbitrary change is large.  However, with a modest
157 amount of work it is generally possible to have the application that
158 uses the chains keep them up to date.  The high level knowledge of
159 what is really happening is essential to crafting efficient
160 incremental algorithms.
161
162 As for the bit vector problems, there is no interface to give a set of
163 blocks over with to resolve the iteration.  In general, restarting a
164 dataflow iteration is difficult and expensive.  Again, the best way to
165 keep the dataflow infomation up to data (if this is really what is
166 needed) it to formulate a problem specific solution.
167
168 There are fine grained calls for creating and deleting references from
169 instructions in df-scan.c.  However, these are not currently connected
170 to the engine that resolves the dataflow equations.
171
172
173 DATA STRUCTURES:
174
175 The basic object is a DF_REF (reference) and this may either be a 
176 DEF (definition) or a USE of a register.
177
178 These are linked into a variety of lists; namely reg-def, reg-use,
179 insn-def, insn-use, def-use, and use-def lists.  For example, the
180 reg-def lists contain all the locations that define a given register
181 while the insn-use lists contain all the locations that use a
182 register.
183
184 Note that the reg-def and reg-use chains are generally short for
185 pseudos and long for the hard registers.
186
187 ACCESSING REFS:
188
189 There are 4 ways to obtain access to refs:
190
191 1) References are divided into two categories, REAL and ARTIFICIAL.
192
193    REAL refs are associated with instructions.  They are linked into
194    either in the insn's defs list (accessed by the DF_INSN_DEFS or
195    DF_INSN_UID_DEFS macros) or the insn's uses list (accessed by the
196    DF_INSN_USES or DF_INSN_UID_USES macros).  These macros produce a
197    ref (or NULL), the rest of the list can be obtained by traversal of
198    the NEXT_REF field (accessed by the DF_REF_NEXT_REF macro.)  There
199    is no significance to the ordering of the uses or refs in an
200    instruction.
201
202    ARTIFICIAL refs are associated with basic blocks.  The heads of
203    these lists can be accessed by calling get_artificial_defs or
204    get_artificial_uses for the particular basic block.  Artificial
205    defs and uses are only there if DF_HARD_REGS was specified when the
206    df instance was created.
207  
208    Artificial defs and uses occur both at the beginning and ends of blocks.
209
210      For blocks that area at the destination of eh edges, the
211      artificial uses and defs occur at the beginning.  The defs relate
212      to the registers specified in EH_RETURN_DATA_REGNO and the uses
213      relate to the registers specified in ED_USES.  Logically these
214      defs and uses should really occur along the eh edge, but there is
215      no convenient way to do this.  Artificial edges that occur at the
216      beginning of the block have the DF_REF_AT_TOP flag set.
217
218      Artificial uses occur at the end of all blocks.  These arise from
219      the hard registers that are always live, such as the stack
220      register and are put there to keep the code from forgetting about
221      them.
222
223      Artifical defs occur at the end of the entry block.  These arise
224      from registers that are live at entry to the function.
225
226 2) All of the uses and defs associated with each pseudo or hard
227    register are linked in a bidirectional chain.  These are called
228    reg-use or reg_def chains.
229
230    The first use (or def) for a register can be obtained using the
231    DF_REG_USE_GET macro (or DF_REG_DEF_GET macro).  Subsequent uses
232    for the same regno can be obtained by following the next_reg field
233    of the ref.
234
235    In previous versions of this code, these chains were ordered.  It
236    has not been practical to continue this practice.
237
238 3) If def-use or use-def chains are built, these can be traversed to
239    get to other refs.
240
241 4) An array of all of the uses (and an array of all of the defs) can
242    be built.  These arrays are indexed by the value in the id
243    structure.  These arrays are only lazily kept up to date, and that
244    process can be expensive.  To have these arrays built, call
245    df_reorganize_refs.   Note that the values in the id field of a ref
246    may change across calls to df_analyze or df_reorganize refs.
247
248    If the only use of this array is to find all of the refs, it is
249    better to traverse all of the registers and then traverse all of
250    reg-use or reg-def chains.
251
252
253
254 NOTES:
255  
256 Embedded addressing side-effects, such as POST_INC or PRE_INC, generate
257 both a use and a def.  These are both marked read/write to show that they
258 are dependent. For example, (set (reg 40) (mem (post_inc (reg 42))))
259 will generate a use of reg 42 followed by a def of reg 42 (both marked
260 read/write).  Similarly, (set (reg 40) (mem (pre_dec (reg 41))))
261 generates a use of reg 41 then a def of reg 41 (both marked read/write),
262 even though reg 41 is decremented before it is used for the memory
263 address in this second example.
264
265 A set to a REG inside a ZERO_EXTRACT, or a set to a non-paradoxical SUBREG
266 for which the number of word_mode units covered by the outer mode is
267 smaller than that covered by the inner mode, invokes a read-modify-write.
268 operation.  We generate both a use and a def and again mark them
269 read/write.
270
271 Paradoxical subreg writes do not leave a trace of the old content, so they
272 are write-only operations.  
273 */
274
275
276 #include "config.h"
277 #include "system.h"
278 #include "coretypes.h"
279 #include "tm.h"
280 #include "rtl.h"
281 #include "tm_p.h"
282 #include "insn-config.h"
283 #include "recog.h"
284 #include "function.h"
285 #include "regs.h"
286 #include "output.h"
287 #include "alloc-pool.h"
288 #include "flags.h"
289 #include "hard-reg-set.h"
290 #include "basic-block.h"
291 #include "sbitmap.h"
292 #include "bitmap.h"
293 #include "timevar.h"
294 #include "df.h"
295 #include "tree-pass.h"
296
297 static struct df *ddf = NULL;
298 struct df *shared_df = NULL;
299
300 static void * df_get_bb_info (struct dataflow *, unsigned int);
301 static void df_set_bb_info (struct dataflow *, unsigned int, void *);
302 /*----------------------------------------------------------------------------
303   Functions to create, destroy and manipulate an instance of df.
304 ----------------------------------------------------------------------------*/
305
306
307 /* Initialize dataflow analysis and allocate and initialize dataflow
308    memory.  */
309
310 struct df *
311 df_init (int flags)
312 {
313   struct df *df = xcalloc (1, sizeof (struct df));
314   df->flags = flags;
315
316   /* This is executed once per compilation to initialize platform
317      specific data structures. */
318   df_hard_reg_init ();
319   
320   /* All df instance must define the scanning problem.  */
321   df_scan_add_problem (df);
322   ddf = df;
323   return df;
324 }
325
326 /* Add PROBLEM to the DF instance.  */
327
328 struct dataflow *
329 df_add_problem (struct df *df, struct df_problem *problem)
330 {
331   struct dataflow *dflow;
332
333   /* First try to add the dependent problem. */
334   if (problem->dependent_problem)
335     df_add_problem (df, problem->dependent_problem);
336
337   /* Check to see if this problem has already been defined.  If it
338      has, just return that instance, if not, add it to the end of the
339      vector.  */
340   dflow = df->problems_by_index[problem->id];
341   if (dflow)
342     return dflow;
343
344   /* Make a new one and add it to the end.  */
345   dflow = xcalloc (1, sizeof (struct dataflow));
346   dflow->df = df;
347   dflow->problem = problem;
348   df->problems_in_order[df->num_problems_defined++] = dflow;
349   df->problems_by_index[dflow->problem->id] = dflow;
350
351   return dflow;
352 }
353
354
355 /* Set the blocks that are to be considered for analysis.  If this is
356    not called or is called with null, the entire function in
357    analyzed.  */
358
359 void 
360 df_set_blocks (struct df *df, bitmap blocks)
361 {
362   if (blocks)
363     {
364       if (df->blocks_to_analyze)
365         {
366           int p;
367           bitmap diff = BITMAP_ALLOC (NULL);
368           bitmap all = BITMAP_ALLOC (NULL);
369           bitmap_and_compl (diff, df->blocks_to_analyze, blocks);
370           for (p = df->num_problems_defined - 1; p >= 0 ;p--)
371             {
372               struct dataflow *dflow = df->problems_in_order[p];
373               if (*dflow->problem->reset_fun)
374                 (*dflow->problem->reset_fun) (dflow, df->blocks_to_analyze);
375               else if (*dflow->problem->free_bb_fun)
376                 {
377                   bitmap_iterator bi;
378                   unsigned int bb_index;
379                   
380                   EXECUTE_IF_SET_IN_BITMAP (diff, 0, bb_index, bi)
381                     {
382                       basic_block bb = BASIC_BLOCK (bb_index);
383                       if (bb)
384                         {
385                           (*dflow->problem->free_bb_fun) 
386                             (dflow, bb, df_get_bb_info (dflow, bb_index));
387                           df_set_bb_info (dflow, bb_index, NULL); 
388                         }
389                     }
390                 }
391             }
392
393           BITMAP_FREE (all);
394           BITMAP_FREE (diff);
395         }
396       else
397         {
398           /* If we have not actually run scanning before, do not try
399              to clear anything.  */
400           struct dataflow *scan_dflow = df->problems_by_index [DF_SCAN];
401           if (scan_dflow->problem_data)
402             {
403               bitmap blocks_to_reset = NULL;
404               int p;
405               for (p = df->num_problems_defined - 1; p >= 0 ;p--)
406                 {
407                   struct dataflow *dflow = df->problems_in_order[p];
408                   if (*dflow->problem->reset_fun)
409                     {
410                       if (!blocks_to_reset)
411                         {
412                           basic_block bb;
413                           blocks_to_reset = BITMAP_ALLOC (NULL);
414                           FOR_ALL_BB(bb)
415                             {
416                               bitmap_set_bit (blocks_to_reset, bb->index); 
417                             }
418                         }
419                       (*dflow->problem->reset_fun) (dflow, blocks_to_reset);
420                     }
421                 }
422               if (blocks_to_reset)
423                 BITMAP_FREE (blocks_to_reset);
424             }
425           df->blocks_to_analyze = BITMAP_ALLOC (NULL);
426         }
427       bitmap_copy (df->blocks_to_analyze, blocks);
428     }
429   else
430     {
431       if (df->blocks_to_analyze)
432         {
433           BITMAP_FREE (df->blocks_to_analyze);
434           df->blocks_to_analyze = NULL;
435         }
436     }
437 }
438
439
440 /* Free all the dataflow info and the DF structure.  This should be
441    called from the df_finish macro which also NULLs the parm.  */
442
443 void
444 df_finish1 (struct df *df)
445 {
446   int i;
447
448   for (i = 0; i < df->num_problems_defined; i++)
449     (*df->problems_in_order[i]->problem->free_fun) (df->problems_in_order[i]); 
450
451   free (df);
452 }
453
454 \f
455 /*----------------------------------------------------------------------------
456    The general data flow analysis engine.
457 ----------------------------------------------------------------------------*/
458
459
460 /* Hybrid search algorithm from "Implementation Techniques for
461    Efficient Data-Flow Analysis of Large Programs".  */
462
463 static void
464 df_hybrid_search_forward (basic_block bb, 
465                           struct dataflow *dataflow,
466                           bool single_pass)
467 {
468   int result_changed;
469   int i = bb->index;
470   edge e;
471   edge_iterator ei;
472
473   SET_BIT (dataflow->visited, bb->index);
474   gcc_assert (TEST_BIT (dataflow->pending, bb->index));
475   RESET_BIT (dataflow->pending, i);
476
477   /*  Calculate <conf_op> of predecessor_outs.  */
478   if (EDGE_COUNT (bb->preds) > 0)
479     FOR_EACH_EDGE (e, ei, bb->preds)
480       {
481         if (!TEST_BIT (dataflow->considered, e->src->index))
482           continue;
483         
484         (*dataflow->problem->con_fun_n) (dataflow, e);
485       }
486   else if (*dataflow->problem->con_fun_0)
487     (*dataflow->problem->con_fun_0) (dataflow, bb);
488   
489   result_changed = (*dataflow->problem->trans_fun) (dataflow, i);
490   
491   if (!result_changed || single_pass)
492     return;
493   
494   FOR_EACH_EDGE (e, ei, bb->succs)
495     {
496       if (e->dest->index == i)
497         continue;
498       if (!TEST_BIT (dataflow->considered, e->dest->index))
499         continue;
500       SET_BIT (dataflow->pending, e->dest->index);
501     }
502   
503   FOR_EACH_EDGE (e, ei, bb->succs)
504     {
505       if (e->dest->index == i)
506         continue;
507       
508       if (!TEST_BIT (dataflow->considered, e->dest->index))
509         continue;
510       if (!TEST_BIT (dataflow->visited, e->dest->index))
511         df_hybrid_search_forward (e->dest, dataflow, single_pass);
512     }
513 }
514
515 static void
516 df_hybrid_search_backward (basic_block bb,
517                            struct dataflow *dataflow,
518                            bool single_pass)
519 {
520   int result_changed;
521   int i = bb->index;
522   edge e;
523   edge_iterator ei;
524   
525   SET_BIT (dataflow->visited, bb->index);
526   gcc_assert (TEST_BIT (dataflow->pending, bb->index));
527   RESET_BIT (dataflow->pending, i);
528
529   /*  Calculate <conf_op> of predecessor_outs.  */
530   if (EDGE_COUNT (bb->succs) > 0)
531     FOR_EACH_EDGE (e, ei, bb->succs)                                    
532       {                                                         
533         if (!TEST_BIT (dataflow->considered, e->dest->index))           
534           continue;                                                     
535         
536         (*dataflow->problem->con_fun_n) (dataflow, e);
537       }                                                         
538   else if (*dataflow->problem->con_fun_0)
539     (*dataflow->problem->con_fun_0) (dataflow, bb);
540
541   result_changed = (*dataflow->problem->trans_fun) (dataflow, i);
542   
543   if (!result_changed || single_pass)
544     return;
545   
546   FOR_EACH_EDGE (e, ei, bb->preds)
547     {                                                           
548       if (e->src->index == i)
549         continue;
550       
551       if (!TEST_BIT (dataflow->considered, e->src->index))
552         continue;
553
554       SET_BIT (dataflow->pending, e->src->index);
555     }                                                           
556   
557   FOR_EACH_EDGE (e, ei, bb->preds)
558     {
559       if (e->src->index == i)
560         continue;
561
562       if (!TEST_BIT (dataflow->considered, e->src->index))
563         continue;
564       
565       if (!TEST_BIT (dataflow->visited, e->src->index))
566         df_hybrid_search_backward (e->src, dataflow, single_pass);
567     }
568 }
569
570
571 /* This function will perform iterative bitvector dataflow described
572    by DATAFLOW, producing the in and out sets.  Only the part of the
573    cfg induced by blocks in DATAFLOW->order is taken into account.
574
575    SINGLE_PASS is true if you just want to make one pass over the
576    blocks.  */
577
578 void
579 df_iterative_dataflow (struct dataflow *dataflow,
580                        bitmap blocks_to_consider, bitmap blocks_to_init, 
581                        int *blocks_in_postorder, int n_blocks, 
582                        bool single_pass)
583 {
584   unsigned int idx;
585   int i;
586   sbitmap visited = sbitmap_alloc (last_basic_block);
587   sbitmap pending = sbitmap_alloc (last_basic_block);
588   sbitmap considered = sbitmap_alloc (last_basic_block);
589   bitmap_iterator bi;
590
591   dataflow->visited = visited;
592   dataflow->pending = pending;
593   dataflow->considered = considered;
594
595   sbitmap_zero (visited);
596   sbitmap_zero (pending);
597   sbitmap_zero (considered);
598
599   EXECUTE_IF_SET_IN_BITMAP (blocks_to_consider, 0, idx, bi)
600     {
601       SET_BIT (considered, idx);
602     }
603
604   for (i = 0; i < n_blocks; i++)
605     {
606       idx = blocks_in_postorder[i];
607       SET_BIT (pending, idx);
608     };
609
610   (*dataflow->problem->init_fun) (dataflow, blocks_to_init);
611
612   while (1)
613     {
614
615       /* For forward problems, you want to pass in reverse postorder
616          and for backward problems you want postorder.  This has been
617          shown to be as good as you can do by several people, the
618          first being Mathew Hecht in his phd dissertation.
619
620          The nodes are passed into this function in postorder.  */
621
622       if (dataflow->problem->dir == DF_FORWARD)
623         {
624           for (i = n_blocks - 1 ; i >= 0 ; i--)
625             {
626               idx = blocks_in_postorder[i];
627               
628               if (TEST_BIT (pending, idx) && !TEST_BIT (visited, idx))
629                 df_hybrid_search_forward (BASIC_BLOCK (idx), dataflow, single_pass);
630             }
631         }
632       else
633         {
634           for (i = 0; i < n_blocks; i++)
635             {
636               idx = blocks_in_postorder[i];
637               
638               if (TEST_BIT (pending, idx) && !TEST_BIT (visited, idx))
639                 df_hybrid_search_backward (BASIC_BLOCK (idx), dataflow, single_pass);
640             }
641         }
642
643       if (sbitmap_first_set_bit (pending) == -1)
644         break;
645
646       sbitmap_zero (visited);
647     }
648
649   sbitmap_free (pending);
650   sbitmap_free (visited);
651   sbitmap_free (considered);
652 }
653
654
655 /* Remove the entries not in BLOCKS from the LIST of length LEN, preserving
656    the order of the remaining entries.  Returns the length of the resulting
657    list.  */
658
659 static unsigned
660 df_prune_to_subcfg (int list[], unsigned len, bitmap blocks)
661 {
662   unsigned act, last;
663
664   for (act = 0, last = 0; act < len; act++)
665     if (bitmap_bit_p (blocks, list[act]))
666       list[last++] = list[act];
667
668   return last;
669 }
670
671
672 /* Execute dataflow analysis on a single dataflow problem. 
673
674    There are three sets of blocks passed in: 
675
676    BLOCKS_TO_CONSIDER are the blocks whose solution can either be
677    examined or will be computed.  For calls from DF_ANALYZE, this is
678    the set of blocks that has been passed to DF_SET_BLOCKS.  For calls
679    from DF_ANALYZE_SIMPLE_CHANGE_SOME_BLOCKS, this is the set of
680    blocks in the fringe (the set of blocks passed in plus the set of
681    immed preds and succs of those blocks).
682
683    BLOCKS_TO_INIT are the blocks whose solution will be changed by
684    this iteration.  For calls from DF_ANALYZE, this is the set of
685    blocks that has been passed to DF_SET_BLOCKS.  For calls from
686    DF_ANALYZE_SIMPLE_CHANGE_SOME_BLOCKS, this is the set of blocks
687    passed in.
688
689    BLOCKS_TO_SCAN are the set of blocks that need to be rescanned.
690    For calls from DF_ANALYZE, this is the accumulated set of blocks
691    that has been passed to DF_RESCAN_BLOCKS since the last call to
692    DF_ANALYZE.  For calls from DF_ANALYZE_SIMPLE_CHANGE_SOME_BLOCKS,
693    this is the set of blocks passed in.
694  
695                    blocks_to_consider    blocks_to_init    blocks_to_scan
696    full redo       all                   all               all
697    partial redo    all                   all               sub
698    small fixup     fringe                sub               sub
699 */
700
701 static void
702 df_analyze_problem (struct dataflow *dflow, 
703                     bitmap blocks_to_consider, 
704                     bitmap blocks_to_init,
705                     bitmap blocks_to_scan,
706                     int *postorder, int n_blocks, bool single_pass)
707 {
708   /* (Re)Allocate the datastructures necessary to solve the problem.  */ 
709   if (*dflow->problem->alloc_fun)
710     (*dflow->problem->alloc_fun) (dflow, blocks_to_scan);
711
712   /* Set up the problem and compute the local information.  This
713      function is passed both the blocks_to_consider and the
714      blocks_to_scan because the RD and RU problems require the entire
715      function to be rescanned if they are going to be updated.  */
716   if (*dflow->problem->local_compute_fun)
717     (*dflow->problem->local_compute_fun) (dflow, blocks_to_consider, blocks_to_scan);
718
719   /* Solve the equations.  */
720   if (*dflow->problem->dataflow_fun)
721     (*dflow->problem->dataflow_fun) (dflow, blocks_to_consider, blocks_to_init,
722                                     postorder, n_blocks, single_pass);
723
724   /* Massage the solution.  */
725   if (*dflow->problem->finalize_fun)
726     (*dflow->problem->finalize_fun) (dflow, blocks_to_consider);
727 }
728
729
730 /* Analyze dataflow info for the basic blocks specified by the bitmap
731    BLOCKS, or for the whole CFG if BLOCKS is zero.  */
732
733 void
734 df_analyze (struct df *df)
735 {
736   int *postorder = xmalloc (sizeof (int) *last_basic_block);
737   bitmap current_all_blocks = BITMAP_ALLOC (NULL);
738   int n_blocks;
739   int i;
740   bool everything;
741
742   n_blocks = post_order_compute (postorder, true);
743
744   if (n_blocks != n_basic_blocks)
745     delete_unreachable_blocks ();
746
747   for (i = 0; i < n_blocks; i++)
748     bitmap_set_bit (current_all_blocks, postorder[i]);
749
750   /* No one called df_rescan_blocks, so do it.  */
751   if (!df->blocks_to_scan)
752     df_rescan_blocks (df, NULL);
753
754   /* Make sure that we have pruned any unreachable blocks from these
755      sets.  */
756   bitmap_and_into (df->blocks_to_scan, current_all_blocks);
757
758   if (df->blocks_to_analyze)
759     {
760       everything = false;
761       bitmap_and_into (df->blocks_to_analyze, current_all_blocks);
762       n_blocks = df_prune_to_subcfg (postorder, n_blocks, df->blocks_to_analyze);
763       BITMAP_FREE (current_all_blocks);
764     }
765   else
766     {
767       everything = true;
768       df->blocks_to_analyze = current_all_blocks;
769       current_all_blocks = NULL;
770     }
771
772   /* Skip over the DF_SCAN problem. */
773   for (i = 1; i < df->num_problems_defined; i++)
774     df_analyze_problem (df->problems_in_order[i], 
775                         df->blocks_to_analyze, df->blocks_to_analyze, 
776                         df->blocks_to_scan,
777                         postorder, n_blocks, false);
778
779   if (everything)
780     {
781       BITMAP_FREE (df->blocks_to_analyze);
782       df->blocks_to_analyze = NULL;
783     }
784
785   BITMAP_FREE (df->blocks_to_scan);
786   df->blocks_to_scan = NULL;
787 }
788
789
790 \f
791 /*----------------------------------------------------------------------------
792    Functions to support limited incremental change.
793 ----------------------------------------------------------------------------*/
794
795
796 /* Get basic block info.  */
797
798 static void *
799 df_get_bb_info (struct dataflow *dflow, unsigned int index)
800 {
801   return (struct df_scan_bb_info *) dflow->block_info[index];
802 }
803
804
805 /* Set basic block info.  */
806
807 static void
808 df_set_bb_info (struct dataflow *dflow, unsigned int index, 
809                 void *bb_info)
810 {
811   dflow->block_info[index] = bb_info;
812 }
813
814
815 /* Called from the rtl_compact_blocks to reorganize the problems basic
816    block info.  */
817
818 void 
819 df_compact_blocks (struct df *df)
820 {
821   int i, p;
822   basic_block bb;
823   void **problem_temps;
824   int size = last_basic_block *sizeof (void *);
825   problem_temps = xmalloc (size);
826
827   for (p = 0; p < df->num_problems_defined; p++)
828     {
829       struct dataflow *dflow = df->problems_in_order[p];
830       if (*dflow->problem->free_bb_fun)
831         {
832           df_grow_bb_info (dflow);
833           memcpy (problem_temps, dflow->block_info, size);
834
835           /* Copy the bb info from the problem tmps to the proper
836              place in the block_info vector.  Null out the copied
837              item.  */
838           i = NUM_FIXED_BLOCKS;
839           FOR_EACH_BB (bb) 
840             {
841               df_set_bb_info (dflow, i, problem_temps[bb->index]);
842               problem_temps[bb->index] = NULL;
843               i++;
844             }
845           memset (dflow->block_info + i, 0, 
846                   (last_basic_block - i) *sizeof (void *));
847
848           /* Free any block infos that were not copied (and NULLed).
849              These are from orphaned blocks.  */
850           for (i = NUM_FIXED_BLOCKS; i < last_basic_block; i++)
851             {
852               basic_block bb = BASIC_BLOCK (i); 
853               if (problem_temps[i] && bb)
854                 (*dflow->problem->free_bb_fun) 
855                   (dflow, bb, problem_temps[i]);
856             }
857         }
858     }
859
860   free (problem_temps);
861
862   i = NUM_FIXED_BLOCKS;
863   FOR_EACH_BB (bb) 
864     {
865       SET_BASIC_BLOCK (i, bb);
866       bb->index = i;
867       i++;
868     }
869
870   gcc_assert (i == n_basic_blocks);
871
872   for (; i < last_basic_block; i++)
873     SET_BASIC_BLOCK (i, NULL);
874 }
875
876
877 /* Shove NEW_BLOCK in at OLD_INDEX.  Called from if-cvt to hack a
878    block.  There is no excuse for people to do this kind of thing.  */
879
880 void 
881 df_bb_replace (struct df *df, int old_index, basic_block new_block)
882 {
883   int p;
884
885   for (p = 0; p < df->num_problems_defined; p++)
886     {
887       struct dataflow *dflow = df->problems_in_order[p];
888       if (dflow->block_info)
889         {
890           void *temp;
891
892           df_grow_bb_info (dflow);
893
894           /* The old switcheroo.  */
895
896           temp = df_get_bb_info (dflow, old_index);
897           df_set_bb_info (dflow, old_index, 
898                           df_get_bb_info (dflow, new_block->index));
899           df_set_bb_info (dflow, new_block->index, temp);
900         }
901     }
902
903   SET_BASIC_BLOCK (old_index, new_block);
904   new_block->index = old_index;
905 }
906
907 /*----------------------------------------------------------------------------
908    PUBLIC INTERFACES TO QUERY INFORMATION.
909 ----------------------------------------------------------------------------*/
910
911
912 /* Return last use of REGNO within BB.  */
913
914 struct df_ref *
915 df_bb_regno_last_use_find (struct df *df, basic_block bb, unsigned int regno)
916 {
917   rtx insn;
918   struct df_ref *use;
919
920   FOR_BB_INSNS_REVERSE (bb, insn)
921     {
922       unsigned int uid = INSN_UID (insn);
923       for (use = DF_INSN_UID_GET (df, uid)->uses; use; use = use->next_ref)
924         if (DF_REF_REGNO (use) == regno)
925           return use;
926     }
927   return NULL;
928 }
929
930
931 /* Return first def of REGNO within BB.  */
932
933 struct df_ref *
934 df_bb_regno_first_def_find (struct df *df, basic_block bb, unsigned int regno)
935 {
936   rtx insn;
937   struct df_ref *def;
938
939   FOR_BB_INSNS (bb, insn)
940     {
941       unsigned int uid = INSN_UID (insn);
942       for (def = DF_INSN_UID_GET (df, uid)->defs; def; def = def->next_ref)
943         if (DF_REF_REGNO (def) == regno)
944           return def;
945     }
946   return NULL;
947 }
948
949
950 /* Return last def of REGNO within BB.  */
951
952 struct df_ref *
953 df_bb_regno_last_def_find (struct df *df, basic_block bb, unsigned int regno)
954 {
955   rtx insn;
956   struct df_ref *def;
957
958   FOR_BB_INSNS_REVERSE (bb, insn)
959     {
960       unsigned int uid = INSN_UID (insn);
961
962       for (def = DF_INSN_UID_GET (df, uid)->defs; def; def = def->next_ref)
963         if (DF_REF_REGNO (def) == regno)
964           return def;
965     }
966
967   return NULL;
968 }
969
970 /* Return true if INSN defines REGNO.  */
971
972 bool
973 df_insn_regno_def_p (struct df *df, rtx insn, unsigned int regno)
974 {
975   unsigned int uid;
976   struct df_ref *def;
977
978   uid = INSN_UID (insn);
979   for (def = DF_INSN_UID_GET (df, uid)->defs; def; def = def->next_ref)
980     if (DF_REF_REGNO (def) == regno)
981       return true;
982   
983   return false;
984 }
985
986
987 /* Finds the reference corresponding to the definition of REG in INSN.
988    DF is the dataflow object.  */
989
990 struct df_ref *
991 df_find_def (struct df *df, rtx insn, rtx reg)
992 {
993   unsigned int uid;
994   struct df_ref *def;
995
996   if (GET_CODE (reg) == SUBREG)
997     reg = SUBREG_REG (reg);
998   gcc_assert (REG_P (reg));
999
1000   uid = INSN_UID (insn);
1001   for (def = DF_INSN_UID_GET (df, uid)->defs; def; def = def->next_ref)
1002     if (rtx_equal_p (DF_REF_REAL_REG (def), reg))
1003       return def;
1004
1005   return NULL;
1006 }
1007
1008
1009 /* Return true if REG is defined in INSN, zero otherwise.  */ 
1010
1011 bool
1012 df_reg_defined (struct df *df, rtx insn, rtx reg)
1013 {
1014   return df_find_def (df, insn, reg) != NULL;
1015 }
1016   
1017
1018 /* Finds the reference corresponding to the use of REG in INSN.
1019    DF is the dataflow object.  */
1020   
1021 struct df_ref *
1022 df_find_use (struct df *df, rtx insn, rtx reg)
1023 {
1024   unsigned int uid;
1025   struct df_ref *use;
1026
1027   if (GET_CODE (reg) == SUBREG)
1028     reg = SUBREG_REG (reg);
1029   gcc_assert (REG_P (reg));
1030
1031   uid = INSN_UID (insn);
1032   for (use = DF_INSN_UID_GET (df, uid)->uses; use; use = use->next_ref)
1033     if (rtx_equal_p (DF_REF_REAL_REG (use), reg))
1034       return use; 
1035
1036   return NULL;
1037 }
1038
1039
1040 /* Return true if REG is referenced in INSN, zero otherwise.  */ 
1041
1042 bool
1043 df_reg_used (struct df *df, rtx insn, rtx reg)
1044 {
1045   return df_find_use (df, insn, reg) != NULL;
1046 }
1047   
1048 \f
1049 /*----------------------------------------------------------------------------
1050    Debugging and printing functions.
1051 ----------------------------------------------------------------------------*/
1052
1053 /* Dump dataflow info.  */
1054 void
1055 df_dump (struct df *df, FILE *file)
1056 {
1057   int i;
1058
1059   if (! df || ! file)
1060     return;
1061
1062   fprintf (file, "\n\n%s\n", current_function_name ());
1063   fprintf (file, "\nDataflow summary:\n");
1064   fprintf (file, "def_info->bitmap_size = %d, use_info->bitmap_size = %d\n",
1065            df->def_info.bitmap_size, df->use_info.bitmap_size);
1066
1067   for (i = 0; i < df->num_problems_defined; i++)
1068     (*df->problems_in_order[i]->problem->dump_fun) (df->problems_in_order[i], file); 
1069
1070   fprintf (file, "\n");
1071 }
1072
1073
1074 void
1075 df_refs_chain_dump (struct df *df, struct df_ref *ref, 
1076                    bool follow_chain, FILE *file)
1077 {
1078   fprintf (file, "{ ");
1079   while (ref)
1080     {
1081       fprintf (file, "%c%d(%d) ",
1082                DF_REF_REG_DEF_P (ref) ? 'd' : 'u',
1083                DF_REF_ID (ref),
1084                DF_REF_REGNO (ref));
1085       if (follow_chain)
1086         df_chain_dump (df, DF_REF_CHAIN (ref), file);
1087       ref = ref->next_ref;
1088     }
1089   fprintf (file, "}");
1090 }
1091
1092
1093 /* Dump either a ref-def or reg-use chain.  */
1094
1095 void
1096 df_regs_chain_dump (struct df *df ATTRIBUTE_UNUSED, struct df_ref *ref,  FILE *file)
1097 {
1098   fprintf (file, "{ ");
1099   while (ref)
1100     {
1101       fprintf (file, "%c%d(%d) ",
1102                DF_REF_REG_DEF_P (ref) ? 'd' : 'u',
1103                DF_REF_ID (ref),
1104                DF_REF_REGNO (ref));
1105       ref = ref->next_reg;
1106     }
1107   fprintf (file, "}");
1108 }
1109
1110
1111 void
1112 df_insn_debug (struct df *df, rtx insn, bool follow_chain, FILE *file)
1113 {
1114   unsigned int uid;
1115   int bbi;
1116
1117   uid = INSN_UID (insn);
1118
1119   if (DF_INSN_UID_DEFS (df, uid))
1120     bbi = DF_REF_BBNO (DF_INSN_UID_DEFS (df, uid));
1121   else if (DF_INSN_UID_USES(df, uid))
1122     bbi = DF_REF_BBNO (DF_INSN_UID_USES (df, uid));
1123   else
1124     bbi = -1;
1125
1126   fprintf (file, "insn %d bb %d luid %d defs ",
1127            uid, bbi, DF_INSN_LUID (df, insn));
1128
1129   df_refs_chain_dump (df, DF_INSN_UID_DEFS (df, uid), follow_chain, file);
1130   fprintf (file, " defs ");
1131   df_refs_chain_dump (df, DF_INSN_UID_USES (df, uid), follow_chain, file);
1132   fprintf (file, "\n");
1133 }
1134
1135 void
1136 df_insn_debug_regno (struct df *df, rtx insn, FILE *file)
1137 {
1138   unsigned int uid;
1139   int bbi;
1140
1141   uid = INSN_UID (insn);
1142   if (DF_INSN_UID_DEFS (df, uid))
1143     bbi = DF_REF_BBNO (DF_INSN_UID_DEFS (df, uid));
1144   else if (DF_INSN_UID_USES(df, uid))
1145     bbi = DF_REF_BBNO (DF_INSN_UID_USES (df, uid));
1146   else
1147     bbi = -1;
1148
1149   fprintf (file, "insn %d bb %d luid %d defs ",
1150            uid, bbi, DF_INSN_LUID (df, insn));
1151   df_regs_chain_dump (df, DF_INSN_UID_DEFS (df, uid), file);
1152     
1153   fprintf (file, " uses ");
1154   df_regs_chain_dump (df, DF_INSN_UID_USES (df, uid), file);
1155   fprintf (file, "\n");
1156 }
1157
1158 void
1159 df_regno_debug (struct df *df, unsigned int regno, FILE *file)
1160 {
1161   fprintf (file, "reg %d defs ", regno);
1162   df_regs_chain_dump (df, DF_REG_DEF_GET (df, regno)->reg_chain, file);
1163   fprintf (file, " uses ");
1164   df_regs_chain_dump (df, DF_REG_USE_GET (df, regno)->reg_chain, file);
1165   fprintf (file, "\n");
1166 }
1167
1168
1169 void
1170 df_ref_debug (struct df *df, struct df_ref *ref, FILE *file)
1171 {
1172   fprintf (file, "%c%d ",
1173            DF_REF_REG_DEF_P (ref) ? 'd' : 'u',
1174            DF_REF_ID (ref));
1175   fprintf (file, "reg %d bb %d luid %d insn %d chain ",
1176            DF_REF_REGNO (ref),
1177            DF_REF_BBNO (ref),
1178            DF_REF_INSN (ref) ? DF_INSN_LUID (df, DF_REF_INSN (ref)) : -1,
1179            DF_REF_INSN (ref) ? INSN_UID (DF_REF_INSN (ref)) : -1);
1180   df_chain_dump (df, DF_REF_CHAIN (ref), file);
1181   fprintf (file, "\n");
1182 }
1183 \f
1184 /* Functions for debugging from GDB.  */
1185
1186 void
1187 debug_df_insn (rtx insn)
1188 {
1189   df_insn_debug (ddf, insn, true, stderr);
1190   debug_rtx (insn);
1191 }
1192
1193
1194 void
1195 debug_df_reg (rtx reg)
1196 {
1197   df_regno_debug (ddf, REGNO (reg), stderr);
1198 }
1199
1200
1201 void
1202 debug_df_regno (unsigned int regno)
1203 {
1204   df_regno_debug (ddf, regno, stderr);
1205 }
1206
1207
1208 void
1209 debug_df_ref (struct df_ref *ref)
1210 {
1211   df_ref_debug (ddf, ref, stderr);
1212 }
1213
1214
1215 void
1216 debug_df_defno (unsigned int defno)
1217 {
1218   df_ref_debug (ddf, DF_DEFS_GET (ddf, defno), stderr);
1219 }
1220
1221
1222 void
1223 debug_df_useno (unsigned int defno)
1224 {
1225   df_ref_debug (ddf, DF_USES_GET (ddf, defno), stderr);
1226 }
1227
1228
1229 void
1230 debug_df_chain (struct df_link *link)
1231 {
1232   df_chain_dump (ddf, link, stderr);
1233   fputc ('\n', stderr);
1234 }