* recog.c (peephole2_optimize): Make it static.
[official-gcc.git] / gcc / df-core.c
blob416406b68f158361334153e5d4fb8ffb8ee1fe1c
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).
9 This file is part of GCC.
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.
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.
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.
28 OVERVIEW:
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.
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.
40 USAGE:
42 Here is an example of using the dataflow routines.
44 struct df *df;
46 df = df_init (init_flags);
48 df_add_problem (df, problem);
50 df_set_blocks (df, blocks);
52 df_rescan_blocks (df, blocks);
54 df_analyze (df);
56 df_dump (df, stderr);
58 df_finish (df);
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.
66 There are two flags that can be passed to df_init:
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.
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.
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.
82 For all of the problems defined in df-problems.c, there are
83 convienence functions named DF_*_ADD_PROBLEM.
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.
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.
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.
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.
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.
120 DF_DUMP can then be called to dump the information produce to some
121 file.
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.
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.
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.
147 PHILOSOPHY:
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.
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.
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.
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.
173 DATA STRUCTURES:
175 The basic object is a DF_REF (reference) and this may either be a
176 DEF (definition) or a USE of a register.
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.
184 Note that the reg-def and reg-use chains are generally short for
185 pseudos and long for the hard registers.
187 ACCESSING REFS:
189 There are 4 ways to obtain access to refs:
191 1) References are divided into two categories, REAL and ARTIFICIAL.
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.
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.
208 Artificial defs and uses occur both at the beginning and ends of blocks.
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.
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.
223 Artifical defs occur at the end of the entry block. These arise
224 from registers that are live at entry to the function.
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.
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.
235 In previous versions of this code, these chains were ordered. It
236 has not been practical to continue this practice.
238 3) If def-use or use-def chains are built, these can be traversed to
239 get to other refs.
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.
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.
254 NOTES:
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.
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.
271 Paradoxical subreg writes do not leave a trace of the old content, so they
272 are write-only operations.
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"
297 static struct df *ddf = NULL;
298 struct df *shared_df = NULL;
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 ----------------------------------------------------------------------------*/
307 /* Initialize dataflow analysis and allocate and initialize dataflow
308 memory. */
310 struct df *
311 df_init (int flags)
313 struct df *df = xcalloc (1, sizeof (struct df));
314 df->flags = flags;
316 /* This is executed once per compilation to initialize platform
317 specific data structures. */
318 df_hard_reg_init ();
320 /* All df instance must define the scanning problem. */
321 df_scan_add_problem (df);
322 ddf = df;
323 return df;
326 /* Add PROBLEM to the DF instance. */
328 struct dataflow *
329 df_add_problem (struct df *df, struct df_problem *problem)
331 struct dataflow *dflow;
333 /* First try to add the dependent problem. */
334 if (problem->dependent_problem)
335 df_add_problem (df, problem->dependent_problem);
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;
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;
351 return dflow;
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. */
359 void
360 df_set_blocks (struct df *df, bitmap blocks)
362 if (blocks)
364 if (df->blocks_to_analyze)
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--)
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)
377 bitmap_iterator bi;
378 unsigned int bb_index;
380 EXECUTE_IF_SET_IN_BITMAP (diff, 0, bb_index, bi)
382 basic_block bb = BASIC_BLOCK (bb_index);
383 if (bb)
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);
393 BITMAP_FREE (all);
394 BITMAP_FREE (diff);
396 else
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)
403 bitmap blocks_to_reset = NULL;
404 int p;
405 for (p = df->num_problems_defined - 1; p >= 0 ;p--)
407 struct dataflow *dflow = df->problems_in_order[p];
408 if (*dflow->problem->reset_fun)
410 if (!blocks_to_reset)
412 basic_block bb;
413 blocks_to_reset = BITMAP_ALLOC (NULL);
414 FOR_ALL_BB(bb)
416 bitmap_set_bit (blocks_to_reset, bb->index);
419 (*dflow->problem->reset_fun) (dflow, blocks_to_reset);
422 if (blocks_to_reset)
423 BITMAP_FREE (blocks_to_reset);
425 df->blocks_to_analyze = BITMAP_ALLOC (NULL);
427 bitmap_copy (df->blocks_to_analyze, blocks);
429 else
431 if (df->blocks_to_analyze)
433 BITMAP_FREE (df->blocks_to_analyze);
434 df->blocks_to_analyze = NULL;
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. */
443 void
444 df_finish1 (struct df *df)
446 int i;
448 for (i = 0; i < df->num_problems_defined; i++)
449 (*df->problems_in_order[i]->problem->free_fun) (df->problems_in_order[i]);
451 free (df);
455 /*----------------------------------------------------------------------------
456 The general data flow analysis engine.
457 ----------------------------------------------------------------------------*/
460 /* Hybrid search algorithm from "Implementation Techniques for
461 Efficient Data-Flow Analysis of Large Programs". */
463 static void
464 df_hybrid_search_forward (basic_block bb,
465 struct dataflow *dataflow,
466 bool single_pass)
468 int result_changed;
469 int i = bb->index;
470 edge e;
471 edge_iterator ei;
473 SET_BIT (dataflow->visited, bb->index);
474 gcc_assert (TEST_BIT (dataflow->pending, bb->index));
475 RESET_BIT (dataflow->pending, i);
477 /* Calculate <conf_op> of predecessor_outs. */
478 if (EDGE_COUNT (bb->preds) > 0)
479 FOR_EACH_EDGE (e, ei, bb->preds)
481 if (!TEST_BIT (dataflow->considered, e->src->index))
482 continue;
484 (*dataflow->problem->con_fun_n) (dataflow, e);
486 else if (*dataflow->problem->con_fun_0)
487 (*dataflow->problem->con_fun_0) (dataflow, bb);
489 result_changed = (*dataflow->problem->trans_fun) (dataflow, i);
491 if (!result_changed || single_pass)
492 return;
494 FOR_EACH_EDGE (e, ei, bb->succs)
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);
503 FOR_EACH_EDGE (e, ei, bb->succs)
505 if (e->dest->index == i)
506 continue;
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);
515 static void
516 df_hybrid_search_backward (basic_block bb,
517 struct dataflow *dataflow,
518 bool single_pass)
520 int result_changed;
521 int i = bb->index;
522 edge e;
523 edge_iterator ei;
525 SET_BIT (dataflow->visited, bb->index);
526 gcc_assert (TEST_BIT (dataflow->pending, bb->index));
527 RESET_BIT (dataflow->pending, i);
529 /* Calculate <conf_op> of predecessor_outs. */
530 if (EDGE_COUNT (bb->succs) > 0)
531 FOR_EACH_EDGE (e, ei, bb->succs)
533 if (!TEST_BIT (dataflow->considered, e->dest->index))
534 continue;
536 (*dataflow->problem->con_fun_n) (dataflow, e);
538 else if (*dataflow->problem->con_fun_0)
539 (*dataflow->problem->con_fun_0) (dataflow, bb);
541 result_changed = (*dataflow->problem->trans_fun) (dataflow, i);
543 if (!result_changed || single_pass)
544 return;
546 FOR_EACH_EDGE (e, ei, bb->preds)
548 if (e->src->index == i)
549 continue;
551 if (!TEST_BIT (dataflow->considered, e->src->index))
552 continue;
554 SET_BIT (dataflow->pending, e->src->index);
557 FOR_EACH_EDGE (e, ei, bb->preds)
559 if (e->src->index == i)
560 continue;
562 if (!TEST_BIT (dataflow->considered, e->src->index))
563 continue;
565 if (!TEST_BIT (dataflow->visited, e->src->index))
566 df_hybrid_search_backward (e->src, dataflow, single_pass);
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.
575 SINGLE_PASS is true if you just want to make one pass over the
576 blocks. */
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)
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;
591 dataflow->visited = visited;
592 dataflow->pending = pending;
593 dataflow->considered = considered;
595 sbitmap_zero (visited);
596 sbitmap_zero (pending);
597 sbitmap_zero (considered);
599 EXECUTE_IF_SET_IN_BITMAP (blocks_to_consider, 0, idx, bi)
601 SET_BIT (considered, idx);
604 for (i = 0; i < n_blocks; i++)
606 idx = blocks_in_postorder[i];
607 SET_BIT (pending, idx);
610 (*dataflow->problem->init_fun) (dataflow, blocks_to_init);
612 while (1)
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.
620 The nodes are passed into this function in postorder. */
622 if (dataflow->problem->dir == DF_FORWARD)
624 for (i = n_blocks - 1 ; i >= 0 ; i--)
626 idx = blocks_in_postorder[i];
628 if (TEST_BIT (pending, idx) && !TEST_BIT (visited, idx))
629 df_hybrid_search_forward (BASIC_BLOCK (idx), dataflow, single_pass);
632 else
634 for (i = 0; i < n_blocks; i++)
636 idx = blocks_in_postorder[i];
638 if (TEST_BIT (pending, idx) && !TEST_BIT (visited, idx))
639 df_hybrid_search_backward (BASIC_BLOCK (idx), dataflow, single_pass);
643 if (sbitmap_first_set_bit (pending) == -1)
644 break;
646 sbitmap_zero (visited);
649 sbitmap_free (pending);
650 sbitmap_free (visited);
651 sbitmap_free (considered);
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. */
659 static unsigned
660 df_prune_to_subcfg (int list[], unsigned len, bitmap blocks)
662 unsigned act, last;
664 for (act = 0, last = 0; act < len; act++)
665 if (bitmap_bit_p (blocks, list[act]))
666 list[last++] = list[act];
668 return last;
672 /* Execute dataflow analysis on a single dataflow problem.
674 There are three sets of blocks passed in:
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).
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.
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.
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
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)
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);
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);
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);
724 /* Massage the solution. */
725 if (*dflow->problem->finalize_fun)
726 (*dflow->problem->finalize_fun) (dflow, blocks_to_consider);
730 /* Analyze dataflow info for the basic blocks specified by the bitmap
731 BLOCKS, or for the whole CFG if BLOCKS is zero. */
733 void
734 df_analyze (struct df *df)
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;
742 n_blocks = post_order_compute (postorder, true);
744 if (n_blocks != n_basic_blocks)
745 delete_unreachable_blocks ();
747 for (i = 0; i < n_blocks; i++)
748 bitmap_set_bit (current_all_blocks, postorder[i]);
750 /* No one called df_rescan_blocks, so do it. */
751 if (!df->blocks_to_scan)
752 df_rescan_blocks (df, NULL);
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);
758 if (df->blocks_to_analyze)
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);
765 else
767 everything = true;
768 df->blocks_to_analyze = current_all_blocks;
769 current_all_blocks = NULL;
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);
779 if (everything)
781 BITMAP_FREE (df->blocks_to_analyze);
782 df->blocks_to_analyze = NULL;
785 BITMAP_FREE (df->blocks_to_scan);
786 df->blocks_to_scan = NULL;
791 /*----------------------------------------------------------------------------
792 Functions to support limited incremental change.
793 ----------------------------------------------------------------------------*/
796 /* Get basic block info. */
798 static void *
799 df_get_bb_info (struct dataflow *dflow, unsigned int index)
801 return (struct df_scan_bb_info *) dflow->block_info[index];
805 /* Set basic block info. */
807 static void
808 df_set_bb_info (struct dataflow *dflow, unsigned int index,
809 void *bb_info)
811 dflow->block_info[index] = bb_info;
815 /* Called from the rtl_compact_blocks to reorganize the problems basic
816 block info. */
818 void
819 df_compact_blocks (struct df *df)
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);
827 for (p = 0; p < df->num_problems_defined; p++)
829 struct dataflow *dflow = df->problems_in_order[p];
830 if (*dflow->problem->free_bb_fun)
832 df_grow_bb_info (dflow);
833 memcpy (problem_temps, dflow->block_info, size);
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)
841 df_set_bb_info (dflow, i, problem_temps[bb->index]);
842 problem_temps[bb->index] = NULL;
843 i++;
845 memset (dflow->block_info + i, 0,
846 (last_basic_block - i) *sizeof (void *));
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++)
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]);
860 free (problem_temps);
862 i = NUM_FIXED_BLOCKS;
863 FOR_EACH_BB (bb)
865 SET_BASIC_BLOCK (i, bb);
866 bb->index = i;
867 i++;
870 gcc_assert (i == n_basic_blocks);
872 for (; i < last_basic_block; i++)
873 SET_BASIC_BLOCK (i, NULL);
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. */
880 void
881 df_bb_replace (struct df *df, int old_index, basic_block new_block)
883 int p;
885 for (p = 0; p < df->num_problems_defined; p++)
887 struct dataflow *dflow = df->problems_in_order[p];
888 if (dflow->block_info)
890 void *temp;
892 df_grow_bb_info (dflow);
894 /* The old switcheroo. */
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);
903 SET_BASIC_BLOCK (old_index, new_block);
904 new_block->index = old_index;
907 /*----------------------------------------------------------------------------
908 PUBLIC INTERFACES TO QUERY INFORMATION.
909 ----------------------------------------------------------------------------*/
912 /* Return last use of REGNO within BB. */
914 struct df_ref *
915 df_bb_regno_last_use_find (struct df *df, basic_block bb, unsigned int regno)
917 rtx insn;
918 struct df_ref *use;
920 FOR_BB_INSNS_REVERSE (bb, insn)
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;
927 return NULL;
931 /* Return first def of REGNO within BB. */
933 struct df_ref *
934 df_bb_regno_first_def_find (struct df *df, basic_block bb, unsigned int regno)
936 rtx insn;
937 struct df_ref *def;
939 FOR_BB_INSNS (bb, insn)
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;
946 return NULL;
950 /* Return last def of REGNO within BB. */
952 struct df_ref *
953 df_bb_regno_last_def_find (struct df *df, basic_block bb, unsigned int regno)
955 rtx insn;
956 struct df_ref *def;
958 FOR_BB_INSNS_REVERSE (bb, insn)
960 unsigned int uid = INSN_UID (insn);
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;
967 return NULL;
970 /* Return true if INSN defines REGNO. */
972 bool
973 df_insn_regno_def_p (struct df *df, rtx insn, unsigned int regno)
975 unsigned int uid;
976 struct df_ref *def;
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;
983 return false;
987 /* Finds the reference corresponding to the definition of REG in INSN.
988 DF is the dataflow object. */
990 struct df_ref *
991 df_find_def (struct df *df, rtx insn, rtx reg)
993 unsigned int uid;
994 struct df_ref *def;
996 if (GET_CODE (reg) == SUBREG)
997 reg = SUBREG_REG (reg);
998 gcc_assert (REG_P (reg));
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;
1005 return NULL;
1009 /* Return true if REG is defined in INSN, zero otherwise. */
1011 bool
1012 df_reg_defined (struct df *df, rtx insn, rtx reg)
1014 return df_find_def (df, insn, reg) != NULL;
1018 /* Finds the reference corresponding to the use of REG in INSN.
1019 DF is the dataflow object. */
1021 struct df_ref *
1022 df_find_use (struct df *df, rtx insn, rtx reg)
1024 unsigned int uid;
1025 struct df_ref *use;
1027 if (GET_CODE (reg) == SUBREG)
1028 reg = SUBREG_REG (reg);
1029 gcc_assert (REG_P (reg));
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;
1036 return NULL;
1040 /* Return true if REG is referenced in INSN, zero otherwise. */
1042 bool
1043 df_reg_used (struct df *df, rtx insn, rtx reg)
1045 return df_find_use (df, insn, reg) != NULL;
1049 /*----------------------------------------------------------------------------
1050 Debugging and printing functions.
1051 ----------------------------------------------------------------------------*/
1053 /* Dump dataflow info. */
1054 void
1055 df_dump (struct df *df, FILE *file)
1057 int i;
1059 if (! df || ! file)
1060 return;
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);
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);
1070 fprintf (file, "\n");
1074 void
1075 df_refs_chain_dump (struct df *df, struct df_ref *ref,
1076 bool follow_chain, FILE *file)
1078 fprintf (file, "{ ");
1079 while (ref)
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;
1089 fprintf (file, "}");
1093 /* Dump either a ref-def or reg-use chain. */
1095 void
1096 df_regs_chain_dump (struct df *df ATTRIBUTE_UNUSED, struct df_ref *ref, FILE *file)
1098 fprintf (file, "{ ");
1099 while (ref)
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;
1107 fprintf (file, "}");
1111 void
1112 df_insn_debug (struct df *df, rtx insn, bool follow_chain, FILE *file)
1114 unsigned int uid;
1115 int bbi;
1117 uid = INSN_UID (insn);
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;
1126 fprintf (file, "insn %d bb %d luid %d defs ",
1127 uid, bbi, DF_INSN_LUID (df, insn));
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");
1135 void
1136 df_insn_debug_regno (struct df *df, rtx insn, FILE *file)
1138 unsigned int uid;
1139 int bbi;
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;
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);
1153 fprintf (file, " uses ");
1154 df_regs_chain_dump (df, DF_INSN_UID_USES (df, uid), file);
1155 fprintf (file, "\n");
1158 void
1159 df_regno_debug (struct df *df, unsigned int regno, FILE *file)
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");
1169 void
1170 df_ref_debug (struct df *df, struct df_ref *ref, FILE *file)
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");
1184 /* Functions for debugging from GDB. */
1186 void
1187 debug_df_insn (rtx insn)
1189 df_insn_debug (ddf, insn, true, stderr);
1190 debug_rtx (insn);
1194 void
1195 debug_df_reg (rtx reg)
1197 df_regno_debug (ddf, REGNO (reg), stderr);
1201 void
1202 debug_df_regno (unsigned int regno)
1204 df_regno_debug (ddf, regno, stderr);
1208 void
1209 debug_df_ref (struct df_ref *ref)
1211 df_ref_debug (ddf, ref, stderr);
1215 void
1216 debug_df_defno (unsigned int defno)
1218 df_ref_debug (ddf, DF_DEFS_GET (ddf, defno), stderr);
1222 void
1223 debug_df_useno (unsigned int defno)
1225 df_ref_debug (ddf, DF_USES_GET (ddf, defno), stderr);
1229 void
1230 debug_df_chain (struct df_link *link)
1232 df_chain_dump (ddf, link, stderr);
1233 fputc ('\n', stderr);