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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [cselib.c] - Blame information for rev 12

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 jlechner
/* Common subexpression elimination library for GNU compiler.
2
   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3
   1999, 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
4
 
5
This file is part of GCC.
6
 
7
GCC is free software; you can redistribute it and/or modify it under
8
the terms of the GNU General Public License as published by the Free
9
Software Foundation; either version 2, or (at your option) any later
10
version.
11
 
12
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13
WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15
for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with GCC; see the file COPYING.  If not, write to the Free
19
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20
02110-1301, USA.  */
21
 
22
#include "config.h"
23
#include "system.h"
24
#include "coretypes.h"
25
#include "tm.h"
26
 
27
#include "rtl.h"
28
#include "tm_p.h"
29
#include "regs.h"
30
#include "hard-reg-set.h"
31
#include "flags.h"
32
#include "real.h"
33
#include "insn-config.h"
34
#include "recog.h"
35
#include "function.h"
36
#include "emit-rtl.h"
37
#include "toplev.h"
38
#include "output.h"
39
#include "ggc.h"
40
#include "hashtab.h"
41
#include "cselib.h"
42
#include "params.h"
43
#include "alloc-pool.h"
44
#include "target.h"
45
 
46
static bool cselib_record_memory;
47
static int entry_and_rtx_equal_p (const void *, const void *);
48
static hashval_t get_value_hash (const void *);
49
static struct elt_list *new_elt_list (struct elt_list *, cselib_val *);
50
static struct elt_loc_list *new_elt_loc_list (struct elt_loc_list *, rtx);
51
static void unchain_one_value (cselib_val *);
52
static void unchain_one_elt_list (struct elt_list **);
53
static void unchain_one_elt_loc_list (struct elt_loc_list **);
54
static int discard_useless_locs (void **, void *);
55
static int discard_useless_values (void **, void *);
56
static void remove_useless_values (void);
57
static rtx wrap_constant (enum machine_mode, rtx);
58
static unsigned int cselib_hash_rtx (rtx, int);
59
static cselib_val *new_cselib_val (unsigned int, enum machine_mode);
60
static void add_mem_for_addr (cselib_val *, cselib_val *, rtx);
61
static cselib_val *cselib_lookup_mem (rtx, int);
62
static void cselib_invalidate_regno (unsigned int, enum machine_mode);
63
static void cselib_invalidate_mem (rtx);
64
static void cselib_record_set (rtx, cselib_val *, cselib_val *);
65
static void cselib_record_sets (rtx);
66
 
67
/* There are three ways in which cselib can look up an rtx:
68
   - for a REG, the reg_values table (which is indexed by regno) is used
69
   - for a MEM, we recursively look up its address and then follow the
70
     addr_list of that value
71
   - for everything else, we compute a hash value and go through the hash
72
     table.  Since different rtx's can still have the same hash value,
73
     this involves walking the table entries for a given value and comparing
74
     the locations of the entries with the rtx we are looking up.  */
75
 
76
/* A table that enables us to look up elts by their value.  */
77
static htab_t hash_table;
78
 
79
/* This is a global so we don't have to pass this through every function.
80
   It is used in new_elt_loc_list to set SETTING_INSN.  */
81
static rtx cselib_current_insn;
82
static bool cselib_current_insn_in_libcall;
83
 
84
/* Every new unknown value gets a unique number.  */
85
static unsigned int next_unknown_value;
86
 
87
/* The number of registers we had when the varrays were last resized.  */
88
static unsigned int cselib_nregs;
89
 
90
/* Count values without known locations.  Whenever this grows too big, we
91
   remove these useless values from the table.  */
92
static int n_useless_values;
93
 
94
/* Number of useless values before we remove them from the hash table.  */
95
#define MAX_USELESS_VALUES 32
96
 
97
/* This table maps from register number to values.  It does not
98
   contain pointers to cselib_val structures, but rather elt_lists.
99
   The purpose is to be able to refer to the same register in
100
   different modes.  The first element of the list defines the mode in
101
   which the register was set; if the mode is unknown or the value is
102
   no longer valid in that mode, ELT will be NULL for the first
103
   element.  */
104
static struct elt_list **reg_values;
105
static unsigned int reg_values_size;
106
#define REG_VALUES(i) reg_values[i]
107
 
108
/* The largest number of hard regs used by any entry added to the
109
   REG_VALUES table.  Cleared on each cselib_clear_table() invocation.  */
110
static unsigned int max_value_regs;
111
 
112
/* Here the set of indices I with REG_VALUES(I) != 0 is saved.  This is used
113
   in cselib_clear_table() for fast emptying.  */
114
static unsigned int *used_regs;
115
static unsigned int n_used_regs;
116
 
117
/* We pass this to cselib_invalidate_mem to invalidate all of
118
   memory for a non-const call instruction.  */
119
static GTY(()) rtx callmem;
120
 
121
/* Set by discard_useless_locs if it deleted the last location of any
122
   value.  */
123
static int values_became_useless;
124
 
125
/* Used as stop element of the containing_mem list so we can check
126
   presence in the list by checking the next pointer.  */
127
static cselib_val dummy_val;
128
 
129
/* Used to list all values that contain memory reference.
130
   May or may not contain the useless values - the list is compacted
131
   each time memory is invalidated.  */
132
static cselib_val *first_containing_mem = &dummy_val;
133
static alloc_pool elt_loc_list_pool, elt_list_pool, cselib_val_pool, value_pool;
134
 
135
 
136
/* Allocate a struct elt_list and fill in its two elements with the
137
   arguments.  */
138
 
139
static inline struct elt_list *
140
new_elt_list (struct elt_list *next, cselib_val *elt)
141
{
142
  struct elt_list *el;
143
  el = pool_alloc (elt_list_pool);
144
  el->next = next;
145
  el->elt = elt;
146
  return el;
147
}
148
 
149
/* Allocate a struct elt_loc_list and fill in its two elements with the
150
   arguments.  */
151
 
152
static inline struct elt_loc_list *
153
new_elt_loc_list (struct elt_loc_list *next, rtx loc)
154
{
155
  struct elt_loc_list *el;
156
  el = pool_alloc (elt_loc_list_pool);
157
  el->next = next;
158
  el->loc = loc;
159
  el->setting_insn = cselib_current_insn;
160
  el->in_libcall = cselib_current_insn_in_libcall;
161
  return el;
162
}
163
 
164
/* The elt_list at *PL is no longer needed.  Unchain it and free its
165
   storage.  */
166
 
167
static inline void
168
unchain_one_elt_list (struct elt_list **pl)
169
{
170
  struct elt_list *l = *pl;
171
 
172
  *pl = l->next;
173
  pool_free (elt_list_pool, l);
174
}
175
 
176
/* Likewise for elt_loc_lists.  */
177
 
178
static void
179
unchain_one_elt_loc_list (struct elt_loc_list **pl)
180
{
181
  struct elt_loc_list *l = *pl;
182
 
183
  *pl = l->next;
184
  pool_free (elt_loc_list_pool, l);
185
}
186
 
