gcc/
[gcc.git] / gcc / df-problems.c
1 /* Standard problems for dataflow support routines.
2 Copyright (C) 1999-2015 Free Software Foundation, Inc.
3 Originally contributed by Michael P. Hayes
4 (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
5 Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
6 and Kenneth Zadeck (zadeck@naturalbridge.com).
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "rtl.h"
29 #include "tm_p.h"
30 #include "insn-config.h"
31 #include "recog.h"
32 #include "hard-reg-set.h"
33 #include "function.h"
34 #include "regs.h"
35 #include "alloc-pool.h"
36 #include "flags.h"
37 #include "predict.h"
38 #include "dominance.h"
39 #include "cfg.h"
40 #include "cfganal.h"
41 #include "basic-block.h"
42 #include "sbitmap.h"
43 #include "bitmap.h"
44 #include "target.h"
45 #include "timevar.h"
46 #include "df.h"
47 #include "except.h"
48 #include "dce.h"
49 #include "valtrack.h"
50 #include "dumpfile.h"
51 #include "rtl-iter.h"
52
53 /* Note that turning REG_DEAD_DEBUGGING on will cause
54 gcc.c-torture/unsorted/dump-noaddr.c to fail because it prints
55 addresses in the dumps. */
56 #define REG_DEAD_DEBUGGING 0
57
58 #define DF_SPARSE_THRESHOLD 32
59
60 static bitmap_head seen_in_block;
61 static bitmap_head seen_in_insn;
62
63 /*----------------------------------------------------------------------------
64 Utility functions.
65 ----------------------------------------------------------------------------*/
66
67 /* Generic versions to get the void* version of the block info. Only
68 used inside the problem instance vectors. */
69
70 /* Dump a def-use or use-def chain for REF to FILE. */
71
72 void
73 df_chain_dump (struct df_link *link, FILE *file)
74 {
75 fprintf (file, "{ ");
76 for (; link; link = link->next)
77 {
78 fprintf (file, "%c%d(bb %d insn %d) ",
79 DF_REF_REG_DEF_P (link->ref)
80 ? 'd'
81 : (DF_REF_FLAGS (link->ref) & DF_REF_IN_NOTE) ? 'e' : 'u',
82 DF_REF_ID (link->ref),
83 DF_REF_BBNO (link->ref),
84 DF_REF_IS_ARTIFICIAL (link->ref)
85 ? -1 : DF_REF_INSN_UID (link->ref));
86 }
87 fprintf (file, "}");
88 }
89
90
91 /* Print some basic block info as part of df_dump. */
92
93 void
94 df_print_bb_index (basic_block bb, FILE *file)
95 {
96 edge e;
97 edge_iterator ei;
98
99 fprintf (file, "\n( ");
100 FOR_EACH_EDGE (e, ei, bb->preds)
101 {
102 basic_block pred = e->src;
103 fprintf (file, "%d%s ", pred->index, e->flags & EDGE_EH ? "(EH)" : "");
104 }
105 fprintf (file, ")->[%d]->( ", bb->index);
106 FOR_EACH_EDGE (e, ei, bb->succs)
107 {
108 basic_block succ = e->dest;
109 fprintf (file, "%d%s ", succ->index, e->flags & EDGE_EH ? "(EH)" : "");
110 }
111 fprintf (file, ")\n");
112 }
113
114 \f
115 /*----------------------------------------------------------------------------
116 REACHING DEFINITIONS
117
118 Find the locations in the function where each definition site for a
119 pseudo reaches. In and out bitvectors are built for each basic
120 block. The id field in the ref is used to index into these sets.
121 See df.h for details.
122
123 If the DF_RD_PRUNE_DEAD_DEFS changeable flag is set, only DEFs reaching
124 existing uses are included in the global reaching DEFs set, or in other
125 words only DEFs that are still live. This is a kind of pruned version
126 of the traditional reaching definitions problem that is much less
127 complex to compute and produces enough information to compute UD-chains.
128 In this context, live must be interpreted in the DF_LR sense: Uses that
129 are upward exposed but maybe not initialized on all paths through the
130 CFG. For a USE that is not reached by a DEF on all paths, we still want
131 to make those DEFs that do reach the USE visible, and pruning based on
132 DF_LIVE would make that impossible.
133 ----------------------------------------------------------------------------*/
134
135 /* This problem plays a large number of games for the sake of
136 efficiency.
137
138 1) The order of the bits in the bitvectors. After the scanning
139 phase, all of the defs are sorted. All of the defs for the reg 0
140 are first, followed by all defs for reg 1 and so on.
141
142 2) There are two kill sets, one if the number of defs is less or
143 equal to DF_SPARSE_THRESHOLD and another if the number of defs is
144 greater.
145
146 <= : Data is built directly in the kill set.
147
148 > : One level of indirection is used to keep from generating long
149 strings of 1 bits in the kill sets. Bitvectors that are indexed
150 by the regnum are used to represent that there is a killing def
151 for the register. The confluence and transfer functions use
152 these along with the bitmap_clear_range call to remove ranges of
153 bits without actually generating a knockout vector.
154
155 The kill and sparse_kill and the dense_invalidated_by_call and
156 sparse_invalidated_by_call both play this game. */
157
158 /* Private data used to compute the solution for this problem. These
159 data structures are not accessible outside of this module. */
160 struct df_rd_problem_data
161 {
162 /* The set of defs to regs invalidated by call. */
163 bitmap_head sparse_invalidated_by_call;
164 /* The set of defs to regs invalidate by call for rd. */
165 bitmap_head dense_invalidated_by_call;
166 /* An obstack for the bitmaps we need for this problem. */
167 bitmap_obstack rd_bitmaps;
168 };
169
170
171 /* Free basic block info. */
172
173 static void
174 df_rd_free_bb_info (basic_block bb ATTRIBUTE_UNUSED,
175 void *vbb_info)
176 {
177 struct df_rd_bb_info *bb_info = (struct df_rd_bb_info *) vbb_info;
178 if (bb_info)
179 {
180 bitmap_clear (&bb_info->kill);
181 bitmap_clear (&bb_info->sparse_kill);
182 bitmap_clear (&bb_info->gen);
183 bitmap_clear (&bb_info->in);
184 bitmap_clear (&bb_info->out);
185 }
186 }
187
188
189 /* Allocate or reset bitmaps for DF_RD blocks. The solution bits are
190 not touched unless the block is new. */
191
192 static void
193 df_rd_alloc (bitmap all_blocks)
194 {
195 unsigned int bb_index;
196 bitmap_iterator bi;
197 struct df_rd_problem_data *problem_data;
198
199 if (df_rd->problem_data)
200 {
201 problem_data = (struct df_rd_problem_data *) df_rd->problem_data;
202 bitmap_clear (&problem_data->sparse_invalidated_by_call);
203 bitmap_clear (&problem_data->dense_invalidated_by_call);
204 }
205 else
206 {
207 problem_data = XNEW (struct df_rd_problem_data);
208 df_rd->problem_data = problem_data;
209
210 bitmap_obstack_initialize (&problem_data->rd_bitmaps);
211 bitmap_initialize (&problem_data->sparse_invalidated_by_call,
212 &problem_data->rd_bitmaps);
213 bitmap_initialize (&problem_data->dense_invalidated_by_call,
214 &problem_data->rd_bitmaps);
215 }
216
217 df_grow_bb_info (df_rd);
218
219 /* Because of the clustering of all use sites for the same pseudo,
220 we have to process all of the blocks before doing the analysis. */
221
222 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
223 {
224 struct df_rd_bb_info *bb_info = df_rd_get_bb_info (bb_index);
225
226 /* When bitmaps are already initialized, just clear them. */
227 if (bb_info->kill.obstack)
228 {
229 bitmap_clear (&bb_info->kill);
230 bitmap_clear (&bb_info->sparse_kill);
231 bitmap_clear (&bb_info->gen);
232 }
233 else
234 {
235 bitmap_initialize (&bb_info->kill, &problem_data->rd_bitmaps);
236 bitmap_initialize (&bb_info->sparse_kill, &problem_data->rd_bitmaps);
237 bitmap_initialize (&bb_info->gen, &problem_data->rd_bitmaps);
238 bitmap_initialize (&bb_info->in, &problem_data->rd_bitmaps);
239 bitmap_initialize (&bb_info->out, &problem_data->rd_bitmaps);
240 }
241 }
242 df_rd->optional_p = true;
243 }
244
245
246 /* Add the effect of the top artificial defs of BB to the reaching definitions
247 bitmap LOCAL_RD. */
248
249 void
250 df_rd_simulate_artificial_defs_at_top (basic_block bb, bitmap local_rd)
251 {
252 int bb_index = bb->index;
253 df_ref def;
254 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
255 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
256 {
257 unsigned int dregno = DF_REF_REGNO (def);
258 if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
259 bitmap_clear_range (local_rd,
260 DF_DEFS_BEGIN (dregno),
261 DF_DEFS_COUNT (dregno));
262 bitmap_set_bit (local_rd, DF_REF_ID (def));
263 }
264 }
265
266 /* Add the effect of the defs of INSN to the reaching definitions bitmap
267 LOCAL_RD. */
268
269 void
270 df_rd_simulate_one_insn (basic_block bb ATTRIBUTE_UNUSED, rtx_insn *insn,
271 bitmap local_rd)
272 {
273 df_ref def;
274
275 FOR_EACH_INSN_DEF (def, insn)
276 {
277 unsigned int dregno = DF_REF_REGNO (def);
278 if ((!(df->changeable_flags & DF_NO_HARD_REGS))
279 || (dregno >= FIRST_PSEUDO_REGISTER))
280 {
281 if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
282 bitmap_clear_range (local_rd,
283 DF_DEFS_BEGIN (dregno),
284 DF_DEFS_COUNT (dregno));
285 if (!(DF_REF_FLAGS (def)
286 & (DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER)))
287 bitmap_set_bit (local_rd, DF_REF_ID (def));
288 }
289 }
290 }
291
292 /* Process a list of DEFs for df_rd_bb_local_compute. This is a bit
293 more complicated than just simulating, because we must produce the
294 gen and kill sets and hence deal with the two possible representations
295 of kill sets. */
296
297 static void
298 df_rd_bb_local_compute_process_def (struct df_rd_bb_info *bb_info,
299 df_ref def,
300 int top_flag)
301 {
302 for (; def; def = DF_REF_NEXT_LOC (def))
303 {
304 if (top_flag == (DF_REF_FLAGS (def) & DF_REF_AT_TOP))
305 {
306 unsigned int regno = DF_REF_REGNO (def);
307 unsigned int begin = DF_DEFS_BEGIN (regno);
308 unsigned int n_defs = DF_DEFS_COUNT (regno);
309
310 if ((!(df->changeable_flags & DF_NO_HARD_REGS))
311 || (regno >= FIRST_PSEUDO_REGISTER))
312 {
313 /* Only the last def(s) for a regno in the block has any
314 effect. */
315 if (!bitmap_bit_p (&seen_in_block, regno))
316 {
317 /* The first def for regno in insn gets to knock out the
318 defs from other instructions. */
319 if ((!bitmap_bit_p (&seen_in_insn, regno))
320 /* If the def is to only part of the reg, it does
321 not kill the other defs that reach here. */
322 && (!(DF_REF_FLAGS (def) &
323 (DF_REF_PARTIAL | DF_REF_CONDITIONAL | DF_REF_MAY_CLOBBER))))
324 {
325 if (n_defs > DF_SPARSE_THRESHOLD)
326 {
327 bitmap_set_bit (&bb_info->sparse_kill, regno);
328 bitmap_clear_range (&bb_info->gen, begin, n_defs);
329 }
330 else
331 {
332 bitmap_set_range (&bb_info->kill, begin, n_defs);
333 bitmap_clear_range (&bb_info->gen, begin, n_defs);
334 }
335 }
336
337 bitmap_set_bit (&seen_in_insn, regno);
338 /* All defs for regno in the instruction may be put into
339 the gen set. */
340 if (!(DF_REF_FLAGS (def)
341 & (DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER)))
342 bitmap_set_bit (&bb_info->gen, DF_REF_ID (def));
343 }
344 }
345 }
346 }
347 }
348
349 /* Compute local reaching def info for basic block BB. */
350
351 static void
352 df_rd_bb_local_compute (unsigned int bb_index)
353 {
354 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
355 struct df_rd_bb_info *bb_info = df_rd_get_bb_info (bb_index);
356 rtx_insn *insn;
357
358 bitmap_clear (&seen_in_block);
359 bitmap_clear (&seen_in_insn);
360
361 /* Artificials are only hard regs. */
362 if (!(df->changeable_flags & DF_NO_HARD_REGS))
363 df_rd_bb_local_compute_process_def (bb_info,
364 df_get_artificial_defs (bb_index),
365 0);
366
367 FOR_BB_INSNS_REVERSE (bb, insn)
368 {
369 unsigned int uid = INSN_UID (insn);
370
371 if (!INSN_P (insn))
372 continue;
373
374 df_rd_bb_local_compute_process_def (bb_info,
375 DF_INSN_UID_DEFS (uid), 0);
376
377 /* This complex dance with the two bitmaps is required because
378 instructions can assign twice to the same pseudo. This
379 generally happens with calls that will have one def for the
380 result and another def for the clobber. If only one vector
381 is used and the clobber goes first, the result will be
382 lost. */
383 bitmap_ior_into (&seen_in_block, &seen_in_insn);
384 bitmap_clear (&seen_in_insn);
385 }
386
387 /* Process the artificial defs at the top of the block last since we
388 are going backwards through the block and these are logically at
389 the start. */
390 if (!(df->changeable_flags & DF_NO_HARD_REGS))
391 df_rd_bb_local_compute_process_def (bb_info,
392 df_get_artificial_defs (bb_index),
393 DF_REF_AT_TOP);
394 }
395
396
397 /* Compute local reaching def info for each basic block within BLOCKS. */
398
399 static void
400 df_rd_local_compute (bitmap all_blocks)
401 {
402 unsigned int bb_index;
403 bitmap_iterator bi;
404 unsigned int regno;
405 struct df_rd_problem_data *problem_data
406 = (struct df_rd_problem_data *) df_rd->problem_data;
407 bitmap sparse_invalidated = &problem_data->sparse_invalidated_by_call;
408 bitmap dense_invalidated = &problem_data->dense_invalidated_by_call;
409
410 bitmap_initialize (&seen_in_block, &df_bitmap_obstack);
411 bitmap_initialize (&seen_in_insn, &df_bitmap_obstack);
412
413 df_maybe_reorganize_def_refs (DF_REF_ORDER_BY_REG);
414
415 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
416 {
417 df_rd_bb_local_compute (bb_index);
418 }
419
420 /* Set up the knockout bit vectors to be applied across EH_EDGES. */
421 EXECUTE_IF_SET_IN_BITMAP (regs_invalidated_by_call_regset, 0, regno, bi)
422 {
423 if (! HARD_REGISTER_NUM_P (regno)
424 || !(df->changeable_flags & DF_NO_HARD_REGS))
425 {
426 if (DF_DEFS_COUNT (regno) > DF_SPARSE_THRESHOLD)
427 bitmap_set_bit (sparse_invalidated, regno);
428 else
429 bitmap_set_range (dense_invalidated,
430 DF_DEFS_BEGIN (regno),
431 DF_DEFS_COUNT (regno));
432 }
433 }
434
435 bitmap_clear (&seen_in_block);
436 bitmap_clear (&seen_in_insn);
437 }
438
439
440 /* Initialize the solution bit vectors for problem. */
441
442 static void
443 df_rd_init_solution (bitmap all_blocks)
444 {
445 unsigned int bb_index;
446 bitmap_iterator bi;
447
448 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
449 {
450 struct df_rd_bb_info *bb_info = df_rd_get_bb_info (bb_index);
451
452 bitmap_copy (&bb_info->out, &bb_info->gen);
453 bitmap_clear (&bb_info->in);
454 }
455 }
456
457 /* In of target gets or of out of source. */
458
459 static bool
460 df_rd_confluence_n (edge e)
461 {
462 bitmap op1 = &df_rd_get_bb_info (e->dest->index)->in;
463 bitmap op2 = &df_rd_get_bb_info (e->src->index)->out;
464 bool changed = false;
465
466 if (e->flags & EDGE_FAKE)
467 return false;
468
469 if (e->flags & EDGE_EH)
470 {
471 struct df_rd_problem_data *problem_data
472 = (struct df_rd_problem_data *) df_rd->problem_data;
473 bitmap sparse_invalidated = &problem_data->sparse_invalidated_by_call;
474 bitmap dense_invalidated = &problem_data->dense_invalidated_by_call;
475 bitmap_iterator bi;
476 unsigned int regno;
477 bitmap_head tmp;
478
479 bitmap_initialize (&tmp, &df_bitmap_obstack);
480 bitmap_and_compl (&tmp, op2, dense_invalidated);
481
482 EXECUTE_IF_SET_IN_BITMAP (sparse_invalidated, 0, regno, bi)
483 {
484 bitmap_clear_range (&tmp,
485 DF_DEFS_BEGIN (regno),
486 DF_DEFS_COUNT (regno));
487 }
488 changed |= bitmap_ior_into (op1, &tmp);
489 bitmap_clear (&tmp);
490 return changed;
491 }
492 else
493 return bitmap_ior_into (op1, op2);
494 }
495
496
497 /* Transfer function. */
498
499 static bool
500 df_rd_transfer_function (int bb_index)
501 {
502 struct df_rd_bb_info *bb_info = df_rd_get_bb_info (bb_index);
503 unsigned int regno;
504 bitmap_iterator bi;
505 bitmap in = &bb_info->in;
506 bitmap out = &bb_info->out;
507 bitmap gen = &bb_info->gen;
508 bitmap kill = &bb_info->kill;
509 bitmap sparse_kill = &bb_info->sparse_kill;
510 bool changed = false;
511
512 if (bitmap_empty_p (sparse_kill))
513 changed = bitmap_ior_and_compl (out, gen, in, kill);
514 else
515 {
516 struct df_rd_problem_data *problem_data;
517 bitmap_head tmp;
518
519 /* Note that TMP is _not_ a temporary bitmap if we end up replacing
520 OUT with TMP. Therefore, allocate TMP in the RD bitmaps obstack. */
521 problem_data = (struct df_rd_problem_data *) df_rd->problem_data;
522 bitmap_initialize (&tmp, &problem_data->rd_bitmaps);
523
524 bitmap_and_compl (&tmp, in, kill);
525 EXECUTE_IF_SET_IN_BITMAP (sparse_kill, 0, regno, bi)
526 {
527 bitmap_clear_range (&tmp,
528 DF_DEFS_BEGIN (regno),
529 DF_DEFS_COUNT (regno));
530 }
531 bitmap_ior_into (&tmp, gen);
532 changed = !bitmap_equal_p (&tmp, out);
533 if (changed)
534 {
535 bitmap_clear (out);
536 bb_info->out = tmp;
537 }
538 else
539 bitmap_clear (&tmp);
540 }
541
542 if (df->changeable_flags & DF_RD_PRUNE_DEAD_DEFS)
543 {
544 /* Create a mask of DEFs for all registers live at the end of this
545 basic block, and mask out DEFs of registers that are not live.
546 Computing the mask looks costly, but the benefit of the pruning
547 outweighs the cost. */
548 struct df_rd_bb_info *bb_info = df_rd_get_bb_info (bb_index);
549 bitmap regs_live_out = &df_lr_get_bb_info (bb_index)->out;
550 bitmap live_defs = BITMAP_ALLOC (&df_bitmap_obstack);
551 unsigned int regno;
552 bitmap_iterator bi;
553
554 EXECUTE_IF_SET_IN_BITMAP (regs_live_out, 0, regno, bi)
555 bitmap_set_range (live_defs,
556 DF_DEFS_BEGIN (regno),
557 DF_DEFS_COUNT (regno));
558 changed |= bitmap_and_into (&bb_info->out, live_defs);
559 BITMAP_FREE (live_defs);
560 }
561
562 return changed;
563 }
564
565 /* Free all storage associated with the problem. */
566
567 static void
568 df_rd_free (void)
569 {
570 struct df_rd_problem_data *problem_data
571 = (struct df_rd_problem_data *) df_rd->problem_data;
572
573 if (problem_data)
574 {
575 bitmap_obstack_release (&problem_data->rd_bitmaps);
576
577 df_rd->block_info_size = 0;
578 free (df_rd->block_info);
579 df_rd->block_info = NULL;
580 free (df_rd->problem_data);
581 }
582 free (df_rd);
583 }
584
585
586 /* Debugging info. */
587
588 static void
589 df_rd_start_dump (FILE *file)
590 {
591 struct df_rd_problem_data *problem_data
592 = (struct df_rd_problem_data *) df_rd->problem_data;
593 unsigned int m = DF_REG_SIZE (df);
594 unsigned int regno;
595
596 if (!df_rd->block_info)
597 return;
598
599 fprintf (file, ";; Reaching defs:\n");
600
601 fprintf (file, ";; sparse invalidated \t");
602 dump_bitmap (file, &problem_data->sparse_invalidated_by_call);
603 fprintf (file, ";; dense invalidated \t");
604 dump_bitmap (file, &problem_data->dense_invalidated_by_call);
605
606 fprintf (file, ";; reg->defs[] map:\t");
607 for (regno = 0; regno < m; regno++)
608 if (DF_DEFS_COUNT (regno))
609 fprintf (file, "%d[%d,%d] ", regno,
610 DF_DEFS_BEGIN (regno),
611 DF_DEFS_BEGIN (regno) + DF_DEFS_COUNT (regno) - 1);
612 fprintf (file, "\n");
613 }
614
615
616 static void
617 df_rd_dump_defs_set (bitmap defs_set, const char *prefix, FILE *file)
618 {
619 bitmap_head tmp;
620 unsigned int regno;
621 unsigned int m = DF_REG_SIZE (df);
622 bool first_reg = true;
623
624 fprintf (file, "%s\t(%d) ", prefix, (int) bitmap_count_bits (defs_set));
625
626 bitmap_initialize (&tmp, &df_bitmap_obstack);
627 for (regno = 0; regno < m; regno++)
628 {
629 if (HARD_REGISTER_NUM_P (regno)
630 && (df->changeable_flags & DF_NO_HARD_REGS))
631 continue;
632 bitmap_set_range (&tmp, DF_DEFS_BEGIN (regno), DF_DEFS_COUNT (regno));
633 bitmap_and_into (&tmp, defs_set);
634 if (! bitmap_empty_p (&tmp))
635 {
636 bitmap_iterator bi;
637 unsigned int ix;
638 bool first_def = true;
639
640 if (! first_reg)
641 fprintf (file, ",");
642 first_reg = false;
643
644 fprintf (file, "%u[", regno);
645 EXECUTE_IF_SET_IN_BITMAP (&tmp, 0, ix, bi)
646 {
647 fprintf (file, "%s%u", first_def ? "" : ",", ix);
648 first_def = false;
649 }
650 fprintf (file, "]");
651 }
652 bitmap_clear (&tmp);
653 }
654
655 fprintf (file, "\n");
656 bitmap_clear (&tmp);
657 }
658
659 /* Debugging info at top of bb. */
660
661 static void
662 df_rd_top_dump (basic_block bb, FILE *file)
663 {
664 struct df_rd_bb_info *bb_info = df_rd_get_bb_info (bb->index);
665 if (!bb_info)
666 return;
667
668 df_rd_dump_defs_set (&bb_info->in, ";; rd in ", file);
669 df_rd_dump_defs_set (&bb_info->gen, ";; rd gen ", file);
670 df_rd_dump_defs_set (&bb_info->kill, ";; rd kill", file);
671 }
672
673
674 /* Debugging info at bottom of bb. */
675
676 static void
677 df_rd_bottom_dump (basic_block bb, FILE *file)
678 {
679 struct df_rd_bb_info *bb_info = df_rd_get_bb_info (bb->index);
680 if (!bb_info)
681 return;
682
683 df_rd_dump_defs_set (&bb_info->out, ";; rd out ", file);
684 }
685
686 /* All of the information associated with every instance of the problem. */
687
688 static struct df_problem problem_RD =
689 {
690 DF_RD, /* Problem id. */
691 DF_FORWARD, /* Direction. */
692 df_rd_alloc, /* Allocate the problem specific data. */
693 NULL, /* Reset global information. */
694 df_rd_free_bb_info, /* Free basic block info. */
695 df_rd_local_compute, /* Local compute function. */
696 df_rd_init_solution, /* Init the solution specific data. */
697 df_worklist_dataflow, /* Worklist solver. */
698 NULL, /* Confluence operator 0. */
699 df_rd_confluence_n, /* Confluence operator n. */
700 df_rd_transfer_function, /* Transfer function. */
701 NULL, /* Finalize function. */
702 df_rd_free, /* Free all of the problem information. */
703 df_rd_free, /* Remove this problem from the stack of dataflow problems. */
704 df_rd_start_dump, /* Debugging. */
705 df_rd_top_dump, /* Debugging start block. */
706 df_rd_bottom_dump, /* Debugging end block. */
707 NULL, /* Debugging start insn. */
708 NULL, /* Debugging end insn. */
709 NULL, /* Incremental solution verify start. */
710 NULL, /* Incremental solution verify end. */
711 NULL, /* Dependent problem. */
712 sizeof (struct df_rd_bb_info),/* Size of entry of block_info array. */
713 TV_DF_RD, /* Timing variable. */
714 true /* Reset blocks on dropping out of blocks_to_analyze. */
715 };
716
717
718
719 /* Create a new RD instance and add it to the existing instance
720 of DF. */
721
722 void
723 df_rd_add_problem (void)
724 {
725 df_add_problem (&problem_RD);
726 }
727
728
729 \f
730 /*----------------------------------------------------------------------------
731 LIVE REGISTERS
732
733 Find the locations in the function where any use of a pseudo can
734 reach in the backwards direction. In and out bitvectors are built
735 for each basic block. The regno is used to index into these sets.
736 See df.h for details.
737 ----------------------------------------------------------------------------*/
738
739 /* Private data used to verify the solution for this problem. */
740 struct df_lr_problem_data
741 {
742 bitmap_head *in;
743 bitmap_head *out;
744 /* An obstack for the bitmaps we need for this problem. */
745 bitmap_obstack lr_bitmaps;
746 };
747
748 /* Free basic block info. */
749
750 static void
751 df_lr_free_bb_info (basic_block bb ATTRIBUTE_UNUSED,
752 void *vbb_info)
753 {
754 struct df_lr_bb_info *bb_info = (struct df_lr_bb_info *) vbb_info;
755 if (bb_info)
756 {
757 bitmap_clear (&bb_info->use);
758 bitmap_clear (&bb_info->def);
759 bitmap_clear (&bb_info->in);
760 bitmap_clear (&bb_info->out);
761 }
762 }
763
764
765 /* Allocate or reset bitmaps for DF_LR blocks. The solution bits are
766 not touched unless the block is new. */
767
768 static void
769 df_lr_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
770 {
771 unsigned int bb_index;
772 bitmap_iterator bi;
773 struct df_lr_problem_data *problem_data;
774
775 df_grow_bb_info (df_lr);
776 if (df_lr->problem_data)
777 problem_data = (struct df_lr_problem_data *) df_lr->problem_data;
778 else
779 {
780 problem_data = XNEW (struct df_lr_problem_data);
781 df_lr->problem_data = problem_data;
782
783 problem_data->out = NULL;
784 problem_data->in = NULL;
785 bitmap_obstack_initialize (&problem_data->lr_bitmaps);
786 }
787
788 EXECUTE_IF_SET_IN_BITMAP (df_lr->out_of_date_transfer_functions, 0, bb_index, bi)
789 {
790 struct df_lr_bb_info *bb_info = df_lr_get_bb_info (bb_index);
791
792 /* When bitmaps are already initialized, just clear them. */
793 if (bb_info->use.obstack)
794 {
795 bitmap_clear (&bb_info->def);
796 bitmap_clear (&bb_info->use);
797 }
798 else
799 {
800 bitmap_initialize (&bb_info->use, &problem_data->lr_bitmaps);
801 bitmap_initialize (&bb_info->def, &problem_data->lr_bitmaps);
802 bitmap_initialize (&bb_info->in, &problem_data->lr_bitmaps);
803 bitmap_initialize (&bb_info->out, &problem_data->lr_bitmaps);
804 }
805 }
806
807 df_lr->optional_p = false;
808 }
809
810
811 /* Reset the global solution for recalculation. */
812
813 static void
814 df_lr_reset (bitmap all_blocks)
815 {
816 unsigned int bb_index;
817 bitmap_iterator bi;
818
819 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
820 {
821 struct df_lr_bb_info *bb_info = df_lr_get_bb_info (bb_index);
822 gcc_assert (bb_info);
823 bitmap_clear (&bb_info->in);
824 bitmap_clear (&bb_info->out);
825 }
826 }
827
828
829 /* Compute local live register info for basic block BB. */
830
831 static void
832 df_lr_bb_local_compute (unsigned int bb_index)
833 {
834 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
835 struct df_lr_bb_info *bb_info = df_lr_get_bb_info (bb_index);
836 rtx_insn *insn;
837 df_ref def, use;
838
839 /* Process the registers set in an exception handler. */
840 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
841 if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) == 0)
842 {
843 unsigned int dregno = DF_REF_REGNO (def);
844 bitmap_set_bit (&bb_info->def, dregno);
845 bitmap_clear_bit (&bb_info->use, dregno);
846 }
847
848 /* Process the hardware registers that are always live. */
849 FOR_EACH_ARTIFICIAL_USE (use, bb_index)
850 /* Add use to set of uses in this BB. */
851 if ((DF_REF_FLAGS (use) & DF_REF_AT_TOP) == 0)
852 bitmap_set_bit (&bb_info->use, DF_REF_REGNO (use));
853
854 FOR_BB_INSNS_REVERSE (bb, insn)
855 {
856 if (!NONDEBUG_INSN_P (insn))
857 continue;
858
859 df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
860 FOR_EACH_INSN_INFO_DEF (def, insn_info)
861 /* If the def is to only part of the reg, it does
862 not kill the other defs that reach here. */
863 if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
864 {
865 unsigned int dregno = DF_REF_REGNO (def);
866 bitmap_set_bit (&bb_info->def, dregno);
867 bitmap_clear_bit (&bb_info->use, dregno);
868 }
869
870 FOR_EACH_INSN_INFO_USE (use, insn_info)
871 /* Add use to set of uses in this BB. */
872 bitmap_set_bit (&bb_info->use, DF_REF_REGNO (use));
873 }
874
875 /* Process the registers set in an exception handler or the hard
876 frame pointer if this block is the target of a non local
877 goto. */
878 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
879 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
880 {
881 unsigned int dregno = DF_REF_REGNO (def);
882 bitmap_set_bit (&bb_info->def, dregno);
883 bitmap_clear_bit (&bb_info->use, dregno);
884 }
885
886 #ifdef EH_USES
887 /* Process the uses that are live into an exception handler. */
888 FOR_EACH_ARTIFICIAL_USE (use, bb_index)
889 /* Add use to set of uses in this BB. */
890 if (DF_REF_FLAGS (use) & DF_REF_AT_TOP)
891 bitmap_set_bit (&bb_info->use, DF_REF_REGNO (use));
892 #endif
893
894 /* If the df_live problem is not defined, such as at -O0 and -O1, we
895 still need to keep the luids up to date. This is normally done
896 in the df_live problem since this problem has a forwards
897 scan. */
898 if (!df_live)
899 df_recompute_luids (bb);
900 }
901
902
903 /* Compute local live register info for each basic block within BLOCKS. */
904
905 static void
906 df_lr_local_compute (bitmap all_blocks ATTRIBUTE_UNUSED)
907 {
908 unsigned int bb_index, i;
909 bitmap_iterator bi;
910
911 bitmap_clear (&df->hardware_regs_used);
912
913 /* The all-important stack pointer must always be live. */
914 bitmap_set_bit (&df->hardware_regs_used, STACK_POINTER_REGNUM);
915
916 /* Global regs are always live, too. */
917 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
918 if (global_regs[i])
919 bitmap_set_bit (&df->hardware_regs_used, i);
920
921 /* Before reload, there are a few registers that must be forced
922 live everywhere -- which might not already be the case for
923 blocks within infinite loops. */
924 if (!reload_completed)
925 {
926 unsigned int pic_offset_table_regnum = PIC_OFFSET_TABLE_REGNUM;
927 /* Any reference to any pseudo before reload is a potential
928 reference of the frame pointer. */
929 bitmap_set_bit (&df->hardware_regs_used, FRAME_POINTER_REGNUM);
930
931 /* Pseudos with argument area equivalences may require
932 reloading via the argument pointer. */
933 if (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
934 && fixed_regs[ARG_POINTER_REGNUM])
935 bitmap_set_bit (&df->hardware_regs_used, ARG_POINTER_REGNUM);
936
937 /* Any constant, or pseudo with constant equivalences, may
938 require reloading from memory using the pic register. */
939 if (pic_offset_table_regnum != INVALID_REGNUM
940 && fixed_regs[pic_offset_table_regnum])
941 bitmap_set_bit (&df->hardware_regs_used, pic_offset_table_regnum);
942 }
943
944 EXECUTE_IF_SET_IN_BITMAP (df_lr->out_of_date_transfer_functions, 0, bb_index, bi)
945 {
946 if (bb_index == EXIT_BLOCK)
947 {
948 /* The exit block is special for this problem and its bits are
949 computed from thin air. */
950 struct df_lr_bb_info *bb_info = df_lr_get_bb_info (EXIT_BLOCK);
951 bitmap_copy (&bb_info->use, df->exit_block_uses);
952 }
953 else
954 df_lr_bb_local_compute (bb_index);
955 }
956
957 bitmap_clear (df_lr->out_of_date_transfer_functions);
958 }
959
960
961 /* Initialize the solution vectors. */
962
963 static void
964 df_lr_init (bitmap all_blocks)
965 {
966 unsigned int bb_index;
967 bitmap_iterator bi;
968
969 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
970 {
971 struct df_lr_bb_info *bb_info = df_lr_get_bb_info (bb_index);
972 bitmap_copy (&bb_info->in, &bb_info->use);
973 bitmap_clear (&bb_info->out);
974 }
975 }
976
977
978 /* Confluence function that processes infinite loops. This might be a
979 noreturn function that throws. And even if it isn't, getting the
980 unwind info right helps debugging. */
981 static void
982 df_lr_confluence_0 (basic_block bb)
983 {
984 bitmap op1 = &df_lr_get_bb_info (bb->index)->out;
985 if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
986 bitmap_copy (op1, &df->hardware_regs_used);
987 }
988
989
990 /* Confluence function that ignores fake edges. */
991
992 static bool
993 df_lr_confluence_n (edge e)
994 {
995 bitmap op1 = &df_lr_get_bb_info (e->src->index)->out;
996 bitmap op2 = &df_lr_get_bb_info (e->dest->index)->in;
997 bool changed = false;
998
999 /* Call-clobbered registers die across exception and call edges. */
1000 /* ??? Abnormal call edges ignored for the moment, as this gets
1001 confused by sibling call edges, which crashes reg-stack. */
1002 if (e->flags & EDGE_EH)
1003 changed = bitmap_ior_and_compl_into (op1, op2, regs_invalidated_by_call_regset);
1004 else
1005 changed = bitmap_ior_into (op1, op2);
1006
1007 changed |= bitmap_ior_into (op1, &df->hardware_regs_used);
1008 return changed;
1009 }
1010
1011
1012 /* Transfer function. */
1013
1014 static bool
1015 df_lr_transfer_function (int bb_index)
1016 {
1017 struct df_lr_bb_info *bb_info = df_lr_get_bb_info (bb_index);
1018 bitmap in = &bb_info->in;
1019 bitmap out = &bb_info->out;
1020 bitmap use = &bb_info->use;
1021 bitmap def = &bb_info->def;
1022
1023 return bitmap_ior_and_compl (in, use, out, def);
1024 }
1025
1026
1027 /* Run the fast dce as a side effect of building LR. */
1028
1029 static void
1030 df_lr_finalize (bitmap all_blocks)
1031 {
1032 df_lr->solutions_dirty = false;
1033 if (df->changeable_flags & DF_LR_RUN_DCE)
1034 {
1035 run_fast_df_dce ();
1036
1037 /* If dce deletes some instructions, we need to recompute the lr
1038 solution before proceeding further. The problem is that fast
1039 dce is a pessimestic dataflow algorithm. In the case where
1040 it deletes a statement S inside of a loop, the uses inside of
1041 S may not be deleted from the dataflow solution because they
1042 were carried around the loop. While it is conservatively
1043 correct to leave these extra bits, the standards of df
1044 require that we maintain the best possible (least fixed
1045 point) solution. The only way to do that is to redo the
1046 iteration from the beginning. See PR35805 for an
1047 example. */
1048 if (df_lr->solutions_dirty)
1049 {
1050 df_clear_flags (DF_LR_RUN_DCE);
1051 df_lr_alloc (all_blocks);
1052 df_lr_local_compute (all_blocks);
1053 df_worklist_dataflow (df_lr, all_blocks, df->postorder, df->n_blocks);
1054 df_lr_finalize (all_blocks);
1055 df_set_flags (DF_LR_RUN_DCE);
1056 }
1057 }
1058 }
1059
1060
1061 /* Free all storage associated with the problem. */
1062
1063 static void
1064 df_lr_free (void)
1065 {
1066 struct df_lr_problem_data *problem_data
1067 = (struct df_lr_problem_data *) df_lr->problem_data;
1068 if (df_lr->block_info)
1069 {
1070
1071 df_lr->block_info_size = 0;
1072 free (df_lr->block_info);
1073 df_lr->block_info = NULL;
1074 bitmap_obstack_release (&problem_data->lr_bitmaps);
1075 free (df_lr->problem_data);
1076 df_lr->problem_data = NULL;
1077 }
1078
1079 BITMAP_FREE (df_lr->out_of_date_transfer_functions);
1080 free (df_lr);
1081 }
1082
1083
1084 /* Debugging info at top of bb. */
1085
1086 static void
1087 df_lr_top_dump (basic_block bb, FILE *file)
1088 {
1089 struct df_lr_bb_info *bb_info = df_lr_get_bb_info (bb->index);
1090 struct df_lr_problem_data *problem_data;
1091 if (!bb_info)
1092 return;
1093
1094 fprintf (file, ";; lr in \t");
1095 df_print_regset (file, &bb_info->in);
1096 if (df_lr->problem_data)
1097 {
1098 problem_data = (struct df_lr_problem_data *)df_lr->problem_data;
1099 if (problem_data->in)
1100 {
1101 fprintf (file, ";; old in \t");
1102 df_print_regset (file, &problem_data->in[bb->index]);
1103 }
1104 }
1105 fprintf (file, ";; lr use \t");
1106 df_print_regset (file, &bb_info->use);
1107 fprintf (file, ";; lr def \t");
1108 df_print_regset (file, &bb_info->def);
1109 }
1110
1111
1112 /* Debugging info at bottom of bb. */
1113
1114 static void
1115 df_lr_bottom_dump (basic_block bb, FILE *file)
1116 {
1117 struct df_lr_bb_info *bb_info = df_lr_get_bb_info (bb->index);
1118 struct df_lr_problem_data *problem_data;
1119 if (!bb_info)
1120 return;
1121
1122 fprintf (file, ";; lr out \t");
1123 df_print_regset (file, &bb_info->out);
1124 if (df_lr->problem_data)
1125 {
1126 problem_data = (struct df_lr_problem_data *)df_lr->problem_data;
1127 if (problem_data->out)
1128 {
1129 fprintf (file, ";; old out \t");
1130 df_print_regset (file, &problem_data->out[bb->index]);
1131 }
1132 }
1133 }
1134
1135
1136 /* Build the datastructure to verify that the solution to the dataflow
1137 equations is not dirty. */
1138
1139 static void
1140 df_lr_verify_solution_start (void)
1141 {
1142 basic_block bb;
1143 struct df_lr_problem_data *problem_data;
1144 if (df_lr->solutions_dirty)
1145 return;
1146
1147 /* Set it true so that the solution is recomputed. */
1148 df_lr->solutions_dirty = true;
1149
1150 problem_data = (struct df_lr_problem_data *)df_lr->problem_data;
1151 problem_data->in = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun));
1152 problem_data->out = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun));
1153
1154 FOR_ALL_BB_FN (bb, cfun)
1155 {
1156 bitmap_initialize (&problem_data->in[bb->index], &problem_data->lr_bitmaps);
1157 bitmap_initialize (&problem_data->out[bb->index], &problem_data->lr_bitmaps);
1158 bitmap_copy (&problem_data->in[bb->index], DF_LR_IN (bb));
1159 bitmap_copy (&problem_data->out[bb->index], DF_LR_OUT (bb));
1160 }
1161 }
1162
1163
1164 /* Compare the saved datastructure and the new solution to the dataflow
1165 equations. */
1166
1167 static void
1168 df_lr_verify_solution_end (void)
1169 {
1170 struct df_lr_problem_data *problem_data;
1171 basic_block bb;
1172
1173 problem_data = (struct df_lr_problem_data *)df_lr->problem_data;
1174
1175 if (!problem_data->out)
1176 return;
1177
1178 if (df_lr->solutions_dirty)
1179 /* Do not check if the solution is still dirty. See the comment
1180 in df_lr_finalize for details. */
1181 df_lr->solutions_dirty = false;
1182 else
1183 FOR_ALL_BB_FN (bb, cfun)
1184 {
1185 if ((!bitmap_equal_p (&problem_data->in[bb->index], DF_LR_IN (bb)))
1186 || (!bitmap_equal_p (&problem_data->out[bb->index], DF_LR_OUT (bb))))
1187 {
1188 /*df_dump (stderr);*/
1189 gcc_unreachable ();
1190 }
1191 }
1192
1193 /* Cannot delete them immediately because you may want to dump them
1194 if the comparison fails. */
1195 FOR_ALL_BB_FN (bb, cfun)
1196 {
1197 bitmap_clear (&problem_data->in[bb->index]);
1198 bitmap_clear (&problem_data->out[bb->index]);
1199 }
1200
1201 free (problem_data->in);
1202 free (problem_data->out);
1203 problem_data->in = NULL;
1204 problem_data->out = NULL;
1205 }
1206
1207
1208 /* All of the information associated with every instance of the problem. */
1209
1210 static struct df_problem problem_LR =
1211 {
1212 DF_LR, /* Problem id. */
1213 DF_BACKWARD, /* Direction. */
1214 df_lr_alloc, /* Allocate the problem specific data. */
1215 df_lr_reset, /* Reset global information. */
1216 df_lr_free_bb_info, /* Free basic block info. */
1217 df_lr_local_compute, /* Local compute function. */
1218 df_lr_init, /* Init the solution specific data. */
1219 df_worklist_dataflow, /* Worklist solver. */
1220 df_lr_confluence_0, /* Confluence operator 0. */
1221 df_lr_confluence_n, /* Confluence operator n. */
1222 df_lr_transfer_function, /* Transfer function. */
1223 df_lr_finalize, /* Finalize function. */
1224 df_lr_free, /* Free all of the problem information. */
1225 NULL, /* Remove this problem from the stack of dataflow problems. */
1226 NULL, /* Debugging. */
1227 df_lr_top_dump, /* Debugging start block. */
1228 df_lr_bottom_dump, /* Debugging end block. */
1229 NULL, /* Debugging start insn. */
1230 NULL, /* Debugging end insn. */
1231 df_lr_verify_solution_start,/* Incremental solution verify start. */
1232 df_lr_verify_solution_end, /* Incremental solution verify end. */
1233 NULL, /* Dependent problem. */
1234 sizeof (struct df_lr_bb_info),/* Size of entry of block_info array. */
1235 TV_DF_LR, /* Timing variable. */
1236 false /* Reset blocks on dropping out of blocks_to_analyze. */
1237 };
1238
1239
1240 /* Create a new DATAFLOW instance and add it to an existing instance
1241 of DF. The returned structure is what is used to get at the
1242 solution. */
1243
1244 void
1245 df_lr_add_problem (void)
1246 {
1247 df_add_problem (&problem_LR);
1248 /* These will be initialized when df_scan_blocks processes each
1249 block. */
1250 df_lr->out_of_date_transfer_functions = BITMAP_ALLOC (&df_bitmap_obstack);
1251 }
1252
1253
1254 /* Verify that all of the lr related info is consistent and
1255 correct. */
1256
1257 void
1258 df_lr_verify_transfer_functions (void)
1259 {
1260 basic_block bb;
1261 bitmap_head saved_def;
1262 bitmap_head saved_use;
1263 bitmap_head all_blocks;
1264
1265 if (!df)
1266 return;
1267
1268 bitmap_initialize (&saved_def, &bitmap_default_obstack);
1269 bitmap_initialize (&saved_use, &bitmap_default_obstack);
1270 bitmap_initialize (&all_blocks, &bitmap_default_obstack);
1271
1272 FOR_ALL_BB_FN (bb, cfun)
1273 {
1274 struct df_lr_bb_info *bb_info = df_lr_get_bb_info (bb->index);
1275 bitmap_set_bit (&all_blocks, bb->index);
1276
1277 if (bb_info)
1278 {
1279 /* Make a copy of the transfer functions and then compute
1280 new ones to see if the transfer functions have
1281 changed. */
1282 if (!bitmap_bit_p (df_lr->out_of_date_transfer_functions,
1283 bb->index))
1284 {
1285 bitmap_copy (&saved_def, &bb_info->def);
1286 bitmap_copy (&saved_use, &bb_info->use);
1287 bitmap_clear (&bb_info->def);
1288 bitmap_clear (&bb_info->use);
1289
1290 df_lr_bb_local_compute (bb->index);
1291 gcc_assert (bitmap_equal_p (&saved_def, &bb_info->def));
1292 gcc_assert (bitmap_equal_p (&saved_use, &bb_info->use));
1293 }
1294 }
1295 else
1296 {
1297 /* If we do not have basic block info, the block must be in
1298 the list of dirty blocks or else some one has added a
1299 block behind our backs. */
1300 gcc_assert (bitmap_bit_p (df_lr->out_of_date_transfer_functions,
1301 bb->index));
1302 }
1303 /* Make sure no one created a block without following
1304 procedures. */
1305 gcc_assert (df_scan_get_bb_info (bb->index));
1306 }
1307
1308 /* Make sure there are no dirty bits in blocks that have been deleted. */
1309 gcc_assert (!bitmap_intersect_compl_p (df_lr->out_of_date_transfer_functions,
1310 &all_blocks));
1311
1312 bitmap_clear (&saved_def);
1313 bitmap_clear (&saved_use);
1314 bitmap_clear (&all_blocks);
1315 }
1316
1317
1318 \f
1319 /*----------------------------------------------------------------------------
1320 LIVE AND MUST-INITIALIZED REGISTERS.
1321
1322 This problem first computes the IN and OUT bitvectors for the
1323 must-initialized registers problems, which is a forward problem.
1324 It gives the set of registers for which we MUST have an available
1325 definition on any path from the entry block to the entry/exit of
1326 a basic block. Sets generate a definition, while clobbers kill
1327 a definition.
1328
1329 In and out bitvectors are built for each basic block and are indexed by
1330 regnum (see df.h for details). In and out bitvectors in struct
1331 df_live_bb_info actually refers to the must-initialized problem;
1332
1333 Then, the in and out sets for the LIVE problem itself are computed.
1334 These are the logical AND of the IN and OUT sets from the LR problem
1335 and the must-initialized problem.
1336 ----------------------------------------------------------------------------*/
1337
1338 /* Private data used to verify the solution for this problem. */
1339 struct df_live_problem_data
1340 {
1341 bitmap_head *in;
1342 bitmap_head *out;
1343 /* An obstack for the bitmaps we need for this problem. */
1344 bitmap_obstack live_bitmaps;
1345 };
1346
1347 /* Scratch var used by transfer functions. This is used to implement
1348 an optimization to reduce the amount of space used to compute the
1349 combined lr and live analysis. */
1350 static bitmap_head df_live_scratch;
1351
1352
1353 /* Free basic block info. */
1354
1355 static void
1356 df_live_free_bb_info (basic_block bb ATTRIBUTE_UNUSED,
1357 void *vbb_info)
1358 {
1359 struct df_live_bb_info *bb_info = (struct df_live_bb_info *) vbb_info;
1360 if (bb_info)
1361 {
1362 bitmap_clear (&bb_info->gen);
1363 bitmap_clear (&bb_info->kill);
1364 bitmap_clear (&bb_info->in);
1365 bitmap_clear (&bb_info->out);
1366 }
1367 }
1368
1369
1370 /* Allocate or reset bitmaps for DF_LIVE blocks. The solution bits are
1371 not touched unless the block is new. */
1372
1373 static void
1374 df_live_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
1375 {
1376 unsigned int bb_index;
1377 bitmap_iterator bi;
1378 struct df_live_problem_data *problem_data;
1379
1380 if (df_live->problem_data)
1381 problem_data = (struct df_live_problem_data *) df_live->problem_data;
1382 else
1383 {
1384 problem_data = XNEW (struct df_live_problem_data);
1385 df_live->problem_data = problem_data;
1386
1387 problem_data->out = NULL;
1388 problem_data->in = NULL;
1389 bitmap_obstack_initialize (&problem_data->live_bitmaps);
1390 bitmap_initialize (&df_live_scratch, &problem_data->live_bitmaps);
1391 }
1392
1393 df_grow_bb_info (df_live);
1394
1395 EXECUTE_IF_SET_IN_BITMAP (df_live->out_of_date_transfer_functions, 0, bb_index, bi)
1396 {
1397 struct df_live_bb_info *bb_info = df_live_get_bb_info (bb_index);
1398
1399 /* When bitmaps are already initialized, just clear them. */
1400 if (bb_info->kill.obstack)
1401 {
1402 bitmap_clear (&bb_info->kill);
1403 bitmap_clear (&bb_info->gen);
1404 }
1405 else
1406 {
1407 bitmap_initialize (&bb_info->kill, &problem_data->live_bitmaps);
1408 bitmap_initialize (&bb_info->gen, &problem_data->live_bitmaps);
1409 bitmap_initialize (&bb_info->in, &problem_data->live_bitmaps);
1410 bitmap_initialize (&bb_info->out, &problem_data->live_bitmaps);
1411 }
1412 }
1413 df_live->optional_p = (optimize <= 1);
1414 }
1415
1416
1417 /* Reset the global solution for recalculation. */
1418
1419 static void
1420 df_live_reset (bitmap all_blocks)
1421 {
1422 unsigned int bb_index;
1423 bitmap_iterator bi;
1424
1425 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
1426 {
1427 struct df_live_bb_info *bb_info = df_live_get_bb_info (bb_index);
1428 gcc_assert (bb_info);
1429 bitmap_clear (&bb_info->in);
1430 bitmap_clear (&bb_info->out);
1431 }
1432 }
1433
1434
1435 /* Compute local uninitialized register info for basic block BB. */
1436
1437 static void
1438 df_live_bb_local_compute (unsigned int bb_index)
1439 {
1440 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
1441 struct df_live_bb_info *bb_info = df_live_get_bb_info (bb_index);
1442 rtx_insn *insn;
1443 df_ref def;
1444 int luid = 0;
1445
1446 FOR_BB_INSNS (bb, insn)
1447 {
1448 unsigned int uid = INSN_UID (insn);
1449 struct df_insn_info *insn_info = DF_INSN_UID_GET (uid);
1450
1451 /* Inserting labels does not always trigger the incremental
1452 rescanning. */
1453 if (!insn_info)
1454 {
1455 gcc_assert (!INSN_P (insn));
1456 insn_info = df_insn_create_insn_record (insn);
1457 }
1458
1459 DF_INSN_INFO_LUID (insn_info) = luid;
1460 if (!INSN_P (insn))
1461 continue;
1462
1463 luid++;
1464 FOR_EACH_INSN_INFO_DEF (def, insn_info)
1465 {
1466 unsigned int regno = DF_REF_REGNO (def);
1467
1468 if (DF_REF_FLAGS_IS_SET (def,
1469 DF_REF_PARTIAL | DF_REF_CONDITIONAL))
1470 /* All partial or conditional def
1471 seen are included in the gen set. */
1472 bitmap_set_bit (&bb_info->gen, regno);
1473 else if (DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER))
1474 /* Only must clobbers for the entire reg destroy the
1475 value. */
1476 bitmap_set_bit (&bb_info->kill, regno);
1477 else if (! DF_REF_FLAGS_IS_SET (def, DF_REF_MAY_CLOBBER))
1478 bitmap_set_bit (&bb_info->gen, regno);
1479 }
1480 }
1481
1482 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
1483 bitmap_set_bit (&bb_info->gen, DF_REF_REGNO (def));
1484 }
1485
1486
1487 /* Compute local uninitialized register info. */
1488
1489 static void
1490 df_live_local_compute (bitmap all_blocks ATTRIBUTE_UNUSED)
1491 {
1492 unsigned int bb_index;
1493 bitmap_iterator bi;
1494
1495 df_grow_insn_info ();
1496
1497 EXECUTE_IF_SET_IN_BITMAP (df_live->out_of_date_transfer_functions,
1498 0, bb_index, bi)
1499 {
1500 df_live_bb_local_compute (bb_index);
1501 }
1502
1503 bitmap_clear (df_live->out_of_date_transfer_functions);
1504 }
1505
1506
1507 /* Initialize the solution vectors. */
1508
1509 static void
1510 df_live_init (bitmap all_blocks)
1511 {
1512 unsigned int bb_index;
1513 bitmap_iterator bi;
1514
1515 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
1516 {
1517 struct df_live_bb_info *bb_info = df_live_get_bb_info (bb_index);
1518 struct df_lr_bb_info *bb_lr_info = df_lr_get_bb_info (bb_index);
1519
1520 /* No register may reach a location where it is not used. Thus
1521 we trim the rr result to the places where it is used. */
1522 bitmap_and (&bb_info->out, &bb_info->gen, &bb_lr_info->out);
1523 bitmap_clear (&bb_info->in);
1524 }
1525 }
1526
1527 /* Forward confluence function that ignores fake edges. */
1528
1529 static bool
1530 df_live_confluence_n (edge e)
1531 {
1532 bitmap op1 = &df_live_get_bb_info (e->dest->index)->in;
1533 bitmap op2 = &df_live_get_bb_info (e->src->index)->out;
1534
1535 if (e->flags & EDGE_FAKE)
1536 return false;
1537
1538 return bitmap_ior_into (op1, op2);
1539 }
1540
1541
1542 /* Transfer function for the forwards must-initialized problem. */
1543
1544 static bool
1545 df_live_transfer_function (int bb_index)
1546 {
1547 struct df_live_bb_info *bb_info = df_live_get_bb_info (bb_index);
1548 struct df_lr_bb_info *bb_lr_info = df_lr_get_bb_info (bb_index);
1549 bitmap in = &bb_info->in;
1550 bitmap out = &bb_info->out;
1551 bitmap gen = &bb_info->gen;
1552 bitmap kill = &bb_info->kill;
1553
1554 /* We need to use a scratch set here so that the value returned from this
1555 function invocation properly reflects whether the sets changed in a
1556 significant way; i.e. not just because the lr set was anded in. */
1557 bitmap_and (&df_live_scratch, gen, &bb_lr_info->out);
1558 /* No register may reach a location where it is not used. Thus
1559 we trim the rr result to the places where it is used. */
1560 bitmap_and_into (in, &bb_lr_info->in);
1561
1562 return bitmap_ior_and_compl (out, &df_live_scratch, in, kill);
1563 }
1564
1565
1566 /* And the LR info with the must-initialized registers, to produce the LIVE info. */
1567
1568 static void
1569 df_live_finalize (bitmap all_blocks)
1570 {
1571
1572 if (df_live->solutions_dirty)
1573 {
1574 bitmap_iterator bi;
1575 unsigned int bb_index;
1576
1577 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
1578 {
1579 struct df_lr_bb_info *bb_lr_info = df_lr_get_bb_info (bb_index);
1580 struct df_live_bb_info *bb_live_info = df_live_get_bb_info (bb_index);
1581
1582 /* No register may reach a location where it is not used. Thus
1583 we trim the rr result to the places where it is used. */
1584 bitmap_and_into (&bb_live_info->in, &bb_lr_info->in);
1585 bitmap_and_into (&bb_live_info->out, &bb_lr_info->out);
1586 }
1587
1588 df_live->solutions_dirty = false;
1589 }
1590 }
1591
1592
1593 /* Free all storage associated with the problem. */
1594
1595 static void
1596 df_live_free (void)
1597 {
1598 struct df_live_problem_data *problem_data
1599 = (struct df_live_problem_data *) df_live->problem_data;
1600 if (df_live->block_info)
1601 {
1602 df_live->block_info_size = 0;
1603 free (df_live->block_info);
1604 df_live->block_info = NULL;
1605 bitmap_clear (&df_live_scratch);
1606 bitmap_obstack_release (&problem_data->live_bitmaps);
1607 free (problem_data);
1608 df_live->problem_data = NULL;
1609 }
1610 BITMAP_FREE (df_live->out_of_date_transfer_functions);
1611 free (df_live);
1612 }
1613
1614
1615 /* Debugging info at top of bb. */
1616
1617 static void
1618 df_live_top_dump (basic_block bb, FILE *file)
1619 {
1620 struct df_live_bb_info *bb_info = df_live_get_bb_info (bb->index);
1621 struct df_live_problem_data *problem_data;
1622
1623 if (!bb_info)
1624 return;
1625
1626 fprintf (file, ";; live in \t");
1627 df_print_regset (file, &bb_info->in);
1628 if (df_live->problem_data)
1629 {
1630 problem_data = (struct df_live_problem_data *)df_live->problem_data;
1631 if (problem_data->in)
1632 {
1633 fprintf (file, ";; old in \t");
1634 df_print_regset (file, &problem_data->in[bb->index]);
1635 }
1636 }
1637 fprintf (file, ";; live gen \t");
1638 df_print_regset (file, &bb_info->gen);
1639 fprintf (file, ";; live kill\t");
1640 df_print_regset (file, &bb_info->kill);
1641 }
1642
1643
1644 /* Debugging info at bottom of bb. */
1645
1646 static void
1647 df_live_bottom_dump (basic_block bb, FILE *file)
1648 {
1649 struct df_live_bb_info *bb_info = df_live_get_bb_info (bb->index);
1650 struct df_live_problem_data *problem_data;
1651
1652 if (!bb_info)
1653 return;
1654
1655 fprintf (file, ";; live out \t");
1656 df_print_regset (file, &bb_info->out);
1657 if (df_live->problem_data)
1658 {
1659 problem_data = (struct df_live_problem_data *)df_live->problem_data;
1660 if (problem_data->out)
1661 {
1662 fprintf (file, ";; old out \t");
1663 df_print_regset (file, &problem_data->out[bb->index]);
1664 }
1665 }
1666 }
1667
1668
1669 /* Build the datastructure to verify that the solution to the dataflow
1670 equations is not dirty. */
1671
1672 static void
1673 df_live_verify_solution_start (void)
1674 {
1675 basic_block bb;
1676 struct df_live_problem_data *problem_data;
1677 if (df_live->solutions_dirty)
1678 return;
1679
1680 /* Set it true so that the solution is recomputed. */
1681 df_live->solutions_dirty = true;
1682
1683 problem_data = (struct df_live_problem_data *)df_live->problem_data;
1684 problem_data->in = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun));
1685 problem_data->out = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun));
1686
1687 FOR_ALL_BB_FN (bb, cfun)
1688 {
1689 bitmap_initialize (&problem_data->in[bb->index], &problem_data->live_bitmaps);
1690 bitmap_initialize (&problem_data->out[bb->index], &problem_data->live_bitmaps);
1691 bitmap_copy (&problem_data->in[bb->index], DF_LIVE_IN (bb));
1692 bitmap_copy (&problem_data->out[bb->index], DF_LIVE_OUT (bb));
1693 }
1694 }
1695
1696
1697 /* Compare the saved datastructure and the new solution to the dataflow
1698 equations. */
1699
1700 static void
1701 df_live_verify_solution_end (void)
1702 {
1703 struct df_live_problem_data *problem_data;
1704 basic_block bb;
1705
1706 problem_data = (struct df_live_problem_data *)df_live->problem_data;
1707 if (!problem_data->out)
1708 return;
1709
1710 FOR_ALL_BB_FN (bb, cfun)
1711 {
1712 if ((!bitmap_equal_p (&problem_data->in[bb->index], DF_LIVE_IN (bb)))
1713 || (!bitmap_equal_p (&problem_data->out[bb->index], DF_LIVE_OUT (bb))))
1714 {
1715 /*df_dump (stderr);*/
1716 gcc_unreachable ();
1717 }
1718 }
1719
1720 /* Cannot delete them immediately because you may want to dump them
1721 if the comparison fails. */
1722 FOR_ALL_BB_FN (bb, cfun)
1723 {
1724 bitmap_clear (&problem_data->in[bb->index]);
1725 bitmap_clear (&problem_data->out[bb->index]);
1726 }
1727
1728 free (problem_data->in);
1729 free (problem_data->out);
1730 free (problem_data);
1731 df_live->problem_data = NULL;
1732 }
1733
1734
1735 /* All of the information associated with every instance of the problem. */
1736
1737 static struct df_problem problem_LIVE =
1738 {
1739 DF_LIVE, /* Problem id. */
1740 DF_FORWARD, /* Direction. */
1741 df_live_alloc, /* Allocate the problem specific data. */
1742 df_live_reset, /* Reset global information. */
1743 df_live_free_bb_info, /* Free basic block info. */
1744 df_live_local_compute, /* Local compute function. */
1745 df_live_init, /* Init the solution specific data. */
1746 df_worklist_dataflow, /* Worklist solver. */
1747 NULL, /* Confluence operator 0. */
1748 df_live_confluence_n, /* Confluence operator n. */
1749 df_live_transfer_function, /* Transfer function. */
1750 df_live_finalize, /* Finalize function. */
1751 df_live_free, /* Free all of the problem information. */
1752 df_live_free, /* Remove this problem from the stack of dataflow problems. */
1753 NULL, /* Debugging. */
1754 df_live_top_dump, /* Debugging start block. */
1755 df_live_bottom_dump, /* Debugging end block. */
1756 NULL, /* Debugging start insn. */
1757 NULL, /* Debugging end insn. */
1758 df_live_verify_solution_start,/* Incremental solution verify start. */
1759 df_live_verify_solution_end, /* Incremental solution verify end. */
1760 &problem_LR, /* Dependent problem. */
1761 sizeof (struct df_live_bb_info),/* Size of entry of block_info array. */
1762 TV_DF_LIVE, /* Timing variable. */
1763 false /* Reset blocks on dropping out of blocks_to_analyze. */
1764 };
1765
1766
1767 /* Create a new DATAFLOW instance and add it to an existing instance
1768 of DF. The returned structure is what is used to get at the
1769 solution. */
1770
1771 void
1772 df_live_add_problem (void)
1773 {
1774 df_add_problem (&problem_LIVE);
1775 /* These will be initialized when df_scan_blocks processes each
1776 block. */
1777 df_live->out_of_date_transfer_functions = BITMAP_ALLOC (&df_bitmap_obstack);
1778 }
1779
1780
1781 /* Set all of the blocks as dirty. This needs to be done if this
1782 problem is added after all of the insns have been scanned. */
1783
1784 void
1785 df_live_set_all_dirty (void)
1786 {
1787 basic_block bb;
1788 FOR_ALL_BB_FN (bb, cfun)
1789 bitmap_set_bit (df_live->out_of_date_transfer_functions,
1790 bb->index);
1791 }
1792
1793
1794 /* Verify that all of the lr related info is consistent and
1795 correct. */
1796
1797 void
1798 df_live_verify_transfer_functions (void)
1799 {
1800 basic_block bb;
1801 bitmap_head saved_gen;
1802 bitmap_head saved_kill;
1803 bitmap_head all_blocks;
1804
1805 if (!df)
1806 return;
1807
1808 bitmap_initialize (&saved_gen, &bitmap_default_obstack);
1809 bitmap_initialize (&saved_kill, &bitmap_default_obstack);
1810 bitmap_initialize (&all_blocks, &bitmap_default_obstack);
1811
1812 df_grow_insn_info ();
1813
1814 FOR_ALL_BB_FN (bb, cfun)
1815 {
1816 struct df_live_bb_info *bb_info = df_live_get_bb_info (bb->index);
1817 bitmap_set_bit (&all_blocks, bb->index);
1818
1819 if (bb_info)
1820 {
1821 /* Make a copy of the transfer functions and then compute
1822 new ones to see if the transfer functions have
1823 changed. */
1824 if (!bitmap_bit_p (df_live->out_of_date_transfer_functions,
1825 bb->index))
1826 {
1827 bitmap_copy (&saved_gen, &bb_info->gen);
1828 bitmap_copy (&saved_kill, &bb_info->kill);
1829 bitmap_clear (&bb_info->gen);
1830 bitmap_clear (&bb_info->kill);
1831
1832 df_live_bb_local_compute (bb->index);
1833 gcc_assert (bitmap_equal_p (&saved_gen, &bb_info->gen));
1834 gcc_assert (bitmap_equal_p (&saved_kill, &bb_info->kill));
1835 }
1836 }
1837 else
1838 {
1839 /* If we do not have basic block info, the block must be in
1840 the list of dirty blocks or else some one has added a
1841 block behind our backs. */
1842 gcc_assert (bitmap_bit_p (df_live->out_of_date_transfer_functions,
1843 bb->index));
1844 }
1845 /* Make sure no one created a block without following
1846 procedures. */
1847 gcc_assert (df_scan_get_bb_info (bb->index));
1848 }
1849
1850 /* Make sure there are no dirty bits in blocks that have been deleted. */
1851 gcc_assert (!bitmap_intersect_compl_p (df_live->out_of_date_transfer_functions,
1852 &all_blocks));
1853 bitmap_clear (&saved_gen);
1854 bitmap_clear (&saved_kill);
1855 bitmap_clear (&all_blocks);
1856 }
1857 \f
1858 /*----------------------------------------------------------------------------
1859 CREATE DEF_USE (DU) and / or USE_DEF (UD) CHAINS
1860
1861 Link either the defs to the uses and / or the uses to the defs.
1862
1863 These problems are set up like the other dataflow problems so that
1864 they nicely fit into the framework. They are much simpler and only
1865 involve a single traversal of instructions and an examination of
1866 the reaching defs information (the dependent problem).
1867 ----------------------------------------------------------------------------*/
1868
1869 #define df_chain_problem_p(FLAG) (((enum df_chain_flags)df_chain->local_flags)&(FLAG))
1870
1871 /* Create a du or ud chain from SRC to DST and link it into SRC. */
1872
1873 struct df_link *
1874 df_chain_create (df_ref src, df_ref dst)
1875 {
1876 struct df_link *head = DF_REF_CHAIN (src);
1877 struct df_link *link = df_chain->block_pool->allocate ();
1878
1879 DF_REF_CHAIN (src) = link;
1880 link->next = head;
1881 link->ref = dst;
1882 return link;
1883 }
1884
1885
1886 /* Delete any du or ud chains that start at REF and point to
1887 TARGET. */
1888 static void
1889 df_chain_unlink_1 (df_ref ref, df_ref target)
1890 {
1891 struct df_link *chain = DF_REF_CHAIN (ref);
1892 struct df_link *prev = NULL;
1893
1894 while (chain)
1895 {
1896 if (chain->ref == target)
1897 {
1898 if (prev)
1899 prev->next = chain->next;
1900 else
1901 DF_REF_CHAIN (ref) = chain->next;
1902 df_chain->block_pool->remove (chain);
1903 return;
1904 }
1905 prev = chain;
1906 chain = chain->next;
1907 }
1908 }
1909
1910
1911 /* Delete a du or ud chain that leave or point to REF. */
1912
1913 void
1914 df_chain_unlink (df_ref ref)
1915 {
1916 struct df_link *chain = DF_REF_CHAIN (ref);
1917 while (chain)
1918 {
1919 struct df_link *next = chain->next;
1920 /* Delete the other side if it exists. */
1921 df_chain_unlink_1 (chain->ref, ref);
1922 df_chain->block_pool->remove (chain);
1923 chain = next;
1924 }
1925 DF_REF_CHAIN (ref) = NULL;
1926 }
1927
1928
1929 /* Copy the du or ud chain starting at FROM_REF and attach it to
1930 TO_REF. */
1931
1932 void
1933 df_chain_copy (df_ref to_ref,
1934 struct df_link *from_ref)
1935 {
1936 while (from_ref)
1937 {
1938 df_chain_create (to_ref, from_ref->ref);
1939 from_ref = from_ref->next;
1940 }
1941 }
1942
1943
1944 /* Remove this problem from the stack of dataflow problems. */
1945
1946 static void
1947 df_chain_remove_problem (void)
1948 {
1949 bitmap_iterator bi;
1950 unsigned int bb_index;
1951
1952 /* Wholesale destruction of the old chains. */
1953 if (df_chain->block_pool)
1954 delete df_chain->block_pool;
1955
1956 EXECUTE_IF_SET_IN_BITMAP (df_chain->out_of_date_transfer_functions, 0, bb_index, bi)
1957 {
1958 rtx_insn *insn;
1959 df_ref def, use;
1960 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
1961
1962 if (df_chain_problem_p (DF_DU_CHAIN))
1963 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
1964 DF_REF_CHAIN (def) = NULL;
1965 if (df_chain_problem_p (DF_UD_CHAIN))
1966 FOR_EACH_ARTIFICIAL_USE (use, bb_index)
1967 DF_REF_CHAIN (use) = NULL;
1968
1969 FOR_BB_INSNS (bb, insn)
1970 if (INSN_P (insn))
1971 {
1972 df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
1973 if (df_chain_problem_p (DF_DU_CHAIN))
1974 FOR_EACH_INSN_INFO_DEF (def, insn_info)
1975 DF_REF_CHAIN (def) = NULL;
1976 if (df_chain_problem_p (DF_UD_CHAIN))
1977 {
1978 FOR_EACH_INSN_INFO_USE (use, insn_info)
1979 DF_REF_CHAIN (use) = NULL;
1980 FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
1981 DF_REF_CHAIN (use) = NULL;
1982 }
1983 }
1984 }
1985
1986 bitmap_clear (df_chain->out_of_date_transfer_functions);
1987 df_chain->block_pool = NULL;
1988 }
1989
1990
1991 /* Remove the chain problem completely. */
1992
1993 static void
1994 df_chain_fully_remove_problem (void)
1995 {
1996 df_chain_remove_problem ();
1997 BITMAP_FREE (df_chain->out_of_date_transfer_functions);
1998 free (df_chain);
1999 }
2000
2001
2002 /* Create def-use or use-def chains. */
2003
2004 static void
2005 df_chain_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
2006 {
2007 df_chain_remove_problem ();
2008 df_chain->block_pool = new pool_allocator<df_link> ("df_chain_block pool",
2009 50);
2010 df_chain->optional_p = true;
2011 }
2012
2013
2014 /* Reset all of the chains when the set of basic blocks changes. */
2015
2016 static void
2017 df_chain_reset (bitmap blocks_to_clear ATTRIBUTE_UNUSED)
2018 {
2019 df_chain_remove_problem ();
2020 }
2021
2022
2023 /* Create the chains for a list of USEs. */
2024
2025 static void
2026 df_chain_create_bb_process_use (bitmap local_rd,
2027 df_ref use,
2028 int top_flag)
2029 {
2030 bitmap_iterator bi;
2031 unsigned int def_index;
2032
2033 for (; use; use = DF_REF_NEXT_LOC (use))
2034 {
2035 unsigned int uregno = DF_REF_REGNO (use);
2036 if ((!(df->changeable_flags & DF_NO_HARD_REGS))
2037 || (uregno >= FIRST_PSEUDO_REGISTER))
2038 {
2039 /* Do not want to go through this for an uninitialized var. */
2040 int count = DF_DEFS_COUNT (uregno);
2041 if (count)
2042 {
2043 if (top_flag == (DF_REF_FLAGS (use) & DF_REF_AT_TOP))
2044 {
2045 unsigned int first_index = DF_DEFS_BEGIN (uregno);
2046 unsigned int last_index = first_index + count - 1;
2047
2048 EXECUTE_IF_SET_IN_BITMAP (local_rd, first_index, def_index, bi)
2049 {
2050 df_ref def;
2051 if (def_index > last_index)
2052 break;
2053
2054 def = DF_DEFS_GET (def_index);
2055 if (df_chain_problem_p (DF_DU_CHAIN))
2056 df_chain_create (def, use);
2057 if (df_chain_problem_p (DF_UD_CHAIN))
2058 df_chain_create (use, def);
2059 }
2060 }
2061 }
2062 }
2063 }
2064 }
2065
2066
2067 /* Create chains from reaching defs bitmaps for basic block BB. */
2068
2069 static void
2070 df_chain_create_bb (unsigned int bb_index)
2071 {
2072 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
2073 struct df_rd_bb_info *bb_info = df_rd_get_bb_info (bb_index);
2074 rtx_insn *insn;
2075 bitmap_head cpy;
2076
2077 bitmap_initialize (&cpy, &bitmap_default_obstack);
2078 bitmap_copy (&cpy, &bb_info->in);
2079 bitmap_set_bit (df_chain->out_of_date_transfer_functions, bb_index);
2080
2081 /* Since we are going forwards, process the artificial uses first
2082 then the artificial defs second. */
2083
2084 #ifdef EH_USES
2085 /* Create the chains for the artificial uses from the EH_USES at the
2086 beginning of the block. */
2087
2088 /* Artificials are only hard regs. */
2089 if (!(df->changeable_flags & DF_NO_HARD_REGS))
2090 df_chain_create_bb_process_use (&cpy,
2091 df_get_artificial_uses (bb->index),
2092 DF_REF_AT_TOP);
2093 #endif
2094
2095 df_rd_simulate_artificial_defs_at_top (bb, &cpy);
2096
2097 /* Process the regular instructions next. */
2098 FOR_BB_INSNS (bb, insn)
2099 if (INSN_P (insn))
2100 {
2101 unsigned int uid = INSN_UID (insn);
2102
2103 /* First scan the uses and link them up with the defs that remain
2104 in the cpy vector. */
2105 df_chain_create_bb_process_use (&cpy, DF_INSN_UID_USES (uid), 0);
2106 if (df->changeable_flags & DF_EQ_NOTES)
2107 df_chain_create_bb_process_use (&cpy, DF_INSN_UID_EQ_USES (uid), 0);
2108
2109 /* Since we are going forwards, process the defs second. */
2110 df_rd_simulate_one_insn (bb, insn, &cpy);
2111 }
2112
2113 /* Create the chains for the artificial uses of the hard registers
2114 at the end of the block. */
2115 if (!(df->changeable_flags & DF_NO_HARD_REGS))
2116 df_chain_create_bb_process_use (&cpy,
2117 df_get_artificial_uses (bb->index),
2118 0);
2119
2120 bitmap_clear (&cpy);
2121 }
2122
2123 /* Create def-use chains from reaching use bitmaps for basic blocks
2124 in BLOCKS. */
2125
2126 static void
2127 df_chain_finalize (bitmap all_blocks)
2128 {
2129 unsigned int bb_index;
2130 bitmap_iterator bi;
2131
2132 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
2133 {
2134 df_chain_create_bb (bb_index);
2135 }
2136 }
2137
2138
2139 /* Free all storage associated with the problem. */
2140
2141 static void
2142 df_chain_free (void)
2143 {
2144 delete df_chain->block_pool;
2145 BITMAP_FREE (df_chain->out_of_date_transfer_functions);
2146 free (df_chain);
2147 }
2148
2149
2150 /* Debugging info. */
2151
2152 static void
2153 df_chain_bb_dump (basic_block bb, FILE *file, bool top)
2154 {
2155 /* Artificials are only hard regs. */
2156 if (df->changeable_flags & DF_NO_HARD_REGS)
2157 return;
2158 if (df_chain_problem_p (DF_UD_CHAIN))
2159 {
2160 df_ref use;
2161
2162 fprintf (file,
2163 ";; UD chains for artificial uses at %s\n",
2164 top ? "top" : "bottom");
2165 FOR_EACH_ARTIFICIAL_USE (use, bb->index)
2166 if ((top && (DF_REF_FLAGS (use) & DF_REF_AT_TOP))
2167 || (!top && !(DF_REF_FLAGS (use) & DF_REF_AT_TOP)))
2168 {
2169 fprintf (file, ";; reg %d ", DF_REF_REGNO (use));
2170 df_chain_dump (DF_REF_CHAIN (use), file);
2171 fprintf (file, "\n");
2172 }
2173 }
2174 if (df_chain_problem_p (DF_DU_CHAIN))
2175 {
2176 df_ref def;
2177
2178 fprintf (file,
2179 ";; DU chains for artificial defs at %s\n",
2180 top ? "top" : "bottom");
2181 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
2182 if ((top && (DF_REF_FLAGS (def) & DF_REF_AT_TOP))
2183 || (!top && !(DF_REF_FLAGS (def) & DF_REF_AT_TOP)))
2184 {
2185 fprintf (file, ";; reg %d ", DF_REF_REGNO (def));
2186 df_chain_dump (DF_REF_CHAIN (def), file);
2187 fprintf (file, "\n");
2188 }
2189 }
2190 }
2191
2192 static void
2193 df_chain_top_dump (basic_block bb, FILE *file)
2194 {
2195 df_chain_bb_dump (bb, file, /*top=*/true);
2196 }
2197
2198 static void
2199 df_chain_bottom_dump (basic_block bb, FILE *file)
2200 {
2201 df_chain_bb_dump (bb, file, /*top=*/false);
2202 }
2203
2204 static void
2205 df_chain_insn_top_dump (const rtx_insn *insn, FILE *file)
2206 {
2207 if (df_chain_problem_p (DF_UD_CHAIN) && INSN_P (insn))
2208 {
2209 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
2210 df_ref use;
2211
2212 fprintf (file, ";; UD chains for insn luid %d uid %d\n",
2213 DF_INSN_INFO_LUID (insn_info), INSN_UID (insn));
2214 FOR_EACH_INSN_INFO_USE (use, insn_info)
2215 if (!HARD_REGISTER_NUM_P (DF_REF_REGNO (use))
2216 || !(df->changeable_flags & DF_NO_HARD_REGS))
2217 {
2218 fprintf (file, ";; reg %d ", DF_REF_REGNO (use));
2219 if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
2220 fprintf (file, "read/write ");
2221 df_chain_dump (DF_REF_CHAIN (use), file);
2222 fprintf (file, "\n");
2223 }
2224 FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
2225 if (!HARD_REGISTER_NUM_P (DF_REF_REGNO (use))
2226 || !(df->changeable_flags & DF_NO_HARD_REGS))
2227 {
2228 fprintf (file, ";; eq_note reg %d ", DF_REF_REGNO (use));
2229 df_chain_dump (DF_REF_CHAIN (use), file);
2230 fprintf (file, "\n");
2231 }
2232 }
2233 }
2234
2235 static void
2236 df_chain_insn_bottom_dump (const rtx_insn *insn, FILE *file)
2237 {
2238 if (df_chain_problem_p (DF_DU_CHAIN) && INSN_P (insn))
2239 {
2240 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
2241 df_ref def;
2242 fprintf (file, ";; DU chains for insn luid %d uid %d\n",
2243 DF_INSN_INFO_LUID (insn_info), INSN_UID (insn));
2244 FOR_EACH_INSN_INFO_DEF (def, insn_info)
2245 if (!HARD_REGISTER_NUM_P (DF_REF_REGNO (def))
2246 || !(df->changeable_flags & DF_NO_HARD_REGS))
2247 {
2248 fprintf (file, ";; reg %d ", DF_REF_REGNO (def));
2249 if (DF_REF_FLAGS (def) & DF_REF_READ_WRITE)
2250 fprintf (file, "read/write ");
2251 df_chain_dump (DF_REF_CHAIN (def), file);
2252 fprintf (file, "\n");
2253 }
2254 fprintf (file, "\n");
2255 }
2256 }
2257
2258 static struct df_problem problem_CHAIN =
2259 {
2260 DF_CHAIN, /* Problem id. */
2261 DF_NONE, /* Direction. */
2262 df_chain_alloc, /* Allocate the problem specific data. */
2263 df_chain_reset, /* Reset global information. */
2264 NULL, /* Free basic block info. */
2265 NULL, /* Local compute function. */
2266 NULL, /* Init the solution specific data. */
2267 NULL, /* Iterative solver. */
2268 NULL, /* Confluence operator 0. */
2269 NULL, /* Confluence operator n. */
2270 NULL, /* Transfer function. */
2271 df_chain_finalize, /* Finalize function. */
2272 df_chain_free, /* Free all of the problem information. */
2273 df_chain_fully_remove_problem,/* Remove this problem from the stack of dataflow problems. */
2274 NULL, /* Debugging. */
2275 df_chain_top_dump, /* Debugging start block. */
2276 df_chain_bottom_dump, /* Debugging end block. */
2277 df_chain_insn_top_dump, /* Debugging start insn. */
2278 df_chain_insn_bottom_dump, /* Debugging end insn. */
2279 NULL, /* Incremental solution verify start. */
2280 NULL, /* Incremental solution verify end. */
2281 &problem_RD, /* Dependent problem. */
2282 sizeof (struct df_scan_bb_info),/* Size of entry of block_info array. */
2283 TV_DF_CHAIN, /* Timing variable. */
2284 false /* Reset blocks on dropping out of blocks_to_analyze. */
2285 };
2286
2287
2288 /* Create a new DATAFLOW instance and add it to an existing instance
2289 of DF. The returned structure is what is used to get at the
2290 solution. */
2291
2292 void
2293 df_chain_add_problem (unsigned int chain_flags)
2294 {
2295 df_add_problem (&problem_CHAIN);
2296 df_chain->local_flags = chain_flags;
2297 df_chain->out_of_date_transfer_functions = BITMAP_ALLOC (&df_bitmap_obstack);
2298 }
2299
2300 #undef df_chain_problem_p
2301
2302 \f
2303 /*----------------------------------------------------------------------------
2304 WORD LEVEL LIVE REGISTERS
2305
2306 Find the locations in the function where any use of a pseudo can
2307 reach in the backwards direction. In and out bitvectors are built
2308 for each basic block. We only track pseudo registers that have a
2309 size of 2 * UNITS_PER_WORD; bitmaps are indexed by 2 * regno and
2310 contain two bits corresponding to each of the subwords.
2311
2312 ----------------------------------------------------------------------------*/
2313
2314 /* Private data used to verify the solution for this problem. */
2315 struct df_word_lr_problem_data
2316 {
2317 /* An obstack for the bitmaps we need for this problem. */
2318 bitmap_obstack word_lr_bitmaps;
2319 };
2320
2321
2322 /* Free basic block info. */
2323
2324 static void
2325 df_word_lr_free_bb_info (basic_block bb ATTRIBUTE_UNUSED,
2326 void *vbb_info)
2327 {
2328 struct df_word_lr_bb_info *bb_info = (struct df_word_lr_bb_info *) vbb_info;
2329 if (bb_info)
2330 {
2331 bitmap_clear (&bb_info->use);
2332 bitmap_clear (&bb_info->def);
2333 bitmap_clear (&bb_info->in);
2334 bitmap_clear (&bb_info->out);
2335 }
2336 }
2337
2338
2339 /* Allocate or reset bitmaps for DF_WORD_LR blocks. The solution bits are
2340 not touched unless the block is new. */
2341
2342 static void
2343 df_word_lr_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
2344 {
2345 unsigned int bb_index;
2346 bitmap_iterator bi;
2347 basic_block bb;
2348 struct df_word_lr_problem_data *problem_data
2349 = XNEW (struct df_word_lr_problem_data);
2350
2351 df_word_lr->problem_data = problem_data;
2352
2353 df_grow_bb_info (df_word_lr);
2354
2355 /* Create the mapping from regnos to slots. This does not change
2356 unless the problem is destroyed and recreated. In particular, if
2357 we end up deleting the only insn that used a subreg, we do not
2358 want to redo the mapping because this would invalidate everything
2359 else. */
2360
2361 bitmap_obstack_initialize (&problem_data->word_lr_bitmaps);
2362
2363 FOR_EACH_BB_FN (bb, cfun)
2364 bitmap_set_bit (df_word_lr->out_of_date_transfer_functions, bb->index);
2365
2366 bitmap_set_bit (df_word_lr->out_of_date_transfer_functions, ENTRY_BLOCK);
2367 bitmap_set_bit (df_word_lr->out_of_date_transfer_functions, EXIT_BLOCK);
2368
2369 EXECUTE_IF_SET_IN_BITMAP (df_word_lr->out_of_date_transfer_functions, 0, bb_index, bi)
2370 {
2371 struct df_word_lr_bb_info *bb_info = df_word_lr_get_bb_info (bb_index);
2372
2373 /* When bitmaps are already initialized, just clear them. */
2374 if (bb_info->use.obstack)
2375 {
2376 bitmap_clear (&bb_info->def);
2377 bitmap_clear (&bb_info->use);
2378 }
2379 else
2380 {
2381 bitmap_initialize (&bb_info->use, &problem_data->word_lr_bitmaps);
2382 bitmap_initialize (&bb_info->def, &problem_data->word_lr_bitmaps);
2383 bitmap_initialize (&bb_info->in, &problem_data->word_lr_bitmaps);
2384 bitmap_initialize (&bb_info->out, &problem_data->word_lr_bitmaps);
2385 }
2386 }
2387
2388 df_word_lr->optional_p = true;
2389 }
2390
2391
2392 /* Reset the global solution for recalculation. */
2393
2394 static void
2395 df_word_lr_reset (bitmap all_blocks)
2396 {
2397 unsigned int bb_index;
2398 bitmap_iterator bi;
2399
2400 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
2401 {
2402 struct df_word_lr_bb_info *bb_info = df_word_lr_get_bb_info (bb_index);
2403 gcc_assert (bb_info);
2404 bitmap_clear (&bb_info->in);
2405 bitmap_clear (&bb_info->out);
2406 }
2407 }
2408
2409 /* Examine REF, and if it is for a reg we're interested in, set or
2410 clear the bits corresponding to its subwords from the bitmap
2411 according to IS_SET. LIVE is the bitmap we should update. We do
2412 not track hard regs or pseudos of any size other than 2 *
2413 UNITS_PER_WORD.
2414 We return true if we changed the bitmap, or if we encountered a register
2415 we're not tracking. */
2416
2417 bool
2418 df_word_lr_mark_ref (df_ref ref, bool is_set, regset live)
2419 {
2420 rtx orig_reg = DF_REF_REG (ref);
2421 rtx reg = orig_reg;
2422 machine_mode reg_mode;
2423 unsigned regno;
2424 /* Left at -1 for whole accesses. */
2425 int which_subword = -1;
2426 bool changed = false;
2427
2428 if (GET_CODE (reg) == SUBREG)
2429 reg = SUBREG_REG (orig_reg);
2430 regno = REGNO (reg);
2431 reg_mode = GET_MODE (reg);
2432 if (regno < FIRST_PSEUDO_REGISTER
2433 || GET_MODE_SIZE (reg_mode) != 2 * UNITS_PER_WORD)
2434 return true;
2435
2436 if (GET_CODE (orig_reg) == SUBREG
2437 && df_read_modify_subreg_p (orig_reg))
2438 {
2439 gcc_assert (DF_REF_FLAGS_IS_SET (ref, DF_REF_PARTIAL));
2440 if (subreg_lowpart_p (orig_reg))
2441 which_subword = 0;
2442 else
2443 which_subword = 1;
2444 }
2445 if (is_set)
2446 {
2447 if (which_subword != 1)
2448 changed |= bitmap_set_bit (live, regno * 2);
2449 if (which_subword != 0)
2450 changed |= bitmap_set_bit (live, regno * 2 + 1);
2451 }
2452 else
2453 {
2454 if (which_subword != 1)
2455 changed |= bitmap_clear_bit (live, regno * 2);
2456 if (which_subword != 0)
2457 changed |= bitmap_clear_bit (live, regno * 2 + 1);
2458 }
2459 return changed;
2460 }
2461
2462 /* Compute local live register info for basic block BB. */
2463
2464 static void
2465 df_word_lr_bb_local_compute (unsigned int bb_index)
2466 {
2467 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
2468 struct df_word_lr_bb_info *bb_info = df_word_lr_get_bb_info (bb_index);
2469 rtx_insn *insn;
2470 df_ref def, use;
2471
2472 /* Ensure that artificial refs don't contain references to pseudos. */
2473 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
2474 gcc_assert (DF_REF_REGNO (def) < FIRST_PSEUDO_REGISTER);
2475
2476 FOR_EACH_ARTIFICIAL_USE (use, bb_index)
2477 gcc_assert (DF_REF_REGNO (use) < FIRST_PSEUDO_REGISTER);
2478
2479 FOR_BB_INSNS_REVERSE (bb, insn)
2480 {
2481 if (!NONDEBUG_INSN_P (insn))
2482 continue;
2483
2484 df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
2485 FOR_EACH_INSN_INFO_DEF (def, insn_info)
2486 /* If the def is to only part of the reg, it does
2487 not kill the other defs that reach here. */
2488 if (!(DF_REF_FLAGS (def) & (DF_REF_CONDITIONAL)))
2489 {
2490 df_word_lr_mark_ref (def, true, &bb_info->def);
2491 df_word_lr_mark_ref (def, false, &bb_info->use);
2492 }
2493 FOR_EACH_INSN_INFO_USE (use, insn_info)
2494 df_word_lr_mark_ref (use, true, &bb_info->use);
2495 }
2496 }
2497
2498
2499 /* Compute local live register info for each basic block within BLOCKS. */
2500
2501 static void
2502 df_word_lr_local_compute (bitmap all_blocks ATTRIBUTE_UNUSED)
2503 {
2504 unsigned int bb_index;
2505 bitmap_iterator bi;
2506
2507 EXECUTE_IF_SET_IN_BITMAP (df_word_lr->out_of_date_transfer_functions, 0, bb_index, bi)
2508 {
2509 if (bb_index == EXIT_BLOCK)
2510 {
2511 unsigned regno;
2512 bitmap_iterator bi;
2513 EXECUTE_IF_SET_IN_BITMAP (df->exit_block_uses, FIRST_PSEUDO_REGISTER,
2514 regno, bi)
2515 gcc_unreachable ();
2516 }
2517 else
2518 df_word_lr_bb_local_compute (bb_index);
2519 }
2520
2521 bitmap_clear (df_word_lr->out_of_date_transfer_functions);
2522 }
2523
2524
2525 /* Initialize the solution vectors. */
2526
2527 static void
2528 df_word_lr_init (bitmap all_blocks)
2529 {
2530 unsigned int bb_index;
2531 bitmap_iterator bi;
2532
2533 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
2534 {
2535 struct df_word_lr_bb_info *bb_info = df_word_lr_get_bb_info (bb_index);
2536 bitmap_copy (&bb_info->in, &bb_info->use);
2537 bitmap_clear (&bb_info->out);
2538 }
2539 }
2540
2541
2542 /* Confluence function that ignores fake edges. */
2543
2544 static bool
2545 df_word_lr_confluence_n (edge e)
2546 {
2547 bitmap op1 = &df_word_lr_get_bb_info (e->src->index)->out;
2548 bitmap op2 = &df_word_lr_get_bb_info (e->dest->index)->in;
2549
2550 return bitmap_ior_into (op1, op2);
2551 }
2552
2553
2554 /* Transfer function. */
2555
2556 static bool
2557 df_word_lr_transfer_function (int bb_index)
2558 {
2559 struct df_word_lr_bb_info *bb_info = df_word_lr_get_bb_info (bb_index);
2560 bitmap in = &bb_info->in;
2561 bitmap out = &bb_info->out;
2562 bitmap use = &bb_info->use;
2563 bitmap def = &bb_info->def;
2564
2565 return bitmap_ior_and_compl (in, use, out, def);
2566 }
2567
2568
2569 /* Free all storage associated with the problem. */
2570
2571 static void
2572 df_word_lr_free (void)
2573 {
2574 struct df_word_lr_problem_data *problem_data
2575 = (struct df_word_lr_problem_data *)df_word_lr->problem_data;
2576
2577 if (df_word_lr->block_info)
2578 {
2579 df_word_lr->block_info_size = 0;
2580 free (df_word_lr->block_info);
2581 df_word_lr->block_info = NULL;
2582 }
2583
2584 BITMAP_FREE (df_word_lr->out_of_date_transfer_functions);
2585 bitmap_obstack_release (&problem_data->word_lr_bitmaps);
2586 free (problem_data);
2587 free (df_word_lr);
2588 }
2589
2590
2591 /* Debugging info at top of bb. */
2592
2593 static void
2594 df_word_lr_top_dump (basic_block bb, FILE *file)
2595 {
2596 struct df_word_lr_bb_info *bb_info = df_word_lr_get_bb_info (bb->index);
2597 if (!bb_info)
2598 return;
2599
2600 fprintf (file, ";; blr in \t");
2601 df_print_word_regset (file, &bb_info->in);
2602 fprintf (file, ";; blr use \t");
2603 df_print_word_regset (file, &bb_info->use);
2604 fprintf (file, ";; blr def \t");
2605 df_print_word_regset (file, &bb_info->def);
2606 }
2607
2608
2609 /* Debugging info at bottom of bb. */
2610
2611 static void
2612 df_word_lr_bottom_dump (basic_block bb, FILE *file)
2613 {
2614 struct df_word_lr_bb_info *bb_info = df_word_lr_get_bb_info (bb->index);
2615 if (!bb_info)
2616 return;
2617
2618 fprintf (file, ";; blr out \t");
2619 df_print_word_regset (file, &bb_info->out);
2620 }
2621
2622
2623 /* All of the information associated with every instance of the problem. */
2624
2625 static struct df_problem problem_WORD_LR =
2626 {
2627 DF_WORD_LR, /* Problem id. */
2628 DF_BACKWARD, /* Direction. */
2629 df_word_lr_alloc, /* Allocate the problem specific data. */
2630 df_word_lr_reset, /* Reset global information. */
2631 df_word_lr_free_bb_info, /* Free basic block info. */
2632 df_word_lr_local_compute, /* Local compute function. */
2633 df_word_lr_init, /* Init the solution specific data. */
2634 df_worklist_dataflow, /* Worklist solver. */
2635 NULL, /* Confluence operator 0. */
2636 df_word_lr_confluence_n, /* Confluence operator n. */
2637 df_word_lr_transfer_function, /* Transfer function. */
2638 NULL, /* Finalize function. */
2639 df_word_lr_free, /* Free all of the problem information. */
2640 df_word_lr_free, /* Remove this problem from the stack of dataflow problems. */
2641 NULL, /* Debugging. */
2642 df_word_lr_top_dump, /* Debugging start block. */
2643 df_word_lr_bottom_dump, /* Debugging end block. */
2644 NULL, /* Debugging start insn. */
2645 NULL, /* Debugging end insn. */
2646 NULL, /* Incremental solution verify start. */
2647 NULL, /* Incremental solution verify end. */
2648 NULL, /* Dependent problem. */
2649 sizeof (struct df_word_lr_bb_info),/* Size of entry of block_info array. */
2650 TV_DF_WORD_LR, /* Timing variable. */
2651 false /* Reset blocks on dropping out of blocks_to_analyze. */
2652 };
2653
2654
2655 /* Create a new DATAFLOW instance and add it to an existing instance
2656 of DF. The returned structure is what is used to get at the
2657 solution. */
2658
2659 void
2660 df_word_lr_add_problem (void)
2661 {
2662 df_add_problem (&problem_WORD_LR);
2663 /* These will be initialized when df_scan_blocks processes each
2664 block. */
2665 df_word_lr->out_of_date_transfer_functions = BITMAP_ALLOC (&df_bitmap_obstack);
2666 }
2667
2668
2669 /* Simulate the effects of the defs of INSN on LIVE. Return true if we changed
2670 any bits, which is used by the caller to determine whether a set is
2671 necessary. We also return true if there are other reasons not to delete
2672 an insn. */
2673
2674 bool
2675 df_word_lr_simulate_defs (rtx_insn *insn, bitmap live)
2676 {
2677 bool changed = false;
2678 df_ref def;
2679
2680 FOR_EACH_INSN_DEF (def, insn)
2681 if (DF_REF_FLAGS (def) & DF_REF_CONDITIONAL)
2682 changed = true;
2683 else
2684 changed |= df_word_lr_mark_ref (def, false, live);
2685 return changed;
2686 }
2687
2688
2689 /* Simulate the effects of the uses of INSN on LIVE. */
2690
2691 void
2692 df_word_lr_simulate_uses (rtx_insn *insn, bitmap live)
2693 {
2694 df_ref use;
2695
2696 FOR_EACH_INSN_USE (use, insn)
2697 df_word_lr_mark_ref (use, true, live);
2698 }
2699 \f
2700 /*----------------------------------------------------------------------------
2701 This problem computes REG_DEAD and REG_UNUSED notes.
2702 ----------------------------------------------------------------------------*/
2703
2704 static void
2705 df_note_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
2706 {
2707 df_note->optional_p = true;
2708 }
2709
2710 /* This is only used if REG_DEAD_DEBUGGING is in effect. */
2711 static void
2712 df_print_note (const char *prefix, rtx_insn *insn, rtx note)
2713 {
2714 if (dump_file)
2715 {
2716 fprintf (dump_file, "%s %d ", prefix, INSN_UID (insn));
2717 print_rtl (dump_file, note);
2718 fprintf (dump_file, "\n");
2719 }
2720 }
2721
2722
2723 /* After reg-stack, the x86 floating point stack regs are difficult to
2724 analyze because of all of the pushes, pops and rotations. Thus, we
2725 just leave the notes alone. */
2726
2727 #ifdef STACK_REGS
2728 static inline bool
2729 df_ignore_stack_reg (int regno)
2730 {
2731 return regstack_completed
2732 && IN_RANGE (regno, FIRST_STACK_REG, LAST_STACK_REG);
2733 }
2734 #else
2735 static inline bool
2736 df_ignore_stack_reg (int regno ATTRIBUTE_UNUSED)
2737 {
2738 return false;
2739 }
2740 #endif
2741
2742
2743 /* Remove all of the REG_DEAD or REG_UNUSED notes from INSN. */
2744
2745 static void
2746 df_remove_dead_and_unused_notes (rtx_insn *insn)
2747 {
2748 rtx *pprev = &REG_NOTES (insn);
2749 rtx link = *pprev;
2750
2751 while (link)
2752 {
2753 switch (REG_NOTE_KIND (link))
2754 {
2755 case REG_DEAD:
2756 /* After reg-stack, we need to ignore any unused notes
2757 for the stack registers. */
2758 if (df_ignore_stack_reg (REGNO (XEXP (link, 0))))
2759 {
2760 pprev = &XEXP (link, 1);
2761 link = *pprev;
2762 }
2763 else
2764 {
2765 rtx next = XEXP (link, 1);
2766 if (REG_DEAD_DEBUGGING)
2767 df_print_note ("deleting: ", insn, link);
2768 free_EXPR_LIST_node (link);
2769 *pprev = link = next;
2770 }
2771 break;
2772
2773 case REG_UNUSED:
2774 /* After reg-stack, we need to ignore any unused notes
2775 for the stack registers. */
2776 if (df_ignore_stack_reg (REGNO (XEXP (link, 0))))
2777 {
2778 pprev = &XEXP (link, 1);
2779 link = *pprev;
2780 }
2781 else
2782 {
2783 rtx next = XEXP (link, 1);
2784 if (REG_DEAD_DEBUGGING)
2785 df_print_note ("deleting: ", insn, link);
2786 free_EXPR_LIST_node (link);
2787 *pprev = link = next;
2788 }
2789 break;
2790
2791 default:
2792 pprev = &XEXP (link, 1);
2793 link = *pprev;
2794 break;
2795 }
2796 }
2797 }
2798
2799 /* Remove REG_EQUAL/REG_EQUIV notes referring to dead pseudos using LIVE
2800 as the bitmap of currently live registers. */
2801
2802 static void
2803 df_remove_dead_eq_notes (rtx_insn *insn, bitmap live)
2804 {
2805 rtx *pprev = &REG_NOTES (insn);
2806 rtx link = *pprev;
2807
2808 while (link)
2809 {
2810 switch (REG_NOTE_KIND (link))
2811 {
2812 case REG_EQUAL:
2813 case REG_EQUIV:
2814 {
2815 /* Remove the notes that refer to dead registers. As we have at most
2816 one REG_EQUAL/EQUIV note, all of EQ_USES will refer to this note
2817 so we need to purge the complete EQ_USES vector when removing
2818 the note using df_notes_rescan. */
2819 df_ref use;
2820 bool deleted = false;
2821
2822 FOR_EACH_INSN_EQ_USE (use, insn)
2823 if (DF_REF_REGNO (use) > FIRST_PSEUDO_REGISTER
2824 && DF_REF_LOC (use)
2825 && (DF_REF_FLAGS (use) & DF_REF_IN_NOTE)
2826 && !bitmap_bit_p (live, DF_REF_REGNO (use))
2827 && loc_mentioned_in_p (DF_REF_LOC (use), XEXP (link, 0)))
2828 {
2829 deleted = true;
2830 break;
2831 }
2832 if (deleted)
2833 {
2834 rtx next;
2835 if (REG_DEAD_DEBUGGING)
2836 df_print_note ("deleting: ", insn, link);
2837 next = XEXP (link, 1);
2838 free_EXPR_LIST_node (link);
2839 *pprev = link = next;
2840 df_notes_rescan (insn);
2841 }
2842 else
2843 {
2844 pprev = &XEXP (link, 1);
2845 link = *pprev;
2846 }
2847 break;
2848 }
2849
2850 default:
2851 pprev = &XEXP (link, 1);
2852 link = *pprev;
2853 break;
2854 }
2855 }
2856 }
2857
2858 /* Set a NOTE_TYPE note for REG in INSN. */
2859
2860 static inline void
2861 df_set_note (enum reg_note note_type, rtx_insn *insn, rtx reg)
2862 {
2863 gcc_checking_assert (!DEBUG_INSN_P (insn));
2864 add_reg_note (insn, note_type, reg);
2865 }
2866
2867 /* A subroutine of df_set_unused_notes_for_mw, with a selection of its
2868 arguments. Return true if the register value described by MWS's
2869 mw_reg is known to be completely unused, and if mw_reg can therefore
2870 be used in a REG_UNUSED note. */
2871
2872 static bool
2873 df_whole_mw_reg_unused_p (struct df_mw_hardreg *mws,
2874 bitmap live, bitmap artificial_uses)
2875 {
2876 unsigned int r;
2877
2878 /* If MWS describes a partial reference, create REG_UNUSED notes for
2879 individual hard registers. */
2880 if (mws->flags & DF_REF_PARTIAL)
2881 return false;
2882
2883 /* Likewise if some part of the register is used. */
2884 for (r = mws->start_regno; r <= mws->end_regno; r++)
2885 if (bitmap_bit_p (live, r)
2886 || bitmap_bit_p (artificial_uses, r))
2887 return false;
2888
2889 gcc_assert (REG_P (mws->mw_reg));
2890 return true;
2891 }
2892
2893
2894 /* Set the REG_UNUSED notes for the multiword hardreg defs in INSN
2895 based on the bits in LIVE. Do not generate notes for registers in
2896 artificial uses. DO_NOT_GEN is updated so that REG_DEAD notes are
2897 not generated if the reg is both read and written by the
2898 instruction.
2899 */
2900
2901 static void
2902 df_set_unused_notes_for_mw (rtx_insn *insn, struct df_mw_hardreg *mws,
2903 bitmap live, bitmap do_not_gen,
2904 bitmap artificial_uses,
2905 struct dead_debug_local *debug)
2906 {
2907 unsigned int r;
2908
2909 if (REG_DEAD_DEBUGGING && dump_file)
2910 fprintf (dump_file, "mw_set_unused looking at mws[%d..%d]\n",
2911 mws->start_regno, mws->end_regno);
2912
2913 if (df_whole_mw_reg_unused_p (mws, live, artificial_uses))
2914 {
2915 unsigned int regno = mws->start_regno;
2916 df_set_note (REG_UNUSED, insn, mws->mw_reg);
2917 dead_debug_insert_temp (debug, regno, insn, DEBUG_TEMP_AFTER_WITH_REG);
2918
2919 if (REG_DEAD_DEBUGGING)
2920 df_print_note ("adding 1: ", insn, REG_NOTES (insn));
2921
2922 bitmap_set_bit (do_not_gen, regno);
2923 /* Only do this if the value is totally dead. */
2924 }
2925 else
2926 for (r = mws->start_regno; r <= mws->end_regno; r++)
2927 {
2928 if (!bitmap_bit_p (live, r)
2929 && !bitmap_bit_p (artificial_uses, r))
2930 {
2931 df_set_note (REG_UNUSED, insn, regno_reg_rtx[r]);
2932 dead_debug_insert_temp (debug, r, insn, DEBUG_TEMP_AFTER_WITH_REG);
2933 if (REG_DEAD_DEBUGGING)
2934 df_print_note ("adding 2: ", insn, REG_NOTES (insn));
2935 }
2936 bitmap_set_bit (do_not_gen, r);
2937 }
2938 }
2939
2940
2941 /* A subroutine of df_set_dead_notes_for_mw, with a selection of its
2942 arguments. Return true if the register value described by MWS's
2943 mw_reg is known to be completely dead, and if mw_reg can therefore
2944 be used in a REG_DEAD note. */
2945
2946 static bool
2947 df_whole_mw_reg_dead_p (struct df_mw_hardreg *mws,
2948 bitmap live, bitmap artificial_uses,
2949 bitmap do_not_gen)
2950 {
2951 unsigned int r;
2952
2953 /* If MWS describes a partial reference, create REG_DEAD notes for
2954 individual hard registers. */
2955 if (mws->flags & DF_REF_PARTIAL)
2956 return false;
2957
2958 /* Likewise if some part of the register is not dead. */
2959 for (r = mws->start_regno; r <= mws->end_regno; r++)
2960 if (bitmap_bit_p (live, r)
2961 || bitmap_bit_p (artificial_uses, r)
2962 || bitmap_bit_p (do_not_gen, r))
2963 return false;
2964
2965 gcc_assert (REG_P (mws->mw_reg));
2966 return true;
2967 }
2968
2969 /* Set the REG_DEAD notes for the multiword hardreg use in INSN based
2970 on the bits in LIVE. DO_NOT_GEN is used to keep REG_DEAD notes
2971 from being set if the instruction both reads and writes the
2972 register. */
2973
2974 static void
2975 df_set_dead_notes_for_mw (rtx_insn *insn, struct df_mw_hardreg *mws,
2976 bitmap live, bitmap do_not_gen,
2977 bitmap artificial_uses, bool *added_notes_p)
2978 {
2979 unsigned int r;
2980 bool is_debug = *added_notes_p;
2981
2982 *added_notes_p = false;
2983
2984 if (REG_DEAD_DEBUGGING && dump_file)
2985 {
2986 fprintf (dump_file, "mw_set_dead looking at mws[%d..%d]\n do_not_gen =",
2987 mws->start_regno, mws->end_regno);
2988 df_print_regset (dump_file, do_not_gen);
2989 fprintf (dump_file, " live =");
2990 df_print_regset (dump_file, live);
2991 fprintf (dump_file, " artificial uses =");
2992 df_print_regset (dump_file, artificial_uses);
2993 }
2994
2995 if (df_whole_mw_reg_dead_p (mws, live, artificial_uses, do_not_gen))
2996 {
2997 if (is_debug)
2998 {
2999 *added_notes_p = true;
3000 return;
3001 }
3002 /* Add a dead note for the entire multi word register. */
3003 df_set_note (REG_DEAD, insn, mws->mw_reg);
3004 if (REG_DEAD_DEBUGGING)
3005 df_print_note ("adding 1: ", insn, REG_NOTES (insn));
3006 }
3007 else
3008 {
3009 for (r = mws->start_regno; r <= mws->end_regno; r++)
3010 if (!bitmap_bit_p (live, r)
3011 && !bitmap_bit_p (artificial_uses, r)
3012 && !bitmap_bit_p (do_not_gen, r))
3013 {
3014 if (is_debug)
3015 {
3016 *added_notes_p = true;
3017 return;
3018 }
3019 df_set_note (REG_DEAD, insn, regno_reg_rtx[r]);
3020 if (REG_DEAD_DEBUGGING)
3021 df_print_note ("adding 2: ", insn, REG_NOTES (insn));
3022 }
3023 }
3024 return;
3025 }
3026
3027
3028 /* Create a REG_UNUSED note if necessary for DEF in INSN updating
3029 LIVE. Do not generate notes for registers in ARTIFICIAL_USES. */
3030
3031 static void
3032 df_create_unused_note (rtx_insn *insn, df_ref def,
3033 bitmap live, bitmap artificial_uses,
3034 struct dead_debug_local *debug)
3035 {
3036 unsigned int dregno = DF_REF_REGNO (def);
3037
3038 if (REG_DEAD_DEBUGGING && dump_file)
3039 {
3040 fprintf (dump_file, " regular looking at def ");
3041 df_ref_debug (def, dump_file);
3042 }
3043
3044 if (!((DF_REF_FLAGS (def) & DF_REF_MW_HARDREG)
3045 || bitmap_bit_p (live, dregno)
3046 || bitmap_bit_p (artificial_uses, dregno)
3047 || df_ignore_stack_reg (dregno)))
3048 {
3049 rtx reg = (DF_REF_LOC (def))
3050 ? *DF_REF_REAL_LOC (def): DF_REF_REG (def);
3051 df_set_note (REG_UNUSED, insn, reg);
3052 dead_debug_insert_temp (debug, dregno, insn, DEBUG_TEMP_AFTER_WITH_REG);
3053 if (REG_DEAD_DEBUGGING)
3054 df_print_note ("adding 3: ", insn, REG_NOTES (insn));
3055 }
3056
3057 return;
3058 }
3059
3060
3061 /* Recompute the REG_DEAD and REG_UNUSED notes and compute register
3062 info: lifetime, bb, and number of defs and uses for basic block
3063 BB. The three bitvectors are scratch regs used here. */
3064
3065 static void
3066 df_note_bb_compute (unsigned int bb_index,
3067 bitmap live, bitmap do_not_gen, bitmap artificial_uses)
3068 {
3069 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
3070 rtx_insn *insn;
3071 df_ref def, use;
3072 struct dead_debug_local debug;
3073
3074 dead_debug_local_init (&debug, NULL, NULL);
3075
3076 bitmap_copy (live, df_get_live_out (bb));
3077 bitmap_clear (artificial_uses);
3078
3079 if (REG_DEAD_DEBUGGING && dump_file)
3080 {
3081 fprintf (dump_file, "live at bottom ");
3082 df_print_regset (dump_file, live);
3083 }
3084
3085 /* Process the artificial defs and uses at the bottom of the block
3086 to begin processing. */
3087 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
3088 {
3089 if (REG_DEAD_DEBUGGING && dump_file)
3090 fprintf (dump_file, "artificial def %d\n", DF_REF_REGNO (def));
3091
3092 if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) == 0)
3093 bitmap_clear_bit (live, DF_REF_REGNO (def));
3094 }
3095
3096 FOR_EACH_ARTIFICIAL_USE (use, bb_index)
3097 if ((DF_REF_FLAGS (use) & DF_REF_AT_TOP) == 0)
3098 {
3099 unsigned int regno = DF_REF_REGNO (use);
3100 bitmap_set_bit (live, regno);
3101
3102 /* Notes are not generated for any of the artificial registers
3103 at the bottom of the block. */
3104 bitmap_set_bit (artificial_uses, regno);
3105 }
3106
3107 if (REG_DEAD_DEBUGGING && dump_file)
3108 {
3109 fprintf (dump_file, "live before artificials out ");
3110 df_print_regset (dump_file, live);
3111 }
3112
3113 FOR_BB_INSNS_REVERSE (bb, insn)
3114 {
3115 df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
3116 df_mw_hardreg *mw;
3117 int debug_insn;
3118
3119 if (!INSN_P (insn))
3120 continue;
3121
3122 debug_insn = DEBUG_INSN_P (insn);
3123
3124 bitmap_clear (do_not_gen);
3125 df_remove_dead_and_unused_notes (insn);
3126
3127 /* Process the defs. */
3128 if (CALL_P (insn))
3129 {
3130 if (REG_DEAD_DEBUGGING && dump_file)
3131 {
3132 fprintf (dump_file, "processing call %d\n live =",
3133 INSN_UID (insn));
3134 df_print_regset (dump_file, live);
3135 }
3136
3137 /* We only care about real sets for calls. Clobbers cannot
3138 be depended on to really die. */
3139 FOR_EACH_INSN_INFO_MW (mw, insn_info)
3140 if ((DF_MWS_REG_DEF_P (mw))
3141 && !df_ignore_stack_reg (mw->start_regno))
3142 df_set_unused_notes_for_mw (insn, mw, live, do_not_gen,
3143 artificial_uses, &debug);
3144
3145 /* All of the defs except the return value are some sort of
3146 clobber. This code is for the return. */
3147 FOR_EACH_INSN_INFO_DEF (def, insn_info)
3148 {
3149 unsigned int dregno = DF_REF_REGNO (def);
3150 if (!DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))
3151 {
3152 df_create_unused_note (insn,
3153 def, live, artificial_uses, &debug);
3154 bitmap_set_bit (do_not_gen, dregno);
3155 }
3156
3157 if (!DF_REF_FLAGS_IS_SET (def, DF_REF_PARTIAL | DF_REF_CONDITIONAL))
3158 bitmap_clear_bit (live, dregno);
3159 }
3160 }
3161 else
3162 {
3163 /* Regular insn. */
3164 FOR_EACH_INSN_INFO_MW (mw, insn_info)
3165 if (DF_MWS_REG_DEF_P (mw))
3166 df_set_unused_notes_for_mw (insn, mw, live, do_not_gen,
3167 artificial_uses, &debug);
3168
3169 FOR_EACH_INSN_INFO_DEF (def, insn_info)
3170 {
3171 unsigned int dregno = DF_REF_REGNO (def);
3172 df_create_unused_note (insn,
3173 def, live, artificial_uses, &debug);
3174
3175 if (!DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))
3176 bitmap_set_bit (do_not_gen, dregno);
3177
3178 if (!DF_REF_FLAGS_IS_SET (def, DF_REF_PARTIAL | DF_REF_CONDITIONAL))
3179 bitmap_clear_bit (live, dregno);
3180 }
3181 }
3182
3183 /* Process the uses. */
3184 FOR_EACH_INSN_INFO_MW (mw, insn_info)
3185 if (DF_MWS_REG_USE_P (mw)
3186 && !df_ignore_stack_reg (mw->start_regno))
3187 {
3188 bool really_add_notes = debug_insn != 0;
3189
3190 df_set_dead_notes_for_mw (insn, mw, live, do_not_gen,
3191 artificial_uses,
3192 &really_add_notes);
3193
3194 if (really_add_notes)
3195 debug_insn = -1;
3196 }
3197
3198 FOR_EACH_INSN_INFO_USE (use, insn_info)
3199 {
3200 unsigned int uregno = DF_REF_REGNO (use);
3201
3202 if (REG_DEAD_DEBUGGING && dump_file && !debug_insn)
3203 {
3204 fprintf (dump_file, " regular looking at use ");
3205 df_ref_debug (use, dump_file);
3206 }
3207
3208 if (!bitmap_bit_p (live, uregno))
3209 {
3210 if (debug_insn)
3211 {
3212 if (debug_insn > 0)
3213 {
3214 /* We won't add REG_UNUSED or REG_DEAD notes for
3215 these, so we don't have to mess with them in
3216 debug insns either. */
3217 if (!bitmap_bit_p (artificial_uses, uregno)
3218 && !df_ignore_stack_reg (uregno))
3219 dead_debug_add (&debug, use, uregno);
3220 continue;
3221 }
3222 break;
3223 }
3224 else
3225 dead_debug_insert_temp (&debug, uregno, insn,
3226 DEBUG_TEMP_BEFORE_WITH_REG);
3227
3228 if ( (!(DF_REF_FLAGS (use)
3229 & (DF_REF_MW_HARDREG | DF_REF_READ_WRITE)))
3230 && (!bitmap_bit_p (do_not_gen, uregno))
3231 && (!bitmap_bit_p (artificial_uses, uregno))
3232 && (!df_ignore_stack_reg (uregno)))
3233 {
3234 rtx reg = (DF_REF_LOC (use))
3235 ? *DF_REF_REAL_LOC (use) : DF_REF_REG (use);
3236 df_set_note (REG_DEAD, insn, reg);
3237
3238 if (REG_DEAD_DEBUGGING)
3239 df_print_note ("adding 4: ", insn, REG_NOTES (insn));
3240 }
3241 /* This register is now live. */
3242 bitmap_set_bit (live, uregno);
3243 }
3244 }
3245
3246 df_remove_dead_eq_notes (insn, live);
3247
3248 if (debug_insn == -1)
3249 {
3250 /* ??? We could probably do better here, replacing dead
3251 registers with their definitions. */
3252 INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
3253 df_insn_rescan_debug_internal (insn);
3254 }
3255 }
3256
3257 dead_debug_local_finish (&debug, NULL);
3258 }
3259
3260
3261 /* Compute register info: lifetime, bb, and number of defs and uses. */
3262 static void
3263 df_note_compute (bitmap all_blocks)
3264 {
3265 unsigned int bb_index;
3266 bitmap_iterator bi;
3267 bitmap_head live, do_not_gen, artificial_uses;
3268
3269 bitmap_initialize (&live, &df_bitmap_obstack);
3270 bitmap_initialize (&do_not_gen, &df_bitmap_obstack);
3271 bitmap_initialize (&artificial_uses, &df_bitmap_obstack);
3272
3273 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
3274 {
3275 /* ??? Unlike fast DCE, we don't use global_debug for uses of dead
3276 pseudos in debug insns because we don't always (re)visit blocks
3277 with death points after visiting dead uses. Even changing this
3278 loop to postorder would still leave room for visiting a death
3279 point before visiting a subsequent debug use. */
3280 df_note_bb_compute (bb_index, &live, &do_not_gen, &artificial_uses);
3281 }
3282
3283 bitmap_clear (&live);
3284 bitmap_clear (&do_not_gen);
3285 bitmap_clear (&artificial_uses);
3286 }
3287
3288
3289 /* Free all storage associated with the problem. */
3290
3291 static void
3292 df_note_free (void)
3293 {
3294 free (df_note);
3295 }
3296
3297
3298 /* All of the information associated every instance of the problem. */
3299
3300 static struct df_problem problem_NOTE =
3301 {
3302 DF_NOTE, /* Problem id. */
3303 DF_NONE, /* Direction. */
3304 df_note_alloc, /* Allocate the problem specific data. */
3305 NULL, /* Reset global information. */
3306 NULL, /* Free basic block info. */
3307 df_note_compute, /* Local compute function. */
3308 NULL, /* Init the solution specific data. */
3309 NULL, /* Iterative solver. */
3310 NULL, /* Confluence operator 0. */
3311 NULL, /* Confluence operator n. */
3312 NULL, /* Transfer function. */
3313 NULL, /* Finalize function. */
3314 df_note_free, /* Free all of the problem information. */
3315 df_note_free, /* Remove this problem from the stack of dataflow problems. */
3316 NULL, /* Debugging. */
3317 NULL, /* Debugging start block. */
3318 NULL, /* Debugging end block. */
3319 NULL, /* Debugging start insn. */
3320 NULL, /* Debugging end insn. */
3321 NULL, /* Incremental solution verify start. */
3322 NULL, /* Incremental solution verify end. */
3323 &problem_LR, /* Dependent problem. */
3324 sizeof (struct df_scan_bb_info),/* Size of entry of block_info array. */
3325 TV_DF_NOTE, /* Timing variable. */
3326 false /* Reset blocks on dropping out of blocks_to_analyze. */
3327 };
3328
3329
3330 /* Create a new DATAFLOW instance and add it to an existing instance
3331 of DF. The returned structure is what is used to get at the
3332 solution. */
3333
3334 void
3335 df_note_add_problem (void)
3336 {
3337 df_add_problem (&problem_NOTE);
3338 }
3339
3340
3341
3342 \f
3343 /*----------------------------------------------------------------------------
3344 Functions for simulating the effects of single insns.
3345
3346 You can either simulate in the forwards direction, starting from
3347 the top of a block or the backwards direction from the end of the
3348 block. If you go backwards, defs are examined first to clear bits,
3349 then uses are examined to set bits. If you go forwards, defs are
3350 examined first to set bits, then REG_DEAD and REG_UNUSED notes
3351 are examined to clear bits. In either case, the result of examining
3352 a def can be undone (respectively by a use or a REG_UNUSED note).
3353
3354 If you start at the top of the block, use one of DF_LIVE_IN or
3355 DF_LR_IN. If you start at the bottom of the block use one of
3356 DF_LIVE_OUT or DF_LR_OUT. BE SURE TO PASS A COPY OF THESE SETS,
3357 THEY WILL BE DESTROYED.
3358 ----------------------------------------------------------------------------*/
3359
3360
3361 /* Find the set of DEFs for INSN. */
3362
3363 void
3364 df_simulate_find_defs (rtx_insn *insn, bitmap defs)
3365 {
3366 df_ref def;
3367
3368 FOR_EACH_INSN_DEF (def, insn)
3369 bitmap_set_bit (defs, DF_REF_REGNO (def));
3370 }
3371
3372 /* Find the set of uses for INSN. This includes partial defs. */
3373
3374 static void
3375 df_simulate_find_uses (rtx_insn *insn, bitmap uses)
3376 {
3377 df_ref def, use;
3378 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
3379
3380 FOR_EACH_INSN_INFO_DEF (def, insn_info)
3381 if (DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL))
3382 bitmap_set_bit (uses, DF_REF_REGNO (def));
3383 FOR_EACH_INSN_INFO_USE (use, insn_info)
3384 bitmap_set_bit (uses, DF_REF_REGNO (use));
3385 }
3386
3387 /* Find the set of real DEFs, which are not clobbers, for INSN. */
3388
3389 void
3390 df_simulate_find_noclobber_defs (rtx_insn *insn, bitmap defs)
3391 {
3392 df_ref def;
3393
3394 FOR_EACH_INSN_DEF (def, insn)
3395 if (!(DF_REF_FLAGS (def) & (DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER)))
3396 bitmap_set_bit (defs, DF_REF_REGNO (def));
3397 }
3398
3399
3400 /* Simulate the effects of the defs of INSN on LIVE. */
3401
3402 void
3403 df_simulate_defs (rtx_insn *insn, bitmap live)
3404 {
3405 df_ref def;
3406
3407 FOR_EACH_INSN_DEF (def, insn)
3408 {
3409 unsigned int dregno = DF_REF_REGNO (def);
3410
3411 /* If the def is to only part of the reg, it does
3412 not kill the other defs that reach here. */
3413 if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
3414 bitmap_clear_bit (live, dregno);
3415 }
3416 }
3417
3418
3419 /* Simulate the effects of the uses of INSN on LIVE. */
3420
3421 void
3422 df_simulate_uses (rtx_insn *insn, bitmap live)
3423 {
3424 df_ref use;
3425
3426 if (DEBUG_INSN_P (insn))
3427 return;
3428
3429 FOR_EACH_INSN_USE (use, insn)
3430 /* Add use to set of uses in this BB. */
3431 bitmap_set_bit (live, DF_REF_REGNO (use));
3432 }
3433
3434
3435 /* Add back the always live regs in BB to LIVE. */
3436
3437 static inline void
3438 df_simulate_fixup_sets (basic_block bb, bitmap live)
3439 {
3440 /* These regs are considered always live so if they end up dying
3441 because of some def, we need to bring the back again. */
3442 if (bb_has_eh_pred (bb))
3443 bitmap_ior_into (live, &df->eh_block_artificial_uses);
3444 else
3445 bitmap_ior_into (live, &df->regular_block_artificial_uses);
3446 }
3447
3448
3449 /*----------------------------------------------------------------------------
3450 The following three functions are used only for BACKWARDS scanning:
3451 i.e. they process the defs before the uses.
3452
3453 df_simulate_initialize_backwards should be called first with a
3454 bitvector copyied from the DF_LIVE_OUT or DF_LR_OUT. Then
3455 df_simulate_one_insn_backwards should be called for each insn in
3456 the block, starting with the last one. Finally,
3457 df_simulate_finalize_backwards can be called to get a new value
3458 of the sets at the top of the block (this is rarely used).
3459 ----------------------------------------------------------------------------*/
3460
3461 /* Apply the artificial uses and defs at the end of BB in a backwards
3462 direction. */
3463
3464 void
3465 df_simulate_initialize_backwards (basic_block bb, bitmap live)
3466 {
3467 df_ref def, use;
3468 int bb_index = bb->index;
3469
3470 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
3471 if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) == 0)
3472 bitmap_clear_bit (live, DF_REF_REGNO (def));
3473
3474 FOR_EACH_ARTIFICIAL_USE (use, bb_index)
3475 if ((DF_REF_FLAGS (use) & DF_REF_AT_TOP) == 0)
3476 bitmap_set_bit (live, DF_REF_REGNO (use));
3477 }
3478
3479
3480 /* Simulate the backwards effects of INSN on the bitmap LIVE. */
3481
3482 void
3483 df_simulate_one_insn_backwards (basic_block bb, rtx_insn *insn, bitmap live)
3484 {
3485 if (!NONDEBUG_INSN_P (insn))
3486 return;
3487
3488 df_simulate_defs (insn, live);
3489 df_simulate_uses (insn, live);
3490 df_simulate_fixup_sets (bb, live);
3491 }
3492
3493
3494 /* Apply the artificial uses and defs at the top of BB in a backwards
3495 direction. */
3496
3497 void
3498 df_simulate_finalize_backwards (basic_block bb, bitmap live)
3499 {
3500 df_ref def;
3501 #ifdef EH_USES
3502 df_ref use;
3503 #endif
3504 int bb_index = bb->index;
3505
3506 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
3507 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
3508 bitmap_clear_bit (live, DF_REF_REGNO (def));
3509
3510 #ifdef EH_USES
3511 FOR_EACH_ARTIFICIAL_USE (use, bb_index)
3512 if (DF_REF_FLAGS (use) & DF_REF_AT_TOP)
3513 bitmap_set_bit (live, DF_REF_REGNO (use));
3514 #endif
3515 }
3516 /*----------------------------------------------------------------------------
3517 The following three functions are used only for FORWARDS scanning:
3518 i.e. they process the defs and the REG_DEAD and REG_UNUSED notes.
3519 Thus it is important to add the DF_NOTES problem to the stack of
3520 problems computed before using these functions.
3521
3522 df_simulate_initialize_forwards should be called first with a
3523 bitvector copyied from the DF_LIVE_IN or DF_LR_IN. Then
3524 df_simulate_one_insn_forwards should be called for each insn in
3525 the block, starting with the first one.
3526 ----------------------------------------------------------------------------*/
3527
3528 /* Initialize the LIVE bitmap, which should be copied from DF_LIVE_IN or
3529 DF_LR_IN for basic block BB, for forward scanning by marking artificial
3530 defs live. */
3531
3532 void
3533 df_simulate_initialize_forwards (basic_block bb, bitmap live)
3534 {
3535 df_ref def;
3536 int bb_index = bb->index;
3537
3538 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
3539 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
3540 bitmap_set_bit (live, DF_REF_REGNO (def));
3541 }
3542
3543 /* Simulate the forwards effects of INSN on the bitmap LIVE. */
3544
3545 void
3546 df_simulate_one_insn_forwards (basic_block bb, rtx_insn *insn, bitmap live)
3547 {
3548 rtx link;
3549 if (! INSN_P (insn))
3550 return;
3551
3552 /* Make sure that DF_NOTE really is an active df problem. */
3553 gcc_assert (df_note);
3554
3555 /* Note that this is the opposite as how the problem is defined, because
3556 in the LR problem defs _kill_ liveness. However, they do so backwards,
3557 while here the scan is performed forwards! So, first assume that the
3558 def is live, and if this is not true REG_UNUSED notes will rectify the
3559 situation. */
3560 df_simulate_find_noclobber_defs (insn, live);
3561
3562 /* Clear all of the registers that go dead. */
3563 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
3564 {
3565 switch (REG_NOTE_KIND (link))
3566 {
3567 case REG_DEAD:
3568 case REG_UNUSED:
3569 {
3570 rtx reg = XEXP (link, 0);
3571 bitmap_clear_range (live, REGNO (reg), REG_NREGS (reg));
3572 }
3573 break;
3574 default:
3575 break;
3576 }
3577 }
3578 df_simulate_fixup_sets (bb, live);
3579 }
3580 \f
3581 /* Used by the next two functions to encode information about the
3582 memory references we found. */
3583 #define MEMREF_NORMAL 1
3584 #define MEMREF_VOLATILE 2
3585
3586 /* Return an OR of MEMREF_NORMAL or MEMREF_VOLATILE for the MEMs in X. */
3587
3588 static int
3589 find_memory (rtx_insn *insn)
3590 {
3591 int flags = 0;
3592 subrtx_iterator::array_type array;
3593 FOR_EACH_SUBRTX (iter, array, PATTERN (insn), NONCONST)
3594 {
3595 const_rtx x = *iter;
3596 if (GET_CODE (x) == ASM_OPERANDS && MEM_VOLATILE_P (x))
3597 flags |= MEMREF_VOLATILE;
3598 else if (MEM_P (x))
3599 {
3600 if (MEM_VOLATILE_P (x))
3601 flags |= MEMREF_VOLATILE;
3602 else if (!MEM_READONLY_P (x))
3603 flags |= MEMREF_NORMAL;
3604 }
3605 }
3606 return flags;
3607 }
3608
3609 /* A subroutine of can_move_insns_across_p called through note_stores.
3610 DATA points to an integer in which we set either the bit for
3611 MEMREF_NORMAL or the bit for MEMREF_VOLATILE if we find a MEM
3612 of either kind. */
3613
3614 static void
3615 find_memory_stores (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
3616 void *data ATTRIBUTE_UNUSED)
3617 {
3618 int *pflags = (int *)data;
3619 if (GET_CODE (x) == SUBREG)
3620 x = XEXP (x, 0);
3621 /* Treat stores to SP as stores to memory, this will prevent problems
3622 when there are references to the stack frame. */
3623 if (x == stack_pointer_rtx)
3624 *pflags |= MEMREF_VOLATILE;
3625 if (!MEM_P (x))
3626 return;
3627 *pflags |= MEM_VOLATILE_P (x) ? MEMREF_VOLATILE : MEMREF_NORMAL;
3628 }
3629
3630 /* Scan BB backwards, using df_simulate functions to keep track of
3631 lifetimes, up to insn POINT. The result is stored in LIVE. */
3632
3633 void
3634 simulate_backwards_to_point (basic_block bb, regset live, rtx point)
3635 {
3636 rtx_insn *insn;
3637 bitmap_copy (live, df_get_live_out (bb));
3638 df_simulate_initialize_backwards (bb, live);
3639
3640 /* Scan and update life information until we reach the point we're
3641 interested in. */
3642 for (insn = BB_END (bb); insn != point; insn = PREV_INSN (insn))
3643 df_simulate_one_insn_backwards (bb, insn, live);
3644 }
3645
3646 /* Return true if it is safe to move a group of insns, described by
3647 the range FROM to TO, backwards across another group of insns,
3648 described by ACROSS_FROM to ACROSS_TO. It is assumed that there
3649 are no insns between ACROSS_TO and FROM, but they may be in
3650 different basic blocks; MERGE_BB is the block from which the
3651 insns will be moved. The caller must pass in a regset MERGE_LIVE
3652 which specifies the registers live after TO.
3653
3654 This function may be called in one of two cases: either we try to
3655 move identical instructions from all successor blocks into their
3656 predecessor, or we try to move from only one successor block. If
3657 OTHER_BRANCH_LIVE is nonnull, it indicates that we're dealing with
3658 the second case. It should contain a set of registers live at the
3659 end of ACROSS_TO which must not be clobbered by moving the insns.
3660 In that case, we're also more careful about moving memory references
3661 and trapping insns.
3662
3663 We return false if it is not safe to move the entire group, but it
3664 may still be possible to move a subgroup. PMOVE_UPTO, if nonnull,
3665 is set to point at the last moveable insn in such a case. */
3666
3667 bool
3668 can_move_insns_across (rtx_insn *from, rtx_insn *to,
3669 rtx_insn *across_from, rtx_insn *across_to,
3670 basic_block merge_bb, regset merge_live,
3671 regset other_branch_live, rtx_insn **pmove_upto)
3672 {
3673 rtx_insn *insn, *next, *max_to;
3674 bitmap merge_set, merge_use, local_merge_live;
3675 bitmap test_set, test_use;
3676 unsigned i, fail = 0;
3677 bitmap_iterator bi;
3678 int memrefs_in_across = 0;
3679 int mem_sets_in_across = 0;
3680 bool trapping_insns_in_across = false;
3681
3682 if (pmove_upto != NULL)
3683 *pmove_upto = NULL;
3684
3685 /* Find real bounds, ignoring debug insns. */
3686 while (!NONDEBUG_INSN_P (from) && from != to)
3687 from = NEXT_INSN (from);
3688 while (!NONDEBUG_INSN_P (to) && from != to)
3689 to = PREV_INSN (to);
3690
3691 for (insn = across_to; ; insn = next)
3692 {
3693 if (CALL_P (insn))
3694 {
3695 if (RTL_CONST_OR_PURE_CALL_P (insn))
3696 /* Pure functions can read from memory. Const functions can
3697 read from arguments that the ABI has forced onto the stack.
3698 Neither sort of read can be volatile. */
3699 memrefs_in_across |= MEMREF_NORMAL;
3700 else
3701 {
3702 memrefs_in_across |= MEMREF_VOLATILE;
3703 mem_sets_in_across |= MEMREF_VOLATILE;
3704 }
3705 }
3706 if (NONDEBUG_INSN_P (insn))
3707 {
3708 if (volatile_insn_p (PATTERN (insn)))
3709 return false;
3710 memrefs_in_across |= find_memory (insn);
3711 note_stores (PATTERN (insn), find_memory_stores,
3712 &mem_sets_in_across);
3713 /* This is used just to find sets of the stack pointer. */
3714 memrefs_in_across |= mem_sets_in_across;
3715 trapping_insns_in_across |= may_trap_p (PATTERN (insn));
3716 }
3717 next = PREV_INSN (insn);
3718 if (insn == across_from)
3719 break;
3720 }
3721
3722 /* Collect:
3723 MERGE_SET = set of registers set in MERGE_BB
3724 MERGE_USE = set of registers used in MERGE_BB and live at its top
3725 MERGE_LIVE = set of registers live at the point inside the MERGE
3726 range that we've reached during scanning
3727 TEST_SET = set of registers set between ACROSS_FROM and ACROSS_END.
3728 TEST_USE = set of registers used between ACROSS_FROM and ACROSS_END,
3729 and live before ACROSS_FROM. */
3730
3731 merge_set = BITMAP_ALLOC (&reg_obstack);
3732 merge_use = BITMAP_ALLOC (&reg_obstack);
3733 local_merge_live = BITMAP_ALLOC (&reg_obstack);
3734 test_set = BITMAP_ALLOC (&reg_obstack);
3735 test_use = BITMAP_ALLOC (&reg_obstack);
3736
3737 /* Compute the set of registers set and used in the ACROSS range. */
3738 if (other_branch_live != NULL)
3739 bitmap_copy (test_use, other_branch_live);
3740 df_simulate_initialize_backwards (merge_bb, test_use);
3741 for (insn = across_to; ; insn = next)
3742 {
3743 if (NONDEBUG_INSN_P (insn))
3744 {
3745 df_simulate_find_defs (insn, test_set);
3746 df_simulate_defs (insn, test_use);
3747 df_simulate_uses (insn, test_use);
3748 }
3749 next = PREV_INSN (insn);
3750 if (insn == across_from)
3751 break;
3752 }
3753
3754 /* Compute an upper bound for the amount of insns moved, by finding
3755 the first insn in MERGE that sets a register in TEST_USE, or uses
3756 a register in TEST_SET. We also check for calls, trapping operations,
3757 and memory references. */
3758 max_to = NULL;
3759 for (insn = from; ; insn = next)
3760 {
3761 if (CALL_P (insn))
3762 break;
3763 if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_EPILOGUE_BEG)
3764 break;
3765 if (NONDEBUG_INSN_P (insn))
3766 {
3767 if (may_trap_or_fault_p (PATTERN (insn))
3768 && (trapping_insns_in_across
3769 || other_branch_live != NULL
3770 || volatile_insn_p (PATTERN (insn))))
3771 break;
3772
3773 /* We cannot move memory stores past each other, or move memory
3774 reads past stores, at least not without tracking them and
3775 calling true_dependence on every pair.
3776
3777 If there is no other branch and no memory references or
3778 sets in the ACROSS range, we can move memory references
3779 freely, even volatile ones.
3780
3781 Otherwise, the rules are as follows: volatile memory
3782 references and stores can't be moved at all, and any type
3783 of memory reference can't be moved if there are volatile
3784 accesses or stores in the ACROSS range. That leaves
3785 normal reads, which can be moved, as the trapping case is
3786 dealt with elsewhere. */
3787 if (other_branch_live != NULL || memrefs_in_across != 0)
3788 {
3789 int mem_ref_flags = 0;
3790 int mem_set_flags = 0;
3791 note_stores (PATTERN (insn), find_memory_stores, &mem_set_flags);
3792 mem_ref_flags = find_memory (insn);
3793 /* Catch sets of the stack pointer. */
3794 mem_ref_flags |= mem_set_flags;
3795
3796 if ((mem_ref_flags | mem_set_flags) & MEMREF_VOLATILE)
3797 break;
3798 if ((memrefs_in_across & MEMREF_VOLATILE) && mem_ref_flags != 0)
3799 break;
3800 if (mem_set_flags != 0
3801 || (mem_sets_in_across != 0 && mem_ref_flags != 0))
3802 break;
3803 }
3804 df_simulate_find_uses (insn, merge_use);
3805 /* We're only interested in uses which use a value live at
3806 the top, not one previously set in this block. */
3807 bitmap_and_compl_into (merge_use, merge_set);
3808 df_simulate_find_defs (insn, merge_set);
3809 if (bitmap_intersect_p (merge_set, test_use)
3810 || bitmap_intersect_p (merge_use, test_set))
3811 break;
3812 if (!HAVE_cc0 || !sets_cc0_p (insn))
3813 max_to = insn;
3814 }
3815 next = NEXT_INSN (insn);
3816 if (insn == to)
3817 break;
3818 }
3819 if (max_to != to)
3820 fail = 1;
3821
3822 if (max_to == NULL_RTX || (fail && pmove_upto == NULL))
3823 goto out;
3824
3825 /* Now, lower this upper bound by also taking into account that
3826 a range of insns moved across ACROSS must not leave a register
3827 live at the end that will be clobbered in ACROSS. We need to
3828 find a point where TEST_SET & LIVE == 0.
3829
3830 Insns in the MERGE range that set registers which are also set
3831 in the ACROSS range may still be moved as long as we also move
3832 later insns which use the results of the set, and make the
3833 register dead again. This is verified by the condition stated
3834 above. We only need to test it for registers that are set in
3835 the moved region.
3836
3837 MERGE_LIVE is provided by the caller and holds live registers after
3838 TO. */
3839 bitmap_copy (local_merge_live, merge_live);
3840 for (insn = to; insn != max_to; insn = PREV_INSN (insn))
3841 df_simulate_one_insn_backwards (merge_bb, insn, local_merge_live);
3842
3843 /* We're not interested in registers that aren't set in the moved
3844 region at all. */
3845 bitmap_and_into (local_merge_live, merge_set);
3846 for (;;)
3847 {
3848 if (NONDEBUG_INSN_P (insn))
3849 {
3850 if (!bitmap_intersect_p (test_set, local_merge_live)
3851 && (!HAVE_cc0 || !sets_cc0_p (insn)))
3852 {
3853 max_to = insn;
3854 break;
3855 }
3856
3857 df_simulate_one_insn_backwards (merge_bb, insn,
3858 local_merge_live);
3859 }
3860 if (insn == from)
3861 {
3862 fail = 1;
3863 goto out;
3864 }
3865 insn = PREV_INSN (insn);
3866 }
3867
3868 if (max_to != to)
3869 fail = 1;
3870
3871 if (pmove_upto)
3872 *pmove_upto = max_to;
3873
3874 /* For small register class machines, don't lengthen lifetimes of
3875 hard registers before reload. */
3876 if (! reload_completed
3877 && targetm.small_register_classes_for_mode_p (VOIDmode))
3878 {
3879 EXECUTE_IF_SET_IN_BITMAP (merge_set, 0, i, bi)
3880 {
3881 if (i < FIRST_PSEUDO_REGISTER
3882 && ! fixed_regs[i]
3883 && ! global_regs[i])
3884 {
3885 fail = 1;
3886 break;
3887 }
3888 }
3889 }
3890
3891 out:
3892 BITMAP_FREE (merge_set);
3893 BITMAP_FREE (merge_use);
3894 BITMAP_FREE (local_merge_live);
3895 BITMAP_FREE (test_set);
3896 BITMAP_FREE (test_use);
3897
3898 return !fail;
3899 }
3900
3901 \f
3902 /*----------------------------------------------------------------------------
3903 MULTIPLE DEFINITIONS
3904
3905 Find the locations in the function reached by multiple definition sites
3906 for a live pseudo. In and out bitvectors are built for each basic
3907 block. They are restricted for efficiency to live registers.
3908
3909 The gen and kill sets for the problem are obvious. Together they
3910 include all defined registers in a basic block; the gen set includes
3911 registers where a partial or conditional or may-clobber definition is
3912 last in the BB, while the kill set includes registers with a complete
3913 definition coming last. However, the computation of the dataflow
3914 itself is interesting.
3915
3916 The idea behind it comes from SSA form's iterated dominance frontier
3917 criterion for inserting PHI functions. Just like in that case, we can use
3918 the dominance frontier to find places where multiple definitions meet;
3919 a register X defined in a basic block BB1 has multiple definitions in
3920 basic blocks in BB1's dominance frontier.
3921
3922 So, the in-set of a basic block BB2 is not just the union of the
3923 out-sets of BB2's predecessors, but includes some more bits that come
3924 from the basic blocks of whose dominance frontier BB2 is part (BB1 in
3925 the previous paragraph). I called this set the init-set of BB2.
3926
3927 (Note: I actually use the kill-set only to build the init-set.
3928 gen bits are anyway propagated from BB1 to BB2 by dataflow).
3929
3930 For example, if you have
3931
3932 BB1 : r10 = 0
3933 r11 = 0
3934 if <...> goto BB2 else goto BB3;
3935
3936 BB2 : r10 = 1
3937 r12 = 1
3938 goto BB3;
3939
3940 BB3 :
3941
3942 you have BB3 in BB2's dominance frontier but not in BB1's, so that the
3943 init-set of BB3 includes r10 and r12, but not r11. Note that we do
3944 not need to iterate the dominance frontier, because we do not insert
3945 anything like PHI functions there! Instead, dataflow will take care of
3946 propagating the information to BB3's successors.
3947 ---------------------------------------------------------------------------*/
3948
3949 /* Private data used to verify the solution for this problem. */
3950 struct df_md_problem_data
3951 {
3952 /* An obstack for the bitmaps we need for this problem. */
3953 bitmap_obstack md_bitmaps;
3954 };
3955
3956 /* Scratch var used by transfer functions. This is used to do md analysis
3957 only for live registers. */
3958 static bitmap_head df_md_scratch;
3959
3960
3961 static void
3962 df_md_free_bb_info (basic_block bb ATTRIBUTE_UNUSED,
3963 void *vbb_info)
3964 {
3965 struct df_md_bb_info *bb_info = (struct df_md_bb_info *) vbb_info;
3966 if (bb_info)
3967 {
3968 bitmap_clear (&bb_info->kill);
3969 bitmap_clear (&bb_info->gen);
3970 bitmap_clear (&bb_info->init);
3971 bitmap_clear (&bb_info->in);
3972 bitmap_clear (&bb_info->out);
3973 }
3974 }
3975
3976
3977 /* Allocate or reset bitmaps for DF_MD. The solution bits are
3978 not touched unless the block is new. */
3979
3980 static void
3981 df_md_alloc (bitmap all_blocks)
3982 {
3983 unsigned int bb_index;
3984 bitmap_iterator bi;
3985 struct df_md_problem_data *problem_data;
3986
3987 df_grow_bb_info (df_md);
3988 if (df_md->problem_data)
3989 problem_data = (struct df_md_problem_data *) df_md->problem_data;
3990 else
3991 {
3992 problem_data = XNEW (struct df_md_problem_data);
3993 df_md->problem_data = problem_data;
3994 bitmap_obstack_initialize (&problem_data->md_bitmaps);
3995 }
3996 bitmap_initialize (&df_md_scratch, &problem_data->md_bitmaps);
3997
3998 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
3999 {
4000 struct df_md_bb_info *bb_info = df_md_get_bb_info (bb_index);
4001 /* When bitmaps are already initialized, just clear them. */
4002 if (bb_info->init.obstack)
4003 {
4004 bitmap_clear (&bb_info->init);
4005 bitmap_clear (&bb_info->gen);
4006 bitmap_clear (&bb_info->kill);
4007 bitmap_clear (&bb_info->in);
4008 bitmap_clear (&bb_info->out);
4009 }
4010 else
4011 {
4012 bitmap_initialize (&bb_info->init, &problem_data->md_bitmaps);
4013 bitmap_initialize (&bb_info->gen, &problem_data->md_bitmaps);
4014 bitmap_initialize (&bb_info->kill, &problem_data->md_bitmaps);
4015 bitmap_initialize (&bb_info->in, &problem_data->md_bitmaps);
4016 bitmap_initialize (&bb_info->out, &problem_data->md_bitmaps);
4017 }
4018 }
4019
4020 df_md->optional_p = true;
4021 }
4022
4023 /* Add the effect of the top artificial defs of BB to the multiple definitions
4024 bitmap LOCAL_MD. */
4025
4026 void
4027 df_md_simulate_artificial_defs_at_top (basic_block bb, bitmap local_md)
4028 {
4029 int bb_index = bb->index;
4030 df_ref def;
4031 FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
4032 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
4033 {
4034 unsigned int dregno = DF_REF_REGNO (def);
4035 if (DF_REF_FLAGS (def)
4036 & (DF_REF_PARTIAL | DF_REF_CONDITIONAL | DF_REF_MAY_CLOBBER))
4037 bitmap_set_bit (local_md, dregno);
4038 else
4039 bitmap_clear_bit (local_md, dregno);
4040 }
4041 }
4042
4043
4044 /* Add the effect of the defs of INSN to the reaching definitions bitmap
4045 LOCAL_MD. */
4046
4047 void
4048 df_md_simulate_one_insn (basic_block bb ATTRIBUTE_UNUSED, rtx_insn *insn,
4049 bitmap local_md)
4050 {
4051 df_ref def;
4052
4053 FOR_EACH_INSN_DEF (def, insn)
4054 {
4055 unsigned int dregno = DF_REF_REGNO (def);
4056 if ((!(df->changeable_flags & DF_NO_HARD_REGS))
4057 || (dregno >= FIRST_PSEUDO_REGISTER))
4058 {
4059 if (DF_REF_FLAGS (def)
4060 & (DF_REF_PARTIAL | DF_REF_CONDITIONAL | DF_REF_MAY_CLOBBER))
4061 bitmap_set_bit (local_md, DF_REF_ID (def));
4062 else
4063 bitmap_clear_bit (local_md, DF_REF_ID (def));
4064 }
4065 }
4066 }
4067
4068 static void
4069 df_md_bb_local_compute_process_def (struct df_md_bb_info *bb_info,
4070 df_ref def,
4071 int top_flag)
4072 {
4073 bitmap_clear (&seen_in_insn);
4074
4075 for (; def; def = DF_REF_NEXT_LOC (def))
4076 {
4077 unsigned int dregno = DF_REF_REGNO (def);
4078 if (((!(df->changeable_flags & DF_NO_HARD_REGS))
4079 || (dregno >= FIRST_PSEUDO_REGISTER))
4080 && top_flag == (DF_REF_FLAGS (def) & DF_REF_AT_TOP))
4081 {
4082 if (!bitmap_bit_p (&seen_in_insn, dregno))
4083 {
4084 if (DF_REF_FLAGS (def)
4085 & (DF_REF_PARTIAL | DF_REF_CONDITIONAL | DF_REF_MAY_CLOBBER))
4086 {
4087 bitmap_set_bit (&bb_info->gen, dregno);
4088 bitmap_clear_bit (&bb_info->kill, dregno);
4089 }
4090 else
4091 {
4092 /* When we find a clobber and a regular def,
4093 make sure the regular def wins. */
4094 bitmap_set_bit (&seen_in_insn, dregno);
4095 bitmap_set_bit (&bb_info->kill, dregno);
4096 bitmap_clear_bit (&bb_info->gen, dregno);
4097 }
4098 }
4099 }
4100 }
4101 }
4102
4103
4104 /* Compute local multiple def info for basic block BB. */
4105
4106 static void
4107 df_md_bb_local_compute (unsigned int bb_index)
4108 {
4109 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
4110 struct df_md_bb_info *bb_info = df_md_get_bb_info (bb_index);
4111 rtx_insn *insn;
4112
4113 /* Artificials are only hard regs. */
4114 if (!(df->changeable_flags & DF_NO_HARD_REGS))
4115 df_md_bb_local_compute_process_def (bb_info,
4116 df_get_artificial_defs (bb_index),
4117 DF_REF_AT_TOP);
4118
4119 FOR_BB_INSNS (bb, insn)
4120 {
4121 unsigned int uid = INSN_UID (insn);
4122 if (!INSN_P (insn))
4123 continue;
4124
4125 df_md_bb_local_compute_process_def (bb_info, DF_INSN_UID_DEFS (uid), 0);
4126 }
4127
4128 if (!(df->changeable_flags & DF_NO_HARD_REGS))
4129 df_md_bb_local_compute_process_def (bb_info,
4130 df_get_artificial_defs (bb_index),
4131 0);
4132 }
4133
4134 /* Compute local reaching def info for each basic block within BLOCKS. */
4135
4136 static void
4137 df_md_local_compute (bitmap all_blocks)
4138 {
4139 unsigned int bb_index, df_bb_index;
4140 bitmap_iterator bi1, bi2;
4141 basic_block bb;
4142 bitmap_head *frontiers;
4143
4144 bitmap_initialize (&seen_in_insn, &bitmap_default_obstack);
4145
4146 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi1)
4147 {
4148 df_md_bb_local_compute (bb_index);
4149 }
4150
4151 bitmap_clear (&seen_in_insn);
4152
4153 frontiers = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun));
4154 FOR_ALL_BB_FN (bb, cfun)
4155 bitmap_initialize (&frontiers[bb->index], &bitmap_default_obstack);
4156
4157 compute_dominance_frontiers (frontiers);
4158
4159 /* Add each basic block's kills to the nodes in the frontier of the BB. */
4160 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi1)
4161 {
4162 bitmap kill = &df_md_get_bb_info (bb_index)->kill;
4163 EXECUTE_IF_SET_IN_BITMAP (&frontiers[bb_index], 0, df_bb_index, bi2)
4164 {
4165 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, df_bb_index);
4166 if (bitmap_bit_p (all_blocks, df_bb_index))
4167 bitmap_ior_and_into (&df_md_get_bb_info (df_bb_index)->init, kill,
4168 df_get_live_in (bb));
4169 }
4170 }
4171
4172 FOR_ALL_BB_FN (bb, cfun)
4173 bitmap_clear (&frontiers[bb->index]);
4174 free (frontiers);
4175 }
4176
4177
4178 /* Reset the global solution for recalculation. */
4179
4180 static void
4181 df_md_reset (bitmap all_blocks)
4182 {
4183 unsigned int bb_index;
4184 bitmap_iterator bi;
4185
4186 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
4187 {
4188 struct df_md_bb_info *bb_info = df_md_get_bb_info (bb_index);
4189 gcc_assert (bb_info);
4190 bitmap_clear (&bb_info->in);
4191 bitmap_clear (&bb_info->out);
4192 }
4193 }
4194
4195 static bool
4196 df_md_transfer_function (int bb_index)
4197 {
4198 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
4199 struct df_md_bb_info *bb_info = df_md_get_bb_info (bb_index);
4200 bitmap in = &bb_info->in;
4201 bitmap out = &bb_info->out;
4202 bitmap gen = &bb_info->gen;
4203 bitmap kill = &bb_info->kill;
4204
4205 /* We need to use a scratch set here so that the value returned from this
4206 function invocation properly reflects whether the sets changed in a
4207 significant way; i.e. not just because the live set was anded in. */
4208 bitmap_and (&df_md_scratch, gen, df_get_live_out (bb));
4209
4210 /* Multiple definitions of a register are not relevant if it is not
4211 live. Thus we trim the result to the places where it is live. */
4212 bitmap_and_into (in, df_get_live_in (bb));
4213
4214 return bitmap_ior_and_compl (out, &df_md_scratch, in, kill);
4215 }
4216
4217 /* Initialize the solution bit vectors for problem. */
4218
4219 static void
4220 df_md_init (bitmap all_blocks)
4221 {
4222 unsigned int bb_index;
4223 bitmap_iterator bi;
4224
4225 EXECUTE_IF_SET_IN_BITMAP (all_blocks, 0, bb_index, bi)
4226 {
4227 struct df_md_bb_info *bb_info = df_md_get_bb_info (bb_index);
4228
4229 bitmap_copy (&bb_info->in, &bb_info->init);
4230 df_md_transfer_function (bb_index);
4231 }
4232 }
4233
4234 static void
4235 df_md_confluence_0 (basic_block bb)
4236 {
4237 struct df_md_bb_info *bb_info = df_md_get_bb_info (bb->index);
4238 bitmap_copy (&bb_info->in, &bb_info->init);
4239 }
4240
4241 /* In of target gets or of out of source. */
4242
4243 static bool
4244 df_md_confluence_n (edge e)
4245 {
4246 bitmap op1 = &df_md_get_bb_info (e->dest->index)->in;
4247 bitmap op2 = &df_md_get_bb_info (e->src->index)->out;
4248
4249 if (e->flags & EDGE_FAKE)
4250 return false;
4251
4252 if (e->flags & EDGE_EH)
4253 return bitmap_ior_and_compl_into (op1, op2,
4254 regs_invalidated_by_call_regset);
4255 else
4256 return bitmap_ior_into (op1, op2);
4257 }
4258
4259 /* Free all storage associated with the problem. */
4260
4261 static void
4262 df_md_free (void)
4263 {
4264 struct df_md_problem_data *problem_data
4265 = (struct df_md_problem_data *) df_md->problem_data;
4266
4267 bitmap_obstack_release (&problem_data->md_bitmaps);
4268 free (problem_data);
4269 df_md->problem_data = NULL;
4270
4271 df_md->block_info_size = 0;
4272 free (df_md->block_info);
4273 df_md->block_info = NULL;
4274 free (df_md);
4275 }
4276
4277
4278 /* Debugging info at top of bb. */
4279
4280 static void
4281 df_md_top_dump (basic_block bb, FILE *file)
4282 {
4283 struct df_md_bb_info *bb_info = df_md_get_bb_info (bb->index);
4284 if (!bb_info)
4285 return;
4286
4287 fprintf (file, ";; md in \t");
4288 df_print_regset (file, &bb_info->in);
4289 fprintf (file, ";; md init \t");
4290 df_print_regset (file, &bb_info->init);
4291 fprintf (file, ";; md gen \t");
4292 df_print_regset (file, &bb_info->gen);
4293 fprintf (file, ";; md kill \t");
4294 df_print_regset (file, &bb_info->kill);
4295 }
4296
4297 /* Debugging info at bottom of bb. */
4298
4299 static void
4300 df_md_bottom_dump (basic_block bb, FILE *file)
4301 {
4302 struct df_md_bb_info *bb_info = df_md_get_bb_info (bb->index);
4303 if (!bb_info)
4304 return;
4305
4306 fprintf (file, ";; md out \t");
4307 df_print_regset (file, &bb_info->out);
4308 }
4309
4310 static struct df_problem problem_MD =
4311 {
4312 DF_MD, /* Problem id. */
4313 DF_FORWARD, /* Direction. */
4314 df_md_alloc, /* Allocate the problem specific data. */
4315 df_md_reset, /* Reset global information. */
4316 df_md_free_bb_info, /* Free basic block info. */
4317 df_md_local_compute, /* Local compute function. */
4318 df_md_init, /* Init the solution specific data. */
4319 df_worklist_dataflow, /* Worklist solver. */
4320 df_md_confluence_0, /* Confluence operator 0. */
4321 df_md_confluence_n, /* Confluence operator n. */
4322 df_md_transfer_function, /* Transfer function. */
4323 NULL, /* Finalize function. */
4324 df_md_free, /* Free all of the problem information. */
4325 df_md_free, /* Remove this problem from the stack of dataflow problems. */
4326 NULL, /* Debugging. */
4327 df_md_top_dump, /* Debugging start block. */
4328 df_md_bottom_dump, /* Debugging end block. */
4329 NULL, /* Debugging start insn. */
4330 NULL, /* Debugging end insn. */
4331 NULL, /* Incremental solution verify start. */
4332 NULL, /* Incremental solution verify end. */
4333 NULL, /* Dependent problem. */
4334 sizeof (struct df_md_bb_info),/* Size of entry of block_info array. */
4335 TV_DF_MD, /* Timing variable. */
4336 false /* Reset blocks on dropping out of blocks_to_analyze. */
4337 };
4338
4339 /* Create a new MD instance and add it to the existing instance
4340 of DF. */
4341
4342 void
4343 df_md_add_problem (void)
4344 {
4345 df_add_problem (&problem_MD);
4346 }
4347
4348
4349