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