187
/* Likewise for cselib_vals.  This also frees the addr_list associated with
188
   V.  */
189
 
190
static void
191
unchain_one_value (cselib_val *v)
192
{
193
  while (v->addr_list)
194
    unchain_one_elt_list (&v->addr_list);
195
 
196
  pool_free (cselib_val_pool, v);
197
}
198
 
199
/* Remove all entries from the hash table.  Also used during
200
   initialization.  If CLEAR_ALL isn't set, then only clear the entries
201
   which are known to have been used.  */
202
 
203
void
204
cselib_clear_table (void)
205
{
206
  unsigned int i;
207
 
208
  for (i = 0; i < n_used_regs; i++)
209
    REG_VALUES (used_regs[i]) = 0;
210
 
211
  max_value_regs = 0;
212
 
213
  n_used_regs = 0;
214
 
215
  htab_empty (hash_table);
216
 
217
  n_useless_values = 0;
218
 
219
  next_unknown_value = 0;
220
 
221
  first_containing_mem = &dummy_val;
222
}
223
 
224
/* The equality test for our hash table.  The first argument ENTRY is a table
225
   element (i.e. a cselib_val), while the second arg X is an rtx.  We know
226
   that all callers of htab_find_slot_with_hash will wrap CONST_INTs into a
227
   CONST of an appropriate mode.  */
228
 
229
static int
230
entry_and_rtx_equal_p (const void *entry, const void *x_arg)
231
{
232
  struct elt_loc_list *l;
233
  const cselib_val *v = (const cselib_val *) entry;
234
  rtx x = (rtx) x_arg;
235
  enum machine_mode mode = GET_MODE (x);
236
 
237
  gcc_assert (GET_CODE (x) != CONST_INT
238
              && (mode != VOIDmode || GET_CODE (x) != CONST_DOUBLE));
239
 
240
  if (mode != GET_MODE (v->u.val_rtx))
241
    return 0;
242
 
243
  /* Unwrap X if necessary.  */
244
  if (GET_CODE (x) == CONST
245
      && (GET_CODE (XEXP (x, 0)) == CONST_INT
246
          || GET_CODE (XEXP (x, 0)) == CONST_DOUBLE))
247
    x = XEXP (x, 0);
248
 
249
  /* We don't guarantee that distinct rtx's have different hash values,
250
     so we need to do a comparison.  */
251
  for (l = v->locs; l; l = l->next)
252
    if (rtx_equal_for_cselib_p (l->loc, x))
253
      return 1;
254
 
255
  return 0;
256
}
257
 
258
/* The hash function for our hash table.  The value is always computed with
259
   cselib_hash_rtx when adding an element; this function just extracts the
260
   hash value from a cselib_val structure.  */
261
 
262
static hashval_t
263
get_value_hash (const void *entry)
264
{
265
  const cselib_val *v = (const cselib_val *) entry;
266
  return v->value;
267
}
268
 
269
/* Return true if X contains a VALUE rtx.  If ONLY_USELESS is set, we
270
   only return true for values which point to a cselib_val whose value
271
   element has been set to zero, which implies the cselib_val will be
272
   removed.  */
273
 
274
int
275
references_value_p (rtx x, int only_useless)
276
{
277
  enum rtx_code code = GET_CODE (x);
278
  const char *fmt = GET_RTX_FORMAT (code);
279
  int i, j;
280
 
281
  if (GET_CODE (x) == VALUE
282
      && (! only_useless || CSELIB_VAL_PTR (x)->locs == 0))
283
    return 1;
284
 
285
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
286
    {
287
      if (fmt[i] == 'e' && references_value_p (XEXP (x, i), only_useless))
288
        return 1;
289
      else if (fmt[i] == 'E')
290
        for (j = 0; j < XVECLEN (x, i); j++)
291
          if (references_value_p (XVECEXP (x, i, j), only_useless))
292
            return 1;
293
    }
294
 
295
  return 0;
296
}
297
 
298
/* For all locations found in X, delete locations that reference useless
299
   values (i.e. values without any location).  Called through
300
   htab_traverse.  */
301
 
302
static int
303
discard_useless_locs (void **x, void *info ATTRIBUTE_UNUSED)
304
{
305
  cselib_val *v = (cselib_val *)*x;
306
  struct elt_loc_list **p = &v->locs;
307
  int had_locs = v->locs != 0;
308
 
309
  while (*p)
310
    {
311
      if (references_value_p ((*p)->loc, 1))
312
        unchain_one_elt_loc_list (p);
313
      else
314
        p = &(*p)->next;
315
    }
316
 
317
  if (had_locs && v->locs == 0)
318
    {
319
      n_useless_values++;
320
      values_became_useless = 1;
321
    }
322
  return 1;
323
}
324
 
325
/* If X is a value with no locations, remove it from the hashtable.  */
326
 
327
static int
328
discard_useless_values (void **x, void *info ATTRIBUTE_UNUSED)
329
{
330
  cselib_val *v = (cselib_val *)*x;
331
 
332
  if (v->locs == 0)
333
    {
334
      CSELIB_VAL_PTR (v->u.val_rtx) = NULL;
335
      htab_clear_slot (hash_table, x);
336
      unchain_one_value (v);
337
      n_useless_values--;
338
    }
339
 
340
  return 1;
341
}
342
 
343
/* Clean out useless values (i.e. those which no longer have locations
344
   associated with them) from the hash table.  */
345
 
346
static void
347
remove_useless_values (void)
348
{
349
  cselib_val **p, *v;
350
  /* First pass: eliminate locations that reference the value.  That in
351
     turn can make more values useless.  */
352
  do
353
    {
354
      values_became_useless = 0;
355
      htab_traverse (hash_table, discard_useless_locs, 0);
356
    }
357
  while (values_became_useless);
358
 
359
  /* Second pass: actually remove the values.  */
360
 
361
  p = &first_containing_mem;
362
  for (v = *p; v != &dummy_val; v = v->next_containing_mem)
363
    if (v->locs)
364
      {
365
        *p = v;
366
        p = &(*p)->next_containing_mem;
367
      }
368
  *p = &dummy_val;
369
 
370
  htab_traverse (hash_table, discard_useless_values, 0);
371
 
372
  gcc_assert (!n_useless_values);
373
}
374
 
375
/* Return the mode in which a register was last set.  If X is not a
376
   register, return its mode.  If the mode in which the register was
377
   set is not known, or the value was already clobbered, return
378
   VOIDmode.  */
379
 
380
enum machine_mode
381
cselib_reg_set_mode (rtx x)
382
{
383
  if (!REG_P (x))
384
    return GET_MODE (x);
385
 
386
  if (REG_VALUES (REGNO (x)) == NULL
387
      || REG_VALUES (REGNO (x))->elt == NULL)
388
    return VOIDmode;
389
 
390
  return GET_MODE (REG_VALUES (REGNO (x))->elt->u.val_rtx);
391
}
392
 
