OSDN Git Service

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