OSDN Git Service

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