393
/* Return nonzero if we can prove that X and Y contain the same value, taking
394
   our gathered information into account.  */
395
 
396
int
397
rtx_equal_for_cselib_p (rtx x, rtx y)
398
{
399
  enum rtx_code code;
400
  const char *fmt;
401
  int i;
402
 
403
  if (REG_P (x) || MEM_P (x))
404
    {
405
      cselib_val *e = cselib_lookup (x, GET_MODE (x), 0);
406
 
407
      if (e)
408
        x = e->u.val_rtx;
409
    }
410
 
411
  if (REG_P (y) || MEM_P (y))
412
    {
413
      cselib_val *e = cselib_lookup (y, GET_MODE (y), 0);
414
 
415
      if (e)
416
        y = e->u.val_rtx;
417
    }
418
 
419
  if (x == y)
420
    return 1;
421
 
422
  if (GET_CODE (x) == VALUE && GET_CODE (y) == VALUE)
423
    return CSELIB_VAL_PTR (x) == CSELIB_VAL_PTR (y);
424
 
425
  if (GET_CODE (x) == VALUE)
426
    {
427
      cselib_val *e = CSELIB_VAL_PTR (x);
428
      struct elt_loc_list *l;
429
 
430
      for (l = e->locs; l; l = l->next)
431
        {
432
          rtx t = l->loc;
433
 
434
          /* Avoid infinite recursion.  */
435
          if (REG_P (t) || MEM_P (t))
436
            continue;
437
          else if (rtx_equal_for_cselib_p (t, y))
438
            return 1;
439
        }
440
 
441
      return 0;
442
    }
443
 
444
  if (GET_CODE (y) == VALUE)
445
    {
446
      cselib_val *e = CSELIB_VAL_PTR (y);
447
      struct elt_loc_list *l;
448
 
449
      for (l = e->locs; l; l = l->next)
450
        {
451
          rtx t = l->loc;
452
 
453
          if (REG_P (t) || MEM_P (t))
454
            continue;
455
          else if (rtx_equal_for_cselib_p (x, t))
456
            return 1;
457
        }
458
 
459
      return 0;
460
    }
461
 
462
  if (GET_CODE (x) != GET_CODE (y) || GET_MODE (x) != GET_MODE (y))
463
    return 0;
464
 
465
  /* These won't be handled correctly by the code below.  */
466
  switch (GET_CODE (x))
467
    {
468
    case CONST_DOUBLE:
469
      return 0;
470
 
471
    case LABEL_REF:
472
      return XEXP (x, 0) == XEXP (y, 0);
473
 
474
    default:
475
      break;
476
    }
477
 
478
  code = GET_CODE (x);
479
  fmt = GET_RTX_FORMAT (code);
480
 
481
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
482
    {
483
      int j;
484
 
485
      switch (fmt[i])
486
        {
487
        case 'w':
488
          if (XWINT (x, i) != XWINT (y, i))
489
            return 0;
490
          break;
491
 
492
        case 'n':
493
        case 'i':
494
          if (XINT (x, i) != XINT (y, i))
495
            return 0;
496
          break;
497
 
498
        case 'V':
499
        case 'E':
500
          /* Two vectors must have the same length.  */
501
          if (XVECLEN (x, i) != XVECLEN (y, i))
502
            return 0;
503
 
504
          /* And the corresponding elements must match.  */
505
          for (j = 0; j < XVECLEN (x, i); j++)
506
            if (! rtx_equal_for_cselib_p (XVECEXP (x, i, j),
507
                                          XVECEXP (y, i, j)))
508
              return 0;
509
          break;
510
 
511
        case 'e':
512
          if (i == 1
513
              && targetm.commutative_p (x, UNKNOWN)
514
              && rtx_equal_for_cselib_p (XEXP (x, 1), XEXP (y, 0))
515
              && rtx_equal_for_cselib_p (XEXP (x, 0), XEXP (y, 1)))
516
            return 1;
517
          if (! rtx_equal_for_cselib_p (XEXP (x, i), XEXP (y, i)))
518
            return 0;
519
          break;
520
 
521
        case 'S':
522
        case 's':
523
          if (strcmp (XSTR (x, i), XSTR (y, i)))
524
            return 0;
525
          break;
526
 
527
        case 'u':
528
          /* These are just backpointers, so they don't matter.  */
529
          break;
530
 
531
        case '0':
532
        case 't':
533
          break;
534
 
535
          /* It is believed that rtx's at this level will never
536
             contain anything but integers and other rtx's,
537
             except for within LABEL_REFs and SYMBOL_REFs.  */
538
        default:
539
          gcc_unreachable ();
540
        }
541
    }
542
  return 1;
543
}
544
 
545
/* We need to pass down the mode of constants through the hash table
546
   functions.  For that purpose, wrap them in a CONST of the appropriate
547
   mode.  */
548
static rtx
549
wrap_constant (enum machine_mode mode, rtx x)
550
{
551
  if (GET_CODE (x) != CONST_INT
552
      && (GET_CODE (x) != CONST_DOUBLE || GET_MODE (x) != VOIDmode))
553
    return x;
554
  gcc_assert (mode != VOIDmode);
555
  return gen_rtx_CONST (mode, x);
556
}
557
 
558
/* Hash an rtx.  Return 0 if we couldn't hash the rtx.
559
   For registers and memory locations, we look up their cselib_val structure
560
   and return its VALUE element.
561
   Possible reasons for return 0 are: the object is volatile, or we couldn't
562
   find a register or memory location in the table and CREATE is zero.  If
563
   CREATE is nonzero, table elts are created for regs and mem.
564
   N.B. this hash function returns the same hash value for RTXes that
565
   differ only in the order of operands, thus it is suitable for comparisons
566
   that take commutativity into account.
567
   If we wanted to also support associative rules, we'd have to use a different
568
   strategy to avoid returning spurious 0, e.g. return ~(~0U >> 1) .
569
   We used to have a MODE argument for hashing for CONST_INTs, but that
570
   didn't make sense, since it caused spurious hash differences between
571
    (set (reg:SI 1) (const_int))
572
    (plus:SI (reg:SI 2) (reg:SI 1))
573
   and
574
    (plus:SI (reg:SI 2) (const_int))
575
   If the mode is important in any context, it must be checked specifically
576
   in a comparison anyway, since relying on hash differences is unsafe.  */
577
 
