OSDN Git Service

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