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