OSDN Git Service

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