578
static unsigned int
579
cselib_hash_rtx (rtx x, int create)
580
{
581
  cselib_val *e;
582
  int i, j;
583
  enum rtx_code code;
584
  const char *fmt;
585
  unsigned int hash = 0;
586
 
587
  code = GET_CODE (x);
588
  hash += (unsigned) code + (unsigned) GET_MODE (x);
589
 
590
  switch (code)
591
    {
592
    case MEM:
593
    case REG:
594
      e = cselib_lookup (x, GET_MODE (x), create);
595
      if (! e)
596
        return 0;
597
 
598
      return e->value;
599
 
600
    case CONST_INT:
601
      hash += ((unsigned) CONST_INT << 7) + INTVAL (x);
602
      return hash ? hash : (unsigned int) CONST_INT;
603
 
604
    case CONST_DOUBLE:
605
      /* This is like the general case, except that it only counts
606
         the integers representing the constant.  */
607
      hash += (unsigned) code + (unsigned) GET_MODE (x);
608
      if (GET_MODE (x) != VOIDmode)
609
        hash += real_hash (CONST_DOUBLE_REAL_VALUE (x));
610
      else
611
        hash += ((unsigned) CONST_DOUBLE_LOW (x)
612
                 + (unsigned) CONST_DOUBLE_HIGH (x));
613
      return hash ? hash : (unsigned int) CONST_DOUBLE;
614
 
615
    case CONST_VECTOR:
616
      {
617
        int units;
618
        rtx elt;
619
 
620
        units = CONST_VECTOR_NUNITS (x);
621
 
622
        for (i = 0; i < units; ++i)
623
          {
624
            elt = CONST_VECTOR_ELT (x, i);
625
            hash += cselib_hash_rtx (elt, 0);
626
          }
627
 
628
        return hash;
629
      }
630
 
631
      /* Assume there is only one rtx object for any given label.  */
632
    case LABEL_REF:
633
      hash
634
        += ((unsigned) LABEL_REF << 7) + (unsigned long) XEXP (x, 0);
635
      return hash ? hash : (unsigned int) LABEL_REF;
636
 
637
    case SYMBOL_REF:
638
      hash
639
        += ((unsigned) SYMBOL_REF << 7) + (unsigned long) XSTR (x, 0);
640
      return hash ? hash : (unsigned int) SYMBOL_REF;
641
 
642
    case PRE_DEC:
643
    case PRE_INC:
644
    case POST_DEC:
645
    case POST_INC:
646
    case POST_MODIFY:
647
    case PRE_MODIFY:
648
    case PC:
649
    case CC0:
650
    case CALL:
651
    case UNSPEC_VOLATILE:
652
      return 0;
653
 
654
    case ASM_OPERANDS:
655
      if (MEM_VOLATILE_P (x))
656
        return 0;
657
 
658
      break;
659
 
660
    default:
661
      break;
662
    }
663
 
664
  i = GET_RTX_LENGTH (code) - 1;
665
  fmt = GET_RTX_FORMAT (code);
666
  for (; i >= 0; i--)
667
    {
668
      switch (fmt[i])
669
        {
670
        case 'e':
671
          {
672
            rtx tem = XEXP (x, i);
673
            unsigned int tem_hash = cselib_hash_rtx (tem, create);
674
 
675
            if (tem_hash == 0)
676
              return 0;
677
 
678
            hash += tem_hash;
679
          }
680
          break;
681
        case 'E':
682
          for (j = 0; j < XVECLEN (x, i); j++)
683
            {
684
              unsigned int tem_hash
685
                = cselib_hash_rtx (XVECEXP (x, i, j), create);
686
 
687
              if (tem_hash == 0)
688
                return 0;
689
 
690
              hash += tem_hash;
691
            }
692
          break;
693
 
694
        case 's':
695
          {
696
            const unsigned char *p = (const unsigned char *) XSTR (x, i);
697
 
698
            if (p)
699
              while (*p)
700
                hash += *p++;
701
            break;
702
          }
703
 
704
        case 'i':
705
          hash += XINT (x, i);
706
          break;
707
 
708
        case '0':
709
        case 't':
710
          /* unused */
711
          break;
712
 
713
        default:
714
          gcc_unreachable ();
715
        }
716
    }
717
 
718
  return hash ? hash : 1 + (unsigned int) GET_CODE (x);
719
}
720
 
721
/* Create a new value structure for VALUE and initialize it.  The mode of the
722
   value is MODE.  */
723
 
724
static inline cselib_val *
725
new_cselib_val (unsigned int value, enum machine_mode mode)
726
{
727
  cselib_val *e = pool_alloc (cselib_val_pool);
728
 
729
  gcc_assert (value);
730
 
731
  e->value = value;
732
  /* We use an alloc pool to allocate this RTL construct because it
733
     accounts for about 8% of the overall memory usage.  We know
734
     precisely when we can have VALUE RTXen (when cselib is active)
735
     so we don't need to put them in garbage collected memory.
736
     ??? Why should a VALUE be an RTX in the first place?  */
737
  e->u.val_rtx = pool_alloc (value_pool);
738
  memset (e->u.val_rtx, 0, RTX_HDR_SIZE);
739
  PUT_CODE (e->u.val_rtx, VALUE);
740
  PUT_MODE (e->u.val_rtx, mode);
741
  CSELIB_VAL_PTR (e->u.val_rtx) = e;
742
  e->addr_list = 0;
743
  e->locs = 0;
744
  e->next_containing_mem = 0;
745
  return e;
746
}
747
 
748
/* ADDR_ELT is a value that is used as address.  MEM_ELT is the value that
749
   contains the data at this address.  X is a MEM that represents the
750
   value.  Update the two value structures to represent this situation.  */
751
 
752
static void
753
add_mem_for_addr (cselib_val *addr_elt, cselib_val *mem_elt, rtx x)
754
{
755
  struct elt_loc_list *l;
756
 
757
  /* Avoid duplicates.  */
758
  for (l = mem_elt->locs; l; l = l->next)
759
    if (MEM_P (l->loc)
760
        && CSELIB_VAL_PTR (XEXP (l->loc, 0)) == addr_elt)
761
      return;
762
 
763
  addr_elt->addr_list = new_elt_list (addr_elt->addr_list, mem_elt);
764
  mem_elt->locs
765
    = new_elt_loc_list (mem_elt->locs,
766
                        replace_equiv_address_nv (x, addr_elt->u.val_rtx));
767
  if (mem_elt->next_containing_mem == NULL)
768
    {
769
      mem_elt->next_containing_mem = first_containing_mem;
770
      first_containing_mem = mem_elt;
771
    }
772
}
773
 
774
/* Subroutine of cselib_lookup.  Return a value for X, which is a MEM rtx.
775
   If CREATE, make a new one if we haven't seen it before.  */
776
 
777
static cselib_val *
778
cselib_lookup_mem (rtx x, int create)
779
{
780
  enum machine_mode mode = GET_MODE (x);
781
  void **slot;
782
  cselib_val *addr;
783
  cselib_val *mem_elt;
784
  struct elt_list *l;
785
 
786
  if (MEM_VOLATILE_P (x) || mode == BLKmode
787
      || !cselib_record_memory
788
      || (FLOAT_MODE_P (mode) && flag_float_store))
789
    return 0;
790
 
791
  /* Look up the value for the address.  */
792
  addr = cselib_lookup (XEXP (x, 0), mode, create);
793
  if (! addr)
794
    return 0;
795
 
796
  /* Find a value that describes a value of our mode at that address.  */
797
  for (l = addr->addr_list; l; l = l->next)
798
    if (GET_MODE (l->elt->u.val_rtx) == mode)
799
      return l->elt;
800
 
801
  if (! create)
802
    return 0;
803
 
804
  mem_elt = new_cselib_val (++next_unknown_value, mode);
805
  add_mem_for_addr (addr, mem_elt, x);
806
  slot = htab_find_slot_with_hash (hash_table, wrap_constant (mode, x),
807
                                   mem_elt->value, INSERT);
808
  *slot = mem_elt;
809
  return mem_elt;
810
}
811
 
