re PR target/37283 (Cannot build crtbegin.o for ARM)
[official-gcc.git] / gcc / gcse.c
blobee2d31e0a42df54a0c6288a95318debe8ceb55a6
1 /* Global common subexpression elimination/Partial redundancy elimination
2 and global constant/copy propagation for GNU compiler.
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4 2006, 2007, 2008 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* TODO
23 - reordering of memory allocation and freeing to be more space efficient
24 - do rough calc of how many regs are needed in each block, and a rough
25 calc of how many regs are available in each class and use that to
26 throttle back the code in cases where RTX_COST is minimal.
27 - a store to the same address as a load does not kill the load if the
28 source of the store is also the destination of the load. Handling this
29 allows more load motion, particularly out of loops.
30 - ability to realloc sbitmap vectors would allow one initial computation
31 of reg_set_in_block with only subsequent additions, rather than
32 recomputing it for each pass
36 /* References searched while implementing this.
38 Compilers Principles, Techniques and Tools
39 Aho, Sethi, Ullman
40 Addison-Wesley, 1988
42 Global Optimization by Suppression of Partial Redundancies
43 E. Morel, C. Renvoise
44 communications of the acm, Vol. 22, Num. 2, Feb. 1979
46 A Portable Machine-Independent Global Optimizer - Design and Measurements
47 Frederick Chow
48 Stanford Ph.D. thesis, Dec. 1983
50 A Fast Algorithm for Code Movement Optimization
51 D.M. Dhamdhere
52 SIGPLAN Notices, Vol. 23, Num. 10, Oct. 1988
54 A Solution to a Problem with Morel and Renvoise's
55 Global Optimization by Suppression of Partial Redundancies
56 K-H Drechsler, M.P. Stadel
57 ACM TOPLAS, Vol. 10, Num. 4, Oct. 1988
59 Practical Adaptation of the Global Optimization
60 Algorithm of Morel and Renvoise
61 D.M. Dhamdhere
62 ACM TOPLAS, Vol. 13, Num. 2. Apr. 1991
64 Efficiently Computing Static Single Assignment Form and the Control
65 Dependence Graph
66 R. Cytron, J. Ferrante, B.K. Rosen, M.N. Wegman, and F.K. Zadeck
67 ACM TOPLAS, Vol. 13, Num. 4, Oct. 1991
69 Lazy Code Motion
70 J. Knoop, O. Ruthing, B. Steffen
71 ACM SIGPLAN Notices Vol. 27, Num. 7, Jul. 1992, '92 Conference on PLDI
73 What's In a Region? Or Computing Control Dependence Regions in Near-Linear
74 Time for Reducible Flow Control
75 Thomas Ball
76 ACM Letters on Programming Languages and Systems,
77 Vol. 2, Num. 1-4, Mar-Dec 1993
79 An Efficient Representation for Sparse Sets
80 Preston Briggs, Linda Torczon
81 ACM Letters on Programming Languages and Systems,
82 Vol. 2, Num. 1-4, Mar-Dec 1993
84 A Variation of Knoop, Ruthing, and Steffen's Lazy Code Motion
85 K-H Drechsler, M.P. Stadel
86 ACM SIGPLAN Notices, Vol. 28, Num. 5, May 1993
88 Partial Dead Code Elimination
89 J. Knoop, O. Ruthing, B. Steffen
90 ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
92 Effective Partial Redundancy Elimination
93 P. Briggs, K.D. Cooper
94 ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
96 The Program Structure Tree: Computing Control Regions in Linear Time
97 R. Johnson, D. Pearson, K. Pingali
98 ACM SIGPLAN Notices, Vol. 29, Num. 6, Jun. 1994
100 Optimal Code Motion: Theory and Practice
101 J. Knoop, O. Ruthing, B. Steffen
102 ACM TOPLAS, Vol. 16, Num. 4, Jul. 1994
104 The power of assignment motion
105 J. Knoop, O. Ruthing, B. Steffen
106 ACM SIGPLAN Notices Vol. 30, Num. 6, Jun. 1995, '95 Conference on PLDI
108 Global code motion / global value numbering
109 C. Click
110 ACM SIGPLAN Notices Vol. 30, Num. 6, Jun. 1995, '95 Conference on PLDI
112 Value Driven Redundancy Elimination
113 L.T. Simpson
114 Rice University Ph.D. thesis, Apr. 1996
116 Value Numbering
117 L.T. Simpson
118 Massively Scalar Compiler Project, Rice University, Sep. 1996
120 High Performance Compilers for Parallel Computing
121 Michael Wolfe
122 Addison-Wesley, 1996
124 Advanced Compiler Design and Implementation
125 Steven Muchnick
126 Morgan Kaufmann, 1997
128 Building an Optimizing Compiler
129 Robert Morgan
130 Digital Press, 1998
132 People wishing to speed up the code here should read:
133 Elimination Algorithms for Data Flow Analysis
134 B.G. Ryder, M.C. Paull
135 ACM Computing Surveys, Vol. 18, Num. 3, Sep. 1986
137 How to Analyze Large Programs Efficiently and Informatively
138 D.M. Dhamdhere, B.K. Rosen, F.K. Zadeck
139 ACM SIGPLAN Notices Vol. 27, Num. 7, Jul. 1992, '92 Conference on PLDI
141 People wishing to do something different can find various possibilities
142 in the above papers and elsewhere.
145 #include "config.h"
146 #include "system.h"
147 #include "coretypes.h"
148 #include "tm.h"
149 #include "toplev.h"
151 #include "rtl.h"
152 #include "tree.h"
153 #include "tm_p.h"
154 #include "regs.h"
155 #include "hard-reg-set.h"
156 #include "flags.h"
157 #include "real.h"
158 #include "insn-config.h"
159 #include "recog.h"
160 #include "basic-block.h"
161 #include "output.h"
162 #include "function.h"
163 #include "expr.h"
164 #include "except.h"
165 #include "ggc.h"
166 #include "params.h"
167 #include "cselib.h"
168 #include "intl.h"
169 #include "obstack.h"
170 #include "timevar.h"
171 #include "tree-pass.h"
172 #include "hashtab.h"
173 #include "df.h"
174 #include "dbgcnt.h"
176 /* Propagate flow information through back edges and thus enable PRE's
177 moving loop invariant calculations out of loops.
179 Originally this tended to create worse overall code, but several
180 improvements during the development of PRE seem to have made following
181 back edges generally a win.
183 Note much of the loop invariant code motion done here would normally
184 be done by loop.c, which has more heuristics for when to move invariants
185 out of loops. At some point we might need to move some of those
186 heuristics into gcse.c. */
188 /* We support GCSE via Partial Redundancy Elimination. PRE optimizations
189 are a superset of those done by GCSE.
191 We perform the following steps:
193 1) Compute basic block information.
195 2) Compute table of places where registers are set.
197 3) Perform copy/constant propagation.
199 4) Perform global cse using lazy code motion if not optimizing
200 for size, or code hoisting if we are.
202 5) Perform another pass of copy/constant propagation.
204 Two passes of copy/constant propagation are done because the first one
205 enables more GCSE and the second one helps to clean up the copies that
206 GCSE creates. This is needed more for PRE than for Classic because Classic
207 GCSE will try to use an existing register containing the common
208 subexpression rather than create a new one. This is harder to do for PRE
209 because of the code motion (which Classic GCSE doesn't do).
211 Expressions we are interested in GCSE-ing are of the form
212 (set (pseudo-reg) (expression)).
213 Function want_to_gcse_p says what these are.
215 PRE handles moving invariant expressions out of loops (by treating them as
216 partially redundant).
218 Eventually it would be nice to replace cse.c/gcse.c with SSA (static single
219 assignment) based GVN (global value numbering). L. T. Simpson's paper
220 (Rice University) on value numbering is a useful reference for this.
222 **********************
224 We used to support multiple passes but there are diminishing returns in
225 doing so. The first pass usually makes 90% of the changes that are doable.
226 A second pass can make a few more changes made possible by the first pass.
227 Experiments show any further passes don't make enough changes to justify
228 the expense.
230 A study of spec92 using an unlimited number of passes:
231 [1 pass] = 1208 substitutions, [2] = 577, [3] = 202, [4] = 192, [5] = 83,
232 [6] = 34, [7] = 17, [8] = 9, [9] = 4, [10] = 4, [11] = 2,
233 [12] = 2, [13] = 1, [15] = 1, [16] = 2, [41] = 1
235 It was found doing copy propagation between each pass enables further
236 substitutions.
238 PRE is quite expensive in complicated functions because the DFA can take
239 a while to converge. Hence we only perform one pass. The parameter
240 max-gcse-passes can be modified if one wants to experiment.
242 **********************
244 The steps for PRE are:
246 1) Build the hash table of expressions we wish to GCSE (expr_hash_table).
248 2) Perform the data flow analysis for PRE.
250 3) Delete the redundant instructions
252 4) Insert the required copies [if any] that make the partially
253 redundant instructions fully redundant.
255 5) For other reaching expressions, insert an instruction to copy the value
256 to a newly created pseudo that will reach the redundant instruction.
258 The deletion is done first so that when we do insertions we
259 know which pseudo reg to use.
261 Various papers have argued that PRE DFA is expensive (O(n^2)) and others
262 argue it is not. The number of iterations for the algorithm to converge
263 is typically 2-4 so I don't view it as that expensive (relatively speaking).
265 PRE GCSE depends heavily on the second CSE pass to clean up the copies
266 we create. To make an expression reach the place where it's redundant,
267 the result of the expression is copied to a new register, and the redundant
268 expression is deleted by replacing it with this new register. Classic GCSE
269 doesn't have this problem as much as it computes the reaching defs of
270 each register in each block and thus can try to use an existing
271 register. */
273 /* GCSE global vars. */
275 /* Note whether or not we should run jump optimization after gcse. We
276 want to do this for two cases.
278 * If we changed any jumps via cprop.
280 * If we added any labels via edge splitting. */
281 static int run_jump_opt_after_gcse;
283 /* An obstack for our working variables. */
284 static struct obstack gcse_obstack;
286 struct reg_use {rtx reg_rtx; };
288 /* Hash table of expressions. */
290 struct expr
292 /* The expression (SET_SRC for expressions, PATTERN for assignments). */
293 rtx expr;
294 /* Index in the available expression bitmaps. */
295 int bitmap_index;
296 /* Next entry with the same hash. */
297 struct expr *next_same_hash;
298 /* List of anticipatable occurrences in basic blocks in the function.
299 An "anticipatable occurrence" is one that is the first occurrence in the
300 basic block, the operands are not modified in the basic block prior
301 to the occurrence and the output is not used between the start of
302 the block and the occurrence. */
303 struct occr *antic_occr;
304 /* List of available occurrence in basic blocks in the function.
305 An "available occurrence" is one that is the last occurrence in the
306 basic block and the operands are not modified by following statements in
307 the basic block [including this insn]. */
308 struct occr *avail_occr;
309 /* Non-null if the computation is PRE redundant.
310 The value is the newly created pseudo-reg to record a copy of the
311 expression in all the places that reach the redundant copy. */
312 rtx reaching_reg;
315 /* Occurrence of an expression.
316 There is one per basic block. If a pattern appears more than once the
317 last appearance is used [or first for anticipatable expressions]. */
319 struct occr
321 /* Next occurrence of this expression. */
322 struct occr *next;
323 /* The insn that computes the expression. */
324 rtx insn;
325 /* Nonzero if this [anticipatable] occurrence has been deleted. */
326 char deleted_p;
327 /* Nonzero if this [available] occurrence has been copied to
328 reaching_reg. */
329 /* ??? This is mutually exclusive with deleted_p, so they could share
330 the same byte. */
331 char copied_p;
334 /* Expression and copy propagation hash tables.
335 Each hash table is an array of buckets.
336 ??? It is known that if it were an array of entries, structure elements
337 `next_same_hash' and `bitmap_index' wouldn't be necessary. However, it is
338 not clear whether in the final analysis a sufficient amount of memory would
339 be saved as the size of the available expression bitmaps would be larger
340 [one could build a mapping table without holes afterwards though].
341 Someday I'll perform the computation and figure it out. */
343 struct hash_table
345 /* The table itself.
346 This is an array of `expr_hash_table_size' elements. */
347 struct expr **table;
349 /* Size of the hash table, in elements. */
350 unsigned int size;
352 /* Number of hash table elements. */
353 unsigned int n_elems;
355 /* Whether the table is expression of copy propagation one. */
356 int set_p;
359 /* Expression hash table. */
360 static struct hash_table expr_hash_table;
362 /* Copy propagation hash table. */
363 static struct hash_table set_hash_table;
365 /* Mapping of uids to cuids.
366 Only real insns get cuids. */
367 static int *uid_cuid;
369 /* Highest UID in UID_CUID. */
370 static int max_uid;
372 /* Get the cuid of an insn. */
373 #ifdef ENABLE_CHECKING
374 #define INSN_CUID(INSN) \
375 (gcc_assert (INSN_UID (INSN) <= max_uid), uid_cuid[INSN_UID (INSN)])
376 #else
377 #define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)])
378 #endif
380 /* Number of cuids. */
381 static int max_cuid;
383 /* Maximum register number in function prior to doing gcse + 1.
384 Registers created during this pass have regno >= max_gcse_regno.
385 This is named with "gcse" to not collide with global of same name. */
386 static unsigned int max_gcse_regno;
388 /* Table of registers that are modified.
390 For each register, each element is a list of places where the pseudo-reg
391 is set.
393 For simplicity, GCSE is done on sets of pseudo-regs only. PRE GCSE only
394 requires knowledge of which blocks kill which regs [and thus could use
395 a bitmap instead of the lists `reg_set_table' uses].
397 `reg_set_table' and could be turned into an array of bitmaps (num-bbs x
398 num-regs) [however perhaps it may be useful to keep the data as is]. One
399 advantage of recording things this way is that `reg_set_table' is fairly
400 sparse with respect to pseudo regs but for hard regs could be fairly dense
401 [relatively speaking]. And recording sets of pseudo-regs in lists speeds
402 up functions like compute_transp since in the case of pseudo-regs we only
403 need to iterate over the number of times a pseudo-reg is set, not over the
404 number of basic blocks [clearly there is a bit of a slow down in the cases
405 where a pseudo is set more than once in a block, however it is believed
406 that the net effect is to speed things up]. This isn't done for hard-regs
407 because recording call-clobbered hard-regs in `reg_set_table' at each
408 function call can consume a fair bit of memory, and iterating over
409 hard-regs stored this way in compute_transp will be more expensive. */
411 typedef struct reg_set
413 /* The next setting of this register. */
414 struct reg_set *next;
415 /* The index of the block where it was set. */
416 int bb_index;
417 } reg_set;
419 static reg_set **reg_set_table;
421 /* Size of `reg_set_table'.
422 The table starts out at max_gcse_regno + slop, and is enlarged as
423 necessary. */
424 static int reg_set_table_size;
426 /* Amount to grow `reg_set_table' by when it's full. */
427 #define REG_SET_TABLE_SLOP 100
429 /* This is a list of expressions which are MEMs and will be used by load
430 or store motion.
431 Load motion tracks MEMs which aren't killed by
432 anything except itself. (i.e., loads and stores to a single location).
433 We can then allow movement of these MEM refs with a little special
434 allowance. (all stores copy the same value to the reaching reg used
435 for the loads). This means all values used to store into memory must have
436 no side effects so we can re-issue the setter value.
437 Store Motion uses this structure as an expression table to track stores
438 which look interesting, and might be moveable towards the exit block. */
440 struct ls_expr
442 struct expr * expr; /* Gcse expression reference for LM. */
443 rtx pattern; /* Pattern of this mem. */
444 rtx pattern_regs; /* List of registers mentioned by the mem. */
445 rtx loads; /* INSN list of loads seen. */
446 rtx stores; /* INSN list of stores seen. */
447 struct ls_expr * next; /* Next in the list. */
448 int invalid; /* Invalid for some reason. */
449 int index; /* If it maps to a bitmap index. */
450 unsigned int hash_index; /* Index when in a hash table. */
451 rtx reaching_reg; /* Register to use when re-writing. */
454 /* Array of implicit set patterns indexed by basic block index. */
455 static rtx *implicit_sets;
457 /* Head of the list of load/store memory refs. */
458 static struct ls_expr * pre_ldst_mems = NULL;
460 /* Hashtable for the load/store memory refs. */
461 static htab_t pre_ldst_table = NULL;
463 /* Bitmap containing one bit for each register in the program.
464 Used when performing GCSE to track which registers have been set since
465 the start of the basic block. */
466 static regset reg_set_bitmap;
468 /* For each block, a bitmap of registers set in the block.
469 This is used by compute_transp.
470 It is computed during hash table computation and not by compute_sets
471 as it includes registers added since the last pass (or between cprop and
472 gcse) and it's currently not easy to realloc sbitmap vectors. */
473 static sbitmap *reg_set_in_block;
475 /* Array, indexed by basic block number for a list of insns which modify
476 memory within that block. */
477 static rtx * modify_mem_list;
478 static bitmap modify_mem_list_set;
480 /* This array parallels modify_mem_list, but is kept canonicalized. */
481 static rtx * canon_modify_mem_list;
483 /* Bitmap indexed by block numbers to record which blocks contain
484 function calls. */
485 static bitmap blocks_with_calls;
487 /* Various variables for statistics gathering. */
489 /* Memory used in a pass.
490 This isn't intended to be absolutely precise. Its intent is only
491 to keep an eye on memory usage. */
492 static int bytes_used;
494 /* GCSE substitutions made. */
495 static int gcse_subst_count;
496 /* Number of copy instructions created. */
497 static int gcse_create_count;
498 /* Number of local constants propagated. */
499 static int local_const_prop_count;
500 /* Number of local copies propagated. */
501 static int local_copy_prop_count;
502 /* Number of global constants propagated. */
503 static int global_const_prop_count;
504 /* Number of global copies propagated. */
505 static int global_copy_prop_count;
507 /* For available exprs */
508 static sbitmap *ae_kill, *ae_gen;
510 static void compute_can_copy (void);
511 static void *gmalloc (size_t) ATTRIBUTE_MALLOC;
512 static void *gcalloc (size_t, size_t) ATTRIBUTE_MALLOC;
513 static void *grealloc (void *, size_t);
514 static void *gcse_alloc (unsigned long);
515 static void alloc_gcse_mem (void);
516 static void free_gcse_mem (void);
517 static void alloc_reg_set_mem (int);
518 static void free_reg_set_mem (void);
519 static void record_one_set (int, rtx);
520 static void record_set_info (rtx, const_rtx, void *);
521 static void compute_sets (void);
522 static void hash_scan_insn (rtx, struct hash_table *);
523 static void hash_scan_set (rtx, rtx, struct hash_table *);
524 static void hash_scan_clobber (rtx, rtx, struct hash_table *);
525 static void hash_scan_call (rtx, rtx, struct hash_table *);
526 static int want_to_gcse_p (rtx);
527 static bool can_assign_to_reg_p (rtx);
528 static bool gcse_constant_p (const_rtx);
529 static int oprs_unchanged_p (const_rtx, const_rtx, int);
530 static int oprs_anticipatable_p (const_rtx, const_rtx);
531 static int oprs_available_p (const_rtx, const_rtx);
532 static void insert_expr_in_table (rtx, enum machine_mode, rtx, int, int,
533 struct hash_table *);
534 static void insert_set_in_table (rtx, rtx, struct hash_table *);
535 static unsigned int hash_expr (const_rtx, enum machine_mode, int *, int);
536 static unsigned int hash_set (int, int);
537 static int expr_equiv_p (const_rtx, const_rtx);
538 static void record_last_reg_set_info (rtx, int);
539 static void record_last_mem_set_info (rtx);
540 static void record_last_set_info (rtx, const_rtx, void *);
541 static void compute_hash_table (struct hash_table *);
542 static void alloc_hash_table (int, struct hash_table *, int);
543 static void free_hash_table (struct hash_table *);
544 static void compute_hash_table_work (struct hash_table *);
545 static void dump_hash_table (FILE *, const char *, struct hash_table *);
546 static struct expr *lookup_set (unsigned int, struct hash_table *);
547 static struct expr *next_set (unsigned int, struct expr *);
548 static void reset_opr_set_tables (void);
549 static int oprs_not_set_p (const_rtx, const_rtx);
550 static void mark_call (rtx);
551 static void mark_set (rtx, rtx);
552 static void mark_clobber (rtx, rtx);
553 static void mark_oprs_set (rtx);
554 static void alloc_cprop_mem (int, int);
555 static void free_cprop_mem (void);
556 static void compute_transp (const_rtx, int, sbitmap *, int);
557 static void compute_transpout (void);
558 static void compute_local_properties (sbitmap *, sbitmap *, sbitmap *,
559 struct hash_table *);
560 static void compute_cprop_data (void);
561 static void find_used_regs (rtx *, void *);
562 static int try_replace_reg (rtx, rtx, rtx);
563 static struct expr *find_avail_set (int, rtx);
564 static int cprop_jump (basic_block, rtx, rtx, rtx, rtx);
565 static void mems_conflict_for_gcse_p (rtx, const_rtx, void *);
566 static int load_killed_in_block_p (const_basic_block, int, const_rtx, int);
567 static void canon_list_insert (rtx, const_rtx, void *);
568 static int cprop_insn (rtx, int);
569 static int cprop (int);
570 static void find_implicit_sets (void);
571 static int one_cprop_pass (int, bool, bool);
572 static bool constprop_register (rtx, rtx, rtx, bool);
573 static struct expr *find_bypass_set (int, int);
574 static bool reg_killed_on_edge (const_rtx, const_edge);
575 static int bypass_block (basic_block, rtx, rtx);
576 static int bypass_conditional_jumps (void);
577 static void alloc_pre_mem (int, int);
578 static void free_pre_mem (void);
579 static void compute_pre_data (void);
580 static int pre_expr_reaches_here_p (basic_block, struct expr *,
581 basic_block);
582 static void insert_insn_end_basic_block (struct expr *, basic_block, int);
583 static void pre_insert_copy_insn (struct expr *, rtx);
584 static void pre_insert_copies (void);
585 static int pre_delete (void);
586 static int pre_gcse (void);
587 static int one_pre_gcse_pass (int);
588 static void add_label_notes (rtx, rtx);
589 static void alloc_code_hoist_mem (int, int);
590 static void free_code_hoist_mem (void);
591 static void compute_code_hoist_vbeinout (void);
592 static void compute_code_hoist_data (void);
593 static int hoist_expr_reaches_here_p (basic_block, int, basic_block, char *);
594 static void hoist_code (void);
595 static int one_code_hoisting_pass (void);
596 static rtx process_insert_insn (struct expr *);
597 static int pre_edge_insert (struct edge_list *, struct expr **);
598 static int pre_expr_reaches_here_p_work (basic_block, struct expr *,
599 basic_block, char *);
600 static struct ls_expr * ldst_entry (rtx);
601 static void free_ldst_entry (struct ls_expr *);
602 static void free_ldst_mems (void);
603 static void print_ldst_list (FILE *);
604 static struct ls_expr * find_rtx_in_ldst (rtx);
605 static int enumerate_ldsts (void);
606 static inline struct ls_expr * first_ls_expr (void);
607 static inline struct ls_expr * next_ls_expr (struct ls_expr *);
608 static int simple_mem (const_rtx);
609 static void invalidate_any_buried_refs (rtx);
610 static void compute_ld_motion_mems (void);
611 static void trim_ld_motion_mems (void);
612 static void update_ld_motion_stores (struct expr *);
613 static void reg_set_info (rtx, const_rtx, void *);
614 static void reg_clear_last_set (rtx, const_rtx, void *);
615 static bool store_ops_ok (const_rtx, int *);
616 static rtx extract_mentioned_regs (rtx);
617 static rtx extract_mentioned_regs_helper (rtx, rtx);
618 static void find_moveable_store (rtx, int *, int *);
619 static int compute_store_table (void);
620 static bool load_kills_store (const_rtx, const_rtx, int);
621 static bool find_loads (const_rtx, const_rtx, int);
622 static bool store_killed_in_insn (const_rtx, const_rtx, const_rtx, int);
623 static bool store_killed_after (const_rtx, const_rtx, const_rtx, const_basic_block, int *, rtx *);
624 static bool store_killed_before (const_rtx, const_rtx, const_rtx, const_basic_block, int *);
625 static void build_store_vectors (void);
626 static void insert_insn_start_basic_block (rtx, basic_block);
627 static int insert_store (struct ls_expr *, edge);
628 static void remove_reachable_equiv_notes (basic_block, struct ls_expr *);
629 static void replace_store_insn (rtx, rtx, basic_block, struct ls_expr *);
630 static void delete_store (struct ls_expr *, basic_block);
631 static void free_store_memory (void);
632 static void store_motion (void);
633 static void free_insn_expr_list_list (rtx *);
634 static void clear_modify_mem_tables (void);
635 static void free_modify_mem_tables (void);
636 static rtx gcse_emit_move_after (rtx, rtx, rtx);
637 static void local_cprop_find_used_regs (rtx *, void *);
638 static bool do_local_cprop (rtx, rtx, bool);
639 static void local_cprop_pass (bool);
640 static bool is_too_expensive (const char *);
642 #define GNEW(T) ((T *) gmalloc (sizeof (T)))
643 #define GCNEW(T) ((T *) gcalloc (1, sizeof (T)))
645 #define GNEWVEC(T, N) ((T *) gmalloc (sizeof (T) * (N)))
646 #define GCNEWVEC(T, N) ((T *) gcalloc ((N), sizeof (T)))
647 #define GRESIZEVEC(T, P, N) ((T *) grealloc ((void *) (P), sizeof (T) * (N)))
649 #define GNEWVAR(T, S) ((T *) gmalloc ((S)))
650 #define GCNEWVAR(T, S) ((T *) gcalloc (1, (S)))
651 #define GRESIZEVAR(T, P, S) ((T *) grealloc ((P), (S)))
653 #define GOBNEW(T) ((T *) gcse_alloc (sizeof (T)))
654 #define GOBNEWVAR(T, S) ((T *) gcse_alloc ((S)))
657 /* Entry point for global common subexpression elimination.
658 F is the first instruction in the function. Return nonzero if a
659 change is mode. */
661 static int
662 gcse_main (rtx f ATTRIBUTE_UNUSED)
664 int changed, pass;
665 /* Bytes used at start of pass. */
666 int initial_bytes_used;
667 /* Maximum number of bytes used by a pass. */
668 int max_pass_bytes;
669 /* Point to release obstack data from for each pass. */
670 char *gcse_obstack_bottom;
672 /* We do not construct an accurate cfg in functions which call
673 setjmp, so just punt to be safe. */
674 if (cfun->calls_setjmp)
675 return 0;
677 /* Assume that we do not need to run jump optimizations after gcse. */
678 run_jump_opt_after_gcse = 0;
680 /* Identify the basic block information for this function, including
681 successors and predecessors. */
682 max_gcse_regno = max_reg_num ();
684 df_note_add_problem ();
685 df_analyze ();
687 if (dump_file)
688 dump_flow_info (dump_file, dump_flags);
690 /* Return if there's nothing to do, or it is too expensive. */
691 if (n_basic_blocks <= NUM_FIXED_BLOCKS + 1
692 || is_too_expensive (_("GCSE disabled")))
693 return 0;
695 gcc_obstack_init (&gcse_obstack);
696 bytes_used = 0;
698 /* We need alias. */
699 init_alias_analysis ();
700 /* Record where pseudo-registers are set. This data is kept accurate
701 during each pass. ??? We could also record hard-reg information here
702 [since it's unchanging], however it is currently done during hash table
703 computation.
705 It may be tempting to compute MEM set information here too, but MEM sets
706 will be subject to code motion one day and thus we need to compute
707 information about memory sets when we build the hash tables. */
709 alloc_reg_set_mem (max_gcse_regno);
710 compute_sets ();
712 pass = 0;
713 initial_bytes_used = bytes_used;
714 max_pass_bytes = 0;
715 gcse_obstack_bottom = GOBNEWVAR (char, 1);
716 changed = 1;
717 while (changed && pass < MAX_GCSE_PASSES)
719 changed = 0;
720 if (dump_file)
721 fprintf (dump_file, "GCSE pass %d\n\n", pass + 1);
723 /* Initialize bytes_used to the space for the pred/succ lists,
724 and the reg_set_table data. */
725 bytes_used = initial_bytes_used;
727 /* Each pass may create new registers, so recalculate each time. */
728 max_gcse_regno = max_reg_num ();
730 alloc_gcse_mem ();
732 /* Don't allow constant propagation to modify jumps
733 during this pass. */
734 if (dbg_cnt (cprop1))
736 timevar_push (TV_CPROP1);
737 changed = one_cprop_pass (pass + 1, false, false);
738 timevar_pop (TV_CPROP1);
741 if (optimize_function_for_speed_p (cfun))
743 timevar_push (TV_PRE);
744 changed |= one_pre_gcse_pass (pass + 1);
745 /* We may have just created new basic blocks. Release and
746 recompute various things which are sized on the number of
747 basic blocks. */
748 if (changed)
750 free_modify_mem_tables ();
751 modify_mem_list = GCNEWVEC (rtx, last_basic_block);
752 canon_modify_mem_list = GCNEWVEC (rtx, last_basic_block);
754 free_reg_set_mem ();
755 alloc_reg_set_mem (max_reg_num ());
756 compute_sets ();
757 run_jump_opt_after_gcse = 1;
758 timevar_pop (TV_PRE);
761 if (max_pass_bytes < bytes_used)
762 max_pass_bytes = bytes_used;
764 /* Free up memory, then reallocate for code hoisting. We can
765 not re-use the existing allocated memory because the tables
766 will not have info for the insns or registers created by
767 partial redundancy elimination. */
768 free_gcse_mem ();
770 /* It does not make sense to run code hoisting unless we are optimizing
771 for code size -- it rarely makes programs faster, and can make
772 them bigger if we did partial redundancy elimination (when optimizing
773 for space, we don't run the partial redundancy algorithms). */
774 if (optimize_function_for_size_p (cfun))
776 timevar_push (TV_HOIST);
777 max_gcse_regno = max_reg_num ();
778 alloc_gcse_mem ();
779 changed |= one_code_hoisting_pass ();
780 free_gcse_mem ();
782 if (max_pass_bytes < bytes_used)
783 max_pass_bytes = bytes_used;
784 timevar_pop (TV_HOIST);
787 if (dump_file)
789 fprintf (dump_file, "\n");
790 fflush (dump_file);
793 obstack_free (&gcse_obstack, gcse_obstack_bottom);
794 pass++;
797 /* Do one last pass of copy propagation, including cprop into
798 conditional jumps. */
800 if (dbg_cnt (cprop2))
802 max_gcse_regno = max_reg_num ();
803 alloc_gcse_mem ();
805 /* This time, go ahead and allow cprop to alter jumps. */
806 timevar_push (TV_CPROP2);
807 one_cprop_pass (pass + 1, true, true);
808 timevar_pop (TV_CPROP2);
809 free_gcse_mem ();
812 if (dump_file)
814 fprintf (dump_file, "GCSE of %s: %d basic blocks, ",
815 current_function_name (), n_basic_blocks);
816 fprintf (dump_file, "%d pass%s, %d bytes\n\n",
817 pass, pass > 1 ? "es" : "", max_pass_bytes);
820 obstack_free (&gcse_obstack, NULL);
821 free_reg_set_mem ();
823 /* We are finished with alias. */
824 end_alias_analysis ();
826 if (optimize_function_for_speed_p (cfun) && flag_gcse_sm)
828 timevar_push (TV_LSM);
829 store_motion ();
830 timevar_pop (TV_LSM);
833 /* Record where pseudo-registers are set. */
834 return run_jump_opt_after_gcse;
837 /* Misc. utilities. */
839 /* Nonzero for each mode that supports (set (reg) (reg)).
840 This is trivially true for integer and floating point values.
841 It may or may not be true for condition codes. */
842 static char can_copy[(int) NUM_MACHINE_MODES];
844 /* Compute which modes support reg/reg copy operations. */
846 static void
847 compute_can_copy (void)
849 int i;
850 #ifndef AVOID_CCMODE_COPIES
851 rtx reg, insn;
852 #endif
853 memset (can_copy, 0, NUM_MACHINE_MODES);
855 start_sequence ();
856 for (i = 0; i < NUM_MACHINE_MODES; i++)
857 if (GET_MODE_CLASS (i) == MODE_CC)
859 #ifdef AVOID_CCMODE_COPIES
860 can_copy[i] = 0;
861 #else
862 reg = gen_rtx_REG ((enum machine_mode) i, LAST_VIRTUAL_REGISTER + 1);
863 insn = emit_insn (gen_rtx_SET (VOIDmode, reg, reg));
864 if (recog (PATTERN (insn), insn, NULL) >= 0)
865 can_copy[i] = 1;
866 #endif
868 else
869 can_copy[i] = 1;
871 end_sequence ();
874 /* Returns whether the mode supports reg/reg copy operations. */
876 bool
877 can_copy_p (enum machine_mode mode)
879 static bool can_copy_init_p = false;
881 if (! can_copy_init_p)
883 compute_can_copy ();
884 can_copy_init_p = true;
887 return can_copy[mode] != 0;
890 /* Cover function to xmalloc to record bytes allocated. */
892 static void *
893 gmalloc (size_t size)
895 bytes_used += size;
896 return xmalloc (size);
899 /* Cover function to xcalloc to record bytes allocated. */
901 static void *
902 gcalloc (size_t nelem, size_t elsize)
904 bytes_used += nelem * elsize;
905 return xcalloc (nelem, elsize);
908 /* Cover function to xrealloc.
909 We don't record the additional size since we don't know it.
910 It won't affect memory usage stats much anyway. */
912 static void *
913 grealloc (void *ptr, size_t size)
915 return xrealloc (ptr, size);
918 /* Cover function to obstack_alloc. */
920 static void *
921 gcse_alloc (unsigned long size)
923 bytes_used += size;
924 return obstack_alloc (&gcse_obstack, size);
927 /* Allocate memory for the cuid mapping array,
928 and reg/memory set tracking tables.
930 This is called at the start of each pass. */
932 static void
933 alloc_gcse_mem (void)
935 int i;
936 basic_block bb;
937 rtx insn;
939 /* Find the largest UID and create a mapping from UIDs to CUIDs.
940 CUIDs are like UIDs except they increase monotonically, have no gaps,
941 and only apply to real insns.
942 (Actually, there are gaps, for insn that are not inside a basic block.
943 but we should never see those anyway, so this is OK.) */
945 max_uid = get_max_uid ();
946 uid_cuid = GCNEWVEC (int, max_uid + 1);
947 i = 0;
948 FOR_EACH_BB (bb)
949 FOR_BB_INSNS (bb, insn)
951 if (INSN_P (insn))
952 uid_cuid[INSN_UID (insn)] = i++;
953 else
954 uid_cuid[INSN_UID (insn)] = i;
957 max_cuid = i;
959 /* Allocate vars to track sets of regs. */
960 reg_set_bitmap = BITMAP_ALLOC (NULL);
962 /* Allocate vars to track sets of regs, memory per block. */
963 reg_set_in_block = sbitmap_vector_alloc (last_basic_block, max_gcse_regno);
964 /* Allocate array to keep a list of insns which modify memory in each
965 basic block. */
966 modify_mem_list = GCNEWVEC (rtx, last_basic_block);
967 canon_modify_mem_list = GCNEWVEC (rtx, last_basic_block);
968 modify_mem_list_set = BITMAP_ALLOC (NULL);
969 blocks_with_calls = BITMAP_ALLOC (NULL);
972 /* Free memory allocated by alloc_gcse_mem. */
974 static void
975 free_gcse_mem (void)
977 free (uid_cuid);
979 BITMAP_FREE (reg_set_bitmap);
981 sbitmap_vector_free (reg_set_in_block);
982 free_modify_mem_tables ();
983 BITMAP_FREE (modify_mem_list_set);
984 BITMAP_FREE (blocks_with_calls);
987 /* Compute the local properties of each recorded expression.
989 Local properties are those that are defined by the block, irrespective of
990 other blocks.
992 An expression is transparent in a block if its operands are not modified
993 in the block.
995 An expression is computed (locally available) in a block if it is computed
996 at least once and expression would contain the same value if the
997 computation was moved to the end of the block.
999 An expression is locally anticipatable in a block if it is computed at
1000 least once and expression would contain the same value if the computation
1001 was moved to the beginning of the block.
1003 We call this routine for cprop, pre and code hoisting. They all compute
1004 basically the same information and thus can easily share this code.
1006 TRANSP, COMP, and ANTLOC are destination sbitmaps for recording local
1007 properties. If NULL, then it is not necessary to compute or record that
1008 particular property.
1010 TABLE controls which hash table to look at. If it is set hash table,
1011 additionally, TRANSP is computed as ~TRANSP, since this is really cprop's
1012 ABSALTERED. */
1014 static void
1015 compute_local_properties (sbitmap *transp, sbitmap *comp, sbitmap *antloc,
1016 struct hash_table *table)
1018 unsigned int i;
1020 /* Initialize any bitmaps that were passed in. */
1021 if (transp)
1023 if (table->set_p)
1024 sbitmap_vector_zero (transp, last_basic_block);
1025 else
1026 sbitmap_vector_ones (transp, last_basic_block);
1029 if (comp)
1030 sbitmap_vector_zero (comp, last_basic_block);
1031 if (antloc)
1032 sbitmap_vector_zero (antloc, last_basic_block);
1034 for (i = 0; i < table->size; i++)
1036 struct expr *expr;
1038 for (expr = table->table[i]; expr != NULL; expr = expr->next_same_hash)
1040 int indx = expr->bitmap_index;
1041 struct occr *occr;
1043 /* The expression is transparent in this block if it is not killed.
1044 We start by assuming all are transparent [none are killed], and
1045 then reset the bits for those that are. */
1046 if (transp)
1047 compute_transp (expr->expr, indx, transp, table->set_p);
1049 /* The occurrences recorded in antic_occr are exactly those that
1050 we want to set to nonzero in ANTLOC. */
1051 if (antloc)
1052 for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
1054 SET_BIT (antloc[BLOCK_NUM (occr->insn)], indx);
1056 /* While we're scanning the table, this is a good place to
1057 initialize this. */
1058 occr->deleted_p = 0;
1061 /* The occurrences recorded in avail_occr are exactly those that
1062 we want to set to nonzero in COMP. */
1063 if (comp)
1064 for (occr = expr->avail_occr; occr != NULL; occr = occr->next)
1066 SET_BIT (comp[BLOCK_NUM (occr->insn)], indx);
1068 /* While we're scanning the table, this is a good place to
1069 initialize this. */
1070 occr->copied_p = 0;
1073 /* While we're scanning the table, this is a good place to
1074 initialize this. */
1075 expr->reaching_reg = 0;
1080 /* Register set information.
1082 `reg_set_table' records where each register is set or otherwise
1083 modified. */
1085 static struct obstack reg_set_obstack;
1087 static void
1088 alloc_reg_set_mem (int n_regs)
1090 reg_set_table_size = n_regs + REG_SET_TABLE_SLOP;
1091 reg_set_table = GCNEWVEC (struct reg_set *, reg_set_table_size);
1093 gcc_obstack_init (&reg_set_obstack);
1096 static void
1097 free_reg_set_mem (void)
1099 free (reg_set_table);
1100 obstack_free (&reg_set_obstack, NULL);
1103 /* Record REGNO in the reg_set table. */
1105 static void
1106 record_one_set (int regno, rtx insn)
1108 /* Allocate a new reg_set element and link it onto the list. */
1109 struct reg_set *new_reg_info;
1111 /* If the table isn't big enough, enlarge it. */
1112 if (regno >= reg_set_table_size)
1114 int new_size = regno + REG_SET_TABLE_SLOP;
1116 reg_set_table = GRESIZEVEC (struct reg_set *, reg_set_table, new_size);
1117 memset (reg_set_table + reg_set_table_size, 0,
1118 (new_size - reg_set_table_size) * sizeof (struct reg_set *));
1119 reg_set_table_size = new_size;
1122 new_reg_info = XOBNEW (&reg_set_obstack, struct reg_set);
1123 bytes_used += sizeof (struct reg_set);
1124 new_reg_info->bb_index = BLOCK_NUM (insn);
1125 new_reg_info->next = reg_set_table[regno];
1126 reg_set_table[regno] = new_reg_info;
1129 /* Called from compute_sets via note_stores to handle one SET or CLOBBER in
1130 an insn. The DATA is really the instruction in which the SET is
1131 occurring. */
1133 static void
1134 record_set_info (rtx dest, const_rtx setter ATTRIBUTE_UNUSED, void *data)
1136 rtx record_set_insn = (rtx) data;
1138 if (REG_P (dest) && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
1139 record_one_set (REGNO (dest), record_set_insn);
1142 /* Scan the function and record each set of each pseudo-register.
1144 This is called once, at the start of the gcse pass. See the comments for
1145 `reg_set_table' for further documentation. */
1147 static void
1148 compute_sets (void)
1150 basic_block bb;
1151 rtx insn;
1153 FOR_EACH_BB (bb)
1154 FOR_BB_INSNS (bb, insn)
1155 if (INSN_P (insn))
1156 note_stores (PATTERN (insn), record_set_info, insn);
1159 /* Hash table support. */
1161 struct reg_avail_info
1163 basic_block last_bb;
1164 int first_set;
1165 int last_set;
1168 static struct reg_avail_info *reg_avail_info;
1169 static basic_block current_bb;
1172 /* See whether X, the source of a set, is something we want to consider for
1173 GCSE. */
1175 static int
1176 want_to_gcse_p (rtx x)
1178 #ifdef STACK_REGS
1179 /* On register stack architectures, don't GCSE constants from the
1180 constant pool, as the benefits are often swamped by the overhead
1181 of shuffling the register stack between basic blocks. */
1182 if (IS_STACK_MODE (GET_MODE (x)))
1183 x = avoid_constant_pool_reference (x);
1184 #endif
1186 switch (GET_CODE (x))
1188 case REG:
1189 case SUBREG:
1190 case CONST_INT:
1191 case CONST_DOUBLE:
1192 case CONST_FIXED:
1193 case CONST_VECTOR:
1194 case CALL:
1195 return 0;
1197 default:
1198 return can_assign_to_reg_p (x);
1202 /* Used internally by can_assign_to_reg_p. */
1204 static GTY(()) rtx test_insn;
1206 /* Return true if we can assign X to a pseudo register. */
1208 static bool
1209 can_assign_to_reg_p (rtx x)
1211 int num_clobbers = 0;
1212 int icode;
1214 /* If this is a valid operand, we are OK. If it's VOIDmode, we aren't. */
1215 if (general_operand (x, GET_MODE (x)))
1216 return 1;
1217 else if (GET_MODE (x) == VOIDmode)
1218 return 0;
1220 /* Otherwise, check if we can make a valid insn from it. First initialize
1221 our test insn if we haven't already. */
1222 if (test_insn == 0)
1224 test_insn
1225 = make_insn_raw (gen_rtx_SET (VOIDmode,
1226 gen_rtx_REG (word_mode,
1227 FIRST_PSEUDO_REGISTER * 2),
1228 const0_rtx));
1229 NEXT_INSN (test_insn) = PREV_INSN (test_insn) = 0;
1232 /* Now make an insn like the one we would make when GCSE'ing and see if
1233 valid. */
1234 PUT_MODE (SET_DEST (PATTERN (test_insn)), GET_MODE (x));
1235 SET_SRC (PATTERN (test_insn)) = x;
1236 return ((icode = recog (PATTERN (test_insn), test_insn, &num_clobbers)) >= 0
1237 && (num_clobbers == 0 || ! added_clobbers_hard_reg_p (icode)));
1240 /* Return nonzero if the operands of expression X are unchanged from the
1241 start of INSN's basic block up to but not including INSN (if AVAIL_P == 0),
1242 or from INSN to the end of INSN's basic block (if AVAIL_P != 0). */
1244 static int
1245 oprs_unchanged_p (const_rtx x, const_rtx insn, int avail_p)
1247 int i, j;
1248 enum rtx_code code;
1249 const char *fmt;
1251 if (x == 0)
1252 return 1;
1254 code = GET_CODE (x);
1255 switch (code)
1257 case REG:
1259 struct reg_avail_info *info = &reg_avail_info[REGNO (x)];
1261 if (info->last_bb != current_bb)
1262 return 1;
1263 if (avail_p)
1264 return info->last_set < INSN_CUID (insn);
1265 else
1266 return info->first_set >= INSN_CUID (insn);
1269 case MEM:
1270 if (load_killed_in_block_p (current_bb, INSN_CUID (insn),
1271 x, avail_p))
1272 return 0;
1273 else
1274 return oprs_unchanged_p (XEXP (x, 0), insn, avail_p);
1276 case PRE_DEC:
1277 case PRE_INC:
1278 case POST_DEC:
1279 case POST_INC:
1280 case PRE_MODIFY:
1281 case POST_MODIFY:
1282 return 0;
1284 case PC:
1285 case CC0: /*FIXME*/
1286 case CONST:
1287 case CONST_INT:
1288 case CONST_DOUBLE:
1289 case CONST_FIXED:
1290 case CONST_VECTOR:
1291 case SYMBOL_REF:
1292 case LABEL_REF:
1293 case ADDR_VEC:
1294 case ADDR_DIFF_VEC:
1295 return 1;
1297 default:
1298 break;
1301 for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
1303 if (fmt[i] == 'e')
1305 /* If we are about to do the last recursive call needed at this
1306 level, change it into iteration. This function is called enough
1307 to be worth it. */
1308 if (i == 0)
1309 return oprs_unchanged_p (XEXP (x, i), insn, avail_p);
1311 else if (! oprs_unchanged_p (XEXP (x, i), insn, avail_p))
1312 return 0;
1314 else if (fmt[i] == 'E')
1315 for (j = 0; j < XVECLEN (x, i); j++)
1316 if (! oprs_unchanged_p (XVECEXP (x, i, j), insn, avail_p))
1317 return 0;
1320 return 1;
1323 /* Used for communication between mems_conflict_for_gcse_p and
1324 load_killed_in_block_p. Nonzero if mems_conflict_for_gcse_p finds a
1325 conflict between two memory references. */
1326 static int gcse_mems_conflict_p;
1328 /* Used for communication between mems_conflict_for_gcse_p and
1329 load_killed_in_block_p. A memory reference for a load instruction,
1330 mems_conflict_for_gcse_p will see if a memory store conflicts with
1331 this memory load. */
1332 static const_rtx gcse_mem_operand;
1334 /* DEST is the output of an instruction. If it is a memory reference, and
1335 possibly conflicts with the load found in gcse_mem_operand, then set
1336 gcse_mems_conflict_p to a nonzero value. */
1338 static void
1339 mems_conflict_for_gcse_p (rtx dest, const_rtx setter ATTRIBUTE_UNUSED,
1340 void *data ATTRIBUTE_UNUSED)
1342 while (GET_CODE (dest) == SUBREG
1343 || GET_CODE (dest) == ZERO_EXTRACT
1344 || GET_CODE (dest) == STRICT_LOW_PART)
1345 dest = XEXP (dest, 0);
1347 /* If DEST is not a MEM, then it will not conflict with the load. Note
1348 that function calls are assumed to clobber memory, but are handled
1349 elsewhere. */
1350 if (! MEM_P (dest))
1351 return;
1353 /* If we are setting a MEM in our list of specially recognized MEMs,
1354 don't mark as killed this time. */
1356 if (expr_equiv_p (dest, gcse_mem_operand) && pre_ldst_mems != NULL)
1358 if (!find_rtx_in_ldst (dest))
1359 gcse_mems_conflict_p = 1;
1360 return;
1363 if (true_dependence (dest, GET_MODE (dest), gcse_mem_operand,
1364 rtx_addr_varies_p))
1365 gcse_mems_conflict_p = 1;
1368 /* Return nonzero if the expression in X (a memory reference) is killed
1369 in block BB before or after the insn with the CUID in UID_LIMIT.
1370 AVAIL_P is nonzero for kills after UID_LIMIT, and zero for kills
1371 before UID_LIMIT.
1373 To check the entire block, set UID_LIMIT to max_uid + 1 and
1374 AVAIL_P to 0. */
1376 static int
1377 load_killed_in_block_p (const_basic_block bb, int uid_limit, const_rtx x, int avail_p)
1379 rtx list_entry = modify_mem_list[bb->index];
1381 /* If this is a readonly then we aren't going to be changing it. */
1382 if (MEM_READONLY_P (x))
1383 return 0;
1385 while (list_entry)
1387 rtx setter;
1388 /* Ignore entries in the list that do not apply. */
1389 if ((avail_p
1390 && INSN_CUID (XEXP (list_entry, 0)) < uid_limit)
1391 || (! avail_p
1392 && INSN_CUID (XEXP (list_entry, 0)) > uid_limit))
1394 list_entry = XEXP (list_entry, 1);
1395 continue;
1398 setter = XEXP (list_entry, 0);
1400 /* If SETTER is a call everything is clobbered. Note that calls
1401 to pure functions are never put on the list, so we need not
1402 worry about them. */
1403 if (CALL_P (setter))
1404 return 1;
1406 /* SETTER must be an INSN of some kind that sets memory. Call
1407 note_stores to examine each hunk of memory that is modified.
1409 The note_stores interface is pretty limited, so we have to
1410 communicate via global variables. Yuk. */
1411 gcse_mem_operand = x;
1412 gcse_mems_conflict_p = 0;
1413 note_stores (PATTERN (setter), mems_conflict_for_gcse_p, NULL);
1414 if (gcse_mems_conflict_p)
1415 return 1;
1416 list_entry = XEXP (list_entry, 1);
1418 return 0;
1421 /* Return nonzero if the operands of expression X are unchanged from
1422 the start of INSN's basic block up to but not including INSN. */
1424 static int
1425 oprs_anticipatable_p (const_rtx x, const_rtx insn)
1427 return oprs_unchanged_p (x, insn, 0);
1430 /* Return nonzero if the operands of expression X are unchanged from
1431 INSN to the end of INSN's basic block. */
1433 static int
1434 oprs_available_p (const_rtx x, const_rtx insn)
1436 return oprs_unchanged_p (x, insn, 1);
1439 /* Hash expression X.
1441 MODE is only used if X is a CONST_INT. DO_NOT_RECORD_P is a boolean
1442 indicating if a volatile operand is found or if the expression contains
1443 something we don't want to insert in the table. HASH_TABLE_SIZE is
1444 the current size of the hash table to be probed. */
1446 static unsigned int
1447 hash_expr (const_rtx x, enum machine_mode mode, int *do_not_record_p,
1448 int hash_table_size)
1450 unsigned int hash;
1452 *do_not_record_p = 0;
1454 hash = hash_rtx (x, mode, do_not_record_p,
1455 NULL, /*have_reg_qty=*/false);
1456 return hash % hash_table_size;
1459 /* Hash a set of register REGNO.
1461 Sets are hashed on the register that is set. This simplifies the PRE copy
1462 propagation code.
1464 ??? May need to make things more elaborate. Later, as necessary. */
1466 static unsigned int
1467 hash_set (int regno, int hash_table_size)
1469 unsigned int hash;
1471 hash = regno;
1472 return hash % hash_table_size;
1475 /* Return nonzero if exp1 is equivalent to exp2. */
1477 static int
1478 expr_equiv_p (const_rtx x, const_rtx y)
1480 return exp_equiv_p (x, y, 0, true);
1483 /* Insert expression X in INSN in the hash TABLE.
1484 If it is already present, record it as the last occurrence in INSN's
1485 basic block.
1487 MODE is the mode of the value X is being stored into.
1488 It is only used if X is a CONST_INT.
1490 ANTIC_P is nonzero if X is an anticipatable expression.
1491 AVAIL_P is nonzero if X is an available expression. */
1493 static void
1494 insert_expr_in_table (rtx x, enum machine_mode mode, rtx insn, int antic_p,
1495 int avail_p, struct hash_table *table)
1497 int found, do_not_record_p;
1498 unsigned int hash;
1499 struct expr *cur_expr, *last_expr = NULL;
1500 struct occr *antic_occr, *avail_occr;
1502 hash = hash_expr (x, mode, &do_not_record_p, table->size);
1504 /* Do not insert expression in table if it contains volatile operands,
1505 or if hash_expr determines the expression is something we don't want
1506 to or can't handle. */
1507 if (do_not_record_p)
1508 return;
1510 cur_expr = table->table[hash];
1511 found = 0;
1513 while (cur_expr && 0 == (found = expr_equiv_p (cur_expr->expr, x)))
1515 /* If the expression isn't found, save a pointer to the end of
1516 the list. */
1517 last_expr = cur_expr;
1518 cur_expr = cur_expr->next_same_hash;
1521 if (! found)
1523 cur_expr = GOBNEW (struct expr);
1524 bytes_used += sizeof (struct expr);
1525 if (table->table[hash] == NULL)
1526 /* This is the first pattern that hashed to this index. */
1527 table->table[hash] = cur_expr;
1528 else
1529 /* Add EXPR to end of this hash chain. */
1530 last_expr->next_same_hash = cur_expr;
1532 /* Set the fields of the expr element. */
1533 cur_expr->expr = x;
1534 cur_expr->bitmap_index = table->n_elems++;
1535 cur_expr->next_same_hash = NULL;
1536 cur_expr->antic_occr = NULL;
1537 cur_expr->avail_occr = NULL;
1540 /* Now record the occurrence(s). */
1541 if (antic_p)
1543 antic_occr = cur_expr->antic_occr;
1545 if (antic_occr && BLOCK_NUM (antic_occr->insn) != BLOCK_NUM (insn))
1546 antic_occr = NULL;
1548 if (antic_occr)
1549 /* Found another instance of the expression in the same basic block.
1550 Prefer the currently recorded one. We want the first one in the
1551 block and the block is scanned from start to end. */
1552 ; /* nothing to do */
1553 else
1555 /* First occurrence of this expression in this basic block. */
1556 antic_occr = GOBNEW (struct occr);
1557 bytes_used += sizeof (struct occr);
1558 antic_occr->insn = insn;
1559 antic_occr->next = cur_expr->antic_occr;
1560 antic_occr->deleted_p = 0;
1561 cur_expr->antic_occr = antic_occr;
1565 if (avail_p)
1567 avail_occr = cur_expr->avail_occr;
1569 if (avail_occr && BLOCK_NUM (avail_occr->insn) == BLOCK_NUM (insn))
1571 /* Found another instance of the expression in the same basic block.
1572 Prefer this occurrence to the currently recorded one. We want
1573 the last one in the block and the block is scanned from start
1574 to end. */
1575 avail_occr->insn = insn;
1577 else
1579 /* First occurrence of this expression in this basic block. */
1580 avail_occr = GOBNEW (struct occr);
1581 bytes_used += sizeof (struct occr);
1582 avail_occr->insn = insn;
1583 avail_occr->next = cur_expr->avail_occr;
1584 avail_occr->deleted_p = 0;
1585 cur_expr->avail_occr = avail_occr;
1590 /* Insert pattern X in INSN in the hash table.
1591 X is a SET of a reg to either another reg or a constant.
1592 If it is already present, record it as the last occurrence in INSN's
1593 basic block. */
1595 static void
1596 insert_set_in_table (rtx x, rtx insn, struct hash_table *table)
1598 int found;
1599 unsigned int hash;
1600 struct expr *cur_expr, *last_expr = NULL;
1601 struct occr *cur_occr;
1603 gcc_assert (GET_CODE (x) == SET && REG_P (SET_DEST (x)));
1605 hash = hash_set (REGNO (SET_DEST (x)), table->size);
1607 cur_expr = table->table[hash];
1608 found = 0;
1610 while (cur_expr && 0 == (found = expr_equiv_p (cur_expr->expr, x)))
1612 /* If the expression isn't found, save a pointer to the end of
1613 the list. */
1614 last_expr = cur_expr;
1615 cur_expr = cur_expr->next_same_hash;
1618 if (! found)
1620 cur_expr = GOBNEW (struct expr);
1621 bytes_used += sizeof (struct expr);
1622 if (table->table[hash] == NULL)
1623 /* This is the first pattern that hashed to this index. */
1624 table->table[hash] = cur_expr;
1625 else
1626 /* Add EXPR to end of this hash chain. */
1627 last_expr->next_same_hash = cur_expr;
1629 /* Set the fields of the expr element.
1630 We must copy X because it can be modified when copy propagation is
1631 performed on its operands. */
1632 cur_expr->expr = copy_rtx (x);
1633 cur_expr->bitmap_index = table->n_elems++;
1634 cur_expr->next_same_hash = NULL;
1635 cur_expr->antic_occr = NULL;
1636 cur_expr->avail_occr = NULL;
1639 /* Now record the occurrence. */
1640 cur_occr = cur_expr->avail_occr;
1642 if (cur_occr && BLOCK_NUM (cur_occr->insn) == BLOCK_NUM (insn))
1644 /* Found another instance of the expression in the same basic block.
1645 Prefer this occurrence to the currently recorded one. We want
1646 the last one in the block and the block is scanned from start
1647 to end. */
1648 cur_occr->insn = insn;
1650 else
1652 /* First occurrence of this expression in this basic block. */
1653 cur_occr = GOBNEW (struct occr);
1654 bytes_used += sizeof (struct occr);
1656 cur_occr->insn = insn;
1657 cur_occr->next = cur_expr->avail_occr;
1658 cur_occr->deleted_p = 0;
1659 cur_expr->avail_occr = cur_occr;
1663 /* Determine whether the rtx X should be treated as a constant for
1664 the purposes of GCSE's constant propagation. */
1666 static bool
1667 gcse_constant_p (const_rtx x)
1669 /* Consider a COMPARE of two integers constant. */
1670 if (GET_CODE (x) == COMPARE
1671 && GET_CODE (XEXP (x, 0)) == CONST_INT
1672 && GET_CODE (XEXP (x, 1)) == CONST_INT)
1673 return true;
1675 /* Consider a COMPARE of the same registers is a constant
1676 if they are not floating point registers. */
1677 if (GET_CODE(x) == COMPARE
1678 && REG_P (XEXP (x, 0)) && REG_P (XEXP (x, 1))
1679 && REGNO (XEXP (x, 0)) == REGNO (XEXP (x, 1))
1680 && ! FLOAT_MODE_P (GET_MODE (XEXP (x, 0)))
1681 && ! FLOAT_MODE_P (GET_MODE (XEXP (x, 1))))
1682 return true;
1684 return CONSTANT_P (x);
1687 /* Scan pattern PAT of INSN and add an entry to the hash TABLE (set or
1688 expression one). */
1690 static void
1691 hash_scan_set (rtx pat, rtx insn, struct hash_table *table)
1693 rtx src = SET_SRC (pat);
1694 rtx dest = SET_DEST (pat);
1695 rtx note;
1697 if (GET_CODE (src) == CALL)
1698 hash_scan_call (src, insn, table);
1700 else if (REG_P (dest))
1702 unsigned int regno = REGNO (dest);
1703 rtx tmp;
1705 /* See if a REG_EQUAL note shows this equivalent to a simpler expression.
1707 This allows us to do a single GCSE pass and still eliminate
1708 redundant constants, addresses or other expressions that are
1709 constructed with multiple instructions.
1711 However, keep the original SRC if INSN is a simple reg-reg move. In
1712 In this case, there will almost always be a REG_EQUAL note on the
1713 insn that sets SRC. By recording the REG_EQUAL value here as SRC
1714 for INSN, we miss copy propagation opportunities and we perform the
1715 same PRE GCSE operation repeatedly on the same REG_EQUAL value if we
1716 do more than one PRE GCSE pass.
1718 Note that this does not impede profitable constant propagations. We
1719 "look through" reg-reg sets in lookup_avail_set. */
1720 note = find_reg_equal_equiv_note (insn);
1721 if (note != 0
1722 && REG_NOTE_KIND (note) == REG_EQUAL
1723 && !REG_P (src)
1724 && (table->set_p
1725 ? gcse_constant_p (XEXP (note, 0))
1726 : want_to_gcse_p (XEXP (note, 0))))
1727 src = XEXP (note, 0), pat = gen_rtx_SET (VOIDmode, dest, src);
1729 /* Only record sets of pseudo-regs in the hash table. */
1730 if (! table->set_p
1731 && regno >= FIRST_PSEUDO_REGISTER
1732 /* Don't GCSE something if we can't do a reg/reg copy. */
1733 && can_copy_p (GET_MODE (dest))
1734 /* GCSE commonly inserts instruction after the insn. We can't
1735 do that easily for EH_REGION notes so disable GCSE on these
1736 for now. */
1737 && !find_reg_note (insn, REG_EH_REGION, NULL_RTX)
1738 /* Is SET_SRC something we want to gcse? */
1739 && want_to_gcse_p (src)
1740 /* Don't CSE a nop. */
1741 && ! set_noop_p (pat)
1742 /* Don't GCSE if it has attached REG_EQUIV note.
1743 At this point this only function parameters should have
1744 REG_EQUIV notes and if the argument slot is used somewhere
1745 explicitly, it means address of parameter has been taken,
1746 so we should not extend the lifetime of the pseudo. */
1747 && (note == NULL_RTX || ! MEM_P (XEXP (note, 0))))
1749 /* An expression is not anticipatable if its operands are
1750 modified before this insn or if this is not the only SET in
1751 this insn. The latter condition does not have to mean that
1752 SRC itself is not anticipatable, but we just will not be
1753 able to handle code motion of insns with multiple sets. */
1754 int antic_p = oprs_anticipatable_p (src, insn)
1755 && !multiple_sets (insn);
1756 /* An expression is not available if its operands are
1757 subsequently modified, including this insn. It's also not
1758 available if this is a branch, because we can't insert
1759 a set after the branch. */
1760 int avail_p = (oprs_available_p (src, insn)
1761 && ! JUMP_P (insn));
1763 insert_expr_in_table (src, GET_MODE (dest), insn, antic_p, avail_p, table);
1766 /* Record sets for constant/copy propagation. */
1767 else if (table->set_p
1768 && regno >= FIRST_PSEUDO_REGISTER
1769 && ((REG_P (src)
1770 && REGNO (src) >= FIRST_PSEUDO_REGISTER
1771 && can_copy_p (GET_MODE (dest))
1772 && REGNO (src) != regno)
1773 || gcse_constant_p (src))
1774 /* A copy is not available if its src or dest is subsequently
1775 modified. Here we want to search from INSN+1 on, but
1776 oprs_available_p searches from INSN on. */
1777 && (insn == BB_END (BLOCK_FOR_INSN (insn))
1778 || (tmp = next_nonnote_insn (insn)) == NULL_RTX
1779 || BLOCK_FOR_INSN (tmp) != BLOCK_FOR_INSN (insn)
1780 || oprs_available_p (pat, tmp)))
1781 insert_set_in_table (pat, insn, table);
1783 /* In case of store we want to consider the memory value as available in
1784 the REG stored in that memory. This makes it possible to remove
1785 redundant loads from due to stores to the same location. */
1786 else if (flag_gcse_las && REG_P (src) && MEM_P (dest))
1788 unsigned int regno = REGNO (src);
1790 /* Do not do this for constant/copy propagation. */
1791 if (! table->set_p
1792 /* Only record sets of pseudo-regs in the hash table. */
1793 && regno >= FIRST_PSEUDO_REGISTER
1794 /* Don't GCSE something if we can't do a reg/reg copy. */
1795 && can_copy_p (GET_MODE (src))
1796 /* GCSE commonly inserts instruction after the insn. We can't
1797 do that easily for EH_REGION notes so disable GCSE on these
1798 for now. */
1799 && ! find_reg_note (insn, REG_EH_REGION, NULL_RTX)
1800 /* Is SET_DEST something we want to gcse? */
1801 && want_to_gcse_p (dest)
1802 /* Don't CSE a nop. */
1803 && ! set_noop_p (pat)
1804 /* Don't GCSE if it has attached REG_EQUIV note.
1805 At this point this only function parameters should have
1806 REG_EQUIV notes and if the argument slot is used somewhere
1807 explicitly, it means address of parameter has been taken,
1808 so we should not extend the lifetime of the pseudo. */
1809 && ((note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) == 0
1810 || ! MEM_P (XEXP (note, 0))))
1812 /* Stores are never anticipatable. */
1813 int antic_p = 0;
1814 /* An expression is not available if its operands are
1815 subsequently modified, including this insn. It's also not
1816 available if this is a branch, because we can't insert
1817 a set after the branch. */
1818 int avail_p = oprs_available_p (dest, insn)
1819 && ! JUMP_P (insn);
1821 /* Record the memory expression (DEST) in the hash table. */
1822 insert_expr_in_table (dest, GET_MODE (dest), insn,
1823 antic_p, avail_p, table);
1828 static void
1829 hash_scan_clobber (rtx x ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED,
1830 struct hash_table *table ATTRIBUTE_UNUSED)
1832 /* Currently nothing to do. */
1835 static void
1836 hash_scan_call (rtx x ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED,
1837 struct hash_table *table ATTRIBUTE_UNUSED)
1839 /* Currently nothing to do. */
1842 /* Process INSN and add hash table entries as appropriate.
1844 Only available expressions that set a single pseudo-reg are recorded.
1846 Single sets in a PARALLEL could be handled, but it's an extra complication
1847 that isn't dealt with right now. The trick is handling the CLOBBERs that
1848 are also in the PARALLEL. Later.
1850 If SET_P is nonzero, this is for the assignment hash table,
1851 otherwise it is for the expression hash table. */
1853 static void
1854 hash_scan_insn (rtx insn, struct hash_table *table)
1856 rtx pat = PATTERN (insn);
1857 int i;
1859 /* Pick out the sets of INSN and for other forms of instructions record
1860 what's been modified. */
1862 if (GET_CODE (pat) == SET)
1863 hash_scan_set (pat, insn, table);
1864 else if (GET_CODE (pat) == PARALLEL)
1865 for (i = 0; i < XVECLEN (pat, 0); i++)
1867 rtx x = XVECEXP (pat, 0, i);
1869 if (GET_CODE (x) == SET)
1870 hash_scan_set (x, insn, table);
1871 else if (GET_CODE (x) == CLOBBER)
1872 hash_scan_clobber (x, insn, table);
1873 else if (GET_CODE (x) == CALL)
1874 hash_scan_call (x, insn, table);
1877 else if (GET_CODE (pat) == CLOBBER)
1878 hash_scan_clobber (pat, insn, table);
1879 else if (GET_CODE (pat) == CALL)
1880 hash_scan_call (pat, insn, table);
1883 static void
1884 dump_hash_table (FILE *file, const char *name, struct hash_table *table)
1886 int i;
1887 /* Flattened out table, so it's printed in proper order. */
1888 struct expr **flat_table;
1889 unsigned int *hash_val;
1890 struct expr *expr;
1892 flat_table = XCNEWVEC (struct expr *, table->n_elems);
1893 hash_val = XNEWVEC (unsigned int, table->n_elems);
1895 for (i = 0; i < (int) table->size; i++)
1896 for (expr = table->table[i]; expr != NULL; expr = expr->next_same_hash)
1898 flat_table[expr->bitmap_index] = expr;
1899 hash_val[expr->bitmap_index] = i;
1902 fprintf (file, "%s hash table (%d buckets, %d entries)\n",
1903 name, table->size, table->n_elems);
1905 for (i = 0; i < (int) table->n_elems; i++)
1906 if (flat_table[i] != 0)
1908 expr = flat_table[i];
1909 fprintf (file, "Index %d (hash value %d)\n ",
1910 expr->bitmap_index, hash_val[i]);
1911 print_rtl (file, expr->expr);
1912 fprintf (file, "\n");
1915 fprintf (file, "\n");
1917 free (flat_table);
1918 free (hash_val);
1921 /* Record register first/last/block set information for REGNO in INSN.
1923 first_set records the first place in the block where the register
1924 is set and is used to compute "anticipatability".
1926 last_set records the last place in the block where the register
1927 is set and is used to compute "availability".
1929 last_bb records the block for which first_set and last_set are
1930 valid, as a quick test to invalidate them.
1932 reg_set_in_block records whether the register is set in the block
1933 and is used to compute "transparency". */
1935 static void
1936 record_last_reg_set_info (rtx insn, int regno)
1938 struct reg_avail_info *info = &reg_avail_info[regno];
1939 int cuid = INSN_CUID (insn);
1941 info->last_set = cuid;
1942 if (info->last_bb != current_bb)
1944 info->last_bb = current_bb;
1945 info->first_set = cuid;
1946 SET_BIT (reg_set_in_block[current_bb->index], regno);
1951 /* Record all of the canonicalized MEMs of record_last_mem_set_info's insn.
1952 Note we store a pair of elements in the list, so they have to be
1953 taken off pairwise. */
1955 static void
1956 canon_list_insert (rtx dest ATTRIBUTE_UNUSED, const_rtx unused1 ATTRIBUTE_UNUSED,
1957 void * v_insn)
1959 rtx dest_addr, insn;
1960 int bb;
1962 while (GET_CODE (dest) == SUBREG
1963 || GET_CODE (dest) == ZERO_EXTRACT
1964 || GET_CODE (dest) == STRICT_LOW_PART)
1965 dest = XEXP (dest, 0);
1967 /* If DEST is not a MEM, then it will not conflict with a load. Note
1968 that function calls are assumed to clobber memory, but are handled
1969 elsewhere. */
1971 if (! MEM_P (dest))
1972 return;
1974 dest_addr = get_addr (XEXP (dest, 0));
1975 dest_addr = canon_rtx (dest_addr);
1976 insn = (rtx) v_insn;
1977 bb = BLOCK_NUM (insn);
1979 canon_modify_mem_list[bb] =
1980 alloc_EXPR_LIST (VOIDmode, dest_addr, canon_modify_mem_list[bb]);
1981 canon_modify_mem_list[bb] =
1982 alloc_EXPR_LIST (VOIDmode, dest, canon_modify_mem_list[bb]);
1985 /* Record memory modification information for INSN. We do not actually care
1986 about the memory location(s) that are set, or even how they are set (consider
1987 a CALL_INSN). We merely need to record which insns modify memory. */
1989 static void
1990 record_last_mem_set_info (rtx insn)
1992 int bb = BLOCK_NUM (insn);
1994 /* load_killed_in_block_p will handle the case of calls clobbering
1995 everything. */
1996 modify_mem_list[bb] = alloc_INSN_LIST (insn, modify_mem_list[bb]);
1997 bitmap_set_bit (modify_mem_list_set, bb);
1999 if (CALL_P (insn))
2001 /* Note that traversals of this loop (other than for free-ing)
2002 will break after encountering a CALL_INSN. So, there's no
2003 need to insert a pair of items, as canon_list_insert does. */
2004 canon_modify_mem_list[bb] =
2005 alloc_INSN_LIST (insn, canon_modify_mem_list[bb]);
2006 bitmap_set_bit (blocks_with_calls, bb);
2008 else
2009 note_stores (PATTERN (insn), canon_list_insert, (void*) insn);
2012 /* Called from compute_hash_table via note_stores to handle one
2013 SET or CLOBBER in an insn. DATA is really the instruction in which
2014 the SET is taking place. */
2016 static void
2017 record_last_set_info (rtx dest, const_rtx setter ATTRIBUTE_UNUSED, void *data)
2019 rtx last_set_insn = (rtx) data;
2021 if (GET_CODE (dest) == SUBREG)
2022 dest = SUBREG_REG (dest);
2024 if (REG_P (dest))
2025 record_last_reg_set_info (last_set_insn, REGNO (dest));
2026 else if (MEM_P (dest)
2027 /* Ignore pushes, they clobber nothing. */
2028 && ! push_operand (dest, GET_MODE (dest)))
2029 record_last_mem_set_info (last_set_insn);
2032 /* Top level function to create an expression or assignment hash table.
2034 Expression entries are placed in the hash table if
2035 - they are of the form (set (pseudo-reg) src),
2036 - src is something we want to perform GCSE on,
2037 - none of the operands are subsequently modified in the block
2039 Assignment entries are placed in the hash table if
2040 - they are of the form (set (pseudo-reg) src),
2041 - src is something we want to perform const/copy propagation on,
2042 - none of the operands or target are subsequently modified in the block
2044 Currently src must be a pseudo-reg or a const_int.
2046 TABLE is the table computed. */
2048 static void
2049 compute_hash_table_work (struct hash_table *table)
2051 unsigned int i;
2053 /* While we compute the hash table we also compute a bit array of which
2054 registers are set in which blocks.
2055 ??? This isn't needed during const/copy propagation, but it's cheap to
2056 compute. Later. */
2057 sbitmap_vector_zero (reg_set_in_block, last_basic_block);
2059 /* re-Cache any INSN_LIST nodes we have allocated. */
2060 clear_modify_mem_tables ();
2061 /* Some working arrays used to track first and last set in each block. */
2062 reg_avail_info = GNEWVEC (struct reg_avail_info, max_gcse_regno);
2064 for (i = 0; i < max_gcse_regno; ++i)
2065 reg_avail_info[i].last_bb = NULL;
2067 FOR_EACH_BB (current_bb)
2069 rtx insn;
2070 unsigned int regno;
2072 /* First pass over the instructions records information used to
2073 determine when registers and memory are first and last set.
2074 ??? hard-reg reg_set_in_block computation
2075 could be moved to compute_sets since they currently don't change. */
2077 FOR_BB_INSNS (current_bb, insn)
2079 if (! INSN_P (insn))
2080 continue;
2082 if (CALL_P (insn))
2084 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
2085 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, regno))
2086 record_last_reg_set_info (insn, regno);
2088 mark_call (insn);
2091 note_stores (PATTERN (insn), record_last_set_info, insn);
2094 /* Insert implicit sets in the hash table. */
2095 if (table->set_p
2096 && implicit_sets[current_bb->index] != NULL_RTX)
2097 hash_scan_set (implicit_sets[current_bb->index],
2098 BB_HEAD (current_bb), table);
2100 /* The next pass builds the hash table. */
2101 FOR_BB_INSNS (current_bb, insn)
2102 if (INSN_P (insn))
2103 hash_scan_insn (insn, table);
2106 free (reg_avail_info);
2107 reg_avail_info = NULL;
2110 /* Allocate space for the set/expr hash TABLE.
2111 N_INSNS is the number of instructions in the function.
2112 It is used to determine the number of buckets to use.
2113 SET_P determines whether set or expression table will
2114 be created. */
2116 static void
2117 alloc_hash_table (int n_insns, struct hash_table *table, int set_p)
2119 int n;
2121 table->size = n_insns / 4;
2122 if (table->size < 11)
2123 table->size = 11;
2125 /* Attempt to maintain efficient use of hash table.
2126 Making it an odd number is simplest for now.
2127 ??? Later take some measurements. */
2128 table->size |= 1;
2129 n = table->size * sizeof (struct expr *);
2130 table->table = GNEWVAR (struct expr *, n);
2131 table->set_p = set_p;
2134 /* Free things allocated by alloc_hash_table. */
2136 static void
2137 free_hash_table (struct hash_table *table)
2139 free (table->table);
2142 /* Compute the hash TABLE for doing copy/const propagation or
2143 expression hash table. */
2145 static void
2146 compute_hash_table (struct hash_table *table)
2148 /* Initialize count of number of entries in hash table. */
2149 table->n_elems = 0;
2150 memset (table->table, 0, table->size * sizeof (struct expr *));
2152 compute_hash_table_work (table);
2155 /* Expression tracking support. */
2157 /* Lookup REGNO in the set TABLE. The result is a pointer to the
2158 table entry, or NULL if not found. */
2160 static struct expr *
2161 lookup_set (unsigned int regno, struct hash_table *table)
2163 unsigned int hash = hash_set (regno, table->size);
2164 struct expr *expr;
2166 expr = table->table[hash];
2168 while (expr && REGNO (SET_DEST (expr->expr)) != regno)
2169 expr = expr->next_same_hash;
2171 return expr;
2174 /* Return the next entry for REGNO in list EXPR. */
2176 static struct expr *
2177 next_set (unsigned int regno, struct expr *expr)
2180 expr = expr->next_same_hash;
2181 while (expr && REGNO (SET_DEST (expr->expr)) != regno);
2183 return expr;
2186 /* Like free_INSN_LIST_list or free_EXPR_LIST_list, except that the node
2187 types may be mixed. */
2189 static void
2190 free_insn_expr_list_list (rtx *listp)
2192 rtx list, next;
2194 for (list = *listp; list ; list = next)
2196 next = XEXP (list, 1);
2197 if (GET_CODE (list) == EXPR_LIST)
2198 free_EXPR_LIST_node (list);
2199 else
2200 free_INSN_LIST_node (list);
2203 *listp = NULL;
2206 /* Clear canon_modify_mem_list and modify_mem_list tables. */
2207 static void
2208 clear_modify_mem_tables (void)
2210 unsigned i;
2211 bitmap_iterator bi;
2213 EXECUTE_IF_SET_IN_BITMAP (modify_mem_list_set, 0, i, bi)
2215 free_INSN_LIST_list (modify_mem_list + i);
2216 free_insn_expr_list_list (canon_modify_mem_list + i);
2218 bitmap_clear (modify_mem_list_set);
2219 bitmap_clear (blocks_with_calls);
2222 /* Release memory used by modify_mem_list_set. */
2224 static void
2225 free_modify_mem_tables (void)
2227 clear_modify_mem_tables ();
2228 free (modify_mem_list);
2229 free (canon_modify_mem_list);
2230 modify_mem_list = 0;
2231 canon_modify_mem_list = 0;
2234 /* Reset tables used to keep track of what's still available [since the
2235 start of the block]. */
2237 static void
2238 reset_opr_set_tables (void)
2240 /* Maintain a bitmap of which regs have been set since beginning of
2241 the block. */
2242 CLEAR_REG_SET (reg_set_bitmap);
2244 /* Also keep a record of the last instruction to modify memory.
2245 For now this is very trivial, we only record whether any memory
2246 location has been modified. */
2247 clear_modify_mem_tables ();
2250 /* Return nonzero if the operands of X are not set before INSN in
2251 INSN's basic block. */
2253 static int
2254 oprs_not_set_p (const_rtx x, const_rtx insn)
2256 int i, j;
2257 enum rtx_code code;
2258 const char *fmt;
2260 if (x == 0)
2261 return 1;
2263 code = GET_CODE (x);
2264 switch (code)
2266 case PC:
2267 case CC0:
2268 case CONST:
2269 case CONST_INT:
2270 case CONST_DOUBLE:
2271 case CONST_FIXED:
2272 case CONST_VECTOR:
2273 case SYMBOL_REF:
2274 case LABEL_REF:
2275 case ADDR_VEC:
2276 case ADDR_DIFF_VEC:
2277 return 1;
2279 case MEM:
2280 if (load_killed_in_block_p (BLOCK_FOR_INSN (insn),
2281 INSN_CUID (insn), x, 0))
2282 return 0;
2283 else
2284 return oprs_not_set_p (XEXP (x, 0), insn);
2286 case REG:
2287 return ! REGNO_REG_SET_P (reg_set_bitmap, REGNO (x));
2289 default:
2290 break;
2293 for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
2295 if (fmt[i] == 'e')
2297 /* If we are about to do the last recursive call
2298 needed at this level, change it into iteration.
2299 This function is called enough to be worth it. */
2300 if (i == 0)
2301 return oprs_not_set_p (XEXP (x, i), insn);
2303 if (! oprs_not_set_p (XEXP (x, i), insn))
2304 return 0;
2306 else if (fmt[i] == 'E')
2307 for (j = 0; j < XVECLEN (x, i); j++)
2308 if (! oprs_not_set_p (XVECEXP (x, i, j), insn))
2309 return 0;
2312 return 1;
2315 /* Mark things set by a CALL. */
2317 static void
2318 mark_call (rtx insn)
2320 if (! RTL_CONST_OR_PURE_CALL_P (insn))
2321 record_last_mem_set_info (insn);
2324 /* Mark things set by a SET. */
2326 static void
2327 mark_set (rtx pat, rtx insn)
2329 rtx dest = SET_DEST (pat);
2331 while (GET_CODE (dest) == SUBREG
2332 || GET_CODE (dest) == ZERO_EXTRACT
2333 || GET_CODE (dest) == STRICT_LOW_PART)
2334 dest = XEXP (dest, 0);
2336 if (REG_P (dest))
2337 SET_REGNO_REG_SET (reg_set_bitmap, REGNO (dest));
2338 else if (MEM_P (dest))
2339 record_last_mem_set_info (insn);
2341 if (GET_CODE (SET_SRC (pat)) == CALL)
2342 mark_call (insn);
2345 /* Record things set by a CLOBBER. */
2347 static void
2348 mark_clobber (rtx pat, rtx insn)
2350 rtx clob = XEXP (pat, 0);
2352 while (GET_CODE (clob) == SUBREG || GET_CODE (clob) == STRICT_LOW_PART)
2353 clob = XEXP (clob, 0);
2355 if (REG_P (clob))
2356 SET_REGNO_REG_SET (reg_set_bitmap, REGNO (clob));
2357 else
2358 record_last_mem_set_info (insn);
2361 /* Record things set by INSN.
2362 This data is used by oprs_not_set_p. */
2364 static void
2365 mark_oprs_set (rtx insn)
2367 rtx pat = PATTERN (insn);
2368 int i;
2370 if (GET_CODE (pat) == SET)
2371 mark_set (pat, insn);
2372 else if (GET_CODE (pat) == PARALLEL)
2373 for (i = 0; i < XVECLEN (pat, 0); i++)
2375 rtx x = XVECEXP (pat, 0, i);
2377 if (GET_CODE (x) == SET)
2378 mark_set (x, insn);
2379 else if (GET_CODE (x) == CLOBBER)
2380 mark_clobber (x, insn);
2381 else if (GET_CODE (x) == CALL)
2382 mark_call (insn);
2385 else if (GET_CODE (pat) == CLOBBER)
2386 mark_clobber (pat, insn);
2387 else if (GET_CODE (pat) == CALL)
2388 mark_call (insn);
2392 /* Compute copy/constant propagation working variables. */
2394 /* Local properties of assignments. */
2395 static sbitmap *cprop_pavloc;
2396 static sbitmap *cprop_absaltered;
2398 /* Global properties of assignments (computed from the local properties). */
2399 static sbitmap *cprop_avin;
2400 static sbitmap *cprop_avout;
2402 /* Allocate vars used for copy/const propagation. N_BLOCKS is the number of
2403 basic blocks. N_SETS is the number of sets. */
2405 static void
2406 alloc_cprop_mem (int n_blocks, int n_sets)
2408 cprop_pavloc = sbitmap_vector_alloc (n_blocks, n_sets);
2409 cprop_absaltered = sbitmap_vector_alloc (n_blocks, n_sets);
2411 cprop_avin = sbitmap_vector_alloc (n_blocks, n_sets);
2412 cprop_avout = sbitmap_vector_alloc (n_blocks, n_sets);
2415 /* Free vars used by copy/const propagation. */
2417 static void
2418 free_cprop_mem (void)
2420 sbitmap_vector_free (cprop_pavloc);
2421 sbitmap_vector_free (cprop_absaltered);
2422 sbitmap_vector_free (cprop_avin);
2423 sbitmap_vector_free (cprop_avout);
2426 /* For each block, compute whether X is transparent. X is either an
2427 expression or an assignment [though we don't care which, for this context
2428 an assignment is treated as an expression]. For each block where an
2429 element of X is modified, set (SET_P == 1) or reset (SET_P == 0) the INDX
2430 bit in BMAP. */
2432 static void
2433 compute_transp (const_rtx x, int indx, sbitmap *bmap, int set_p)
2435 int i, j;
2436 basic_block bb;
2437 enum rtx_code code;
2438 reg_set *r;
2439 const char *fmt;
2441 /* repeat is used to turn tail-recursion into iteration since GCC
2442 can't do it when there's no return value. */
2443 repeat:
2445 if (x == 0)
2446 return;
2448 code = GET_CODE (x);
2449 switch (code)
2451 case REG:
2452 if (set_p)
2454 if (REGNO (x) < FIRST_PSEUDO_REGISTER)
2456 FOR_EACH_BB (bb)
2457 if (TEST_BIT (reg_set_in_block[bb->index], REGNO (x)))
2458 SET_BIT (bmap[bb->index], indx);
2460 else
2462 for (r = reg_set_table[REGNO (x)]; r != NULL; r = r->next)
2463 SET_BIT (bmap[r->bb_index], indx);
2466 else
2468 if (REGNO (x) < FIRST_PSEUDO_REGISTER)
2470 FOR_EACH_BB (bb)
2471 if (TEST_BIT (reg_set_in_block[bb->index], REGNO (x)))
2472 RESET_BIT (bmap[bb->index], indx);
2474 else
2476 for (r = reg_set_table[REGNO (x)]; r != NULL; r = r->next)
2477 RESET_BIT (bmap[r->bb_index], indx);
2481 return;
2483 case MEM:
2484 if (! MEM_READONLY_P (x))
2486 bitmap_iterator bi;
2487 unsigned bb_index;
2489 /* First handle all the blocks with calls. We don't need to
2490 do any list walking for them. */
2491 EXECUTE_IF_SET_IN_BITMAP (blocks_with_calls, 0, bb_index, bi)
2493 if (set_p)
2494 SET_BIT (bmap[bb_index], indx);
2495 else
2496 RESET_BIT (bmap[bb_index], indx);
2499 /* Now iterate over the blocks which have memory modifications
2500 but which do not have any calls. */
2501 EXECUTE_IF_AND_COMPL_IN_BITMAP (modify_mem_list_set,
2502 blocks_with_calls,
2503 0, bb_index, bi)
2505 rtx list_entry = canon_modify_mem_list[bb_index];
2507 while (list_entry)
2509 rtx dest, dest_addr;
2511 /* LIST_ENTRY must be an INSN of some kind that sets memory.
2512 Examine each hunk of memory that is modified. */
2514 dest = XEXP (list_entry, 0);
2515 list_entry = XEXP (list_entry, 1);
2516 dest_addr = XEXP (list_entry, 0);
2518 if (canon_true_dependence (dest, GET_MODE (dest), dest_addr,
2519 x, rtx_addr_varies_p))
2521 if (set_p)
2522 SET_BIT (bmap[bb_index], indx);
2523 else
2524 RESET_BIT (bmap[bb_index], indx);
2525 break;
2527 list_entry = XEXP (list_entry, 1);
2532 x = XEXP (x, 0);
2533 goto repeat;
2535 case PC:
2536 case CC0: /*FIXME*/
2537 case CONST:
2538 case CONST_INT:
2539 case CONST_DOUBLE:
2540 case CONST_FIXED:
2541 case CONST_VECTOR:
2542 case SYMBOL_REF:
2543 case LABEL_REF:
2544 case ADDR_VEC:
2545 case ADDR_DIFF_VEC:
2546 return;
2548 default:
2549 break;
2552 for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
2554 if (fmt[i] == 'e')
2556 /* If we are about to do the last recursive call
2557 needed at this level, change it into iteration.
2558 This function is called enough to be worth it. */
2559 if (i == 0)
2561 x = XEXP (x, i);
2562 goto repeat;
2565 compute_transp (XEXP (x, i), indx, bmap, set_p);
2567 else if (fmt[i] == 'E')
2568 for (j = 0; j < XVECLEN (x, i); j++)
2569 compute_transp (XVECEXP (x, i, j), indx, bmap, set_p);
2573 /* Top level routine to do the dataflow analysis needed by copy/const
2574 propagation. */
2576 static void
2577 compute_cprop_data (void)
2579 compute_local_properties (cprop_absaltered, cprop_pavloc, NULL, &set_hash_table);
2580 compute_available (cprop_pavloc, cprop_absaltered,
2581 cprop_avout, cprop_avin);
2584 /* Copy/constant propagation. */
2586 /* Maximum number of register uses in an insn that we handle. */
2587 #define MAX_USES 8
2589 /* Table of uses found in an insn.
2590 Allocated statically to avoid alloc/free complexity and overhead. */
2591 static struct reg_use reg_use_table[MAX_USES];
2593 /* Index into `reg_use_table' while building it. */
2594 static int reg_use_count;
2596 /* Set up a list of register numbers used in INSN. The found uses are stored
2597 in `reg_use_table'. `reg_use_count' is initialized to zero before entry,
2598 and contains the number of uses in the table upon exit.
2600 ??? If a register appears multiple times we will record it multiple times.
2601 This doesn't hurt anything but it will slow things down. */
2603 static void
2604 find_used_regs (rtx *xptr, void *data ATTRIBUTE_UNUSED)
2606 int i, j;
2607 enum rtx_code code;
2608 const char *fmt;
2609 rtx x = *xptr;
2611 /* repeat is used to turn tail-recursion into iteration since GCC
2612 can't do it when there's no return value. */
2613 repeat:
2614 if (x == 0)
2615 return;
2617 code = GET_CODE (x);
2618 if (REG_P (x))
2620 if (reg_use_count == MAX_USES)
2621 return;
2623 reg_use_table[reg_use_count].reg_rtx = x;
2624 reg_use_count++;
2627 /* Recursively scan the operands of this expression. */
2629 for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
2631 if (fmt[i] == 'e')
2633 /* If we are about to do the last recursive call
2634 needed at this level, change it into iteration.
2635 This function is called enough to be worth it. */
2636 if (i == 0)
2638 x = XEXP (x, 0);
2639 goto repeat;
2642 find_used_regs (&XEXP (x, i), data);
2644 else if (fmt[i] == 'E')
2645 for (j = 0; j < XVECLEN (x, i); j++)
2646 find_used_regs (&XVECEXP (x, i, j), data);
2650 /* Try to replace all non-SET_DEST occurrences of FROM in INSN with TO.
2651 Returns nonzero is successful. */
2653 static int
2654 try_replace_reg (rtx from, rtx to, rtx insn)
2656 rtx note = find_reg_equal_equiv_note (insn);
2657 rtx src = 0;
2658 int success = 0;
2659 rtx set = single_set (insn);
2661 /* Usually we substitute easy stuff, so we won't copy everything.
2662 We however need to take care to not duplicate non-trivial CONST
2663 expressions. */
2664 to = copy_rtx (to);
2666 validate_replace_src_group (from, to, insn);
2667 if (num_changes_pending () && apply_change_group ())
2668 success = 1;
2670 /* Try to simplify SET_SRC if we have substituted a constant. */
2671 if (success && set && CONSTANT_P (to))
2673 src = simplify_rtx (SET_SRC (set));
2675 if (src)
2676 validate_change (insn, &SET_SRC (set), src, 0);
2679 /* If there is already a REG_EQUAL note, update the expression in it
2680 with our replacement. */
2681 if (note != 0 && REG_NOTE_KIND (note) == REG_EQUAL)
2682 set_unique_reg_note (insn, REG_EQUAL,
2683 simplify_replace_rtx (XEXP (note, 0), from,
2684 copy_rtx (to)));
2685 if (!success && set && reg_mentioned_p (from, SET_SRC (set)))
2687 /* If above failed and this is a single set, try to simplify the source of
2688 the set given our substitution. We could perhaps try this for multiple
2689 SETs, but it probably won't buy us anything. */
2690 src = simplify_replace_rtx (SET_SRC (set), from, to);
2692 if (!rtx_equal_p (src, SET_SRC (set))
2693 && validate_change (insn, &SET_SRC (set), src, 0))
2694 success = 1;
2696 /* If we've failed to do replacement, have a single SET, don't already
2697 have a note, and have no special SET, add a REG_EQUAL note to not
2698 lose information. */
2699 if (!success && note == 0 && set != 0
2700 && GET_CODE (SET_DEST (set)) != ZERO_EXTRACT
2701 && GET_CODE (SET_DEST (set)) != STRICT_LOW_PART)
2702 note = set_unique_reg_note (insn, REG_EQUAL, copy_rtx (src));
2705 /* REG_EQUAL may get simplified into register.
2706 We don't allow that. Remove that note. This code ought
2707 not to happen, because previous code ought to synthesize
2708 reg-reg move, but be on the safe side. */
2709 if (note && REG_NOTE_KIND (note) == REG_EQUAL && REG_P (XEXP (note, 0)))
2710 remove_note (insn, note);
2712 return success;
2715 /* Find a set of REGNOs that are available on entry to INSN's block. Returns
2716 NULL no such set is found. */
2718 static struct expr *
2719 find_avail_set (int regno, rtx insn)
2721 /* SET1 contains the last set found that can be returned to the caller for
2722 use in a substitution. */
2723 struct expr *set1 = 0;
2725 /* Loops are not possible here. To get a loop we would need two sets
2726 available at the start of the block containing INSN. i.e. we would
2727 need two sets like this available at the start of the block:
2729 (set (reg X) (reg Y))
2730 (set (reg Y) (reg X))
2732 This can not happen since the set of (reg Y) would have killed the
2733 set of (reg X) making it unavailable at the start of this block. */
2734 while (1)
2736 rtx src;
2737 struct expr *set = lookup_set (regno, &set_hash_table);
2739 /* Find a set that is available at the start of the block
2740 which contains INSN. */
2741 while (set)
2743 if (TEST_BIT (cprop_avin[BLOCK_NUM (insn)], set->bitmap_index))
2744 break;
2745 set = next_set (regno, set);
2748 /* If no available set was found we've reached the end of the
2749 (possibly empty) copy chain. */
2750 if (set == 0)
2751 break;
2753 gcc_assert (GET_CODE (set->expr) == SET);
2755 src = SET_SRC (set->expr);
2757 /* We know the set is available.
2758 Now check that SRC is ANTLOC (i.e. none of the source operands
2759 have changed since the start of the block).
2761 If the source operand changed, we may still use it for the next
2762 iteration of this loop, but we may not use it for substitutions. */
2764 if (gcse_constant_p (src) || oprs_not_set_p (src, insn))
2765 set1 = set;
2767 /* If the source of the set is anything except a register, then
2768 we have reached the end of the copy chain. */
2769 if (! REG_P (src))
2770 break;
2772 /* Follow the copy chain, i.e. start another iteration of the loop
2773 and see if we have an available copy into SRC. */
2774 regno = REGNO (src);
2777 /* SET1 holds the last set that was available and anticipatable at
2778 INSN. */
2779 return set1;
2782 /* Subroutine of cprop_insn that tries to propagate constants into
2783 JUMP_INSNS. JUMP must be a conditional jump. If SETCC is non-NULL
2784 it is the instruction that immediately precedes JUMP, and must be a
2785 single SET of a register. FROM is what we will try to replace,
2786 SRC is the constant we will try to substitute for it. Returns nonzero
2787 if a change was made. */
2789 static int
2790 cprop_jump (basic_block bb, rtx setcc, rtx jump, rtx from, rtx src)
2792 rtx new_rtx, set_src, note_src;
2793 rtx set = pc_set (jump);
2794 rtx note = find_reg_equal_equiv_note (jump);
2796 if (note)
2798 note_src = XEXP (note, 0);
2799 if (GET_CODE (note_src) == EXPR_LIST)
2800 note_src = NULL_RTX;
2802 else note_src = NULL_RTX;
2804 /* Prefer REG_EQUAL notes except those containing EXPR_LISTs. */
2805 set_src = note_src ? note_src : SET_SRC (set);
2807 /* First substitute the SETCC condition into the JUMP instruction,
2808 then substitute that given values into this expanded JUMP. */
2809 if (setcc != NULL_RTX
2810 && !modified_between_p (from, setcc, jump)
2811 && !modified_between_p (src, setcc, jump))
2813 rtx setcc_src;
2814 rtx setcc_set = single_set (setcc);
2815 rtx setcc_note = find_reg_equal_equiv_note (setcc);
2816 setcc_src = (setcc_note && GET_CODE (XEXP (setcc_note, 0)) != EXPR_LIST)
2817 ? XEXP (setcc_note, 0) : SET_SRC (setcc_set);
2818 set_src = simplify_replace_rtx (set_src, SET_DEST (setcc_set),
2819 setcc_src);
2821 else
2822 setcc = NULL_RTX;
2824 new_rtx = simplify_replace_rtx (set_src, from, src);
2826 /* If no simplification can be made, then try the next register. */
2827 if (rtx_equal_p (new_rtx, SET_SRC (set)))
2828 return 0;
2830 /* If this is now a no-op delete it, otherwise this must be a valid insn. */
2831 if (new_rtx == pc_rtx)
2832 delete_insn (jump);
2833 else
2835 /* Ensure the value computed inside the jump insn to be equivalent
2836 to one computed by setcc. */
2837 if (setcc && modified_in_p (new_rtx, setcc))
2838 return 0;
2839 if (! validate_unshare_change (jump, &SET_SRC (set), new_rtx, 0))
2841 /* When (some) constants are not valid in a comparison, and there
2842 are two registers to be replaced by constants before the entire
2843 comparison can be folded into a constant, we need to keep
2844 intermediate information in REG_EQUAL notes. For targets with
2845 separate compare insns, such notes are added by try_replace_reg.
2846 When we have a combined compare-and-branch instruction, however,
2847 we need to attach a note to the branch itself to make this
2848 optimization work. */
2850 if (!rtx_equal_p (new_rtx, note_src))
2851 set_unique_reg_note (jump, REG_EQUAL, copy_rtx (new_rtx));
2852 return 0;
2855 /* Remove REG_EQUAL note after simplification. */
2856 if (note_src)
2857 remove_note (jump, note);
2860 #ifdef HAVE_cc0
2861 /* Delete the cc0 setter. */
2862 if (setcc != NULL && CC0_P (SET_DEST (single_set (setcc))))
2863 delete_insn (setcc);
2864 #endif
2866 run_jump_opt_after_gcse = 1;
2868 global_const_prop_count++;
2869 if (dump_file != NULL)
2871 fprintf (dump_file,
2872 "GLOBAL CONST-PROP: Replacing reg %d in jump_insn %d with constant ",
2873 REGNO (from), INSN_UID (jump));
2874 print_rtl (dump_file, src);
2875 fprintf (dump_file, "\n");
2877 purge_dead_edges (bb);
2879 /* If a conditional jump has been changed into unconditional jump, remove
2880 the jump and make the edge fallthru - this is always called in
2881 cfglayout mode. */
2882 if (new_rtx != pc_rtx && simplejump_p (jump))
2884 edge e;
2885 edge_iterator ei;
2887 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ei_next (&ei))
2888 if (e->dest != EXIT_BLOCK_PTR
2889 && BB_HEAD (e->dest) == JUMP_LABEL (jump))
2891 e->flags |= EDGE_FALLTHRU;
2892 break;
2894 delete_insn (jump);
2897 return 1;
2900 static bool
2901 constprop_register (rtx insn, rtx from, rtx to, bool alter_jumps)
2903 rtx sset;
2905 /* Check for reg or cc0 setting instructions followed by
2906 conditional branch instructions first. */
2907 if (alter_jumps
2908 && (sset = single_set (insn)) != NULL
2909 && NEXT_INSN (insn)
2910 && any_condjump_p (NEXT_INSN (insn)) && onlyjump_p (NEXT_INSN (insn)))
2912 rtx dest = SET_DEST (sset);
2913 if ((REG_P (dest) || CC0_P (dest))
2914 && cprop_jump (BLOCK_FOR_INSN (insn), insn, NEXT_INSN (insn), from, to))
2915 return 1;
2918 /* Handle normal insns next. */
2919 if (NONJUMP_INSN_P (insn)
2920 && try_replace_reg (from, to, insn))
2921 return 1;
2923 /* Try to propagate a CONST_INT into a conditional jump.
2924 We're pretty specific about what we will handle in this
2925 code, we can extend this as necessary over time.
2927 Right now the insn in question must look like
2928 (set (pc) (if_then_else ...)) */
2929 else if (alter_jumps && any_condjump_p (insn) && onlyjump_p (insn))
2930 return cprop_jump (BLOCK_FOR_INSN (insn), NULL, insn, from, to);
2931 return 0;
2934 /* Perform constant and copy propagation on INSN.
2935 The result is nonzero if a change was made. */
2937 static int
2938 cprop_insn (rtx insn, int alter_jumps)
2940 struct reg_use *reg_used;
2941 int changed = 0;
2942 rtx note;
2944 if (!INSN_P (insn))
2945 return 0;
2947 reg_use_count = 0;
2948 note_uses (&PATTERN (insn), find_used_regs, NULL);
2950 note = find_reg_equal_equiv_note (insn);
2952 /* We may win even when propagating constants into notes. */
2953 if (note)
2954 find_used_regs (&XEXP (note, 0), NULL);
2956 for (reg_used = &reg_use_table[0]; reg_use_count > 0;
2957 reg_used++, reg_use_count--)
2959 unsigned int regno = REGNO (reg_used->reg_rtx);
2960 rtx pat, src;
2961 struct expr *set;
2963 /* Ignore registers created by GCSE.
2964 We do this because ... */
2965 if (regno >= max_gcse_regno)
2966 continue;
2968 /* If the register has already been set in this block, there's
2969 nothing we can do. */
2970 if (! oprs_not_set_p (reg_used->reg_rtx, insn))
2971 continue;
2973 /* Find an assignment that sets reg_used and is available
2974 at the start of the block. */
2975 set = find_avail_set (regno, insn);
2976 if (! set)
2977 continue;
2979 pat = set->expr;
2980 /* ??? We might be able to handle PARALLELs. Later. */
2981 gcc_assert (GET_CODE (pat) == SET);
2983 src = SET_SRC (pat);
2985 /* Constant propagation. */
2986 if (gcse_constant_p (src))
2988 if (constprop_register (insn, reg_used->reg_rtx, src, alter_jumps))
2990 changed = 1;
2991 global_const_prop_count++;
2992 if (dump_file != NULL)
2994 fprintf (dump_file, "GLOBAL CONST-PROP: Replacing reg %d in ", regno);
2995 fprintf (dump_file, "insn %d with constant ", INSN_UID (insn));
2996 print_rtl (dump_file, src);
2997 fprintf (dump_file, "\n");
2999 if (INSN_DELETED_P (insn))
3000 return 1;
3003 else if (REG_P (src)
3004 && REGNO (src) >= FIRST_PSEUDO_REGISTER
3005 && REGNO (src) != regno)
3007 if (try_replace_reg (reg_used->reg_rtx, src, insn))
3009 changed = 1;
3010 global_copy_prop_count++;
3011 if (dump_file != NULL)
3013 fprintf (dump_file, "GLOBAL COPY-PROP: Replacing reg %d in insn %d",
3014 regno, INSN_UID (insn));
3015 fprintf (dump_file, " with reg %d\n", REGNO (src));
3018 /* The original insn setting reg_used may or may not now be
3019 deletable. We leave the deletion to flow. */
3020 /* FIXME: If it turns out that the insn isn't deletable,
3021 then we may have unnecessarily extended register lifetimes
3022 and made things worse. */
3027 return changed;
3030 /* Like find_used_regs, but avoid recording uses that appear in
3031 input-output contexts such as zero_extract or pre_dec. This
3032 restricts the cases we consider to those for which local cprop
3033 can legitimately make replacements. */
3035 static void
3036 local_cprop_find_used_regs (rtx *xptr, void *data)
3038 rtx x = *xptr;
3040 if (x == 0)
3041 return;
3043 switch (GET_CODE (x))
3045 case ZERO_EXTRACT:
3046 case SIGN_EXTRACT:
3047 case STRICT_LOW_PART:
3048 return;
3050 case PRE_DEC:
3051 case PRE_INC:
3052 case POST_DEC:
3053 case POST_INC:
3054 case PRE_MODIFY:
3055 case POST_MODIFY:
3056 /* Can only legitimately appear this early in the context of
3057 stack pushes for function arguments, but handle all of the
3058 codes nonetheless. */
3059 return;
3061 case SUBREG:
3062 /* Setting a subreg of a register larger than word_mode leaves
3063 the non-written words unchanged. */
3064 if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) > BITS_PER_WORD)
3065 return;
3066 break;
3068 default:
3069 break;
3072 find_used_regs (xptr, data);
3075 /* Try to perform local const/copy propagation on X in INSN.
3076 If ALTER_JUMPS is false, changing jump insns is not allowed. */
3078 static bool
3079 do_local_cprop (rtx x, rtx insn, bool alter_jumps)
3081 rtx newreg = NULL, newcnst = NULL;
3083 /* Rule out USE instructions and ASM statements as we don't want to
3084 change the hard registers mentioned. */
3085 if (REG_P (x)
3086 && (REGNO (x) >= FIRST_PSEUDO_REGISTER
3087 || (GET_CODE (PATTERN (insn)) != USE
3088 && asm_noperands (PATTERN (insn)) < 0)))
3090 cselib_val *val = cselib_lookup (x, GET_MODE (x), 0);
3091 struct elt_loc_list *l;
3093 if (!val)
3094 return false;
3095 for (l = val->locs; l; l = l->next)
3097 rtx this_rtx = l->loc;
3098 rtx note;
3100 if (gcse_constant_p (this_rtx))
3101 newcnst = this_rtx;
3102 if (REG_P (this_rtx) && REGNO (this_rtx) >= FIRST_PSEUDO_REGISTER
3103 /* Don't copy propagate if it has attached REG_EQUIV note.
3104 At this point this only function parameters should have
3105 REG_EQUIV notes and if the argument slot is used somewhere
3106 explicitly, it means address of parameter has been taken,
3107 so we should not extend the lifetime of the pseudo. */
3108 && (!(note = find_reg_note (l->setting_insn, REG_EQUIV, NULL_RTX))
3109 || ! MEM_P (XEXP (note, 0))))
3110 newreg = this_rtx;
3112 if (newcnst && constprop_register (insn, x, newcnst, alter_jumps))
3114 if (dump_file != NULL)
3116 fprintf (dump_file, "LOCAL CONST-PROP: Replacing reg %d in ",
3117 REGNO (x));
3118 fprintf (dump_file, "insn %d with constant ",
3119 INSN_UID (insn));
3120 print_rtl (dump_file, newcnst);
3121 fprintf (dump_file, "\n");
3123 local_const_prop_count++;
3124 return true;
3126 else if (newreg && newreg != x && try_replace_reg (x, newreg, insn))
3128 if (dump_file != NULL)
3130 fprintf (dump_file,
3131 "LOCAL COPY-PROP: Replacing reg %d in insn %d",
3132 REGNO (x), INSN_UID (insn));
3133 fprintf (dump_file, " with reg %d\n", REGNO (newreg));
3135 local_copy_prop_count++;
3136 return true;
3139 return false;
3142 /* Do local const/copy propagation (i.e. within each basic block).
3143 If ALTER_JUMPS is true, allow propagating into jump insns, which
3144 could modify the CFG. */
3146 static void
3147 local_cprop_pass (bool alter_jumps)
3149 basic_block bb;
3150 rtx insn;
3151 struct reg_use *reg_used;
3152 bool changed = false;
3154 cselib_init (false);
3155 FOR_EACH_BB (bb)
3157 FOR_BB_INSNS (bb, insn)
3159 if (INSN_P (insn))
3161 rtx note = find_reg_equal_equiv_note (insn);
3164 reg_use_count = 0;
3165 note_uses (&PATTERN (insn), local_cprop_find_used_regs,
3166 NULL);
3167 if (note)
3168 local_cprop_find_used_regs (&XEXP (note, 0), NULL);
3170 for (reg_used = &reg_use_table[0]; reg_use_count > 0;
3171 reg_used++, reg_use_count--)
3173 if (do_local_cprop (reg_used->reg_rtx, insn, alter_jumps))
3175 changed = true;
3176 break;
3179 if (INSN_DELETED_P (insn))
3180 break;
3182 while (reg_use_count);
3184 cselib_process_insn (insn);
3187 /* Forget everything at the end of a basic block. */
3188 cselib_clear_table ();
3191 cselib_finish ();
3193 /* Global analysis may get into infinite loops for unreachable blocks. */
3194 if (changed && alter_jumps)
3196 delete_unreachable_blocks ();
3197 free_reg_set_mem ();
3198 alloc_reg_set_mem (max_reg_num ());
3199 compute_sets ();
3203 /* Forward propagate copies. This includes copies and constants. Return
3204 nonzero if a change was made. */
3206 static int
3207 cprop (int alter_jumps)
3209 int changed;
3210 basic_block bb;
3211 rtx insn;
3213 /* Note we start at block 1. */
3214 if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
3216 if (dump_file != NULL)
3217 fprintf (dump_file, "\n");
3218 return 0;
3221 changed = 0;
3222 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb->next_bb, EXIT_BLOCK_PTR, next_bb)
3224 /* Reset tables used to keep track of what's still valid [since the
3225 start of the block]. */
3226 reset_opr_set_tables ();
3228 FOR_BB_INSNS (bb, insn)
3229 if (INSN_P (insn))
3231 changed |= cprop_insn (insn, alter_jumps);
3233 /* Keep track of everything modified by this insn. */
3234 /* ??? Need to be careful w.r.t. mods done to INSN. Don't
3235 call mark_oprs_set if we turned the insn into a NOTE. */
3236 if (! NOTE_P (insn))
3237 mark_oprs_set (insn);
3241 if (dump_file != NULL)
3242 fprintf (dump_file, "\n");
3244 return changed;
3247 /* Similar to get_condition, only the resulting condition must be
3248 valid at JUMP, instead of at EARLIEST.
3250 This differs from noce_get_condition in ifcvt.c in that we prefer not to
3251 settle for the condition variable in the jump instruction being integral.
3252 We prefer to be able to record the value of a user variable, rather than
3253 the value of a temporary used in a condition. This could be solved by
3254 recording the value of *every* register scanned by canonicalize_condition,
3255 but this would require some code reorganization. */
3258 fis_get_condition (rtx jump)
3260 return get_condition (jump, NULL, false, true);
3263 /* Check the comparison COND to see if we can safely form an implicit set from
3264 it. COND is either an EQ or NE comparison. */
3266 static bool
3267 implicit_set_cond_p (const_rtx cond)
3269 const enum machine_mode mode = GET_MODE (XEXP (cond, 0));
3270 const_rtx cst = XEXP (cond, 1);
3272 /* We can't perform this optimization if either operand might be or might
3273 contain a signed zero. */
3274 if (HONOR_SIGNED_ZEROS (mode))
3276 /* It is sufficient to check if CST is or contains a zero. We must
3277 handle float, complex, and vector. If any subpart is a zero, then
3278 the optimization can't be performed. */
3279 /* ??? The complex and vector checks are not implemented yet. We just
3280 always return zero for them. */
3281 if (GET_CODE (cst) == CONST_DOUBLE)
3283 REAL_VALUE_TYPE d;
3284 REAL_VALUE_FROM_CONST_DOUBLE (d, cst);
3285 if (REAL_VALUES_EQUAL (d, dconst0))
3286 return 0;
3288 else
3289 return 0;
3292 return gcse_constant_p (cst);
3295 /* Find the implicit sets of a function. An "implicit set" is a constraint
3296 on the value of a variable, implied by a conditional jump. For example,
3297 following "if (x == 2)", the then branch may be optimized as though the
3298 conditional performed an "explicit set", in this example, "x = 2". This
3299 function records the set patterns that are implicit at the start of each
3300 basic block. */
3302 static void
3303 find_implicit_sets (void)
3305 basic_block bb, dest;
3306 unsigned int count;
3307 rtx cond, new_rtx;
3309 count = 0;
3310 FOR_EACH_BB (bb)
3311 /* Check for more than one successor. */
3312 if (EDGE_COUNT (bb->succs) > 1)
3314 cond = fis_get_condition (BB_END (bb));
3316 if (cond
3317 && (GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
3318 && REG_P (XEXP (cond, 0))
3319 && REGNO (XEXP (cond, 0)) >= FIRST_PSEUDO_REGISTER
3320 && implicit_set_cond_p (cond))
3322 dest = GET_CODE (cond) == EQ ? BRANCH_EDGE (bb)->dest
3323 : FALLTHRU_EDGE (bb)->dest;
3325 if (dest && single_pred_p (dest)
3326 && dest != EXIT_BLOCK_PTR)
3328 new_rtx = gen_rtx_SET (VOIDmode, XEXP (cond, 0),
3329 XEXP (cond, 1));
3330 implicit_sets[dest->index] = new_rtx;
3331 if (dump_file)
3333 fprintf(dump_file, "Implicit set of reg %d in ",
3334 REGNO (XEXP (cond, 0)));
3335 fprintf(dump_file, "basic block %d\n", dest->index);
3337 count++;
3342 if (dump_file)
3343 fprintf (dump_file, "Found %d implicit sets\n", count);
3346 /* Perform one copy/constant propagation pass.
3347 PASS is the pass count. If CPROP_JUMPS is true, perform constant
3348 propagation into conditional jumps. If BYPASS_JUMPS is true,
3349 perform conditional jump bypassing optimizations. */
3351 static int
3352 one_cprop_pass (int pass, bool cprop_jumps, bool bypass_jumps)
3354 int changed = 0;
3356 global_const_prop_count = local_const_prop_count = 0;
3357 global_copy_prop_count = local_copy_prop_count = 0;
3359 if (cprop_jumps)
3360 local_cprop_pass (cprop_jumps);
3362 /* Determine implicit sets. */
3363 implicit_sets = XCNEWVEC (rtx, last_basic_block);
3364 find_implicit_sets ();
3366 alloc_hash_table (max_cuid, &set_hash_table, 1);
3367 compute_hash_table (&set_hash_table);
3369 /* Free implicit_sets before peak usage. */
3370 free (implicit_sets);
3371 implicit_sets = NULL;
3373 if (dump_file)
3374 dump_hash_table (dump_file, "SET", &set_hash_table);
3375 if (set_hash_table.n_elems > 0)
3377 alloc_cprop_mem (last_basic_block, set_hash_table.n_elems);
3378 compute_cprop_data ();
3379 changed = cprop (cprop_jumps);
3380 if (bypass_jumps)
3381 changed |= bypass_conditional_jumps ();
3382 free_cprop_mem ();
3385 free_hash_table (&set_hash_table);
3387 if (dump_file)
3389 fprintf (dump_file, "CPROP of %s, pass %d: %d bytes needed, ",
3390 current_function_name (), pass, bytes_used);
3391 fprintf (dump_file, "%d local const props, %d local copy props, ",
3392 local_const_prop_count, local_copy_prop_count);
3393 fprintf (dump_file, "%d global const props, %d global copy props\n\n",
3394 global_const_prop_count, global_copy_prop_count);
3396 /* Global analysis may get into infinite loops for unreachable blocks. */
3397 if (changed && cprop_jumps)
3398 delete_unreachable_blocks ();
3400 return changed;
3403 /* Bypass conditional jumps. */
3405 /* The value of last_basic_block at the beginning of the jump_bypass
3406 pass. The use of redirect_edge_and_branch_force may introduce new
3407 basic blocks, but the data flow analysis is only valid for basic
3408 block indices less than bypass_last_basic_block. */
3410 static int bypass_last_basic_block;
3412 /* Find a set of REGNO to a constant that is available at the end of basic
3413 block BB. Returns NULL if no such set is found. Based heavily upon
3414 find_avail_set. */
3416 static struct expr *
3417 find_bypass_set (int regno, int bb)
3419 struct expr *result = 0;
3421 for (;;)
3423 rtx src;
3424 struct expr *set = lookup_set (regno, &set_hash_table);
3426 while (set)
3428 if (TEST_BIT (cprop_avout[bb], set->bitmap_index))
3429 break;
3430 set = next_set (regno, set);
3433 if (set == 0)
3434 break;
3436 gcc_assert (GET_CODE (set->expr) == SET);
3438 src = SET_SRC (set->expr);
3439 if (gcse_constant_p (src))
3440 result = set;
3442 if (! REG_P (src))
3443 break;
3445 regno = REGNO (src);
3447 return result;
3451 /* Subroutine of bypass_block that checks whether a pseudo is killed by
3452 any of the instructions inserted on an edge. Jump bypassing places
3453 condition code setters on CFG edges using insert_insn_on_edge. This
3454 function is required to check that our data flow analysis is still
3455 valid prior to commit_edge_insertions. */
3457 static bool
3458 reg_killed_on_edge (const_rtx reg, const_edge e)
3460 rtx insn;
3462 for (insn = e->insns.r; insn; insn = NEXT_INSN (insn))
3463 if (INSN_P (insn) && reg_set_p (reg, insn))
3464 return true;
3466 return false;
3469 /* Subroutine of bypass_conditional_jumps that attempts to bypass the given
3470 basic block BB which has more than one predecessor. If not NULL, SETCC
3471 is the first instruction of BB, which is immediately followed by JUMP_INSN
3472 JUMP. Otherwise, SETCC is NULL, and JUMP is the first insn of BB.
3473 Returns nonzero if a change was made.
3475 During the jump bypassing pass, we may place copies of SETCC instructions
3476 on CFG edges. The following routine must be careful to pay attention to
3477 these inserted insns when performing its transformations. */
3479 static int
3480 bypass_block (basic_block bb, rtx setcc, rtx jump)
3482 rtx insn, note;
3483 edge e, edest;
3484 int i, change;
3485 int may_be_loop_header;
3486 unsigned removed_p;
3487 edge_iterator ei;
3489 insn = (setcc != NULL) ? setcc : jump;
3491 /* Determine set of register uses in INSN. */
3492 reg_use_count = 0;
3493 note_uses (&PATTERN (insn), find_used_regs, NULL);
3494 note = find_reg_equal_equiv_note (insn);
3495 if (note)
3496 find_used_regs (&XEXP (note, 0), NULL);
3498 may_be_loop_header = false;
3499 FOR_EACH_EDGE (e, ei, bb->preds)
3500 if (e->flags & EDGE_DFS_BACK)
3502 may_be_loop_header = true;
3503 break;
3506 change = 0;
3507 for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
3509 removed_p = 0;
3511 if (e->flags & EDGE_COMPLEX)
3513 ei_next (&ei);
3514 continue;
3517 /* We can't redirect edges from new basic blocks. */
3518 if (e->src->index >= bypass_last_basic_block)
3520 ei_next (&ei);
3521 continue;
3524 /* The irreducible loops created by redirecting of edges entering the
3525 loop from outside would decrease effectiveness of some of the following
3526 optimizations, so prevent this. */
3527 if (may_be_loop_header
3528 && !(e->flags & EDGE_DFS_BACK))
3530 ei_next (&ei);
3531 continue;
3534 for (i = 0; i < reg_use_count; i++)
3536 struct reg_use *reg_used = &reg_use_table[i];
3537 unsigned int regno = REGNO (reg_used->reg_rtx);
3538 basic_block dest, old_dest;
3539 struct expr *set;
3540 rtx src, new_rtx;
3542 if (regno >= max_gcse_regno)
3543 continue;
3545 set = find_bypass_set (regno, e->src->index);
3547 if (! set)
3548 continue;
3550 /* Check the data flow is valid after edge insertions. */
3551 if (e->insns.r && reg_killed_on_edge (reg_used->reg_rtx, e))
3552 continue;
3554 src = SET_SRC (pc_set (jump));
3556 if (setcc != NULL)
3557 src = simplify_replace_rtx (src,
3558 SET_DEST (PATTERN (setcc)),
3559 SET_SRC (PATTERN (setcc)));
3561 new_rtx = simplify_replace_rtx (src, reg_used->reg_rtx,
3562 SET_SRC (set->expr));
3564 /* Jump bypassing may have already placed instructions on
3565 edges of the CFG. We can't bypass an outgoing edge that
3566 has instructions associated with it, as these insns won't
3567 get executed if the incoming edge is redirected. */
3569 if (new_rtx == pc_rtx)
3571 edest = FALLTHRU_EDGE (bb);
3572 dest = edest->insns.r ? NULL : edest->dest;
3574 else if (GET_CODE (new_rtx) == LABEL_REF)
3576 dest = BLOCK_FOR_INSN (XEXP (new_rtx, 0));
3577 /* Don't bypass edges containing instructions. */
3578 edest = find_edge (bb, dest);
3579 if (edest && edest->insns.r)
3580 dest = NULL;
3582 else
3583 dest = NULL;
3585 /* Avoid unification of the edge with other edges from original
3586 branch. We would end up emitting the instruction on "both"
3587 edges. */
3589 if (dest && setcc && !CC0_P (SET_DEST (PATTERN (setcc)))
3590 && find_edge (e->src, dest))
3591 dest = NULL;
3593 old_dest = e->dest;
3594 if (dest != NULL
3595 && dest != old_dest
3596 && dest != EXIT_BLOCK_PTR)
3598 redirect_edge_and_branch_force (e, dest);
3600 /* Copy the register setter to the redirected edge.
3601 Don't copy CC0 setters, as CC0 is dead after jump. */
3602 if (setcc)
3604 rtx pat = PATTERN (setcc);
3605 if (!CC0_P (SET_DEST (pat)))
3606 insert_insn_on_edge (copy_insn (pat), e);
3609 if (dump_file != NULL)
3611 fprintf (dump_file, "JUMP-BYPASS: Proved reg %d "
3612 "in jump_insn %d equals constant ",
3613 regno, INSN_UID (jump));
3614 print_rtl (dump_file, SET_SRC (set->expr));
3615 fprintf (dump_file, "\nBypass edge from %d->%d to %d\n",
3616 e->src->index, old_dest->index, dest->index);
3618 change = 1;
3619 removed_p = 1;
3620 break;
3623 if (!removed_p)
3624 ei_next (&ei);
3626 return change;
3629 /* Find basic blocks with more than one predecessor that only contain a
3630 single conditional jump. If the result of the comparison is known at
3631 compile-time from any incoming edge, redirect that edge to the
3632 appropriate target. Returns nonzero if a change was made.
3634 This function is now mis-named, because we also handle indirect jumps. */
3636 static int
3637 bypass_conditional_jumps (void)
3639 basic_block bb;
3640 int changed;
3641 rtx setcc;
3642 rtx insn;
3643 rtx dest;
3645 /* Note we start at block 1. */
3646 if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
3647 return 0;
3649 bypass_last_basic_block = last_basic_block;
3650 mark_dfs_back_edges ();
3652 changed = 0;
3653 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb->next_bb,
3654 EXIT_BLOCK_PTR, next_bb)
3656 /* Check for more than one predecessor. */
3657 if (!single_pred_p (bb))
3659 setcc = NULL_RTX;
3660 FOR_BB_INSNS (bb, insn)
3661 if (NONJUMP_INSN_P (insn))
3663 if (setcc)
3664 break;
3665 if (GET_CODE (PATTERN (insn)) != SET)
3666 break;
3668 dest = SET_DEST (PATTERN (insn));
3669 if (REG_P (dest) || CC0_P (dest))
3670 setcc = insn;
3671 else
3672 break;
3674 else if (JUMP_P (insn))
3676 if ((any_condjump_p (insn) || computed_jump_p (insn))
3677 && onlyjump_p (insn))
3678 changed |= bypass_block (bb, setcc, insn);
3679 break;
3681 else if (INSN_P (insn))
3682 break;
3686 /* If we bypassed any register setting insns, we inserted a
3687 copy on the redirected edge. These need to be committed. */
3688 if (changed)
3689 commit_edge_insertions ();
3691 return changed;
3694 /* Compute PRE+LCM working variables. */
3696 /* Local properties of expressions. */
3697 /* Nonzero for expressions that are transparent in the block. */
3698 static sbitmap *transp;
3700 /* Nonzero for expressions that are transparent at the end of the block.
3701 This is only zero for expressions killed by abnormal critical edge
3702 created by a calls. */
3703 static sbitmap *transpout;
3705 /* Nonzero for expressions that are computed (available) in the block. */
3706 static sbitmap *comp;
3708 /* Nonzero for expressions that are locally anticipatable in the block. */
3709 static sbitmap *antloc;
3711 /* Nonzero for expressions where this block is an optimal computation
3712 point. */
3713 static sbitmap *pre_optimal;
3715 /* Nonzero for expressions which are redundant in a particular block. */
3716 static sbitmap *pre_redundant;
3718 /* Nonzero for expressions which should be inserted on a specific edge. */
3719 static sbitmap *pre_insert_map;
3721 /* Nonzero for expressions which should be deleted in a specific block. */
3722 static sbitmap *pre_delete_map;
3724 /* Contains the edge_list returned by pre_edge_lcm. */
3725 static struct edge_list *edge_list;
3727 /* Redundant insns. */
3728 static sbitmap pre_redundant_insns;
3730 /* Allocate vars used for PRE analysis. */
3732 static void
3733 alloc_pre_mem (int n_blocks, int n_exprs)
3735 transp = sbitmap_vector_alloc (n_blocks, n_exprs);
3736 comp = sbitmap_vector_alloc (n_blocks, n_exprs);
3737 antloc = sbitmap_vector_alloc (n_blocks, n_exprs);
3739 pre_optimal = NULL;
3740 pre_redundant = NULL;
3741 pre_insert_map = NULL;
3742 pre_delete_map = NULL;
3743 ae_kill = sbitmap_vector_alloc (n_blocks, n_exprs);
3745 /* pre_insert and pre_delete are allocated later. */
3748 /* Free vars used for PRE analysis. */
3750 static void
3751 free_pre_mem (void)
3753 sbitmap_vector_free (transp);
3754 sbitmap_vector_free (comp);
3756 /* ANTLOC and AE_KILL are freed just after pre_lcm finishes. */
3758 if (pre_optimal)
3759 sbitmap_vector_free (pre_optimal);
3760 if (pre_redundant)
3761 sbitmap_vector_free (pre_redundant);
3762 if (pre_insert_map)
3763 sbitmap_vector_free (pre_insert_map);
3764 if (pre_delete_map)
3765 sbitmap_vector_free (pre_delete_map);
3767 transp = comp = NULL;
3768 pre_optimal = pre_redundant = pre_insert_map = pre_delete_map = NULL;
3771 /* Top level routine to do the dataflow analysis needed by PRE. */
3773 static void
3774 compute_pre_data (void)
3776 sbitmap trapping_expr;
3777 basic_block bb;
3778 unsigned int ui;
3780 compute_local_properties (transp, comp, antloc, &expr_hash_table);
3781 sbitmap_vector_zero (ae_kill, last_basic_block);
3783 /* Collect expressions which might trap. */
3784 trapping_expr = sbitmap_alloc (expr_hash_table.n_elems);
3785 sbitmap_zero (trapping_expr);
3786 for (ui = 0; ui < expr_hash_table.size; ui++)
3788 struct expr *e;
3789 for (e = expr_hash_table.table[ui]; e != NULL; e = e->next_same_hash)
3790 if (may_trap_p (e->expr))
3791 SET_BIT (trapping_expr, e->bitmap_index);
3794 /* Compute ae_kill for each basic block using:
3796 ~(TRANSP | COMP)
3799 FOR_EACH_BB (bb)
3801 edge e;
3802 edge_iterator ei;
3804 /* If the current block is the destination of an abnormal edge, we
3805 kill all trapping expressions because we won't be able to properly
3806 place the instruction on the edge. So make them neither
3807 anticipatable nor transparent. This is fairly conservative. */
3808 FOR_EACH_EDGE (e, ei, bb->preds)
3809 if (e->flags & EDGE_ABNORMAL)
3811 sbitmap_difference (antloc[bb->index], antloc[bb->index], trapping_expr);
3812 sbitmap_difference (transp[bb->index], transp[bb->index], trapping_expr);
3813 break;
3816 sbitmap_a_or_b (ae_kill[bb->index], transp[bb->index], comp[bb->index]);
3817 sbitmap_not (ae_kill[bb->index], ae_kill[bb->index]);
3820 edge_list = pre_edge_lcm (expr_hash_table.n_elems, transp, comp, antloc,
3821 ae_kill, &pre_insert_map, &pre_delete_map);
3822 sbitmap_vector_free (antloc);
3823 antloc = NULL;
3824 sbitmap_vector_free (ae_kill);
3825 ae_kill = NULL;
3826 sbitmap_free (trapping_expr);
3829 /* PRE utilities */
3831 /* Return nonzero if an occurrence of expression EXPR in OCCR_BB would reach
3832 block BB.
3834 VISITED is a pointer to a working buffer for tracking which BB's have
3835 been visited. It is NULL for the top-level call.
3837 We treat reaching expressions that go through blocks containing the same
3838 reaching expression as "not reaching". E.g. if EXPR is generated in blocks
3839 2 and 3, INSN is in block 4, and 2->3->4, we treat the expression in block
3840 2 as not reaching. The intent is to improve the probability of finding
3841 only one reaching expression and to reduce register lifetimes by picking
3842 the closest such expression. */
3844 static int
3845 pre_expr_reaches_here_p_work (basic_block occr_bb, struct expr *expr, basic_block bb, char *visited)
3847 edge pred;
3848 edge_iterator ei;
3850 FOR_EACH_EDGE (pred, ei, bb->preds)
3852 basic_block pred_bb = pred->src;
3854 if (pred->src == ENTRY_BLOCK_PTR
3855 /* Has predecessor has already been visited? */
3856 || visited[pred_bb->index])
3857 ;/* Nothing to do. */
3859 /* Does this predecessor generate this expression? */
3860 else if (TEST_BIT (comp[pred_bb->index], expr->bitmap_index))
3862 /* Is this the occurrence we're looking for?
3863 Note that there's only one generating occurrence per block
3864 so we just need to check the block number. */
3865 if (occr_bb == pred_bb)
3866 return 1;
3868 visited[pred_bb->index] = 1;
3870 /* Ignore this predecessor if it kills the expression. */
3871 else if (! TEST_BIT (transp[pred_bb->index], expr->bitmap_index))
3872 visited[pred_bb->index] = 1;
3874 /* Neither gen nor kill. */
3875 else
3877 visited[pred_bb->index] = 1;
3878 if (pre_expr_reaches_here_p_work (occr_bb, expr, pred_bb, visited))
3879 return 1;
3883 /* All paths have been checked. */
3884 return 0;
3887 /* The wrapper for pre_expr_reaches_here_work that ensures that any
3888 memory allocated for that function is returned. */
3890 static int
3891 pre_expr_reaches_here_p (basic_block occr_bb, struct expr *expr, basic_block bb)
3893 int rval;
3894 char *visited = XCNEWVEC (char, last_basic_block);
3896 rval = pre_expr_reaches_here_p_work (occr_bb, expr, bb, visited);
3898 free (visited);
3899 return rval;
3903 /* Given an expr, generate RTL which we can insert at the end of a BB,
3904 or on an edge. Set the block number of any insns generated to
3905 the value of BB. */
3907 static rtx
3908 process_insert_insn (struct expr *expr)
3910 rtx reg = expr->reaching_reg;
3911 rtx exp = copy_rtx (expr->expr);
3912 rtx pat;
3914 start_sequence ();
3916 /* If the expression is something that's an operand, like a constant,
3917 just copy it to a register. */
3918 if (general_operand (exp, GET_MODE (reg)))
3919 emit_move_insn (reg, exp);
3921 /* Otherwise, make a new insn to compute this expression and make sure the
3922 insn will be recognized (this also adds any needed CLOBBERs). Copy the
3923 expression to make sure we don't have any sharing issues. */
3924 else
3926 rtx insn = emit_insn (gen_rtx_SET (VOIDmode, reg, exp));
3928 if (insn_invalid_p (insn))
3929 gcc_unreachable ();
3933 pat = get_insns ();
3934 end_sequence ();
3936 return pat;
3939 /* Add EXPR to the end of basic block BB.
3941 This is used by both the PRE and code hoisting.
3943 For PRE, we want to verify that the expr is either transparent
3944 or locally anticipatable in the target block. This check makes
3945 no sense for code hoisting. */
3947 static void
3948 insert_insn_end_basic_block (struct expr *expr, basic_block bb, int pre)
3950 rtx insn = BB_END (bb);
3951 rtx new_insn;
3952 rtx reg = expr->reaching_reg;
3953 int regno = REGNO (reg);
3954 rtx pat, pat_end;
3956 pat = process_insert_insn (expr);
3957 gcc_assert (pat && INSN_P (pat));
3959 pat_end = pat;
3960 while (NEXT_INSN (pat_end) != NULL_RTX)
3961 pat_end = NEXT_INSN (pat_end);
3963 /* If the last insn is a jump, insert EXPR in front [taking care to
3964 handle cc0, etc. properly]. Similarly we need to care trapping
3965 instructions in presence of non-call exceptions. */
3967 if (JUMP_P (insn)
3968 || (NONJUMP_INSN_P (insn)
3969 && (!single_succ_p (bb)
3970 || single_succ_edge (bb)->flags & EDGE_ABNORMAL)))
3972 #ifdef HAVE_cc0
3973 rtx note;
3974 #endif
3975 /* It should always be the case that we can put these instructions
3976 anywhere in the basic block with performing PRE optimizations.
3977 Check this. */
3978 gcc_assert (!NONJUMP_INSN_P (insn) || !pre
3979 || TEST_BIT (antloc[bb->index], expr->bitmap_index)
3980 || TEST_BIT (transp[bb->index], expr->bitmap_index));
3982 /* If this is a jump table, then we can't insert stuff here. Since
3983 we know the previous real insn must be the tablejump, we insert
3984 the new instruction just before the tablejump. */
3985 if (GET_CODE (PATTERN (insn)) == ADDR_VEC
3986 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
3987 insn = prev_real_insn (insn);
3989 #ifdef HAVE_cc0
3990 /* FIXME: 'twould be nice to call prev_cc0_setter here but it aborts
3991 if cc0 isn't set. */
3992 note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
3993 if (note)
3994 insn = XEXP (note, 0);
3995 else
3997 rtx maybe_cc0_setter = prev_nonnote_insn (insn);
3998 if (maybe_cc0_setter
3999 && INSN_P (maybe_cc0_setter)
4000 && sets_cc0_p (PATTERN (maybe_cc0_setter)))
4001 insn = maybe_cc0_setter;
4003 #endif
4004 /* FIXME: What if something in cc0/jump uses value set in new insn? */
4005 new_insn = emit_insn_before_noloc (pat, insn, bb);
4008 /* Likewise if the last insn is a call, as will happen in the presence
4009 of exception handling. */
4010 else if (CALL_P (insn)
4011 && (!single_succ_p (bb)
4012 || single_succ_edge (bb)->flags & EDGE_ABNORMAL))
4014 /* Keeping in mind SMALL_REGISTER_CLASSES and parameters in registers,
4015 we search backward and place the instructions before the first
4016 parameter is loaded. Do this for everyone for consistency and a
4017 presumption that we'll get better code elsewhere as well.
4019 It should always be the case that we can put these instructions
4020 anywhere in the basic block with performing PRE optimizations.
4021 Check this. */
4023 gcc_assert (!pre
4024 || TEST_BIT (antloc[bb->index], expr->bitmap_index)
4025 || TEST_BIT (transp[bb->index], expr->bitmap_index));
4027 /* Since different machines initialize their parameter registers
4028 in different orders, assume nothing. Collect the set of all
4029 parameter registers. */
4030 insn = find_first_parameter_load (insn, BB_HEAD (bb));
4032 /* If we found all the parameter loads, then we want to insert
4033 before the first parameter load.
4035 If we did not find all the parameter loads, then we might have
4036 stopped on the head of the block, which could be a CODE_LABEL.
4037 If we inserted before the CODE_LABEL, then we would be putting
4038 the insn in the wrong basic block. In that case, put the insn
4039 after the CODE_LABEL. Also, respect NOTE_INSN_BASIC_BLOCK. */
4040 while (LABEL_P (insn)
4041 || NOTE_INSN_BASIC_BLOCK_P (insn))
4042 insn = NEXT_INSN (insn);
4044 new_insn = emit_insn_before_noloc (pat, insn, bb);
4046 else
4047 new_insn = emit_insn_after_noloc (pat, insn, bb);
4049 while (1)
4051 if (INSN_P (pat))
4053 add_label_notes (PATTERN (pat), new_insn);
4054 note_stores (PATTERN (pat), record_set_info, pat);
4056 if (pat == pat_end)
4057 break;
4058 pat = NEXT_INSN (pat);
4061 gcse_create_count++;
4063 if (dump_file)
4065 fprintf (dump_file, "PRE/HOIST: end of bb %d, insn %d, ",
4066 bb->index, INSN_UID (new_insn));
4067 fprintf (dump_file, "copying expression %d to reg %d\n",
4068 expr->bitmap_index, regno);
4072 /* Insert partially redundant expressions on edges in the CFG to make
4073 the expressions fully redundant. */
4075 static int
4076 pre_edge_insert (struct edge_list *edge_list, struct expr **index_map)
4078 int e, i, j, num_edges, set_size, did_insert = 0;
4079 sbitmap *inserted;
4081 /* Where PRE_INSERT_MAP is nonzero, we add the expression on that edge
4082 if it reaches any of the deleted expressions. */
4084 set_size = pre_insert_map[0]->size;
4085 num_edges = NUM_EDGES (edge_list);
4086 inserted = sbitmap_vector_alloc (num_edges, expr_hash_table.n_elems);
4087 sbitmap_vector_zero (inserted, num_edges);
4089 for (e = 0; e < num_edges; e++)
4091 int indx;
4092 basic_block bb = INDEX_EDGE_PRED_BB (edge_list, e);
4094 for (i = indx = 0; i < set_size; i++, indx += SBITMAP_ELT_BITS)
4096 SBITMAP_ELT_TYPE insert = pre_insert_map[e]->elms[i];
4098 for (j = indx; insert && j < (int) expr_hash_table.n_elems; j++, insert >>= 1)
4099 if ((insert & 1) != 0 && index_map[j]->reaching_reg != NULL_RTX)
4101 struct expr *expr = index_map[j];
4102 struct occr *occr;
4104 /* Now look at each deleted occurrence of this expression. */
4105 for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
4107 if (! occr->deleted_p)
4108 continue;
4110 /* Insert this expression on this edge if it would
4111 reach the deleted occurrence in BB. */
4112 if (!TEST_BIT (inserted[e], j))
4114 rtx insn;
4115 edge eg = INDEX_EDGE (edge_list, e);
4117 /* We can't insert anything on an abnormal and
4118 critical edge, so we insert the insn at the end of
4119 the previous block. There are several alternatives
4120 detailed in Morgans book P277 (sec 10.5) for
4121 handling this situation. This one is easiest for
4122 now. */
4124 if (eg->flags & EDGE_ABNORMAL)
4125 insert_insn_end_basic_block (index_map[j], bb, 0);
4126 else
4128 insn = process_insert_insn (index_map[j]);
4129 insert_insn_on_edge (insn, eg);
4132 if (dump_file)
4134 fprintf (dump_file, "PRE/HOIST: edge (%d,%d), ",
4135 bb->index,
4136 INDEX_EDGE_SUCC_BB (edge_list, e)->index);
4137 fprintf (dump_file, "copy expression %d\n",
4138 expr->bitmap_index);
4141 update_ld_motion_stores (expr);
4142 SET_BIT (inserted[e], j);
4143 did_insert = 1;
4144 gcse_create_count++;
4151 sbitmap_vector_free (inserted);
4152 return did_insert;
4155 /* Copy the result of EXPR->EXPR generated by INSN to EXPR->REACHING_REG.
4156 Given "old_reg <- expr" (INSN), instead of adding after it
4157 reaching_reg <- old_reg
4158 it's better to do the following:
4159 reaching_reg <- expr
4160 old_reg <- reaching_reg
4161 because this way copy propagation can discover additional PRE
4162 opportunities. But if this fails, we try the old way.
4163 When "expr" is a store, i.e.
4164 given "MEM <- old_reg", instead of adding after it
4165 reaching_reg <- old_reg
4166 it's better to add it before as follows:
4167 reaching_reg <- old_reg
4168 MEM <- reaching_reg. */
4170 static void
4171 pre_insert_copy_insn (struct expr *expr, rtx insn)
4173 rtx reg = expr->reaching_reg;
4174 int regno = REGNO (reg);
4175 int indx = expr->bitmap_index;
4176 rtx pat = PATTERN (insn);
4177 rtx set, first_set, new_insn;
4178 rtx old_reg;
4179 int i;
4181 /* This block matches the logic in hash_scan_insn. */
4182 switch (GET_CODE (pat))
4184 case SET:
4185 set = pat;
4186 break;
4188 case PARALLEL:
4189 /* Search through the parallel looking for the set whose
4190 source was the expression that we're interested in. */
4191 first_set = NULL_RTX;
4192 set = NULL_RTX;
4193 for (i = 0; i < XVECLEN (pat, 0); i++)
4195 rtx x = XVECEXP (pat, 0, i);
4196 if (GET_CODE (x) == SET)
4198 /* If the source was a REG_EQUAL or REG_EQUIV note, we
4199 may not find an equivalent expression, but in this
4200 case the PARALLEL will have a single set. */
4201 if (first_set == NULL_RTX)
4202 first_set = x;
4203 if (expr_equiv_p (SET_SRC (x), expr->expr))
4205 set = x;
4206 break;
4211 gcc_assert (first_set);
4212 if (set == NULL_RTX)
4213 set = first_set;
4214 break;
4216 default:
4217 gcc_unreachable ();
4220 if (REG_P (SET_DEST (set)))
4222 old_reg = SET_DEST (set);
4223 /* Check if we can modify the set destination in the original insn. */
4224 if (validate_change (insn, &SET_DEST (set), reg, 0))
4226 new_insn = gen_move_insn (old_reg, reg);
4227 new_insn = emit_insn_after (new_insn, insn);
4229 /* Keep register set table up to date. */
4230 record_one_set (regno, insn);
4232 else
4234 new_insn = gen_move_insn (reg, old_reg);
4235 new_insn = emit_insn_after (new_insn, insn);
4237 /* Keep register set table up to date. */
4238 record_one_set (regno, new_insn);
4241 else /* This is possible only in case of a store to memory. */
4243 old_reg = SET_SRC (set);
4244 new_insn = gen_move_insn (reg, old_reg);
4246 /* Check if we can modify the set source in the original insn. */
4247 if (validate_change (insn, &SET_SRC (set), reg, 0))
4248 new_insn = emit_insn_before (new_insn, insn);
4249 else
4250 new_insn = emit_insn_after (new_insn, insn);
4252 /* Keep register set table up to date. */
4253 record_one_set (regno, new_insn);
4256 gcse_create_count++;
4258 if (dump_file)
4259 fprintf (dump_file,
4260 "PRE: bb %d, insn %d, copy expression %d in insn %d to reg %d\n",
4261 BLOCK_NUM (insn), INSN_UID (new_insn), indx,
4262 INSN_UID (insn), regno);
4265 /* Copy available expressions that reach the redundant expression
4266 to `reaching_reg'. */
4268 static void
4269 pre_insert_copies (void)
4271 unsigned int i, added_copy;
4272 struct expr *expr;
4273 struct occr *occr;
4274 struct occr *avail;
4276 /* For each available expression in the table, copy the result to
4277 `reaching_reg' if the expression reaches a deleted one.
4279 ??? The current algorithm is rather brute force.
4280 Need to do some profiling. */
4282 for (i = 0; i < expr_hash_table.size; i++)
4283 for (expr = expr_hash_table.table[i]; expr != NULL; expr = expr->next_same_hash)
4285 /* If the basic block isn't reachable, PPOUT will be TRUE. However,
4286 we don't want to insert a copy here because the expression may not
4287 really be redundant. So only insert an insn if the expression was
4288 deleted. This test also avoids further processing if the
4289 expression wasn't deleted anywhere. */
4290 if (expr->reaching_reg == NULL)
4291 continue;
4293 /* Set when we add a copy for that expression. */
4294 added_copy = 0;
4296 for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
4298 if (! occr->deleted_p)
4299 continue;
4301 for (avail = expr->avail_occr; avail != NULL; avail = avail->next)
4303 rtx insn = avail->insn;
4305 /* No need to handle this one if handled already. */
4306 if (avail->copied_p)
4307 continue;
4309 /* Don't handle this one if it's a redundant one. */
4310 if (TEST_BIT (pre_redundant_insns, INSN_CUID (insn)))
4311 continue;
4313 /* Or if the expression doesn't reach the deleted one. */
4314 if (! pre_expr_reaches_here_p (BLOCK_FOR_INSN (avail->insn),
4315 expr,
4316 BLOCK_FOR_INSN (occr->insn)))
4317 continue;
4319 added_copy = 1;
4321 /* Copy the result of avail to reaching_reg. */
4322 pre_insert_copy_insn (expr, insn);
4323 avail->copied_p = 1;
4327 if (added_copy)
4328 update_ld_motion_stores (expr);
4332 /* Emit move from SRC to DEST noting the equivalence with expression computed
4333 in INSN. */
4334 static rtx
4335 gcse_emit_move_after (rtx src, rtx dest, rtx insn)
4337 rtx new_rtx;
4338 rtx set = single_set (insn), set2;
4339 rtx note;
4340 rtx eqv;
4342 /* This should never fail since we're creating a reg->reg copy
4343 we've verified to be valid. */
4345 new_rtx = emit_insn_after (gen_move_insn (dest, src), insn);
4347 /* Note the equivalence for local CSE pass. */
4348 set2 = single_set (new_rtx);
4349 if (!set2 || !rtx_equal_p (SET_DEST (set2), dest))
4350 return new_rtx;
4351 if ((note = find_reg_equal_equiv_note (insn)))
4352 eqv = XEXP (note, 0);
4353 else
4354 eqv = SET_SRC (set);
4356 set_unique_reg_note (new_rtx, REG_EQUAL, copy_insn_1 (eqv));
4358 return new_rtx;
4361 /* Delete redundant computations.
4362 Deletion is done by changing the insn to copy the `reaching_reg' of
4363 the expression into the result of the SET. It is left to later passes
4364 (cprop, cse2, flow, combine, regmove) to propagate the copy or eliminate it.
4366 Returns nonzero if a change is made. */
4368 static int
4369 pre_delete (void)
4371 unsigned int i;
4372 int changed;
4373 struct expr *expr;
4374 struct occr *occr;
4376 changed = 0;
4377 for (i = 0; i < expr_hash_table.size; i++)
4378 for (expr = expr_hash_table.table[i];
4379 expr != NULL;
4380 expr = expr->next_same_hash)
4382 int indx = expr->bitmap_index;
4384 /* We only need to search antic_occr since we require
4385 ANTLOC != 0. */
4387 for (occr = expr->antic_occr; occr != NULL; occr = occr->next)
4389 rtx insn = occr->insn;
4390 rtx set;
4391 basic_block bb = BLOCK_FOR_INSN (insn);
4393 /* We only delete insns that have a single_set. */
4394 if (TEST_BIT (pre_delete_map[bb->index], indx)
4395 && (set = single_set (insn)) != 0
4396 && dbg_cnt (pre_insn))
4398 /* Create a pseudo-reg to store the result of reaching
4399 expressions into. Get the mode for the new pseudo from
4400 the mode of the original destination pseudo. */
4401 if (expr->reaching_reg == NULL)
4402 expr->reaching_reg = gen_reg_rtx_and_attrs (SET_DEST (set));
4404 gcse_emit_move_after (expr->reaching_reg, SET_DEST (set), insn);
4405 delete_insn (insn);
4406 occr->deleted_p = 1;
4407 SET_BIT (pre_redundant_insns, INSN_CUID (insn));
4408 changed = 1;
4409 gcse_subst_count++;
4411 if (dump_file)
4413 fprintf (dump_file,
4414 "PRE: redundant insn %d (expression %d) in ",
4415 INSN_UID (insn), indx);
4416 fprintf (dump_file, "bb %d, reaching reg is %d\n",
4417 bb->index, REGNO (expr->reaching_reg));
4423 return changed;
4426 /* Perform GCSE optimizations using PRE.
4427 This is called by one_pre_gcse_pass after all the dataflow analysis
4428 has been done.
4430 This is based on the original Morel-Renvoise paper Fred Chow's thesis, and
4431 lazy code motion from Knoop, Ruthing and Steffen as described in Advanced
4432 Compiler Design and Implementation.
4434 ??? A new pseudo reg is created to hold the reaching expression. The nice
4435 thing about the classical approach is that it would try to use an existing
4436 reg. If the register can't be adequately optimized [i.e. we introduce
4437 reload problems], one could add a pass here to propagate the new register
4438 through the block.
4440 ??? We don't handle single sets in PARALLELs because we're [currently] not
4441 able to copy the rest of the parallel when we insert copies to create full
4442 redundancies from partial redundancies. However, there's no reason why we
4443 can't handle PARALLELs in the cases where there are no partial
4444 redundancies. */
4446 static int
4447 pre_gcse (void)
4449 unsigned int i;
4450 int did_insert, changed;
4451 struct expr **index_map;
4452 struct expr *expr;
4454 /* Compute a mapping from expression number (`bitmap_index') to
4455 hash table entry. */
4457 index_map = XCNEWVEC (struct expr *, expr_hash_table.n_elems);
4458 for (i = 0; i < expr_hash_table.size; i++)
4459 for (expr = expr_hash_table.table[i]; expr != NULL; expr = expr->next_same_hash)
4460 index_map[expr->bitmap_index] = expr;
4462 /* Reset bitmap used to track which insns are redundant. */
4463 pre_redundant_insns = sbitmap_alloc (max_cuid);
4464 sbitmap_zero (pre_redundant_insns);
4466 /* Delete the redundant insns first so that
4467 - we know what register to use for the new insns and for the other
4468 ones with reaching expressions
4469 - we know which insns are redundant when we go to create copies */
4471 changed = pre_delete ();
4472 did_insert = pre_edge_insert (edge_list, index_map);
4474 /* In other places with reaching expressions, copy the expression to the
4475 specially allocated pseudo-reg that reaches the redundant expr. */
4476 pre_insert_copies ();
4477 if (did_insert)
4479 commit_edge_insertions ();
4480 changed = 1;
4483 free (index_map);
4484 sbitmap_free (pre_redundant_insns);
4485 return changed;
4488 /* Top level routine to perform one PRE GCSE pass.
4490 Return nonzero if a change was made. */
4492 static int
4493 one_pre_gcse_pass (int pass)
4495 int changed = 0;
4497 gcse_subst_count = 0;
4498 gcse_create_count = 0;
4500 alloc_hash_table (max_cuid, &expr_hash_table, 0);
4501 add_noreturn_fake_exit_edges ();
4502 if (flag_gcse_lm)
4503 compute_ld_motion_mems ();
4505 compute_hash_table (&expr_hash_table);
4506 trim_ld_motion_mems ();
4507 if (dump_file)
4508 dump_hash_table (dump_file, "Expression", &expr_hash_table);
4510 if (expr_hash_table.n_elems > 0)
4512 alloc_pre_mem (last_basic_block, expr_hash_table.n_elems);
4513 compute_pre_data ();
4514 changed |= pre_gcse ();
4515 free_edge_list (edge_list);
4516 free_pre_mem ();
4519 free_ldst_mems ();
4520 remove_fake_exit_edges ();
4521 free_hash_table (&expr_hash_table);
4523 if (dump_file)
4525 fprintf (dump_file, "\nPRE GCSE of %s, pass %d: %d bytes needed, ",
4526 current_function_name (), pass, bytes_used);
4527 fprintf (dump_file, "%d substs, %d insns created\n",
4528 gcse_subst_count, gcse_create_count);
4531 return changed;
4534 /* If X contains any LABEL_REF's, add REG_LABEL_OPERAND notes for them
4535 to INSN. If such notes are added to an insn which references a
4536 CODE_LABEL, the LABEL_NUSES count is incremented. We have to add
4537 that note, because the following loop optimization pass requires
4538 them. */
4540 /* ??? If there was a jump optimization pass after gcse and before loop,
4541 then we would not need to do this here, because jump would add the
4542 necessary REG_LABEL_OPERAND and REG_LABEL_TARGET notes. */
4544 static void
4545 add_label_notes (rtx x, rtx insn)
4547 enum rtx_code code = GET_CODE (x);
4548 int i, j;
4549 const char *fmt;
4551 if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
4553 /* This code used to ignore labels that referred to dispatch tables to
4554 avoid flow generating (slightly) worse code.
4556 We no longer ignore such label references (see LABEL_REF handling in
4557 mark_jump_label for additional information). */
4559 /* There's no reason for current users to emit jump-insns with
4560 such a LABEL_REF, so we don't have to handle REG_LABEL_TARGET
4561 notes. */
4562 gcc_assert (!JUMP_P (insn));
4563 add_reg_note (insn, REG_LABEL_OPERAND, XEXP (x, 0));
4565 if (LABEL_P (XEXP (x, 0)))
4566 LABEL_NUSES (XEXP (x, 0))++;
4568 return;
4571 for (i = GET_RTX_LENGTH (code) - 1, fmt = GET_RTX_FORMAT (code); i >= 0; i--)
4573 if (fmt[i] == 'e')
4574 add_label_notes (XEXP (x, i), insn);
4575 else if (fmt[i] == 'E')
4576 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
4577 add_label_notes (XVECEXP (x, i, j), insn);
4581 /* Compute transparent outgoing information for each block.
4583 An expression is transparent to an edge unless it is killed by
4584 the edge itself. This can only happen with abnormal control flow,
4585 when the edge is traversed through a call. This happens with
4586 non-local labels and exceptions.
4588 This would not be necessary if we split the edge. While this is
4589 normally impossible for abnormal critical edges, with some effort
4590 it should be possible with exception handling, since we still have
4591 control over which handler should be invoked. But due to increased
4592 EH table sizes, this may not be worthwhile. */
4594 static void
4595 compute_transpout (void)
4597 basic_block bb;
4598 unsigned int i;
4599 struct expr *expr;
4601 sbitmap_vector_ones (transpout, last_basic_block);
4603 FOR_EACH_BB (bb)
4605 /* Note that flow inserted a nop at the end of basic blocks that
4606 end in call instructions for reasons other than abnormal
4607 control flow. */
4608 if (! CALL_P (BB_END (bb)))
4609 continue;
4611 for (i = 0; i < expr_hash_table.size; i++)
4612 for (expr = expr_hash_table.table[i]; expr ; expr = expr->next_same_hash)
4613 if (MEM_P (expr->expr))
4615 if (GET_CODE (XEXP (expr->expr, 0)) == SYMBOL_REF
4616 && CONSTANT_POOL_ADDRESS_P (XEXP (expr->expr, 0)))
4617 continue;
4619 /* ??? Optimally, we would use interprocedural alias
4620 analysis to determine if this mem is actually killed
4621 by this call. */
4622 RESET_BIT (transpout[bb->index], expr->bitmap_index);
4627 /* Code Hoisting variables and subroutines. */
4629 /* Very busy expressions. */
4630 static sbitmap *hoist_vbein;
4631 static sbitmap *hoist_vbeout;
4633 /* Hoistable expressions. */
4634 static sbitmap *hoist_exprs;
4636 /* ??? We could compute post dominators and run this algorithm in
4637 reverse to perform tail merging, doing so would probably be
4638 more effective than the tail merging code in jump.c.
4640 It's unclear if tail merging could be run in parallel with
4641 code hoisting. It would be nice. */
4643 /* Allocate vars used for code hoisting analysis. */
4645 static void
4646 alloc_code_hoist_mem (int n_blocks, int n_exprs)
4648 antloc = sbitmap_vector_alloc (n_blocks, n_exprs);
4649 transp = sbitmap_vector_alloc (n_blocks, n_exprs);
4650 comp = sbitmap_vector_alloc (n_blocks, n_exprs);
4652 hoist_vbein = sbitmap_vector_alloc (n_blocks, n_exprs);
4653 hoist_vbeout = sbitmap_vector_alloc (n_blocks, n_exprs);
4654 hoist_exprs = sbitmap_vector_alloc (n_blocks, n_exprs);
4655 transpout = sbitmap_vector_alloc (n_blocks, n_exprs);
4658 /* Free vars used for code hoisting analysis. */
4660 static void
4661 free_code_hoist_mem (void)
4663 sbitmap_vector_free (antloc);
4664 sbitmap_vector_free (transp);
4665 sbitmap_vector_free (comp);
4667 sbitmap_vector_free (hoist_vbein);
4668 sbitmap_vector_free (hoist_vbeout);
4669 sbitmap_vector_free (hoist_exprs);
4670 sbitmap_vector_free (transpout);
4672 free_dominance_info (CDI_DOMINATORS);
4675 /* Compute the very busy expressions at entry/exit from each block.
4677 An expression is very busy if all paths from a given point
4678 compute the expression. */
4680 static void
4681 compute_code_hoist_vbeinout (void)
4683 int changed, passes;
4684 basic_block bb;
4686 sbitmap_vector_zero (hoist_vbeout, last_basic_block);
4687 sbitmap_vector_zero (hoist_vbein, last_basic_block);
4689 passes = 0;
4690 changed = 1;
4692 while (changed)
4694 changed = 0;
4696 /* We scan the blocks in the reverse order to speed up
4697 the convergence. */
4698 FOR_EACH_BB_REVERSE (bb)
4700 if (bb->next_bb != EXIT_BLOCK_PTR)
4701 sbitmap_intersection_of_succs (hoist_vbeout[bb->index],
4702 hoist_vbein, bb->index);
4704 changed |= sbitmap_a_or_b_and_c_cg (hoist_vbein[bb->index],
4705 antloc[bb->index],
4706 hoist_vbeout[bb->index],
4707 transp[bb->index]);
4710 passes++;
4713 if (dump_file)
4714 fprintf (dump_file, "hoisting vbeinout computation: %d passes\n", passes);
4717 /* Top level routine to do the dataflow analysis needed by code hoisting. */
4719 static void
4720 compute_code_hoist_data (void)
4722 compute_local_properties (transp, comp, antloc, &expr_hash_table);
4723 compute_transpout ();
4724 compute_code_hoist_vbeinout ();
4725 calculate_dominance_info (CDI_DOMINATORS);
4726 if (dump_file)
4727 fprintf (dump_file, "\n");
4730 /* Determine if the expression identified by EXPR_INDEX would
4731 reach BB unimpared if it was placed at the end of EXPR_BB.
4733 It's unclear exactly what Muchnick meant by "unimpared". It seems
4734 to me that the expression must either be computed or transparent in
4735 *every* block in the path(s) from EXPR_BB to BB. Any other definition
4736 would allow the expression to be hoisted out of loops, even if
4737 the expression wasn't a loop invariant.
4739 Contrast this to reachability for PRE where an expression is
4740 considered reachable if *any* path reaches instead of *all*
4741 paths. */
4743 static int
4744 hoist_expr_reaches_here_p (basic_block expr_bb, int expr_index, basic_block bb, char *visited)
4746 edge pred;
4747 edge_iterator ei;
4748 int visited_allocated_locally = 0;
4751 if (visited == NULL)
4753 visited_allocated_locally = 1;
4754 visited = XCNEWVEC (char, last_basic_block);
4757 FOR_EACH_EDGE (pred, ei, bb->preds)
4759 basic_block pred_bb = pred->src;
4761 if (pred->src == ENTRY_BLOCK_PTR)
4762 break;
4763 else if (pred_bb == expr_bb)
4764 continue;
4765 else if (visited[pred_bb->index])
4766 continue;
4768 /* Does this predecessor generate this expression? */
4769 else if (TEST_BIT (comp[pred_bb->index], expr_index))
4770 break;
4771 else if (! TEST_BIT (transp[pred_bb->index], expr_index))
4772 break;
4774 /* Not killed. */
4775 else
4777 visited[pred_bb->index] = 1;
4778 if (! hoist_expr_reaches_here_p (expr_bb, expr_index,
4779 pred_bb, visited))
4780 break;
4783 if (visited_allocated_locally)
4784 free (visited);
4786 return (pred == NULL);
4789 /* Actually perform code hoisting. */
4791 static void
4792 hoist_code (void)
4794 basic_block bb, dominated;
4795 VEC (basic_block, heap) *domby;
4796 unsigned int i,j;
4797 struct expr **index_map;
4798 struct expr *expr;
4800 sbitmap_vector_zero (hoist_exprs, last_basic_block);
4802 /* Compute a mapping from expression number (`bitmap_index') to
4803 hash table entry. */
4805 index_map = XCNEWVEC (struct expr *, expr_hash_table.n_elems);
4806 for (i = 0; i < expr_hash_table.size; i++)
4807 for (expr = expr_hash_table.table[i]; expr != NULL; expr = expr->next_same_hash)
4808 index_map[expr->bitmap_index] = expr;
4810 /* Walk over each basic block looking for potentially hoistable
4811 expressions, nothing gets hoisted from the entry block. */
4812 FOR_EACH_BB (bb)
4814 int found = 0;
4815 int insn_inserted_p;
4817 domby = get_dominated_by (CDI_DOMINATORS, bb);
4818 /* Examine each expression that is very busy at the exit of this
4819 block. These are the potentially hoistable expressions. */
4820 for (i = 0; i < hoist_vbeout[bb->index]->n_bits; i++)
4822 int hoistable = 0;
4824 if (TEST_BIT (hoist_vbeout[bb->index], i)
4825 && TEST_BIT (transpout[bb->index], i))
4827 /* We've found a potentially hoistable expression, now
4828 we look at every block BB dominates to see if it
4829 computes the expression. */
4830 for (j = 0; VEC_iterate (basic_block, domby, j, dominated); j++)
4832 /* Ignore self dominance. */
4833 if (bb == dominated)
4834 continue;
4835 /* We've found a dominated block, now see if it computes
4836 the busy expression and whether or not moving that
4837 expression to the "beginning" of that block is safe. */
4838 if (!TEST_BIT (antloc[dominated->index], i))
4839 continue;
4841 /* Note if the expression would reach the dominated block
4842 unimpared if it was placed at the end of BB.
4844 Keep track of how many times this expression is hoistable
4845 from a dominated block into BB. */
4846 if (hoist_expr_reaches_here_p (bb, i, dominated, NULL))
4847 hoistable++;
4850 /* If we found more than one hoistable occurrence of this
4851 expression, then note it in the bitmap of expressions to
4852 hoist. It makes no sense to hoist things which are computed
4853 in only one BB, and doing so tends to pessimize register
4854 allocation. One could increase this value to try harder
4855 to avoid any possible code expansion due to register
4856 allocation issues; however experiments have shown that
4857 the vast majority of hoistable expressions are only movable
4858 from two successors, so raising this threshold is likely
4859 to nullify any benefit we get from code hoisting. */
4860 if (hoistable > 1)
4862 SET_BIT (hoist_exprs[bb->index], i);
4863 found = 1;
4867 /* If we found nothing to hoist, then quit now. */
4868 if (! found)
4870 VEC_free (basic_block, heap, domby);
4871 continue;
4874 /* Loop over all the hoistable expressions. */
4875 for (i = 0; i < hoist_exprs[bb->index]->n_bits; i++)
4877 /* We want to insert the expression into BB only once, so
4878 note when we've inserted it. */
4879 insn_inserted_p = 0;
4881 /* These tests should be the same as the tests above. */
4882 if (TEST_BIT (hoist_exprs[bb->index], i))
4884 /* We've found a potentially hoistable expression, now
4885 we look at every block BB dominates to see if it
4886 computes the expression. */
4887 for (j = 0; VEC_iterate (basic_block, domby, j, dominated); j++)
4889 /* Ignore self dominance. */
4890 if (bb == dominated)
4891 continue;
4893 /* We've found a dominated block, now see if it computes
4894 the busy expression and whether or not moving that
4895 expression to the "beginning" of that block is safe. */
4896 if (!TEST_BIT (antloc[dominated->index], i))
4897 continue;
4899 /* The expression is computed in the dominated block and
4900 it would be safe to compute it at the start of the
4901 dominated block. Now we have to determine if the
4902 expression would reach the dominated block if it was
4903 placed at the end of BB. */
4904 if (hoist_expr_reaches_here_p (bb, i, dominated, NULL))
4906 struct expr *expr = index_map[i];
4907 struct occr *occr = expr->antic_occr;
4908 rtx insn;
4909 rtx set;
4911 /* Find the right occurrence of this expression. */
4912 while (BLOCK_FOR_INSN (occr->insn) != dominated && occr)
4913 occr = occr->next;
4915 gcc_assert (occr);
4916 insn = occr->insn;
4917 set = single_set (insn);
4918 gcc_assert (set);
4920 /* Create a pseudo-reg to store the result of reaching
4921 expressions into. Get the mode for the new pseudo
4922 from the mode of the original destination pseudo. */
4923 if (expr->reaching_reg == NULL)
4924 expr->reaching_reg
4925 = gen_reg_rtx_and_attrs (SET_DEST (set));
4927 gcse_emit_move_after (expr->reaching_reg, SET_DEST (set), insn);
4928 delete_insn (insn);
4929 occr->deleted_p = 1;
4930 if (!insn_inserted_p)
4932 insert_insn_end_basic_block (index_map[i], bb, 0);
4933 insn_inserted_p = 1;
4939 VEC_free (basic_block, heap, domby);
4942 free (index_map);
4945 /* Top level routine to perform one code hoisting (aka unification) pass
4947 Return nonzero if a change was made. */
4949 static int
4950 one_code_hoisting_pass (void)
4952 int changed = 0;
4954 alloc_hash_table (max_cuid, &expr_hash_table, 0);
4955 compute_hash_table (&expr_hash_table);
4956 if (dump_file)
4957 dump_hash_table (dump_file, "Code Hosting Expressions", &expr_hash_table);
4959 if (expr_hash_table.n_elems > 0)
4961 alloc_code_hoist_mem (last_basic_block, expr_hash_table.n_elems);
4962 compute_code_hoist_data ();
4963 hoist_code ();
4964 free_code_hoist_mem ();
4967 free_hash_table (&expr_hash_table);
4969 return changed;
4972 /* Here we provide the things required to do store motion towards
4973 the exit. In order for this to be effective, gcse also needed to
4974 be taught how to move a load when it is kill only by a store to itself.
4976 int i;
4977 float a[10];
4979 void foo(float scale)
4981 for (i=0; i<10; i++)
4982 a[i] *= scale;
4985 'i' is both loaded and stored to in the loop. Normally, gcse cannot move
4986 the load out since its live around the loop, and stored at the bottom
4987 of the loop.
4989 The 'Load Motion' referred to and implemented in this file is
4990 an enhancement to gcse which when using edge based lcm, recognizes
4991 this situation and allows gcse to move the load out of the loop.
4993 Once gcse has hoisted the load, store motion can then push this
4994 load towards the exit, and we end up with no loads or stores of 'i'
4995 in the loop. */
4997 static hashval_t
4998 pre_ldst_expr_hash (const void *p)
5000 int do_not_record_p = 0;
5001 const struct ls_expr *const x = (const struct ls_expr *) p;
5002 return hash_rtx (x->pattern, GET_MODE (x->pattern), &do_not_record_p, NULL, false);
5005 static int
5006 pre_ldst_expr_eq (const void *p1, const void *p2)
5008 const struct ls_expr *const ptr1 = (const struct ls_expr *) p1,
5009 *const ptr2 = (const struct ls_expr *) p2;
5010 return expr_equiv_p (ptr1->pattern, ptr2->pattern);
5013 /* This will search the ldst list for a matching expression. If it
5014 doesn't find one, we create one and initialize it. */
5016 static struct ls_expr *
5017 ldst_entry (rtx x)
5019 int do_not_record_p = 0;
5020 struct ls_expr * ptr;
5021 unsigned int hash;
5022 void **slot;
5023 struct ls_expr e;
5025 hash = hash_rtx (x, GET_MODE (x), &do_not_record_p,
5026 NULL, /*have_reg_qty=*/false);
5028 e.pattern = x;
5029 slot = htab_find_slot_with_hash (pre_ldst_table, &e, hash, INSERT);
5030 if (*slot)
5031 return (struct ls_expr *)*slot;
5033 ptr = XNEW (struct ls_expr);
5035 ptr->next = pre_ldst_mems;
5036 ptr->expr = NULL;
5037 ptr->pattern = x;
5038 ptr->pattern_regs = NULL_RTX;
5039 ptr->loads = NULL_RTX;
5040 ptr->stores = NULL_RTX;
5041 ptr->reaching_reg = NULL_RTX;
5042 ptr->invalid = 0;
5043 ptr->index = 0;
5044 ptr->hash_index = hash;
5045 pre_ldst_mems = ptr;
5046 *slot = ptr;
5048 return ptr;
5051 /* Free up an individual ldst entry. */
5053 static void
5054 free_ldst_entry (struct ls_expr * ptr)
5056 free_INSN_LIST_list (& ptr->loads);
5057 free_INSN_LIST_list (& ptr->stores);
5059 free (ptr);
5062 /* Free up all memory associated with the ldst list. */
5064 static void
5065 free_ldst_mems (void)
5067 if (pre_ldst_table)
5068 htab_delete (pre_ldst_table);
5069 pre_ldst_table = NULL;
5071 while (pre_ldst_mems)
5073 struct ls_expr * tmp = pre_ldst_mems;
5075 pre_ldst_mems = pre_ldst_mems->next;
5077 free_ldst_entry (tmp);
5080 pre_ldst_mems = NULL;
5083 /* Dump debugging info about the ldst list. */
5085 static void
5086 print_ldst_list (FILE * file)
5088 struct ls_expr * ptr;
5090 fprintf (file, "LDST list: \n");
5092 for (ptr = first_ls_expr (); ptr != NULL; ptr = next_ls_expr (ptr))
5094 fprintf (file, " Pattern (%3d): ", ptr->index);
5096 print_rtl (file, ptr->pattern);
5098 fprintf (file, "\n Loads : ");
5100 if (ptr->loads)
5101 print_rtl (file, ptr->loads);
5102 else
5103 fprintf (file, "(nil)");
5105 fprintf (file, "\n Stores : ");
5107 if (ptr->stores)
5108 print_rtl (file, ptr->stores);
5109 else
5110 fprintf (file, "(nil)");
5112 fprintf (file, "\n\n");
5115 fprintf (file, "\n");
5118 /* Returns 1 if X is in the list of ldst only expressions. */
5120 static struct ls_expr *
5121 find_rtx_in_ldst (rtx x)
5123 struct ls_expr e;
5124 void **slot;
5125 if (!pre_ldst_table)
5126 return NULL;
5127 e.pattern = x;
5128 slot = htab_find_slot (pre_ldst_table, &e, NO_INSERT);
5129 if (!slot || ((struct ls_expr *)*slot)->invalid)
5130 return NULL;
5131 return (struct ls_expr *) *slot;
5134 /* Assign each element of the list of mems a monotonically increasing value. */
5136 static int
5137 enumerate_ldsts (void)
5139 struct ls_expr * ptr;
5140 int n = 0;
5142 for (ptr = pre_ldst_mems; ptr != NULL; ptr = ptr->next)
5143 ptr->index = n++;
5145 return n;
5148 /* Return first item in the list. */
5150 static inline struct ls_expr *
5151 first_ls_expr (void)
5153 return pre_ldst_mems;
5156 /* Return the next item in the list after the specified one. */
5158 static inline struct ls_expr *
5159 next_ls_expr (struct ls_expr * ptr)
5161 return ptr->next;
5164 /* Load Motion for loads which only kill themselves. */
5166 /* Return true if x is a simple MEM operation, with no registers or
5167 side effects. These are the types of loads we consider for the
5168 ld_motion list, otherwise we let the usual aliasing take care of it. */
5170 static int
5171 simple_mem (const_rtx x)
5173 if (! MEM_P (x))
5174 return 0;
5176 if (MEM_VOLATILE_P (x))
5177 return 0;
5179 if (GET_MODE (x) == BLKmode)
5180 return 0;
5182 /* If we are handling exceptions, we must be careful with memory references
5183 that may trap. If we are not, the behavior is undefined, so we may just
5184 continue. */
5185 if (flag_non_call_exceptions && may_trap_p (x))
5186 return 0;
5188 if (side_effects_p (x))
5189 return 0;
5191 /* Do not consider function arguments passed on stack. */
5192 if (reg_mentioned_p (stack_pointer_rtx, x))
5193 return 0;
5195 if (flag_float_store && FLOAT_MODE_P (GET_MODE (x)))
5196 return 0;
5198 return 1;
5201 /* Make sure there isn't a buried reference in this pattern anywhere.
5202 If there is, invalidate the entry for it since we're not capable
5203 of fixing it up just yet.. We have to be sure we know about ALL
5204 loads since the aliasing code will allow all entries in the
5205 ld_motion list to not-alias itself. If we miss a load, we will get
5206 the wrong value since gcse might common it and we won't know to
5207 fix it up. */
5209 static void
5210 invalidate_any_buried_refs (rtx x)
5212 const char * fmt;
5213 int i, j;
5214 struct ls_expr * ptr;
5216 /* Invalidate it in the list. */
5217 if (MEM_P (x) && simple_mem (x))
5219 ptr = ldst_entry (x);
5220 ptr->invalid = 1;
5223 /* Recursively process the insn. */
5224 fmt = GET_RTX_FORMAT (GET_CODE (x));
5226 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
5228 if (fmt[i] == 'e')
5229 invalidate_any_buried_refs (XEXP (x, i));
5230 else if (fmt[i] == 'E')
5231 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
5232 invalidate_any_buried_refs (XVECEXP (x, i, j));
5236 /* Find all the 'simple' MEMs which are used in LOADs and STORES. Simple
5237 being defined as MEM loads and stores to symbols, with no side effects
5238 and no registers in the expression. For a MEM destination, we also
5239 check that the insn is still valid if we replace the destination with a
5240 REG, as is done in update_ld_motion_stores. If there are any uses/defs
5241 which don't match this criteria, they are invalidated and trimmed out
5242 later. */
5244 static void
5245 compute_ld_motion_mems (void)
5247 struct ls_expr * ptr;
5248 basic_block bb;
5249 rtx insn;
5251 pre_ldst_mems = NULL;
5252 pre_ldst_table = htab_create (13, pre_ldst_expr_hash,
5253 pre_ldst_expr_eq, NULL);
5255 FOR_EACH_BB (bb)
5257 FOR_BB_INSNS (bb, insn)
5259 if (INSN_P (insn))
5261 if (GET_CODE (PATTERN (insn)) == SET)
5263 rtx src = SET_SRC (PATTERN (insn));
5264 rtx dest = SET_DEST (PATTERN (insn));
5266 /* Check for a simple LOAD... */
5267 if (MEM_P (src) && simple_mem (src))
5269 ptr = ldst_entry (src);
5270 if (REG_P (dest))
5271 ptr->loads = alloc_INSN_LIST (insn, ptr->loads);
5272 else
5273 ptr->invalid = 1;
5275 else
5277 /* Make sure there isn't a buried load somewhere. */
5278 invalidate_any_buried_refs (src);
5281 /* Check for stores. Don't worry about aliased ones, they
5282 will block any movement we might do later. We only care
5283 about this exact pattern since those are the only
5284 circumstance that we will ignore the aliasing info. */
5285 if (MEM_P (dest) && simple_mem (dest))
5287 ptr = ldst_entry (dest);
5289 if (! MEM_P (src)
5290 && GET_CODE (src) != ASM_OPERANDS
5291 /* Check for REG manually since want_to_gcse_p
5292 returns 0 for all REGs. */
5293 && can_assign_to_reg_p (src))
5294 ptr->stores = alloc_INSN_LIST (insn, ptr->stores);
5295 else
5296 ptr->invalid = 1;
5299 else
5300 invalidate_any_buried_refs (PATTERN (insn));
5306 /* Remove any references that have been either invalidated or are not in the
5307 expression list for pre gcse. */
5309 static void
5310 trim_ld_motion_mems (void)
5312 struct ls_expr * * last = & pre_ldst_mems;
5313 struct ls_expr * ptr = pre_ldst_mems;
5315 while (ptr != NULL)
5317 struct expr * expr;
5319 /* Delete if entry has been made invalid. */
5320 if (! ptr->invalid)
5322 /* Delete if we cannot find this mem in the expression list. */
5323 unsigned int hash = ptr->hash_index % expr_hash_table.size;
5325 for (expr = expr_hash_table.table[hash];
5326 expr != NULL;
5327 expr = expr->next_same_hash)
5328 if (expr_equiv_p (expr->expr, ptr->pattern))
5329 break;
5331 else
5332 expr = (struct expr *) 0;
5334 if (expr)
5336 /* Set the expression field if we are keeping it. */
5337 ptr->expr = expr;
5338 last = & ptr->next;
5339 ptr = ptr->next;
5341 else
5343 *last = ptr->next;
5344 htab_remove_elt_with_hash (pre_ldst_table, ptr, ptr->hash_index);
5345 free_ldst_entry (ptr);
5346 ptr = * last;
5350 /* Show the world what we've found. */
5351 if (dump_file && pre_ldst_mems != NULL)
5352 print_ldst_list (dump_file);
5355 /* This routine will take an expression which we are replacing with
5356 a reaching register, and update any stores that are needed if
5357 that expression is in the ld_motion list. Stores are updated by
5358 copying their SRC to the reaching register, and then storing
5359 the reaching register into the store location. These keeps the
5360 correct value in the reaching register for the loads. */
5362 static void
5363 update_ld_motion_stores (struct expr * expr)
5365 struct ls_expr * mem_ptr;
5367 if ((mem_ptr = find_rtx_in_ldst (expr->expr)))
5369 /* We can try to find just the REACHED stores, but is shouldn't
5370 matter to set the reaching reg everywhere... some might be
5371 dead and should be eliminated later. */
5373 /* We replace (set mem expr) with (set reg expr) (set mem reg)
5374 where reg is the reaching reg used in the load. We checked in
5375 compute_ld_motion_mems that we can replace (set mem expr) with
5376 (set reg expr) in that insn. */
5377 rtx list = mem_ptr->stores;
5379 for ( ; list != NULL_RTX; list = XEXP (list, 1))
5381 rtx insn = XEXP (list, 0);
5382 rtx pat = PATTERN (insn);
5383 rtx src = SET_SRC (pat);
5384 rtx reg = expr->reaching_reg;
5385 rtx copy, new_rtx;
5387 /* If we've already copied it, continue. */
5388 if (expr->reaching_reg == src)
5389 continue;
5391 if (dump_file)
5393 fprintf (dump_file, "PRE: store updated with reaching reg ");
5394 print_rtl (dump_file, expr->reaching_reg);
5395 fprintf (dump_file, ":\n ");
5396 print_inline_rtx (dump_file, insn, 8);
5397 fprintf (dump_file, "\n");
5400 copy = gen_move_insn ( reg, copy_rtx (SET_SRC (pat)));
5401 new_rtx = emit_insn_before (copy, insn);
5402 record_one_set (REGNO (reg), new_rtx);
5403 SET_SRC (pat) = reg;
5404 df_insn_rescan (insn);
5406 /* un-recognize this pattern since it's probably different now. */
5407 INSN_CODE (insn) = -1;
5408 gcse_create_count++;
5413 /* Store motion code. */
5415 #define ANTIC_STORE_LIST(x) ((x)->loads)
5416 #define AVAIL_STORE_LIST(x) ((x)->stores)
5417 #define LAST_AVAIL_CHECK_FAILURE(x) ((x)->reaching_reg)
5419 /* This is used to communicate the target bitvector we want to use in the
5420 reg_set_info routine when called via the note_stores mechanism. */
5421 static int * regvec;
5423 /* And current insn, for the same routine. */
5424 static rtx compute_store_table_current_insn;
5426 /* Used in computing the reverse edge graph bit vectors. */
5427 static sbitmap * st_antloc;
5429 /* Global holding the number of store expressions we are dealing with. */
5430 static int num_stores;
5432 /* Checks to set if we need to mark a register set. Called from
5433 note_stores. */
5435 static void
5436 reg_set_info (rtx dest, const_rtx setter ATTRIBUTE_UNUSED,
5437 void *data)
5439 sbitmap bb_reg = (sbitmap) data;
5441 if (GET_CODE (dest) == SUBREG)
5442 dest = SUBREG_REG (dest);
5444 if (REG_P (dest))
5446 regvec[REGNO (dest)] = INSN_UID (compute_store_table_current_insn);
5447 if (bb_reg)
5448 SET_BIT (bb_reg, REGNO (dest));
5452 /* Clear any mark that says that this insn sets dest. Called from
5453 note_stores. */
5455 static void
5456 reg_clear_last_set (rtx dest, const_rtx setter ATTRIBUTE_UNUSED,
5457 void *data)
5459 int *dead_vec = (int *) data;
5461 if (GET_CODE (dest) == SUBREG)
5462 dest = SUBREG_REG (dest);
5464 if (REG_P (dest) &&
5465 dead_vec[REGNO (dest)] == INSN_UID (compute_store_table_current_insn))
5466 dead_vec[REGNO (dest)] = 0;
5469 /* Return zero if some of the registers in list X are killed
5470 due to set of registers in bitmap REGS_SET. */
5472 static bool
5473 store_ops_ok (const_rtx x, int *regs_set)
5475 const_rtx reg;
5477 for (; x; x = XEXP (x, 1))
5479 reg = XEXP (x, 0);
5480 if (regs_set[REGNO(reg)])
5481 return false;
5484 return true;
5487 /* Returns a list of registers mentioned in X. */
5488 static rtx
5489 extract_mentioned_regs (rtx x)
5491 return extract_mentioned_regs_helper (x, NULL_RTX);
5494 /* Helper for extract_mentioned_regs; ACCUM is used to accumulate used
5495 registers. */
5496 static rtx
5497 extract_mentioned_regs_helper (rtx x, rtx accum)
5499 int i;
5500 enum rtx_code code;
5501 const char * fmt;
5503 /* Repeat is used to turn tail-recursion into iteration. */
5504 repeat:
5506 if (x == 0)
5507 return accum;
5509 code = GET_CODE (x);
5510 switch (code)
5512 case REG:
5513 return alloc_EXPR_LIST (0, x, accum);
5515 case MEM:
5516 x = XEXP (x, 0);
5517 goto repeat;
5519 case PRE_DEC:
5520 case PRE_INC:
5521 case PRE_MODIFY:
5522 case POST_DEC:
5523 case POST_INC:
5524 case POST_MODIFY:
5525 /* We do not run this function with arguments having side effects. */
5526 gcc_unreachable ();
5528 case PC:
5529 case CC0: /*FIXME*/
5530 case CONST:
5531 case CONST_INT:
5532 case CONST_DOUBLE:
5533 case CONST_FIXED:
5534 case CONST_VECTOR:
5535 case SYMBOL_REF:
5536 case LABEL_REF:
5537 case ADDR_VEC:
5538 case ADDR_DIFF_VEC:
5539 return accum;
5541 default:
5542 break;
5545 i = GET_RTX_LENGTH (code) - 1;
5546 fmt = GET_RTX_FORMAT (code);
5548 for (; i >= 0; i--)
5550 if (fmt[i] == 'e')
5552 rtx tem = XEXP (x, i);
5554 /* If we are about to do the last recursive call
5555 needed at this level, change it into iteration. */
5556 if (i == 0)
5558 x = tem;
5559 goto repeat;
5562 accum = extract_mentioned_regs_helper (tem, accum);
5564 else if (fmt[i] == 'E')
5566 int j;
5568 for (j = 0; j < XVECLEN (x, i); j++)
5569 accum = extract_mentioned_regs_helper (XVECEXP (x, i, j), accum);
5573 return accum;
5576 /* Determine whether INSN is MEM store pattern that we will consider moving.
5577 REGS_SET_BEFORE is bitmap of registers set before (and including) the
5578 current insn, REGS_SET_AFTER is bitmap of registers set after (and
5579 including) the insn in this basic block. We must be passing through BB from
5580 head to end, as we are using this fact to speed things up.
5582 The results are stored this way:
5584 -- the first anticipatable expression is added into ANTIC_STORE_LIST
5585 -- if the processed expression is not anticipatable, NULL_RTX is added
5586 there instead, so that we can use it as indicator that no further
5587 expression of this type may be anticipatable
5588 -- if the expression is available, it is added as head of AVAIL_STORE_LIST;
5589 consequently, all of them but this head are dead and may be deleted.
5590 -- if the expression is not available, the insn due to that it fails to be
5591 available is stored in reaching_reg.
5593 The things are complicated a bit by fact that there already may be stores
5594 to the same MEM from other blocks; also caller must take care of the
5595 necessary cleanup of the temporary markers after end of the basic block.
5598 static void
5599 find_moveable_store (rtx insn, int *regs_set_before, int *regs_set_after)
5601 struct ls_expr * ptr;
5602 rtx dest, set, tmp;
5603 int check_anticipatable, check_available;
5604 basic_block bb = BLOCK_FOR_INSN (insn);
5606 set = single_set (insn);
5607 if (!set)
5608 return;
5610 dest = SET_DEST (set);
5612 if (! MEM_P (dest) || MEM_VOLATILE_P (dest)
5613 || GET_MODE (dest) == BLKmode)
5614 return;
5616 if (side_effects_p (dest))
5617 return;
5619 /* If we are handling exceptions, we must be careful with memory references
5620 that may trap. If we are not, the behavior is undefined, so we may just
5621 continue. */
5622 if (flag_non_call_exceptions && may_trap_p (dest))
5623 return;
5625 /* Even if the destination cannot trap, the source may. In this case we'd
5626 need to handle updating the REG_EH_REGION note. */
5627 if (find_reg_note (insn, REG_EH_REGION, NULL_RTX))
5628 return;
5630 /* Make sure that the SET_SRC of this store insns can be assigned to
5631 a register, or we will fail later on in replace_store_insn, which
5632 assumes that we can do this. But sometimes the target machine has
5633 oddities like MEM read-modify-write instruction. See for example
5634 PR24257. */
5635 if (!can_assign_to_reg_p (SET_SRC (set)))
5636 return;
5638 ptr = ldst_entry (dest);
5639 if (!ptr->pattern_regs)
5640 ptr->pattern_regs = extract_mentioned_regs (dest);
5642 /* Do not check for anticipatability if we either found one anticipatable
5643 store already, or tested for one and found out that it was killed. */
5644 check_anticipatable = 0;
5645 if (!ANTIC_STORE_LIST (ptr))
5646 check_anticipatable = 1;
5647 else
5649 tmp = XEXP (ANTIC_STORE_LIST (ptr), 0);
5650 if (tmp != NULL_RTX
5651 && BLOCK_FOR_INSN (tmp) != bb)
5652 check_anticipatable = 1;
5654 if (check_anticipatable)
5656 if (store_killed_before (dest, ptr->pattern_regs, insn, bb, regs_set_before))
5657 tmp = NULL_RTX;
5658 else
5659 tmp = insn;
5660 ANTIC_STORE_LIST (ptr) = alloc_INSN_LIST (tmp,
5661 ANTIC_STORE_LIST (ptr));
5664 /* It is not necessary to check whether store is available if we did
5665 it successfully before; if we failed before, do not bother to check
5666 until we reach the insn that caused us to fail. */
5667 check_available = 0;
5668 if (!AVAIL_STORE_LIST (ptr))
5669 check_available = 1;
5670 else
5672 tmp = XEXP (AVAIL_STORE_LIST (ptr), 0);
5673 if (BLOCK_FOR_INSN (tmp) != bb)
5674 check_available = 1;
5676 if (check_available)
5678 /* Check that we have already reached the insn at that the check
5679 failed last time. */
5680 if (LAST_AVAIL_CHECK_FAILURE (ptr))
5682 for (tmp = BB_END (bb);
5683 tmp != insn && tmp != LAST_AVAIL_CHECK_FAILURE (ptr);
5684 tmp = PREV_INSN (tmp))
5685 continue;
5686 if (tmp == insn)
5687 check_available = 0;
5689 else
5690 check_available = store_killed_after (dest, ptr->pattern_regs, insn,
5691 bb, regs_set_after,
5692 &LAST_AVAIL_CHECK_FAILURE (ptr));
5694 if (!check_available)
5695 AVAIL_STORE_LIST (ptr) = alloc_INSN_LIST (insn, AVAIL_STORE_LIST (ptr));
5698 /* Find available and anticipatable stores. */
5700 static int
5701 compute_store_table (void)
5703 int ret;
5704 basic_block bb;
5705 unsigned regno;
5706 rtx insn, pat, tmp;
5707 int *last_set_in, *already_set;
5708 struct ls_expr * ptr, **prev_next_ptr_ptr;
5710 max_gcse_regno = max_reg_num ();
5712 reg_set_in_block = sbitmap_vector_alloc (last_basic_block,
5713 max_gcse_regno);
5714 sbitmap_vector_zero (reg_set_in_block, last_basic_block);
5715 pre_ldst_mems = 0;
5716 pre_ldst_table = htab_create (13, pre_ldst_expr_hash,
5717 pre_ldst_expr_eq, NULL);
5718 last_set_in = XCNEWVEC (int, max_gcse_regno);
5719 already_set = XNEWVEC (int, max_gcse_regno);
5721 /* Find all the stores we care about. */
5722 FOR_EACH_BB (bb)
5724 /* First compute the registers set in this block. */
5725 regvec = last_set_in;
5727 FOR_BB_INSNS (bb, insn)
5729 if (! INSN_P (insn))
5730 continue;
5732 if (CALL_P (insn))
5734 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
5735 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, regno))
5737 last_set_in[regno] = INSN_UID (insn);
5738 SET_BIT (reg_set_in_block[bb->index], regno);
5742 pat = PATTERN (insn);
5743 compute_store_table_current_insn = insn;
5744 note_stores (pat, reg_set_info, reg_set_in_block[bb->index]);
5747 /* Now find the stores. */
5748 memset (already_set, 0, sizeof (int) * max_gcse_regno);
5749 regvec = already_set;
5750 FOR_BB_INSNS (bb, insn)
5752 if (! INSN_P (insn))
5753 continue;
5755 if (CALL_P (insn))
5757 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
5758 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, regno))
5759 already_set[regno] = 1;
5762 pat = PATTERN (insn);
5763 note_stores (pat, reg_set_info, NULL);
5765 /* Now that we've marked regs, look for stores. */
5766 find_moveable_store (insn, already_set, last_set_in);
5768 /* Unmark regs that are no longer set. */
5769 compute_store_table_current_insn = insn;
5770 note_stores (pat, reg_clear_last_set, last_set_in);
5771 if (CALL_P (insn))
5773 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
5774 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, regno)
5775 && last_set_in[regno] == INSN_UID (insn))
5776 last_set_in[regno] = 0;
5780 #ifdef ENABLE_CHECKING
5781 /* last_set_in should now be all-zero. */
5782 for (regno = 0; regno < max_gcse_regno; regno++)
5783 gcc_assert (!last_set_in[regno]);
5784 #endif
5786 /* Clear temporary marks. */
5787 for (ptr = first_ls_expr (); ptr != NULL; ptr = next_ls_expr (ptr))
5789 LAST_AVAIL_CHECK_FAILURE(ptr) = NULL_RTX;
5790 if (ANTIC_STORE_LIST (ptr)
5791 && (tmp = XEXP (ANTIC_STORE_LIST (ptr), 0)) == NULL_RTX)
5792 ANTIC_STORE_LIST (ptr) = XEXP (ANTIC_STORE_LIST (ptr), 1);
5796 /* Remove the stores that are not available anywhere, as there will
5797 be no opportunity to optimize them. */
5798 for (ptr = pre_ldst_mems, prev_next_ptr_ptr = &pre_ldst_mems;
5799 ptr != NULL;
5800 ptr = *prev_next_ptr_ptr)
5802 if (!AVAIL_STORE_LIST (ptr))
5804 *prev_next_ptr_ptr = ptr->next;
5805 htab_remove_elt_with_hash (pre_ldst_table, ptr, ptr->hash_index);
5806 free_ldst_entry (ptr);
5808 else
5809 prev_next_ptr_ptr = &ptr->next;
5812 ret = enumerate_ldsts ();
5814 if (dump_file)
5816 fprintf (dump_file, "ST_avail and ST_antic (shown under loads..)\n");
5817 print_ldst_list (dump_file);
5820 free (last_set_in);
5821 free (already_set);
5822 return ret;
5825 /* Check to see if the load X is aliased with STORE_PATTERN.
5826 AFTER is true if we are checking the case when STORE_PATTERN occurs
5827 after the X. */
5829 static bool
5830 load_kills_store (const_rtx x, const_rtx store_pattern, int after)
5832 if (after)
5833 return anti_dependence (x, store_pattern);
5834 else
5835 return true_dependence (store_pattern, GET_MODE (store_pattern), x,
5836 rtx_addr_varies_p);
5839 /* Go through the entire insn X, looking for any loads which might alias
5840 STORE_PATTERN. Return true if found.
5841 AFTER is true if we are checking the case when STORE_PATTERN occurs
5842 after the insn X. */
5844 static bool
5845 find_loads (const_rtx x, const_rtx store_pattern, int after)
5847 const char * fmt;
5848 int i, j;
5849 int ret = false;
5851 if (!x)
5852 return false;
5854 if (GET_CODE (x) == SET)
5855 x = SET_SRC (x);
5857 if (MEM_P (x))
5859 if (load_kills_store (x, store_pattern, after))
5860 return true;
5863 /* Recursively process the insn. */
5864 fmt = GET_RTX_FORMAT (GET_CODE (x));
5866 for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0 && !ret; i--)
5868 if (fmt[i] == 'e')
5869 ret |= find_loads (XEXP (x, i), store_pattern, after);
5870 else if (fmt[i] == 'E')
5871 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
5872 ret |= find_loads (XVECEXP (x, i, j), store_pattern, after);
5874 return ret;
5877 static inline bool
5878 store_killed_in_pat (const_rtx x, const_rtx pat, int after)
5880 if (GET_CODE (pat) == SET)
5882 rtx dest = SET_DEST (pat);
5884 if (GET_CODE (dest) == ZERO_EXTRACT)
5885 dest = XEXP (dest, 0);
5887 /* Check for memory stores to aliased objects. */
5888 if (MEM_P (dest)
5889 && !expr_equiv_p (dest, x))
5891 if (after)
5893 if (output_dependence (dest, x))
5894 return true;
5896 else
5898 if (output_dependence (x, dest))
5899 return true;
5904 if (find_loads (pat, x, after))
5905 return true;
5907 return false;
5910 /* Check if INSN kills the store pattern X (is aliased with it).
5911 AFTER is true if we are checking the case when store X occurs
5912 after the insn. Return true if it does. */
5914 static bool
5915 store_killed_in_insn (const_rtx x, const_rtx x_regs, const_rtx insn, int after)
5917 const_rtx reg, base, note, pat;
5919 if (!INSN_P (insn))
5920 return false;
5922 if (CALL_P (insn))
5924 /* A normal or pure call might read from pattern,
5925 but a const call will not. */
5926 if (!RTL_CONST_CALL_P (insn))
5927 return true;
5929 /* But even a const call reads its parameters. Check whether the
5930 base of some of registers used in mem is stack pointer. */
5931 for (reg = x_regs; reg; reg = XEXP (reg, 1))
5933 base = find_base_term (XEXP (reg, 0));
5934 if (!base
5935 || (GET_CODE (base) == ADDRESS
5936 && GET_MODE (base) == Pmode
5937 && XEXP (base, 0) == stack_pointer_rtx))
5938 return true;
5941 return false;
5944 pat = PATTERN (insn);
5945 if (GET_CODE (pat) == SET)
5947 if (store_killed_in_pat (x, pat, after))
5948 return true;
5950 else if (GET_CODE (pat) == PARALLEL)
5952 int i;
5954 for (i = 0; i < XVECLEN (pat, 0); i++)
5955 if (store_killed_in_pat (x, XVECEXP (pat, 0, i), after))
5956 return true;
5958 else if (find_loads (PATTERN (insn), x, after))
5959 return true;
5961 /* If this insn has a REG_EQUAL or REG_EQUIV note referencing a memory
5962 location aliased with X, then this insn kills X. */
5963 note = find_reg_equal_equiv_note (insn);
5964 if (! note)
5965 return false;
5966 note = XEXP (note, 0);
5968 /* However, if the note represents a must alias rather than a may
5969 alias relationship, then it does not kill X. */
5970 if (expr_equiv_p (note, x))
5971 return false;
5973 /* See if there are any aliased loads in the note. */
5974 return find_loads (note, x, after);
5977 /* Returns true if the expression X is loaded or clobbered on or after INSN
5978 within basic block BB. REGS_SET_AFTER is bitmap of registers set in
5979 or after the insn. X_REGS is list of registers mentioned in X. If the store
5980 is killed, return the last insn in that it occurs in FAIL_INSN. */
5982 static bool
5983 store_killed_after (const_rtx x, const_rtx x_regs, const_rtx insn, const_basic_block bb,
5984 int *regs_set_after, rtx *fail_insn)
5986 rtx last = BB_END (bb), act;
5988 if (!store_ops_ok (x_regs, regs_set_after))
5990 /* We do not know where it will happen. */
5991 if (fail_insn)
5992 *fail_insn = NULL_RTX;
5993 return true;
5996 /* Scan from the end, so that fail_insn is determined correctly. */
5997 for (act = last; act != PREV_INSN (insn); act = PREV_INSN (act))
5998 if (store_killed_in_insn (x, x_regs, act, false))
6000 if (fail_insn)
6001 *fail_insn = act;
6002 return true;
6005 return false;
6008 /* Returns true if the expression X is loaded or clobbered on or before INSN
6009 within basic block BB. X_REGS is list of registers mentioned in X.
6010 REGS_SET_BEFORE is bitmap of registers set before or in this insn. */
6011 static bool
6012 store_killed_before (const_rtx x, const_rtx x_regs, const_rtx insn, const_basic_block bb,
6013 int *regs_set_before)
6015 rtx first = BB_HEAD (bb);
6017 if (!store_ops_ok (x_regs, regs_set_before))
6018 return true;
6020 for ( ; insn != PREV_INSN (first); insn = PREV_INSN (insn))
6021 if (store_killed_in_insn (x, x_regs, insn, true))
6022 return true;
6024 return false;
6027 /* Fill in available, anticipatable, transparent and kill vectors in
6028 STORE_DATA, based on lists of available and anticipatable stores. */
6029 static void
6030 build_store_vectors (void)
6032 basic_block bb;
6033 int *regs_set_in_block;
6034 rtx insn, st;
6035 struct ls_expr * ptr;
6036 unsigned regno;
6038 /* Build the gen_vector. This is any store in the table which is not killed
6039 by aliasing later in its block. */
6040 ae_gen = sbitmap_vector_alloc (last_basic_block, num_stores);
6041 sbitmap_vector_zero (ae_gen, last_basic_block);
6043 st_antloc = sbitmap_vector_alloc (last_basic_block, num_stores);
6044 sbitmap_vector_zero (st_antloc, last_basic_block);
6046 for (ptr = first_ls_expr (); ptr != NULL; ptr = next_ls_expr (ptr))
6048 for (st = AVAIL_STORE_LIST (ptr); st != NULL; st = XEXP (st, 1))
6050 insn = XEXP (st, 0);
6051 bb = BLOCK_FOR_INSN (insn);
6053 /* If we've already seen an available expression in this block,
6054 we can delete this one (It occurs earlier in the block). We'll
6055 copy the SRC expression to an unused register in case there
6056 are any side effects. */
6057 if (TEST_BIT (ae_gen[bb->index], ptr->index))
6059 rtx r = gen_reg_rtx_and_attrs (ptr->pattern);
6060 if (dump_file)
6061 fprintf (dump_file, "Removing redundant store:\n");
6062 replace_store_insn (r, XEXP (st, 0), bb, ptr);
6063 continue;
6065 SET_BIT (ae_gen[bb->index], ptr->index);
6068 for (st = ANTIC_STORE_LIST (ptr); st != NULL; st = XEXP (st, 1))
6070 insn = XEXP (st, 0);
6071 bb = BLOCK_FOR_INSN (insn);
6072 SET_BIT (st_antloc[bb->index], ptr->index);
6076 ae_kill = sbitmap_vector_alloc (last_basic_block, num_stores);
6077 sbitmap_vector_zero (ae_kill, last_basic_block);
6079 transp = sbitmap_vector_alloc (last_basic_block, num_stores);
6080 sbitmap_vector_zero (transp, last_basic_block);
6081 regs_set_in_block = XNEWVEC (int, max_gcse_regno);
6083 FOR_EACH_BB (bb)
6085 for (regno = 0; regno < max_gcse_regno; regno++)
6086 regs_set_in_block[regno] = TEST_BIT (reg_set_in_block[bb->index], regno);
6088 for (ptr = first_ls_expr (); ptr != NULL; ptr = next_ls_expr (ptr))
6090 if (store_killed_after (ptr->pattern, ptr->pattern_regs, BB_HEAD (bb),
6091 bb, regs_set_in_block, NULL))
6093 /* It should not be necessary to consider the expression
6094 killed if it is both anticipatable and available. */
6095 if (!TEST_BIT (st_antloc[bb->index], ptr->index)
6096 || !TEST_BIT (ae_gen[bb->index], ptr->index))
6097 SET_BIT (ae_kill[bb->index], ptr->index);
6099 else
6100 SET_BIT (transp[bb->index], ptr->index);
6104 free (regs_set_in_block);
6106 if (dump_file)
6108 dump_sbitmap_vector (dump_file, "st_antloc", "", st_antloc, last_basic_block);
6109 dump_sbitmap_vector (dump_file, "st_kill", "", ae_kill, last_basic_block);
6110 dump_sbitmap_vector (dump_file, "Transpt", "", transp, last_basic_block);
6111 dump_sbitmap_vector (dump_file, "st_avloc", "", ae_gen, last_basic_block);
6115 /* Insert an instruction at the beginning of a basic block, and update
6116 the BB_HEAD if needed. */
6118 static void
6119 insert_insn_start_basic_block (rtx insn, basic_block bb)
6121 /* Insert at start of successor block. */
6122 rtx prev = PREV_INSN (BB_HEAD (bb));
6123 rtx before = BB_HEAD (bb);
6124 while (before != 0)
6126 if (! LABEL_P (before)
6127 && !NOTE_INSN_BASIC_BLOCK_P (before))
6128 break;
6129 prev = before;
6130 if (prev == BB_END (bb))
6131 break;
6132 before = NEXT_INSN (before);
6135 insn = emit_insn_after_noloc (insn, prev, bb);
6137 if (dump_file)
6139 fprintf (dump_file, "STORE_MOTION insert store at start of BB %d:\n",
6140 bb->index);
6141 print_inline_rtx (dump_file, insn, 6);
6142 fprintf (dump_file, "\n");
6146 /* This routine will insert a store on an edge. EXPR is the ldst entry for
6147 the memory reference, and E is the edge to insert it on. Returns nonzero
6148 if an edge insertion was performed. */
6150 static int
6151 insert_store (struct ls_expr * expr, edge e)
6153 rtx reg, insn;
6154 basic_block bb;
6155 edge tmp;
6156 edge_iterator ei;
6158 /* We did all the deleted before this insert, so if we didn't delete a
6159 store, then we haven't set the reaching reg yet either. */
6160 if (expr->reaching_reg == NULL_RTX)
6161 return 0;
6163 if (e->flags & EDGE_FAKE)
6164 return 0;
6166 reg = expr->reaching_reg;
6167 insn = gen_move_insn (copy_rtx (expr->pattern), reg);
6169 /* If we are inserting this expression on ALL predecessor edges of a BB,
6170 insert it at the start of the BB, and reset the insert bits on the other
6171 edges so we don't try to insert it on the other edges. */
6172 bb = e->dest;
6173 FOR_EACH_EDGE (tmp, ei, e->dest->preds)
6174 if (!(tmp->flags & EDGE_FAKE))
6176 int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
6178 gcc_assert (index != EDGE_INDEX_NO_EDGE);
6179 if (! TEST_BIT (pre_insert_map[index], expr->index))
6180 break;
6183 /* If tmp is NULL, we found an insertion on every edge, blank the
6184 insertion vector for these edges, and insert at the start of the BB. */
6185 if (!tmp && bb != EXIT_BLOCK_PTR)
6187 FOR_EACH_EDGE (tmp, ei, e->dest->preds)
6189 int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
6190 RESET_BIT (pre_insert_map[index], expr->index);
6192 insert_insn_start_basic_block (insn, bb);
6193 return 0;
6196 /* We can't put stores in the front of blocks pointed to by abnormal
6197 edges since that may put a store where one didn't used to be. */
6198 gcc_assert (!(e->flags & EDGE_ABNORMAL));
6200 insert_insn_on_edge (insn, e);
6202 if (dump_file)
6204 fprintf (dump_file, "STORE_MOTION insert insn on edge (%d, %d):\n",
6205 e->src->index, e->dest->index);
6206 print_inline_rtx (dump_file, insn, 6);
6207 fprintf (dump_file, "\n");
6210 return 1;
6213 /* Remove any REG_EQUAL or REG_EQUIV notes containing a reference to the
6214 memory location in SMEXPR set in basic block BB.
6216 This could be rather expensive. */
6218 static void
6219 remove_reachable_equiv_notes (basic_block bb, struct ls_expr *smexpr)
6221 edge_iterator *stack, ei;
6222 int sp;
6223 edge act;
6224 sbitmap visited = sbitmap_alloc (last_basic_block);
6225 rtx last, insn, note;
6226 rtx mem = smexpr->pattern;
6228 stack = XNEWVEC (edge_iterator, n_basic_blocks);
6229 sp = 0;
6230 ei = ei_start (bb->succs);
6232 sbitmap_zero (visited);
6234 act = (EDGE_COUNT (ei_container (ei)) > 0 ? EDGE_I (ei_container (ei), 0) : NULL);
6235 while (1)
6237 if (!act)
6239 if (!sp)
6241 free (stack);
6242 sbitmap_free (visited);
6243 return;
6245 act = ei_edge (stack[--sp]);
6247 bb = act->dest;
6249 if (bb == EXIT_BLOCK_PTR
6250 || TEST_BIT (visited, bb->index))
6252 if (!ei_end_p (ei))
6253 ei_next (&ei);
6254 act = (! ei_end_p (ei)) ? ei_edge (ei) : NULL;
6255 continue;
6257 SET_BIT (visited, bb->index);
6259 if (TEST_BIT (st_antloc[bb->index], smexpr->index))
6261 for (last = ANTIC_STORE_LIST (smexpr);
6262 BLOCK_FOR_INSN (XEXP (last, 0)) != bb;
6263 last = XEXP (last, 1))
6264 continue;
6265 last = XEXP (last, 0);
6267 else
6268 last = NEXT_INSN (BB_END (bb));
6270 for (insn = BB_HEAD (bb); insn != last; insn = NEXT_INSN (insn))
6271 if (INSN_P (insn))
6273 note = find_reg_equal_equiv_note (insn);
6274 if (!note || !expr_equiv_p (XEXP (note, 0), mem))
6275 continue;
6277 if (dump_file)
6278 fprintf (dump_file, "STORE_MOTION drop REG_EQUAL note at insn %d:\n",
6279 INSN_UID (insn));
6280 remove_note (insn, note);
6283 if (!ei_end_p (ei))
6284 ei_next (&ei);
6285 act = (! ei_end_p (ei)) ? ei_edge (ei) : NULL;
6287 if (EDGE_COUNT (bb->succs) > 0)
6289 if (act)
6290 stack[sp++] = ei;
6291 ei = ei_start (bb->succs);
6292 act = (EDGE_COUNT (ei_container (ei)) > 0 ? EDGE_I (ei_container (ei), 0) : NULL);
6297 /* This routine will replace a store with a SET to a specified register. */
6299 static void
6300 replace_store_insn (rtx reg, rtx del, basic_block bb, struct ls_expr *smexpr)
6302 rtx insn, mem, note, set, ptr;
6304 mem = smexpr->pattern;
6305 insn = gen_move_insn (reg, SET_SRC (single_set (del)));
6307 for (ptr = ANTIC_STORE_LIST (smexpr); ptr; ptr = XEXP (ptr, 1))
6308 if (XEXP (ptr, 0) == del)
6310 XEXP (ptr, 0) = insn;
6311 break;
6314 /* Move the notes from the deleted insn to its replacement. */
6315 REG_NOTES (insn) = REG_NOTES (del);
6317 /* Emit the insn AFTER all the notes are transferred.
6318 This is cheaper since we avoid df rescanning for the note change. */
6319 insn = emit_insn_after (insn, del);
6321 if (dump_file)
6323 fprintf (dump_file,
6324 "STORE_MOTION delete insn in BB %d:\n ", bb->index);
6325 print_inline_rtx (dump_file, del, 6);
6326 fprintf (dump_file, "\nSTORE MOTION replaced with insn:\n ");
6327 print_inline_rtx (dump_file, insn, 6);
6328 fprintf (dump_file, "\n");
6331 delete_insn (del);
6333 /* Now we must handle REG_EQUAL notes whose contents is equal to the mem;
6334 they are no longer accurate provided that they are reached by this
6335 definition, so drop them. */
6336 for (; insn != NEXT_INSN (BB_END (bb)); insn = NEXT_INSN (insn))
6337 if (INSN_P (insn))
6339 set = single_set (insn);
6340 if (!set)
6341 continue;
6342 if (expr_equiv_p (SET_DEST (set), mem))
6343 return;
6344 note = find_reg_equal_equiv_note (insn);
6345 if (!note || !expr_equiv_p (XEXP (note, 0), mem))
6346 continue;
6348 if (dump_file)
6349 fprintf (dump_file, "STORE_MOTION drop REG_EQUAL note at insn %d:\n",
6350 INSN_UID (insn));
6351 remove_note (insn, note);
6353 remove_reachable_equiv_notes (bb, smexpr);
6357 /* Delete a store, but copy the value that would have been stored into
6358 the reaching_reg for later storing. */
6360 static void
6361 delete_store (struct ls_expr * expr, basic_block bb)
6363 rtx reg, i, del;
6365 if (expr->reaching_reg == NULL_RTX)
6366 expr->reaching_reg = gen_reg_rtx_and_attrs (expr->pattern);
6368 reg = expr->reaching_reg;
6370 for (i = AVAIL_STORE_LIST (expr); i; i = XEXP (i, 1))
6372 del = XEXP (i, 0);
6373 if (BLOCK_FOR_INSN (del) == bb)
6375 /* We know there is only one since we deleted redundant
6376 ones during the available computation. */
6377 replace_store_insn (reg, del, bb, expr);
6378 break;
6383 /* Free memory used by store motion. */
6385 static void
6386 free_store_memory (void)
6388 free_ldst_mems ();
6390 if (ae_gen)
6391 sbitmap_vector_free (ae_gen);
6392 if (ae_kill)
6393 sbitmap_vector_free (ae_kill);
6394 if (transp)
6395 sbitmap_vector_free (transp);
6396 if (st_antloc)
6397 sbitmap_vector_free (st_antloc);
6398 if (pre_insert_map)
6399 sbitmap_vector_free (pre_insert_map);
6400 if (pre_delete_map)
6401 sbitmap_vector_free (pre_delete_map);
6402 if (reg_set_in_block)
6403 sbitmap_vector_free (reg_set_in_block);
6405 ae_gen = ae_kill = transp = st_antloc = NULL;
6406 pre_insert_map = pre_delete_map = reg_set_in_block = NULL;
6409 /* Perform store motion. Much like gcse, except we move expressions the
6410 other way by looking at the flowgraph in reverse. */
6412 static void
6413 store_motion (void)
6415 basic_block bb;
6416 int x;
6417 struct ls_expr * ptr;
6418 int update_flow = 0;
6420 if (dump_file)
6422 fprintf (dump_file, "before store motion\n");
6423 print_rtl (dump_file, get_insns ());
6426 init_alias_analysis ();
6428 /* Find all the available and anticipatable stores. */
6429 num_stores = compute_store_table ();
6430 if (num_stores == 0)
6432 htab_delete (pre_ldst_table);
6433 pre_ldst_table = NULL;
6434 sbitmap_vector_free (reg_set_in_block);
6435 end_alias_analysis ();
6436 return;
6439 /* Now compute kill & transp vectors. */
6440 build_store_vectors ();
6441 add_noreturn_fake_exit_edges ();
6442 connect_infinite_loops_to_exit ();
6444 edge_list = pre_edge_rev_lcm (num_stores, transp, ae_gen,
6445 st_antloc, ae_kill, &pre_insert_map,
6446 &pre_delete_map);
6448 /* Now we want to insert the new stores which are going to be needed. */
6449 for (ptr = first_ls_expr (); ptr != NULL; ptr = next_ls_expr (ptr))
6451 /* If any of the edges we have above are abnormal, we can't move this
6452 store. */
6453 for (x = NUM_EDGES (edge_list) - 1; x >= 0; x--)
6454 if (TEST_BIT (pre_insert_map[x], ptr->index)
6455 && (INDEX_EDGE (edge_list, x)->flags & EDGE_ABNORMAL))
6456 break;
6458 if (x >= 0)
6460 if (dump_file != NULL)
6461 fprintf (dump_file,
6462 "Can't replace store %d: abnormal edge from %d to %d\n",
6463 ptr->index, INDEX_EDGE (edge_list, x)->src->index,
6464 INDEX_EDGE (edge_list, x)->dest->index);
6465 continue;
6468 /* Now we want to insert the new stores which are going to be needed. */
6470 FOR_EACH_BB (bb)
6471 if (TEST_BIT (pre_delete_map[bb->index], ptr->index))
6472 delete_store (ptr, bb);
6474 for (x = 0; x < NUM_EDGES (edge_list); x++)
6475 if (TEST_BIT (pre_insert_map[x], ptr->index))
6476 update_flow |= insert_store (ptr, INDEX_EDGE (edge_list, x));
6479 if (update_flow)
6480 commit_edge_insertions ();
6482 free_store_memory ();
6483 free_edge_list (edge_list);
6484 remove_fake_exit_edges ();
6485 end_alias_analysis ();
6489 /* Entry point for jump bypassing optimization pass. */
6491 static int
6492 bypass_jumps (void)
6494 int changed;
6496 /* We do not construct an accurate cfg in functions which call
6497 setjmp, so just punt to be safe. */
6498 if (cfun->calls_setjmp)
6499 return 0;
6501 /* Identify the basic block information for this function, including
6502 successors and predecessors. */
6503 max_gcse_regno = max_reg_num ();
6505 if (dump_file)
6506 dump_flow_info (dump_file, dump_flags);
6508 /* Return if there's nothing to do, or it is too expensive. */
6509 if (n_basic_blocks <= NUM_FIXED_BLOCKS + 1
6510 || is_too_expensive (_ ("jump bypassing disabled")))
6511 return 0;
6513 gcc_obstack_init (&gcse_obstack);
6514 bytes_used = 0;
6516 /* We need alias. */
6517 init_alias_analysis ();
6519 /* Record where pseudo-registers are set. This data is kept accurate
6520 during each pass. ??? We could also record hard-reg information here
6521 [since it's unchanging], however it is currently done during hash table
6522 computation.
6524 It may be tempting to compute MEM set information here too, but MEM sets
6525 will be subject to code motion one day and thus we need to compute
6526 information about memory sets when we build the hash tables. */
6528 alloc_reg_set_mem (max_gcse_regno);
6529 compute_sets ();
6531 max_gcse_regno = max_reg_num ();
6532 alloc_gcse_mem ();
6533 changed = one_cprop_pass (MAX_GCSE_PASSES + 2, true, true);
6534 free_gcse_mem ();
6536 if (dump_file)
6538 fprintf (dump_file, "BYPASS of %s: %d basic blocks, ",
6539 current_function_name (), n_basic_blocks);
6540 fprintf (dump_file, "%d bytes\n\n", bytes_used);
6543 obstack_free (&gcse_obstack, NULL);
6544 free_reg_set_mem ();
6546 /* We are finished with alias. */
6547 end_alias_analysis ();
6549 return changed;
6552 /* Return true if the graph is too expensive to optimize. PASS is the
6553 optimization about to be performed. */
6555 static bool
6556 is_too_expensive (const char *pass)
6558 /* Trying to perform global optimizations on flow graphs which have
6559 a high connectivity will take a long time and is unlikely to be
6560 particularly useful.
6562 In normal circumstances a cfg should have about twice as many
6563 edges as blocks. But we do not want to punish small functions
6564 which have a couple switch statements. Rather than simply
6565 threshold the number of blocks, uses something with a more
6566 graceful degradation. */
6567 if (n_edges > 20000 + n_basic_blocks * 4)
6569 warning (OPT_Wdisabled_optimization,
6570 "%s: %d basic blocks and %d edges/basic block",
6571 pass, n_basic_blocks, n_edges / n_basic_blocks);
6573 return true;
6576 /* If allocating memory for the cprop bitmap would take up too much
6577 storage it's better just to disable the optimization. */
6578 if ((n_basic_blocks
6579 * SBITMAP_SET_SIZE (max_reg_num ())
6580 * sizeof (SBITMAP_ELT_TYPE)) > MAX_GCSE_MEMORY)
6582 warning (OPT_Wdisabled_optimization,
6583 "%s: %d basic blocks and %d registers",
6584 pass, n_basic_blocks, max_reg_num ());
6586 return true;
6589 return false;
6592 static bool
6593 gate_handle_jump_bypass (void)
6595 return optimize > 0 && flag_gcse
6596 && dbg_cnt (jump_bypass);
6599 /* Perform jump bypassing and control flow optimizations. */
6600 static unsigned int
6601 rest_of_handle_jump_bypass (void)
6603 delete_unreachable_blocks ();
6604 if (bypass_jumps ())
6606 delete_trivially_dead_insns (get_insns (), max_reg_num ());
6607 rebuild_jump_labels (get_insns ());
6608 cleanup_cfg (0);
6610 return 0;
6613 struct rtl_opt_pass pass_jump_bypass =
6616 RTL_PASS,
6617 "bypass", /* name */
6618 gate_handle_jump_bypass, /* gate */
6619 rest_of_handle_jump_bypass, /* execute */
6620 NULL, /* sub */
6621 NULL, /* next */
6622 0, /* static_pass_number */
6623 TV_BYPASS, /* tv_id */
6624 0, /* properties_required */
6625 0, /* properties_provided */
6626 0, /* properties_destroyed */
6627 0, /* todo_flags_start */
6628 TODO_dump_func |
6629 TODO_ggc_collect | TODO_verify_flow /* todo_flags_finish */
6634 static bool
6635 gate_handle_gcse (void)
6637 return optimize > 0 && flag_gcse
6638 && dbg_cnt (gcse);
6642 static unsigned int
6643 rest_of_handle_gcse (void)
6645 int save_csb, save_cfj;
6646 int tem2 = 0, tem;
6647 tem = gcse_main (get_insns ());
6648 delete_trivially_dead_insns (get_insns (), max_reg_num ());
6649 rebuild_jump_labels (get_insns ());
6650 save_csb = flag_cse_skip_blocks;
6651 save_cfj = flag_cse_follow_jumps;
6652 flag_cse_skip_blocks = flag_cse_follow_jumps = 0;
6654 /* If -fexpensive-optimizations, re-run CSE to clean up things done
6655 by gcse. */
6656 if (flag_expensive_optimizations)
6658 timevar_push (TV_CSE);
6659 tem2 = cse_main (get_insns (), max_reg_num ());
6660 df_finish_pass (false);
6661 purge_all_dead_edges ();
6662 delete_trivially_dead_insns (get_insns (), max_reg_num ());
6663 timevar_pop (TV_CSE);
6664 cse_not_expected = !flag_rerun_cse_after_loop;
6667 /* If gcse or cse altered any jumps, rerun jump optimizations to clean
6668 things up. */
6669 if (tem || tem2 == 2)
6671 timevar_push (TV_JUMP);
6672 rebuild_jump_labels (get_insns ());
6673 cleanup_cfg (0);
6674 timevar_pop (TV_JUMP);
6676 else if (tem2 == 1)
6677 cleanup_cfg (0);
6679 flag_cse_skip_blocks = save_csb;
6680 flag_cse_follow_jumps = save_cfj;
6681 return 0;
6684 struct rtl_opt_pass pass_gcse =
6687 RTL_PASS,
6688 "gcse1", /* name */
6689 gate_handle_gcse, /* gate */
6690 rest_of_handle_gcse, /* execute */
6691 NULL, /* sub */
6692 NULL, /* next */
6693 0, /* static_pass_number */
6694 TV_GCSE, /* tv_id */
6695 0, /* properties_required */
6696 0, /* properties_provided */
6697 0, /* properties_destroyed */
6698 0, /* todo_flags_start */
6699 TODO_df_finish | TODO_verify_rtl_sharing |
6700 TODO_dump_func |
6701 TODO_verify_flow | TODO_ggc_collect /* todo_flags_finish */
6706 #include "gt-gcse.h"