OSDN Git Service

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