812
/* Walk rtx X and replace all occurrences of REG and MEM subexpressions
813
   with VALUE expressions.  This way, it becomes independent of changes
814
   to registers and memory.
815
   X isn't actually modified; if modifications are needed, new rtl is
816
   allocated.  However, the return value can share rtl with X.  */
817
 
818
rtx
819
cselib_subst_to_values (rtx x)
820
{
821
  enum rtx_code code = GET_CODE (x);
822
  const char *fmt = GET_RTX_FORMAT (code);
823
  cselib_val *e;
824
  struct elt_list *l;
825
  rtx copy = x;
826
  int i;
827
 
828
  switch (code)
829
    {
830
    case REG:
831
      l = REG_VALUES (REGNO (x));
832
      if (l && l->elt == NULL)
833
        l = l->next;
834
      for (; l; l = l->next)
835
        if (GET_MODE (l->elt->u.val_rtx) == GET_MODE (x))
836
          return l->elt->u.val_rtx;
837
 
838
      gcc_unreachable ();
839
 
840
    case MEM:
841
      e = cselib_lookup_mem (x, 0);
842
      if (! e)
843
        {
844
          /* This happens for autoincrements.  Assign a value that doesn't
845
             match any other.  */
846
          e = new_cselib_val (++next_unknown_value, GET_MODE (x));
847
        }
848
      return e->u.val_rtx;
849
 
850
    case CONST_DOUBLE:
851
    case CONST_VECTOR:
852
    case CONST_INT:
853
      return x;
854
 
855
    case POST_INC:
856
    case PRE_INC:
857
    case POST_DEC:
858
    case PRE_DEC:
859
    case POST_MODIFY:
860
    case PRE_MODIFY:
861
      e = new_cselib_val (++next_unknown_value, GET_MODE (x));
862
      return e->u.val_rtx;
863
 
864
    default:
865
      break;
866
    }
867
 
868
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
869
    {
870
      if (fmt[i] == 'e')
871
        {
872
          rtx t = cselib_subst_to_values (XEXP (x, i));
873
 
874
          if (t != XEXP (x, i) && x == copy)
875
            copy = shallow_copy_rtx (x);
876
 
877
          XEXP (copy, i) = t;
878
        }
879
      else if (fmt[i] == 'E')
880
        {
881
          int j, k;
882
 
883
          for (j = 0; j < XVECLEN (x, i); j++)
884
            {
885
              rtx t = cselib_subst_to_values (XVECEXP (x, i, j));
886
 
887
              if (t != XVECEXP (x, i, j) && XVEC (x, i) == XVEC (copy, i))
888
                {
889
                  if (x == copy)
890
                    copy = shallow_copy_rtx (x);
891
 
892
                  XVEC (copy, i) = rtvec_alloc (XVECLEN (x, i));
893
                  for (k = 0; k < j; k++)
894
                    XVECEXP (copy, i, k) = XVECEXP (x, i, k);
895
                }
896
 
897
              XVECEXP (copy, i, j) = t;
898
            }
899
        }
900
    }
901
 
902
  return copy;
903
}
904
 
905
/* Look up the rtl expression X in our tables and return the value it has.
906
   If CREATE is zero, we return NULL if we don't know the value.  Otherwise,
907
   we create a new one if possible, using mode MODE if X doesn't have a mode
908
   (i.e. because it's a constant).  */
909
 
910
cselib_val *
911
cselib_lookup (rtx x, enum machine_mode mode, int create)
912
{
913
  void **slot;
914
  cselib_val *e;
915
  unsigned int hashval;
916
 
917
  if (GET_MODE (x) != VOIDmode)
918
    mode = GET_MODE (x);
919
 
920
  if (GET_CODE (x) == VALUE)
921
    return CSELIB_VAL_PTR (x);
922
 
923
  if (REG_P (x))
924
    {
925
      struct elt_list *l;
926
      unsigned int i = REGNO (x);
927
 
928
      l = REG_VALUES (i);
929
      if (l && l->elt == NULL)
930
        l = l->next;
931
      for (; l; l = l->next)
932
        if (mode == GET_MODE (l->elt->u.val_rtx))
933
          return l->elt;
934
 
935
      if (! create)
936
        return 0;
937
 
938
      if (i < FIRST_PSEUDO_REGISTER)
939
        {
940
          unsigned int n = hard_regno_nregs[i][mode];
941
 
942
          if (n > max_value_regs)
943
            max_value_regs = n;
944
        }
945
 
946
      e = new_cselib_val (++next_unknown_value, GET_MODE (x));
947
      e->locs = new_elt_loc_list (e->locs, x);
948
      if (REG_VALUES (i) == 0)
949
        {
950
          /* Maintain the invariant that the first entry of
951
             REG_VALUES, if present, must be the value used to set the
952
             register, or NULL.  */
953
          used_regs[n_used_regs++] = i;
954
          REG_VALUES (i) = new_elt_list (REG_VALUES (i), NULL);
955
        }
956
      REG_VALUES (i)->next = new_elt_list (REG_VALUES (i)->next, e);
957
      slot = htab_find_slot_with_hash (hash_table, x, e->value, INSERT);
958
      *slot = e;
959
      return e;
960
    }
961
 
962
  if (MEM_P (x))
963
    return cselib_lookup_mem (x, create);
964
 
965
  hashval = cselib_hash_rtx (x, create);
966
  /* Can't even create if hashing is not possible.  */
967
  if (! hashval)
968
    return 0;
969
 
970
  slot = htab_find_slot_with_hash (hash_table, wrap_constant (mode, x),
971
                                   hashval, create ? INSERT : NO_INSERT);
972
  if (slot == 0)
973
    return 0;
974
 
975
  e = (cselib_val *) *slot;
976
  if (e)
977
    return e;
978
 
979
  e = new_cselib_val (hashval, mode);
980
 
981
  /* We have to fill the slot before calling cselib_subst_to_values:
982
     the hash table is inconsistent until we do so, and
983
     cselib_subst_to_values will need to do lookups.  */
984
  *slot = (void *) e;
985
  e->locs = new_elt_loc_list (e->locs, cselib_subst_to_values (x));
986
  return e;
987
}
988
 
