OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [df-problems.c] - Blame information for rev 824

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.