1 /* Dataflow support routines.
2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 Contributed by Michael P. Hayes (m.hayes@elec.canterbury.ac.nz,
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
27 This file provides some dataflow routines for computing reaching defs,
28 upward exposed uses, live variables, def-use chains, and use-def
29 chains. The global dataflow is performed using simple iterative
30 methods with a worklist and could be sped up by ordering the blocks
31 with a depth first search order.
33 A `struct ref' data structure (ref) is allocated for every register
34 reference (def or use) and this records the insn and bb the ref is
35 found within. The refs are linked together in chains of uses and defs
36 for each insn and for each register. Each ref also has a chain field
37 that links all the use refs for a def or all the def refs for a use.
38 This is used to create use-def or def-use chains.
43 Here's an example of using the dataflow routines.
49 df_analyze (df, 0, DF_ALL);
51 df_dump (df, DF_ALL, stderr);
56 df_init simply creates a poor man's object (df) that needs to be
57 passed to all the dataflow routines. df_finish destroys this
58 object and frees up any allocated memory. DF_ALL says to analyse
61 df_analyze performs the following:
63 1. Records defs and uses by scanning the insns in each basic block
64 or by scanning the insns queued by df_insn_modify.
65 2. Links defs and uses into insn-def and insn-use chains.
66 3. Links defs and uses into reg-def and reg-use chains.
67 4. Assigns LUIDs to each insn (for modified blocks).
68 5. Calculates local reaching definitions.
69 6. Calculates global reaching definitions.
70 7. Creates use-def chains.
71 8. Calculates local reaching uses (upwards exposed uses).
72 9. Calculates global reaching uses.
73 10. Creates def-use chains.
74 11. Calculates local live registers.
75 12. Calculates global live registers.
76 13. Calculates register lifetimes and determines local registers.
81 Note that the dataflow information is not updated for every newly
82 deleted or created insn. If the dataflow information requires
83 updating then all the changed, new, or deleted insns needs to be
84 marked with df_insn_modify (or df_insns_modify) either directly or
85 indirectly (say through calling df_insn_delete). df_insn_modify
86 marks all the modified insns to get processed the next time df_analyze
89 Beware that tinkering with insns may invalidate the dataflow information.
90 The philosophy behind these routines is that once the dataflow
91 information has been gathered, the user should store what they require
92 before they tinker with any insn. Once a reg is replaced, for example,
93 then the reg-def/reg-use chains will point to the wrong place. Once a
94 whole lot of changes have been made, df_analyze can be called again
95 to update the dataflow information. Currently, this is not very smart
96 with regard to propagating changes to the dataflow so it should not
102 The basic object is a REF (reference) and this may either be a DEF
103 (definition) or a USE of a register.
105 These are linked into a variety of lists; namely reg-def, reg-use,
106 insn-def, insn-use, def-use, and use-def lists. For example,
107 the reg-def lists contain all the refs that define a given register
108 while the insn-use lists contain all the refs used by an insn.
110 Note that the reg-def and reg-use chains are generally short (except for the
111 hard registers) and thus it is much faster to search these chains
112 rather than searching the def or use bitmaps.
114 If the insns are in SSA form then the reg-def and use-def lists
115 should only contain the single defining ref.
120 1) Incremental dataflow analysis.
122 Note that if a loop invariant insn is hoisted (or sunk), we do not
123 need to change the def-use or use-def chains. All we have to do is to
124 change the bb field for all the associated defs and uses and to
125 renumber the LUIDs for the original and new basic blocks of the insn.
127 When shadowing loop mems we create new uses and defs for new pseudos
128 so we do not affect the existing dataflow information.
130 My current strategy is to queue up all modified, created, or deleted
131 insns so when df_analyze is called we can easily determine all the new
132 or deleted refs. Currently the global dataflow information is
133 recomputed from scratch but this could be propagated more efficiently.
135 2) Reduced memory requirements.
137 We could operate a pool of ref structures. When a ref is deleted it
138 gets returned to the pool (say by linking on to a chain of free refs).
139 This will require a pair of bitmaps for defs and uses so that we can
140 tell which ones have been changed. Alternatively, we could
141 periodically squeeze the def and use tables and associated bitmaps and
142 renumber the def and use ids.
144 3) Ordering of reg-def and reg-use lists.
146 Should the first entry in the def list be the first def (within a BB)?
147 Similarly, should the first entry in the use list be the last use
150 4) Working with a sub-CFG.
152 Often the whole CFG does not need to be analyzed, for example,
153 when optimizing a loop, only certain registers are of interest.
154 Perhaps there should be a bitmap argument to df_analyze to specify
155 which registers should be analyzed?
160 Embedded addressing side-effects, such as POST_INC or PRE_INC, generate
161 both a use and a def. These are both marked read/write to show that they
162 are dependent. For example, (set (reg 40) (mem (post_inc (reg 42))))
163 will generate a use of reg 42 followed by a def of reg 42 (both marked
164 read/write). Similarly, (set (reg 40) (mem (pre_dec (reg 41))))
165 generates a use of reg 41 then a def of reg 41 (both marked read/write),
166 even though reg 41 is decremented before it is used for the memory
167 address in this second example.
169 A set to a REG inside a ZERO_EXTRACT, SIGN_EXTRACT, or SUBREG invokes
170 a read-modify write operation. We generate both a use and a def
171 and again mark them read/write.
176 #include "coretypes.h"
180 #include "insn-config.h"
182 #include "function.h"
184 #include "alloc-pool.h"
185 #include "hard-reg-set.h"
186 #include "basic-block.h"
192 #define FOR_EACH_BB_IN_BITMAP(BITMAP, MIN, BB, CODE) \
195 unsigned int node_; \
196 EXECUTE_IF_SET_IN_BITMAP (BITMAP, MIN, node_, \
197 {(BB) = BASIC_BLOCK (node_); CODE;}); \
201 static alloc_pool df_ref_pool
;
202 static alloc_pool df_link_pool
;
203 static struct df
*ddf
;
205 static void df_reg_table_realloc (struct df
*, int);
206 static void df_insn_table_realloc (struct df
*, unsigned int);
207 static void df_bitmaps_alloc (struct df
*, int);
208 static void df_bitmaps_free (struct df
*, int);
209 static void df_free (struct df
*);
210 static void df_alloc (struct df
*, int);
212 static rtx
df_reg_clobber_gen (unsigned int);
213 static rtx
df_reg_use_gen (unsigned int);
215 static inline struct df_link
*df_link_create (struct ref
*, struct df_link
*);
216 static struct df_link
*df_ref_unlink (struct df_link
**, struct ref
*);
217 static void df_def_unlink (struct df
*, struct ref
*);
218 static void df_use_unlink (struct df
*, struct ref
*);
219 static void df_insn_refs_unlink (struct df
*, basic_block
, rtx
);
221 static void df_bb_refs_unlink (struct df
*, basic_block
);
222 static void df_refs_unlink (struct df
*, bitmap
);
225 static struct ref
*df_ref_create (struct df
*, rtx
, rtx
*, rtx
,
226 enum df_ref_type
, enum df_ref_flags
);
227 static void df_ref_record_1 (struct df
*, rtx
, rtx
*, rtx
, enum df_ref_type
,
229 static void df_ref_record (struct df
*, rtx
, rtx
*, rtx
, enum df_ref_type
,
231 static void df_def_record_1 (struct df
*, rtx
, basic_block
, rtx
);
232 static void df_defs_record (struct df
*, rtx
, basic_block
, rtx
);
233 static void df_uses_record (struct df
*, rtx
*, enum df_ref_type
,
234 basic_block
, rtx
, enum df_ref_flags
);
235 static void df_insn_refs_record (struct df
*, basic_block
, rtx
);
236 static void df_bb_refs_record (struct df
*, basic_block
);
237 static void df_refs_record (struct df
*, bitmap
);
239 static void df_bb_reg_def_chain_create (struct df
*, basic_block
);
240 static void df_reg_def_chain_create (struct df
*, bitmap
);
241 static void df_bb_reg_use_chain_create (struct df
*, basic_block
);
242 static void df_reg_use_chain_create (struct df
*, bitmap
);
243 static void df_bb_du_chain_create (struct df
*, basic_block
, bitmap
);
244 static void df_du_chain_create (struct df
*, bitmap
);
245 static void df_bb_ud_chain_create (struct df
*, basic_block
);
246 static void df_ud_chain_create (struct df
*, bitmap
);
247 static void df_bb_rd_local_compute (struct df
*, basic_block
);
248 static void df_rd_local_compute (struct df
*, bitmap
);
249 static void df_bb_ru_local_compute (struct df
*, basic_block
);
250 static void df_ru_local_compute (struct df
*, bitmap
);
251 static void df_bb_lr_local_compute (struct df
*, basic_block
);
252 static void df_lr_local_compute (struct df
*, bitmap
);
253 static void df_bb_reg_info_compute (struct df
*, basic_block
, bitmap
);
254 static void df_reg_info_compute (struct df
*, bitmap
);
256 static int df_bb_luids_set (struct df
*df
, basic_block
);
257 static int df_luids_set (struct df
*df
, bitmap
);
259 static int df_modified_p (struct df
*, bitmap
);
260 static int df_refs_queue (struct df
*);
261 static int df_refs_process (struct df
*);
262 static int df_bb_refs_update (struct df
*, basic_block
);
263 static int df_refs_update (struct df
*);
264 static void df_analyze_1 (struct df
*, bitmap
, int, int);
266 static void df_insns_modify (struct df
*, basic_block
, rtx
, rtx
);
267 static int df_rtx_mem_replace (rtx
*, void *);
268 static int df_rtx_reg_replace (rtx
*, void *);
269 void df_refs_reg_replace (struct df
*, bitmap
, struct df_link
*, rtx
, rtx
);
271 static int df_def_dominates_all_uses_p (struct df
*, struct ref
*def
);
272 static int df_def_dominates_uses_p (struct df
*, struct ref
*def
, bitmap
);
273 static struct ref
*df_bb_regno_last_use_find (struct df
*, basic_block
,
275 static struct ref
*df_bb_regno_first_def_find (struct df
*, basic_block
,
277 static struct ref
*df_bb_insn_regno_last_use_find (struct df
*, basic_block
,
279 static struct ref
*df_bb_insn_regno_first_def_find (struct df
*, basic_block
,
282 static void df_chain_dump (struct df_link
*, FILE *file
);
283 static void df_chain_dump_regno (struct df_link
*, FILE *file
);
284 static void df_regno_debug (struct df
*, unsigned int, FILE *);
285 static void df_ref_debug (struct df
*, struct ref
*, FILE *);
286 static void df_rd_transfer_function (int, int *, bitmap
, bitmap
, bitmap
,
288 static void df_ru_transfer_function (int, int *, bitmap
, bitmap
, bitmap
,
290 static void df_lr_transfer_function (int, int *, bitmap
, bitmap
, bitmap
,
292 static void hybrid_search_bitmap (basic_block
, bitmap
*, bitmap
*,
293 bitmap
*, bitmap
*, enum df_flow_dir
,
294 enum df_confluence_op
,
295 transfer_function_bitmap
,
296 sbitmap
, sbitmap
, void *);
297 static void hybrid_search_sbitmap (basic_block
, sbitmap
*, sbitmap
*,
298 sbitmap
*, sbitmap
*, enum df_flow_dir
,
299 enum df_confluence_op
,
300 transfer_function_sbitmap
,
301 sbitmap
, sbitmap
, void *);
304 /* Local memory allocation/deallocation routines. */
307 /* Increase the insn info table to have space for at least SIZE + 1
310 df_insn_table_realloc (struct df
*df
, unsigned int size
)
313 if (size
<= df
->insn_size
)
316 /* Make the table a little larger than requested, so we do not need
317 to enlarge it so often. */
318 size
+= df
->insn_size
/ 4;
320 df
->insns
= xrealloc (df
->insns
, size
* sizeof (struct insn_info
));
322 memset (df
->insns
+ df
->insn_size
, 0,
323 (size
- df
->insn_size
) * sizeof (struct insn_info
));
325 df
->insn_size
= size
;
327 if (! df
->insns_modified
)
329 df
->insns_modified
= BITMAP_XMALLOC ();
330 bitmap_zero (df
->insns_modified
);
335 /* Increase the reg info table by SIZE more elements. */
337 df_reg_table_realloc (struct df
*df
, int size
)
339 /* Make table 25 percent larger by default. */
341 size
= df
->reg_size
/ 4;
343 size
+= df
->reg_size
;
344 if (size
< max_reg_num ())
345 size
= max_reg_num ();
347 df
->regs
= xrealloc (df
->regs
, size
* sizeof (struct reg_info
));
349 /* Zero the new entries. */
350 memset (df
->regs
+ df
->reg_size
, 0,
351 (size
- df
->reg_size
) * sizeof (struct reg_info
));
357 /* Allocate bitmaps for each basic block. */
359 df_bitmaps_alloc (struct df
*df
, int flags
)
364 /* Free the bitmaps if they need resizing. */
365 if ((flags
& DF_LR
) && df
->n_regs
< (unsigned int) max_reg_num ())
366 dflags
|= DF_LR
| DF_RU
;
367 if ((flags
& DF_RU
) && df
->n_uses
< df
->use_id
)
369 if ((flags
& DF_RD
) && df
->n_defs
< df
->def_id
)
373 df_bitmaps_free (df
, dflags
);
375 df
->n_defs
= df
->def_id
;
376 df
->n_uses
= df
->use_id
;
380 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
382 if (flags
& DF_RD
&& ! bb_info
->rd_in
)
384 /* Allocate bitmaps for reaching definitions. */
385 bb_info
->rd_kill
= BITMAP_XMALLOC ();
386 bitmap_zero (bb_info
->rd_kill
);
387 bb_info
->rd_gen
= BITMAP_XMALLOC ();
388 bitmap_zero (bb_info
->rd_gen
);
389 bb_info
->rd_in
= BITMAP_XMALLOC ();
390 bb_info
->rd_out
= BITMAP_XMALLOC ();
391 bb_info
->rd_valid
= 0;
394 if (flags
& DF_RU
&& ! bb_info
->ru_in
)
396 /* Allocate bitmaps for upward exposed uses. */
397 bb_info
->ru_kill
= BITMAP_XMALLOC ();
398 bitmap_zero (bb_info
->ru_kill
);
399 /* Note the lack of symmetry. */
400 bb_info
->ru_gen
= BITMAP_XMALLOC ();
401 bitmap_zero (bb_info
->ru_gen
);
402 bb_info
->ru_in
= BITMAP_XMALLOC ();
403 bb_info
->ru_out
= BITMAP_XMALLOC ();
404 bb_info
->ru_valid
= 0;
407 if (flags
& DF_LR
&& ! bb_info
->lr_in
)
409 /* Allocate bitmaps for live variables. */
410 bb_info
->lr_def
= BITMAP_XMALLOC ();
411 bitmap_zero (bb_info
->lr_def
);
412 bb_info
->lr_use
= BITMAP_XMALLOC ();
413 bitmap_zero (bb_info
->lr_use
);
414 bb_info
->lr_in
= BITMAP_XMALLOC ();
415 bb_info
->lr_out
= BITMAP_XMALLOC ();
416 bb_info
->lr_valid
= 0;
422 /* Free bitmaps for each basic block. */
424 df_bitmaps_free (struct df
*df
, int flags
)
430 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
435 if ((flags
& DF_RD
) && bb_info
->rd_in
)
437 /* Free bitmaps for reaching definitions. */
438 BITMAP_XFREE (bb_info
->rd_kill
);
439 bb_info
->rd_kill
= NULL
;
440 BITMAP_XFREE (bb_info
->rd_gen
);
441 bb_info
->rd_gen
= NULL
;
442 BITMAP_XFREE (bb_info
->rd_in
);
443 bb_info
->rd_in
= NULL
;
444 BITMAP_XFREE (bb_info
->rd_out
);
445 bb_info
->rd_out
= NULL
;
448 if ((flags
& DF_RU
) && bb_info
->ru_in
)
450 /* Free bitmaps for upward exposed uses. */
451 BITMAP_XFREE (bb_info
->ru_kill
);
452 bb_info
->ru_kill
= NULL
;
453 BITMAP_XFREE (bb_info
->ru_gen
);
454 bb_info
->ru_gen
= NULL
;
455 BITMAP_XFREE (bb_info
->ru_in
);
456 bb_info
->ru_in
= NULL
;
457 BITMAP_XFREE (bb_info
->ru_out
);
458 bb_info
->ru_out
= NULL
;
461 if ((flags
& DF_LR
) && bb_info
->lr_in
)
463 /* Free bitmaps for live variables. */
464 BITMAP_XFREE (bb_info
->lr_def
);
465 bb_info
->lr_def
= NULL
;
466 BITMAP_XFREE (bb_info
->lr_use
);
467 bb_info
->lr_use
= NULL
;
468 BITMAP_XFREE (bb_info
->lr_in
);
469 bb_info
->lr_in
= NULL
;
470 BITMAP_XFREE (bb_info
->lr_out
);
471 bb_info
->lr_out
= NULL
;
474 df
->flags
&= ~(flags
& (DF_RD
| DF_RU
| DF_LR
));
478 /* Allocate and initialize dataflow memory. */
480 df_alloc (struct df
*df
, int n_regs
)
485 df_link_pool
= create_alloc_pool ("df_link pool", sizeof (struct df_link
),
487 df_ref_pool
= create_alloc_pool ("df_ref pool", sizeof (struct ref
), 100);
489 /* Perhaps we should use LUIDs to save memory for the insn_refs
490 table. This is only a small saving; a few pointers. */
491 n_insns
= get_max_uid () + 1;
495 /* Approximate number of defs by number of insns. */
496 df
->def_size
= n_insns
;
497 df
->defs
= xmalloc (df
->def_size
* sizeof (*df
->defs
));
501 /* Approximate number of uses by twice number of insns. */
502 df
->use_size
= n_insns
* 2;
503 df
->uses
= xmalloc (df
->use_size
* sizeof (*df
->uses
));
506 df
->n_bbs
= last_basic_block
;
508 /* Allocate temporary working array used during local dataflow analysis. */
509 df
->reg_def_last
= xmalloc (df
->n_regs
* sizeof (struct ref
*));
511 df_insn_table_realloc (df
, n_insns
);
513 df_reg_table_realloc (df
, df
->n_regs
);
515 df
->bbs_modified
= BITMAP_XMALLOC ();
516 bitmap_zero (df
->bbs_modified
);
520 df
->bbs
= xcalloc (last_basic_block
, sizeof (struct bb_info
));
522 df
->all_blocks
= BITMAP_XMALLOC ();
524 bitmap_set_bit (df
->all_blocks
, bb
->index
);
528 /* Free all the dataflow info. */
530 df_free (struct df
*df
)
532 df_bitmaps_free (df
, DF_ALL
);
560 if (df
->bbs_modified
)
561 BITMAP_XFREE (df
->bbs_modified
);
562 df
->bbs_modified
= 0;
564 if (df
->insns_modified
)
565 BITMAP_XFREE (df
->insns_modified
);
566 df
->insns_modified
= 0;
568 BITMAP_XFREE (df
->all_blocks
);
571 free_alloc_pool (df_ref_pool
);
572 free_alloc_pool (df_link_pool
);
576 /* Local miscellaneous routines. */
578 /* Return a USE for register REGNO. */
579 static rtx
df_reg_use_gen (unsigned int regno
)
584 reg
= regno_reg_rtx
[regno
];
586 use
= gen_rtx_USE (GET_MODE (reg
), reg
);
591 /* Return a CLOBBER for register REGNO. */
592 static rtx
df_reg_clobber_gen (unsigned int regno
)
597 reg
= regno_reg_rtx
[regno
];
599 use
= gen_rtx_CLOBBER (GET_MODE (reg
), reg
);
603 /* Local chain manipulation routines. */
605 /* Create a link in a def-use or use-def chain. */
606 static inline struct df_link
*
607 df_link_create (struct ref
*ref
, struct df_link
*next
)
609 struct df_link
*link
;
611 link
= pool_alloc (df_link_pool
);
618 /* Add REF to chain head pointed to by PHEAD. */
619 static struct df_link
*
620 df_ref_unlink (struct df_link
**phead
, struct ref
*ref
)
622 struct df_link
*link
= *phead
;
628 /* Only a single ref. It must be the one we want.
629 If not, the def-use and use-def chains are likely to
631 if (link
->ref
!= ref
)
633 /* Now have an empty chain. */
638 /* Multiple refs. One of them must be us. */
639 if (link
->ref
== ref
)
644 for (; link
->next
; link
= link
->next
)
646 if (link
->next
->ref
== ref
)
648 /* Unlink from list. */
649 link
->next
= link
->next
->next
;
660 /* Unlink REF from all def-use/use-def chains, etc. */
662 df_ref_remove (struct df
*df
, struct ref
*ref
)
664 if (DF_REF_REG_DEF_P (ref
))
666 df_def_unlink (df
, ref
);
667 df_ref_unlink (&df
->insns
[DF_REF_INSN_UID (ref
)].defs
, ref
);
671 df_use_unlink (df
, ref
);
672 df_ref_unlink (&df
->insns
[DF_REF_INSN_UID (ref
)].uses
, ref
);
678 /* Unlink DEF from use-def and reg-def chains. */
680 df_def_unlink (struct df
*df ATTRIBUTE_UNUSED
, struct ref
*def
)
682 struct df_link
*du_link
;
683 unsigned int dregno
= DF_REF_REGNO (def
);
685 /* Follow def-use chain to find all the uses of this def. */
686 for (du_link
= DF_REF_CHAIN (def
); du_link
; du_link
= du_link
->next
)
688 struct ref
*use
= du_link
->ref
;
690 /* Unlink this def from the use-def chain. */
691 df_ref_unlink (&DF_REF_CHAIN (use
), def
);
693 DF_REF_CHAIN (def
) = 0;
695 /* Unlink def from reg-def chain. */
696 df_ref_unlink (&df
->regs
[dregno
].defs
, def
);
698 df
->defs
[DF_REF_ID (def
)] = 0;
702 /* Unlink use from def-use and reg-use chains. */
704 df_use_unlink (struct df
*df ATTRIBUTE_UNUSED
, struct ref
*use
)
706 struct df_link
*ud_link
;
707 unsigned int uregno
= DF_REF_REGNO (use
);
709 /* Follow use-def chain to find all the defs of this use. */
710 for (ud_link
= DF_REF_CHAIN (use
); ud_link
; ud_link
= ud_link
->next
)
712 struct ref
*def
= ud_link
->ref
;
714 /* Unlink this use from the def-use chain. */
715 df_ref_unlink (&DF_REF_CHAIN (def
), use
);
717 DF_REF_CHAIN (use
) = 0;
719 /* Unlink use from reg-use chain. */
720 df_ref_unlink (&df
->regs
[uregno
].uses
, use
);
722 df
->uses
[DF_REF_ID (use
)] = 0;
725 /* Local routines for recording refs. */
728 /* Create a new ref of type DF_REF_TYPE for register REG at address
729 LOC within INSN of BB. */
731 df_ref_create (struct df
*df
, rtx reg
, rtx
*loc
, rtx insn
,
732 enum df_ref_type ref_type
, enum df_ref_flags ref_flags
)
734 struct ref
*this_ref
;
736 this_ref
= pool_alloc (df_ref_pool
);
737 DF_REF_REG (this_ref
) = reg
;
738 DF_REF_LOC (this_ref
) = loc
;
739 DF_REF_INSN (this_ref
) = insn
;
740 DF_REF_CHAIN (this_ref
) = 0;
741 DF_REF_TYPE (this_ref
) = ref_type
;
742 DF_REF_FLAGS (this_ref
) = ref_flags
;
744 if (ref_type
== DF_REF_REG_DEF
)
746 if (df
->def_id
>= df
->def_size
)
748 /* Make table 25 percent larger. */
749 df
->def_size
+= (df
->def_size
/ 4);
750 df
->defs
= xrealloc (df
->defs
,
751 df
->def_size
* sizeof (*df
->defs
));
753 DF_REF_ID (this_ref
) = df
->def_id
;
754 df
->defs
[df
->def_id
++] = this_ref
;
758 if (df
->use_id
>= df
->use_size
)
760 /* Make table 25 percent larger. */
761 df
->use_size
+= (df
->use_size
/ 4);
762 df
->uses
= xrealloc (df
->uses
,
763 df
->use_size
* sizeof (*df
->uses
));
765 DF_REF_ID (this_ref
) = df
->use_id
;
766 df
->uses
[df
->use_id
++] = this_ref
;
772 /* Create a new reference of type DF_REF_TYPE for a single register REG,
773 used inside the LOC rtx of INSN. */
775 df_ref_record_1 (struct df
*df
, rtx reg
, rtx
*loc
, rtx insn
,
776 enum df_ref_type ref_type
, enum df_ref_flags ref_flags
)
778 df_ref_create (df
, reg
, loc
, insn
, ref_type
, ref_flags
);
782 /* Create new references of type DF_REF_TYPE for each part of register REG
783 at address LOC within INSN of BB. */
785 df_ref_record (struct df
*df
, rtx reg
, rtx
*loc
, rtx insn
,
786 enum df_ref_type ref_type
, enum df_ref_flags ref_flags
)
790 if (GET_CODE (reg
) != REG
&& GET_CODE (reg
) != SUBREG
)
793 /* For the reg allocator we are interested in some SUBREG rtx's, but not
794 all. Notably only those representing a word extraction from a multi-word
795 reg. As written in the docu those should have the form
796 (subreg:SI (reg:M A) N), with size(SImode) > size(Mmode).
797 XXX Is that true? We could also use the global word_mode variable. */
798 if (GET_CODE (reg
) == SUBREG
799 && (GET_MODE_SIZE (GET_MODE (reg
)) < GET_MODE_SIZE (word_mode
)
800 || GET_MODE_SIZE (GET_MODE (reg
))
801 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (reg
)))))
803 loc
= &SUBREG_REG (reg
);
805 ref_flags
|= DF_REF_STRIPPED
;
808 regno
= REGNO (GET_CODE (reg
) == SUBREG
? SUBREG_REG (reg
) : reg
);
809 if (regno
< FIRST_PSEUDO_REGISTER
)
814 if (! (df
->flags
& DF_HARD_REGS
))
817 /* GET_MODE (reg) is correct here. We do not want to go into a SUBREG
818 for the mode, because we only want to add references to regs, which
819 are really referenced. E.g., a (subreg:SI (reg:DI 0) 0) does _not_
820 reference the whole reg 0 in DI mode (which would also include
821 reg 1, at least, if 0 and 1 are SImode registers). */
822 endregno
= hard_regno_nregs
[regno
][GET_MODE (reg
)];
823 if (GET_CODE (reg
) == SUBREG
)
824 regno
+= subreg_regno_offset (regno
, GET_MODE (SUBREG_REG (reg
)),
825 SUBREG_BYTE (reg
), GET_MODE (reg
));
828 for (i
= regno
; i
< endregno
; i
++)
829 df_ref_record_1 (df
, regno_reg_rtx
[i
],
830 loc
, insn
, ref_type
, ref_flags
);
834 df_ref_record_1 (df
, reg
, loc
, insn
, ref_type
, ref_flags
);
839 /* Return nonzero if writes to paradoxical SUBREGs, or SUBREGs which
840 are too narrow, are read-modify-write. */
842 read_modify_subreg_p (rtx x
)
844 unsigned int isize
, osize
;
845 if (GET_CODE (x
) != SUBREG
)
847 isize
= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x
)));
848 osize
= GET_MODE_SIZE (GET_MODE (x
));
849 /* Paradoxical subreg writes don't leave a trace of the old content. */
850 return (isize
> osize
&& isize
> UNITS_PER_WORD
);
854 /* Process all the registers defined in the rtx, X. */
856 df_def_record_1 (struct df
*df
, rtx x
, basic_block bb
, rtx insn
)
860 enum df_ref_flags flags
= 0;
862 /* We may recursively call ourselves on EXPR_LIST when dealing with PARALLEL
864 if (GET_CODE (x
) == EXPR_LIST
|| GET_CODE (x
) == CLOBBER
)
870 /* Some targets place small structures in registers for
871 return values of functions. */
872 if (GET_CODE (dst
) == PARALLEL
&& GET_MODE (dst
) == BLKmode
)
876 for (i
= XVECLEN (dst
, 0) - 1; i
>= 0; i
--)
878 rtx temp
= XVECEXP (dst
, 0, i
);
879 if (GET_CODE (temp
) == EXPR_LIST
|| GET_CODE (temp
) == CLOBBER
880 || GET_CODE (temp
) == SET
)
881 df_def_record_1 (df
, temp
, bb
, insn
);
886 /* Maybe, we should flag the use of STRICT_LOW_PART somehow. It might
887 be handy for the reg allocator. */
888 while (GET_CODE (dst
) == STRICT_LOW_PART
889 || GET_CODE (dst
) == ZERO_EXTRACT
890 || GET_CODE (dst
) == SIGN_EXTRACT
891 || ((df
->flags
& DF_FOR_REGALLOC
) == 0
892 && read_modify_subreg_p (dst
)))
894 /* Strict low part always contains SUBREG, but we do not want to make
895 it appear outside, as whole register is always considered. */
896 if (GET_CODE (dst
) == STRICT_LOW_PART
)
898 loc
= &XEXP (dst
, 0);
901 loc
= &XEXP (dst
, 0);
903 flags
|= DF_REF_READ_WRITE
;
906 if (GET_CODE (dst
) == REG
907 || (GET_CODE (dst
) == SUBREG
&& GET_CODE (SUBREG_REG (dst
)) == REG
))
908 df_ref_record (df
, dst
, loc
, insn
, DF_REF_REG_DEF
, flags
);
912 /* Process all the registers defined in the pattern rtx, X. */
914 df_defs_record (struct df
*df
, rtx x
, basic_block bb
, rtx insn
)
916 RTX_CODE code
= GET_CODE (x
);
918 if (code
== SET
|| code
== CLOBBER
)
920 /* Mark the single def within the pattern. */
921 df_def_record_1 (df
, x
, bb
, insn
);
923 else if (code
== PARALLEL
)
927 /* Mark the multiple defs within the pattern. */
928 for (i
= XVECLEN (x
, 0) - 1; i
>= 0; i
--)
930 code
= GET_CODE (XVECEXP (x
, 0, i
));
931 if (code
== SET
|| code
== CLOBBER
)
932 df_def_record_1 (df
, XVECEXP (x
, 0, i
), bb
, insn
);
938 /* Process all the registers used in the rtx at address LOC. */
940 df_uses_record (struct df
*df
, rtx
*loc
, enum df_ref_type ref_type
,
941 basic_block bb
, rtx insn
, enum df_ref_flags flags
)
965 /* If we are clobbering a MEM, mark any registers inside the address
967 if (GET_CODE (XEXP (x
, 0)) == MEM
)
968 df_uses_record (df
, &XEXP (XEXP (x
, 0), 0),
969 DF_REF_REG_MEM_STORE
, bb
, insn
, flags
);
971 /* If we're clobbering a REG then we have a def so ignore. */
975 df_uses_record (df
, &XEXP (x
, 0), DF_REF_REG_MEM_LOAD
, bb
, insn
, 0);
979 /* While we're here, optimize this case. */
981 /* In case the SUBREG is not of a REG, do not optimize. */
982 if (GET_CODE (SUBREG_REG (x
)) != REG
)
984 loc
= &SUBREG_REG (x
);
985 df_uses_record (df
, loc
, ref_type
, bb
, insn
, flags
);
988 /* ... Fall through ... */
991 df_ref_record (df
, x
, loc
, insn
, ref_type
, flags
);
996 rtx dst
= SET_DEST (x
);
998 df_uses_record (df
, &SET_SRC (x
), DF_REF_REG_USE
, bb
, insn
, 0);
1000 switch (GET_CODE (dst
))
1003 if ((df
->flags
& DF_FOR_REGALLOC
) == 0
1004 && read_modify_subreg_p (dst
))
1006 df_uses_record (df
, &SUBREG_REG (dst
), DF_REF_REG_USE
, bb
,
1007 insn
, DF_REF_READ_WRITE
);
1017 df_uses_record (df
, &XEXP (dst
, 0),
1018 DF_REF_REG_MEM_STORE
,
1021 case STRICT_LOW_PART
:
1022 /* A strict_low_part uses the whole REG and not just the SUBREG. */
1023 dst
= XEXP (dst
, 0);
1024 if (GET_CODE (dst
) != SUBREG
)
1026 df_uses_record (df
, &SUBREG_REG (dst
), DF_REF_REG_USE
, bb
,
1027 insn
, DF_REF_READ_WRITE
);
1031 df_uses_record (df
, &XEXP (dst
, 0), DF_REF_REG_USE
, bb
, insn
,
1033 df_uses_record (df
, &XEXP (dst
, 1), DF_REF_REG_USE
, bb
, insn
, 0);
1034 df_uses_record (df
, &XEXP (dst
, 2), DF_REF_REG_USE
, bb
, insn
, 0);
1035 dst
= XEXP (dst
, 0);
1047 case UNSPEC_VOLATILE
:
1051 /* Traditional and volatile asm instructions must be considered to use
1052 and clobber all hard registers, all pseudo-registers and all of
1053 memory. So must TRAP_IF and UNSPEC_VOLATILE operations.
1055 Consider for instance a volatile asm that changes the fpu rounding
1056 mode. An insn should not be moved across this even if it only uses
1057 pseudo-regs because it might give an incorrectly rounded result.
1059 For now, just mark any regs we can find in ASM_OPERANDS as
1062 /* For all ASM_OPERANDS, we must traverse the vector of input operands.
1063 We can not just fall through here since then we would be confused
1064 by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
1065 traditional asms unlike their normal usage. */
1066 if (code
== ASM_OPERANDS
)
1070 for (j
= 0; j
< ASM_OPERANDS_INPUT_LENGTH (x
); j
++)
1071 df_uses_record (df
, &ASM_OPERANDS_INPUT (x
, j
),
1072 DF_REF_REG_USE
, bb
, insn
, 0);
1084 /* Catch the def of the register being modified. */
1085 df_ref_record (df
, XEXP (x
, 0), &XEXP (x
, 0), insn
, DF_REF_REG_DEF
, DF_REF_READ_WRITE
);
1087 /* ... Fall through to handle uses ... */
1093 /* Recursively scan the operands of this expression. */
1095 const char *fmt
= GET_RTX_FORMAT (code
);
1098 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1102 /* Tail recursive case: save a function call level. */
1108 df_uses_record (df
, &XEXP (x
, i
), ref_type
, bb
, insn
, flags
);
1110 else if (fmt
[i
] == 'E')
1113 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1114 df_uses_record (df
, &XVECEXP (x
, i
, j
), ref_type
,
1122 /* Record all the df within INSN of basic block BB. */
1124 df_insn_refs_record (struct df
*df
, basic_block bb
, rtx insn
)
1132 /* Record register defs. */
1133 df_defs_record (df
, PATTERN (insn
), bb
, insn
);
1135 if (df
->flags
& DF_EQUIV_NOTES
)
1136 for (note
= REG_NOTES (insn
); note
;
1137 note
= XEXP (note
, 1))
1139 switch (REG_NOTE_KIND (note
))
1143 df_uses_record (df
, &XEXP (note
, 0), DF_REF_REG_USE
,
1150 if (GET_CODE (insn
) == CALL_INSN
)
1155 /* Record the registers used to pass arguments. */
1156 for (note
= CALL_INSN_FUNCTION_USAGE (insn
); note
;
1157 note
= XEXP (note
, 1))
1159 if (GET_CODE (XEXP (note
, 0)) == USE
)
1160 df_uses_record (df
, &XEXP (XEXP (note
, 0), 0), DF_REF_REG_USE
,
1164 /* The stack ptr is used (honorarily) by a CALL insn. */
1165 x
= df_reg_use_gen (STACK_POINTER_REGNUM
);
1166 df_uses_record (df
, &XEXP (x
, 0), DF_REF_REG_USE
, bb
, insn
, 0);
1168 if (df
->flags
& DF_HARD_REGS
)
1170 /* Calls may also reference any of the global registers,
1171 so they are recorded as used. */
1172 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1175 x
= df_reg_use_gen (i
);
1176 df_uses_record (df
, &SET_DEST (x
),
1177 DF_REF_REG_USE
, bb
, insn
, 0);
1182 /* Record the register uses. */
1183 df_uses_record (df
, &PATTERN (insn
),
1184 DF_REF_REG_USE
, bb
, insn
, 0);
1186 if (GET_CODE (insn
) == CALL_INSN
)
1190 if (df
->flags
& DF_HARD_REGS
)
1192 /* Kill all registers invalidated by a call. */
1193 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
1194 if (TEST_HARD_REG_BIT (regs_invalidated_by_call
, i
))
1196 rtx reg_clob
= df_reg_clobber_gen (i
);
1197 df_defs_record (df
, reg_clob
, bb
, insn
);
1201 /* There may be extra registers to be clobbered. */
1202 for (note
= CALL_INSN_FUNCTION_USAGE (insn
);
1204 note
= XEXP (note
, 1))
1205 if (GET_CODE (XEXP (note
, 0)) == CLOBBER
)
1206 df_defs_record (df
, XEXP (note
, 0), bb
, insn
);
1212 /* Record all the refs within the basic block BB. */
1214 df_bb_refs_record (struct df
*df
, basic_block bb
)
1218 /* Scan the block an insn at a time from beginning to end. */
1219 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
1223 /* Record defs within INSN. */
1224 df_insn_refs_record (df
, bb
, insn
);
1226 if (insn
== BB_END (bb
))
1232 /* Record all the refs in the basic blocks specified by BLOCKS. */
1234 df_refs_record (struct df
*df
, bitmap blocks
)
1238 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
1240 df_bb_refs_record (df
, bb
);
1244 /* Dataflow analysis routines. */
1247 /* Create reg-def chains for basic block BB. These are a list of
1248 definitions for each register. */
1250 df_bb_reg_def_chain_create (struct df
*df
, basic_block bb
)
1254 /* Perhaps the defs should be sorted using a depth first search
1255 of the CFG (or possibly a breadth first search). We currently
1256 scan the basic blocks in reverse order so that the first defs
1257 appear at the start of the chain. */
1259 for (insn
= BB_END (bb
); insn
&& insn
!= PREV_INSN (BB_HEAD (bb
));
1260 insn
= PREV_INSN (insn
))
1262 struct df_link
*link
;
1263 unsigned int uid
= INSN_UID (insn
);
1265 if (! INSN_P (insn
))
1268 for (link
= df
->insns
[uid
].defs
; link
; link
= link
->next
)
1270 struct ref
*def
= link
->ref
;
1271 unsigned int dregno
= DF_REF_REGNO (def
);
1273 /* Do not add ref's to the chain twice, i.e., only add new
1274 refs. XXX the same could be done by testing if the
1275 current insn is a modified (or a new) one. This would be
1277 if (DF_REF_ID (def
) < df
->def_id_save
)
1280 df
->regs
[dregno
].defs
1281 = df_link_create (def
, df
->regs
[dregno
].defs
);
1287 /* Create reg-def chains for each basic block within BLOCKS. These
1288 are a list of definitions for each register. */
1290 df_reg_def_chain_create (struct df
*df
, bitmap blocks
)
1294 FOR_EACH_BB_IN_BITMAP
/*_REV*/ (blocks
, 0, bb
,
1296 df_bb_reg_def_chain_create (df
, bb
);
1301 /* Create reg-use chains for basic block BB. These are a list of uses
1302 for each register. */
1304 df_bb_reg_use_chain_create (struct df
*df
, basic_block bb
)
1308 /* Scan in forward order so that the last uses appear at the start
1311 for (insn
= BB_HEAD (bb
); insn
&& insn
!= NEXT_INSN (BB_END (bb
));
1312 insn
= NEXT_INSN (insn
))
1314 struct df_link
*link
;
1315 unsigned int uid
= INSN_UID (insn
);
1317 if (! INSN_P (insn
))
1320 for (link
= df
->insns
[uid
].uses
; link
; link
= link
->next
)
1322 struct ref
*use
= link
->ref
;
1323 unsigned int uregno
= DF_REF_REGNO (use
);
1325 /* Do not add ref's to the chain twice, i.e., only add new
1326 refs. XXX the same could be done by testing if the
1327 current insn is a modified (or a new) one. This would be
1329 if (DF_REF_ID (use
) < df
->use_id_save
)
1332 df
->regs
[uregno
].uses
1333 = df_link_create (use
, df
->regs
[uregno
].uses
);
1339 /* Create reg-use chains for each basic block within BLOCKS. These
1340 are a list of uses for each register. */
1342 df_reg_use_chain_create (struct df
*df
, bitmap blocks
)
1346 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
1348 df_bb_reg_use_chain_create (df
, bb
);
1353 /* Create def-use chains from reaching use bitmaps for basic block BB. */
1355 df_bb_du_chain_create (struct df
*df
, basic_block bb
, bitmap ru
)
1357 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
1360 bitmap_copy (ru
, bb_info
->ru_out
);
1362 /* For each def in BB create a linked list (chain) of uses
1363 reached from the def. */
1364 for (insn
= BB_END (bb
); insn
&& insn
!= PREV_INSN (BB_HEAD (bb
));
1365 insn
= PREV_INSN (insn
))
1367 struct df_link
*def_link
;
1368 struct df_link
*use_link
;
1369 unsigned int uid
= INSN_UID (insn
);
1371 if (! INSN_P (insn
))
1374 /* For each def in insn... */
1375 for (def_link
= df
->insns
[uid
].defs
; def_link
; def_link
= def_link
->next
)
1377 struct ref
*def
= def_link
->ref
;
1378 unsigned int dregno
= DF_REF_REGNO (def
);
1380 DF_REF_CHAIN (def
) = 0;
1382 /* While the reg-use chains are not essential, it
1383 is _much_ faster to search these short lists rather
1384 than all the reaching uses, especially for large functions. */
1385 for (use_link
= df
->regs
[dregno
].uses
; use_link
;
1386 use_link
= use_link
->next
)
1388 struct ref
*use
= use_link
->ref
;
1390 if (bitmap_bit_p (ru
, DF_REF_ID (use
)))
1393 = df_link_create (use
, DF_REF_CHAIN (def
));
1395 bitmap_clear_bit (ru
, DF_REF_ID (use
));
1400 /* For each use in insn... */
1401 for (use_link
= df
->insns
[uid
].uses
; use_link
; use_link
= use_link
->next
)
1403 struct ref
*use
= use_link
->ref
;
1404 bitmap_set_bit (ru
, DF_REF_ID (use
));
1410 /* Create def-use chains from reaching use bitmaps for basic blocks
1413 df_du_chain_create (struct df
*df
, bitmap blocks
)
1418 ru
= BITMAP_XMALLOC ();
1420 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
1422 df_bb_du_chain_create (df
, bb
, ru
);
1429 /* Create use-def chains from reaching def bitmaps for basic block BB. */
1431 df_bb_ud_chain_create (struct df
*df
, basic_block bb
)
1433 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
1434 struct ref
**reg_def_last
= df
->reg_def_last
;
1437 memset (reg_def_last
, 0, df
->n_regs
* sizeof (struct ref
*));
1439 /* For each use in BB create a linked list (chain) of defs
1440 that reach the use. */
1441 for (insn
= BB_HEAD (bb
); insn
&& insn
!= NEXT_INSN (BB_END (bb
));
1442 insn
= NEXT_INSN (insn
))
1444 unsigned int uid
= INSN_UID (insn
);
1445 struct df_link
*use_link
;
1446 struct df_link
*def_link
;
1448 if (! INSN_P (insn
))
1451 /* For each use in insn... */
1452 for (use_link
= df
->insns
[uid
].uses
; use_link
; use_link
= use_link
->next
)
1454 struct ref
*use
= use_link
->ref
;
1455 unsigned int regno
= DF_REF_REGNO (use
);
1457 DF_REF_CHAIN (use
) = 0;
1459 /* Has regno been defined in this BB yet? If so, use
1460 the last def as the single entry for the use-def
1461 chain for this use. Otherwise, we need to add all
1462 the defs using this regno that reach the start of
1464 if (reg_def_last
[regno
])
1467 = df_link_create (reg_def_last
[regno
], 0);
1471 /* While the reg-def chains are not essential, it is
1472 _much_ faster to search these short lists rather than
1473 all the reaching defs, especially for large
1475 for (def_link
= df
->regs
[regno
].defs
; def_link
;
1476 def_link
= def_link
->next
)
1478 struct ref
*def
= def_link
->ref
;
1480 if (bitmap_bit_p (bb_info
->rd_in
, DF_REF_ID (def
)))
1483 = df_link_create (def
, DF_REF_CHAIN (use
));
1490 /* For each def in insn... record the last def of each reg. */
1491 for (def_link
= df
->insns
[uid
].defs
; def_link
; def_link
= def_link
->next
)
1493 struct ref
*def
= def_link
->ref
;
1494 int dregno
= DF_REF_REGNO (def
);
1496 reg_def_last
[dregno
] = def
;
1502 /* Create use-def chains from reaching def bitmaps for basic blocks
1505 df_ud_chain_create (struct df
*df
, bitmap blocks
)
1509 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
1511 df_bb_ud_chain_create (df
, bb
);
1518 df_rd_transfer_function (int bb ATTRIBUTE_UNUSED
, int *changed
, bitmap in
,
1519 bitmap out
, bitmap gen
, bitmap kill
,
1520 void *data ATTRIBUTE_UNUSED
)
1522 *changed
= bitmap_union_of_diff (out
, gen
, in
, kill
);
1527 df_ru_transfer_function (int bb ATTRIBUTE_UNUSED
, int *changed
, bitmap in
,
1528 bitmap out
, bitmap gen
, bitmap kill
,
1529 void *data ATTRIBUTE_UNUSED
)
1531 *changed
= bitmap_union_of_diff (in
, gen
, out
, kill
);
1536 df_lr_transfer_function (int bb ATTRIBUTE_UNUSED
, int *changed
, bitmap in
,
1537 bitmap out
, bitmap use
, bitmap def
,
1538 void *data ATTRIBUTE_UNUSED
)
1540 *changed
= bitmap_union_of_diff (in
, use
, out
, def
);
1544 /* Compute local reaching def info for basic block BB. */
1546 df_bb_rd_local_compute (struct df
*df
, basic_block bb
)
1548 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
1551 for (insn
= BB_HEAD (bb
); insn
&& insn
!= NEXT_INSN (BB_END (bb
));
1552 insn
= NEXT_INSN (insn
))
1554 unsigned int uid
= INSN_UID (insn
);
1555 struct df_link
*def_link
;
1557 if (! INSN_P (insn
))
1560 for (def_link
= df
->insns
[uid
].defs
; def_link
; def_link
= def_link
->next
)
1562 struct ref
*def
= def_link
->ref
;
1563 unsigned int regno
= DF_REF_REGNO (def
);
1564 struct df_link
*def2_link
;
1566 for (def2_link
= df
->regs
[regno
].defs
; def2_link
;
1567 def2_link
= def2_link
->next
)
1569 struct ref
*def2
= def2_link
->ref
;
1571 /* Add all defs of this reg to the set of kills. This
1572 is greedy since many of these defs will not actually
1573 be killed by this BB but it keeps things a lot
1575 bitmap_set_bit (bb_info
->rd_kill
, DF_REF_ID (def2
));
1577 /* Zap from the set of gens for this BB. */
1578 bitmap_clear_bit (bb_info
->rd_gen
, DF_REF_ID (def2
));
1581 bitmap_set_bit (bb_info
->rd_gen
, DF_REF_ID (def
));
1585 bb_info
->rd_valid
= 1;
1589 /* Compute local reaching def info for each basic block within BLOCKS. */
1591 df_rd_local_compute (struct df
*df
, bitmap blocks
)
1595 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
1597 df_bb_rd_local_compute (df
, bb
);
1602 /* Compute local reaching use (upward exposed use) info for basic
1605 df_bb_ru_local_compute (struct df
*df
, basic_block bb
)
1607 /* This is much more tricky than computing reaching defs. With
1608 reaching defs, defs get killed by other defs. With upwards
1609 exposed uses, these get killed by defs with the same regno. */
1611 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
1615 for (insn
= BB_END (bb
); insn
&& insn
!= PREV_INSN (BB_HEAD (bb
));
1616 insn
= PREV_INSN (insn
))
1618 unsigned int uid
= INSN_UID (insn
);
1619 struct df_link
*def_link
;
1620 struct df_link
*use_link
;
1622 if (! INSN_P (insn
))
1625 for (def_link
= df
->insns
[uid
].defs
; def_link
; def_link
= def_link
->next
)
1627 struct ref
*def
= def_link
->ref
;
1628 unsigned int dregno
= DF_REF_REGNO (def
);
1630 for (use_link
= df
->regs
[dregno
].uses
; use_link
;
1631 use_link
= use_link
->next
)
1633 struct ref
*use
= use_link
->ref
;
1635 /* Add all uses of this reg to the set of kills. This
1636 is greedy since many of these uses will not actually
1637 be killed by this BB but it keeps things a lot
1639 bitmap_set_bit (bb_info
->ru_kill
, DF_REF_ID (use
));
1641 /* Zap from the set of gens for this BB. */
1642 bitmap_clear_bit (bb_info
->ru_gen
, DF_REF_ID (use
));
1646 for (use_link
= df
->insns
[uid
].uses
; use_link
; use_link
= use_link
->next
)
1648 struct ref
*use
= use_link
->ref
;
1649 /* Add use to set of gens in this BB. */
1650 bitmap_set_bit (bb_info
->ru_gen
, DF_REF_ID (use
));
1653 bb_info
->ru_valid
= 1;
1657 /* Compute local reaching use (upward exposed use) info for each basic
1658 block within BLOCKS. */
1660 df_ru_local_compute (struct df
*df
, bitmap blocks
)
1664 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
1666 df_bb_ru_local_compute (df
, bb
);
1671 /* Compute local live variable info for basic block BB. */
1673 df_bb_lr_local_compute (struct df
*df
, basic_block bb
)
1675 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
1678 for (insn
= BB_END (bb
); insn
&& insn
!= PREV_INSN (BB_HEAD (bb
));
1679 insn
= PREV_INSN (insn
))
1681 unsigned int uid
= INSN_UID (insn
);
1682 struct df_link
*link
;
1684 if (! INSN_P (insn
))
1687 for (link
= df
->insns
[uid
].defs
; link
; link
= link
->next
)
1689 struct ref
*def
= link
->ref
;
1690 unsigned int dregno
= DF_REF_REGNO (def
);
1692 /* Add def to set of defs in this BB. */
1693 bitmap_set_bit (bb_info
->lr_def
, dregno
);
1695 bitmap_clear_bit (bb_info
->lr_use
, dregno
);
1698 for (link
= df
->insns
[uid
].uses
; link
; link
= link
->next
)
1700 struct ref
*use
= link
->ref
;
1701 /* Add use to set of uses in this BB. */
1702 bitmap_set_bit (bb_info
->lr_use
, DF_REF_REGNO (use
));
1705 bb_info
->lr_valid
= 1;
1709 /* Compute local live variable info for each basic block within BLOCKS. */
1711 df_lr_local_compute (struct df
*df
, bitmap blocks
)
1715 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
1717 df_bb_lr_local_compute (df
, bb
);
1722 /* Compute register info: lifetime, bb, and number of defs and uses
1723 for basic block BB. */
1725 df_bb_reg_info_compute (struct df
*df
, basic_block bb
, bitmap live
)
1727 struct reg_info
*reg_info
= df
->regs
;
1728 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
1731 bitmap_copy (live
, bb_info
->lr_out
);
1733 for (insn
= BB_END (bb
); insn
&& insn
!= PREV_INSN (BB_HEAD (bb
));
1734 insn
= PREV_INSN (insn
))
1736 unsigned int uid
= INSN_UID (insn
);
1738 struct df_link
*link
;
1740 if (! INSN_P (insn
))
1743 for (link
= df
->insns
[uid
].defs
; link
; link
= link
->next
)
1745 struct ref
*def
= link
->ref
;
1746 unsigned int dregno
= DF_REF_REGNO (def
);
1748 /* Kill this register. */
1749 bitmap_clear_bit (live
, dregno
);
1750 reg_info
[dregno
].n_defs
++;
1753 for (link
= df
->insns
[uid
].uses
; link
; link
= link
->next
)
1755 struct ref
*use
= link
->ref
;
1756 unsigned int uregno
= DF_REF_REGNO (use
);
1758 /* This register is now live. */
1759 bitmap_set_bit (live
, uregno
);
1760 reg_info
[uregno
].n_uses
++;
1763 /* Increment lifetimes of all live registers. */
1764 EXECUTE_IF_SET_IN_BITMAP (live
, 0, regno
,
1766 reg_info
[regno
].lifetime
++;
1772 /* Compute register info: lifetime, bb, and number of defs and uses. */
1774 df_reg_info_compute (struct df
*df
, bitmap blocks
)
1779 live
= BITMAP_XMALLOC ();
1781 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
1783 df_bb_reg_info_compute (df
, bb
, live
);
1786 BITMAP_XFREE (live
);
1790 /* Assign LUIDs for BB. */
1792 df_bb_luids_set (struct df
*df
, basic_block bb
)
1797 /* The LUIDs are monotonically increasing for each basic block. */
1799 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
1802 DF_INSN_LUID (df
, insn
) = luid
++;
1803 DF_INSN_LUID (df
, insn
) = luid
;
1805 if (insn
== BB_END (bb
))
1812 /* Assign LUIDs for each basic block within BLOCKS. */
1814 df_luids_set (struct df
*df
, bitmap blocks
)
1819 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
1821 total
+= df_bb_luids_set (df
, bb
);
1827 /* Perform dataflow analysis using existing DF structure for blocks
1828 within BLOCKS. If BLOCKS is zero, use all basic blocks in the CFG. */
1830 df_analyze_1 (struct df
*df
, bitmap blocks
, int flags
, int update
)
1839 if (flags
& DF_UD_CHAIN
)
1840 aflags
|= DF_RD
| DF_RD_CHAIN
;
1842 if (flags
& DF_DU_CHAIN
)
1846 aflags
|= DF_RU_CHAIN
;
1848 if (flags
& DF_REG_INFO
)
1852 blocks
= df
->all_blocks
;
1857 df_refs_update (df
);
1858 /* More fine grained incremental dataflow analysis would be
1859 nice. For now recompute the whole shebang for the
1862 df_refs_unlink (df
, blocks
);
1864 /* All the def-use, use-def chains can be potentially
1865 modified by changes in one block. The size of the
1866 bitmaps can also change. */
1870 /* Scan the function for all register defs and uses. */
1872 df_refs_record (df
, blocks
);
1874 /* Link all the new defs and uses to the insns. */
1875 df_refs_process (df
);
1878 /* Allocate the bitmaps now the total number of defs and uses are
1879 known. If the number of defs or uses have changed, then
1880 these bitmaps need to be reallocated. */
1881 df_bitmaps_alloc (df
, aflags
);
1883 /* Set the LUIDs for each specified basic block. */
1884 df_luids_set (df
, blocks
);
1886 /* Recreate reg-def and reg-use chains from scratch so that first
1887 def is at the head of the reg-def chain and the last use is at
1888 the head of the reg-use chain. This is only important for
1889 regs local to a basic block as it speeds up searching. */
1890 if (aflags
& DF_RD_CHAIN
)
1892 df_reg_def_chain_create (df
, blocks
);
1895 if (aflags
& DF_RU_CHAIN
)
1897 df_reg_use_chain_create (df
, blocks
);
1900 df
->dfs_order
= xmalloc (sizeof (int) * n_basic_blocks
);
1901 df
->rc_order
= xmalloc (sizeof (int) * n_basic_blocks
);
1902 df
->rts_order
= xmalloc (sizeof (int) * n_basic_blocks
);
1903 df
->inverse_dfs_map
= xmalloc (sizeof (int) * last_basic_block
);
1904 df
->inverse_rc_map
= xmalloc (sizeof (int) * last_basic_block
);
1905 df
->inverse_rts_map
= xmalloc (sizeof (int) * last_basic_block
);
1907 flow_depth_first_order_compute (df
->dfs_order
, df
->rc_order
);
1908 flow_reverse_top_sort_order_compute (df
->rts_order
);
1909 for (i
= 0; i
< n_basic_blocks
; i
++)
1911 df
->inverse_dfs_map
[df
->dfs_order
[i
]] = i
;
1912 df
->inverse_rc_map
[df
->rc_order
[i
]] = i
;
1913 df
->inverse_rts_map
[df
->rts_order
[i
]] = i
;
1917 /* Compute the sets of gens and kills for the defs of each bb. */
1918 df_rd_local_compute (df
, df
->flags
& DF_RD
? blocks
: df
->all_blocks
);
1920 bitmap
*in
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1921 bitmap
*out
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1922 bitmap
*gen
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1923 bitmap
*kill
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1926 in
[bb
->index
] = DF_BB_INFO (df
, bb
)->rd_in
;
1927 out
[bb
->index
] = DF_BB_INFO (df
, bb
)->rd_out
;
1928 gen
[bb
->index
] = DF_BB_INFO (df
, bb
)->rd_gen
;
1929 kill
[bb
->index
] = DF_BB_INFO (df
, bb
)->rd_kill
;
1931 iterative_dataflow_bitmap (in
, out
, gen
, kill
, df
->all_blocks
,
1932 DF_FORWARD
, DF_UNION
, df_rd_transfer_function
,
1933 df
->inverse_rc_map
, NULL
);
1941 if (aflags
& DF_UD_CHAIN
)
1943 /* Create use-def chains. */
1944 df_ud_chain_create (df
, df
->all_blocks
);
1946 if (! (flags
& DF_RD
))
1952 /* Compute the sets of gens and kills for the upwards exposed
1954 df_ru_local_compute (df
, df
->flags
& DF_RU
? blocks
: df
->all_blocks
);
1956 bitmap
*in
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1957 bitmap
*out
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1958 bitmap
*gen
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1959 bitmap
*kill
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1962 in
[bb
->index
] = DF_BB_INFO (df
, bb
)->ru_in
;
1963 out
[bb
->index
] = DF_BB_INFO (df
, bb
)->ru_out
;
1964 gen
[bb
->index
] = DF_BB_INFO (df
, bb
)->ru_gen
;
1965 kill
[bb
->index
] = DF_BB_INFO (df
, bb
)->ru_kill
;
1967 iterative_dataflow_bitmap (in
, out
, gen
, kill
, df
->all_blocks
,
1968 DF_BACKWARD
, DF_UNION
, df_ru_transfer_function
,
1969 df
->inverse_rts_map
, NULL
);
1977 if (aflags
& DF_DU_CHAIN
)
1979 /* Create def-use chains. */
1980 df_du_chain_create (df
, df
->all_blocks
);
1982 if (! (flags
& DF_RU
))
1986 /* Free up bitmaps that are no longer required. */
1988 df_bitmaps_free (df
, dflags
);
1992 /* Compute the sets of defs and uses of live variables. */
1993 df_lr_local_compute (df
, df
->flags
& DF_LR
? blocks
: df
->all_blocks
);
1995 bitmap
*in
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1996 bitmap
*out
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1997 bitmap
*use
= xmalloc (sizeof (bitmap
) * last_basic_block
);
1998 bitmap
*def
= xmalloc (sizeof (bitmap
) * last_basic_block
);
2001 in
[bb
->index
] = DF_BB_INFO (df
, bb
)->lr_in
;
2002 out
[bb
->index
] = DF_BB_INFO (df
, bb
)->lr_out
;
2003 use
[bb
->index
] = DF_BB_INFO (df
, bb
)->lr_use
;
2004 def
[bb
->index
] = DF_BB_INFO (df
, bb
)->lr_def
;
2006 iterative_dataflow_bitmap (in
, out
, use
, def
, df
->all_blocks
,
2007 DF_BACKWARD
, DF_UNION
, df_lr_transfer_function
,
2008 df
->inverse_rts_map
, NULL
);
2016 if (aflags
& DF_REG_INFO
)
2018 df_reg_info_compute (df
, df
->all_blocks
);
2021 free (df
->dfs_order
);
2022 free (df
->rc_order
);
2023 free (df
->rts_order
);
2024 free (df
->inverse_rc_map
);
2025 free (df
->inverse_dfs_map
);
2026 free (df
->inverse_rts_map
);
2030 /* Initialize dataflow analysis. */
2036 df
= xcalloc (1, sizeof (struct df
));
2038 /* Squirrel away a global for debugging. */
2045 /* Start queuing refs. */
2047 df_refs_queue (struct df
*df
)
2049 df
->def_id_save
= df
->def_id
;
2050 df
->use_id_save
= df
->use_id
;
2051 /* ???? Perhaps we should save current obstack state so that we can
2057 /* Process queued refs. */
2059 df_refs_process (struct df
*df
)
2063 /* Build new insn-def chains. */
2064 for (i
= df
->def_id_save
; i
!= df
->def_id
; i
++)
2066 struct ref
*def
= df
->defs
[i
];
2067 unsigned int uid
= DF_REF_INSN_UID (def
);
2069 /* Add def to head of def list for INSN. */
2071 = df_link_create (def
, df
->insns
[uid
].defs
);
2074 /* Build new insn-use chains. */
2075 for (i
= df
->use_id_save
; i
!= df
->use_id
; i
++)
2077 struct ref
*use
= df
->uses
[i
];
2078 unsigned int uid
= DF_REF_INSN_UID (use
);
2080 /* Add use to head of use list for INSN. */
2082 = df_link_create (use
, df
->insns
[uid
].uses
);
2088 /* Update refs for basic block BB. */
2090 df_bb_refs_update (struct df
*df
, basic_block bb
)
2095 /* While we have to scan the chain of insns for this BB, we do not
2096 need to allocate and queue a long chain of BB/INSN pairs. Using
2097 a bitmap for insns_modified saves memory and avoids queuing
2100 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
2104 uid
= INSN_UID (insn
);
2106 if (bitmap_bit_p (df
->insns_modified
, uid
))
2108 /* Delete any allocated refs of this insn. MPH, FIXME. */
2109 df_insn_refs_unlink (df
, bb
, insn
);
2111 /* Scan the insn for refs. */
2112 df_insn_refs_record (df
, bb
, insn
);
2116 if (insn
== BB_END (bb
))
2123 /* Process all the modified/deleted insns that were queued. */
2125 df_refs_update (struct df
*df
)
2130 if ((unsigned int) max_reg_num () >= df
->reg_size
)
2131 df_reg_table_realloc (df
, 0);
2135 FOR_EACH_BB_IN_BITMAP (df
->bbs_modified
, 0, bb
,
2137 count
+= df_bb_refs_update (df
, bb
);
2140 df_refs_process (df
);
2145 /* Return nonzero if any of the requested blocks in the bitmap
2146 BLOCKS have been modified. */
2148 df_modified_p (struct df
*df
, bitmap blocks
)
2157 if (bitmap_bit_p (df
->bbs_modified
, bb
->index
)
2158 && (! blocks
|| (blocks
== (bitmap
) -1) || bitmap_bit_p (blocks
, bb
->index
)))
2168 /* Analyze dataflow info for the basic blocks specified by the bitmap
2169 BLOCKS, or for the whole CFG if BLOCKS is zero, or just for the
2170 modified blocks if BLOCKS is -1. */
2172 df_analyze (struct df
*df
, bitmap blocks
, int flags
)
2176 /* We could deal with additional basic blocks being created by
2177 rescanning everything again. */
2178 if (df
->n_bbs
&& df
->n_bbs
!= (unsigned int) last_basic_block
)
2181 update
= df_modified_p (df
, blocks
);
2182 if (update
|| (flags
!= df
->flags
))
2188 /* Recompute everything from scratch. */
2191 /* Allocate and initialize data structures. */
2192 df_alloc (df
, max_reg_num ());
2193 df_analyze_1 (df
, 0, flags
, 0);
2198 if (blocks
== (bitmap
) -1)
2199 blocks
= df
->bbs_modified
;
2204 df_analyze_1 (df
, blocks
, flags
, 1);
2205 bitmap_zero (df
->bbs_modified
);
2206 bitmap_zero (df
->insns_modified
);
2213 /* Free all the dataflow info and the DF structure. */
2215 df_finish (struct df
*df
)
2222 /* Unlink INSN from its reference information. */
2224 df_insn_refs_unlink (struct df
*df
, basic_block bb ATTRIBUTE_UNUSED
, rtx insn
)
2226 struct df_link
*link
;
2229 uid
= INSN_UID (insn
);
2231 /* Unlink all refs defined by this insn. */
2232 for (link
= df
->insns
[uid
].defs
; link
; link
= link
->next
)
2233 df_def_unlink (df
, link
->ref
);
2235 /* Unlink all refs used by this insn. */
2236 for (link
= df
->insns
[uid
].uses
; link
; link
= link
->next
)
2237 df_use_unlink (df
, link
->ref
);
2239 df
->insns
[uid
].defs
= 0;
2240 df
->insns
[uid
].uses
= 0;
2245 /* Unlink all the insns within BB from their reference information. */
2247 df_bb_refs_unlink (struct df
*df
, basic_block bb
)
2251 /* Scan the block an insn at a time from beginning to end. */
2252 for (insn
= BB_HEAD (bb
); ; insn
= NEXT_INSN (insn
))
2256 /* Unlink refs for INSN. */
2257 df_insn_refs_unlink (df
, bb
, insn
);
2259 if (insn
== BB_END (bb
))
2265 /* Unlink all the refs in the basic blocks specified by BLOCKS.
2266 Not currently used. */
2268 df_refs_unlink (struct df
*df
, bitmap blocks
)
2274 FOR_EACH_BB_IN_BITMAP (blocks
, 0, bb
,
2276 df_bb_refs_unlink (df
, bb
);
2282 df_bb_refs_unlink (df
, bb
);
2287 /* Functions to modify insns. */
2290 /* Delete INSN and all its reference information. */
2292 df_insn_delete (struct df
*df
, basic_block bb ATTRIBUTE_UNUSED
, rtx insn
)
2294 /* If the insn is a jump, we should perhaps call delete_insn to
2295 handle the JUMP_LABEL? */
2297 /* We should not be deleting the NOTE_INSN_BASIC_BLOCK or label. */
2298 if (insn
== BB_HEAD (bb
))
2301 /* Delete the insn. */
2304 df_insn_modify (df
, bb
, insn
);
2306 return NEXT_INSN (insn
);
2310 /* Mark that INSN within BB may have changed (created/modified/deleted).
2311 This may be called multiple times for the same insn. There is no
2312 harm calling this function if the insn wasn't changed; it will just
2313 slow down the rescanning of refs. */
2315 df_insn_modify (struct df
*df
, basic_block bb
, rtx insn
)
2319 uid
= INSN_UID (insn
);
2320 if (uid
>= df
->insn_size
)
2321 df_insn_table_realloc (df
, uid
);
2323 bitmap_set_bit (df
->bbs_modified
, bb
->index
);
2324 bitmap_set_bit (df
->insns_modified
, uid
);
2326 /* For incremental updating on the fly, perhaps we could make a copy
2327 of all the refs of the original insn and turn them into
2328 anti-refs. When df_refs_update finds these anti-refs, it annihilates
2329 the original refs. If validate_change fails then these anti-refs
2330 will just get ignored. */
2334 typedef struct replace_args
2343 /* Replace mem pointed to by PX with its associated pseudo register.
2344 DATA is actually a pointer to a structure describing the
2345 instruction currently being scanned and the MEM we are currently
2348 df_rtx_mem_replace (rtx
*px
, void *data
)
2350 replace_args
*args
= (replace_args
*) data
;
2353 if (mem
== NULL_RTX
)
2356 switch (GET_CODE (mem
))
2362 /* We're not interested in the MEM associated with a
2363 CONST_DOUBLE, so there's no need to traverse into one. */
2367 /* This is not a MEM. */
2371 if (!rtx_equal_p (args
->match
, mem
))
2372 /* This is not the MEM we are currently replacing. */
2375 /* Actually replace the MEM. */
2376 validate_change (args
->insn
, px
, args
->replacement
, 1);
2384 df_insn_mem_replace (struct df
*df
, basic_block bb
, rtx insn
, rtx mem
, rtx reg
)
2390 args
.replacement
= reg
;
2393 /* Search and replace all matching mems within insn. */
2394 for_each_rtx (&insn
, df_rtx_mem_replace
, &args
);
2397 df_insn_modify (df
, bb
, insn
);
2399 /* ???? FIXME. We may have a new def or one or more new uses of REG
2400 in INSN. REG should be a new pseudo so it won't affect the
2401 dataflow information that we currently have. We should add
2402 the new uses and defs to INSN and then recreate the chains
2403 when df_analyze is called. */
2404 return args
.modified
;
2408 /* Replace one register with another. Called through for_each_rtx; PX
2409 points to the rtx being scanned. DATA is actually a pointer to a
2410 structure of arguments. */
2412 df_rtx_reg_replace (rtx
*px
, void *data
)
2415 replace_args
*args
= (replace_args
*) data
;
2420 if (x
== args
->match
)
2422 validate_change (args
->insn
, px
, args
->replacement
, 1);
2430 /* Replace the reg within every ref on CHAIN that is within the set
2431 BLOCKS of basic blocks with NEWREG. Also update the regs within
2434 df_refs_reg_replace (struct df
*df
, bitmap blocks
, struct df_link
*chain
, rtx oldreg
, rtx newreg
)
2436 struct df_link
*link
;
2440 blocks
= df
->all_blocks
;
2442 args
.match
= oldreg
;
2443 args
.replacement
= newreg
;
2446 for (link
= chain
; link
; link
= link
->next
)
2448 struct ref
*ref
= link
->ref
;
2449 rtx insn
= DF_REF_INSN (ref
);
2451 if (! INSN_P (insn
))
2454 if (bitmap_bit_p (blocks
, DF_REF_BBNO (ref
)))
2456 df_ref_reg_replace (df
, ref
, oldreg
, newreg
);
2458 /* Replace occurrences of the reg within the REG_NOTES. */
2459 if ((! link
->next
|| DF_REF_INSN (ref
)
2460 != DF_REF_INSN (link
->next
->ref
))
2461 && REG_NOTES (insn
))
2464 for_each_rtx (®_NOTES (insn
), df_rtx_reg_replace
, &args
);
2469 /* Temporary check to ensure that we have a grip on which
2470 regs should be replaced. */
2477 /* Replace all occurrences of register OLDREG with register NEWREG in
2478 blocks defined by bitmap BLOCKS. This also replaces occurrences of
2479 OLDREG in the REG_NOTES but only for insns containing OLDREG. This
2480 routine expects the reg-use and reg-def chains to be valid. */
2482 df_reg_replace (struct df
*df
, bitmap blocks
, rtx oldreg
, rtx newreg
)
2484 unsigned int oldregno
= REGNO (oldreg
);
2486 df_refs_reg_replace (df
, blocks
, df
->regs
[oldregno
].defs
, oldreg
, newreg
);
2487 df_refs_reg_replace (df
, blocks
, df
->regs
[oldregno
].uses
, oldreg
, newreg
);
2492 /* Try replacing the reg within REF with NEWREG. Do not modify
2493 def-use/use-def chains. */
2495 df_ref_reg_replace (struct df
*df
, struct ref
*ref
, rtx oldreg
, rtx newreg
)
2497 /* Check that insn was deleted by being converted into a NOTE. If
2498 so ignore this insn. */
2499 if (! INSN_P (DF_REF_INSN (ref
)))
2502 if (oldreg
&& oldreg
!= DF_REF_REG (ref
))
2505 if (! validate_change (DF_REF_INSN (ref
), DF_REF_LOC (ref
), newreg
, 1))
2508 df_insn_modify (df
, DF_REF_BB (ref
), DF_REF_INSN (ref
));
2514 df_bb_def_use_swap (struct df
*df
, basic_block bb
, rtx def_insn
, rtx use_insn
, unsigned int regno
)
2520 struct df_link
*link
;
2522 def
= df_bb_insn_regno_first_def_find (df
, bb
, def_insn
, regno
);
2526 use
= df_bb_insn_regno_last_use_find (df
, bb
, use_insn
, regno
);
2530 /* The USE no longer exists. */
2531 use_uid
= INSN_UID (use_insn
);
2532 df_use_unlink (df
, use
);
2533 df_ref_unlink (&df
->insns
[use_uid
].uses
, use
);
2535 /* The DEF requires shifting so remove it from DEF_INSN
2536 and add it to USE_INSN by reusing LINK. */
2537 def_uid
= INSN_UID (def_insn
);
2538 link
= df_ref_unlink (&df
->insns
[def_uid
].defs
, def
);
2540 link
->next
= df
->insns
[use_uid
].defs
;
2541 df
->insns
[use_uid
].defs
= link
;
2544 link
= df_ref_unlink (&df
->regs
[regno
].defs
, def
);
2546 link
->next
= df
->regs
[regno
].defs
;
2547 df
->insns
[regno
].defs
= link
;
2550 DF_REF_INSN (def
) = use_insn
;
2555 /* Record df between FIRST_INSN and LAST_INSN inclusive. All new
2556 insns must be processed by this routine. */
2558 df_insns_modify (struct df
*df
, basic_block bb
, rtx first_insn
, rtx last_insn
)
2562 for (insn
= first_insn
; ; insn
= NEXT_INSN (insn
))
2566 /* A non-const call should not have slipped through the net. If
2567 it does, we need to create a new basic block. Ouch. The
2568 same applies for a label. */
2569 if ((GET_CODE (insn
) == CALL_INSN
2570 && ! CONST_OR_PURE_CALL_P (insn
))
2571 || GET_CODE (insn
) == CODE_LABEL
)
2574 uid
= INSN_UID (insn
);
2576 if (uid
>= df
->insn_size
)
2577 df_insn_table_realloc (df
, uid
);
2579 df_insn_modify (df
, bb
, insn
);
2581 if (insn
== last_insn
)
2587 /* Emit PATTERN before INSN within BB. */
2589 df_pattern_emit_before (struct df
*df
, rtx pattern
, basic_block bb
, rtx insn
)
2592 rtx prev_insn
= PREV_INSN (insn
);
2594 /* We should not be inserting before the start of the block. */
2595 if (insn
== BB_HEAD (bb
))
2597 ret_insn
= emit_insn_before (pattern
, insn
);
2598 if (ret_insn
== insn
)
2601 df_insns_modify (df
, bb
, NEXT_INSN (prev_insn
), ret_insn
);
2606 /* Emit PATTERN after INSN within BB. */
2608 df_pattern_emit_after (struct df
*df
, rtx pattern
, basic_block bb
, rtx insn
)
2612 ret_insn
= emit_insn_after (pattern
, insn
);
2613 if (ret_insn
== insn
)
2616 df_insns_modify (df
, bb
, NEXT_INSN (insn
), ret_insn
);
2621 /* Emit jump PATTERN after INSN within BB. */
2623 df_jump_pattern_emit_after (struct df
*df
, rtx pattern
, basic_block bb
, rtx insn
)
2627 ret_insn
= emit_jump_insn_after (pattern
, insn
);
2628 if (ret_insn
== insn
)
2631 df_insns_modify (df
, bb
, NEXT_INSN (insn
), ret_insn
);
2636 /* Move INSN within BB before BEFORE_INSN within BEFORE_BB.
2638 This function should only be used to move loop invariant insns
2639 out of a loop where it has been proven that the def-use info
2640 will still be valid. */
2642 df_insn_move_before (struct df
*df
, basic_block bb
, rtx insn
, basic_block before_bb
, rtx before_insn
)
2644 struct df_link
*link
;
2648 return df_pattern_emit_before (df
, insn
, before_bb
, before_insn
);
2650 uid
= INSN_UID (insn
);
2652 /* Change bb for all df defined and used by this insn. */
2653 for (link
= df
->insns
[uid
].defs
; link
; link
= link
->next
)
2654 DF_REF_BB (link
->ref
) = before_bb
;
2655 for (link
= df
->insns
[uid
].uses
; link
; link
= link
->next
)
2656 DF_REF_BB (link
->ref
) = before_bb
;
2658 /* The lifetimes of the registers used in this insn will be reduced
2659 while the lifetimes of the registers defined in this insn
2660 are likely to be increased. */
2662 /* ???? Perhaps all the insns moved should be stored on a list
2663 which df_analyze removes when it recalculates data flow. */
2665 return emit_insn_before (insn
, before_insn
);
2668 /* Functions to query dataflow information. */
2672 df_insn_regno_def_p (struct df
*df
, basic_block bb ATTRIBUTE_UNUSED
,
2673 rtx insn
, unsigned int regno
)
2676 struct df_link
*link
;
2678 uid
= INSN_UID (insn
);
2680 for (link
= df
->insns
[uid
].defs
; link
; link
= link
->next
)
2682 struct ref
*def
= link
->ref
;
2684 if (DF_REF_REGNO (def
) == regno
)
2693 df_def_dominates_all_uses_p (struct df
*df ATTRIBUTE_UNUSED
, struct ref
*def
)
2695 struct df_link
*du_link
;
2697 /* Follow def-use chain to find all the uses of this def. */
2698 for (du_link
= DF_REF_CHAIN (def
); du_link
; du_link
= du_link
->next
)
2700 struct ref
*use
= du_link
->ref
;
2701 struct df_link
*ud_link
;
2703 /* Follow use-def chain to check all the defs for this use. */
2704 for (ud_link
= DF_REF_CHAIN (use
); ud_link
; ud_link
= ud_link
->next
)
2705 if (ud_link
->ref
!= def
)
2713 df_insn_dominates_all_uses_p (struct df
*df
, basic_block bb ATTRIBUTE_UNUSED
,
2717 struct df_link
*link
;
2719 uid
= INSN_UID (insn
);
2721 for (link
= df
->insns
[uid
].defs
; link
; link
= link
->next
)
2723 struct ref
*def
= link
->ref
;
2725 if (! df_def_dominates_all_uses_p (df
, def
))
2733 /* Return nonzero if all DF dominates all the uses within the bitmap
2736 df_def_dominates_uses_p (struct df
*df ATTRIBUTE_UNUSED
, struct ref
*def
,
2739 struct df_link
*du_link
;
2741 /* Follow def-use chain to find all the uses of this def. */
2742 for (du_link
= DF_REF_CHAIN (def
); du_link
; du_link
= du_link
->next
)
2744 struct ref
*use
= du_link
->ref
;
2745 struct df_link
*ud_link
;
2747 /* Only worry about the uses within BLOCKS. For example,
2748 consider a register defined within a loop that is live at the
2750 if (bitmap_bit_p (blocks
, DF_REF_BBNO (use
)))
2752 /* Follow use-def chain to check all the defs for this use. */
2753 for (ud_link
= DF_REF_CHAIN (use
); ud_link
; ud_link
= ud_link
->next
)
2754 if (ud_link
->ref
!= def
)
2762 /* Return nonzero if all the defs of INSN within BB dominates
2763 all the corresponding uses. */
2765 df_insn_dominates_uses_p (struct df
*df
, basic_block bb ATTRIBUTE_UNUSED
,
2766 rtx insn
, bitmap blocks
)
2769 struct df_link
*link
;
2771 uid
= INSN_UID (insn
);
2773 for (link
= df
->insns
[uid
].defs
; link
; link
= link
->next
)
2775 struct ref
*def
= link
->ref
;
2777 /* Only consider the defs within BLOCKS. */
2778 if (bitmap_bit_p (blocks
, DF_REF_BBNO (def
))
2779 && ! df_def_dominates_uses_p (df
, def
, blocks
))
2786 /* Return the basic block that REG referenced in or NULL if referenced
2787 in multiple basic blocks. */
2789 df_regno_bb (struct df
*df
, unsigned int regno
)
2791 struct df_link
*defs
= df
->regs
[regno
].defs
;
2792 struct df_link
*uses
= df
->regs
[regno
].uses
;
2793 struct ref
*def
= defs
? defs
->ref
: 0;
2794 struct ref
*use
= uses
? uses
->ref
: 0;
2795 basic_block bb_def
= def
? DF_REF_BB (def
) : 0;
2796 basic_block bb_use
= use
? DF_REF_BB (use
) : 0;
2798 /* Compare blocks of first def and last use. ???? FIXME. What if
2799 the reg-def and reg-use lists are not correctly ordered. */
2800 return bb_def
== bb_use
? bb_def
: 0;
2804 /* Return nonzero if REG used in multiple basic blocks. */
2806 df_reg_global_p (struct df
*df
, rtx reg
)
2808 return df_regno_bb (df
, REGNO (reg
)) != 0;
2812 /* Return total lifetime (in insns) of REG. */
2814 df_reg_lifetime (struct df
*df
, rtx reg
)
2816 return df
->regs
[REGNO (reg
)].lifetime
;
2820 /* Return nonzero if REG live at start of BB. */
2822 df_bb_reg_live_start_p (struct df
*df
, basic_block bb
, rtx reg
)
2824 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
2826 #ifdef ENABLE_CHECKING
2827 if (! bb_info
->lr_in
)
2831 return bitmap_bit_p (bb_info
->lr_in
, REGNO (reg
));
2835 /* Return nonzero if REG live at end of BB. */
2837 df_bb_reg_live_end_p (struct df
*df
, basic_block bb
, rtx reg
)
2839 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
2841 #ifdef ENABLE_CHECKING
2842 if (! bb_info
->lr_in
)
2846 return bitmap_bit_p (bb_info
->lr_out
, REGNO (reg
));
2850 /* Return -1 if life of REG1 before life of REG2, 1 if life of REG1
2851 after life of REG2, or 0, if the lives overlap. */
2853 df_bb_regs_lives_compare (struct df
*df
, basic_block bb
, rtx reg1
, rtx reg2
)
2855 unsigned int regno1
= REGNO (reg1
);
2856 unsigned int regno2
= REGNO (reg2
);
2863 /* The regs must be local to BB. */
2864 if (df_regno_bb (df
, regno1
) != bb
2865 || df_regno_bb (df
, regno2
) != bb
)
2868 def2
= df_bb_regno_first_def_find (df
, bb
, regno2
);
2869 use1
= df_bb_regno_last_use_find (df
, bb
, regno1
);
2871 if (DF_INSN_LUID (df
, DF_REF_INSN (def2
))
2872 > DF_INSN_LUID (df
, DF_REF_INSN (use1
)))
2875 def1
= df_bb_regno_first_def_find (df
, bb
, regno1
);
2876 use2
= df_bb_regno_last_use_find (df
, bb
, regno2
);
2878 if (DF_INSN_LUID (df
, DF_REF_INSN (def1
))
2879 > DF_INSN_LUID (df
, DF_REF_INSN (use2
)))
2886 /* Return last use of REGNO within BB. */
2888 df_bb_regno_last_use_find (struct df
*df
, basic_block bb
, unsigned int regno
)
2890 struct df_link
*link
;
2892 /* This assumes that the reg-use list is ordered such that for any
2893 BB, the last use is found first. However, since the BBs are not
2894 ordered, the first use in the chain is not necessarily the last
2895 use in the function. */
2896 for (link
= df
->regs
[regno
].uses
; link
; link
= link
->next
)
2898 struct ref
*use
= link
->ref
;
2900 if (DF_REF_BB (use
) == bb
)
2907 /* Return first def of REGNO within BB. */
2909 df_bb_regno_first_def_find (struct df
*df
, basic_block bb
, unsigned int regno
)
2911 struct df_link
*link
;
2913 /* This assumes that the reg-def list is ordered such that for any
2914 BB, the first def is found first. However, since the BBs are not
2915 ordered, the first def in the chain is not necessarily the first
2916 def in the function. */
2917 for (link
= df
->regs
[regno
].defs
; link
; link
= link
->next
)
2919 struct ref
*def
= link
->ref
;
2921 if (DF_REF_BB (def
) == bb
)
2928 /* Return first use of REGNO inside INSN within BB. */
2930 df_bb_insn_regno_last_use_find (struct df
*df
,
2931 basic_block bb ATTRIBUTE_UNUSED
, rtx insn
,
2935 struct df_link
*link
;
2937 uid
= INSN_UID (insn
);
2939 for (link
= df
->insns
[uid
].uses
; link
; link
= link
->next
)
2941 struct ref
*use
= link
->ref
;
2943 if (DF_REF_REGNO (use
) == regno
)
2951 /* Return first def of REGNO inside INSN within BB. */
2953 df_bb_insn_regno_first_def_find (struct df
*df
,
2954 basic_block bb ATTRIBUTE_UNUSED
, rtx insn
,
2958 struct df_link
*link
;
2960 uid
= INSN_UID (insn
);
2962 for (link
= df
->insns
[uid
].defs
; link
; link
= link
->next
)
2964 struct ref
*def
= link
->ref
;
2966 if (DF_REF_REGNO (def
) == regno
)
2974 /* Return insn using REG if the BB contains only a single
2975 use and def of REG. */
2977 df_bb_single_def_use_insn_find (struct df
*df
, basic_block bb
, rtx insn
, rtx reg
)
2981 struct df_link
*du_link
;
2983 def
= df_bb_insn_regno_first_def_find (df
, bb
, insn
, REGNO (reg
));
2988 du_link
= DF_REF_CHAIN (def
);
2995 /* Check if def is dead. */
2999 /* Check for multiple uses. */
3003 return DF_REF_INSN (use
);
3006 /* Functions for debugging/dumping dataflow information. */
3009 /* Dump a def-use or use-def chain for REF to FILE. */
3011 df_chain_dump (struct df_link
*link
, FILE *file
)
3013 fprintf (file
, "{ ");
3014 for (; link
; link
= link
->next
)
3016 fprintf (file
, "%c%d ",
3017 DF_REF_REG_DEF_P (link
->ref
) ? 'd' : 'u',
3018 DF_REF_ID (link
->ref
));
3020 fprintf (file
, "}");
3024 /* Dump a chain of refs with the associated regno. */
3026 df_chain_dump_regno (struct df_link
*link
, FILE *file
)
3028 fprintf (file
, "{ ");
3029 for (; link
; link
= link
->next
)
3031 fprintf (file
, "%c%d(%d) ",
3032 DF_REF_REG_DEF_P (link
->ref
) ? 'd' : 'u',
3033 DF_REF_ID (link
->ref
),
3034 DF_REF_REGNO (link
->ref
));
3036 fprintf (file
, "}");
3040 /* Dump dataflow info. */
3042 df_dump (struct df
*df
, int flags
, FILE *file
)
3050 fprintf (file
, "\nDataflow summary:\n");
3051 fprintf (file
, "n_regs = %d, n_defs = %d, n_uses = %d, n_bbs = %d\n",
3052 df
->n_regs
, df
->n_defs
, df
->n_uses
, df
->n_bbs
);
3058 fprintf (file
, "Reaching defs:\n");
3061 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
3063 if (! bb_info
->rd_in
)
3066 fprintf (file
, "bb %d in \t", bb
->index
);
3067 dump_bitmap (file
, bb_info
->rd_in
);
3068 fprintf (file
, "bb %d gen \t", bb
->index
);
3069 dump_bitmap (file
, bb_info
->rd_gen
);
3070 fprintf (file
, "bb %d kill\t", bb
->index
);
3071 dump_bitmap (file
, bb_info
->rd_kill
);
3072 fprintf (file
, "bb %d out \t", bb
->index
);
3073 dump_bitmap (file
, bb_info
->rd_out
);
3077 if (flags
& DF_UD_CHAIN
)
3079 fprintf (file
, "Use-def chains:\n");
3080 for (j
= 0; j
< df
->n_defs
; j
++)
3084 fprintf (file
, "d%d bb %d luid %d insn %d reg %d ",
3085 j
, DF_REF_BBNO (df
->defs
[j
]),
3086 DF_INSN_LUID (df
, DF_REF_INSN (df
->defs
[j
])),
3087 DF_REF_INSN_UID (df
->defs
[j
]),
3088 DF_REF_REGNO (df
->defs
[j
]));
3089 if (df
->defs
[j
]->flags
& DF_REF_READ_WRITE
)
3090 fprintf (file
, "read/write ");
3091 df_chain_dump (DF_REF_CHAIN (df
->defs
[j
]), file
);
3092 fprintf (file
, "\n");
3099 fprintf (file
, "Reaching uses:\n");
3102 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
3104 if (! bb_info
->ru_in
)
3107 fprintf (file
, "bb %d in \t", bb
->index
);
3108 dump_bitmap (file
, bb_info
->ru_in
);
3109 fprintf (file
, "bb %d gen \t", bb
->index
);
3110 dump_bitmap (file
, bb_info
->ru_gen
);
3111 fprintf (file
, "bb %d kill\t", bb
->index
);
3112 dump_bitmap (file
, bb_info
->ru_kill
);
3113 fprintf (file
, "bb %d out \t", bb
->index
);
3114 dump_bitmap (file
, bb_info
->ru_out
);
3118 if (flags
& DF_DU_CHAIN
)
3120 fprintf (file
, "Def-use chains:\n");
3121 for (j
= 0; j
< df
->n_uses
; j
++)
3125 fprintf (file
, "u%d bb %d luid %d insn %d reg %d ",
3126 j
, DF_REF_BBNO (df
->uses
[j
]),
3127 DF_INSN_LUID (df
, DF_REF_INSN (df
->uses
[j
])),
3128 DF_REF_INSN_UID (df
->uses
[j
]),
3129 DF_REF_REGNO (df
->uses
[j
]));
3130 if (df
->uses
[j
]->flags
& DF_REF_READ_WRITE
)
3131 fprintf (file
, "read/write ");
3132 df_chain_dump (DF_REF_CHAIN (df
->uses
[j
]), file
);
3133 fprintf (file
, "\n");
3140 fprintf (file
, "Live regs:\n");
3143 struct bb_info
*bb_info
= DF_BB_INFO (df
, bb
);
3145 if (! bb_info
->lr_in
)
3148 fprintf (file
, "bb %d in \t", bb
->index
);
3149 dump_bitmap (file
, bb_info
->lr_in
);
3150 fprintf (file
, "bb %d use \t", bb
->index
);
3151 dump_bitmap (file
, bb_info
->lr_use
);
3152 fprintf (file
, "bb %d def \t", bb
->index
);
3153 dump_bitmap (file
, bb_info
->lr_def
);
3154 fprintf (file
, "bb %d out \t", bb
->index
);
3155 dump_bitmap (file
, bb_info
->lr_out
);
3159 if (flags
& (DF_REG_INFO
| DF_RD_CHAIN
| DF_RU_CHAIN
))
3161 struct reg_info
*reg_info
= df
->regs
;
3163 fprintf (file
, "Register info:\n");
3164 for (j
= 0; j
< df
->n_regs
; j
++)
3166 if (((flags
& DF_REG_INFO
)
3167 && (reg_info
[j
].n_uses
|| reg_info
[j
].n_defs
))
3168 || ((flags
& DF_RD_CHAIN
) && reg_info
[j
].defs
)
3169 || ((flags
& DF_RU_CHAIN
) && reg_info
[j
].uses
))
3171 fprintf (file
, "reg %d", j
);
3172 if ((flags
& DF_RD_CHAIN
) && (flags
& DF_RU_CHAIN
))
3174 basic_block bb
= df_regno_bb (df
, j
);
3177 fprintf (file
, " bb %d", bb
->index
);
3179 fprintf (file
, " bb ?");
3181 if (flags
& DF_REG_INFO
)
3183 fprintf (file
, " life %d", reg_info
[j
].lifetime
);
3186 if ((flags
& DF_REG_INFO
) || (flags
& DF_RD_CHAIN
))
3188 fprintf (file
, " defs ");
3189 if (flags
& DF_REG_INFO
)
3190 fprintf (file
, "%d ", reg_info
[j
].n_defs
);
3191 if (flags
& DF_RD_CHAIN
)
3192 df_chain_dump (reg_info
[j
].defs
, file
);
3195 if ((flags
& DF_REG_INFO
) || (flags
& DF_RU_CHAIN
))
3197 fprintf (file
, " uses ");
3198 if (flags
& DF_REG_INFO
)
3199 fprintf (file
, "%d ", reg_info
[j
].n_uses
);
3200 if (flags
& DF_RU_CHAIN
)
3201 df_chain_dump (reg_info
[j
].uses
, file
);
3204 fprintf (file
, "\n");
3208 fprintf (file
, "\n");
3213 df_insn_debug (struct df
*df
, rtx insn
, FILE *file
)
3218 uid
= INSN_UID (insn
);
3219 if (uid
>= df
->insn_size
)
3222 if (df
->insns
[uid
].defs
)
3223 bbi
= DF_REF_BBNO (df
->insns
[uid
].defs
->ref
);
3224 else if (df
->insns
[uid
].uses
)
3225 bbi
= DF_REF_BBNO (df
->insns
[uid
].uses
->ref
);
3229 fprintf (file
, "insn %d bb %d luid %d defs ",
3230 uid
, bbi
, DF_INSN_LUID (df
, insn
));
3231 df_chain_dump (df
->insns
[uid
].defs
, file
);
3232 fprintf (file
, " uses ");
3233 df_chain_dump (df
->insns
[uid
].uses
, file
);
3234 fprintf (file
, "\n");
3239 df_insn_debug_regno (struct df
*df
, rtx insn
, FILE *file
)
3244 uid
= INSN_UID (insn
);
3245 if (uid
>= df
->insn_size
)
3248 if (df
->insns
[uid
].defs
)
3249 bbi
= DF_REF_BBNO (df
->insns
[uid
].defs
->ref
);
3250 else if (df
->insns
[uid
].uses
)
3251 bbi
= DF_REF_BBNO (df
->insns
[uid
].uses
->ref
);
3255 fprintf (file
, "insn %d bb %d luid %d defs ",
3256 uid
, bbi
, DF_INSN_LUID (df
, insn
));
3257 df_chain_dump_regno (df
->insns
[uid
].defs
, file
);
3258 fprintf (file
, " uses ");
3259 df_chain_dump_regno (df
->insns
[uid
].uses
, file
);
3260 fprintf (file
, "\n");
3265 df_regno_debug (struct df
*df
, unsigned int regno
, FILE *file
)
3267 if (regno
>= df
->reg_size
)
3270 fprintf (file
, "reg %d life %d defs ",
3271 regno
, df
->regs
[regno
].lifetime
);
3272 df_chain_dump (df
->regs
[regno
].defs
, file
);
3273 fprintf (file
, " uses ");
3274 df_chain_dump (df
->regs
[regno
].uses
, file
);
3275 fprintf (file
, "\n");
3280 df_ref_debug (struct df
*df
, struct ref
*ref
, FILE *file
)
3282 fprintf (file
, "%c%d ",
3283 DF_REF_REG_DEF_P (ref
) ? 'd' : 'u',
3285 fprintf (file
, "reg %d bb %d luid %d insn %d chain ",
3288 DF_INSN_LUID (df
, DF_REF_INSN (ref
)),
3289 INSN_UID (DF_REF_INSN (ref
)));
3290 df_chain_dump (DF_REF_CHAIN (ref
), file
);
3291 fprintf (file
, "\n");
3294 /* Functions for debugging from GDB. */
3297 debug_df_insn (rtx insn
)
3299 df_insn_debug (ddf
, insn
, stderr
);
3305 debug_df_reg (rtx reg
)
3307 df_regno_debug (ddf
, REGNO (reg
), stderr
);
3312 debug_df_regno (unsigned int regno
)
3314 df_regno_debug (ddf
, regno
, stderr
);
3319 debug_df_ref (struct ref
*ref
)
3321 df_ref_debug (ddf
, ref
, stderr
);
3326 debug_df_defno (unsigned int defno
)
3328 df_ref_debug (ddf
, ddf
->defs
[defno
], stderr
);
3333 debug_df_useno (unsigned int defno
)
3335 df_ref_debug (ddf
, ddf
->uses
[defno
], stderr
);
3340 debug_df_chain (struct df_link
*link
)
3342 df_chain_dump (link
, stderr
);
3343 fputc ('\n', stderr
);
3347 /* Hybrid search algorithm from "Implementation Techniques for
3348 Efficient Data-Flow Analysis of Large Programs". */
3350 hybrid_search_bitmap (basic_block block
, bitmap
*in
, bitmap
*out
, bitmap
*gen
,
3351 bitmap
*kill
, enum df_flow_dir dir
,
3352 enum df_confluence_op conf_op
,
3353 transfer_function_bitmap transfun
, sbitmap visited
,
3354 sbitmap pending
, void *data
)
3357 int i
= block
->index
;
3359 basic_block bb
= block
;
3361 SET_BIT (visited
, block
->index
);
3362 if (TEST_BIT (pending
, block
->index
))
3364 if (dir
== DF_FORWARD
)
3366 /* Calculate <conf_op> of predecessor_outs. */
3367 bitmap_zero (in
[i
]);
3368 for (e
= bb
->pred
; e
!= 0; e
= e
->pred_next
)
3370 if (e
->src
== ENTRY_BLOCK_PTR
)
3375 bitmap_a_or_b (in
[i
], in
[i
], out
[e
->src
->index
]);
3377 case DF_INTERSECTION
:
3378 bitmap_a_and_b (in
[i
], in
[i
], out
[e
->src
->index
]);
3385 /* Calculate <conf_op> of successor ins. */
3386 bitmap_zero (out
[i
]);
3387 for (e
= bb
->succ
; e
!= 0; e
= e
->succ_next
)
3389 if (e
->dest
== EXIT_BLOCK_PTR
)
3394 bitmap_a_or_b (out
[i
], out
[i
], in
[e
->dest
->index
]);
3396 case DF_INTERSECTION
:
3397 bitmap_a_and_b (out
[i
], out
[i
], in
[e
->dest
->index
]);
3403 (*transfun
)(i
, &changed
, in
[i
], out
[i
], gen
[i
], kill
[i
], data
);
3404 RESET_BIT (pending
, i
);
3407 if (dir
== DF_FORWARD
)
3409 for (e
= bb
->succ
; e
!= 0; e
= e
->succ_next
)
3411 if (e
->dest
== EXIT_BLOCK_PTR
|| e
->dest
->index
== i
)
3413 SET_BIT (pending
, e
->dest
->index
);
3418 for (e
= bb
->pred
; e
!= 0; e
= e
->pred_next
)
3420 if (e
->src
== ENTRY_BLOCK_PTR
|| e
->dest
->index
== i
)
3422 SET_BIT (pending
, e
->src
->index
);
3427 if (dir
== DF_FORWARD
)
3429 for (e
= bb
->succ
; e
!= 0; e
= e
->succ_next
)
3431 if (e
->dest
== EXIT_BLOCK_PTR
|| e
->dest
->index
== i
)
3433 if (!TEST_BIT (visited
, e
->dest
->index
))
3434 hybrid_search_bitmap (e
->dest
, in
, out
, gen
, kill
, dir
,
3435 conf_op
, transfun
, visited
, pending
,
3441 for (e
= bb
->pred
; e
!= 0; e
= e
->pred_next
)
3443 if (e
->src
== ENTRY_BLOCK_PTR
|| e
->src
->index
== i
)
3445 if (!TEST_BIT (visited
, e
->src
->index
))
3446 hybrid_search_bitmap (e
->src
, in
, out
, gen
, kill
, dir
,
3447 conf_op
, transfun
, visited
, pending
,
3454 /* Hybrid search for sbitmaps, rather than bitmaps. */
3456 hybrid_search_sbitmap (basic_block block
, sbitmap
*in
, sbitmap
*out
,
3457 sbitmap
*gen
, sbitmap
*kill
, enum df_flow_dir dir
,
3458 enum df_confluence_op conf_op
,
3459 transfer_function_sbitmap transfun
, sbitmap visited
,
3460 sbitmap pending
, void *data
)
3463 int i
= block
->index
;
3465 basic_block bb
= block
;
3467 SET_BIT (visited
, block
->index
);
3468 if (TEST_BIT (pending
, block
->index
))
3470 if (dir
== DF_FORWARD
)
3472 /* Calculate <conf_op> of predecessor_outs. */
3473 sbitmap_zero (in
[i
]);
3474 for (e
= bb
->pred
; e
!= 0; e
= e
->pred_next
)
3476 if (e
->src
== ENTRY_BLOCK_PTR
)
3481 sbitmap_a_or_b (in
[i
], in
[i
], out
[e
->src
->index
]);
3483 case DF_INTERSECTION
:
3484 sbitmap_a_and_b (in
[i
], in
[i
], out
[e
->src
->index
]);
3491 /* Calculate <conf_op> of successor ins. */
3492 sbitmap_zero (out
[i
]);
3493 for (e
= bb
->succ
; e
!= 0; e
= e
->succ_next
)
3495 if (e
->dest
== EXIT_BLOCK_PTR
)
3500 sbitmap_a_or_b (out
[i
], out
[i
], in
[e
->dest
->index
]);
3502 case DF_INTERSECTION
:
3503 sbitmap_a_and_b (out
[i
], out
[i
], in
[e
->dest
->index
]);
3509 (*transfun
)(i
, &changed
, in
[i
], out
[i
], gen
[i
], kill
[i
], data
);
3510 RESET_BIT (pending
, i
);
3513 if (dir
== DF_FORWARD
)
3515 for (e
= bb
->succ
; e
!= 0; e
= e
->succ_next
)
3517 if (e
->dest
== EXIT_BLOCK_PTR
|| e
->dest
->index
== i
)
3519 SET_BIT (pending
, e
->dest
->index
);
3524 for (e
= bb
->pred
; e
!= 0; e
= e
->pred_next
)
3526 if (e
->src
== ENTRY_BLOCK_PTR
|| e
->dest
->index
== i
)
3528 SET_BIT (pending
, e
->src
->index
);
3533 if (dir
== DF_FORWARD
)
3535 for (e
= bb
->succ
; e
!= 0; e
= e
->succ_next
)
3537 if (e
->dest
== EXIT_BLOCK_PTR
|| e
->dest
->index
== i
)
3539 if (!TEST_BIT (visited
, e
->dest
->index
))
3540 hybrid_search_sbitmap (e
->dest
, in
, out
, gen
, kill
, dir
,
3541 conf_op
, transfun
, visited
, pending
,
3547 for (e
= bb
->pred
; e
!= 0; e
= e
->pred_next
)
3549 if (e
->src
== ENTRY_BLOCK_PTR
|| e
->src
->index
== i
)
3551 if (!TEST_BIT (visited
, e
->src
->index
))
3552 hybrid_search_sbitmap (e
->src
, in
, out
, gen
, kill
, dir
,
3553 conf_op
, transfun
, visited
, pending
,
3562 in, out = Filled in by function.
3563 blocks = Blocks to analyze.
3564 dir = Dataflow direction.
3565 conf_op = Confluence operation.
3566 transfun = Transfer function.
3567 order = Order to iterate in. (Should map block numbers -> order)
3568 data = Whatever you want. It's passed to the transfer function.
3570 This function will perform iterative bitvector dataflow, producing
3571 the in and out sets. Even if you only want to perform it for a
3572 small number of blocks, the vectors for in and out must be large
3573 enough for *all* blocks, because changing one block might affect
3574 others. However, it'll only put what you say to analyze on the
3577 For forward problems, you probably want to pass in a mapping of
3578 block number to rc_order (like df->inverse_rc_map).
3581 iterative_dataflow_sbitmap (sbitmap
*in
, sbitmap
*out
, sbitmap
*gen
,
3582 sbitmap
*kill
, bitmap blocks
,
3583 enum df_flow_dir dir
,
3584 enum df_confluence_op conf_op
,
3585 transfer_function_sbitmap transfun
, int *order
,
3591 sbitmap visited
, pending
;
3593 pending
= sbitmap_alloc (last_basic_block
);
3594 visited
= sbitmap_alloc (last_basic_block
);
3595 sbitmap_zero (pending
);
3596 sbitmap_zero (visited
);
3597 worklist
= fibheap_new ();
3599 EXECUTE_IF_SET_IN_BITMAP (blocks
, 0, i
,
3601 fibheap_insert (worklist
, order
[i
], (void *) (size_t) i
);
3602 SET_BIT (pending
, i
);
3603 if (dir
== DF_FORWARD
)
3604 sbitmap_copy (out
[i
], gen
[i
]);
3606 sbitmap_copy (in
[i
], gen
[i
]);
3609 while (sbitmap_first_set_bit (pending
) != -1)
3611 while (!fibheap_empty (worklist
))
3613 i
= (size_t) fibheap_extract_min (worklist
);
3614 bb
= BASIC_BLOCK (i
);
3615 if (!TEST_BIT (visited
, bb
->index
))
3616 hybrid_search_sbitmap (bb
, in
, out
, gen
, kill
, dir
,
3617 conf_op
, transfun
, visited
, pending
, data
);
3620 if (sbitmap_first_set_bit (pending
) != -1)
3622 EXECUTE_IF_SET_IN_BITMAP (blocks
, 0, i
,
3624 fibheap_insert (worklist
, order
[i
], (void *) (size_t) i
);
3626 sbitmap_zero (visited
);
3634 sbitmap_free (pending
);
3635 sbitmap_free (visited
);
3636 fibheap_delete (worklist
);
3640 /* Exactly the same as iterative_dataflow_sbitmap, except it works on
3643 iterative_dataflow_bitmap (bitmap
*in
, bitmap
*out
, bitmap
*gen
, bitmap
*kill
,
3644 bitmap blocks
, enum df_flow_dir dir
,
3645 enum df_confluence_op conf_op
,
3646 transfer_function_bitmap transfun
, int *order
,
3652 sbitmap visited
, pending
;
3654 pending
= sbitmap_alloc (last_basic_block
);
3655 visited
= sbitmap_alloc (last_basic_block
);
3656 sbitmap_zero (pending
);
3657 sbitmap_zero (visited
);
3658 worklist
= fibheap_new ();
3660 EXECUTE_IF_SET_IN_BITMAP (blocks
, 0, i
,
3662 fibheap_insert (worklist
, order
[i
], (void *) (size_t) i
);
3663 SET_BIT (pending
, i
);
3664 if (dir
== DF_FORWARD
)
3665 bitmap_copy (out
[i
], gen
[i
]);
3667 bitmap_copy (in
[i
], gen
[i
]);
3670 while (sbitmap_first_set_bit (pending
) != -1)
3672 while (!fibheap_empty (worklist
))
3674 i
= (size_t) fibheap_extract_min (worklist
);
3675 bb
= BASIC_BLOCK (i
);
3676 if (!TEST_BIT (visited
, bb
->index
))
3677 hybrid_search_bitmap (bb
, in
, out
, gen
, kill
, dir
,
3678 conf_op
, transfun
, visited
, pending
, data
);
3681 if (sbitmap_first_set_bit (pending
) != -1)
3683 EXECUTE_IF_SET_IN_BITMAP (blocks
, 0, i
,
3685 fibheap_insert (worklist
, order
[i
], (void *) (size_t) i
);
3687 sbitmap_zero (visited
);
3694 sbitmap_free (pending
);
3695 sbitmap_free (visited
);
3696 fibheap_delete (worklist
);