989
/* Invalidate any entries in reg_values that overlap REGNO.  This is called
990
   if REGNO is changing.  MODE is the mode of the assignment to REGNO, which
991
   is used to determine how many hard registers are being changed.  If MODE
992
   is VOIDmode, then only REGNO is being changed; this is used when
993
   invalidating call clobbered registers across a call.  */
994
 
995
static void
996
cselib_invalidate_regno (unsigned int regno, enum machine_mode mode)
997
{
998
  unsigned int endregno;
999
  unsigned int i;
1000
 
1001
  /* If we see pseudos after reload, something is _wrong_.  */
1002
  gcc_assert (!reload_completed || regno < FIRST_PSEUDO_REGISTER
1003
              || reg_renumber[regno] < 0);
1004
 
1005
  /* Determine the range of registers that must be invalidated.  For
1006
     pseudos, only REGNO is affected.  For hard regs, we must take MODE
1007
     into account, and we must also invalidate lower register numbers
1008
     if they contain values that overlap REGNO.  */
1009
  if (regno < FIRST_PSEUDO_REGISTER)
1010
    {
1011
      gcc_assert (mode != VOIDmode);
1012
 
1013
      if (regno < max_value_regs)
1014
        i = 0;
1015
      else
1016
        i = regno - max_value_regs;
1017
 
1018
      endregno = regno + hard_regno_nregs[regno][mode];
1019
    }
1020
  else
1021
    {
1022
      i = regno;
1023
      endregno = regno + 1;
1024
    }
1025
 
1026
  for (; i < endregno; i++)
1027
    {
1028
      struct elt_list **l = &REG_VALUES (i);
1029
 
1030
      /* Go through all known values for this reg; if it overlaps the range
1031
         we're invalidating, remove the value.  */
1032
      while (*l)
1033
        {
1034
          cselib_val *v = (*l)->elt;
1035
          struct elt_loc_list **p;
1036
          unsigned int this_last = i;
1037
 
1038
          if (i < FIRST_PSEUDO_REGISTER && v != NULL)
1039
            this_last += hard_regno_nregs[i][GET_MODE (v->u.val_rtx)] - 1;
1040
 
1041
          if (this_last < regno || v == NULL)
1042
            {
1043
              l = &(*l)->next;
1044
              continue;
1045
            }
1046
 
1047
          /* We have an overlap.  */
1048
          if (*l == REG_VALUES (i))
1049
            {
1050
              /* Maintain the invariant that the first entry of
1051
                 REG_VALUES, if present, must be the value used to set
1052
                 the register, or NULL.  This is also nice because
1053
                 then we won't push the same regno onto user_regs
1054
                 multiple times.  */
1055
              (*l)->elt = NULL;
1056
              l = &(*l)->next;
1057
            }
1058
          else
1059
            unchain_one_elt_list (l);
1060
 
1061
          /* Now, we clear the mapping from value to reg.  It must exist, so
1062
             this code will crash intentionally if it doesn't.  */
1063
          for (p = &v->locs; ; p = &(*p)->next)
1064
            {
1065
              rtx x = (*p)->loc;
1066
 
1067
              if (REG_P (x) && REGNO (x) == i)
1068
                {
1069
                  unchain_one_elt_loc_list (p);
1070
                  break;
1071
                }
1072
            }
1073
          if (v->locs == 0)
1074
            n_useless_values++;
1075
        }
1076
    }
1077
}
1078
 
1079
/* Return 1 if X has a value that can vary even between two
1080
   executions of the program.  0 means X can be compared reliably
1081
   against certain constants or near-constants.  */
1082
 
1083
static int
1084
cselib_rtx_varies_p (rtx x ATTRIBUTE_UNUSED, int from_alias ATTRIBUTE_UNUSED)
1085
{
1086
  /* We actually don't need to verify very hard.  This is because
1087
     if X has actually changed, we invalidate the memory anyway,
1088
     so assume that all common memory addresses are
1089
     invariant.  */
1090
  return 0;
1091
}
1092
 
1093
/* Invalidate any locations in the table which are changed because of a
1094
   store to MEM_RTX.  If this is called because of a non-const call
1095
   instruction, MEM_RTX is (mem:BLK const0_rtx).  */
1096
 
1097
static void
1098
cselib_invalidate_mem (rtx mem_rtx)
1099
{
1100
  cselib_val **vp, *v, *next;
1101
  int num_mems = 0;
1102
  rtx mem_addr;
1103
 
1104
  mem_addr = canon_rtx (get_addr (XEXP (mem_rtx, 0)));
1105
  mem_rtx = canon_rtx (mem_rtx);
1106
 
1107
  vp = &first_containing_mem;
1108
  for (v = *vp; v != &dummy_val; v = next)
1109
    {
1110
      bool has_mem = false;
1111
      struct elt_loc_list **p = &v->locs;
1112
      int had_locs = v->locs != 0;
1113
 
1114
      while (*p)
1115
        {
1116
          rtx x = (*p)->loc;
1117
          cselib_val *addr;
1118
          struct elt_list **mem_chain;
1119
 
1120
          /* MEMs may occur in locations only at the top level; below
1121
             that every MEM or REG is substituted by its VALUE.  */
1122
          if (!MEM_P (x))
1123
            {
1124
              p = &(*p)->next;
1125
              continue;
1126
            }
1127
          if (num_mems < PARAM_VALUE (PARAM_MAX_CSELIB_MEMORY_LOCATIONS)
1128
              && ! canon_true_dependence (mem_rtx, GET_MODE (mem_rtx), mem_addr,
1129
                                          x, cselib_rtx_varies_p))
1130
            {
1131
              has_mem = true;
1132
              num_mems++;
1133
              p = &(*p)->next;
1134
              continue;
1135
            }
1136
 
1137
          /* This one overlaps.  */
1138
          /* We must have a mapping from this MEM's address to the
1139
             value (E).  Remove that, too.  */
1140
          addr = cselib_lookup (XEXP (x, 0), VOIDmode, 0);
1141
          mem_chain = &addr->addr_list;
1142
          for (;;)
1143
            {
1144
              if ((*mem_chain)->elt == v)
1145
                {
1146
                  unchain_one_elt_list (mem_chain);
1147
                  break;
1148
                }
1149
 
1150
              mem_chain = &(*mem_chain)->next;
1151
            }
1152
 
1153
          unchain_one_elt_loc_list (p);
1154
        }
1155
 
1156
      if (had_locs && v->locs == 0)
1157
        n_useless_values++;
1158
 
1159
      next = v->next_containing_mem;
1160
      if (has_mem)
1161
        {
1162
          *vp = v;
1163
          vp = &(*vp)->next_containing_mem;
1164
        }
1165
      else
1166
        v->next_containing_mem = NULL;
1167
    }
1168
  *vp = &dummy_val;
1169
}
1170
 
1171
/* Invalidate DEST, which is being assigned to or clobbered.  */
1172
 
