29495e000df936c685838dccf2d49aa6eb788762
[gcc.git] / gcc / cprop.c
1 /* Global constant/copy propagation for RTL.
2 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007, 2008, 2009, 2010, 2011 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 3, 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 COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "diagnostic-core.h"
26 #include "toplev.h"
27
28 #include "rtl.h"
29 #include "tree.h"
30 #include "tm_p.h"
31 #include "regs.h"
32 #include "hard-reg-set.h"
33 #include "flags.h"
34 #include "insn-config.h"
35 #include "recog.h"
36 #include "basic-block.h"
37 #include "function.h"
38 #include "expr.h"
39 #include "except.h"
40 #include "params.h"
41 #include "cselib.h"
42 #include "intl.h"
43 #include "obstack.h"
44 #include "timevar.h"
45 #include "tree-pass.h"
46 #include "hashtab.h"
47 #include "df.h"
48 #include "dbgcnt.h"
49 #include "target.h"
50 #include "cfgloop.h"
51
52 \f
53 /* An obstack for our working variables. */
54 static struct obstack cprop_obstack;
55
56 /* Occurrence of an expression.
57 There is one per basic block. If a pattern appears more than once the
58 last appearance is used. */
59
60 struct occr
61 {
62 /* Next occurrence of this expression. */
63 struct occr *next;
64 /* The insn that computes the expression. */
65 rtx insn;
66 };
67
68 typedef struct occr *occr_t;
69 DEF_VEC_P (occr_t);
70 DEF_VEC_ALLOC_P (occr_t, heap);
71
72 /* Hash table entry for assignment expressions. */
73
74 struct expr
75 {
76 /* The expression (DEST := SRC). */
77 rtx dest;
78 rtx src;
79
80 /* Index in the available expression bitmaps. */
81 int bitmap_index;
82 /* Next entry with the same hash. */
83 struct expr *next_same_hash;
84 /* List of available occurrence in basic blocks in the function.
85 An "available occurrence" is one that is the last occurrence in the
86 basic block and whose operands are not modified by following statements
87 in the basic block [including this insn]. */
88 struct occr *avail_occr;
89 };
90
91 /* Hash table for copy propagation expressions.
92 Each hash table is an array of buckets.
93 ??? It is known that if it were an array of entries, structure elements
94 `next_same_hash' and `bitmap_index' wouldn't be necessary. However, it is
95 not clear whether in the final analysis a sufficient amount of memory would
96 be saved as the size of the available expression bitmaps would be larger
97 [one could build a mapping table without holes afterwards though].
98 Someday I'll perform the computation and figure it out. */
99
100 struct hash_table_d
101 {
102 /* The table itself.
103 This is an array of `set_hash_table_size' elements. */
104 struct expr **table;
105
106 /* Size of the hash table, in elements. */
107 unsigned int size;
108
109 /* Number of hash table elements. */
110 unsigned int n_elems;
111 };
112
113 /* Copy propagation hash table. */
114 static struct hash_table_d set_hash_table;
115
116 /* Array of implicit set patterns indexed by basic block index. */
117 static rtx *implicit_sets;
118
119 /* Array of indexes of expressions for implicit set patterns indexed by basic
120 block index. In other words, implicit_set_indexes[i] is the bitmap_index
121 of the expression whose RTX is implicit_sets[i]. */
122 static int *implicit_set_indexes;
123
124 /* Bitmap containing one bit for each register in the program.
125 Used when performing GCSE to track which registers have been set since
126 the start or end of the basic block while traversing that block. */
127 static regset reg_set_bitmap;
128
129 /* Various variables for statistics gathering. */
130
131 /* Memory used in a pass.
132 This isn't intended to be absolutely precise. Its intent is only
133 to keep an eye on memory usage. */
134 static int bytes_used;
135
136 /* Number of local constants propagated. */
137 static int local_const_prop_count;
138 /* Number of local copies propagated. */
139 static int local_copy_prop_count;
140 /* Number of global constants propagated. */
141 static int global_const_prop_count;
142 /* Number of global copies propagated. */
143 static int global_copy_prop_count;
144
145 #define GOBNEW(T) ((T *) cprop_alloc (sizeof (T)))
146 #define GOBNEWVAR(T, S) ((T *) cprop_alloc ((S)))
147
148 /* Cover function to obstack_alloc. */
149
150 static void *
151 cprop_alloc (unsigned long size)
152 {
153 bytes_used += size;
154 return obstack_alloc (&cprop_obstack, size);
155 }
156 \f
157 /* Return nonzero if register X is unchanged from INSN to the end
158 of INSN's basic block. */
159
160 static int
161 reg_available_p (const_rtx x, const_rtx insn ATTRIBUTE_UNUSED)
162 {
163 return ! REGNO_REG_SET_P (reg_set_bitmap, REGNO (x));
164 }
165
166 /* Hash a set of register REGNO.
167
168 Sets are hashed on the register that is set. This simplifies the PRE copy
169 propagation code.
170
171 ??? May need to make things more elaborate. Later, as necessary. */
172
173 static unsigned int
174 hash_set (int regno, int hash_table_size)
175 {
176 unsigned int hash;
177
178 hash = regno;
179 return hash % hash_table_size;
180 }
181
182 /* Insert assignment DEST:=SET from INSN in the hash table.
183 DEST is a register and SET is a register or a suitable constant.
184 If the assignment is already present in the table, record it as
185 the last occurrence in INSN's basic block.
186 IMPLICIT is true if it's an implicit set, false otherwise. */
187
188 static void
189 insert_set_in_table (rtx dest, rtx src, rtx insn, struct hash_table_d *table,
190 bool implicit)
191 {
192 bool found = false;
193 unsigned int hash;
194 struct expr *cur_expr, *last_expr = NULL;
195 struct occr *cur_occr;
196
197 hash = hash_set (REGNO (dest), table->size);
198
199 for (cur_expr = table->table[hash]; cur_expr;
200 cur_expr = cur_expr->next_same_hash)
201 {
202 if (dest == cur_expr->dest
203 && src == cur_expr->src)
204 {
205 found = true;
206 break;
207 }
208 last_expr = cur_expr;
209 }
210
211 if (! found)
212 {
213 cur_expr = GOBNEW (struct expr);
214 bytes_used += sizeof (struct expr);
215 if (table->table[hash] == NULL)
216 /* This is the first pattern that hashed to this index. */
217 table->table[hash] = cur_expr;
218 else
219 /* Add EXPR to end of this hash chain. */
220 last_expr->next_same_hash = cur_expr;
221
222 /* Set the fields of the expr element.
223 We must copy X because it can be modified when copy propagation is
224 performed on its operands. */
225 cur_expr->dest = copy_rtx (dest);
226 cur_expr->src = copy_rtx (src);
227 cur_expr->bitmap_index = table->n_elems++;
228 cur_expr->next_same_hash = NULL;
229 cur_expr->avail_occr = NULL;
230 }
231
232 /* Now record the occurrence. */
233 cur_occr = cur_expr->avail_occr;
234
235 if (cur_occr
236 && BLOCK_FOR_INSN (cur_occr->insn) == BLOCK_FOR_INSN (insn))
237 {
238 /* Found another instance of the expression in the same basic block.
239 Prefer this occurrence to the currently recorded one. We want
240 the last one in the block and the block is scanned from start
241 to end. */
242 cur_occr->insn = insn;
243 }
244 else
245 {
246 /* First occurrence of this expression in this basic block. */
247 cur_occr = GOBNEW (struct occr);
248 bytes_used += sizeof (struct occr);
249 cur_occr->insn = insn;
250 cur_occr->next = cur_expr->avail_occr;
251 cur_expr->avail_occr = cur_occr;
252 }
253
254 /* Record bitmap_index of the implicit set in implicit_set_indexes. */
255 if (implicit)
256 implicit_set_indexes[BLOCK_FOR_INSN(insn)->index] = cur_expr->bitmap_index;
257 }
258
259 /* Determine whether the rtx X should be treated as a constant for CPROP.
260 Since X might be inserted more than once we have to take care that it
261 is sharable. */
262
263 static bool
264 cprop_constant_p (const_rtx x)
265 {
266 return CONSTANT_P (x) && (GET_CODE (x) != CONST || shared_const_p (x));
267 }
268
269 /* Scan SET present in INSN and add an entry to the hash TABLE.
270 IMPLICIT is true if it's an implicit set, false otherwise. */
271
272 static void
273 hash_scan_set (rtx set, rtx insn, struct hash_table_d *table, bool implicit)
274 {
275 rtx src = SET_SRC (set);
276 rtx dest = SET_DEST (set);
277
278 if (REG_P (dest)
279 && ! HARD_REGISTER_P (dest)
280 && reg_available_p (dest, insn)
281 && can_copy_p (GET_MODE (dest)))
282 {
283 /* See if a REG_EQUAL note shows this equivalent to a simpler expression.
284
285 This allows us to do a single CPROP pass and still eliminate
286 redundant constants, addresses or other expressions that are
287 constructed with multiple instructions.
288
289 However, keep the original SRC if INSN is a simple reg-reg move. In
290 In this case, there will almost always be a REG_EQUAL note on the
291 insn that sets SRC. By recording the REG_EQUAL value here as SRC
292 for INSN, we miss copy propagation opportunities.
293
294 Note that this does not impede profitable constant propagations. We
295 "look through" reg-reg sets in lookup_set. */
296 rtx note = find_reg_equal_equiv_note (insn);
297 if (note != 0
298 && REG_NOTE_KIND (note) == REG_EQUAL
299 && !REG_P (src)
300 && cprop_constant_p (XEXP (note, 0)))
301 src = XEXP (note, 0), set = gen_rtx_SET (VOIDmode, dest, src);
302
303 /* Record sets for constant/copy propagation. */
304 if ((REG_P (src)
305 && src != dest
306 && ! HARD_REGISTER_P (src)
307 && reg_available_p (src, insn))
308 || cprop_constant_p (src))
309 insert_set_in_table (dest, src, insn, table, implicit);
310 }
311 }
312
313 /* Process INSN and add hash table entries as appropriate. */
314
315 static void
316 hash_scan_insn (rtx insn, struct hash_table_d *table)
317 {
318 rtx pat = PATTERN (insn);
319 int i;
320
321 /* Pick out the sets of INSN and for other forms of instructions record
322 what's been modified. */
323
324 if (GET_CODE (pat) == SET)
325 hash_scan_set (pat, insn, table, false);
326 else if (GET_CODE (pat) == PARALLEL)
327 for (i = 0; i < XVECLEN (pat, 0); i++)
328 {
329 rtx x = XVECEXP (pat, 0, i);
330
331 if (GET_CODE (x) == SET)
332 hash_scan_set (x, insn, table, false);
333 }
334 }
335
336 /* Dump the hash table TABLE to file FILE under the name NAME. */
337
338 static void
339 dump_hash_table (FILE *file, const char *name, struct hash_table_d *table)
340 {
341 int i;
342 /* Flattened out table, so it's printed in proper order. */
343 struct expr **flat_table;
344 unsigned int *hash_val;
345 struct expr *expr;
346
347 flat_table = XCNEWVEC (struct expr *, table->n_elems);
348 hash_val = XNEWVEC (unsigned int, table->n_elems);
349
350 for (i = 0; i < (int) table->size; i++)
351 for (expr = table->table[i]; expr != NULL; expr = expr->next_same_hash)
352 {
353 flat_table[expr->bitmap_index] = expr;
354 hash_val[expr->bitmap_index] = i;
355 }
356
357 fprintf (file, "%s hash table (%d buckets, %d entries)\n",
358 name, table->size, table->n_elems);
359
360 for (i = 0; i < (int) table->n_elems; i++)
361 if (flat_table[i] != 0)
362 {
363 expr = flat_table[i];
364 fprintf (file, "Index %d (hash value %d)\n ",
365 expr->bitmap_index, hash_val[i]);
366 print_rtl (file, expr->dest);
367 fprintf (file, " := ");
368 print_rtl (file, expr->src);
369 fprintf (file, "\n");
370 }
371
372 fprintf (file, "\n");
373
374 free (flat_table);
375 free (hash_val);
376 }
377
378 /* Record as unavailable all registers that are DEF operands of INSN. */
379
380 static void
381 make_set_regs_unavailable (rtx insn)
382 {
383 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
384 df_ref *def_rec;
385
386 for (def_rec = DF_INSN_INFO_DEFS (insn_info); *def_rec; def_rec++)
387 SET_REGNO_REG_SET (reg_set_bitmap, DF_REF_REGNO (*def_rec));
388 }
389
390 /* Top level function to create an assignment hash table.
391
392 Assignment entries are placed in the hash table if
393 - they are of the form (set (pseudo-reg) src),
394 - src is something we want to perform const/copy propagation on,
395 - none of the operands or target are subsequently modified in the block
396
397 Currently src must be a pseudo-reg or a const_int.
398
399 TABLE is the table computed. */
400
401 static void
402 compute_hash_table_work (struct hash_table_d *table)
403 {
404 basic_block bb;
405
406 /* Allocate vars to track sets of regs. */
407 reg_set_bitmap = ALLOC_REG_SET (NULL);
408
409 FOR_EACH_BB (bb)
410 {
411 rtx insn;
412
413 /* Reset tables used to keep track of what's not yet invalid [since
414 the end of the block]. */
415 CLEAR_REG_SET (reg_set_bitmap);
416
417 /* Go over all insns from the last to the first. This is convenient
418 for tracking available registers, i.e. not set between INSN and
419 the end of the basic block BB. */
420 FOR_BB_INSNS_REVERSE (bb, insn)
421 {
422 /* Only real insns are interesting. */
423 if (!NONDEBUG_INSN_P (insn))
424 continue;
425
426 /* Record interesting sets from INSN in the hash table. */
427 hash_scan_insn (insn, table);
428
429 /* Any registers set in INSN will make SETs above it not AVAIL. */
430 make_set_regs_unavailable (insn);
431 }
432
433 /* Insert implicit sets in the hash table, pretending they appear as
434 insns at the head of the basic block. */
435 if (implicit_sets[bb->index] != NULL_RTX)
436 hash_scan_set (implicit_sets[bb->index], BB_HEAD (bb), table, true);
437 }
438
439 FREE_REG_SET (reg_set_bitmap);
440 }
441
442 /* Allocate space for the set/expr hash TABLE.
443 It is used to determine the number of buckets to use. */
444
445 static void
446 alloc_hash_table (struct hash_table_d *table)
447 {
448 int n;
449
450 n = get_max_insn_count ();
451
452 table->size = n / 4;
453 if (table->size < 11)
454 table->size = 11;
455
456 /* Attempt to maintain efficient use of hash table.
457 Making it an odd number is simplest for now.
458 ??? Later take some measurements. */
459 table->size |= 1;
460 n = table->size * sizeof (struct expr *);
461 table->table = XNEWVAR (struct expr *, n);
462 }
463
464 /* Free things allocated by alloc_hash_table. */
465
466 static void
467 free_hash_table (struct hash_table_d *table)
468 {
469 free (table->table);
470 }
471
472 /* Compute the hash TABLE for doing copy/const propagation or
473 expression hash table. */
474
475 static void
476 compute_hash_table (struct hash_table_d *table)
477 {
478 /* Initialize count of number of entries in hash table. */
479 table->n_elems = 0;
480 memset (table->table, 0, table->size * sizeof (struct expr *));
481
482 compute_hash_table_work (table);
483 }
484 \f
485 /* Expression tracking support. */
486
487 /* Lookup REGNO in the set TABLE. The result is a pointer to the
488 table entry, or NULL if not found. */
489
490 static struct expr *
491 lookup_set (unsigned int regno, struct hash_table_d *table)
492 {
493 unsigned int hash = hash_set (regno, table->size);
494 struct expr *expr;
495
496 expr = table->table[hash];
497
498 while (expr && REGNO (expr->dest) != regno)
499 expr = expr->next_same_hash;
500
501 return expr;
502 }
503
504 /* Return the next entry for REGNO in list EXPR. */
505
506 static struct expr *
507 next_set (unsigned int regno, struct expr *expr)
508 {
509 do
510 expr = expr->next_same_hash;
511 while (expr && REGNO (expr->dest) != regno);
512
513 return expr;
514 }
515
516 /* Reset tables used to keep track of what's still available [since the
517 start of the block]. */
518
519 static void
520 reset_opr_set_tables (void)
521 {
522 /* Maintain a bitmap of which regs have been set since beginning of
523 the block. */
524 CLEAR_REG_SET (reg_set_bitmap);
525 }
526
527 /* Return nonzero if the register X has not been set yet [since the
528 start of the basic block containing INSN]. */
529
530 static int
531 reg_not_set_p (const_rtx x, const_rtx insn ATTRIBUTE_UNUSED)
532 {
533 return ! REGNO_REG_SET_P (reg_set_bitmap, REGNO (x));
534 }
535
536 /* Record things set by INSN.
537 This data is used by reg_not_set_p. */
538
539 static void
540 mark_oprs_set (rtx insn)
541 {
542 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
543 df_ref *def_rec;
544
545 for (def_rec = DF_INSN_INFO_DEFS (insn_info); *def_rec; def_rec++)
546 SET_REGNO_REG_SET (reg_set_bitmap, DF_REF_REGNO (*def_rec));
547 }
548 \f
549 /* Compute copy/constant propagation working variables. */
550
551 /* Local properties of assignments. */
552 static sbitmap *cprop_avloc;
553 static sbitmap *cprop_kill;
554
555 /* Global properties of assignments (computed from the local properties). */
556 static sbitmap *cprop_avin;
557 static sbitmap *cprop_avout;
558
559 /* Allocate vars used for copy/const propagation. N_BLOCKS is the number of
560 basic blocks. N_SETS is the number of sets. */
561
562 static void
563 alloc_cprop_mem (int n_blocks, int n_sets)
564 {
565 cprop_avloc = sbitmap_vector_alloc (n_blocks, n_sets);
566 cprop_kill = sbitmap_vector_alloc (n_blocks, n_sets);
567
568 cprop_avin = sbitmap_vector_alloc (n_blocks, n_sets);
569 cprop_avout = sbitmap_vector_alloc (n_blocks, n_sets);
570 }
571
572 /* Free vars used by copy/const propagation. */
573
574 static void
575 free_cprop_mem (void)
576 {
577 sbitmap_vector_free (cprop_avloc);
578 sbitmap_vector_free (cprop_kill);
579 sbitmap_vector_free (cprop_avin);
580 sbitmap_vector_free (cprop_avout);
581 }
582
583 /* Compute the local properties of each recorded expression.
584
585 Local properties are those that are defined by the block, irrespective of
586 other blocks.
587
588 An expression is killed in a block if its operands, either DEST or SRC, are
589 modified in the block.
590
591 An expression is computed (locally available) in a block if it is computed
592 at least once and expression would contain the same value if the
593 computation was moved to the end of the block.
594
595 KILL and COMP are destination sbitmaps for recording local properties. */
596
597 static void
598 compute_local_properties (sbitmap *kill, sbitmap *comp,
599 struct hash_table_d *table)
600 {
601 unsigned int i;
602
603 /* Initialize the bitmaps that were passed in. */
604 sbitmap_vector_zero (kill, last_basic_block);
605 sbitmap_vector_zero (comp, last_basic_block);
606
607 for (i = 0; i < table->size; i++)
608 {
609 struct expr *expr;
610
611 for (expr = table->table[i]; expr != NULL; expr = expr->next_same_hash)
612 {
613 int indx = expr->bitmap_index;
614 df_ref def;
615 struct occr *occr;
616
617 /* For each definition of the destination pseudo-reg, the expression
618 is killed in the block where the definition is. */
619 for (def = DF_REG_DEF_CHAIN (REGNO (expr->dest));
620 def; def = DF_REF_NEXT_REG (def))
621 SET_BIT (kill[DF_REF_BB (def)->index], indx);
622
623 /* If the source is a pseudo-reg, for each definition of the source,
624 the expression is killed in the block where the definition is. */
625 if (REG_P (expr->src))
626 for (def = DF_REG_DEF_CHAIN (REGNO (expr->src));
627 def; def = DF_REF_NEXT_REG (def))
628 SET_BIT (kill[DF_REF_BB (def)->index], indx);
629
630 /* The occurrences recorded in avail_occr are exactly those that
631 are locally available in the block where they are. */
632 for (occr = expr->avail_occr; occr != NULL; occr = occr->next)
633 {
634 SET_BIT (comp[BLOCK_FOR_INSN (occr->insn)->index], indx);
635 }
636 }
637 }
638 }
639 \f
640 /* Hash table support. */
641
642 /* Top level routine to do the dataflow analysis needed by copy/const
643 propagation. */
644
645 static void
646 compute_cprop_data (void)
647 {
648 basic_block bb;
649
650 compute_local_properties (cprop_kill, cprop_avloc, &set_hash_table);
651 compute_available (cprop_avloc, cprop_kill, cprop_avout, cprop_avin);
652
653 /* Merge implicit sets into CPROP_AVIN. They are always available at the
654 entry of their basic block. We need to do this because 1) implicit sets
655 aren't recorded for the local pass so they cannot be propagated within
656 their basic block by this pass and 2) the global pass would otherwise
657 propagate them only in the successors of their basic block. */
658 FOR_EACH_BB (bb)
659 {
660 int index = implicit_set_indexes[bb->index];
661 if (index != -1)
662 SET_BIT (cprop_avin[bb->index], index);
663 }
664 }
665 \f
666 /* Copy/constant propagation. */
667
668 /* Maximum number of register uses in an insn that we handle. */
669 #define MAX_USES 8
670
671 /* Table of uses (registers, both hard and pseudo) found in an insn.
672 Allocated statically to avoid alloc/free complexity and overhead. */
673 static rtx reg_use_table[MAX_USES];
674
675 /* Index into `reg_use_table' while building it. */
676 static unsigned reg_use_count;
677
678 /* Set up a list of register numbers used in INSN. The found uses are stored
679 in `reg_use_table'. `reg_use_count' is initialized to zero before entry,
680 and contains the number of uses in the table upon exit.
681
682 ??? If a register appears multiple times we will record it multiple times.
683 This doesn't hurt anything but it will slow things down. */
684
685 static void
686 find_used_regs (rtx *xptr, void *data ATTRIBUTE_UNUSED)
687 {
688 int i, j;
689 enum rtx_code code;
690 const char *fmt;
691 rtx x = *xptr;
692
693 /* repeat is used to turn tail-recursion into iteration since GCC
694 can't do it when there's no return value. */
695 repeat:
696 if (x == 0)
697 return;
698
699 code = GET_CODE (x);
700 if (REG_P (x))
701 {
702 if (reg_use_count == MAX_USES)
703 return;
704
705 reg_use_table[reg_use_count] = x;
706 reg_use_count++;
707 }
708
709 /* Recursively scan the operands of this expression. */
710
711 for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
712 {
713 if (fmt[i] == 'e')
714 {
715 /* If we are about to do the last recursive call
716 needed at this level, change it into iteration.
717 This function is called enough to be worth it. */
718 if (i == 0)
719 {
720 x = XEXP (x, 0);
721 goto repeat;
722 }
723
724 find_used_regs (&XEXP (x, i), data);
725 }
726 else if (fmt[i] == 'E')
727 for (j = 0; j < XVECLEN (x, i); j++)
728 find_used_regs (&XVECEXP (x, i, j), data);
729 }
730 }
731
732 /* Try to replace all uses of FROM in INSN with TO.
733 Return nonzero if successful. */
734
735 static int
736 try_replace_reg (rtx from, rtx to, rtx insn)
737 {
738 rtx note = find_reg_equal_equiv_note (insn);
739 rtx src = 0;
740 int success = 0;
741 rtx set = single_set (insn);
742
743 /* Usually we substitute easy stuff, so we won't copy everything.
744 We however need to take care to not duplicate non-trivial CONST
745 expressions. */
746 to = copy_rtx (to);
747
748 validate_replace_src_group (from, to, insn);
749 if (num_changes_pending () && apply_change_group ())
750 success = 1;
751
752 /* Try to simplify SET_SRC if we have substituted a constant. */
753 if (success && set && CONSTANT_P (to))
754 {
755 src = simplify_rtx (SET_SRC (set));
756
757 if (src)
758 validate_change (insn, &SET_SRC (set), src, 0);
759 }
760
761 /* If there is already a REG_EQUAL note, update the expression in it
762 with our replacement. */
763 if (note != 0 && REG_NOTE_KIND (note) == REG_EQUAL)
764 set_unique_reg_note (insn, REG_EQUAL,
765 simplify_replace_rtx (XEXP (note, 0), from, to));
766 if (!success && set && reg_mentioned_p (from, SET_SRC (set)))
767 {
768 /* If above failed and this is a single set, try to simplify the source
769 of the set given our substitution. We could perhaps try this for
770 multiple SETs, but it probably won't buy us anything. */
771 src = simplify_replace_rtx (SET_SRC (set), from, to);
772
773 if (!rtx_equal_p (src, SET_SRC (set))
774 && validate_change (insn, &SET_SRC (set), src, 0))
775 success = 1;
776
777 /* If we've failed perform the replacement, have a single SET to
778 a REG destination and don't yet have a note, add a REG_EQUAL note
779 to not lose information. */
780 if (!success && note == 0 && set != 0 && REG_P (SET_DEST (set)))
781 note = set_unique_reg_note (insn, REG_EQUAL, copy_rtx (src));
782 }
783
784 if (set && MEM_P (SET_DEST (set)) && reg_mentioned_p (from, SET_DEST (set)))
785 {
786 /* Registers can also appear as uses in SET_DEST if it is a MEM.
787 We could perhaps try this for multiple SETs, but it probably
788 won't buy us anything. */
789 rtx dest = simplify_replace_rtx (SET_DEST (set), from, to);
790
791 if (!rtx_equal_p (dest, SET_DEST (set))
792 && validate_change (insn, &SET_DEST (set), dest, 0))
793 success = 1;
794 }
795
796 /* REG_EQUAL may get simplified into register.
797 We don't allow that. Remove that note. This code ought
798 not to happen, because previous code ought to synthesize
799 reg-reg move, but be on the safe side. */
800 if (note && REG_NOTE_KIND (note) == REG_EQUAL && REG_P (XEXP (note, 0)))
801 remove_note (insn, note);
802
803 return success;
804 }
805
806 /* Find a set of REGNOs that are available on entry to INSN's block. Return
807 NULL no such set is found. */
808
809 static struct expr *
810 find_avail_set (int regno, rtx insn)
811 {
812 /* SET1 contains the last set found that can be returned to the caller for
813 use in a substitution. */
814 struct expr *set1 = 0;
815
816 /* Loops are not possible here. To get a loop we would need two sets
817 available at the start of the block containing INSN. i.e. we would
818 need two sets like this available at the start of the block:
819
820 (set (reg X) (reg Y))
821 (set (reg Y) (reg X))
822
823 This can not happen since the set of (reg Y) would have killed the
824 set of (reg X) making it unavailable at the start of this block. */
825 while (1)
826 {
827 rtx src;
828 struct expr *set = lookup_set (regno, &set_hash_table);
829
830 /* Find a set that is available at the start of the block
831 which contains INSN. */
832 while (set)
833 {
834 if (TEST_BIT (cprop_avin[BLOCK_FOR_INSN (insn)->index],
835 set->bitmap_index))
836 break;
837 set = next_set (regno, set);
838 }
839
840 /* If no available set was found we've reached the end of the
841 (possibly empty) copy chain. */
842 if (set == 0)
843 break;
844
845 src = set->src;
846
847 /* We know the set is available.
848 Now check that SRC is locally anticipatable (i.e. none of the
849 source operands have changed since the start of the block).
850
851 If the source operand changed, we may still use it for the next
852 iteration of this loop, but we may not use it for substitutions. */
853
854 if (cprop_constant_p (src) || reg_not_set_p (src, insn))
855 set1 = set;
856
857 /* If the source of the set is anything except a register, then
858 we have reached the end of the copy chain. */
859 if (! REG_P (src))
860 break;
861
862 /* Follow the copy chain, i.e. start another iteration of the loop
863 and see if we have an available copy into SRC. */
864 regno = REGNO (src);
865 }
866
867 /* SET1 holds the last set that was available and anticipatable at
868 INSN. */
869 return set1;
870 }
871
872 /* Subroutine of cprop_insn that tries to propagate constants into
873 JUMP_INSNS. JUMP must be a conditional jump. If SETCC is non-NULL
874 it is the instruction that immediately precedes JUMP, and must be a
875 single SET of a register. FROM is what we will try to replace,
876 SRC is the constant we will try to substitute for it. Return nonzero
877 if a change was made. */
878
879 static int
880 cprop_jump (basic_block bb, rtx setcc, rtx jump, rtx from, rtx src)
881 {
882 rtx new_rtx, set_src, note_src;
883 rtx set = pc_set (jump);
884 rtx note = find_reg_equal_equiv_note (jump);
885
886 if (note)
887 {
888 note_src = XEXP (note, 0);
889 if (GET_CODE (note_src) == EXPR_LIST)
890 note_src = NULL_RTX;
891 }
892 else note_src = NULL_RTX;
893
894 /* Prefer REG_EQUAL notes except those containing EXPR_LISTs. */
895 set_src = note_src ? note_src : SET_SRC (set);
896
897 /* First substitute the SETCC condition into the JUMP instruction,
898 then substitute that given values into this expanded JUMP. */
899 if (setcc != NULL_RTX
900 && !modified_between_p (from, setcc, jump)
901 && !modified_between_p (src, setcc, jump))
902 {
903 rtx setcc_src;
904 rtx setcc_set = single_set (setcc);
905 rtx setcc_note = find_reg_equal_equiv_note (setcc);
906 setcc_src = (setcc_note && GET_CODE (XEXP (setcc_note, 0)) != EXPR_LIST)
907 ? XEXP (setcc_note, 0) : SET_SRC (setcc_set);
908 set_src = simplify_replace_rtx (set_src, SET_DEST (setcc_set),
909 setcc_src);
910 }
911 else
912 setcc = NULL_RTX;
913
914 new_rtx = simplify_replace_rtx (set_src, from, src);
915
916 /* If no simplification can be made, then try the next register. */
917 if (rtx_equal_p (new_rtx, SET_SRC (set)))
918 return 0;
919
920 /* If this is now a no-op delete it, otherwise this must be a valid insn. */
921 if (new_rtx == pc_rtx)
922 delete_insn (jump);
923 else
924 {
925 /* Ensure the value computed inside the jump insn to be equivalent
926 to one computed by setcc. */
927 if (setcc && modified_in_p (new_rtx, setcc))
928 return 0;
929 if (! validate_unshare_change (jump, &SET_SRC (set), new_rtx, 0))
930 {
931 /* When (some) constants are not valid in a comparison, and there
932 are two registers to be replaced by constants before the entire
933 comparison can be folded into a constant, we need to keep
934 intermediate information in REG_EQUAL notes. For targets with
935 separate compare insns, such notes are added by try_replace_reg.
936 When we have a combined compare-and-branch instruction, however,
937 we need to attach a note to the branch itself to make this
938 optimization work. */
939
940 if (!rtx_equal_p (new_rtx, note_src))
941 set_unique_reg_note (jump, REG_EQUAL, copy_rtx (new_rtx));
942 return 0;
943 }
944
945 /* Remove REG_EQUAL note after simplification. */
946 if (note_src)
947 remove_note (jump, note);
948 }
949
950 #ifdef HAVE_cc0
951 /* Delete the cc0 setter. */
952 if (setcc != NULL && CC0_P (SET_DEST (single_set (setcc))))
953 delete_insn (setcc);
954 #endif
955
956 global_const_prop_count++;
957 if (dump_file != NULL)
958 {
959 fprintf (dump_file,
960 "GLOBAL CONST-PROP: Replacing reg %d in jump_insn %d with"
961 "constant ", REGNO (from), INSN_UID (jump));
962 print_rtl (dump_file, src);
963 fprintf (dump_file, "\n");
964 }
965 purge_dead_edges (bb);
966
967 /* If a conditional jump has been changed into unconditional jump, remove
968 the jump and make the edge fallthru - this is always called in
969 cfglayout mode. */
970 if (new_rtx != pc_rtx && simplejump_p (jump))
971 {
972 edge e;
973 edge_iterator ei;
974
975 FOR_EACH_EDGE (e, ei, bb->succs)
976 if (e->dest != EXIT_BLOCK_PTR
977 && BB_HEAD (e->dest) == JUMP_LABEL (jump))
978 {
979 e->flags |= EDGE_FALLTHRU;
980 break;
981 }
982 delete_insn (jump);
983 }
984
985 return 1;
986 }
987
988 /* Subroutine of cprop_insn that tries to propagate constants. FROM is what
989 we will try to replace, SRC is the constant we will try to substitute for
990 it and INSN is the instruction where this will be happening. */
991
992 static int
993 constprop_register (rtx from, rtx src, rtx insn)
994 {
995 rtx sset;
996
997 /* Check for reg or cc0 setting instructions followed by
998 conditional branch instructions first. */
999 if ((sset = single_set (insn)) != NULL
1000 && NEXT_INSN (insn)
1001 && any_condjump_p (NEXT_INSN (insn)) && onlyjump_p (NEXT_INSN (insn)))
1002 {
1003 rtx dest = SET_DEST (sset);
1004 if ((REG_P (dest) || CC0_P (dest))
1005 && cprop_jump (BLOCK_FOR_INSN (insn), insn, NEXT_INSN (insn),
1006 from, src))
1007 return 1;
1008 }
1009
1010 /* Handle normal insns next. */
1011 if (NONJUMP_INSN_P (insn) && try_replace_reg (from, src, insn))
1012 return 1;
1013
1014 /* Try to propagate a CONST_INT into a conditional jump.
1015 We're pretty specific about what we will handle in this
1016 code, we can extend this as necessary over time.
1017
1018 Right now the insn in question must look like
1019 (set (pc) (if_then_else ...)) */
1020 else if (any_condjump_p (insn) && onlyjump_p (insn))
1021 return cprop_jump (BLOCK_FOR_INSN (insn), NULL, insn, from, src);
1022 return 0;
1023 }
1024
1025 /* Perform constant and copy propagation on INSN.
1026 Return nonzero if a change was made. */
1027
1028 static int
1029 cprop_insn (rtx insn)
1030 {
1031 unsigned i;
1032 int changed = 0, changed_this_round;
1033 rtx note;
1034
1035 retry:
1036 changed_this_round = 0;
1037 reg_use_count = 0;
1038 note_uses (&PATTERN (insn), find_used_regs, NULL);
1039
1040 /* We may win even when propagating constants into notes. */
1041 note = find_reg_equal_equiv_note (insn);
1042 if (note)
1043 find_used_regs (&XEXP (note, 0), NULL);
1044
1045 for (i = 0; i < reg_use_count; i++)
1046 {
1047 rtx reg_used = reg_use_table[i];
1048 unsigned int regno = REGNO (reg_used);
1049 rtx src;
1050 struct expr *set;
1051
1052 /* If the register has already been set in this block, there's
1053 nothing we can do. */
1054 if (! reg_not_set_p (reg_used, insn))
1055 continue;
1056
1057 /* Find an assignment that sets reg_used and is available
1058 at the start of the block. */
1059 set = find_avail_set (regno, insn);
1060 if (! set)
1061 continue;
1062
1063 src = set->src;
1064
1065 /* Constant propagation. */
1066 if (cprop_constant_p (src))
1067 {
1068 if (constprop_register (reg_used, src, insn))
1069 {
1070 changed_this_round = changed = 1;
1071 global_const_prop_count++;
1072 if (dump_file != NULL)
1073 {
1074 fprintf (dump_file,
1075 "GLOBAL CONST-PROP: Replacing reg %d in ", regno);
1076 fprintf (dump_file, "insn %d with constant ",
1077 INSN_UID (insn));
1078 print_rtl (dump_file, src);
1079 fprintf (dump_file, "\n");
1080 }
1081 if (INSN_DELETED_P (insn))
1082 return 1;
1083 }
1084 }
1085 else if (REG_P (src)
1086 && REGNO (src) >= FIRST_PSEUDO_REGISTER
1087 && REGNO (src) != regno)
1088 {
1089 if (try_replace_reg (reg_used, src, insn))
1090 {
1091 changed_this_round = changed = 1;
1092 global_copy_prop_count++;
1093 if (dump_file != NULL)
1094 {
1095 fprintf (dump_file,
1096 "GLOBAL COPY-PROP: Replacing reg %d in insn %d",
1097 regno, INSN_UID (insn));
1098 fprintf (dump_file, " with reg %d\n", REGNO (src));
1099 }
1100
1101 /* The original insn setting reg_used may or may not now be
1102 deletable. We leave the deletion to DCE. */
1103 /* FIXME: If it turns out that the insn isn't deletable,
1104 then we may have unnecessarily extended register lifetimes
1105 and made things worse. */
1106 }
1107 }
1108
1109 /* If try_replace_reg simplified the insn, the regs found
1110 by find_used_regs may not be valid anymore. Start over. */
1111 if (changed_this_round)
1112 goto retry;
1113 }
1114
1115 if (changed && DEBUG_INSN_P (insn))
1116 return 0;
1117
1118 return changed;
1119 }
1120
1121 /* Like find_used_regs, but avoid recording uses that appear in
1122 input-output contexts such as zero_extract or pre_dec. This
1123 restricts the cases we consider to those for which local cprop
1124 can legitimately make replacements. */
1125
1126 static void
1127 local_cprop_find_used_regs (rtx *xptr, void *data)
1128 {
1129 rtx x = *xptr;
1130
1131 if (x == 0)
1132 return;
1133
1134 switch (GET_CODE (x))
1135 {
1136 case ZERO_EXTRACT:
1137 case SIGN_EXTRACT:
1138 case STRICT_LOW_PART:
1139 return;
1140
1141 case PRE_DEC:
1142 case PRE_INC:
1143 case POST_DEC:
1144 case POST_INC:
1145 case PRE_MODIFY:
1146 case POST_MODIFY:
1147 /* Can only legitimately appear this early in the context of
1148 stack pushes for function arguments, but handle all of the
1149 codes nonetheless. */
1150 return;
1151
1152 case SUBREG:
1153 /* Setting a subreg of a register larger than word_mode leaves
1154 the non-written words unchanged. */
1155 if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) > BITS_PER_WORD)
1156 return;
1157 break;
1158
1159 default:
1160 break;
1161 }
1162
1163 find_used_regs (xptr, data);
1164 }
1165
1166 /* Try to perform local const/copy propagation on X in INSN. */
1167
1168 static bool
1169 do_local_cprop (rtx x, rtx insn)
1170 {
1171 rtx newreg = NULL, newcnst = NULL;
1172
1173 /* Rule out USE instructions and ASM statements as we don't want to
1174 change the hard registers mentioned. */
1175 if (REG_P (x)
1176 && (REGNO (x) >= FIRST_PSEUDO_REGISTER
1177 || (GET_CODE (PATTERN (insn)) != USE
1178 && asm_noperands (PATTERN (insn)) < 0)))
1179 {
1180 cselib_val *val = cselib_lookup (x, GET_MODE (x), 0, VOIDmode);
1181 struct elt_loc_list *l;
1182
1183 if (!val)
1184 return false;
1185 for (l = val->locs; l; l = l->next)
1186 {
1187 rtx this_rtx = l->loc;
1188 rtx note;
1189
1190 if (cprop_constant_p (this_rtx))
1191 newcnst = this_rtx;
1192 if (REG_P (this_rtx) && REGNO (this_rtx) >= FIRST_PSEUDO_REGISTER
1193 /* Don't copy propagate if it has attached REG_EQUIV note.
1194 At this point this only function parameters should have
1195 REG_EQUIV notes and if the argument slot is used somewhere
1196 explicitly, it means address of parameter has been taken,
1197 so we should not extend the lifetime of the pseudo. */
1198 && (!(note = find_reg_note (l->setting_insn, REG_EQUIV, NULL_RTX))
1199 || ! MEM_P (XEXP (note, 0))))
1200 newreg = this_rtx;
1201 }
1202 if (newcnst && constprop_register (x, newcnst, insn))
1203 {
1204 if (dump_file != NULL)
1205 {
1206 fprintf (dump_file, "LOCAL CONST-PROP: Replacing reg %d in ",
1207 REGNO (x));
1208 fprintf (dump_file, "insn %d with constant ",
1209 INSN_UID (insn));
1210 print_rtl (dump_file, newcnst);
1211 fprintf (dump_file, "\n");
1212 }
1213 local_const_prop_count++;
1214 return true;
1215 }
1216 else if (newreg && newreg != x && try_replace_reg (x, newreg, insn))
1217 {
1218 if (dump_file != NULL)
1219 {
1220 fprintf (dump_file,
1221 "LOCAL COPY-PROP: Replacing reg %d in insn %d",
1222 REGNO (x), INSN_UID (insn));
1223 fprintf (dump_file, " with reg %d\n", REGNO (newreg));
1224 }
1225 local_copy_prop_count++;
1226 return true;
1227 }
1228 }
1229 return false;
1230 }
1231
1232 /* Do local const/copy propagation (i.e. within each basic block). */
1233
1234 static int
1235 local_cprop_pass (void)
1236 {
1237 basic_block bb;
1238 rtx insn;
1239 bool changed = false;
1240 unsigned i;
1241
1242 cselib_init (0);
1243 FOR_EACH_BB (bb)
1244 {
1245 FOR_BB_INSNS (bb, insn)
1246 {
1247 if (INSN_P (insn))
1248 {
1249 rtx note = find_reg_equal_equiv_note (insn);
1250 do
1251 {
1252 reg_use_count = 0;
1253 note_uses (&PATTERN (insn), local_cprop_find_used_regs,
1254 NULL);
1255 if (note)
1256 local_cprop_find_used_regs (&XEXP (note, 0), NULL);
1257
1258 for (i = 0; i < reg_use_count; i++)
1259 {
1260 if (do_local_cprop (reg_use_table[i], insn))
1261 {
1262 if (!DEBUG_INSN_P (insn))
1263 changed = true;
1264 break;
1265 }
1266 }
1267 if (INSN_DELETED_P (insn))
1268 break;
1269 }
1270 while (i < reg_use_count);
1271 }
1272 cselib_process_insn (insn);
1273 }
1274
1275 /* Forget everything at the end of a basic block. */
1276 cselib_clear_table ();
1277 }
1278
1279 cselib_finish ();
1280
1281 return changed;
1282 }
1283
1284 /* Similar to get_condition, only the resulting condition must be
1285 valid at JUMP, instead of at EARLIEST.
1286
1287 This differs from noce_get_condition in ifcvt.c in that we prefer not to
1288 settle for the condition variable in the jump instruction being integral.
1289 We prefer to be able to record the value of a user variable, rather than
1290 the value of a temporary used in a condition. This could be solved by
1291 recording the value of *every* register scanned by canonicalize_condition,
1292 but this would require some code reorganization. */
1293
1294 rtx
1295 fis_get_condition (rtx jump)
1296 {
1297 return get_condition (jump, NULL, false, true);
1298 }
1299
1300 /* Check the comparison COND to see if we can safely form an implicit
1301 set from it. */
1302
1303 static bool
1304 implicit_set_cond_p (const_rtx cond)
1305 {
1306 enum machine_mode mode;
1307 rtx cst;
1308
1309 /* COND must be either an EQ or NE comparison. */
1310 if (GET_CODE (cond) != EQ && GET_CODE (cond) != NE)
1311 return false;
1312
1313 /* The first operand of COND must be a pseudo-reg. */
1314 if (! REG_P (XEXP (cond, 0))
1315 || HARD_REGISTER_P (XEXP (cond, 0)))
1316 return false;
1317
1318 /* The second operand of COND must be a suitable constant. */
1319 mode = GET_MODE (XEXP (cond, 0));
1320 cst = XEXP (cond, 1);
1321
1322 /* We can't perform this optimization if either operand might be or might
1323 contain a signed zero. */
1324 if (HONOR_SIGNED_ZEROS (mode))
1325 {
1326 /* It is sufficient to check if CST is or contains a zero. We must
1327 handle float, complex, and vector. If any subpart is a zero, then
1328 the optimization can't be performed. */
1329 /* ??? The complex and vector checks are not implemented yet. We just
1330 always return zero for them. */
1331 if (GET_CODE (cst) == CONST_DOUBLE)
1332 {
1333 REAL_VALUE_TYPE d;
1334 REAL_VALUE_FROM_CONST_DOUBLE (d, cst);
1335 if (REAL_VALUES_EQUAL (d, dconst0))
1336 return 0;
1337 }
1338 else
1339 return 0;
1340 }
1341
1342 return cprop_constant_p (cst);
1343 }
1344
1345 /* Find the implicit sets of a function. An "implicit set" is a constraint
1346 on the value of a variable, implied by a conditional jump. For example,
1347 following "if (x == 2)", the then branch may be optimized as though the
1348 conditional performed an "explicit set", in this example, "x = 2". This
1349 function records the set patterns that are implicit at the start of each
1350 basic block.
1351
1352 If an implicit set is found but the set is implicit on a critical edge,
1353 this critical edge is split.
1354
1355 Return true if the CFG was modified, false otherwise. */
1356
1357 static bool
1358 find_implicit_sets (void)
1359 {
1360 basic_block bb, dest;
1361 rtx cond, new_rtx;
1362 unsigned int count = 0;
1363 bool edges_split = false;
1364 size_t implicit_sets_size = last_basic_block + 10;
1365
1366 implicit_sets = XCNEWVEC (rtx, implicit_sets_size);
1367
1368 FOR_EACH_BB (bb)
1369 {
1370 /* Check for more than one successor. */
1371 if (EDGE_COUNT (bb->succs) <= 1)
1372 continue;
1373
1374 cond = fis_get_condition (BB_END (bb));
1375
1376 /* If no condition is found or if it isn't of a suitable form,
1377 ignore it. */
1378 if (! cond || ! implicit_set_cond_p (cond))
1379 continue;
1380
1381 dest = GET_CODE (cond) == EQ
1382 ? BRANCH_EDGE (bb)->dest : FALLTHRU_EDGE (bb)->dest;
1383
1384 /* If DEST doesn't go anywhere, ignore it. */
1385 if (! dest || dest == EXIT_BLOCK_PTR)
1386 continue;
1387
1388 /* We have found a suitable implicit set. Try to record it now as
1389 a SET in DEST. If DEST has more than one predecessor, the edge
1390 between BB and DEST is a critical edge and we must split it,
1391 because we can only record one implicit set per DEST basic block. */
1392 if (! single_pred_p (dest))
1393 {
1394 dest = split_edge (find_edge (bb, dest));
1395 edges_split = true;
1396 }
1397
1398 if (implicit_sets_size <= (size_t) dest->index)
1399 {
1400 size_t old_implicit_sets_size = implicit_sets_size;
1401 implicit_sets_size *= 2;
1402 implicit_sets = XRESIZEVEC (rtx, implicit_sets, implicit_sets_size);
1403 memset (implicit_sets + old_implicit_sets_size, 0,
1404 (implicit_sets_size - old_implicit_sets_size) * sizeof (rtx));
1405 }
1406
1407 new_rtx = gen_rtx_SET (VOIDmode, XEXP (cond, 0),
1408 XEXP (cond, 1));
1409 implicit_sets[dest->index] = new_rtx;
1410 if (dump_file)
1411 {
1412 fprintf(dump_file, "Implicit set of reg %d in ",
1413 REGNO (XEXP (cond, 0)));
1414 fprintf(dump_file, "basic block %d\n", dest->index);
1415 }
1416 count++;
1417 }
1418
1419 if (dump_file)
1420 fprintf (dump_file, "Found %d implicit sets\n", count);
1421
1422 /* Confess our sins. */
1423 return edges_split;
1424 }
1425
1426 /* Bypass conditional jumps. */
1427
1428 /* The value of last_basic_block at the beginning of the jump_bypass
1429 pass. The use of redirect_edge_and_branch_force may introduce new
1430 basic blocks, but the data flow analysis is only valid for basic
1431 block indices less than bypass_last_basic_block. */
1432
1433 static int bypass_last_basic_block;
1434
1435 /* Find a set of REGNO to a constant that is available at the end of basic
1436 block BB. Return NULL if no such set is found. Based heavily upon
1437 find_avail_set. */
1438
1439 static struct expr *
1440 find_bypass_set (int regno, int bb)
1441 {
1442 struct expr *result = 0;
1443
1444 for (;;)
1445 {
1446 rtx src;
1447 struct expr *set = lookup_set (regno, &set_hash_table);
1448
1449 while (set)
1450 {
1451 if (TEST_BIT (cprop_avout[bb], set->bitmap_index))
1452 break;
1453 set = next_set (regno, set);
1454 }
1455
1456 if (set == 0)
1457 break;
1458
1459 src = set->src;
1460 if (cprop_constant_p (src))
1461 result = set;
1462
1463 if (! REG_P (src))
1464 break;
1465
1466 regno = REGNO (src);
1467 }
1468 return result;
1469 }
1470
1471 /* Subroutine of bypass_block that checks whether a pseudo is killed by
1472 any of the instructions inserted on an edge. Jump bypassing places
1473 condition code setters on CFG edges using insert_insn_on_edge. This
1474 function is required to check that our data flow analysis is still
1475 valid prior to commit_edge_insertions. */
1476
1477 static bool
1478 reg_killed_on_edge (const_rtx reg, const_edge e)
1479 {
1480 rtx insn;
1481
1482 for (insn = e->insns.r; insn; insn = NEXT_INSN (insn))
1483 if (INSN_P (insn) && reg_set_p (reg, insn))
1484 return true;
1485
1486 return false;
1487 }
1488
1489 /* Subroutine of bypass_conditional_jumps that attempts to bypass the given
1490 basic block BB which has more than one predecessor. If not NULL, SETCC
1491 is the first instruction of BB, which is immediately followed by JUMP_INSN
1492 JUMP. Otherwise, SETCC is NULL, and JUMP is the first insn of BB.
1493 Returns nonzero if a change was made.
1494
1495 During the jump bypassing pass, we may place copies of SETCC instructions
1496 on CFG edges. The following routine must be careful to pay attention to
1497 these inserted insns when performing its transformations. */
1498
1499 static int
1500 bypass_block (basic_block bb, rtx setcc, rtx jump)
1501 {
1502 rtx insn, note;
1503 edge e, edest;
1504 int change;
1505 int may_be_loop_header;
1506 unsigned removed_p;
1507 unsigned i;
1508 edge_iterator ei;
1509
1510 insn = (setcc != NULL) ? setcc : jump;
1511
1512 /* Determine set of register uses in INSN. */
1513 reg_use_count = 0;
1514 note_uses (&PATTERN (insn), find_used_regs, NULL);
1515 note = find_reg_equal_equiv_note (insn);
1516 if (note)
1517 find_used_regs (&XEXP (note, 0), NULL);
1518
1519 may_be_loop_header = false;
1520 FOR_EACH_EDGE (e, ei, bb->preds)
1521 if (e->flags & EDGE_DFS_BACK)
1522 {
1523 may_be_loop_header = true;
1524 break;
1525 }
1526
1527 change = 0;
1528 for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
1529 {
1530 removed_p = 0;
1531
1532 if (e->flags & EDGE_COMPLEX)
1533 {
1534 ei_next (&ei);
1535 continue;
1536 }
1537
1538 /* We can't redirect edges from new basic blocks. */
1539 if (e->src->index >= bypass_last_basic_block)
1540 {
1541 ei_next (&ei);
1542 continue;
1543 }
1544
1545 /* The irreducible loops created by redirecting of edges entering the
1546 loop from outside would decrease effectiveness of some of the
1547 following optimizations, so prevent this. */
1548 if (may_be_loop_header
1549 && !(e->flags & EDGE_DFS_BACK))
1550 {
1551 ei_next (&ei);
1552 continue;
1553 }
1554
1555 for (i = 0; i < reg_use_count; i++)
1556 {
1557 rtx reg_used = reg_use_table[i];
1558 unsigned int regno = REGNO (reg_used);
1559 basic_block dest, old_dest;
1560 struct expr *set;
1561 rtx src, new_rtx;
1562
1563 set = find_bypass_set (regno, e->src->index);
1564
1565 if (! set)
1566 continue;
1567
1568 /* Check the data flow is valid after edge insertions. */
1569 if (e->insns.r && reg_killed_on_edge (reg_used, e))
1570 continue;
1571
1572 src = SET_SRC (pc_set (jump));
1573
1574 if (setcc != NULL)
1575 src = simplify_replace_rtx (src,
1576 SET_DEST (PATTERN (setcc)),
1577 SET_SRC (PATTERN (setcc)));
1578
1579 new_rtx = simplify_replace_rtx (src, reg_used, set->src);
1580
1581 /* Jump bypassing may have already placed instructions on
1582 edges of the CFG. We can't bypass an outgoing edge that
1583 has instructions associated with it, as these insns won't
1584 get executed if the incoming edge is redirected. */
1585 if (new_rtx == pc_rtx)
1586 {
1587 edest = FALLTHRU_EDGE (bb);
1588 dest = edest->insns.r ? NULL : edest->dest;
1589 }
1590 else if (GET_CODE (new_rtx) == LABEL_REF)
1591 {
1592 dest = BLOCK_FOR_INSN (XEXP (new_rtx, 0));
1593 /* Don't bypass edges containing instructions. */
1594 edest = find_edge (bb, dest);
1595 if (edest && edest->insns.r)
1596 dest = NULL;
1597 }
1598 else
1599 dest = NULL;
1600
1601 /* Avoid unification of the edge with other edges from original
1602 branch. We would end up emitting the instruction on "both"
1603 edges. */
1604 if (dest && setcc && !CC0_P (SET_DEST (PATTERN (setcc)))
1605 && find_edge (e->src, dest))
1606 dest = NULL;
1607
1608 old_dest = e->dest;
1609 if (dest != NULL
1610 && dest != old_dest
1611 && dest != EXIT_BLOCK_PTR)
1612 {
1613 if (current_loops != NULL
1614 && e->src->loop_father->latch == e->src)
1615 {
1616 /* ??? Now we are creating (or may create) a loop
1617 with multiple entries. Simply mark it for
1618 removal. Alternatively we could not do this
1619 threading. */
1620 e->src->loop_father->header = NULL;
1621 e->src->loop_father->latch = NULL;
1622 }
1623
1624 redirect_edge_and_branch_force (e, dest);
1625
1626 /* Copy the register setter to the redirected edge.
1627 Don't copy CC0 setters, as CC0 is dead after jump. */
1628 if (setcc)
1629 {
1630 rtx pat = PATTERN (setcc);
1631 if (!CC0_P (SET_DEST (pat)))
1632 insert_insn_on_edge (copy_insn (pat), e);
1633 }
1634
1635 if (dump_file != NULL)
1636 {
1637 fprintf (dump_file, "JUMP-BYPASS: Proved reg %d "
1638 "in jump_insn %d equals constant ",
1639 regno, INSN_UID (jump));
1640 print_rtl (dump_file, set->src);
1641 fprintf (dump_file, "\nBypass edge from %d->%d to %d\n",
1642 e->src->index, old_dest->index, dest->index);
1643 }
1644 change = 1;
1645 removed_p = 1;
1646 break;
1647 }
1648 }
1649 if (!removed_p)
1650 ei_next (&ei);
1651 }
1652 return change;
1653 }
1654
1655 /* Find basic blocks with more than one predecessor that only contain a
1656 single conditional jump. If the result of the comparison is known at
1657 compile-time from any incoming edge, redirect that edge to the
1658 appropriate target. Return nonzero if a change was made.
1659
1660 This function is now mis-named, because we also handle indirect jumps. */
1661
1662 static int
1663 bypass_conditional_jumps (void)
1664 {
1665 basic_block bb;
1666 int changed;
1667 rtx setcc;
1668 rtx insn;
1669 rtx dest;
1670
1671 /* Note we start at block 1. */
1672 if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
1673 return 0;
1674
1675 bypass_last_basic_block = last_basic_block;
1676 mark_dfs_back_edges ();
1677
1678 changed = 0;
1679 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb->next_bb,
1680 EXIT_BLOCK_PTR, next_bb)
1681 {
1682 /* Check for more than one predecessor. */
1683 if (!single_pred_p (bb))
1684 {
1685 setcc = NULL_RTX;
1686 FOR_BB_INSNS (bb, insn)
1687 if (DEBUG_INSN_P (insn))
1688 continue;
1689 else if (NONJUMP_INSN_P (insn))
1690 {
1691 if (setcc)
1692 break;
1693 if (GET_CODE (PATTERN (insn)) != SET)
1694 break;
1695
1696 dest = SET_DEST (PATTERN (insn));
1697 if (REG_P (dest) || CC0_P (dest))
1698 setcc = insn;
1699 else
1700 break;
1701 }
1702 else if (JUMP_P (insn))
1703 {
1704 if ((any_condjump_p (insn) || computed_jump_p (insn))
1705 && onlyjump_p (insn))
1706 changed |= bypass_block (bb, setcc, insn);
1707 break;
1708 }
1709 else if (INSN_P (insn))
1710 break;
1711 }
1712 }
1713
1714 /* If we bypassed any register setting insns, we inserted a
1715 copy on the redirected edge. These need to be committed. */
1716 if (changed)
1717 commit_edge_insertions ();
1718
1719 return changed;
1720 }
1721 \f
1722 /* Return true if the graph is too expensive to optimize. PASS is the
1723 optimization about to be performed. */
1724
1725 static bool
1726 is_too_expensive (const char *pass)
1727 {
1728 /* Trying to perform global optimizations on flow graphs which have
1729 a high connectivity will take a long time and is unlikely to be
1730 particularly useful.
1731
1732 In normal circumstances a cfg should have about twice as many
1733 edges as blocks. But we do not want to punish small functions
1734 which have a couple switch statements. Rather than simply
1735 threshold the number of blocks, uses something with a more
1736 graceful degradation. */
1737 if (n_edges > 20000 + n_basic_blocks * 4)
1738 {
1739 warning (OPT_Wdisabled_optimization,
1740 "%s: %d basic blocks and %d edges/basic block",
1741 pass, n_basic_blocks, n_edges / n_basic_blocks);
1742
1743 return true;
1744 }
1745
1746 /* If allocating memory for the cprop bitmap would take up too much
1747 storage it's better just to disable the optimization. */
1748 if ((n_basic_blocks
1749 * SBITMAP_SET_SIZE (max_reg_num ())
1750 * sizeof (SBITMAP_ELT_TYPE)) > MAX_GCSE_MEMORY)
1751 {
1752 warning (OPT_Wdisabled_optimization,
1753 "%s: %d basic blocks and %d registers",
1754 pass, n_basic_blocks, max_reg_num ());
1755
1756 return true;
1757 }
1758
1759 return false;
1760 }
1761 \f
1762 /* Main function for the CPROP pass. */
1763
1764 static int
1765 one_cprop_pass (void)
1766 {
1767 int i;
1768 int changed = 0;
1769
1770 /* Return if there's nothing to do, or it is too expensive. */
1771 if (n_basic_blocks <= NUM_FIXED_BLOCKS + 1
1772 || is_too_expensive (_ ("const/copy propagation disabled")))
1773 return 0;
1774
1775 global_const_prop_count = local_const_prop_count = 0;
1776 global_copy_prop_count = local_copy_prop_count = 0;
1777
1778 bytes_used = 0;
1779 gcc_obstack_init (&cprop_obstack);
1780
1781 /* Do a local const/copy propagation pass first. The global pass
1782 only handles global opportunities.
1783 If the local pass changes something, remove any unreachable blocks
1784 because the CPROP global dataflow analysis may get into infinite
1785 loops for CFGs with unreachable blocks.
1786
1787 FIXME: This local pass should not be necessary after CSE (but for
1788 some reason it still is). It is also (proven) not necessary
1789 to run the local pass right after FWPWOP.
1790
1791 FIXME: The global analysis would not get into infinite loops if it
1792 would use the DF solver (via df_simple_dataflow) instead of
1793 the solver implemented in this file. */
1794 changed |= local_cprop_pass ();
1795 if (changed)
1796 delete_unreachable_blocks ();
1797
1798 /* Determine implicit sets. This may change the CFG (split critical
1799 edges if that exposes an implicit set).
1800 Note that find_implicit_sets() does not rely on up-to-date DF caches
1801 so that we do not have to re-run df_analyze() even if local CPROP
1802 changed something.
1803 ??? This could run earlier so that any uncovered implicit sets
1804 sets could be exploited in local_cprop_pass() also. Later. */
1805 changed |= find_implicit_sets ();
1806
1807 /* If local_cprop_pass() or find_implicit_sets() changed something,
1808 run df_analyze() to bring all insn caches up-to-date, and to take
1809 new basic blocks from edge splitting on the DF radar.
1810 NB: This also runs the fast DCE pass, because execute_rtl_cprop
1811 sets DF_LR_RUN_DCE. */
1812 if (changed)
1813 df_analyze ();
1814
1815 /* Initialize implicit_set_indexes array. */
1816 implicit_set_indexes = XNEWVEC (int, last_basic_block);
1817 for (i = 0; i < last_basic_block; i++)
1818 implicit_set_indexes[i] = -1;
1819
1820 alloc_hash_table (&set_hash_table);
1821 compute_hash_table (&set_hash_table);
1822
1823 /* Free implicit_sets before peak usage. */
1824 free (implicit_sets);
1825 implicit_sets = NULL;
1826
1827 if (dump_file)
1828 dump_hash_table (dump_file, "SET", &set_hash_table);
1829 if (set_hash_table.n_elems > 0)
1830 {
1831 basic_block bb;
1832 rtx insn;
1833
1834 alloc_cprop_mem (last_basic_block, set_hash_table.n_elems);
1835 compute_cprop_data ();
1836
1837 free (implicit_set_indexes);
1838 implicit_set_indexes = NULL;
1839
1840 /* Allocate vars to track sets of regs. */
1841 reg_set_bitmap = ALLOC_REG_SET (NULL);
1842
1843 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb->next_bb, EXIT_BLOCK_PTR,
1844 next_bb)
1845 {
1846 /* Reset tables used to keep track of what's still valid [since
1847 the start of the block]. */
1848 reset_opr_set_tables ();
1849
1850 FOR_BB_INSNS (bb, insn)
1851 if (INSN_P (insn))
1852 {
1853 changed |= cprop_insn (insn);
1854
1855 /* Keep track of everything modified by this insn. */
1856 /* ??? Need to be careful w.r.t. mods done to INSN.
1857 Don't call mark_oprs_set if we turned the
1858 insn into a NOTE, or deleted the insn. */
1859 if (! NOTE_P (insn) && ! INSN_DELETED_P (insn))
1860 mark_oprs_set (insn);
1861 }
1862 }
1863
1864 changed |= bypass_conditional_jumps ();
1865
1866 FREE_REG_SET (reg_set_bitmap);
1867 free_cprop_mem ();
1868 }
1869 else
1870 {
1871 free (implicit_set_indexes);
1872 implicit_set_indexes = NULL;
1873 }
1874
1875 free_hash_table (&set_hash_table);
1876 obstack_free (&cprop_obstack, NULL);
1877
1878 if (dump_file)
1879 {
1880 fprintf (dump_file, "CPROP of %s, %d basic blocks, %d bytes needed, ",
1881 current_function_name (), n_basic_blocks, bytes_used);
1882 fprintf (dump_file, "%d local const props, %d local copy props, ",
1883 local_const_prop_count, local_copy_prop_count);
1884 fprintf (dump_file, "%d global const props, %d global copy props\n\n",
1885 global_const_prop_count, global_copy_prop_count);
1886 }
1887
1888 return changed;
1889 }
1890 \f
1891 /* All the passes implemented in this file. Each pass has its
1892 own gate and execute function, and at the end of the file a
1893 pass definition for passes.c.
1894
1895 We do not construct an accurate cfg in functions which call
1896 setjmp, so none of these passes runs if the function calls
1897 setjmp.
1898 FIXME: Should just handle setjmp via REG_SETJMP notes. */
1899
1900 static bool
1901 gate_rtl_cprop (void)
1902 {
1903 return optimize > 0 && flag_gcse
1904 && !cfun->calls_setjmp
1905 && dbg_cnt (cprop);
1906 }
1907
1908 static unsigned int
1909 execute_rtl_cprop (void)
1910 {
1911 int changed;
1912 delete_unreachable_blocks ();
1913 df_set_flags (DF_LR_RUN_DCE);
1914 df_analyze ();
1915 changed = one_cprop_pass ();
1916 flag_rerun_cse_after_global_opts |= changed;
1917 if (changed)
1918 cleanup_cfg (CLEANUP_CFG_CHANGED);
1919 return 0;
1920 }
1921
1922 struct rtl_opt_pass pass_rtl_cprop =
1923 {
1924 {
1925 RTL_PASS,
1926 "cprop", /* name */
1927 gate_rtl_cprop, /* gate */
1928 execute_rtl_cprop, /* execute */
1929 NULL, /* sub */
1930 NULL, /* next */
1931 0, /* static_pass_number */
1932 TV_CPROP, /* tv_id */
1933 PROP_cfglayout, /* properties_required */
1934 0, /* properties_provided */
1935 0, /* properties_destroyed */
1936 0, /* todo_flags_start */
1937 TODO_df_finish | TODO_verify_rtl_sharing |
1938 TODO_verify_flow | TODO_ggc_collect /* todo_flags_finish */
1939 }
1940 };