OSDN Git Service

2010-10-08 Robert Dewar <dewar@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / fwprop.c
1 /* RTL-based forward propagation pass for GNU compiler.
2    Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
3    Free Software Foundation, Inc.
4    Contributed by Paolo Bonzini and Steven Bosscher.
5
6 This file is part of GCC.
7
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.
12
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.
17
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/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "diagnostic-core.h"
27 #include "toplev.h"
28
29 #include "timevar.h"
30 #include "rtl.h"
31 #include "tm_p.h"
32 #include "insn-config.h"
33 #include "recog.h"
34 #include "flags.h"
35 #include "obstack.h"
36 #include "basic-block.h"
37 #include "output.h"
38 #include "df.h"
39 #include "target.h"
40 #include "cfgloop.h"
41 #include "tree-pass.h"
42 #include "domwalk.h"
43 #include "emit-rtl.h"
44
45
46 /* This pass does simple forward propagation and simplification when an
47    operand of an insn can only come from a single def.  This pass uses
48    df.c, so it is global.  However, we only do limited analysis of
49    available expressions.
50
51    1) The pass tries to propagate the source of the def into the use,
52    and checks if the result is independent of the substituted value.
53    For example, the high word of a (zero_extend:DI (reg:SI M)) is always
54    zero, independent of the source register.
55
56    In particular, we propagate constants into the use site.  Sometimes
57    RTL expansion did not put the constant in the same insn on purpose,
58    to satisfy a predicate, and the result will fail to be recognized;
59    but this happens rarely and in this case we can still create a
60    REG_EQUAL note.  For multi-word operations, this
61
62       (set (subreg:SI (reg:DI 120) 0) (const_int 0))
63       (set (subreg:SI (reg:DI 120) 4) (const_int -1))
64       (set (subreg:SI (reg:DI 122) 0)
65          (ior:SI (subreg:SI (reg:DI 119) 0) (subreg:SI (reg:DI 120) 0)))
66       (set (subreg:SI (reg:DI 122) 4)
67          (ior:SI (subreg:SI (reg:DI 119) 4) (subreg:SI (reg:DI 120) 4)))
68
69    can be simplified to the much simpler
70
71       (set (subreg:SI (reg:DI 122) 0) (subreg:SI (reg:DI 119)))
72       (set (subreg:SI (reg:DI 122) 4) (const_int -1))
73
74    This particular propagation is also effective at putting together
75    complex addressing modes.  We are more aggressive inside MEMs, in
76    that all definitions are propagated if the use is in a MEM; if the
77    result is a valid memory address we check address_cost to decide
78    whether the substitution is worthwhile.
79
80    2) The pass propagates register copies.  This is not as effective as
81    the copy propagation done by CSE's canon_reg, which works by walking
82    the instruction chain, it can help the other transformations.
83
84    We should consider removing this optimization, and instead reorder the
85    RTL passes, because GCSE does this transformation too.  With some luck,
86    the CSE pass at the end of rest_of_handle_gcse could also go away.
87
88    3) The pass looks for paradoxical subregs that are actually unnecessary.
89    Things like this:
90
91      (set (reg:QI 120) (subreg:QI (reg:SI 118) 0))
92      (set (reg:QI 121) (subreg:QI (reg:SI 119) 0))
93      (set (reg:SI 122) (plus:SI (subreg:SI (reg:QI 120) 0)
94                                 (subreg:SI (reg:QI 121) 0)))
95
96    are very common on machines that can only do word-sized operations.
97    For each use of a paradoxical subreg (subreg:WIDER (reg:NARROW N) 0),
98    if it has a single def and it is (subreg:NARROW (reg:WIDE M) 0),
99    we can replace the paradoxical subreg with simply (reg:WIDE M).  The
100    above will simplify this to
101
102      (set (reg:QI 120) (subreg:QI (reg:SI 118) 0))
103      (set (reg:QI 121) (subreg:QI (reg:SI 119) 0))
104      (set (reg:SI 122) (plus:SI (reg:SI 118) (reg:SI 119)))
105
106    where the first two insns are now dead.
107
108    We used to use reaching definitions to find which uses have a
109    single reaching definition (sounds obvious...), but this is too
110    complex a problem in nasty testcases like PR33928.  Now we use the
111    multiple definitions problem in df-problems.c.  The similarity
112    between that problem and SSA form creation is taken further, in
113    that fwprop does a dominator walk to create its chains; however,
114    instead of creating a PHI function where multiple definitions meet
115    I just punt and record only singleton use-def chains, which is
116    all that is needed by fwprop.  */
117
118
119 static int num_changes;
120
121 DEF_VEC_P(df_ref);
122 DEF_VEC_ALLOC_P(df_ref,heap);
123 static VEC(df_ref,heap) *use_def_ref;
124 static VEC(df_ref,heap) *reg_defs;
125 static VEC(df_ref,heap) *reg_defs_stack;
126
127 /* The MD bitmaps are trimmed to include only live registers to cut
128    memory usage on testcases like insn-recog.c.  Track live registers
129    in the basic block and do not perform forward propagation if the
130    destination is a dead pseudo occurring in a note.  */
131 static bitmap local_md;
132 static bitmap local_lr;
133
134 /* Return the only def in USE's use-def chain, or NULL if there is
135    more than one def in the chain.  */
136
137 static inline df_ref
138 get_def_for_use (df_ref use)
139 {
140   return VEC_index (df_ref, use_def_ref, DF_REF_ID (use));
141 }
142
143
144 /* Update the reg_defs vector with non-partial definitions in DEF_REC.
145    TOP_FLAG says which artificials uses should be used, when DEF_REC
146    is an artificial def vector.  LOCAL_MD is modified as after a
147    df_md_simulate_* function; we do more or less the same processing
148    done there, so we do not use those functions.  */
149
150 #define DF_MD_GEN_FLAGS \
151         (DF_REF_PARTIAL | DF_REF_CONDITIONAL | DF_REF_MAY_CLOBBER)
152
153 static void
154 process_defs (df_ref *def_rec, int top_flag)
155 {
156   df_ref def;
157   while ((def = *def_rec++) != NULL)
158     {
159       df_ref curr_def = VEC_index (df_ref, reg_defs, DF_REF_REGNO (def));
160       unsigned int dregno;
161
162       if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) != top_flag)
163         continue;
164
165       dregno = DF_REF_REGNO (def);
166       if (curr_def)
167         VEC_safe_push (df_ref, heap, reg_defs_stack, curr_def);
168       else
169         {
170           /* Do not store anything if "transitioning" from NULL to NULL.  But
171              otherwise, push a special entry on the stack to tell the
172              leave_block callback that the entry in reg_defs was NULL.  */
173           if (DF_REF_FLAGS (def) & DF_MD_GEN_FLAGS)
174             ;
175           else
176             VEC_safe_push (df_ref, heap, reg_defs_stack, def);
177         }
178
179       if (DF_REF_FLAGS (def) & DF_MD_GEN_FLAGS)
180         {
181           bitmap_set_bit (local_md, dregno);
182           VEC_replace (df_ref, reg_defs, dregno, NULL);
183         }
184       else
185         {
186           bitmap_clear_bit (local_md, dregno);
187           VEC_replace (df_ref, reg_defs, dregno, def);
188         }
189     }
190 }
191
192
193 /* Fill the use_def_ref vector with values for the uses in USE_REC,
194    taking reaching definitions info from LOCAL_MD and REG_DEFS.
195    TOP_FLAG says which artificials uses should be used, when USE_REC
196    is an artificial use vector.  */
197
198 static void
199 process_uses (df_ref *use_rec, int top_flag)
200 {
201   df_ref use;
202   while ((use = *use_rec++) != NULL)
203     if ((DF_REF_FLAGS (use) & DF_REF_AT_TOP) == top_flag)
204       {
205         unsigned int uregno = DF_REF_REGNO (use);
206         if (VEC_index (df_ref, reg_defs, uregno)
207             && !bitmap_bit_p (local_md, uregno)
208             && bitmap_bit_p (local_lr, uregno))
209           VEC_replace (df_ref, use_def_ref, DF_REF_ID (use),
210                        VEC_index (df_ref, reg_defs, uregno));
211       }
212 }
213
214
215 static void
216 single_def_use_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
217                             basic_block bb)
218 {
219   int bb_index = bb->index;
220   struct df_md_bb_info *md_bb_info = df_md_get_bb_info (bb_index);
221   struct df_lr_bb_info *lr_bb_info = df_lr_get_bb_info (bb_index);
222   rtx insn;
223
224   bitmap_copy (local_md, &md_bb_info->in);
225   bitmap_copy (local_lr, &lr_bb_info->in);
226
227   /* Push a marker for the leave_block callback.  */
228   VEC_safe_push (df_ref, heap, reg_defs_stack, NULL);
229
230   process_uses (df_get_artificial_uses (bb_index), DF_REF_AT_TOP);
231   process_defs (df_get_artificial_defs (bb_index), DF_REF_AT_TOP);
232
233   /* We don't call df_simulate_initialize_forwards, as it may overestimate
234      the live registers if there are unused artificial defs.  We prefer
235      liveness to be underestimated.  */
236
237   FOR_BB_INSNS (bb, insn)
238     if (INSN_P (insn))
239       {
240         unsigned int uid = INSN_UID (insn);
241         process_uses (DF_INSN_UID_USES (uid), 0);
242         process_uses (DF_INSN_UID_EQ_USES (uid), 0);
243         process_defs (DF_INSN_UID_DEFS (uid), 0);
244         df_simulate_one_insn_forwards (bb, insn, local_lr);
245       }
246
247   process_uses (df_get_artificial_uses (bb_index), 0);
248   process_defs (df_get_artificial_defs (bb_index), 0);
249 }
250
251 /* Pop the definitions created in this basic block when leaving its
252    dominated parts.  */
253
254 static void
255 single_def_use_leave_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
256                             basic_block bb ATTRIBUTE_UNUSED)
257 {
258   df_ref saved_def;
259   while ((saved_def = VEC_pop (df_ref, reg_defs_stack)) != NULL)
260     {
261       unsigned int dregno = DF_REF_REGNO (saved_def);
262
263       /* See also process_defs.  */
264       if (saved_def == VEC_index (df_ref, reg_defs, dregno))
265         VEC_replace (df_ref, reg_defs, dregno, NULL);
266       else
267         VEC_replace (df_ref, reg_defs, dregno, saved_def);
268     }
269 }
270
271
272 /* Build a vector holding the reaching definitions of uses reached by a
273    single dominating definition.  */
274
275 static void
276 build_single_def_use_links (void)
277 {
278   struct dom_walk_data walk_data;
279
280   /* We use the multiple definitions problem to compute our restricted
281      use-def chains.  */
282   df_set_flags (DF_EQ_NOTES);
283   df_md_add_problem ();
284   df_note_add_problem ();
285   df_analyze ();
286   df_maybe_reorganize_use_refs (DF_REF_ORDER_BY_INSN_WITH_NOTES);
287
288   use_def_ref = VEC_alloc (df_ref, heap, DF_USES_TABLE_SIZE ());
289   VEC_safe_grow_cleared (df_ref, heap, use_def_ref, DF_USES_TABLE_SIZE ());
290
291   reg_defs = VEC_alloc (df_ref, heap, max_reg_num ());
292   VEC_safe_grow_cleared (df_ref, heap, reg_defs, max_reg_num ());
293
294   reg_defs_stack = VEC_alloc (df_ref, heap, n_basic_blocks * 10);
295   local_md = BITMAP_ALLOC (NULL);
296   local_lr = BITMAP_ALLOC (NULL);
297
298   /* Walk the dominator tree looking for single reaching definitions
299      dominating the uses.  This is similar to how SSA form is built.  */
300   walk_data.dom_direction = CDI_DOMINATORS;
301   walk_data.initialize_block_local_data = NULL;
302   walk_data.before_dom_children = single_def_use_enter_block;
303   walk_data.after_dom_children = single_def_use_leave_block;
304
305   init_walk_dominator_tree (&walk_data);
306   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
307   fini_walk_dominator_tree (&walk_data);
308
309   BITMAP_FREE (local_lr);
310   BITMAP_FREE (local_md);
311   VEC_free (df_ref, heap, reg_defs);
312   VEC_free (df_ref, heap, reg_defs_stack);
313 }
314
315 \f
316 /* Do not try to replace constant addresses or addresses of local and
317    argument slots.  These MEM expressions are made only once and inserted
318    in many instructions, as well as being used to control symbol table
319    output.  It is not safe to clobber them.
320
321    There are some uncommon cases where the address is already in a register
322    for some reason, but we cannot take advantage of that because we have
323    no easy way to unshare the MEM.  In addition, looking up all stack
324    addresses is costly.  */
325
326 static bool
327 can_simplify_addr (rtx addr)
328 {
329   rtx reg;
330
331   if (CONSTANT_ADDRESS_P (addr))
332     return false;
333
334   if (GET_CODE (addr) == PLUS)
335     reg = XEXP (addr, 0);
336   else
337     reg = addr;
338
339   return (!REG_P (reg)
340           || (REGNO (reg) != FRAME_POINTER_REGNUM
341               && REGNO (reg) != HARD_FRAME_POINTER_REGNUM
342               && REGNO (reg) != ARG_POINTER_REGNUM));
343 }
344
345 /* Returns a canonical version of X for the address, from the point of view,
346    that all multiplications are represented as MULT instead of the multiply
347    by a power of 2 being represented as ASHIFT.
348
349    Every ASHIFT we find has been made by simplify_gen_binary and was not
350    there before, so it is not shared.  So we can do this in place.  */
351
352 static void
353 canonicalize_address (rtx x)
354 {
355   for (;;)
356     switch (GET_CODE (x))
357       {
358       case ASHIFT:
359         if (CONST_INT_P (XEXP (x, 1))
360             && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (GET_MODE (x))
361             && INTVAL (XEXP (x, 1)) >= 0)
362           {
363             HOST_WIDE_INT shift = INTVAL (XEXP (x, 1));
364             PUT_CODE (x, MULT);
365             XEXP (x, 1) = gen_int_mode ((HOST_WIDE_INT) 1 << shift,
366                                         GET_MODE (x));
367           }
368
369         x = XEXP (x, 0);
370         break;
371
372       case PLUS:
373         if (GET_CODE (XEXP (x, 0)) == PLUS
374             || GET_CODE (XEXP (x, 0)) == ASHIFT
375             || GET_CODE (XEXP (x, 0)) == CONST)
376           canonicalize_address (XEXP (x, 0));
377
378         x = XEXP (x, 1);
379         break;
380
381       case CONST:
382         x = XEXP (x, 0);
383         break;
384
385       default:
386         return;
387       }
388 }
389
390 /* OLD is a memory address.  Return whether it is good to use NEW instead,
391    for a memory access in the given MODE.  */
392
393 static bool
394 should_replace_address (rtx old_rtx, rtx new_rtx, enum machine_mode mode,
395                         addr_space_t as, bool speed)
396 {
397   int gain;
398
399   if (rtx_equal_p (old_rtx, new_rtx)
400       || !memory_address_addr_space_p (mode, new_rtx, as))
401     return false;
402
403   /* Copy propagation is always ok.  */
404   if (REG_P (old_rtx) && REG_P (new_rtx))
405     return true;
406
407   /* Prefer the new address if it is less expensive.  */
408   gain = (address_cost (old_rtx, mode, as, speed)
409           - address_cost (new_rtx, mode, as, speed));
410
411   /* If the addresses have equivalent cost, prefer the new address
412      if it has the highest `rtx_cost'.  That has the potential of
413      eliminating the most insns without additional costs, and it
414      is the same that cse.c used to do.  */
415   if (gain == 0)
416     gain = rtx_cost (new_rtx, SET, speed) - rtx_cost (old_rtx, SET, speed);
417
418   return (gain > 0);
419 }
420
421
422 /* Flags for the last parameter of propagate_rtx_1.  */
423
424 enum {
425   /* If PR_CAN_APPEAR is true, propagate_rtx_1 always returns true;
426      if it is false, propagate_rtx_1 returns false if, for at least
427      one occurrence OLD, it failed to collapse the result to a constant.
428      For example, (mult:M (reg:M A) (minus:M (reg:M B) (reg:M A))) may
429      collapse to zero if replacing (reg:M B) with (reg:M A).
430
431      PR_CAN_APPEAR is disregarded inside MEMs: in that case,
432      propagate_rtx_1 just tries to make cheaper and valid memory
433      addresses.  */
434   PR_CAN_APPEAR = 1,
435
436   /* If PR_HANDLE_MEM is not set, propagate_rtx_1 won't attempt any replacement
437      outside memory addresses.  This is needed because propagate_rtx_1 does
438      not do any analysis on memory; thus it is very conservative and in general
439      it will fail if non-read-only MEMs are found in the source expression.
440
441      PR_HANDLE_MEM is set when the source of the propagation was not
442      another MEM.  Then, it is safe not to treat non-read-only MEMs as
443      ``opaque'' objects.  */
444   PR_HANDLE_MEM = 2,
445
446   /* Set when costs should be optimized for speed.  */
447   PR_OPTIMIZE_FOR_SPEED = 4
448 };
449
450
451 /* Replace all occurrences of OLD in *PX with NEW and try to simplify the
452    resulting expression.  Replace *PX with a new RTL expression if an
453    occurrence of OLD was found.
454
455    This is only a wrapper around simplify-rtx.c: do not add any pattern
456    matching code here.  (The sole exception is the handling of LO_SUM, but
457    that is because there is no simplify_gen_* function for LO_SUM).  */
458
459 static bool
460 propagate_rtx_1 (rtx *px, rtx old_rtx, rtx new_rtx, int flags)
461 {
462   rtx x = *px, tem = NULL_RTX, op0, op1, op2;
463   enum rtx_code code = GET_CODE (x);
464   enum machine_mode mode = GET_MODE (x);
465   enum machine_mode op_mode;
466   bool can_appear = (flags & PR_CAN_APPEAR) != 0;
467   bool valid_ops = true;
468
469   if (!(flags & PR_HANDLE_MEM) && MEM_P (x) && !MEM_READONLY_P (x))
470     {
471       /* If unsafe, change MEMs to CLOBBERs or SCRATCHes (to preserve whether
472          they have side effects or not).  */
473       *px = (side_effects_p (x)
474              ? gen_rtx_CLOBBER (GET_MODE (x), const0_rtx)
475              : gen_rtx_SCRATCH (GET_MODE (x)));
476       return false;
477     }
478
479   /* If X is OLD_RTX, return NEW_RTX.  But not if replacing only within an
480      address, and we are *not* inside one.  */
481   if (x == old_rtx)
482     {
483       *px = new_rtx;
484       return can_appear;
485     }
486
487   /* If this is an expression, try recursive substitution.  */
488   switch (GET_RTX_CLASS (code))
489     {
490     case RTX_UNARY:
491       op0 = XEXP (x, 0);
492       op_mode = GET_MODE (op0);
493       valid_ops &= propagate_rtx_1 (&op0, old_rtx, new_rtx, flags);
494       if (op0 == XEXP (x, 0))
495         return true;
496       tem = simplify_gen_unary (code, mode, op0, op_mode);
497       break;
498
499     case RTX_BIN_ARITH:
500     case RTX_COMM_ARITH:
501       op0 = XEXP (x, 0);
502       op1 = XEXP (x, 1);
503       valid_ops &= propagate_rtx_1 (&op0, old_rtx, new_rtx, flags);
504       valid_ops &= propagate_rtx_1 (&op1, old_rtx, new_rtx, flags);
505       if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
506         return true;
507       tem = simplify_gen_binary (code, mode, op0, op1);
508       break;
509
510     case RTX_COMPARE:
511     case RTX_COMM_COMPARE:
512       op0 = XEXP (x, 0);
513       op1 = XEXP (x, 1);
514       op_mode = GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
515       valid_ops &= propagate_rtx_1 (&op0, old_rtx, new_rtx, flags);
516       valid_ops &= propagate_rtx_1 (&op1, old_rtx, new_rtx, flags);
517       if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
518         return true;
519       tem = simplify_gen_relational (code, mode, op_mode, op0, op1);
520       break;
521
522     case RTX_TERNARY:
523     case RTX_BITFIELD_OPS:
524       op0 = XEXP (x, 0);
525       op1 = XEXP (x, 1);
526       op2 = XEXP (x, 2);
527       op_mode = GET_MODE (op0);
528       valid_ops &= propagate_rtx_1 (&op0, old_rtx, new_rtx, flags);
529       valid_ops &= propagate_rtx_1 (&op1, old_rtx, new_rtx, flags);
530       valid_ops &= propagate_rtx_1 (&op2, old_rtx, new_rtx, flags);
531       if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1) && op2 == XEXP (x, 2))
532         return true;
533       if (op_mode == VOIDmode)
534         op_mode = GET_MODE (op0);
535       tem = simplify_gen_ternary (code, mode, op_mode, op0, op1, op2);
536       break;
537
538     case RTX_EXTRA:
539       /* The only case we try to handle is a SUBREG.  */
540       if (code == SUBREG)
541         {
542           op0 = XEXP (x, 0);
543           valid_ops &= propagate_rtx_1 (&op0, old_rtx, new_rtx, flags);
544           if (op0 == XEXP (x, 0))
545             return true;
546           tem = simplify_gen_subreg (mode, op0, GET_MODE (SUBREG_REG (x)),
547                                      SUBREG_BYTE (x));
548         }
549       break;
550
551     case RTX_OBJ:
552       if (code == MEM && x != new_rtx)
553         {
554           rtx new_op0;
555           op0 = XEXP (x, 0);
556
557           /* There are some addresses that we cannot work on.  */
558           if (!can_simplify_addr (op0))
559             return true;
560
561           op0 = new_op0 = targetm.delegitimize_address (op0);
562           valid_ops &= propagate_rtx_1 (&new_op0, old_rtx, new_rtx,
563                                         flags | PR_CAN_APPEAR);
564
565           /* Dismiss transformation that we do not want to carry on.  */
566           if (!valid_ops
567               || new_op0 == op0
568               || !(GET_MODE (new_op0) == GET_MODE (op0)
569                    || GET_MODE (new_op0) == VOIDmode))
570             return true;
571
572           canonicalize_address (new_op0);
573
574           /* Copy propagations are always ok.  Otherwise check the costs.  */
575           if (!(REG_P (old_rtx) && REG_P (new_rtx))
576               && !should_replace_address (op0, new_op0, GET_MODE (x),
577                                           MEM_ADDR_SPACE (x),
578                                           flags & PR_OPTIMIZE_FOR_SPEED))
579             return true;
580
581           tem = replace_equiv_address_nv (x, new_op0);
582         }
583
584       else if (code == LO_SUM)
585         {
586           op0 = XEXP (x, 0);
587           op1 = XEXP (x, 1);
588
589           /* The only simplification we do attempts to remove references to op0
590              or make it constant -- in both cases, op0's invalidity will not
591              make the result invalid.  */
592           propagate_rtx_1 (&op0, old_rtx, new_rtx, flags | PR_CAN_APPEAR);
593           valid_ops &= propagate_rtx_1 (&op1, old_rtx, new_rtx, flags);
594           if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
595             return true;
596
597           /* (lo_sum (high x) x) -> x  */
598           if (GET_CODE (op0) == HIGH && rtx_equal_p (XEXP (op0, 0), op1))
599             tem = op1;
600           else
601             tem = gen_rtx_LO_SUM (mode, op0, op1);
602
603           /* OP1 is likely not a legitimate address, otherwise there would have
604              been no LO_SUM.  We want it to disappear if it is invalid, return
605              false in that case.  */
606           return memory_address_p (mode, tem);
607         }
608
609       else if (code == REG)
610         {
611           if (rtx_equal_p (x, old_rtx))
612             {
613               *px = new_rtx;
614               return can_appear;
615             }
616         }
617       break;
618
619     default:
620       break;
621     }
622
623   /* No change, no trouble.  */
624   if (tem == NULL_RTX)
625     return true;
626
627   *px = tem;
628
629   /* The replacement we made so far is valid, if all of the recursive
630      replacements were valid, or we could simplify everything to
631      a constant.  */
632   return valid_ops || can_appear || CONSTANT_P (tem);
633 }
634
635
636 /* for_each_rtx traversal function that returns 1 if BODY points to
637    a non-constant mem.  */
638
639 static int
640 varying_mem_p (rtx *body, void *data ATTRIBUTE_UNUSED)
641 {
642   rtx x = *body;
643   return MEM_P (x) && !MEM_READONLY_P (x);
644 }
645
646
647 /* Replace all occurrences of OLD in X with NEW and try to simplify the
648    resulting expression (in mode MODE).  Return a new expression if it is
649    a constant, otherwise X.
650
651    Simplifications where occurrences of NEW collapse to a constant are always
652    accepted.  All simplifications are accepted if NEW is a pseudo too.
653    Otherwise, we accept simplifications that have a lower or equal cost.  */
654
655 static rtx
656 propagate_rtx (rtx x, enum machine_mode mode, rtx old_rtx, rtx new_rtx,
657                bool speed)
658 {
659   rtx tem;
660   bool collapsed;
661   int flags;
662
663   if (REG_P (new_rtx) && REGNO (new_rtx) < FIRST_PSEUDO_REGISTER)
664     return NULL_RTX;
665
666   flags = 0;
667   if (REG_P (new_rtx) || CONSTANT_P (new_rtx))
668     flags |= PR_CAN_APPEAR;
669   if (!for_each_rtx (&new_rtx, varying_mem_p, NULL))
670     flags |= PR_HANDLE_MEM;
671
672   if (speed)
673     flags |= PR_OPTIMIZE_FOR_SPEED;
674
675   tem = x;
676   collapsed = propagate_rtx_1 (&tem, old_rtx, copy_rtx (new_rtx), flags);
677   if (tem == x || !collapsed)
678     return NULL_RTX;
679
680   /* gen_lowpart_common will not be able to process VOIDmode entities other
681      than CONST_INTs.  */
682   if (GET_MODE (tem) == VOIDmode && !CONST_INT_P (tem))
683     return NULL_RTX;
684
685   if (GET_MODE (tem) == VOIDmode)
686     tem = rtl_hooks.gen_lowpart_no_emit (mode, tem);
687   else
688     gcc_assert (GET_MODE (tem) == mode);
689
690   return tem;
691 }
692
693
694 \f
695
696 /* Return true if the register from reference REF is killed
697    between FROM to (but not including) TO.  */
698
699 static bool
700 local_ref_killed_between_p (df_ref ref, rtx from, rtx to)
701 {
702   rtx insn;
703
704   for (insn = from; insn != to; insn = NEXT_INSN (insn))
705     {
706       df_ref *def_rec;
707       if (!INSN_P (insn))
708         continue;
709
710       for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
711         {
712           df_ref def = *def_rec;
713           if (DF_REF_REGNO (ref) == DF_REF_REGNO (def))
714             return true;
715         }
716     }
717   return false;
718 }
719
720
721 /* Check if the given DEF is available in INSN.  This would require full
722    computation of available expressions; we check only restricted conditions:
723    - if DEF is the sole definition of its register, go ahead;
724    - in the same basic block, we check for no definitions killing the
725      definition of DEF_INSN;
726    - if USE's basic block has DEF's basic block as the sole predecessor,
727      we check if the definition is killed after DEF_INSN or before
728      TARGET_INSN insn, in their respective basic blocks.  */
729 static bool
730 use_killed_between (df_ref use, rtx def_insn, rtx target_insn)
731 {
732   basic_block def_bb = BLOCK_FOR_INSN (def_insn);
733   basic_block target_bb = BLOCK_FOR_INSN (target_insn);
734   int regno;
735   df_ref def;
736
737   /* We used to have a def reaching a use that is _before_ the def,
738      with the def not dominating the use even though the use and def
739      are in the same basic block, when a register may be used
740      uninitialized in a loop.  This should not happen anymore since
741      we do not use reaching definitions, but still we test for such
742      cases and assume that DEF is not available.  */
743   if (def_bb == target_bb
744       ? DF_INSN_LUID (def_insn) >= DF_INSN_LUID (target_insn)
745       : !dominated_by_p (CDI_DOMINATORS, target_bb, def_bb))
746     return true;
747
748   /* Check if the reg in USE has only one definition.  We already
749      know that this definition reaches use, or we wouldn't be here.
750      However, this is invalid for hard registers because if they are
751      live at the beginning of the function it does not mean that we
752      have an uninitialized access.  */
753   regno = DF_REF_REGNO (use);
754   def = DF_REG_DEF_CHAIN (regno);
755   if (def
756       && DF_REF_NEXT_REG (def) == NULL
757       && regno >= FIRST_PSEUDO_REGISTER)
758     return false;
759
760   /* Check locally if we are in the same basic block.  */
761   if (def_bb == target_bb)
762     return local_ref_killed_between_p (use, def_insn, target_insn);
763
764   /* Finally, if DEF_BB is the sole predecessor of TARGET_BB.  */
765   if (single_pred_p (target_bb)
766       && single_pred (target_bb) == def_bb)
767     {
768       df_ref x;
769
770       /* See if USE is killed between DEF_INSN and the last insn in the
771          basic block containing DEF_INSN.  */
772       x = df_bb_regno_last_def_find (def_bb, regno);
773       if (x && DF_INSN_LUID (DF_REF_INSN (x)) >= DF_INSN_LUID (def_insn))
774         return true;
775
776       /* See if USE is killed between TARGET_INSN and the first insn in the
777          basic block containing TARGET_INSN.  */
778       x = df_bb_regno_first_def_find (target_bb, regno);
779       if (x && DF_INSN_LUID (DF_REF_INSN (x)) < DF_INSN_LUID (target_insn))
780         return true;
781
782       return false;
783     }
784
785   /* Otherwise assume the worst case.  */
786   return true;
787 }
788
789
790 /* Check if all uses in DEF_INSN can be used in TARGET_INSN.  This
791    would require full computation of available expressions;
792    we check only restricted conditions, see use_killed_between.  */
793 static bool
794 all_uses_available_at (rtx def_insn, rtx target_insn)
795 {
796   df_ref *use_rec;
797   struct df_insn_info *insn_info = DF_INSN_INFO_GET (def_insn);
798   rtx def_set = single_set (def_insn);
799
800   gcc_assert (def_set);
801
802   /* If target_insn comes right after def_insn, which is very common
803      for addresses, we can use a quicker test.  */
804   if (NEXT_INSN (def_insn) == target_insn
805       && REG_P (SET_DEST (def_set)))
806     {
807       rtx def_reg = SET_DEST (def_set);
808
809       /* If the insn uses the reg that it defines, the substitution is
810          invalid.  */
811       for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
812         {
813           df_ref use = *use_rec;
814           if (rtx_equal_p (DF_REF_REG (use), def_reg))
815             return false;
816         }
817       for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
818         {
819           df_ref use = *use_rec;
820           if (rtx_equal_p (DF_REF_REG (use), def_reg))
821             return false;
822         }
823     }
824   else
825     {
826       rtx def_reg = REG_P (SET_DEST (def_set)) ? SET_DEST (def_set) : NULL_RTX;
827
828       /* Look at all the uses of DEF_INSN, and see if they are not
829          killed between DEF_INSN and TARGET_INSN.  */
830       for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
831         {
832           df_ref use = *use_rec;
833           if (def_reg && rtx_equal_p (DF_REF_REG (use), def_reg))
834             return false;
835           if (use_killed_between (use, def_insn, target_insn))
836             return false;
837         }
838       for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
839         {
840           df_ref use = *use_rec;
841           if (def_reg && rtx_equal_p (DF_REF_REG (use), def_reg))
842             return false;
843           if (use_killed_between (use, def_insn, target_insn))
844             return false;
845         }
846     }
847
848   return true;
849 }
850
851 \f
852 struct find_occurrence_data
853 {
854   rtx find;
855   rtx *retval;
856 };
857
858 /* Callback for for_each_rtx, used in find_occurrence.
859    See if PX is the rtx we have to find.  Return 1 to stop for_each_rtx
860    if successful, or 0 to continue traversing otherwise.  */
861
862 static int
863 find_occurrence_callback (rtx *px, void *data)
864 {
865   struct find_occurrence_data *fod = (struct find_occurrence_data *) data;
866   rtx x = *px;
867   rtx find = fod->find;
868
869   if (x == find)
870     {
871       fod->retval = px;
872       return 1;
873     }
874
875   return 0;
876 }
877
878 /* Return a pointer to one of the occurrences of register FIND in *PX.  */
879
880 static rtx *
881 find_occurrence (rtx *px, rtx find)
882 {
883   struct find_occurrence_data data;
884
885   gcc_assert (REG_P (find)
886               || (GET_CODE (find) == SUBREG
887                   && REG_P (SUBREG_REG (find))));
888
889   data.find = find;
890   data.retval = NULL;
891   for_each_rtx (px, find_occurrence_callback, &data);
892   return data.retval;
893 }
894
895 \f
896 /* Inside INSN, the expression rooted at *LOC has been changed, moving some
897    uses from USE_VEC.  Find those that are present, and create new items
898    in the data flow object of the pass.  Mark any new uses as having the
899    given TYPE.  */
900 static void
901 update_df (rtx insn, rtx *loc, df_ref *use_rec, enum df_ref_type type,
902            int new_flags)
903 {
904   bool changed = false;
905
906   /* Add a use for the registers that were propagated.  */
907   while (*use_rec)
908     {
909       df_ref use = *use_rec;
910       df_ref orig_use = use, new_use;
911       rtx *new_loc = find_occurrence (loc, DF_REF_REG (orig_use));
912       use_rec++;
913
914       if (!new_loc)
915         continue;
916
917       /* Add a new insn use.  Use the original type, because it says if the
918          use was within a MEM.  */
919       new_use = df_ref_create (DF_REF_REG (orig_use), new_loc,
920                                insn, BLOCK_FOR_INSN (insn),
921                                type, DF_REF_FLAGS (orig_use) | new_flags);
922
923       /* Set up the use-def chain.  */
924       gcc_assert (DF_REF_ID (new_use) == (int) VEC_length (df_ref, use_def_ref));
925       VEC_safe_push (df_ref, heap, use_def_ref, get_def_for_use (orig_use));
926       changed = true;
927     }
928   if (changed)
929     df_insn_rescan (insn);
930 }
931
932
933 /* Try substituting NEW into LOC, which originated from forward propagation
934    of USE's value from DEF_INSN.  SET_REG_EQUAL says whether we are
935    substituting the whole SET_SRC, so we can set a REG_EQUAL note if the
936    new insn is not recognized.  Return whether the substitution was
937    performed.  */
938
939 static bool
940 try_fwprop_subst (df_ref use, rtx *loc, rtx new_rtx, rtx def_insn, bool set_reg_equal)
941 {
942   rtx insn = DF_REF_INSN (use);
943   enum df_ref_type type = DF_REF_TYPE (use);
944   int flags = DF_REF_FLAGS (use);
945   rtx set = single_set (insn);
946   bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
947   int old_cost = 0;
948   bool ok;
949
950   /* forward_propagate_subreg may be operating on an instruction with
951      multiple sets.  If so, assume the cost of the new instruction is
952      not greater than the old one.  */
953   if (set)
954     old_cost = rtx_cost (SET_SRC (set), SET, speed);
955   if (dump_file)
956     {
957       fprintf (dump_file, "\nIn insn %d, replacing\n ", INSN_UID (insn));
958       print_inline_rtx (dump_file, *loc, 2);
959       fprintf (dump_file, "\n with ");
960       print_inline_rtx (dump_file, new_rtx, 2);
961       fprintf (dump_file, "\n");
962     }
963
964   validate_unshare_change (insn, loc, new_rtx, true);
965   if (!verify_changes (0))
966     {
967       if (dump_file)
968         fprintf (dump_file, "Changes to insn %d not recognized\n",
969                  INSN_UID (insn));
970       ok = false;
971     }
972
973   else if (DF_REF_TYPE (use) == DF_REF_REG_USE
974            && set
975            && rtx_cost (SET_SRC (set), SET, speed) > old_cost)
976     {
977       if (dump_file)
978         fprintf (dump_file, "Changes to insn %d not profitable\n",
979                  INSN_UID (insn));
980       ok = false;
981     }
982
983   else
984     {
985       if (dump_file)
986         fprintf (dump_file, "Changed insn %d\n", INSN_UID (insn));
987       ok = true;
988     }
989
990   if (ok)
991     {
992       confirm_change_group ();
993       num_changes++;
994
995       df_ref_remove (use);
996       if (!CONSTANT_P (new_rtx))
997         {
998           struct df_insn_info *insn_info = DF_INSN_INFO_GET (def_insn);
999           update_df (insn, loc, DF_INSN_INFO_USES (insn_info), type, flags);
1000           update_df (insn, loc, DF_INSN_INFO_EQ_USES (insn_info), type, flags);
1001         }
1002     }
1003   else
1004     {
1005       cancel_changes (0);
1006
1007       /* Can also record a simplified value in a REG_EQUAL note,
1008          making a new one if one does not already exist.  */
1009       if (set_reg_equal)
1010         {
1011           if (dump_file)
1012             fprintf (dump_file, " Setting REG_EQUAL note\n");
1013
1014           set_unique_reg_note (insn, REG_EQUAL, copy_rtx (new_rtx));
1015
1016           /* ??? Is this still necessary if we add the note through
1017              set_unique_reg_note?  */
1018           if (!CONSTANT_P (new_rtx))
1019             {
1020               struct df_insn_info *insn_info = DF_INSN_INFO_GET (def_insn);
1021               update_df (insn, loc, DF_INSN_INFO_USES (insn_info),
1022                          type, DF_REF_IN_NOTE);
1023               update_df (insn, loc, DF_INSN_INFO_EQ_USES (insn_info),
1024                          type, DF_REF_IN_NOTE);
1025             }
1026         }
1027     }
1028
1029   return ok;
1030 }
1031
1032 /* For the given single_set INSN, containing SRC known to be a
1033    ZERO_EXTEND or SIGN_EXTEND of a register, return true if INSN
1034    is redundant due to the register being set by a LOAD_EXTEND_OP
1035    load from memory.  */
1036
1037 static bool
1038 free_load_extend (rtx src, rtx insn)
1039 {
1040   rtx reg;
1041   df_ref *use_vec;
1042   df_ref use = 0, def;
1043
1044   reg = XEXP (src, 0);
1045 #ifdef LOAD_EXTEND_OP
1046   if (LOAD_EXTEND_OP (GET_MODE (reg)) != GET_CODE (src))
1047 #endif
1048     return false;
1049
1050   for (use_vec = DF_INSN_USES (insn); *use_vec; use_vec++)
1051     {
1052       use = *use_vec;
1053
1054       if (!DF_REF_IS_ARTIFICIAL (use)
1055           && DF_REF_TYPE (use) == DF_REF_REG_USE
1056           && DF_REF_REG (use) == reg)
1057         break;
1058     }
1059   if (!use)
1060     return false;
1061
1062   def = get_def_for_use (use);
1063   if (!def)
1064     return false;
1065
1066   if (DF_REF_IS_ARTIFICIAL (def))
1067     return false;
1068
1069   if (NONJUMP_INSN_P (DF_REF_INSN (def)))
1070     {
1071       rtx patt = PATTERN (DF_REF_INSN (def));
1072
1073       if (GET_CODE (patt) == SET
1074           && GET_CODE (SET_SRC (patt)) == MEM
1075           && rtx_equal_p (SET_DEST (patt), reg))
1076         return true;
1077     }
1078   return false;
1079 }
1080
1081 /* If USE is a subreg, see if it can be replaced by a pseudo.  */
1082
1083 static bool
1084 forward_propagate_subreg (df_ref use, rtx def_insn, rtx def_set)
1085 {
1086   rtx use_reg = DF_REF_REG (use);
1087   rtx use_insn, src;
1088
1089   /* Only consider subregs... */
1090   enum machine_mode use_mode = GET_MODE (use_reg);
1091   if (GET_CODE (use_reg) != SUBREG
1092       || !REG_P (SET_DEST (def_set)))
1093     return false;
1094
1095   /* If this is a paradoxical SUBREG...  */
1096   if (GET_MODE_SIZE (use_mode)
1097       > GET_MODE_SIZE (GET_MODE (SUBREG_REG (use_reg))))
1098     {
1099       /* If this is a paradoxical SUBREG, we have no idea what value the
1100          extra bits would have.  However, if the operand is equivalent to
1101          a SUBREG whose operand is the same as our mode, and all the modes
1102          are within a word, we can just use the inner operand because
1103          these SUBREGs just say how to treat the register.  */
1104       use_insn = DF_REF_INSN (use);
1105       src = SET_SRC (def_set);
1106       if (GET_CODE (src) == SUBREG
1107           && REG_P (SUBREG_REG (src))
1108           && GET_MODE (SUBREG_REG (src)) == use_mode
1109           && subreg_lowpart_p (src)
1110           && all_uses_available_at (def_insn, use_insn))
1111         return try_fwprop_subst (use, DF_REF_LOC (use), SUBREG_REG (src),
1112                                  def_insn, false);
1113     }
1114
1115   /* If this is a SUBREG of a ZERO_EXTEND or SIGN_EXTEND, and the SUBREG
1116      is the low part of the reg being extended then just use the inner
1117      operand.  Don't do this if the ZERO_EXTEND or SIGN_EXTEND insn will
1118      be removed due to it matching a LOAD_EXTEND_OP load from memory.  */
1119   else if (subreg_lowpart_p (use_reg))
1120     {
1121       use_insn = DF_REF_INSN (use);
1122       src = SET_SRC (def_set);
1123       if ((GET_CODE (src) == ZERO_EXTEND
1124            || GET_CODE (src) == SIGN_EXTEND)
1125           && REG_P (XEXP (src, 0))
1126           && GET_MODE (XEXP (src, 0)) == use_mode
1127           && !free_load_extend (src, def_insn)
1128           && all_uses_available_at (def_insn, use_insn))
1129         return try_fwprop_subst (use, DF_REF_LOC (use), XEXP (src, 0),
1130                                  def_insn, false);
1131     }
1132
1133   return false;
1134 }
1135
1136 /* Try to replace USE with SRC (defined in DEF_INSN) in __asm.  */
1137
1138 static bool
1139 forward_propagate_asm (df_ref use, rtx def_insn, rtx def_set, rtx reg)
1140 {
1141   rtx use_insn = DF_REF_INSN (use), src, use_pat, asm_operands, new_rtx, *loc;
1142   int speed_p, i;
1143   df_ref *use_vec;
1144
1145   gcc_assert ((DF_REF_FLAGS (use) & DF_REF_IN_NOTE) == 0);
1146
1147   src = SET_SRC (def_set);
1148   use_pat = PATTERN (use_insn);
1149
1150   /* In __asm don't replace if src might need more registers than
1151      reg, as that could increase register pressure on the __asm.  */
1152   use_vec = DF_INSN_USES (def_insn);
1153   if (use_vec[0] && use_vec[1])
1154     return false;
1155
1156   speed_p = optimize_bb_for_speed_p (BLOCK_FOR_INSN (use_insn));
1157   asm_operands = NULL_RTX;
1158   switch (GET_CODE (use_pat))
1159     {
1160     case ASM_OPERANDS:
1161       asm_operands = use_pat;
1162       break;
1163     case SET:
1164       if (MEM_P (SET_DEST (use_pat)))
1165         {
1166           loc = &SET_DEST (use_pat);
1167           new_rtx = propagate_rtx (*loc, GET_MODE (*loc), reg, src, speed_p);
1168           if (new_rtx)
1169             validate_unshare_change (use_insn, loc, new_rtx, true);
1170         }
1171       asm_operands = SET_SRC (use_pat);
1172       break;
1173     case PARALLEL:
1174       for (i = 0; i < XVECLEN (use_pat, 0); i++)
1175         if (GET_CODE (XVECEXP (use_pat, 0, i)) == SET)
1176           {
1177             if (MEM_P (SET_DEST (XVECEXP (use_pat, 0, i))))
1178               {
1179                 loc = &SET_DEST (XVECEXP (use_pat, 0, i));
1180                 new_rtx = propagate_rtx (*loc, GET_MODE (*loc), reg,
1181                                          src, speed_p);
1182                 if (new_rtx)
1183                   validate_unshare_change (use_insn, loc, new_rtx, true);
1184               }
1185             asm_operands = SET_SRC (XVECEXP (use_pat, 0, i));
1186           }
1187         else if (GET_CODE (XVECEXP (use_pat, 0, i)) == ASM_OPERANDS)
1188           asm_operands = XVECEXP (use_pat, 0, i);
1189       break;
1190     default:
1191       gcc_unreachable ();
1192     }
1193
1194   gcc_assert (asm_operands && GET_CODE (asm_operands) == ASM_OPERANDS);
1195   for (i = 0; i < ASM_OPERANDS_INPUT_LENGTH (asm_operands); i++)
1196     {
1197       loc = &ASM_OPERANDS_INPUT (asm_operands, i);
1198       new_rtx = propagate_rtx (*loc, GET_MODE (*loc), reg, src, speed_p);
1199       if (new_rtx)
1200         validate_unshare_change (use_insn, loc, new_rtx, true);
1201     }
1202
1203   if (num_changes_pending () == 0 || !apply_change_group ())
1204     return false;
1205
1206   num_changes++;
1207   return true;
1208 }
1209
1210 /* Try to replace USE with SRC (defined in DEF_INSN) and simplify the
1211    result.  */
1212
1213 static bool
1214 forward_propagate_and_simplify (df_ref use, rtx def_insn, rtx def_set)
1215 {
1216   rtx use_insn = DF_REF_INSN (use);
1217   rtx use_set = single_set (use_insn);
1218   rtx src, reg, new_rtx, *loc;
1219   bool set_reg_equal;
1220   enum machine_mode mode;
1221   int asm_use = -1;
1222
1223   if (INSN_CODE (use_insn) < 0)
1224     asm_use = asm_noperands (PATTERN (use_insn));
1225
1226   if (!use_set && asm_use < 0 && !DEBUG_INSN_P (use_insn))
1227     return false;
1228
1229   /* Do not propagate into PC, CC0, etc.  */
1230   if (use_set && GET_MODE (SET_DEST (use_set)) == VOIDmode)
1231     return false;
1232
1233   /* If def and use are subreg, check if they match.  */
1234   reg = DF_REF_REG (use);
1235   if (GET_CODE (reg) == SUBREG
1236       && GET_CODE (SET_DEST (def_set)) == SUBREG
1237       && (SUBREG_BYTE (SET_DEST (def_set)) != SUBREG_BYTE (reg)
1238           || GET_MODE (SET_DEST (def_set)) != GET_MODE (reg)))
1239     return false;
1240
1241   /* Check if the def had a subreg, but the use has the whole reg.  */
1242   if (REG_P (reg) && GET_CODE (SET_DEST (def_set)) == SUBREG)
1243     return false;
1244
1245   /* Check if the use has a subreg, but the def had the whole reg.  Unlike the
1246      previous case, the optimization is possible and often useful indeed.  */
1247   if (GET_CODE (reg) == SUBREG && REG_P (SET_DEST (def_set)))
1248     reg = SUBREG_REG (reg);
1249
1250   /* Check if the substitution is valid (last, because it's the most
1251      expensive check!).  */
1252   src = SET_SRC (def_set);
1253   if (!CONSTANT_P (src) && !all_uses_available_at (def_insn, use_insn))
1254     return false;
1255
1256   /* Check if the def is loading something from the constant pool; in this
1257      case we would undo optimization such as compress_float_constant.
1258      Still, we can set a REG_EQUAL note.  */
1259   if (MEM_P (src) && MEM_READONLY_P (src))
1260     {
1261       rtx x = avoid_constant_pool_reference (src);
1262       if (x != src && use_set)
1263         {
1264           rtx note = find_reg_note (use_insn, REG_EQUAL, NULL_RTX);
1265           rtx old_rtx = note ? XEXP (note, 0) : SET_SRC (use_set);
1266           rtx new_rtx = simplify_replace_rtx (old_rtx, src, x);
1267           if (old_rtx != new_rtx)
1268             set_unique_reg_note (use_insn, REG_EQUAL, copy_rtx (new_rtx));
1269         }
1270       return false;
1271     }
1272
1273   if (asm_use >= 0)
1274     return forward_propagate_asm (use, def_insn, def_set, reg);
1275
1276   /* Else try simplifying.  */
1277
1278   if (DF_REF_TYPE (use) == DF_REF_REG_MEM_STORE)
1279     {
1280       loc = &SET_DEST (use_set);
1281       set_reg_equal = false;
1282     }
1283   else if (!use_set)
1284     {
1285       loc = &INSN_VAR_LOCATION_LOC (use_insn);
1286       set_reg_equal = false;
1287     }
1288   else
1289     {
1290       rtx note = find_reg_note (use_insn, REG_EQUAL, NULL_RTX);
1291       if (DF_REF_FLAGS (use) & DF_REF_IN_NOTE)
1292         loc = &XEXP (note, 0);
1293       else
1294         loc = &SET_SRC (use_set);
1295
1296       /* Do not replace an existing REG_EQUAL note if the insn is not
1297          recognized.  Either we're already replacing in the note, or we'll
1298          separately try plugging the definition in the note and simplifying.
1299          And only install a REQ_EQUAL note when the destination is a REG,
1300          as the note would be invalid otherwise.  */
1301       set_reg_equal = (note == NULL_RTX && REG_P (SET_DEST (use_set)));
1302     }
1303
1304   if (GET_MODE (*loc) == VOIDmode)
1305     mode = GET_MODE (SET_DEST (use_set));
1306   else
1307     mode = GET_MODE (*loc);
1308
1309   new_rtx = propagate_rtx (*loc, mode, reg, src,
1310                            optimize_bb_for_speed_p (BLOCK_FOR_INSN (use_insn)));
1311
1312   if (!new_rtx)
1313     return false;
1314
1315   return try_fwprop_subst (use, loc, new_rtx, def_insn, set_reg_equal);
1316 }
1317
1318
1319 /* Given a use USE of an insn, if it has a single reaching
1320    definition, try to forward propagate it into that insn.  */
1321
1322 static void
1323 forward_propagate_into (df_ref use)
1324 {
1325   df_ref def;
1326   rtx def_insn, def_set, use_insn;
1327   rtx parent;
1328
1329   if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
1330     return;
1331   if (DF_REF_IS_ARTIFICIAL (use))
1332     return;
1333
1334   /* Only consider uses that have a single definition.  */
1335   def = get_def_for_use (use);
1336   if (!def)
1337     return;
1338   if (DF_REF_FLAGS (def) & DF_REF_READ_WRITE)
1339     return;
1340   if (DF_REF_IS_ARTIFICIAL (def))
1341     return;
1342
1343   /* Do not propagate loop invariant definitions inside the loop.  */
1344   if (DF_REF_BB (def)->loop_father != DF_REF_BB (use)->loop_father)
1345     return;
1346
1347   /* Check if the use is still present in the insn!  */
1348   use_insn = DF_REF_INSN (use);
1349   if (DF_REF_FLAGS (use) & DF_REF_IN_NOTE)
1350     parent = find_reg_note (use_insn, REG_EQUAL, NULL_RTX);
1351   else
1352     parent = PATTERN (use_insn);
1353
1354   if (!reg_mentioned_p (DF_REF_REG (use), parent))
1355     return;
1356
1357   def_insn = DF_REF_INSN (def);
1358   if (multiple_sets (def_insn))
1359     return;
1360   def_set = single_set (def_insn);
1361   if (!def_set)
1362     return;
1363
1364   /* Only try one kind of propagation.  If two are possible, we'll
1365      do it on the following iterations.  */
1366   if (!forward_propagate_and_simplify (use, def_insn, def_set))
1367     forward_propagate_subreg (use, def_insn, def_set);
1368 }
1369
1370 \f
1371 static void
1372 fwprop_init (void)
1373 {
1374   num_changes = 0;
1375   calculate_dominance_info (CDI_DOMINATORS);
1376
1377   /* We do not always want to propagate into loops, so we have to find
1378      loops and be careful about them.  But we have to call flow_loops_find
1379      before df_analyze, because flow_loops_find may introduce new jump
1380      insns (sadly) if we are not working in cfglayout mode.  */
1381   loop_optimizer_init (0);
1382
1383   build_single_def_use_links ();
1384   df_set_flags (DF_DEFER_INSN_RESCAN);
1385 }
1386
1387 static void
1388 fwprop_done (void)
1389 {
1390   loop_optimizer_finalize ();
1391
1392   VEC_free (df_ref, heap, use_def_ref);
1393   free_dominance_info (CDI_DOMINATORS);
1394   cleanup_cfg (0);
1395   delete_trivially_dead_insns (get_insns (), max_reg_num ());
1396
1397   if (dump_file)
1398     fprintf (dump_file,
1399              "\nNumber of successful forward propagations: %d\n\n",
1400              num_changes);
1401 }
1402
1403
1404 /* Main entry point.  */
1405
1406 static bool
1407 gate_fwprop (void)
1408 {
1409   return optimize > 0 && flag_forward_propagate;
1410 }
1411
1412 static unsigned int
1413 fwprop (void)
1414 {
1415   unsigned i;
1416
1417   fwprop_init ();
1418
1419   /* Go through all the uses.  update_df will create new ones at the
1420      end, and we'll go through them as well.
1421
1422      Do not forward propagate addresses into loops until after unrolling.
1423      CSE did so because it was able to fix its own mess, but we are not.  */
1424
1425   for (i = 0; i < DF_USES_TABLE_SIZE (); i++)
1426     {
1427       df_ref use = DF_USES_GET (i);
1428       if (use)
1429         if (DF_REF_TYPE (use) == DF_REF_REG_USE
1430             || DF_REF_BB (use)->loop_father == NULL
1431             /* The outer most loop is not really a loop.  */
1432             || loop_outer (DF_REF_BB (use)->loop_father) == NULL)
1433           forward_propagate_into (use);
1434     }
1435
1436   fwprop_done ();
1437   return 0;
1438 }
1439
1440 struct rtl_opt_pass pass_rtl_fwprop =
1441 {
1442  {
1443   RTL_PASS,
1444   "fwprop1",                            /* name */
1445   gate_fwprop,                          /* gate */
1446   fwprop,                               /* execute */
1447   NULL,                                 /* sub */
1448   NULL,                                 /* next */
1449   0,                                    /* static_pass_number */
1450   TV_FWPROP,                            /* tv_id */
1451   0,                                    /* properties_required */
1452   0,                                    /* properties_provided */
1453   0,                                    /* properties_destroyed */
1454   0,                                    /* todo_flags_start */
1455   TODO_df_finish | TODO_verify_rtl_sharing |
1456   TODO_dump_func                        /* todo_flags_finish */
1457  }
1458 };
1459
1460 static unsigned int
1461 fwprop_addr (void)
1462 {
1463   unsigned i;
1464   fwprop_init ();
1465
1466   /* Go through all the uses.  update_df will create new ones at the
1467      end, and we'll go through them as well.  */
1468   for (i = 0; i < DF_USES_TABLE_SIZE (); i++)
1469     {
1470       df_ref use = DF_USES_GET (i);
1471       if (use)
1472         if (DF_REF_TYPE (use) != DF_REF_REG_USE
1473             && DF_REF_BB (use)->loop_father != NULL
1474             /* The outer most loop is not really a loop.  */
1475             && loop_outer (DF_REF_BB (use)->loop_father) != NULL)
1476           forward_propagate_into (use);
1477     }
1478
1479   fwprop_done ();
1480
1481   return 0;
1482 }
1483
1484 struct rtl_opt_pass pass_rtl_fwprop_addr =
1485 {
1486  {
1487   RTL_PASS,
1488   "fwprop2",                            /* name */
1489   gate_fwprop,                          /* gate */
1490   fwprop_addr,                          /* execute */
1491   NULL,                                 /* sub */
1492   NULL,                                 /* next */
1493   0,                                    /* static_pass_number */
1494   TV_FWPROP,                            /* tv_id */
1495   0,                                    /* properties_required */
1496   0,                                    /* properties_provided */
1497   0,                                    /* properties_destroyed */
1498   0,                                    /* todo_flags_start */
1499   TODO_df_finish | TODO_verify_rtl_sharing |
1500   TODO_dump_func                        /* todo_flags_finish */
1501  }
1502 };