1173
void
1174
cselib_invalidate_rtx (rtx dest)
1175
{
1176
  while (GET_CODE (dest) == SUBREG
1177
         || GET_CODE (dest) == ZERO_EXTRACT
1178
         || GET_CODE (dest) == STRICT_LOW_PART)
1179
    dest = XEXP (dest, 0);
1180
 
1181
  if (REG_P (dest))
1182
    cselib_invalidate_regno (REGNO (dest), GET_MODE (dest));
1183
  else if (MEM_P (dest))
1184
    cselib_invalidate_mem (dest);
1185
 
1186
  /* Some machines don't define AUTO_INC_DEC, but they still use push
1187
     instructions.  We need to catch that case here in order to
1188
     invalidate the stack pointer correctly.  Note that invalidating
1189
     the stack pointer is different from invalidating DEST.  */
1190
  if (push_operand (dest, GET_MODE (dest)))
1191
    cselib_invalidate_rtx (stack_pointer_rtx);
1192
}
1193
 
1194
/* A wrapper for cselib_invalidate_rtx to be called via note_stores.  */
1195
 
1196
static void
1197
cselib_invalidate_rtx_note_stores (rtx dest, rtx ignore ATTRIBUTE_UNUSED,
1198
                                   void *data ATTRIBUTE_UNUSED)
1199
{
1200
  cselib_invalidate_rtx (dest);
1201
}
1202
 
1203
/* Record the result of a SET instruction.  DEST is being set; the source
1204
   contains the value described by SRC_ELT.  If DEST is a MEM, DEST_ADDR_ELT
1205
   describes its address.  */
1206
 
1207
static void
1208
cselib_record_set (rtx dest, cselib_val *src_elt, cselib_val *dest_addr_elt)
1209
{
1210
  int dreg = REG_P (dest) ? (int) REGNO (dest) : -1;
1211
 
1212
  if (src_elt == 0 || side_effects_p (dest))
1213
    return;
1214
 
1215
  if (dreg >= 0)
1216
    {
1217
      if (dreg < FIRST_PSEUDO_REGISTER)
1218
        {
1219
          unsigned int n = hard_regno_nregs[dreg][GET_MODE (dest)];
1220
 
1221
          if (n > max_value_regs)
1222
            max_value_regs = n;
1223
        }
1224
 
1225
      if (REG_VALUES (dreg) == 0)
1226
        {
1227
          used_regs[n_used_regs++] = dreg;
1228
          REG_VALUES (dreg) = new_elt_list (REG_VALUES (dreg), src_elt);
1229
        }
1230
      else
1231
        {
1232
          /* The register should have been invalidated.  */
1233
          gcc_assert (REG_VALUES (dreg)->elt == 0);
1234
          REG_VALUES (dreg)->elt = src_elt;
1235
        }
1236
 
1237
      if (src_elt->locs == 0)
1238
        n_useless_values--;
1239
      src_elt->locs = new_elt_loc_list (src_elt->locs, dest);
1240
    }
1241
  else if (MEM_P (dest) && dest_addr_elt != 0
1242
           && cselib_record_memory)
1243
    {
1244
      if (src_elt->locs == 0)
1245
        n_useless_values--;
1246
      add_mem_for_addr (dest_addr_elt, src_elt, dest);
1247
    }
1248
}
1249
 
1250
/* Describe a single set that is part of an insn.  */
1251
struct set
1252
{
1253
  rtx src;
1254
  rtx dest;
1255
  cselib_val *src_elt;
1256
  cselib_val *dest_addr_elt;
1257
};
1258
 
1259
/* There is no good way to determine how many elements there can be
1260
   in a PARALLEL.  Since it's fairly cheap, use a really large number.  */
1261
#define MAX_SETS (FIRST_PSEUDO_REGISTER * 2)
1262
 
1263
/* Record the effects of any sets in INSN.  */
1264
static void
1265
cselib_record_sets (rtx insn)
1266
{
1267
  int n_sets = 0;
1268
  int i;
1269
  struct set sets[MAX_SETS];
1270
  rtx body = PATTERN (insn);
1271
  rtx cond = 0;
1272
 
1273
  body = PATTERN (insn);
1274
  if (GET_CODE (body) == COND_EXEC)
1275
    {
1276
      cond = COND_EXEC_TEST (body);
1277
      body = COND_EXEC_CODE (body);
1278
    }
1279
 
1280
  /* Find all sets.  */
1281
  if (GET_CODE (body) == SET)
1282
    {
1283
      sets[0].src = SET_SRC (body);
1284
      sets[0].dest = SET_DEST (body);
1285
      n_sets = 1;
1286
    }
1287
  else if (GET_CODE (body) == PARALLEL)
1288
    {
1289
      /* Look through the PARALLEL and record the values being
1290
         set, if possible.  Also handle any CLOBBERs.  */
1291
      for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
1292
        {
1293
          rtx x = XVECEXP (body, 0, i);
1294
 
1295
          if (GET_CODE (x) == SET)
1296
            {
1297
              sets[n_sets].src = SET_SRC (x);
1298
              sets[n_sets].dest = SET_DEST (x);
1299
              n_sets++;
1300
            }
1301
        }
1302
    }
1303
 
1304
  /* Look up the values that are read.  Do this before invalidating the
1305
     locations that are written.  */
1306
  for (i = 0; i < n_sets; i++)
1307
    {
1308
      rtx dest = sets[i].dest;
1309
 
1310
      /* A STRICT_LOW_PART can be ignored; we'll record the equivalence for
1311
         the low part after invalidating any knowledge about larger modes.  */
1312
      if (GET_CODE (sets[i].dest) == STRICT_LOW_PART)
1313
        sets[i].dest = dest = XEXP (dest, 0);
1314
 
1315
      /* We don't know how to record anything but REG or MEM.  */
1316
      if (REG_P (dest)
1317
          || (MEM_P (dest) && cselib_record_memory))
1318
        {
1319
          rtx src = sets[i].src;
1320
          if (cond)
1321
            src = gen_rtx_IF_THEN_ELSE (GET_MODE (src), cond, src, dest);
1322
          sets[i].src_elt = cselib_lookup (src, GET_MODE (dest), 1);
1323
          if (MEM_P (dest))
1324
            sets[i].dest_addr_elt = cselib_lookup (XEXP (dest, 0), Pmode, 1);
1325
          else
1326
            sets[i].dest_addr_elt = 0;
1327
        }
1328
    }
1329
 
1330
  /* Invalidate all locations written by this insn.  Note that the elts we
1331
     looked up in the previous loop aren't affected, just some of their
1332
     locations may go away.  */
1333
  note_stores (body, cselib_invalidate_rtx_note_stores, NULL);
1334
 
1335
  /* If this is an asm, look for duplicate sets.  This can happen when the
1336
     user uses the same value as an output multiple times.  This is valid
1337
     if the outputs are not actually used thereafter.  Treat this case as
1338
     if the value isn't actually set.  We do this by smashing the destination
1339
     to pc_rtx, so that we won't record the value later.  */
1340
  if (n_sets >= 2 && asm_noperands (body) >= 0)
1341
    {
1342
      for (i = 0; i < n_sets; i++)
1343
        {
1344
          rtx dest = sets[i].dest;
1345
          if (REG_P (dest) || MEM_P (dest))
1346
            {
1347
              int j;
1348
              for (j = i + 1; j < n_sets; j++)
1349
                if (rtx_equal_p (dest, sets[j].dest))
1350
                  {
1351
                    sets[i].dest = pc_rtx;
1352
                    sets[j].dest = pc_rtx;
1353
                  }
1354
            }
1355
        }
1356
    }
1357
 
1358
  /* Now enter the equivalences in our tables.  */
1359
  for (i = 0; i < n_sets; i++)
1360
    {
1361
      rtx dest = sets[i].dest;
1362
      if (REG_P (dest)
1363
          || (MEM_P (dest) && cselib_record_memory))
1364
        cselib_record_set (dest, sets[i].src_elt, sets[i].dest_addr_elt);
1365
    }
1366
}
1367
 
