2007-05-22 H.J. Lu <hongjiu.lu@intel.com>
[official-gcc.git] / gcc / df-core.c
blob7f89fccdfb358682e9561884c43426f363a96548
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, flags);
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 three flags that can be passed to df_init, each of these
67 flags controls the scanning of the rtl:
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.
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.
81 For all of the problems defined in df-problems.c, there are
82 convenience functions named DF_*_ADD_PROBLEM.
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.
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.
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.
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.
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.
122 DF_DUMP can then be called to dump the information produce to some
123 file.
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.
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.
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.
149 PHILOSOPHY:
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.
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.
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.
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.
175 DATA STRUCTURES:
177 The basic object is a DF_REF (reference) and this may either be a
178 DEF (definition) or a USE of a register.
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.
186 Note that the reg-def and reg-use chains are generally short for
187 pseudos and long for the hard registers.
189 ACCESSING REFS:
191 There are 4 ways to obtain access to refs:
193 1) References are divided into two categories, REAL and ARTIFICIAL.
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.
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.
210 Artificial defs and uses occur both at the beginning and ends of blocks.
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.
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.
225 Artificial defs occur at the end of the entry block. These arise
226 from registers that are live at entry to the function.
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.
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.
237 In previous versions of this code, these chains were ordered. It
238 has not been practical to continue this practice.
240 3) If def-use or use-def chains are built, these can be traversed to
241 get to other refs.
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.
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.
256 NOTES:
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.
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.
273 Paradoxical subreg writes do not leave a trace of the old content, so they
274 are write-only operations.
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"
299 static struct df *ddf = NULL;
300 struct df *shared_df = NULL;
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 ----------------------------------------------------------------------------*/
309 /* Initialize dataflow analysis and allocate and initialize dataflow
310 memory. */
312 struct df *
313 df_init (int flags)
315 struct df *df = XCNEW (struct df);
317 /* This is executed once per compilation to initialize platform
318 specific data structures. */
319 df_hard_reg_init ();
321 /* All df instance must define the scanning problem. */
322 df_scan_add_problem (df, flags);
323 ddf = df;
324 return df;
327 /* Add PROBLEM to the DF instance. */
329 struct dataflow *
330 df_add_problem (struct df *df, struct df_problem *problem, int flags)
332 struct dataflow *dflow;
334 /* First try to add the dependent problem. */
335 if (problem->dependent_problem_fun)
336 (problem->dependent_problem_fun) (df, 0);
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;
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;
353 return dflow;
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)
363 int old_flags = dflow->flags;
365 gcc_assert (!(mask & (~dflow->problem->changeable_flags)));
367 dflow->flags |= mask;
369 return old_flags;
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)
378 int old_flags = dflow->flags;
380 gcc_assert (!(mask & (~dflow->problem->changeable_flags)));
382 dflow->flags &= !mask;
384 return old_flags;
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. */
391 void
392 df_set_blocks (struct df *df, bitmap blocks)
394 if (blocks)
396 if (df->blocks_to_analyze)
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--)
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)
408 bitmap_iterator bi;
409 unsigned int bb_index;
411 EXECUTE_IF_SET_IN_BITMAP (diff, 0, bb_index, bi)
413 basic_block bb = BASIC_BLOCK (bb_index);
414 if (bb)
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);
424 BITMAP_FREE (diff);
426 else
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)
433 bitmap blocks_to_reset = NULL;
434 int p;
435 for (p = df->num_problems_defined - 1; p >= 0 ;p--)
437 struct dataflow *dflow = df->problems_in_order[p];
438 if (dflow->problem->reset_fun)
440 if (!blocks_to_reset)
442 basic_block bb;
443 blocks_to_reset = BITMAP_ALLOC (NULL);
444 FOR_ALL_BB(bb)
446 bitmap_set_bit (blocks_to_reset, bb->index);
449 dflow->problem->reset_fun (dflow, blocks_to_reset);
452 if (blocks_to_reset)
453 BITMAP_FREE (blocks_to_reset);
455 df->blocks_to_analyze = BITMAP_ALLOC (NULL);
457 bitmap_copy (df->blocks_to_analyze, blocks);
459 else
461 if (df->blocks_to_analyze)
463 BITMAP_FREE (df->blocks_to_analyze);
464 df->blocks_to_analyze = NULL;
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. */
474 void
475 df_delete_basic_block (struct df *df, int bb_index)
477 basic_block bb = BASIC_BLOCK (bb_index);
478 int i;
480 for (i = 0; i < df->num_problems_defined; i++)
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));
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. */
493 void
494 df_finish1 (struct df *df)
496 int i;
498 for (i = 0; i < df->num_problems_defined; i++)
499 df->problems_in_order[i]->problem->free_fun (df->problems_in_order[i]);
501 free (df);
505 /*----------------------------------------------------------------------------
506 The general data flow analysis engine.
507 ----------------------------------------------------------------------------*/
510 /* Hybrid search algorithm from "Implementation Techniques for
511 Efficient Data-Flow Analysis of Large Programs". */
513 static void
514 df_hybrid_search_forward (basic_block bb,
515 struct dataflow *dataflow,
516 bool single_pass)
518 int result_changed;
519 int i = bb->index;
520 edge e;
521 edge_iterator ei;
523 SET_BIT (dataflow->visited, bb->index);
524 gcc_assert (TEST_BIT (dataflow->pending, bb->index));
525 RESET_BIT (dataflow->pending, i);
527 /* Calculate <conf_op> of predecessor_outs. */
528 if (EDGE_COUNT (bb->preds) > 0)
529 FOR_EACH_EDGE (e, ei, bb->preds)
531 if (!TEST_BIT (dataflow->considered, e->src->index))
532 continue;
534 dataflow->problem->con_fun_n (dataflow, e);
536 else if (dataflow->problem->con_fun_0)
537 dataflow->problem->con_fun_0 (dataflow, bb);
539 result_changed = dataflow->problem->trans_fun (dataflow, i);
541 if (!result_changed || single_pass)
542 return;
544 FOR_EACH_EDGE (e, ei, bb->succs)
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);
553 FOR_EACH_EDGE (e, ei, bb->succs)
555 if (e->dest->index == i)
556 continue;
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);
565 static void
566 df_hybrid_search_backward (basic_block bb,
567 struct dataflow *dataflow,
568 bool single_pass)
570 int result_changed;
571 int i = bb->index;
572 edge e;
573 edge_iterator ei;
575 SET_BIT (dataflow->visited, bb->index);
576 gcc_assert (TEST_BIT (dataflow->pending, bb->index));
577 RESET_BIT (dataflow->pending, i);
579 /* Calculate <conf_op> of predecessor_outs. */
580 if (EDGE_COUNT (bb->succs) > 0)
581 FOR_EACH_EDGE (e, ei, bb->succs)
583 if (!TEST_BIT (dataflow->considered, e->dest->index))
584 continue;
586 dataflow->problem->con_fun_n (dataflow, e);
588 else if (dataflow->problem->con_fun_0)
589 dataflow->problem->con_fun_0 (dataflow, bb);
591 result_changed = dataflow->problem->trans_fun (dataflow, i);
593 if (!result_changed || single_pass)
594 return;
596 FOR_EACH_EDGE (e, ei, bb->preds)
598 if (e->src->index == i)
599 continue;
601 if (!TEST_BIT (dataflow->considered, e->src->index))
602 continue;
604 SET_BIT (dataflow->pending, e->src->index);
607 FOR_EACH_EDGE (e, ei, bb->preds)
609 if (e->src->index == i)
610 continue;
612 if (!TEST_BIT (dataflow->considered, e->src->index))
613 continue;
615 if (!TEST_BIT (dataflow->visited, e->src->index))
616 df_hybrid_search_backward (e->src, dataflow, single_pass);
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.
625 SINGLE_PASS is true if you just want to make one pass over the
626 blocks. */
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)
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;
641 dataflow->visited = visited;
642 dataflow->pending = pending;
643 dataflow->considered = considered;
645 sbitmap_zero (visited);
646 sbitmap_zero (pending);
647 sbitmap_zero (considered);
649 gcc_assert (dataflow->problem->dir);
651 EXECUTE_IF_SET_IN_BITMAP (blocks_to_consider, 0, idx, bi)
653 SET_BIT (considered, idx);
656 for (i = 0; i < n_blocks; i++)
658 idx = blocks_in_postorder[i];
659 SET_BIT (pending, idx);
662 dataflow->problem->init_fun (dataflow, blocks_to_init);
664 while (1)
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.
672 The nodes are passed into this function in postorder. */
674 if (dataflow->problem->dir == DF_FORWARD)
676 for (i = n_blocks - 1 ; i >= 0 ; i--)
678 idx = blocks_in_postorder[i];
680 if (TEST_BIT (pending, idx) && !TEST_BIT (visited, idx))
681 df_hybrid_search_forward (BASIC_BLOCK (idx), dataflow, single_pass);
684 else
686 for (i = 0; i < n_blocks; i++)
688 idx = blocks_in_postorder[i];
690 if (TEST_BIT (pending, idx) && !TEST_BIT (visited, idx))
691 df_hybrid_search_backward (BASIC_BLOCK (idx), dataflow, single_pass);
695 if (sbitmap_first_set_bit (pending) == -1)
696 break;
698 sbitmap_zero (visited);
701 sbitmap_free (pending);
702 sbitmap_free (visited);
703 sbitmap_free (considered);
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. */
711 static unsigned
712 df_prune_to_subcfg (int list[], unsigned len, bitmap blocks)
714 unsigned act, last;
716 for (act = 0, last = 0; act < len; act++)
717 if (bitmap_bit_p (blocks, list[act]))
718 list[last++] = list[act];
720 return last;
724 /* Execute dataflow analysis on a single dataflow problem.
726 There are three sets of blocks passed in:
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).
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.
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.
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
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)
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);
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);
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);
776 /* Massage the solution. */
777 if (dflow->problem->finalize_fun)
778 dflow->problem->finalize_fun (dflow, blocks_to_consider);
782 /* Analyze dataflow info for the basic blocks specified by the bitmap
783 BLOCKS, or for the whole CFG if BLOCKS is zero. */
785 void
786 df_analyze (struct df *df)
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;
794 n_blocks = post_order_compute (postorder, true);
796 if (n_blocks != n_basic_blocks)
797 delete_unreachable_blocks ();
799 for (i = 0; i < n_blocks; i++)
800 bitmap_set_bit (current_all_blocks, postorder[i]);
802 /* No one called df_rescan_blocks, so do it. */
803 if (!df->blocks_to_scan)
804 df_rescan_blocks (df, NULL);
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);
810 if (df->blocks_to_analyze)
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);
817 else
819 everything = true;
820 df->blocks_to_analyze = current_all_blocks;
821 current_all_blocks = NULL;
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);
831 if (everything)
833 BITMAP_FREE (df->blocks_to_analyze);
834 df->blocks_to_analyze = NULL;
837 BITMAP_FREE (df->blocks_to_scan);
838 df->blocks_to_scan = NULL;
839 free (postorder);
844 /*----------------------------------------------------------------------------
845 Functions to support limited incremental change.
846 ----------------------------------------------------------------------------*/
849 /* Get basic block info. */
851 static void *
852 df_get_bb_info (struct dataflow *dflow, unsigned int index)
854 return (struct df_scan_bb_info *) dflow->block_info[index];
858 /* Set basic block info. */
860 static void
861 df_set_bb_info (struct dataflow *dflow, unsigned int index,
862 void *bb_info)
864 dflow->block_info[index] = bb_info;
868 /* Called from the rtl_compact_blocks to reorganize the problems basic
869 block info. */
871 void
872 df_compact_blocks (struct df *df)
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);
880 for (p = 0; p < df->num_problems_defined; p++)
882 struct dataflow *dflow = df->problems_in_order[p];
883 if (dflow->problem->free_bb_fun)
885 df_grow_bb_info (dflow);
886 memcpy (problem_temps, dflow->block_info, size);
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)
894 df_set_bb_info (dflow, i, problem_temps[bb->index]);
895 problem_temps[bb->index] = NULL;
896 i++;
898 memset (dflow->block_info + i, 0,
899 (last_basic_block - i) *sizeof (void *));
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++)
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]);
913 free (problem_temps);
915 i = NUM_FIXED_BLOCKS;
916 FOR_EACH_BB (bb)
918 SET_BASIC_BLOCK (i, bb);
919 bb->index = i;
920 i++;
923 gcc_assert (i == n_basic_blocks);
925 for (; i < last_basic_block; i++)
926 SET_BASIC_BLOCK (i, NULL);
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. */
933 void
934 df_bb_replace (struct df *df, int old_index, basic_block new_block)
936 int p;
938 for (p = 0; p < df->num_problems_defined; p++)
940 struct dataflow *dflow = df->problems_in_order[p];
941 if (dflow->block_info)
943 void *temp;
945 df_grow_bb_info (dflow);
947 /* The old switcheroo. */
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);
956 SET_BASIC_BLOCK (old_index, new_block);
957 new_block->index = old_index;
960 /*----------------------------------------------------------------------------
961 PUBLIC INTERFACES TO QUERY INFORMATION.
962 ----------------------------------------------------------------------------*/
965 /* Return last use of REGNO within BB. */
967 struct df_ref *
968 df_bb_regno_last_use_find (struct df *df, basic_block bb, unsigned int regno)
970 rtx insn;
971 struct df_ref *use;
972 unsigned int uid;
974 FOR_BB_INSNS_REVERSE (bb, insn)
976 if (!INSN_P (insn))
977 continue;
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;
984 return NULL;
988 /* Return first def of REGNO within BB. */
990 struct df_ref *
991 df_bb_regno_first_def_find (struct df *df, basic_block bb, unsigned int regno)
993 rtx insn;
994 struct df_ref *def;
995 unsigned int uid;
997 FOR_BB_INSNS (bb, insn)
999 if (!INSN_P (insn))
1000 continue;
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;
1007 return NULL;
1011 /* Return last def of REGNO within BB. */
1013 struct df_ref *
1014 df_bb_regno_last_def_find (struct df *df, basic_block bb, unsigned int regno)
1016 rtx insn;
1017 struct df_ref *def;
1018 unsigned int uid;
1020 FOR_BB_INSNS_REVERSE (bb, insn)
1022 if (!INSN_P (insn))
1023 continue;
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;
1031 return NULL;
1034 /* Return true if INSN defines REGNO. */
1036 bool
1037 df_insn_regno_def_p (struct df *df, rtx insn, unsigned int regno)
1039 unsigned int uid;
1040 struct df_ref *def;
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;
1047 return false;
1051 /* Finds the reference corresponding to the definition of REG in INSN.
1052 DF is the dataflow object. */
1054 struct df_ref *
1055 df_find_def (struct df *df, rtx insn, rtx reg)
1057 unsigned int uid;
1058 struct df_ref *def;
1060 if (GET_CODE (reg) == SUBREG)
1061 reg = SUBREG_REG (reg);
1062 gcc_assert (REG_P (reg));
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;
1069 return NULL;
1073 /* Return true if REG is defined in INSN, zero otherwise. */
1075 bool
1076 df_reg_defined (struct df *df, rtx insn, rtx reg)
1078 return df_find_def (df, insn, reg) != NULL;
1082 /* Finds the reference corresponding to the use of REG in INSN.
1083 DF is the dataflow object. */
1085 struct df_ref *
1086 df_find_use (struct df *df, rtx insn, rtx reg)
1088 unsigned int uid;
1089 struct df_ref *use;
1091 if (GET_CODE (reg) == SUBREG)
1092 reg = SUBREG_REG (reg);
1093 gcc_assert (REG_P (reg));
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;
1100 return NULL;
1104 /* Return true if REG is referenced in INSN, zero otherwise. */
1106 bool
1107 df_reg_used (struct df *df, rtx insn, rtx reg)
1109 return df_find_use (df, insn, reg) != NULL;
1113 /*----------------------------------------------------------------------------
1114 Debugging and printing functions.
1115 ----------------------------------------------------------------------------*/
1117 /* Dump dataflow info. */
1118 void
1119 df_dump (struct df *df, FILE *file)
1121 int i;
1123 if (!df || !file)
1124 return;
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);
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);
1134 fprintf (file, "\n");
1138 void
1139 df_refs_chain_dump (struct df_ref *ref, bool follow_chain, FILE *file)
1141 fprintf (file, "{ ");
1142 while (ref)
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;
1152 fprintf (file, "}");
1156 /* Dump either a ref-def or reg-use chain. */
1158 void
1159 df_regs_chain_dump (struct df *df ATTRIBUTE_UNUSED, struct df_ref *ref, FILE *file)
1161 fprintf (file, "{ ");
1162 while (ref)
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;
1170 fprintf (file, "}");
1174 static void
1175 df_mws_dump (struct df_mw_hardreg *mws, FILE *file)
1177 while (mws)
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)
1185 fprintf (file, "%d ", DF_REF_REGNO (regs->ref));
1186 regs = regs->next;
1189 fprintf (file, ") ");
1190 mws = mws->next;
1195 static void
1196 df_insn_uid_debug (struct df *df, unsigned int uid,
1197 bool follow_chain, FILE *file)
1199 int bbi;
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;
1208 fprintf (file, "insn %d bb %d luid %d",
1209 uid, bbi, DF_INSN_UID_LUID (df, uid));
1211 if (DF_INSN_UID_DEFS (df, uid))
1213 fprintf (file, " defs ");
1214 df_refs_chain_dump (DF_INSN_UID_DEFS (df, uid), follow_chain, file);
1217 if (DF_INSN_UID_USES (df, uid))
1219 fprintf (file, " uses ");
1220 df_refs_chain_dump (DF_INSN_UID_USES (df, uid), follow_chain, file);
1223 if (DF_INSN_UID_MWS (df, uid))
1225 fprintf (file, " mws ");
1226 df_mws_dump (DF_INSN_UID_MWS (df, uid), file);
1228 fprintf (file, "\n");
1232 void
1233 df_insn_debug (struct df *df, rtx insn, bool follow_chain, FILE *file)
1235 df_insn_uid_debug (df, INSN_UID (insn), follow_chain, file);
1238 void
1239 df_insn_debug_regno (struct df *df, rtx insn, FILE *file)
1241 unsigned int uid;
1242 int bbi;
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;
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);
1256 fprintf (file, " uses ");
1257 df_regs_chain_dump (df, DF_INSN_UID_USES (df, uid), file);
1258 fprintf (file, "\n");
1261 void
1262 df_regno_debug (struct df *df, unsigned int regno, FILE *file)
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");
1272 void
1273 df_ref_debug (struct df_ref *ref, FILE *file)
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");
1287 /* Functions for debugging from GDB. */
1289 void
1290 debug_df_insn (rtx insn)
1292 df_insn_debug (ddf, insn, true, stderr);
1293 debug_rtx (insn);
1297 void
1298 debug_df_reg (rtx reg)
1300 df_regno_debug (ddf, REGNO (reg), stderr);
1304 void
1305 debug_df_regno (unsigned int regno)
1307 df_regno_debug (ddf, regno, stderr);
1311 void
1312 debug_df_ref (struct df_ref *ref)
1314 df_ref_debug (ref, stderr);
1318 void
1319 debug_df_defno (unsigned int defno)
1321 df_ref_debug (DF_DEFS_GET (ddf, defno), stderr);
1325 void
1326 debug_df_useno (unsigned int defno)
1328 df_ref_debug (DF_USES_GET (ddf, defno), stderr);
1332 void
1333 debug_df_chain (struct df_link *link)
1335 df_chain_dump (link, stderr);
1336 fputc ('\n', stderr);