2002-04-02 David S. Miller <davem@redhat.com>
[official-gcc.git] / gcc / cselib.c
blob0eb17b8a836224803ce6e919ac955cc28cd0afe8
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.
5 This file is part of GCC.
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.
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.
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, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #include "config.h"
23 #include "system.h"
25 #include "rtl.h"
26 #include "tm_p.h"
27 #include "regs.h"
28 #include "hard-reg-set.h"
29 #include "flags.h"
30 #include "real.h"
31 #include "insn-config.h"
32 #include "recog.h"
33 #include "function.h"
34 #include "expr.h"
35 #include "toplev.h"
36 #include "output.h"
37 #include "ggc.h"
38 #include "obstack.h"
39 #include "hashtab.h"
40 #include "cselib.h"
42 static int entry_and_rtx_equal_p PARAMS ((const void *, const void *));
43 static unsigned int get_value_hash PARAMS ((const void *));
44 static struct elt_list *new_elt_list PARAMS ((struct elt_list *,
45 cselib_val *));
46 static struct elt_loc_list *new_elt_loc_list PARAMS ((struct elt_loc_list *,
47 rtx));
48 static void unchain_one_value PARAMS ((cselib_val *));
49 static void unchain_one_elt_list PARAMS ((struct elt_list **));
50 static void unchain_one_elt_loc_list PARAMS ((struct elt_loc_list **));
51 static void clear_table PARAMS ((int));
52 static int discard_useless_locs PARAMS ((void **, void *));
53 static int discard_useless_values PARAMS ((void **, void *));
54 static void remove_useless_values PARAMS ((void));
55 static rtx wrap_constant PARAMS ((enum machine_mode, rtx));
56 static unsigned int hash_rtx PARAMS ((rtx, enum machine_mode, int));
57 static cselib_val *new_cselib_val PARAMS ((unsigned int,
58 enum machine_mode));
59 static void add_mem_for_addr PARAMS ((cselib_val *, cselib_val *,
60 rtx));
61 static cselib_val *cselib_lookup_mem PARAMS ((rtx, int));
62 static void cselib_invalidate_regno PARAMS ((unsigned int,
63 enum machine_mode));
64 static int cselib_mem_conflict_p PARAMS ((rtx, rtx));
65 static int cselib_invalidate_mem_1 PARAMS ((void **, void *));
66 static void cselib_invalidate_mem PARAMS ((rtx));
67 static void cselib_invalidate_rtx PARAMS ((rtx, rtx, void *));
68 static void cselib_record_set PARAMS ((rtx, cselib_val *,
69 cselib_val *));
70 static void cselib_record_sets PARAMS ((rtx));
72 /* There are three ways in which cselib can look up an rtx:
73 - for a REG, the reg_values table (which is indexed by regno) is used
74 - for a MEM, we recursively look up its address and then follow the
75 addr_list of that value
76 - for everything else, we compute a hash value and go through the hash
77 table. Since different rtx's can still have the same hash value,
78 this involves walking the table entries for a given value and comparing
79 the locations of the entries with the rtx we are looking up. */
81 /* A table that enables us to look up elts by their value. */
82 static htab_t hash_table;
84 /* This is a global so we don't have to pass this through every function.
85 It is used in new_elt_loc_list to set SETTING_INSN. */
86 static rtx cselib_current_insn;
88 /* Every new unknown value gets a unique number. */
89 static unsigned int next_unknown_value;
91 /* The number of registers we had when the varrays were last resized. */
92 static unsigned int cselib_nregs;
94 /* Count values without known locations. Whenever this grows too big, we
95 remove these useless values from the table. */
96 static int n_useless_values;
98 /* Number of useless values before we remove them from the hash table. */
99 #define MAX_USELESS_VALUES 32
101 /* This table maps from register number to values. It does not contain
102 pointers to cselib_val structures, but rather elt_lists. The purpose is
103 to be able to refer to the same register in different modes. */
104 static varray_type reg_values;
105 #define REG_VALUES(I) VARRAY_ELT_LIST (reg_values, (I))
107 /* Here the set of indices I with REG_VALUES(I) != 0 is saved. This is used
108 in clear_table() for fast emptying. */
109 static varray_type used_regs;
111 /* We pass this to cselib_invalidate_mem to invalidate all of
112 memory for a non-const call instruction. */
113 static rtx callmem;
115 /* Memory for our structures is allocated from this obstack. */
116 static struct obstack cselib_obstack;
118 /* Used to quickly free all memory. */
119 static char *cselib_startobj;
121 /* Caches for unused structures. */
122 static cselib_val *empty_vals;
123 static struct elt_list *empty_elt_lists;
124 static struct elt_loc_list *empty_elt_loc_lists;
126 /* Set by discard_useless_locs if it deleted the last location of any
127 value. */
128 static int values_became_useless;
131 /* Allocate a struct elt_list and fill in its two elements with the
132 arguments. */
134 static struct elt_list *
135 new_elt_list (next, elt)
136 struct elt_list *next;
137 cselib_val *elt;
139 struct elt_list *el = empty_elt_lists;
141 if (el)
142 empty_elt_lists = el->next;
143 else
144 el = (struct elt_list *) obstack_alloc (&cselib_obstack,
145 sizeof (struct elt_list));
146 el->next = next;
147 el->elt = elt;
148 return el;
151 /* Allocate a struct elt_loc_list and fill in its two elements with the
152 arguments. */
154 static struct elt_loc_list *
155 new_elt_loc_list (next, loc)
156 struct elt_loc_list *next;
157 rtx loc;
159 struct elt_loc_list *el = empty_elt_loc_lists;
161 if (el)
162 empty_elt_loc_lists = el->next;
163 else
164 el = (struct elt_loc_list *) obstack_alloc (&cselib_obstack,
165 sizeof (struct elt_loc_list));
166 el->next = next;
167 el->loc = loc;
168 el->setting_insn = cselib_current_insn;
169 return el;
172 /* The elt_list at *PL is no longer needed. Unchain it and free its
173 storage. */
175 static void
176 unchain_one_elt_list (pl)
177 struct elt_list **pl;
179 struct elt_list *l = *pl;
181 *pl = l->next;
182 l->next = empty_elt_lists;
183 empty_elt_lists = l;
186 /* Likewise for elt_loc_lists. */
188 static void
189 unchain_one_elt_loc_list (pl)
190 struct elt_loc_list **pl;
192 struct elt_loc_list *l = *pl;
194 *pl = l->next;
195 l->next = empty_elt_loc_lists;
196 empty_elt_loc_lists = l;
199 /* Likewise for cselib_vals. This also frees the addr_list associated with
200 V. */
202 static void
203 unchain_one_value (v)
204 cselib_val *v;
206 while (v->addr_list)
207 unchain_one_elt_list (&v->addr_list);
209 v->u.next_free = empty_vals;
210 empty_vals = v;
213 /* Remove all entries from the hash table. Also used during
214 initialization. If CLEAR_ALL isn't set, then only clear the entries
215 which are known to have been used. */
217 static void
218 clear_table (clear_all)
219 int clear_all;
221 unsigned int i;
223 if (clear_all)
224 for (i = 0; i < cselib_nregs; i++)
225 REG_VALUES (i) = 0;
226 else
227 for (i = 0; i < VARRAY_ACTIVE_SIZE (used_regs); i++)
228 REG_VALUES (VARRAY_UINT (used_regs, i)) = 0;
230 VARRAY_POP_ALL (used_regs);
232 htab_empty (hash_table);
233 obstack_free (&cselib_obstack, cselib_startobj);
235 empty_vals = 0;
236 empty_elt_lists = 0;
237 empty_elt_loc_lists = 0;
238 n_useless_values = 0;
240 next_unknown_value = 0;
243 /* The equality test for our hash table. The first argument ENTRY is a table
244 element (i.e. a cselib_val), while the second arg X is an rtx. We know
245 that all callers of htab_find_slot_with_hash will wrap CONST_INTs into a
246 CONST of an appropriate mode. */
248 static int
249 entry_and_rtx_equal_p (entry, x_arg)
250 const void *entry, *x_arg;
252 struct elt_loc_list *l;
253 const cselib_val *v = (const cselib_val *) entry;
254 rtx x = (rtx) x_arg;
255 enum machine_mode mode = GET_MODE (x);
257 if (GET_CODE (x) == CONST_INT
258 || (mode == VOIDmode && GET_CODE (x) == CONST_DOUBLE))
259 abort ();
260 if (mode != GET_MODE (v->u.val_rtx))
261 return 0;
263 /* Unwrap X if necessary. */
264 if (GET_CODE (x) == CONST
265 && (GET_CODE (XEXP (x, 0)) == CONST_INT
266 || GET_CODE (XEXP (x, 0)) == CONST_DOUBLE))
267 x = XEXP (x, 0);
269 /* We don't guarantee that distinct rtx's have different hash values,
270 so we need to do a comparison. */
271 for (l = v->locs; l; l = l->next)
272 if (rtx_equal_for_cselib_p (l->loc, x))
273 return 1;
275 return 0;
278 /* The hash function for our hash table. The value is always computed with
279 hash_rtx when adding an element; this function just extracts the hash
280 value from a cselib_val structure. */
282 static unsigned int
283 get_value_hash (entry)
284 const void *entry;
286 const cselib_val *v = (const cselib_val *) entry;
287 return v->value;
290 /* Return true if X contains a VALUE rtx. If ONLY_USELESS is set, we
291 only return true for values which point to a cselib_val whose value
292 element has been set to zero, which implies the cselib_val will be
293 removed. */
296 references_value_p (x, only_useless)
297 rtx x;
298 int only_useless;
300 enum rtx_code code = GET_CODE (x);
301 const char *fmt = GET_RTX_FORMAT (code);
302 int i, j;
304 if (GET_CODE (x) == VALUE
305 && (! only_useless || CSELIB_VAL_PTR (x)->locs == 0))
306 return 1;
308 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
310 if (fmt[i] == 'e' && references_value_p (XEXP (x, i), only_useless))
311 return 1;
312 else if (fmt[i] == 'E')
313 for (j = 0; j < XVECLEN (x, i); j++)
314 if (references_value_p (XVECEXP (x, i, j), only_useless))
315 return 1;
318 return 0;
321 /* For all locations found in X, delete locations that reference useless
322 values (i.e. values without any location). Called through
323 htab_traverse. */
325 static int
326 discard_useless_locs (x, info)
327 void **x;
328 void *info ATTRIBUTE_UNUSED;
330 cselib_val *v = (cselib_val *)*x;
331 struct elt_loc_list **p = &v->locs;
332 int had_locs = v->locs != 0;
334 while (*p)
336 if (references_value_p ((*p)->loc, 1))
337 unchain_one_elt_loc_list (p);
338 else
339 p = &(*p)->next;
342 if (had_locs && v->locs == 0)
344 n_useless_values++;
345 values_became_useless = 1;
347 return 1;
350 /* If X is a value with no locations, remove it from the hashtable. */
352 static int
353 discard_useless_values (x, info)
354 void **x;
355 void *info ATTRIBUTE_UNUSED;
357 cselib_val *v = (cselib_val *)*x;
359 if (v->locs == 0)
361 htab_clear_slot (hash_table, x);
362 unchain_one_value (v);
363 n_useless_values--;
366 return 1;
369 /* Clean out useless values (i.e. those which no longer have locations
370 associated with them) from the hash table. */
372 static void
373 remove_useless_values ()
375 /* First pass: eliminate locations that reference the value. That in
376 turn can make more values useless. */
379 values_became_useless = 0;
380 htab_traverse (hash_table, discard_useless_locs, 0);
382 while (values_became_useless);
384 /* Second pass: actually remove the values. */
385 htab_traverse (hash_table, discard_useless_values, 0);
387 if (n_useless_values != 0)
388 abort ();
391 /* Return nonzero if we can prove that X and Y contain the same value, taking
392 our gathered information into account. */
395 rtx_equal_for_cselib_p (x, y)
396 rtx x, y;
398 enum rtx_code code;
399 const char *fmt;
400 int i;
402 if (GET_CODE (x) == REG || GET_CODE (x) == MEM)
404 cselib_val *e = cselib_lookup (x, GET_MODE (x), 0);
406 if (e)
407 x = e->u.val_rtx;
410 if (GET_CODE (y) == REG || GET_CODE (y) == MEM)
412 cselib_val *e = cselib_lookup (y, GET_MODE (y), 0);
414 if (e)
415 y = e->u.val_rtx;
418 if (x == y)
419 return 1;
421 if (GET_CODE (x) == VALUE && GET_CODE (y) == VALUE)
422 return CSELIB_VAL_PTR (x) == CSELIB_VAL_PTR (y);
424 if (GET_CODE (x) == VALUE)
426 cselib_val *e = CSELIB_VAL_PTR (x);
427 struct elt_loc_list *l;
429 for (l = e->locs; l; l = l->next)
431 rtx t = l->loc;
433 /* Avoid infinite recursion. */
434 if (GET_CODE (t) == REG || GET_CODE (t) == MEM)
435 continue;
436 else if (rtx_equal_for_cselib_p (t, y))
437 return 1;
440 return 0;
443 if (GET_CODE (y) == VALUE)
445 cselib_val *e = CSELIB_VAL_PTR (y);
446 struct elt_loc_list *l;
448 for (l = e->locs; l; l = l->next)
450 rtx t = l->loc;
452 if (GET_CODE (t) == REG || GET_CODE (t) == MEM)
453 continue;
454 else if (rtx_equal_for_cselib_p (x, t))
455 return 1;
458 return 0;
461 if (GET_CODE (x) != GET_CODE (y) || GET_MODE (x) != GET_MODE (y))
462 return 0;
464 /* This won't be handled correctly by the code below. */
465 if (GET_CODE (x) == LABEL_REF)
466 return XEXP (x, 0) == XEXP (y, 0);
468 code = GET_CODE (x);
469 fmt = GET_RTX_FORMAT (code);
471 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
473 int j;
475 switch (fmt[i])
477 case 'w':
478 if (XWINT (x, i) != XWINT (y, i))
479 return 0;
480 break;
482 case 'n':
483 case 'i':
484 if (XINT (x, i) != XINT (y, i))
485 return 0;
486 break;
488 case 'V':
489 case 'E':
490 /* Two vectors must have the same length. */
491 if (XVECLEN (x, i) != XVECLEN (y, i))
492 return 0;
494 /* And the corresponding elements must match. */
495 for (j = 0; j < XVECLEN (x, i); j++)
496 if (! rtx_equal_for_cselib_p (XVECEXP (x, i, j),
497 XVECEXP (y, i, j)))
498 return 0;
499 break;
501 case 'e':
502 if (! rtx_equal_for_cselib_p (XEXP (x, i), XEXP (y, i)))
503 return 0;
504 break;
506 case 'S':
507 case 's':
508 if (strcmp (XSTR (x, i), XSTR (y, i)))
509 return 0;
510 break;
512 case 'u':
513 /* These are just backpointers, so they don't matter. */
514 break;
516 case '0':
517 case 't':
518 break;
520 /* It is believed that rtx's at this level will never
521 contain anything but integers and other rtx's,
522 except for within LABEL_REFs and SYMBOL_REFs. */
523 default:
524 abort ();
527 return 1;
530 /* We need to pass down the mode of constants through the hash table
531 functions. For that purpose, wrap them in a CONST of the appropriate
532 mode. */
533 static rtx
534 wrap_constant (mode, x)
535 enum machine_mode mode;
536 rtx x;
538 if (GET_CODE (x) != CONST_INT
539 && (GET_CODE (x) != CONST_DOUBLE || GET_MODE (x) != VOIDmode))
540 return x;
541 if (mode == VOIDmode)
542 abort ();
543 return gen_rtx_CONST (mode, x);
546 /* Hash an rtx. Return 0 if we couldn't hash the rtx.
547 For registers and memory locations, we look up their cselib_val structure
548 and return its VALUE element.
549 Possible reasons for return 0 are: the object is volatile, or we couldn't
550 find a register or memory location in the table and CREATE is zero. If
551 CREATE is nonzero, table elts are created for regs and mem.
552 MODE is used in hashing for CONST_INTs only;
553 otherwise the mode of X is used. */
555 static unsigned int
556 hash_rtx (x, mode, create)
557 rtx x;
558 enum machine_mode mode;
559 int create;
561 cselib_val *e;
562 int i, j;
563 enum rtx_code code;
564 const char *fmt;
565 unsigned int hash = 0;
567 code = GET_CODE (x);
568 hash += (unsigned) code + (unsigned) GET_MODE (x);
570 switch (code)
572 case MEM:
573 case REG:
574 e = cselib_lookup (x, GET_MODE (x), create);
575 if (! e)
576 return 0;
578 return e->value;
580 case CONST_INT:
581 hash += ((unsigned) CONST_INT << 7) + (unsigned) mode + INTVAL (x);
582 return hash ? hash : (unsigned int) CONST_INT;
584 case CONST_DOUBLE:
585 /* This is like the general case, except that it only counts
586 the integers representing the constant. */
587 hash += (unsigned) code + (unsigned) GET_MODE (x);
588 if (GET_MODE (x) != VOIDmode)
589 for (i = 2; i < GET_RTX_LENGTH (CONST_DOUBLE); i++)
590 hash += XWINT (x, i);
591 else
592 hash += ((unsigned) CONST_DOUBLE_LOW (x)
593 + (unsigned) CONST_DOUBLE_HIGH (x));
594 return hash ? hash : (unsigned int) CONST_DOUBLE;
596 case CONST_VECTOR:
598 int units;
599 rtx elt;
601 units = CONST_VECTOR_NUNITS (x);
603 for (i = 0; i < units; ++i)
605 elt = CONST_VECTOR_ELT (x, i);
606 hash += hash_rtx (elt, GET_MODE (elt), 0);
609 return hash;
612 /* Assume there is only one rtx object for any given label. */
613 case LABEL_REF:
614 hash
615 += ((unsigned) LABEL_REF << 7) + (unsigned long) XEXP (x, 0);
616 return hash ? hash : (unsigned int) LABEL_REF;
618 case SYMBOL_REF:
619 hash
620 += ((unsigned) SYMBOL_REF << 7) + (unsigned long) XSTR (x, 0);
621 return hash ? hash : (unsigned int) SYMBOL_REF;
623 case PRE_DEC:
624 case PRE_INC:
625 case POST_DEC:
626 case POST_INC:
627 case POST_MODIFY:
628 case PRE_MODIFY:
629 case PC:
630 case CC0:
631 case CALL:
632 case UNSPEC_VOLATILE:
633 return 0;
635 case ASM_OPERANDS:
636 if (MEM_VOLATILE_P (x))
637 return 0;
639 break;
641 default:
642 break;
645 i = GET_RTX_LENGTH (code) - 1;
646 fmt = GET_RTX_FORMAT (code);
647 for (; i >= 0; i--)
649 if (fmt[i] == 'e')
651 rtx tem = XEXP (x, i);
652 unsigned int tem_hash = hash_rtx (tem, 0, create);
654 if (tem_hash == 0)
655 return 0;
657 hash += tem_hash;
659 else if (fmt[i] == 'E')
660 for (j = 0; j < XVECLEN (x, i); j++)
662 unsigned int tem_hash = hash_rtx (XVECEXP (x, i, j), 0, create);
664 if (tem_hash == 0)
665 return 0;
667 hash += tem_hash;
669 else if (fmt[i] == 's')
671 const unsigned char *p = (const unsigned char *) XSTR (x, i);
673 if (p)
674 while (*p)
675 hash += *p++;
677 else if (fmt[i] == 'i')
678 hash += XINT (x, i);
679 else if (fmt[i] == '0' || fmt[i] == 't')
680 /* unused */;
681 else
682 abort ();
685 return hash ? hash : 1 + (unsigned int) GET_CODE (x);
688 /* Create a new value structure for VALUE and initialize it. The mode of the
689 value is MODE. */
691 static cselib_val *
692 new_cselib_val (value, mode)
693 unsigned int value;
694 enum machine_mode mode;
696 cselib_val *e = empty_vals;
698 if (e)
699 empty_vals = e->u.next_free;
700 else
701 e = (cselib_val *) obstack_alloc (&cselib_obstack, sizeof (cselib_val));
703 if (value == 0)
704 abort ();
706 e->value = value;
707 e->u.val_rtx = gen_rtx_VALUE (mode);
708 CSELIB_VAL_PTR (e->u.val_rtx) = e;
709 e->addr_list = 0;
710 e->locs = 0;
711 return e;
714 /* ADDR_ELT is a value that is used as address. MEM_ELT is the value that
715 contains the data at this address. X is a MEM that represents the
716 value. Update the two value structures to represent this situation. */
718 static void
719 add_mem_for_addr (addr_elt, mem_elt, x)
720 cselib_val *addr_elt, *mem_elt;
721 rtx x;
723 struct elt_loc_list *l;
725 /* Avoid duplicates. */
726 for (l = mem_elt->locs; l; l = l->next)
727 if (GET_CODE (l->loc) == MEM
728 && CSELIB_VAL_PTR (XEXP (l->loc, 0)) == addr_elt)
729 return;
731 addr_elt->addr_list = new_elt_list (addr_elt->addr_list, mem_elt);
732 mem_elt->locs
733 = new_elt_loc_list (mem_elt->locs,
734 replace_equiv_address_nv (x, addr_elt->u.val_rtx));
737 /* Subroutine of cselib_lookup. Return a value for X, which is a MEM rtx.
738 If CREATE, make a new one if we haven't seen it before. */
740 static cselib_val *
741 cselib_lookup_mem (x, create)
742 rtx x;
743 int create;
745 enum machine_mode mode = GET_MODE (x);
746 void **slot;
747 cselib_val *addr;
748 cselib_val *mem_elt;
749 struct elt_list *l;
751 if (MEM_VOLATILE_P (x) || mode == BLKmode
752 || (FLOAT_MODE_P (mode) && flag_float_store))
753 return 0;
755 /* Look up the value for the address. */
756 addr = cselib_lookup (XEXP (x, 0), mode, create);
757 if (! addr)
758 return 0;
760 /* Find a value that describes a value of our mode at that address. */
761 for (l = addr->addr_list; l; l = l->next)
762 if (GET_MODE (l->elt->u.val_rtx) == mode)
763 return l->elt;
765 if (! create)
766 return 0;
768 mem_elt = new_cselib_val (++next_unknown_value, mode);
769 add_mem_for_addr (addr, mem_elt, x);
770 slot = htab_find_slot_with_hash (hash_table, wrap_constant (mode, x),
771 mem_elt->value, INSERT);
772 *slot = mem_elt;
773 return mem_elt;
776 /* Walk rtx X and replace all occurrences of REG and MEM subexpressions
777 with VALUE expressions. This way, it becomes independent of changes
778 to registers and memory.
779 X isn't actually modified; if modifications are needed, new rtl is
780 allocated. However, the return value can share rtl with X. */
783 cselib_subst_to_values (x)
784 rtx x;
786 enum rtx_code code = GET_CODE (x);
787 const char *fmt = GET_RTX_FORMAT (code);
788 cselib_val *e;
789 struct elt_list *l;
790 rtx copy = x;
791 int i;
793 switch (code)
795 case REG:
796 for (l = REG_VALUES (REGNO (x)); l; l = l->next)
797 if (GET_MODE (l->elt->u.val_rtx) == GET_MODE (x))
798 return l->elt->u.val_rtx;
800 abort ();
802 case MEM:
803 e = cselib_lookup_mem (x, 0);
804 if (! e)
806 /* This happens for autoincrements. Assign a value that doesn't
807 match any other. */
808 e = new_cselib_val (++next_unknown_value, GET_MODE (x));
810 return e->u.val_rtx;
812 case CONST_DOUBLE:
813 case CONST_VECTOR:
814 case CONST_INT:
815 return x;
817 case POST_INC:
818 case PRE_INC:
819 case POST_DEC:
820 case PRE_DEC:
821 case POST_MODIFY:
822 case PRE_MODIFY:
823 e = new_cselib_val (++next_unknown_value, GET_MODE (x));
824 return e->u.val_rtx;
826 default:
827 break;
830 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
832 if (fmt[i] == 'e')
834 rtx t = cselib_subst_to_values (XEXP (x, i));
836 if (t != XEXP (x, i) && x == copy)
837 copy = shallow_copy_rtx (x);
839 XEXP (copy, i) = t;
841 else if (fmt[i] == 'E')
843 int j, k;
845 for (j = 0; j < XVECLEN (x, i); j++)
847 rtx t = cselib_subst_to_values (XVECEXP (x, i, j));
849 if (t != XVECEXP (x, i, j) && XVEC (x, i) == XVEC (copy, i))
851 if (x == copy)
852 copy = shallow_copy_rtx (x);
854 XVEC (copy, i) = rtvec_alloc (XVECLEN (x, i));
855 for (k = 0; k < j; k++)
856 XVECEXP (copy, i, k) = XVECEXP (x, i, k);
859 XVECEXP (copy, i, j) = t;
864 return copy;
867 /* Look up the rtl expression X in our tables and return the value it has.
868 If CREATE is zero, we return NULL if we don't know the value. Otherwise,
869 we create a new one if possible, using mode MODE if X doesn't have a mode
870 (i.e. because it's a constant). */
872 cselib_val *
873 cselib_lookup (x, mode, create)
874 rtx x;
875 enum machine_mode mode;
876 int create;
878 void **slot;
879 cselib_val *e;
880 unsigned int hashval;
882 if (GET_MODE (x) != VOIDmode)
883 mode = GET_MODE (x);
885 if (GET_CODE (x) == VALUE)
886 return CSELIB_VAL_PTR (x);
888 if (GET_CODE (x) == REG)
890 struct elt_list *l;
891 unsigned int i = REGNO (x);
893 for (l = REG_VALUES (i); l; l = l->next)
894 if (mode == GET_MODE (l->elt->u.val_rtx))
895 return l->elt;
897 if (! create)
898 return 0;
900 e = new_cselib_val (++next_unknown_value, GET_MODE (x));
901 e->locs = new_elt_loc_list (e->locs, x);
902 if (REG_VALUES (i) == 0)
903 VARRAY_PUSH_UINT (used_regs, i);
904 REG_VALUES (i) = new_elt_list (REG_VALUES (i), e);
905 slot = htab_find_slot_with_hash (hash_table, x, e->value, INSERT);
906 *slot = e;
907 return e;
910 if (GET_CODE (x) == MEM)
911 return cselib_lookup_mem (x, create);
913 hashval = hash_rtx (x, mode, create);
914 /* Can't even create if hashing is not possible. */
915 if (! hashval)
916 return 0;
918 slot = htab_find_slot_with_hash (hash_table, wrap_constant (mode, x),
919 hashval, create ? INSERT : NO_INSERT);
920 if (slot == 0)
921 return 0;
923 e = (cselib_val *) *slot;
924 if (e)
925 return e;
927 e = new_cselib_val (hashval, mode);
929 /* We have to fill the slot before calling cselib_subst_to_values:
930 the hash table is inconsistent until we do so, and
931 cselib_subst_to_values will need to do lookups. */
932 *slot = (void *) e;
933 e->locs = new_elt_loc_list (e->locs, cselib_subst_to_values (x));
934 return e;
937 /* Invalidate any entries in reg_values that overlap REGNO. This is called
938 if REGNO is changing. MODE is the mode of the assignment to REGNO, which
939 is used to determine how many hard registers are being changed. If MODE
940 is VOIDmode, then only REGNO is being changed; this is used when
941 invalidating call clobbered registers across a call. */
943 static void
944 cselib_invalidate_regno (regno, mode)
945 unsigned int regno;
946 enum machine_mode mode;
948 unsigned int endregno;
949 unsigned int i;
951 /* If we see pseudos after reload, something is _wrong_. */
952 if (reload_completed && regno >= FIRST_PSEUDO_REGISTER
953 && reg_renumber[regno] >= 0)
954 abort ();
956 /* Determine the range of registers that must be invalidated. For
957 pseudos, only REGNO is affected. For hard regs, we must take MODE
958 into account, and we must also invalidate lower register numbers
959 if they contain values that overlap REGNO. */
960 endregno = regno + 1;
961 if (regno < FIRST_PSEUDO_REGISTER && mode != VOIDmode)
962 endregno = regno + HARD_REGNO_NREGS (regno, mode);
964 for (i = 0; i < endregno; i++)
966 struct elt_list **l = &REG_VALUES (i);
968 /* Go through all known values for this reg; if it overlaps the range
969 we're invalidating, remove the value. */
970 while (*l)
972 cselib_val *v = (*l)->elt;
973 struct elt_loc_list **p;
974 unsigned int this_last = i;
976 if (i < FIRST_PSEUDO_REGISTER)
977 this_last += HARD_REGNO_NREGS (i, GET_MODE (v->u.val_rtx)) - 1;
979 if (this_last < regno)
981 l = &(*l)->next;
982 continue;
985 /* We have an overlap. */
986 unchain_one_elt_list (l);
988 /* Now, we clear the mapping from value to reg. It must exist, so
989 this code will crash intentionally if it doesn't. */
990 for (p = &v->locs; ; p = &(*p)->next)
992 rtx x = (*p)->loc;
994 if (GET_CODE (x) == REG && REGNO (x) == i)
996 unchain_one_elt_loc_list (p);
997 break;
1000 if (v->locs == 0)
1001 n_useless_values++;
1006 /* The memory at address MEM_BASE is being changed.
1007 Return whether this change will invalidate VAL. */
1009 static int
1010 cselib_mem_conflict_p (mem_base, val)
1011 rtx mem_base;
1012 rtx val;
1014 enum rtx_code code;
1015 const char *fmt;
1016 int i, j;
1018 code = GET_CODE (val);
1019 switch (code)
1021 /* Get rid of a few simple cases quickly. */
1022 case REG:
1023 case PC:
1024 case CC0:
1025 case SCRATCH:
1026 case CONST:
1027 case CONST_INT:
1028 case CONST_DOUBLE:
1029 case CONST_VECTOR:
1030 case SYMBOL_REF:
1031 case LABEL_REF:
1032 return 0;
1034 case MEM:
1035 if (GET_MODE (mem_base) == BLKmode
1036 || GET_MODE (val) == BLKmode
1037 || anti_dependence (val, mem_base))
1038 return 1;
1040 /* The address may contain nested MEMs. */
1041 break;
1043 default:
1044 break;
1047 fmt = GET_RTX_FORMAT (code);
1048 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1050 if (fmt[i] == 'e')
1052 if (cselib_mem_conflict_p (mem_base, XEXP (val, i)))
1053 return 1;
1055 else if (fmt[i] == 'E')
1056 for (j = 0; j < XVECLEN (val, i); j++)
1057 if (cselib_mem_conflict_p (mem_base, XVECEXP (val, i, j)))
1058 return 1;
1061 return 0;
1064 /* For the value found in SLOT, walk its locations to determine if any overlap
1065 INFO (which is a MEM rtx). */
1067 static int
1068 cselib_invalidate_mem_1 (slot, info)
1069 void **slot;
1070 void *info;
1072 cselib_val *v = (cselib_val *) *slot;
1073 rtx mem_rtx = (rtx) info;
1074 struct elt_loc_list **p = &v->locs;
1075 int had_locs = v->locs != 0;
1077 while (*p)
1079 rtx x = (*p)->loc;
1080 cselib_val *addr;
1081 struct elt_list **mem_chain;
1083 /* MEMs may occur in locations only at the top level; below
1084 that every MEM or REG is substituted by its VALUE. */
1085 if (GET_CODE (x) != MEM
1086 || ! cselib_mem_conflict_p (mem_rtx, x))
1088 p = &(*p)->next;
1089 continue;
1092 /* This one overlaps. */
1093 /* We must have a mapping from this MEM's address to the
1094 value (E). Remove that, too. */
1095 addr = cselib_lookup (XEXP (x, 0), VOIDmode, 0);
1096 mem_chain = &addr->addr_list;
1097 for (;;)
1099 if ((*mem_chain)->elt == v)
1101 unchain_one_elt_list (mem_chain);
1102 break;
1105 mem_chain = &(*mem_chain)->next;
1108 unchain_one_elt_loc_list (p);
1111 if (had_locs && v->locs == 0)
1112 n_useless_values++;
1114 return 1;
1117 /* Invalidate any locations in the table which are changed because of a
1118 store to MEM_RTX. If this is called because of a non-const call
1119 instruction, MEM_RTX is (mem:BLK const0_rtx). */
1121 static void
1122 cselib_invalidate_mem (mem_rtx)
1123 rtx mem_rtx;
1125 htab_traverse (hash_table, cselib_invalidate_mem_1, mem_rtx);
1128 /* Invalidate DEST, which is being assigned to or clobbered. The second and
1129 the third parameter exist so that this function can be passed to
1130 note_stores; they are ignored. */
1132 static void
1133 cselib_invalidate_rtx (dest, ignore, data)
1134 rtx dest;
1135 rtx ignore ATTRIBUTE_UNUSED;
1136 void *data ATTRIBUTE_UNUSED;
1138 while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SIGN_EXTRACT
1139 || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG)
1140 dest = XEXP (dest, 0);
1142 if (GET_CODE (dest) == REG)
1143 cselib_invalidate_regno (REGNO (dest), GET_MODE (dest));
1144 else if (GET_CODE (dest) == MEM)
1145 cselib_invalidate_mem (dest);
1147 /* Some machines don't define AUTO_INC_DEC, but they still use push
1148 instructions. We need to catch that case here in order to
1149 invalidate the stack pointer correctly. Note that invalidating
1150 the stack pointer is different from invalidating DEST. */
1151 if (push_operand (dest, GET_MODE (dest)))
1152 cselib_invalidate_rtx (stack_pointer_rtx, NULL_RTX, NULL);
1155 /* Record the result of a SET instruction. DEST is being set; the source
1156 contains the value described by SRC_ELT. If DEST is a MEM, DEST_ADDR_ELT
1157 describes its address. */
1159 static void
1160 cselib_record_set (dest, src_elt, dest_addr_elt)
1161 rtx dest;
1162 cselib_val *src_elt, *dest_addr_elt;
1164 int dreg = GET_CODE (dest) == REG ? (int) REGNO (dest) : -1;
1166 if (src_elt == 0 || side_effects_p (dest))
1167 return;
1169 if (dreg >= 0)
1171 if (REG_VALUES (dreg) == 0)
1172 VARRAY_PUSH_UINT (used_regs, dreg);
1174 REG_VALUES (dreg) = new_elt_list (REG_VALUES (dreg), src_elt);
1175 if (src_elt->locs == 0)
1176 n_useless_values--;
1177 src_elt->locs = new_elt_loc_list (src_elt->locs, dest);
1179 else if (GET_CODE (dest) == MEM && dest_addr_elt != 0)
1181 if (src_elt->locs == 0)
1182 n_useless_values--;
1183 add_mem_for_addr (dest_addr_elt, src_elt, dest);
1187 /* Describe a single set that is part of an insn. */
1188 struct set
1190 rtx src;
1191 rtx dest;
1192 cselib_val *src_elt;
1193 cselib_val *dest_addr_elt;
1196 /* There is no good way to determine how many elements there can be
1197 in a PARALLEL. Since it's fairly cheap, use a really large number. */
1198 #define MAX_SETS (FIRST_PSEUDO_REGISTER * 2)
1200 /* Record the effects of any sets in INSN. */
1201 static void
1202 cselib_record_sets (insn)
1203 rtx insn;
1205 int n_sets = 0;
1206 int i;
1207 struct set sets[MAX_SETS];
1208 rtx body = PATTERN (insn);
1209 rtx cond = 0;
1211 body = PATTERN (insn);
1212 if (GET_CODE (body) == COND_EXEC)
1214 cond = COND_EXEC_TEST (body);
1215 body = COND_EXEC_CODE (body);
1218 /* Find all sets. */
1219 if (GET_CODE (body) == SET)
1221 sets[0].src = SET_SRC (body);
1222 sets[0].dest = SET_DEST (body);
1223 n_sets = 1;
1225 else if (GET_CODE (body) == PARALLEL)
1227 /* Look through the PARALLEL and record the values being
1228 set, if possible. Also handle any CLOBBERs. */
1229 for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
1231 rtx x = XVECEXP (body, 0, i);
1233 if (GET_CODE (x) == SET)
1235 sets[n_sets].src = SET_SRC (x);
1236 sets[n_sets].dest = SET_DEST (x);
1237 n_sets++;
1242 /* Look up the values that are read. Do this before invalidating the
1243 locations that are written. */
1244 for (i = 0; i < n_sets; i++)
1246 rtx dest = sets[i].dest;
1248 /* A STRICT_LOW_PART can be ignored; we'll record the equivalence for
1249 the low part after invalidating any knowledge about larger modes. */
1250 if (GET_CODE (sets[i].dest) == STRICT_LOW_PART)
1251 sets[i].dest = dest = XEXP (dest, 0);
1253 /* We don't know how to record anything but REG or MEM. */
1254 if (GET_CODE (dest) == REG || GET_CODE (dest) == MEM)
1256 rtx src = sets[i].src;
1257 if (cond)
1258 src = gen_rtx_IF_THEN_ELSE (GET_MODE (src), cond, src, dest);
1259 sets[i].src_elt = cselib_lookup (src, GET_MODE (dest), 1);
1260 if (GET_CODE (dest) == MEM)
1261 sets[i].dest_addr_elt = cselib_lookup (XEXP (dest, 0), Pmode, 1);
1262 else
1263 sets[i].dest_addr_elt = 0;
1267 /* Invalidate all locations written by this insn. Note that the elts we
1268 looked up in the previous loop aren't affected, just some of their
1269 locations may go away. */
1270 note_stores (body, cselib_invalidate_rtx, NULL);
1272 /* Now enter the equivalences in our tables. */
1273 for (i = 0; i < n_sets; i++)
1275 rtx dest = sets[i].dest;
1276 if (GET_CODE (dest) == REG || GET_CODE (dest) == MEM)
1277 cselib_record_set (dest, sets[i].src_elt, sets[i].dest_addr_elt);
1281 /* Record the effects of INSN. */
1283 void
1284 cselib_process_insn (insn)
1285 rtx insn;
1287 int i;
1288 rtx x;
1290 cselib_current_insn = insn;
1292 /* Forget everything at a CODE_LABEL, a volatile asm, or a setjmp. */
1293 if (GET_CODE (insn) == CODE_LABEL
1294 || (GET_CODE (insn) == CALL_INSN
1295 && find_reg_note (insn, REG_SETJMP, NULL))
1296 || (GET_CODE (insn) == INSN
1297 && GET_CODE (PATTERN (insn)) == ASM_OPERANDS
1298 && MEM_VOLATILE_P (PATTERN (insn))))
1300 clear_table (0);
1301 return;
1304 if (! INSN_P (insn))
1306 cselib_current_insn = 0;
1307 return;
1310 /* If this is a call instruction, forget anything stored in a
1311 call clobbered register, or, if this is not a const call, in
1312 memory. */
1313 if (GET_CODE (insn) == CALL_INSN)
1315 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1316 if (call_used_regs[i])
1317 cselib_invalidate_regno (i, VOIDmode);
1319 if (! CONST_OR_PURE_CALL_P (insn))
1320 cselib_invalidate_mem (callmem);
1323 cselib_record_sets (insn);
1325 #ifdef AUTO_INC_DEC
1326 /* Clobber any registers which appear in REG_INC notes. We
1327 could keep track of the changes to their values, but it is
1328 unlikely to help. */
1329 for (x = REG_NOTES (insn); x; x = XEXP (x, 1))
1330 if (REG_NOTE_KIND (x) == REG_INC)
1331 cselib_invalidate_rtx (XEXP (x, 0), NULL_RTX, NULL);
1332 #endif
1334 /* Look for any CLOBBERs in CALL_INSN_FUNCTION_USAGE, but only
1335 after we have processed the insn. */
1336 if (GET_CODE (insn) == CALL_INSN)
1337 for (x = CALL_INSN_FUNCTION_USAGE (insn); x; x = XEXP (x, 1))
1338 if (GET_CODE (XEXP (x, 0)) == CLOBBER)
1339 cselib_invalidate_rtx (XEXP (XEXP (x, 0), 0), NULL_RTX, NULL);
1341 cselib_current_insn = 0;
1343 if (n_useless_values > MAX_USELESS_VALUES)
1344 remove_useless_values ();
1347 /* Make sure our varrays are big enough. Not called from any cselib routines;
1348 it must be called by the user if it allocated new registers. */
1350 void
1351 cselib_update_varray_sizes ()
1353 unsigned int nregs = max_reg_num ();
1355 if (nregs == cselib_nregs)
1356 return;
1358 cselib_nregs = nregs;
1359 VARRAY_GROW (reg_values, nregs);
1360 VARRAY_GROW (used_regs, nregs);
1363 /* Initialize cselib for one pass. The caller must also call
1364 init_alias_analysis. */
1366 void
1367 cselib_init ()
1369 /* These are only created once. */
1370 if (! callmem)
1372 gcc_obstack_init (&cselib_obstack);
1373 cselib_startobj = obstack_alloc (&cselib_obstack, 0);
1375 callmem = gen_rtx_MEM (BLKmode, const0_rtx);
1376 ggc_add_rtx_root (&callmem, 1);
1379 cselib_nregs = max_reg_num ();
1380 VARRAY_ELT_LIST_INIT (reg_values, cselib_nregs, "reg_values");
1381 VARRAY_UINT_INIT (used_regs, cselib_nregs, "used_regs");
1382 hash_table = htab_create (31, get_value_hash, entry_and_rtx_equal_p, NULL);
1383 clear_table (1);
1386 /* Called when the current user is done with cselib. */
1388 void
1389 cselib_finish ()
1391 clear_table (0);
1392 VARRAY_FREE (reg_values);
1393 VARRAY_FREE (used_regs);
1394 htab_delete (hash_table);