1368
/* Record the effects of INSN.  */
1369
 
1370
void
1371
cselib_process_insn (rtx insn)
1372
{
1373
  int i;
1374
  rtx x;
1375
 
1376
  if (find_reg_note (insn, REG_LIBCALL, NULL))
1377
    cselib_current_insn_in_libcall = true;
1378
  cselib_current_insn = insn;
1379
 
1380
  /* Forget everything at a CODE_LABEL, a volatile asm, or a setjmp.  */
1381
  if (LABEL_P (insn)
1382
      || (CALL_P (insn)
1383
          && find_reg_note (insn, REG_SETJMP, NULL))
1384
      || (NONJUMP_INSN_P (insn)
1385
          && GET_CODE (PATTERN (insn)) == ASM_OPERANDS
1386
          && MEM_VOLATILE_P (PATTERN (insn))))
1387
    {
1388
      if (find_reg_note (insn, REG_RETVAL, NULL))
1389
        cselib_current_insn_in_libcall = false;
1390
      cselib_clear_table ();
1391
      return;
1392
    }
1393
 
1394
  if (! INSN_P (insn))
1395
    {
1396
      if (find_reg_note (insn, REG_RETVAL, NULL))
1397
        cselib_current_insn_in_libcall = false;
1398
      cselib_current_insn = 0;
1399
      return;
1400
    }
1401
 
1402
  /* If this is a call instruction, forget anything stored in a
1403
     call clobbered register, or, if this is not a const call, in
1404
     memory.  */
1405
  if (CALL_P (insn))
1406
    {
1407
      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1408
        if (call_used_regs[i]
1409
            || (REG_VALUES (i) && REG_VALUES (i)->elt
1410
                && HARD_REGNO_CALL_PART_CLOBBERED (i,
1411
                      GET_MODE (REG_VALUES (i)->elt->u.val_rtx))))
1412
          cselib_invalidate_regno (i, reg_raw_mode[i]);
1413
 
1414
      if (! CONST_OR_PURE_CALL_P (insn))
1415
        cselib_invalidate_mem (callmem);
1416
    }
1417
 
1418
  cselib_record_sets (insn);
1419
 
1420
#ifdef AUTO_INC_DEC
1421
  /* Clobber any registers which appear in REG_INC notes.  We
1422
     could keep track of the changes to their values, but it is
1423
     unlikely to help.  */
1424
  for (x = REG_NOTES (insn); x; x = XEXP (x, 1))
1425
    if (REG_NOTE_KIND (x) == REG_INC)
1426
      cselib_invalidate_rtx (XEXP (x, 0));
1427
#endif
1428
 
1429
  /* Look for any CLOBBERs in CALL_INSN_FUNCTION_USAGE, but only
1430
     after we have processed the insn.  */
1431
  if (CALL_P (insn))
1432
    for (x = CALL_INSN_FUNCTION_USAGE (insn); x; x = XEXP (x, 1))
1433
      if (GET_CODE (XEXP (x, 0)) == CLOBBER)
1434
        cselib_invalidate_rtx (XEXP (XEXP (x, 0), 0));
1435
 
1436
  if (find_reg_note (insn, REG_RETVAL, NULL))
1437
    cselib_current_insn_in_libcall = false;
1438
  cselib_current_insn = 0;
1439
 
1440
  if (n_useless_values > MAX_USELESS_VALUES)
1441
    remove_useless_values ();
1442
}
1443
 
1444
/* Initialize cselib for one pass.  The caller must also call
1445
   init_alias_analysis.  */
1446
 
1447
void
1448
cselib_init (bool record_memory)
1449
{
1450
  elt_list_pool = create_alloc_pool ("elt_list",
1451
                                     sizeof (struct elt_list), 10);
1452
  elt_loc_list_pool = create_alloc_pool ("elt_loc_list",
1453
                                         sizeof (struct elt_loc_list), 10);
1454
  cselib_val_pool = create_alloc_pool ("cselib_val_list",
1455
                                       sizeof (cselib_val), 10);
1456
  value_pool = create_alloc_pool ("value",
1457
                                  RTX_SIZE (VALUE), 100);
1458
  cselib_record_memory = record_memory;
1459
  /* This is only created once.  */
1460
  if (! callmem)
1461
    callmem = gen_rtx_MEM (BLKmode, const0_rtx);
1462
 
1463
  cselib_nregs = max_reg_num ();
1464
 
1465
  /* We preserve reg_values to allow expensive clearing of the whole thing.
1466
     Reallocate it however if it happens to be too large.  */
1467
  if (!reg_values || reg_values_size < cselib_nregs
1468
      || (reg_values_size > 10 && reg_values_size > cselib_nregs * 4))
1469
    {
1470
      if (reg_values)
1471
        free (reg_values);
1472
      /* Some space for newly emit instructions so we don't end up
1473
         reallocating in between passes.  */
1474
      reg_values_size = cselib_nregs + (63 + cselib_nregs) / 16;
1475
      reg_values = xcalloc (reg_values_size, sizeof (reg_values));
1476
    }
1477
  used_regs = xmalloc (sizeof (*used_regs) * cselib_nregs);
1478
  n_used_regs = 0;
1479
  hash_table = htab_create (31, get_value_hash, entry_and_rtx_equal_p, NULL);
1480
  cselib_current_insn_in_libcall = false;
1481
}
1482
 
1483
/* Called when the current user is done with cselib.  */
1484
 
1485
void
1486
cselib_finish (void)
1487
{
1488
  free_alloc_pool (elt_list_pool);
1489
  free_alloc_pool (elt_loc_list_pool);
1490
  free_alloc_pool (cselib_val_pool);
1491
  free_alloc_pool (value_pool);
1492
  cselib_clear_table ();
1493
  htab_delete (hash_table);
1494
  free (used_regs);
1495
  used_regs = 0;
1496
  hash_table = 0;
1497
  n_useless_values = 0;
1498
  next_unknown_value = 0;
1499
}
1500
 
1501
#include "gt-cselib.h"

powered by: WebSVN 2.1.0

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