postreload.c (fixup_debug_insns): Remove arg REGNO.
[platform/upstream/gcc.git] / gcc / postreload.c
1 /* Perform simple optimizations to clean up the result of reload.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
4    2010 Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26
27 #include "machmode.h"
28 #include "hard-reg-set.h"
29 #include "rtl.h"
30 #include "tm_p.h"
31 #include "obstack.h"
32 #include "insn-config.h"
33 #include "flags.h"
34 #include "function.h"
35 #include "expr.h"
36 #include "optabs.h"
37 #include "regs.h"
38 #include "basic-block.h"
39 #include "reload.h"
40 #include "recog.h"
41 #include "output.h"
42 #include "cselib.h"
43 #include "diagnostic-core.h"
44 #include "toplev.h"
45 #include "except.h"
46 #include "tree.h"
47 #include "timevar.h"
48 #include "tree-pass.h"
49 #include "df.h"
50 #include "dbgcnt.h"
51
52 static int reload_cse_noop_set_p (rtx);
53 static void reload_cse_simplify (rtx, rtx);
54 static void reload_cse_regs_1 (rtx);
55 static int reload_cse_simplify_set (rtx, rtx);
56 static int reload_cse_simplify_operands (rtx, rtx);
57
58 static void reload_combine (void);
59 static void reload_combine_note_use (rtx *, rtx, int, rtx);
60 static void reload_combine_note_store (rtx, const_rtx, void *);
61
62 static bool reload_cse_move2add (rtx);
63 static void move2add_note_store (rtx, const_rtx, void *);
64
65 /* Call cse / combine like post-reload optimization phases.
66    FIRST is the first instruction.  */
67 void
68 reload_cse_regs (rtx first ATTRIBUTE_UNUSED)
69 {
70   bool moves_converted;
71   reload_cse_regs_1 (first);
72   reload_combine ();
73   moves_converted = reload_cse_move2add (first);
74   if (flag_expensive_optimizations)
75     {
76       if (moves_converted)
77         reload_combine ();
78       reload_cse_regs_1 (first);
79     }
80 }
81
82 /* See whether a single set SET is a noop.  */
83 static int
84 reload_cse_noop_set_p (rtx set)
85 {
86   if (cselib_reg_set_mode (SET_DEST (set)) != GET_MODE (SET_DEST (set)))
87     return 0;
88
89   return rtx_equal_for_cselib_p (SET_DEST (set), SET_SRC (set));
90 }
91
92 /* Try to simplify INSN.  */
93 static void
94 reload_cse_simplify (rtx insn, rtx testreg)
95 {
96   rtx body = PATTERN (insn);
97
98   if (GET_CODE (body) == SET)
99     {
100       int count = 0;
101
102       /* Simplify even if we may think it is a no-op.
103          We may think a memory load of a value smaller than WORD_SIZE
104          is redundant because we haven't taken into account possible
105          implicit extension.  reload_cse_simplify_set() will bring
106          this out, so it's safer to simplify before we delete.  */
107       count += reload_cse_simplify_set (body, insn);
108
109       if (!count && reload_cse_noop_set_p (body))
110         {
111           rtx value = SET_DEST (body);
112           if (REG_P (value)
113               && ! REG_FUNCTION_VALUE_P (value))
114             value = 0;
115           delete_insn_and_edges (insn);
116           return;
117         }
118
119       if (count > 0)
120         apply_change_group ();
121       else
122         reload_cse_simplify_operands (insn, testreg);
123     }
124   else if (GET_CODE (body) == PARALLEL)
125     {
126       int i;
127       int count = 0;
128       rtx value = NULL_RTX;
129
130       /* Registers mentioned in the clobber list for an asm cannot be reused
131          within the body of the asm.  Invalidate those registers now so that
132          we don't try to substitute values for them.  */
133       if (asm_noperands (body) >= 0)
134         {
135           for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
136             {
137               rtx part = XVECEXP (body, 0, i);
138               if (GET_CODE (part) == CLOBBER && REG_P (XEXP (part, 0)))
139                 cselib_invalidate_rtx (XEXP (part, 0));
140             }
141         }
142
143       /* If every action in a PARALLEL is a noop, we can delete
144          the entire PARALLEL.  */
145       for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
146         {
147           rtx part = XVECEXP (body, 0, i);
148           if (GET_CODE (part) == SET)
149             {
150               if (! reload_cse_noop_set_p (part))
151                 break;
152               if (REG_P (SET_DEST (part))
153                   && REG_FUNCTION_VALUE_P (SET_DEST (part)))
154                 {
155                   if (value)
156                     break;
157                   value = SET_DEST (part);
158                 }
159             }
160           else if (GET_CODE (part) != CLOBBER)
161             break;
162         }
163
164       if (i < 0)
165         {
166           delete_insn_and_edges (insn);
167           /* We're done with this insn.  */
168           return;
169         }
170
171       /* It's not a no-op, but we can try to simplify it.  */
172       for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
173         if (GET_CODE (XVECEXP (body, 0, i)) == SET)
174           count += reload_cse_simplify_set (XVECEXP (body, 0, i), insn);
175
176       if (count > 0)
177         apply_change_group ();
178       else
179         reload_cse_simplify_operands (insn, testreg);
180     }
181 }
182
183 /* Do a very simple CSE pass over the hard registers.
184
185    This function detects no-op moves where we happened to assign two
186    different pseudo-registers to the same hard register, and then
187    copied one to the other.  Reload will generate a useless
188    instruction copying a register to itself.
189
190    This function also detects cases where we load a value from memory
191    into two different registers, and (if memory is more expensive than
192    registers) changes it to simply copy the first register into the
193    second register.
194
195    Another optimization is performed that scans the operands of each
196    instruction to see whether the value is already available in a
197    hard register.  It then replaces the operand with the hard register
198    if possible, much like an optional reload would.  */
199
200 static void
201 reload_cse_regs_1 (rtx first)
202 {
203   rtx insn;
204   rtx testreg = gen_rtx_REG (VOIDmode, -1);
205
206   cselib_init (CSELIB_RECORD_MEMORY);
207   init_alias_analysis ();
208
209   for (insn = first; insn; insn = NEXT_INSN (insn))
210     {
211       if (INSN_P (insn))
212         reload_cse_simplify (insn, testreg);
213
214       cselib_process_insn (insn);
215     }
216
217   /* Clean up.  */
218   end_alias_analysis ();
219   cselib_finish ();
220 }
221
222 /* Try to simplify a single SET instruction.  SET is the set pattern.
223    INSN is the instruction it came from.
224    This function only handles one case: if we set a register to a value
225    which is not a register, we try to find that value in some other register
226    and change the set into a register copy.  */
227
228 static int
229 reload_cse_simplify_set (rtx set, rtx insn)
230 {
231   int did_change = 0;
232   int dreg;
233   rtx src;
234   enum reg_class dclass;
235   int old_cost;
236   cselib_val *val;
237   struct elt_loc_list *l;
238 #ifdef LOAD_EXTEND_OP
239   enum rtx_code extend_op = UNKNOWN;
240 #endif
241   bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
242
243   dreg = true_regnum (SET_DEST (set));
244   if (dreg < 0)
245     return 0;
246
247   src = SET_SRC (set);
248   if (side_effects_p (src) || true_regnum (src) >= 0)
249     return 0;
250
251   dclass = REGNO_REG_CLASS (dreg);
252
253 #ifdef LOAD_EXTEND_OP
254   /* When replacing a memory with a register, we need to honor assumptions
255      that combine made wrt the contents of sign bits.  We'll do this by
256      generating an extend instruction instead of a reg->reg copy.  Thus
257      the destination must be a register that we can widen.  */
258   if (MEM_P (src)
259       && GET_MODE_BITSIZE (GET_MODE (src)) < BITS_PER_WORD
260       && (extend_op = LOAD_EXTEND_OP (GET_MODE (src))) != UNKNOWN
261       && !REG_P (SET_DEST (set)))
262     return 0;
263 #endif
264
265   val = cselib_lookup (src, GET_MODE (SET_DEST (set)), 0);
266   if (! val)
267     return 0;
268
269   /* If memory loads are cheaper than register copies, don't change them.  */
270   if (MEM_P (src))
271     old_cost = memory_move_cost (GET_MODE (src), dclass, true);
272   else if (REG_P (src))
273     old_cost = register_move_cost (GET_MODE (src),
274                                    REGNO_REG_CLASS (REGNO (src)), dclass);
275   else
276     old_cost = rtx_cost (src, SET, speed);
277
278   for (l = val->locs; l; l = l->next)
279     {
280       rtx this_rtx = l->loc;
281       int this_cost;
282
283       if (CONSTANT_P (this_rtx) && ! references_value_p (this_rtx, 0))
284         {
285 #ifdef LOAD_EXTEND_OP
286           if (extend_op != UNKNOWN)
287             {
288               HOST_WIDE_INT this_val;
289
290               /* ??? I'm lazy and don't wish to handle CONST_DOUBLE.  Other
291                  constants, such as SYMBOL_REF, cannot be extended.  */
292               if (!CONST_INT_P (this_rtx))
293                 continue;
294
295               this_val = INTVAL (this_rtx);
296               switch (extend_op)
297                 {
298                 case ZERO_EXTEND:
299                   this_val &= GET_MODE_MASK (GET_MODE (src));
300                   break;
301                 case SIGN_EXTEND:
302                   /* ??? In theory we're already extended.  */
303                   if (this_val == trunc_int_for_mode (this_val, GET_MODE (src)))
304                     break;
305                 default:
306                   gcc_unreachable ();
307                 }
308               this_rtx = GEN_INT (this_val);
309             }
310 #endif
311           this_cost = rtx_cost (this_rtx, SET, speed);
312         }
313       else if (REG_P (this_rtx))
314         {
315 #ifdef LOAD_EXTEND_OP
316           if (extend_op != UNKNOWN)
317             {
318               this_rtx = gen_rtx_fmt_e (extend_op, word_mode, this_rtx);
319               this_cost = rtx_cost (this_rtx, SET, speed);
320             }
321           else
322 #endif
323             this_cost = register_move_cost (GET_MODE (this_rtx),
324                                             REGNO_REG_CLASS (REGNO (this_rtx)),
325                                             dclass);
326         }
327       else
328         continue;
329
330       /* If equal costs, prefer registers over anything else.  That
331          tends to lead to smaller instructions on some machines.  */
332       if (this_cost < old_cost
333           || (this_cost == old_cost
334               && REG_P (this_rtx)
335               && !REG_P (SET_SRC (set))))
336         {
337 #ifdef LOAD_EXTEND_OP
338           if (GET_MODE_BITSIZE (GET_MODE (SET_DEST (set))) < BITS_PER_WORD
339               && extend_op != UNKNOWN
340 #ifdef CANNOT_CHANGE_MODE_CLASS
341               && !CANNOT_CHANGE_MODE_CLASS (GET_MODE (SET_DEST (set)),
342                                             word_mode,
343                                             REGNO_REG_CLASS (REGNO (SET_DEST (set))))
344 #endif
345               )
346             {
347               rtx wide_dest = gen_rtx_REG (word_mode, REGNO (SET_DEST (set)));
348               ORIGINAL_REGNO (wide_dest) = ORIGINAL_REGNO (SET_DEST (set));
349               validate_change (insn, &SET_DEST (set), wide_dest, 1);
350             }
351 #endif
352
353           validate_unshare_change (insn, &SET_SRC (set), this_rtx, 1);
354           old_cost = this_cost, did_change = 1;
355         }
356     }
357
358   return did_change;
359 }
360
361 /* Try to replace operands in INSN with equivalent values that are already
362    in registers.  This can be viewed as optional reloading.
363
364    For each non-register operand in the insn, see if any hard regs are
365    known to be equivalent to that operand.  Record the alternatives which
366    can accept these hard registers.  Among all alternatives, select the
367    ones which are better or equal to the one currently matching, where
368    "better" is in terms of '?' and '!' constraints.  Among the remaining
369    alternatives, select the one which replaces most operands with
370    hard registers.  */
371
372 static int
373 reload_cse_simplify_operands (rtx insn, rtx testreg)
374 {
375   int i, j;
376
377   /* For each operand, all registers that are equivalent to it.  */
378   HARD_REG_SET equiv_regs[MAX_RECOG_OPERANDS];
379
380   const char *constraints[MAX_RECOG_OPERANDS];
381
382   /* Vector recording how bad an alternative is.  */
383   int *alternative_reject;
384   /* Vector recording how many registers can be introduced by choosing
385      this alternative.  */
386   int *alternative_nregs;
387   /* Array of vectors recording, for each operand and each alternative,
388      which hard register to substitute, or -1 if the operand should be
389      left as it is.  */
390   int *op_alt_regno[MAX_RECOG_OPERANDS];
391   /* Array of alternatives, sorted in order of decreasing desirability.  */
392   int *alternative_order;
393
394   extract_insn (insn);
395
396   if (recog_data.n_alternatives == 0 || recog_data.n_operands == 0)
397     return 0;
398
399   /* Figure out which alternative currently matches.  */
400   if (! constrain_operands (1))
401     fatal_insn_not_found (insn);
402
403   alternative_reject = XALLOCAVEC (int, recog_data.n_alternatives);
404   alternative_nregs = XALLOCAVEC (int, recog_data.n_alternatives);
405   alternative_order = XALLOCAVEC (int, recog_data.n_alternatives);
406   memset (alternative_reject, 0, recog_data.n_alternatives * sizeof (int));
407   memset (alternative_nregs, 0, recog_data.n_alternatives * sizeof (int));
408
409   /* For each operand, find out which regs are equivalent.  */
410   for (i = 0; i < recog_data.n_operands; i++)
411     {
412       cselib_val *v;
413       struct elt_loc_list *l;
414       rtx op;
415
416       CLEAR_HARD_REG_SET (equiv_regs[i]);
417
418       /* cselib blows up on CODE_LABELs.  Trying to fix that doesn't seem
419          right, so avoid the problem here.  Likewise if we have a constant
420          and the insn pattern doesn't tell us the mode we need.  */
421       if (LABEL_P (recog_data.operand[i])
422           || (CONSTANT_P (recog_data.operand[i])
423               && recog_data.operand_mode[i] == VOIDmode))
424         continue;
425
426       op = recog_data.operand[i];
427 #ifdef LOAD_EXTEND_OP
428       if (MEM_P (op)
429           && GET_MODE_BITSIZE (GET_MODE (op)) < BITS_PER_WORD
430           && LOAD_EXTEND_OP (GET_MODE (op)) != UNKNOWN)
431         {
432           rtx set = single_set (insn);
433
434           /* We might have multiple sets, some of which do implicit
435              extension.  Punt on this for now.  */
436           if (! set)
437             continue;
438           /* If the destination is also a MEM or a STRICT_LOW_PART, no
439              extension applies.
440              Also, if there is an explicit extension, we don't have to
441              worry about an implicit one.  */
442           else if (MEM_P (SET_DEST (set))
443                    || GET_CODE (SET_DEST (set)) == STRICT_LOW_PART
444                    || GET_CODE (SET_SRC (set)) == ZERO_EXTEND
445                    || GET_CODE (SET_SRC (set)) == SIGN_EXTEND)
446             ; /* Continue ordinary processing.  */
447 #ifdef CANNOT_CHANGE_MODE_CLASS
448           /* If the register cannot change mode to word_mode, it follows that
449              it cannot have been used in word_mode.  */
450           else if (REG_P (SET_DEST (set))
451                    && CANNOT_CHANGE_MODE_CLASS (GET_MODE (SET_DEST (set)),
452                                                 word_mode,
453                                                 REGNO_REG_CLASS (REGNO (SET_DEST (set)))))
454             ; /* Continue ordinary processing.  */
455 #endif
456           /* If this is a straight load, make the extension explicit.  */
457           else if (REG_P (SET_DEST (set))
458                    && recog_data.n_operands == 2
459                    && SET_SRC (set) == op
460                    && SET_DEST (set) == recog_data.operand[1-i])
461             {
462               validate_change (insn, recog_data.operand_loc[i],
463                                gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (op)),
464                                               word_mode, op),
465                                1);
466               validate_change (insn, recog_data.operand_loc[1-i],
467                                gen_rtx_REG (word_mode, REGNO (SET_DEST (set))),
468                                1);
469               if (! apply_change_group ())
470                 return 0;
471               return reload_cse_simplify_operands (insn, testreg);
472             }
473           else
474             /* ??? There might be arithmetic operations with memory that are
475                safe to optimize, but is it worth the trouble?  */
476             continue;
477         }
478 #endif /* LOAD_EXTEND_OP */
479       v = cselib_lookup (op, recog_data.operand_mode[i], 0);
480       if (! v)
481         continue;
482
483       for (l = v->locs; l; l = l->next)
484         if (REG_P (l->loc))
485           SET_HARD_REG_BIT (equiv_regs[i], REGNO (l->loc));
486     }
487
488   for (i = 0; i < recog_data.n_operands; i++)
489     {
490       enum machine_mode mode;
491       int regno;
492       const char *p;
493
494       op_alt_regno[i] = XALLOCAVEC (int, recog_data.n_alternatives);
495       for (j = 0; j < recog_data.n_alternatives; j++)
496         op_alt_regno[i][j] = -1;
497
498       p = constraints[i] = recog_data.constraints[i];
499       mode = recog_data.operand_mode[i];
500
501       /* Add the reject values for each alternative given by the constraints
502          for this operand.  */
503       j = 0;
504       while (*p != '\0')
505         {
506           char c = *p++;
507           if (c == ',')
508             j++;
509           else if (c == '?')
510             alternative_reject[j] += 3;
511           else if (c == '!')
512             alternative_reject[j] += 300;
513         }
514
515       /* We won't change operands which are already registers.  We
516          also don't want to modify output operands.  */
517       regno = true_regnum (recog_data.operand[i]);
518       if (regno >= 0
519           || constraints[i][0] == '='
520           || constraints[i][0] == '+')
521         continue;
522
523       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
524         {
525           enum reg_class rclass = NO_REGS;
526
527           if (! TEST_HARD_REG_BIT (equiv_regs[i], regno))
528             continue;
529
530           SET_REGNO (testreg, regno);
531           PUT_MODE (testreg, mode);
532
533           /* We found a register equal to this operand.  Now look for all
534              alternatives that can accept this register and have not been
535              assigned a register they can use yet.  */
536           j = 0;
537           p = constraints[i];
538           for (;;)
539             {
540               char c = *p;
541
542               switch (c)
543                 {
544                 case '=':  case '+':  case '?':
545                 case '#':  case '&':  case '!':
546                 case '*':  case '%':
547                 case '0':  case '1':  case '2':  case '3':  case '4':
548                 case '5':  case '6':  case '7':  case '8':  case '9':
549                 case '<':  case '>':  case 'V':  case 'o':
550                 case 'E':  case 'F':  case 'G':  case 'H':
551                 case 's':  case 'i':  case 'n':
552                 case 'I':  case 'J':  case 'K':  case 'L':
553                 case 'M':  case 'N':  case 'O':  case 'P':
554                 case 'p':  case 'X':  case TARGET_MEM_CONSTRAINT:
555                   /* These don't say anything we care about.  */
556                   break;
557
558                 case 'g': case 'r':
559                   rclass = reg_class_subunion[(int) rclass][(int) GENERAL_REGS];
560                   break;
561
562                 default:
563                   rclass
564                     = (reg_class_subunion
565                        [(int) rclass]
566                        [(int) REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p)]);
567                   break;
568
569                 case ',': case '\0':
570                   /* See if REGNO fits this alternative, and set it up as the
571                      replacement register if we don't have one for this
572                      alternative yet and the operand being replaced is not
573                      a cheap CONST_INT.  */
574                   if (op_alt_regno[i][j] == -1
575                       && reg_fits_class_p (testreg, rclass, 0, mode)
576                       && (!CONST_INT_P (recog_data.operand[i])
577                           || (rtx_cost (recog_data.operand[i], SET,
578                                         optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn)))
579                               > rtx_cost (testreg, SET,
580                                         optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn))))))
581                     {
582                       alternative_nregs[j]++;
583                       op_alt_regno[i][j] = regno;
584                     }
585                   j++;
586                   rclass = NO_REGS;
587                   break;
588                 }
589               p += CONSTRAINT_LEN (c, p);
590
591               if (c == '\0')
592                 break;
593             }
594         }
595     }
596
597   /* Record all alternatives which are better or equal to the currently
598      matching one in the alternative_order array.  */
599   for (i = j = 0; i < recog_data.n_alternatives; i++)
600     if (alternative_reject[i] <= alternative_reject[which_alternative])
601       alternative_order[j++] = i;
602   recog_data.n_alternatives = j;
603
604   /* Sort it.  Given a small number of alternatives, a dumb algorithm
605      won't hurt too much.  */
606   for (i = 0; i < recog_data.n_alternatives - 1; i++)
607     {
608       int best = i;
609       int best_reject = alternative_reject[alternative_order[i]];
610       int best_nregs = alternative_nregs[alternative_order[i]];
611       int tmp;
612
613       for (j = i + 1; j < recog_data.n_alternatives; j++)
614         {
615           int this_reject = alternative_reject[alternative_order[j]];
616           int this_nregs = alternative_nregs[alternative_order[j]];
617
618           if (this_reject < best_reject
619               || (this_reject == best_reject && this_nregs > best_nregs))
620             {
621               best = j;
622               best_reject = this_reject;
623               best_nregs = this_nregs;
624             }
625         }
626
627       tmp = alternative_order[best];
628       alternative_order[best] = alternative_order[i];
629       alternative_order[i] = tmp;
630     }
631
632   /* Substitute the operands as determined by op_alt_regno for the best
633      alternative.  */
634   j = alternative_order[0];
635
636   for (i = 0; i < recog_data.n_operands; i++)
637     {
638       enum machine_mode mode = recog_data.operand_mode[i];
639       if (op_alt_regno[i][j] == -1)
640         continue;
641
642       validate_change (insn, recog_data.operand_loc[i],
643                        gen_rtx_REG (mode, op_alt_regno[i][j]), 1);
644     }
645
646   for (i = recog_data.n_dups - 1; i >= 0; i--)
647     {
648       int op = recog_data.dup_num[i];
649       enum machine_mode mode = recog_data.operand_mode[op];
650
651       if (op_alt_regno[op][j] == -1)
652         continue;
653
654       validate_change (insn, recog_data.dup_loc[i],
655                        gen_rtx_REG (mode, op_alt_regno[op][j]), 1);
656     }
657
658   return apply_change_group ();
659 }
660 \f
661 /* If reload couldn't use reg+reg+offset addressing, try to use reg+reg
662    addressing now.
663    This code might also be useful when reload gave up on reg+reg addressing
664    because of clashes between the return register and INDEX_REG_CLASS.  */
665
666 /* The maximum number of uses of a register we can keep track of to
667    replace them with reg+reg addressing.  */
668 #define RELOAD_COMBINE_MAX_USES 16
669
670 /* Describes a recorded use of a register.  */
671 struct reg_use
672 {
673   /* The insn where a register has been used.  */
674   rtx insn;
675   /* Points to the memory reference enclosing the use, if any, NULL_RTX
676      otherwise.  */
677   rtx containing_mem;
678   /* Location of the register withing INSN.  */
679   rtx *usep;
680   /* The reverse uid of the insn.  */
681   int ruid;
682 };
683
684 /* If the register is used in some unknown fashion, USE_INDEX is negative.
685    If it is dead, USE_INDEX is RELOAD_COMBINE_MAX_USES, and STORE_RUID
686    indicates where it is first set or clobbered.
687    Otherwise, USE_INDEX is the index of the last encountered use of the
688    register (which is first among these we have seen since we scan backwards).
689    USE_RUID indicates the first encountered, i.e. last, of these uses.
690    If ALL_OFFSETS_MATCH is true, all encountered uses were inside a PLUS
691    with a constant offset; OFFSET contains this constant in that case.
692    STORE_RUID is always meaningful if we only want to use a value in a
693    register in a different place: it denotes the next insn in the insn
694    stream (i.e. the last encountered) that sets or clobbers the register.
695    REAL_STORE_RUID is similar, but clobbers are ignored when updating it.  */
696 static struct
697   {
698     struct reg_use reg_use[RELOAD_COMBINE_MAX_USES];
699     rtx offset;
700     int use_index;
701     int store_ruid;
702     int real_store_ruid;
703     int use_ruid;
704     bool all_offsets_match;
705   } reg_state[FIRST_PSEUDO_REGISTER];
706
707 /* Reverse linear uid.  This is increased in reload_combine while scanning
708    the instructions from last to first.  It is used to set last_label_ruid
709    and the store_ruid / use_ruid fields in reg_state.  */
710 static int reload_combine_ruid;
711
712 /* The RUID of the last label we encountered in reload_combine.  */
713 static int last_label_ruid;
714
715 /* The RUID of the last jump we encountered in reload_combine.  */
716 static int last_jump_ruid;
717
718 /* The register numbers of the first and last index register.  A value of
719    -1 in LAST_INDEX_REG indicates that we've previously computed these
720    values and found no suitable index registers.  */
721 static int first_index_reg = -1;
722 static int last_index_reg;
723
724 #define LABEL_LIVE(LABEL) \
725   (label_live[CODE_LABEL_NUMBER (LABEL) - min_labelno])
726
727 /* Subroutine of reload_combine_split_ruids, called to fix up a single
728    ruid pointed to by *PRUID if it is higher than SPLIT_RUID.  */
729
730 static inline void
731 reload_combine_split_one_ruid (int *pruid, int split_ruid)
732 {
733   if (*pruid > split_ruid)
734     (*pruid)++;
735 }
736
737 /* Called when we insert a new insn in a position we've already passed in
738    the scan.  Examine all our state, increasing all ruids that are higher
739    than SPLIT_RUID by one in order to make room for a new insn.  */
740
741 static void
742 reload_combine_split_ruids (int split_ruid)
743 {
744   unsigned i;
745
746   reload_combine_split_one_ruid (&reload_combine_ruid, split_ruid);
747   reload_combine_split_one_ruid (&last_label_ruid, split_ruid);
748   reload_combine_split_one_ruid (&last_jump_ruid, split_ruid);
749
750   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
751     {
752       int j, idx = reg_state[i].use_index;
753       reload_combine_split_one_ruid (&reg_state[i].use_ruid, split_ruid);
754       reload_combine_split_one_ruid (&reg_state[i].store_ruid, split_ruid);
755       reload_combine_split_one_ruid (&reg_state[i].real_store_ruid,
756                                      split_ruid);
757       if (idx < 0)
758         continue;
759       for (j = idx; j < RELOAD_COMBINE_MAX_USES; j++)
760         {
761           reload_combine_split_one_ruid (&reg_state[i].reg_use[j].ruid,
762                                          split_ruid);
763         }
764     }
765 }
766
767 /* Called when we are about to rescan a previously encountered insn with
768    reload_combine_note_use after modifying some part of it.  This clears all
769    information about uses in that particular insn.  */
770
771 static void
772 reload_combine_purge_insn_uses (rtx insn)
773 {
774   unsigned i;
775
776   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
777     {
778       int j, k, idx = reg_state[i].use_index;
779       if (idx < 0)
780         continue;
781       j = k = RELOAD_COMBINE_MAX_USES;
782       while (j-- > idx)
783         {
784           if (reg_state[i].reg_use[j].insn != insn)
785             {
786               k--;
787               if (k != j)
788                 reg_state[i].reg_use[k] = reg_state[i].reg_use[j];
789             }
790         }
791       reg_state[i].use_index = k;
792     }
793 }
794
795 /* Called when we need to forget about all uses of REGNO after an insn
796    which is identified by RUID.  */
797
798 static void
799 reload_combine_purge_reg_uses_after_ruid (unsigned regno, int ruid)
800 {
801   int j, k, idx = reg_state[regno].use_index;
802   if (idx < 0)
803     return;
804   j = k = RELOAD_COMBINE_MAX_USES;
805   while (j-- > idx)
806     {
807       if (reg_state[regno].reg_use[j].ruid >= ruid)
808         {
809           k--;
810           if (k != j)
811             reg_state[regno].reg_use[k] = reg_state[regno].reg_use[j];
812         }
813     }
814   reg_state[regno].use_index = k;
815 }
816
817 /* Find the use of REGNO with the ruid that is highest among those
818    lower than RUID_LIMIT, and return it if it is the only use of this
819    reg in the insn (or if the insn is a debug insn).  Return NULL
820    otherwise.  */
821
822 static struct reg_use *
823 reload_combine_closest_single_use (unsigned regno, int ruid_limit)
824 {
825   int i, best_ruid = 0;
826   int use_idx = reg_state[regno].use_index;
827   struct reg_use *retval;
828
829   if (use_idx < 0)
830     return NULL;
831   retval = NULL;
832   for (i = use_idx; i < RELOAD_COMBINE_MAX_USES; i++)
833     {
834       struct reg_use *use = reg_state[regno].reg_use + i; 
835       int this_ruid = use->ruid;
836       if (this_ruid >= ruid_limit)
837         continue;
838       if (this_ruid > best_ruid)
839         {
840           best_ruid = this_ruid;
841           retval = reg_state[regno].reg_use + i;
842         }
843       else if (this_ruid == best_ruid && !DEBUG_INSN_P (use->insn))
844         retval = NULL;
845     }
846   if (last_label_ruid >= best_ruid)
847     return NULL;
848   return retval;
849 }
850
851 /* After we've moved an add insn, fix up any debug insns that occur
852    between the old location of the add and the new location.  REG is
853    the destination register of the add insn; REPLACEMENT is the
854    SET_SRC of the add.  FROM and TO specify the range in which we
855    should make this change on debug insns.  */
856
857 static void
858 fixup_debug_insns (rtx reg, rtx replacement, rtx from, rtx to)
859 {
860   rtx insn;
861   for (insn = from; insn != to; insn = NEXT_INSN (insn))
862     {
863       rtx t;
864
865       if (!DEBUG_INSN_P (insn))
866         continue;
867       
868       t = INSN_VAR_LOCATION_LOC (insn);
869       t = simplify_replace_rtx (t, reg, copy_rtx (replacement));
870       validate_change (insn, &INSN_VAR_LOCATION_LOC (insn), t, 0);
871     }
872 }
873
874 /* Called by reload_combine when scanning INSN.  This function tries to detect
875    patterns where a constant is added to a register, and the result is used
876    in an address.
877    Return true if no further processing is needed on INSN; false if it wasn't
878    recognized and should be handled normally.  */
879
880 static bool
881 reload_combine_recognize_const_pattern (rtx insn)
882 {
883   int from_ruid = reload_combine_ruid;
884   rtx set, pat, reg, src, addreg;
885   unsigned int regno;
886   struct reg_use *use;
887   bool must_move_add;
888   rtx add_moved_after_insn = NULL_RTX;
889   int add_moved_after_ruid = 0;
890   int clobbered_regno = -1;
891
892   set = single_set (insn);
893   if (set == NULL_RTX)
894     return false;
895
896   reg = SET_DEST (set);
897   src = SET_SRC (set);
898   if (!REG_P (reg)
899       || hard_regno_nregs[REGNO (reg)][GET_MODE (reg)] != 1
900       || GET_MODE (reg) != Pmode
901       || reg == stack_pointer_rtx)
902     return false;
903
904   regno = REGNO (reg);
905
906   /* We look for a REG1 = REG2 + CONSTANT insn, followed by either
907      uses of REG1 inside an address, or inside another add insn.  If
908      possible and profitable, merge the addition into subsequent
909      uses.  */
910   if (GET_CODE (src) != PLUS
911       || !REG_P (XEXP (src, 0))
912       || !CONSTANT_P (XEXP (src, 1)))
913     return false;
914
915   addreg = XEXP (src, 0);
916   must_move_add = rtx_equal_p (reg, addreg);
917
918   pat = PATTERN (insn);
919   if (must_move_add && set != pat)
920     {
921       /* We have to be careful when moving the add; apart from the
922          single_set there may also be clobbers.  Recognize one special
923          case, that of one clobber alongside the set (likely a clobber
924          of the CC register).  */
925       gcc_assert (GET_CODE (PATTERN (insn)) == PARALLEL);
926       if (XVECLEN (pat, 0) != 2 || XVECEXP (pat, 0, 0) != set
927           || GET_CODE (XVECEXP (pat, 0, 1)) != CLOBBER
928           || !REG_P (XEXP (XVECEXP (pat, 0, 1), 0)))
929         return false;
930       clobbered_regno = REGNO (XEXP (XVECEXP (pat, 0, 1), 0));
931     }
932
933   do
934     {
935       use = reload_combine_closest_single_use (regno, from_ruid);
936
937       if (use)
938         /* Start the search for the next use from here.  */
939         from_ruid = use->ruid;
940
941       /* We'll fix up DEBUG_INSNs after we're done.  */
942       if (use && DEBUG_INSN_P (use->insn))
943         continue;
944
945       if (use && GET_MODE (*use->usep) == Pmode)
946         {
947           rtx use_insn = use->insn;
948           int use_ruid = use->ruid;
949           rtx mem = use->containing_mem;
950           bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (use_insn));
951
952           /* Avoid moving the add insn past a jump.  */
953           if (must_move_add && use_ruid <= last_jump_ruid)
954             break;
955
956           /* If the add clobbers another hard reg in parallel, don't move
957              it past a real set of this hard reg.  */
958           if (must_move_add && clobbered_regno >= 0
959               && reg_state[clobbered_regno].real_store_ruid >= use_ruid)
960             break;
961
962           /* Avoid moving a use of ADDREG past a point where it
963              is stored.  */
964           if (reg_state[REGNO (addreg)].store_ruid >= use_ruid)
965             break;
966
967           if (mem != NULL_RTX)
968             {
969               addr_space_t as = MEM_ADDR_SPACE (mem);
970               rtx oldaddr = XEXP (mem, 0);
971               rtx newaddr = NULL_RTX;
972               int old_cost = address_cost (oldaddr, GET_MODE (mem), as, speed);
973               int new_cost;
974
975               newaddr = simplify_replace_rtx (oldaddr, reg, copy_rtx (src));
976               if (memory_address_addr_space_p (GET_MODE (mem), newaddr, as))
977                 {
978                   XEXP (mem, 0) = newaddr;
979                   new_cost = address_cost (newaddr, GET_MODE (mem), as, speed);
980                   XEXP (mem, 0) = oldaddr;
981                   if (new_cost <= old_cost
982                       && validate_change (use_insn,
983                                           &XEXP (mem, 0), newaddr, 0))
984                     {
985                       reload_combine_purge_insn_uses (use_insn);
986                       reload_combine_note_use (&PATTERN (use_insn), use_insn,
987                                                use_ruid, NULL_RTX);
988
989                       if (must_move_add)
990                         {
991                           add_moved_after_insn = use_insn;
992                           add_moved_after_ruid = use_ruid;
993                         }
994                       continue;
995                     }
996                 }
997             }
998           else
999             {
1000               rtx new_set = single_set (use_insn);
1001               if (new_set
1002                   && REG_P (SET_DEST (new_set))
1003                   && GET_CODE (SET_SRC (new_set)) == PLUS
1004                   && REG_P (XEXP (SET_SRC (new_set), 0))
1005                   && CONSTANT_P (XEXP (SET_SRC (new_set), 1)))
1006                 {
1007                   rtx new_src;
1008                   int old_cost = rtx_cost (SET_SRC (new_set), SET, speed);
1009
1010                   gcc_assert (rtx_equal_p (XEXP (SET_SRC (new_set), 0), reg));
1011                   new_src = simplify_replace_rtx (SET_SRC (new_set), reg,
1012                                                   copy_rtx (src));
1013
1014                   if (rtx_cost (new_src, SET, speed) <= old_cost
1015                       && validate_change (use_insn, &SET_SRC (new_set),
1016                                           new_src, 0))
1017                     {
1018                       reload_combine_purge_insn_uses (use_insn);
1019                       reload_combine_note_use (&SET_SRC (new_set), use_insn,
1020                                                use_ruid, NULL_RTX);
1021
1022                       if (must_move_add)
1023                         {
1024                           /* See if that took care of the add insn.  */
1025                           if (rtx_equal_p (SET_DEST (new_set), reg))
1026                             {
1027                               delete_insn (insn);
1028                               return true;
1029                             }
1030                           else
1031                             {
1032                               add_moved_after_insn = use_insn;
1033                               add_moved_after_ruid = use_ruid;
1034                             }
1035                         }
1036                       continue;
1037                     }
1038                 }
1039             }
1040           /* If we get here, we couldn't handle this use.  */
1041           if (must_move_add)
1042             break;
1043         }
1044     }
1045   while (use);
1046
1047   if (!must_move_add || add_moved_after_insn == NULL_RTX)
1048     /* Process the add normally.  */
1049     return false;
1050
1051   fixup_debug_insns (reg, src, insn, add_moved_after_insn);
1052
1053   reorder_insns (insn, insn, add_moved_after_insn);
1054   reload_combine_purge_reg_uses_after_ruid (regno, add_moved_after_ruid);
1055   reload_combine_split_ruids (add_moved_after_ruid - 1);
1056   reload_combine_note_use (&PATTERN (insn), insn,
1057                            add_moved_after_ruid, NULL_RTX);
1058   reg_state[regno].store_ruid = add_moved_after_ruid;
1059
1060   return true;
1061 }
1062
1063 /* Called by reload_combine when scanning INSN.  Try to detect a pattern we
1064    can handle and improve.  Return true if no further processing is needed on
1065    INSN; false if it wasn't recognized and should be handled normally.  */
1066
1067 static bool
1068 reload_combine_recognize_pattern (rtx insn)
1069 {
1070   rtx set, reg, src;
1071   unsigned int regno;
1072
1073   set = single_set (insn);
1074   if (set == NULL_RTX)
1075     return false;
1076
1077   reg = SET_DEST (set);
1078   src = SET_SRC (set);
1079   if (!REG_P (reg)
1080       || hard_regno_nregs[REGNO (reg)][GET_MODE (reg)] != 1)
1081     return false;
1082
1083   regno = REGNO (reg);
1084
1085   /* Look for (set (REGX) (CONST_INT))
1086      (set (REGX) (PLUS (REGX) (REGY)))
1087      ...
1088      ... (MEM (REGX)) ...
1089      and convert it to
1090      (set (REGZ) (CONST_INT))
1091      ...
1092      ... (MEM (PLUS (REGZ) (REGY)))... .
1093
1094      First, check that we have (set (REGX) (PLUS (REGX) (REGY)))
1095      and that we know all uses of REGX before it dies.
1096      Also, explicitly check that REGX != REGY; our life information
1097      does not yet show whether REGY changes in this insn.  */
1098
1099   if (GET_CODE (src) == PLUS
1100       && reg_state[regno].all_offsets_match
1101       && last_index_reg != -1
1102       && REG_P (XEXP (src, 1))
1103       && rtx_equal_p (XEXP (src, 0), reg)
1104       && !rtx_equal_p (XEXP (src, 1), reg)
1105       && last_label_ruid < reg_state[regno].use_ruid)
1106     {
1107       rtx base = XEXP (src, 1);
1108       rtx prev = prev_nonnote_insn (insn);
1109       rtx prev_set = prev ? single_set (prev) : NULL_RTX;
1110       rtx index_reg = NULL_RTX;
1111       rtx reg_sum = NULL_RTX;
1112       int i;
1113
1114       /* Now we need to set INDEX_REG to an index register (denoted as
1115          REGZ in the illustration above) and REG_SUM to the expression
1116          register+register that we want to use to substitute uses of REG
1117          (typically in MEMs) with.  First check REG and BASE for being
1118          index registers; we can use them even if they are not dead.  */
1119       if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS], regno)
1120           || TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS],
1121                                 REGNO (base)))
1122         {
1123           index_reg = reg;
1124           reg_sum = src;
1125         }
1126       else
1127         {
1128           /* Otherwise, look for a free index register.  Since we have
1129              checked above that neither REG nor BASE are index registers,
1130              if we find anything at all, it will be different from these
1131              two registers.  */
1132           for (i = first_index_reg; i <= last_index_reg; i++)
1133             {
1134               if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS], i)
1135                   && reg_state[i].use_index == RELOAD_COMBINE_MAX_USES
1136                   && reg_state[i].store_ruid <= reg_state[regno].use_ruid
1137                   && hard_regno_nregs[i][GET_MODE (reg)] == 1)
1138                 {
1139                   index_reg = gen_rtx_REG (GET_MODE (reg), i);
1140                   reg_sum = gen_rtx_PLUS (GET_MODE (reg), index_reg, base);
1141                   break;
1142                 }
1143             }
1144         }
1145
1146       /* Check that PREV_SET is indeed (set (REGX) (CONST_INT)) and that
1147          (REGY), i.e. BASE, is not clobbered before the last use we'll
1148          create.  */
1149       if (reg_sum
1150           && prev_set
1151           && CONST_INT_P (SET_SRC (prev_set))
1152           && rtx_equal_p (SET_DEST (prev_set), reg)
1153           && reg_state[regno].use_index >= 0
1154           && (reg_state[REGNO (base)].store_ruid
1155               <= reg_state[regno].use_ruid))
1156         {
1157           /* Change destination register and, if necessary, the constant
1158              value in PREV, the constant loading instruction.  */
1159           validate_change (prev, &SET_DEST (prev_set), index_reg, 1);
1160           if (reg_state[regno].offset != const0_rtx)
1161             validate_change (prev,
1162                              &SET_SRC (prev_set),
1163                              GEN_INT (INTVAL (SET_SRC (prev_set))
1164                                       + INTVAL (reg_state[regno].offset)),
1165                              1);
1166
1167           /* Now for every use of REG that we have recorded, replace REG
1168              with REG_SUM.  */
1169           for (i = reg_state[regno].use_index;
1170                i < RELOAD_COMBINE_MAX_USES; i++)
1171             validate_unshare_change (reg_state[regno].reg_use[i].insn,
1172                                      reg_state[regno].reg_use[i].usep,
1173                                      /* Each change must have its own
1174                                         replacement.  */
1175                                      reg_sum, 1);
1176
1177           if (apply_change_group ())
1178             {
1179               struct reg_use *lowest_ruid = NULL;
1180
1181               /* For every new use of REG_SUM, we have to record the use
1182                  of BASE therein, i.e. operand 1.  */
1183               for (i = reg_state[regno].use_index;
1184                    i < RELOAD_COMBINE_MAX_USES; i++)
1185                 {
1186                   struct reg_use *use = reg_state[regno].reg_use + i;
1187                   reload_combine_note_use (&XEXP (*use->usep, 1), use->insn,
1188                                            use->ruid, use->containing_mem);
1189                   if (lowest_ruid == NULL || use->ruid < lowest_ruid->ruid)
1190                     lowest_ruid = use;
1191                 }
1192
1193               fixup_debug_insns (reg, reg_sum, insn, lowest_ruid->insn);
1194
1195               /* Delete the reg-reg addition.  */
1196               delete_insn (insn);
1197
1198               if (reg_state[regno].offset != const0_rtx)
1199                 /* Previous REG_EQUIV / REG_EQUAL notes for PREV
1200                    are now invalid.  */
1201                 remove_reg_equal_equiv_notes (prev);
1202
1203               reg_state[regno].use_index = RELOAD_COMBINE_MAX_USES;
1204               reg_state[REGNO (index_reg)].store_ruid
1205                 = reload_combine_ruid;
1206               return true;
1207             }
1208         }
1209     }
1210   return false;
1211 }
1212
1213 static void
1214 reload_combine (void)
1215 {
1216   rtx insn, prev;
1217   int i;
1218   basic_block bb;
1219   unsigned int r;
1220   int min_labelno, n_labels;
1221   HARD_REG_SET ever_live_at_start, *label_live;
1222
1223   /* To avoid wasting too much time later searching for an index register,
1224      determine the minimum and maximum index register numbers.  */
1225   if (INDEX_REG_CLASS == NO_REGS)
1226     last_index_reg = -1;
1227   else if (first_index_reg == -1 && last_index_reg == 0)
1228     {
1229       for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
1230         if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS], r))
1231           {
1232             if (first_index_reg == -1)
1233               first_index_reg = r;
1234
1235             last_index_reg = r;
1236           }
1237
1238       /* If no index register is available, we can quit now.  Set LAST_INDEX_REG
1239          to -1 so we'll know to quit early the next time we get here.  */
1240       if (first_index_reg == -1)
1241         {
1242           last_index_reg = -1;
1243           return;
1244         }
1245     }
1246
1247 #if 0
1248   /* If reg+reg can be used in offsetable memory addresses, the main chunk of
1249      reload has already used it where appropriate, so there is no use in
1250      trying to generate it now.  */
1251   if (double_reg_address_ok || last_index_reg == -1)
1252     return;
1253 #endif
1254
1255   /* Set up LABEL_LIVE and EVER_LIVE_AT_START.  The register lifetime
1256      information is a bit fuzzy immediately after reload, but it's
1257      still good enough to determine which registers are live at a jump
1258      destination.  */
1259   min_labelno = get_first_label_num ();
1260   n_labels = max_label_num () - min_labelno;
1261   label_live = XNEWVEC (HARD_REG_SET, n_labels);
1262   CLEAR_HARD_REG_SET (ever_live_at_start);
1263
1264   FOR_EACH_BB_REVERSE (bb)
1265     {
1266       insn = BB_HEAD (bb);
1267       if (LABEL_P (insn))
1268         {
1269           HARD_REG_SET live;
1270           bitmap live_in = df_get_live_in (bb);
1271
1272           REG_SET_TO_HARD_REG_SET (live, live_in);
1273           compute_use_by_pseudos (&live, live_in);
1274           COPY_HARD_REG_SET (LABEL_LIVE (insn), live);
1275           IOR_HARD_REG_SET (ever_live_at_start, live);
1276         }
1277     }
1278
1279   /* Initialize last_label_ruid, reload_combine_ruid and reg_state.  */
1280   last_label_ruid = last_jump_ruid = reload_combine_ruid = 0;
1281   for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
1282     {
1283       reg_state[r].store_ruid = 0;
1284       reg_state[r].real_store_ruid = 0;
1285       if (fixed_regs[r])
1286         reg_state[r].use_index = -1;
1287       else
1288         reg_state[r].use_index = RELOAD_COMBINE_MAX_USES;
1289     }
1290
1291   for (insn = get_last_insn (); insn; insn = prev)
1292     {
1293       rtx note;
1294
1295       prev = PREV_INSN (insn);
1296
1297       /* We cannot do our optimization across labels.  Invalidating all the use
1298          information we have would be costly, so we just note where the label
1299          is and then later disable any optimization that would cross it.  */
1300       if (LABEL_P (insn))
1301         last_label_ruid = reload_combine_ruid;
1302       else if (BARRIER_P (insn))
1303         for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
1304           if (! fixed_regs[r])
1305               reg_state[r].use_index = RELOAD_COMBINE_MAX_USES;
1306
1307       if (! NONDEBUG_INSN_P (insn))
1308         continue;
1309
1310       reload_combine_ruid++;
1311
1312       if (control_flow_insn_p (insn))
1313         last_jump_ruid = reload_combine_ruid;
1314
1315       if (reload_combine_recognize_const_pattern (insn)
1316           || reload_combine_recognize_pattern (insn))
1317         continue;
1318
1319       note_stores (PATTERN (insn), reload_combine_note_store, NULL);
1320
1321       if (CALL_P (insn))
1322         {
1323           rtx link;
1324
1325           for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
1326             if (call_used_regs[r])
1327               {
1328                 reg_state[r].use_index = RELOAD_COMBINE_MAX_USES;
1329                 reg_state[r].store_ruid = reload_combine_ruid;
1330               }
1331
1332           for (link = CALL_INSN_FUNCTION_USAGE (insn); link;
1333                link = XEXP (link, 1))
1334             {
1335               rtx usage_rtx = XEXP (XEXP (link, 0), 0);
1336               if (REG_P (usage_rtx))
1337                 {
1338                   unsigned int i;
1339                   unsigned int start_reg = REGNO (usage_rtx);
1340                   unsigned int num_regs =
1341                         hard_regno_nregs[start_reg][GET_MODE (usage_rtx)];
1342                   unsigned int end_reg  = start_reg + num_regs - 1;
1343                   for (i = start_reg; i <= end_reg; i++)
1344                     if (GET_CODE (XEXP (link, 0)) == CLOBBER)
1345                       {
1346                         reg_state[i].use_index = RELOAD_COMBINE_MAX_USES;
1347                         reg_state[i].store_ruid = reload_combine_ruid;
1348                       }
1349                     else
1350                       reg_state[i].use_index = -1;
1351                  }
1352              }
1353
1354         }
1355       else if (JUMP_P (insn)
1356                && GET_CODE (PATTERN (insn)) != RETURN)
1357         {
1358           /* Non-spill registers might be used at the call destination in
1359              some unknown fashion, so we have to mark the unknown use.  */
1360           HARD_REG_SET *live;
1361
1362           if ((condjump_p (insn) || condjump_in_parallel_p (insn))
1363               && JUMP_LABEL (insn))
1364             live = &LABEL_LIVE (JUMP_LABEL (insn));
1365           else
1366             live = &ever_live_at_start;
1367
1368           for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; --i)
1369             if (TEST_HARD_REG_BIT (*live, i))
1370               reg_state[i].use_index = -1;
1371         }
1372
1373       reload_combine_note_use (&PATTERN (insn), insn,
1374                                reload_combine_ruid, NULL_RTX);
1375       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1376         {
1377           if (REG_NOTE_KIND (note) == REG_INC
1378               && REG_P (XEXP (note, 0)))
1379             {
1380               int regno = REGNO (XEXP (note, 0));
1381
1382               reg_state[regno].store_ruid = reload_combine_ruid;
1383               reg_state[regno].real_store_ruid = reload_combine_ruid;
1384               reg_state[regno].use_index = -1;
1385             }
1386         }
1387     }
1388
1389   free (label_live);
1390 }
1391
1392 /* Check if DST is a register or a subreg of a register; if it is,
1393    update store_ruid, real_store_ruid and use_index in the reg_state
1394    structure accordingly.  Called via note_stores from reload_combine.  */
1395
1396 static void
1397 reload_combine_note_store (rtx dst, const_rtx set, void *data ATTRIBUTE_UNUSED)
1398 {
1399   int regno = 0;
1400   int i;
1401   enum machine_mode mode = GET_MODE (dst);
1402
1403   if (GET_CODE (dst) == SUBREG)
1404     {
1405       regno = subreg_regno_offset (REGNO (SUBREG_REG (dst)),
1406                                    GET_MODE (SUBREG_REG (dst)),
1407                                    SUBREG_BYTE (dst),
1408                                    GET_MODE (dst));
1409       dst = SUBREG_REG (dst);
1410     }
1411   if (!REG_P (dst))
1412     return;
1413   regno += REGNO (dst);
1414
1415   /* note_stores might have stripped a STRICT_LOW_PART, so we have to be
1416      careful with registers / register parts that are not full words.
1417      Similarly for ZERO_EXTRACT.  */
1418   if (GET_CODE (SET_DEST (set)) == ZERO_EXTRACT
1419       || GET_CODE (SET_DEST (set)) == STRICT_LOW_PART)
1420     {
1421       for (i = hard_regno_nregs[regno][mode] - 1 + regno; i >= regno; i--)
1422         {
1423           reg_state[i].use_index = -1;
1424           reg_state[i].store_ruid = reload_combine_ruid;
1425           reg_state[i].real_store_ruid = reload_combine_ruid;
1426         }
1427     }
1428   else
1429     {
1430       for (i = hard_regno_nregs[regno][mode] - 1 + regno; i >= regno; i--)
1431         {
1432           reg_state[i].store_ruid = reload_combine_ruid;
1433           if (GET_CODE (set) == SET)
1434             reg_state[i].real_store_ruid = reload_combine_ruid;
1435           reg_state[i].use_index = RELOAD_COMBINE_MAX_USES;
1436         }
1437     }
1438 }
1439
1440 /* XP points to a piece of rtl that has to be checked for any uses of
1441    registers.
1442    *XP is the pattern of INSN, or a part of it.
1443    Called from reload_combine, and recursively by itself.  */
1444 static void
1445 reload_combine_note_use (rtx *xp, rtx insn, int ruid, rtx containing_mem)
1446 {
1447   rtx x = *xp;
1448   enum rtx_code code = x->code;
1449   const char *fmt;
1450   int i, j;
1451   rtx offset = const0_rtx; /* For the REG case below.  */
1452
1453   switch (code)
1454     {
1455     case SET:
1456       if (REG_P (SET_DEST (x)))
1457         {
1458           reload_combine_note_use (&SET_SRC (x), insn, ruid, NULL_RTX);
1459           return;
1460         }
1461       break;
1462
1463     case USE:
1464       /* If this is the USE of a return value, we can't change it.  */
1465       if (REG_P (XEXP (x, 0)) && REG_FUNCTION_VALUE_P (XEXP (x, 0)))
1466         {
1467         /* Mark the return register as used in an unknown fashion.  */
1468           rtx reg = XEXP (x, 0);
1469           int regno = REGNO (reg);
1470           int nregs = hard_regno_nregs[regno][GET_MODE (reg)];
1471
1472           while (--nregs >= 0)
1473             reg_state[regno + nregs].use_index = -1;
1474           return;
1475         }
1476       break;
1477
1478     case CLOBBER:
1479       if (REG_P (SET_DEST (x)))
1480         {
1481           /* No spurious CLOBBERs of pseudo registers may remain.  */
1482           gcc_assert (REGNO (SET_DEST (x)) < FIRST_PSEUDO_REGISTER);
1483           return;
1484         }
1485       break;
1486
1487     case PLUS:
1488       /* We are interested in (plus (reg) (const_int)) .  */
1489       if (!REG_P (XEXP (x, 0))
1490           || !CONST_INT_P (XEXP (x, 1)))
1491         break;
1492       offset = XEXP (x, 1);
1493       x = XEXP (x, 0);
1494       /* Fall through.  */
1495     case REG:
1496       {
1497         int regno = REGNO (x);
1498         int use_index;
1499         int nregs;
1500
1501         /* No spurious USEs of pseudo registers may remain.  */
1502         gcc_assert (regno < FIRST_PSEUDO_REGISTER);
1503
1504         nregs = hard_regno_nregs[regno][GET_MODE (x)];
1505
1506         /* We can't substitute into multi-hard-reg uses.  */
1507         if (nregs > 1)
1508           {
1509             while (--nregs >= 0)
1510               reg_state[regno + nregs].use_index = -1;
1511             return;
1512           }
1513
1514         /* If this register is already used in some unknown fashion, we
1515            can't do anything.
1516            If we decrement the index from zero to -1, we can't store more
1517            uses, so this register becomes used in an unknown fashion.  */
1518         use_index = --reg_state[regno].use_index;
1519         if (use_index < 0)
1520           return;
1521
1522         if (use_index == RELOAD_COMBINE_MAX_USES - 1)
1523           {
1524             /* This is the first use of this register we have seen since we
1525                marked it as dead.  */
1526             reg_state[regno].offset = offset;
1527             reg_state[regno].all_offsets_match = true;
1528             reg_state[regno].use_ruid = ruid;
1529           }
1530         else
1531           {
1532             if (reg_state[regno].use_ruid > ruid)
1533               reg_state[regno].use_ruid = ruid;
1534
1535             if (! rtx_equal_p (offset, reg_state[regno].offset))
1536               reg_state[regno].all_offsets_match = false;
1537           }
1538
1539         reg_state[regno].reg_use[use_index].insn = insn;
1540         reg_state[regno].reg_use[use_index].ruid = ruid;
1541         reg_state[regno].reg_use[use_index].containing_mem = containing_mem;
1542         reg_state[regno].reg_use[use_index].usep = xp;
1543         return;
1544       }
1545
1546     case MEM:
1547       containing_mem = x;
1548       break;
1549
1550     default:
1551       break;
1552     }
1553
1554   /* Recursively process the components of X.  */
1555   fmt = GET_RTX_FORMAT (code);
1556   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1557     {
1558       if (fmt[i] == 'e')
1559         reload_combine_note_use (&XEXP (x, i), insn, ruid, containing_mem);
1560       else if (fmt[i] == 'E')
1561         {
1562           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1563             reload_combine_note_use (&XVECEXP (x, i, j), insn, ruid,
1564                                      containing_mem);
1565         }
1566     }
1567 }
1568 \f
1569 /* See if we can reduce the cost of a constant by replacing a move
1570    with an add.  We track situations in which a register is set to a
1571    constant or to a register plus a constant.  */
1572 /* We cannot do our optimization across labels.  Invalidating all the
1573    information about register contents we have would be costly, so we
1574    use move2add_last_label_luid to note where the label is and then
1575    later disable any optimization that would cross it.
1576    reg_offset[n] / reg_base_reg[n] / reg_symbol_ref[n] / reg_mode[n]
1577    are only valid if reg_set_luid[n] is greater than
1578    move2add_last_label_luid.  */
1579 static int reg_set_luid[FIRST_PSEUDO_REGISTER];
1580
1581 /* If reg_base_reg[n] is negative, register n has been set to
1582    reg_offset[n] or reg_symbol_ref[n] + reg_offset[n] in mode reg_mode[n].
1583    If reg_base_reg[n] is non-negative, register n has been set to the
1584    sum of reg_offset[n] and the value of register reg_base_reg[n]
1585    before reg_set_luid[n], calculated in mode reg_mode[n] .  */
1586 static HOST_WIDE_INT reg_offset[FIRST_PSEUDO_REGISTER];
1587 static int reg_base_reg[FIRST_PSEUDO_REGISTER];
1588 static rtx reg_symbol_ref[FIRST_PSEUDO_REGISTER];
1589 static enum machine_mode reg_mode[FIRST_PSEUDO_REGISTER];
1590
1591 /* move2add_luid is linearly increased while scanning the instructions
1592    from first to last.  It is used to set reg_set_luid in
1593    reload_cse_move2add and move2add_note_store.  */
1594 static int move2add_luid;
1595
1596 /* move2add_last_label_luid is set whenever a label is found.  Labels
1597    invalidate all previously collected reg_offset data.  */
1598 static int move2add_last_label_luid;
1599
1600 /* ??? We don't know how zero / sign extension is handled, hence we
1601    can't go from a narrower to a wider mode.  */
1602 #define MODES_OK_FOR_MOVE2ADD(OUTMODE, INMODE) \
1603   (GET_MODE_SIZE (OUTMODE) == GET_MODE_SIZE (INMODE) \
1604    || (GET_MODE_SIZE (OUTMODE) <= GET_MODE_SIZE (INMODE) \
1605        && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (OUTMODE), \
1606                                  GET_MODE_BITSIZE (INMODE))))
1607
1608 /* This function is called with INSN that sets REG to (SYM + OFF),
1609    while REG is known to already have value (SYM + offset).
1610    This function tries to change INSN into an add instruction
1611    (set (REG) (plus (REG) (OFF - offset))) using the known value.
1612    It also updates the information about REG's known value.
1613    Return true if we made a change.  */
1614
1615 static bool
1616 move2add_use_add2_insn (rtx reg, rtx sym, rtx off, rtx insn)
1617 {
1618   rtx pat = PATTERN (insn);
1619   rtx src = SET_SRC (pat);
1620   int regno = REGNO (reg);
1621   rtx new_src = gen_int_mode (INTVAL (off) - reg_offset[regno],
1622                               GET_MODE (reg));
1623   bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
1624   bool changed = false;
1625
1626   /* (set (reg) (plus (reg) (const_int 0))) is not canonical;
1627      use (set (reg) (reg)) instead.
1628      We don't delete this insn, nor do we convert it into a
1629      note, to avoid losing register notes or the return
1630      value flag.  jump2 already knows how to get rid of
1631      no-op moves.  */
1632   if (new_src == const0_rtx)
1633     {
1634       /* If the constants are different, this is a
1635          truncation, that, if turned into (set (reg)
1636          (reg)), would be discarded.  Maybe we should
1637          try a truncMN pattern?  */
1638       if (INTVAL (off) == reg_offset [regno])
1639         changed = validate_change (insn, &SET_SRC (pat), reg, 0);
1640     }
1641   else if (rtx_cost (new_src, PLUS, speed) < rtx_cost (src, SET, speed)
1642            && have_add2_insn (reg, new_src))
1643     {
1644       rtx tem = gen_rtx_PLUS (GET_MODE (reg), reg, new_src);
1645       changed = validate_change (insn, &SET_SRC (pat), tem, 0);
1646     }
1647   else if (sym == NULL_RTX && GET_MODE (reg) != BImode)
1648     {
1649       enum machine_mode narrow_mode;
1650       for (narrow_mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1651            narrow_mode != VOIDmode
1652              && narrow_mode != GET_MODE (reg);
1653            narrow_mode = GET_MODE_WIDER_MODE (narrow_mode))
1654         {
1655           if (have_insn_for (STRICT_LOW_PART, narrow_mode)
1656               && ((reg_offset[regno]
1657                    & ~GET_MODE_MASK (narrow_mode))
1658                   == (INTVAL (off)
1659                       & ~GET_MODE_MASK (narrow_mode))))
1660             {
1661               rtx narrow_reg = gen_rtx_REG (narrow_mode,
1662                                             REGNO (reg));
1663               rtx narrow_src = gen_int_mode (INTVAL (off),
1664                                              narrow_mode);
1665               rtx new_set =
1666                 gen_rtx_SET (VOIDmode,
1667                              gen_rtx_STRICT_LOW_PART (VOIDmode,
1668                                                       narrow_reg),
1669                              narrow_src);
1670               changed = validate_change (insn, &PATTERN (insn),
1671                                          new_set, 0);
1672               if (changed)
1673                 break;
1674             }
1675         }
1676     }
1677   reg_set_luid[regno] = move2add_luid;
1678   reg_base_reg[regno] = -1;
1679   reg_mode[regno] = GET_MODE (reg);
1680   reg_symbol_ref[regno] = sym;
1681   reg_offset[regno] = INTVAL (off);
1682   return changed;
1683 }
1684
1685
1686 /* This function is called with INSN that sets REG to (SYM + OFF),
1687    but REG doesn't have known value (SYM + offset).  This function
1688    tries to find another register which is known to already have
1689    value (SYM + offset) and change INSN into an add instruction
1690    (set (REG) (plus (the found register) (OFF - offset))) if such
1691    a register is found.  It also updates the information about
1692    REG's known value.
1693    Return true iff we made a change.  */
1694
1695 static bool
1696 move2add_use_add3_insn (rtx reg, rtx sym, rtx off, rtx insn)
1697 {
1698   rtx pat = PATTERN (insn);
1699   rtx src = SET_SRC (pat);
1700   int regno = REGNO (reg);
1701   int min_cost = INT_MAX;
1702   int min_regno = 0;
1703   bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
1704   int i;
1705   bool changed = false;
1706
1707   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1708     if (reg_set_luid[i] > move2add_last_label_luid
1709         && reg_mode[i] == GET_MODE (reg)
1710         && reg_base_reg[i] < 0
1711         && reg_symbol_ref[i] != NULL_RTX
1712         && rtx_equal_p (sym, reg_symbol_ref[i]))
1713       {
1714         rtx new_src = gen_int_mode (INTVAL (off) - reg_offset[i],
1715                                     GET_MODE (reg));
1716         /* (set (reg) (plus (reg) (const_int 0))) is not canonical;
1717            use (set (reg) (reg)) instead.
1718            We don't delete this insn, nor do we convert it into a
1719            note, to avoid losing register notes or the return
1720            value flag.  jump2 already knows how to get rid of
1721            no-op moves.  */
1722         if (new_src == const0_rtx)
1723           {
1724             min_cost = 0;
1725             min_regno = i;
1726             break;
1727           }
1728         else
1729           {
1730             int cost = rtx_cost (new_src, PLUS, speed);
1731             if (cost < min_cost)
1732               {
1733                 min_cost = cost;
1734                 min_regno = i;
1735               }
1736           }
1737       }
1738
1739   if (min_cost < rtx_cost (src, SET, speed))
1740     {
1741       rtx tem;
1742
1743       tem = gen_rtx_REG (GET_MODE (reg), min_regno);
1744       if (i != min_regno)
1745         {
1746           rtx new_src = gen_int_mode (INTVAL (off) - reg_offset[min_regno],
1747                                       GET_MODE (reg));
1748           tem = gen_rtx_PLUS (GET_MODE (reg), tem, new_src);
1749         }
1750       if (validate_change (insn, &SET_SRC (pat), tem, 0))
1751         changed = true;
1752     }
1753   reg_set_luid[regno] = move2add_luid;
1754   reg_base_reg[regno] = -1;
1755   reg_mode[regno] = GET_MODE (reg);
1756   reg_symbol_ref[regno] = sym;
1757   reg_offset[regno] = INTVAL (off);
1758   return changed;
1759 }
1760
1761 /* Convert move insns with constant inputs to additions if they are cheaper.
1762    Return true if any changes were made.  */
1763 static bool
1764 reload_cse_move2add (rtx first)
1765 {
1766   int i;
1767   rtx insn;
1768   bool changed = false;
1769
1770   for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
1771     {
1772       reg_set_luid[i] = 0;
1773       reg_offset[i] = 0;
1774       reg_base_reg[i] = 0;
1775       reg_symbol_ref[i] = NULL_RTX;
1776       reg_mode[i] = VOIDmode;
1777     }
1778
1779   move2add_last_label_luid = 0;
1780   move2add_luid = 2;
1781   for (insn = first; insn; insn = NEXT_INSN (insn), move2add_luid++)
1782     {
1783       rtx pat, note;
1784
1785       if (LABEL_P (insn))
1786         {
1787           move2add_last_label_luid = move2add_luid;
1788           /* We're going to increment move2add_luid twice after a
1789              label, so that we can use move2add_last_label_luid + 1 as
1790              the luid for constants.  */
1791           move2add_luid++;
1792           continue;
1793         }
1794       if (! INSN_P (insn))
1795         continue;
1796       pat = PATTERN (insn);
1797       /* For simplicity, we only perform this optimization on
1798          straightforward SETs.  */
1799       if (GET_CODE (pat) == SET
1800           && REG_P (SET_DEST (pat)))
1801         {
1802           rtx reg = SET_DEST (pat);
1803           int regno = REGNO (reg);
1804           rtx src = SET_SRC (pat);
1805
1806           /* Check if we have valid information on the contents of this
1807              register in the mode of REG.  */
1808           if (reg_set_luid[regno] > move2add_last_label_luid
1809               && MODES_OK_FOR_MOVE2ADD (GET_MODE (reg), reg_mode[regno])
1810               && dbg_cnt (cse2_move2add))
1811             {
1812               /* Try to transform (set (REGX) (CONST_INT A))
1813                                   ...
1814                                   (set (REGX) (CONST_INT B))
1815                  to
1816                                   (set (REGX) (CONST_INT A))
1817                                   ...
1818                                   (set (REGX) (plus (REGX) (CONST_INT B-A)))
1819                  or
1820                                   (set (REGX) (CONST_INT A))
1821                                   ...
1822                                   (set (STRICT_LOW_PART (REGX)) (CONST_INT B))
1823               */
1824
1825               if (CONST_INT_P (src)
1826                   && reg_base_reg[regno] < 0
1827                   && reg_symbol_ref[regno] == NULL_RTX)
1828                 {
1829                   changed |= move2add_use_add2_insn (reg, NULL_RTX, src, insn);
1830                   continue;
1831                 }
1832
1833               /* Try to transform (set (REGX) (REGY))
1834                                   (set (REGX) (PLUS (REGX) (CONST_INT A)))
1835                                   ...
1836                                   (set (REGX) (REGY))
1837                                   (set (REGX) (PLUS (REGX) (CONST_INT B)))
1838                  to
1839                                   (set (REGX) (REGY))
1840                                   (set (REGX) (PLUS (REGX) (CONST_INT A)))
1841                                   ...
1842                                   (set (REGX) (plus (REGX) (CONST_INT B-A)))  */
1843               else if (REG_P (src)
1844                        && reg_set_luid[regno] == reg_set_luid[REGNO (src)]
1845                        && reg_base_reg[regno] == reg_base_reg[REGNO (src)]
1846                        && MODES_OK_FOR_MOVE2ADD (GET_MODE (reg),
1847                                                  reg_mode[REGNO (src)]))
1848                 {
1849                   rtx next = next_nonnote_insn (insn);
1850                   rtx set = NULL_RTX;
1851                   if (next)
1852                     set = single_set (next);
1853                   if (set
1854                       && SET_DEST (set) == reg
1855                       && GET_CODE (SET_SRC (set)) == PLUS
1856                       && XEXP (SET_SRC (set), 0) == reg
1857                       && CONST_INT_P (XEXP (SET_SRC (set), 1)))
1858                     {
1859                       rtx src3 = XEXP (SET_SRC (set), 1);
1860                       HOST_WIDE_INT added_offset = INTVAL (src3);
1861                       HOST_WIDE_INT base_offset = reg_offset[REGNO (src)];
1862                       HOST_WIDE_INT regno_offset = reg_offset[regno];
1863                       rtx new_src =
1864                         gen_int_mode (added_offset
1865                                       + base_offset
1866                                       - regno_offset,
1867                                       GET_MODE (reg));
1868                       bool success = false;
1869                       bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
1870
1871                       if (new_src == const0_rtx)
1872                         /* See above why we create (set (reg) (reg)) here.  */
1873                         success
1874                           = validate_change (next, &SET_SRC (set), reg, 0);
1875                       else if ((rtx_cost (new_src, PLUS, speed)
1876                                 < COSTS_N_INSNS (1) + rtx_cost (src3, SET, speed))
1877                                && have_add2_insn (reg, new_src))
1878                         {
1879                           rtx newpat = gen_rtx_SET (VOIDmode,
1880                                                     reg,
1881                                                     gen_rtx_PLUS (GET_MODE (reg),
1882                                                                   reg,
1883                                                                   new_src));
1884                           success
1885                             = validate_change (next, &PATTERN (next),
1886                                                newpat, 0);
1887                         }
1888                       if (success)
1889                         delete_insn (insn);
1890                       changed |= success;
1891                       insn = next;
1892                       reg_mode[regno] = GET_MODE (reg);
1893                       reg_offset[regno] =
1894                         trunc_int_for_mode (added_offset + base_offset,
1895                                             GET_MODE (reg));
1896                       continue;
1897                     }
1898                 }
1899             }
1900
1901           /* Try to transform
1902              (set (REGX) (CONST (PLUS (SYMBOL_REF) (CONST_INT A))))
1903              ...
1904              (set (REGY) (CONST (PLUS (SYMBOL_REF) (CONST_INT B))))
1905              to
1906              (set (REGX) (CONST (PLUS (SYMBOL_REF) (CONST_INT A))))
1907              ...
1908              (set (REGY) (CONST (PLUS (REGX) (CONST_INT B-A))))  */
1909           if ((GET_CODE (src) == SYMBOL_REF
1910                || (GET_CODE (src) == CONST
1911                    && GET_CODE (XEXP (src, 0)) == PLUS
1912                    && GET_CODE (XEXP (XEXP (src, 0), 0)) == SYMBOL_REF
1913                    && CONST_INT_P (XEXP (XEXP (src, 0), 1))))
1914               && dbg_cnt (cse2_move2add))
1915             {
1916               rtx sym, off;
1917
1918               if (GET_CODE (src) == SYMBOL_REF)
1919                 {
1920                   sym = src;
1921                   off = const0_rtx;
1922                 }
1923               else
1924                 {
1925                   sym = XEXP (XEXP (src, 0), 0);
1926                   off = XEXP (XEXP (src, 0), 1);
1927                 }
1928
1929               /* If the reg already contains the value which is sum of
1930                  sym and some constant value, we can use an add2 insn.  */
1931               if (reg_set_luid[regno] > move2add_last_label_luid
1932                   && MODES_OK_FOR_MOVE2ADD (GET_MODE (reg), reg_mode[regno])
1933                   && reg_base_reg[regno] < 0
1934                   && reg_symbol_ref[regno] != NULL_RTX
1935                   && rtx_equal_p (sym, reg_symbol_ref[regno]))
1936                 changed |= move2add_use_add2_insn (reg, sym, off, insn);
1937
1938               /* Otherwise, we have to find a register whose value is sum
1939                  of sym and some constant value.  */
1940               else
1941                 changed |= move2add_use_add3_insn (reg, sym, off, insn);
1942
1943               continue;
1944             }
1945         }
1946
1947       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1948         {
1949           if (REG_NOTE_KIND (note) == REG_INC
1950               && REG_P (XEXP (note, 0)))
1951             {
1952               /* Reset the information about this register.  */
1953               int regno = REGNO (XEXP (note, 0));
1954               if (regno < FIRST_PSEUDO_REGISTER)
1955                 reg_set_luid[regno] = 0;
1956             }
1957         }
1958       note_stores (PATTERN (insn), move2add_note_store, insn);
1959
1960       /* If INSN is a conditional branch, we try to extract an
1961          implicit set out of it.  */
1962       if (any_condjump_p (insn))
1963         {
1964           rtx cnd = fis_get_condition (insn);
1965
1966           if (cnd != NULL_RTX
1967               && GET_CODE (cnd) == NE
1968               && REG_P (XEXP (cnd, 0))
1969               && !reg_set_p (XEXP (cnd, 0), insn)
1970               /* The following two checks, which are also in
1971                  move2add_note_store, are intended to reduce the
1972                  number of calls to gen_rtx_SET to avoid memory
1973                  allocation if possible.  */
1974               && SCALAR_INT_MODE_P (GET_MODE (XEXP (cnd, 0)))
1975               && hard_regno_nregs[REGNO (XEXP (cnd, 0))][GET_MODE (XEXP (cnd, 0))] == 1
1976               && CONST_INT_P (XEXP (cnd, 1)))
1977             {
1978               rtx implicit_set =
1979                 gen_rtx_SET (VOIDmode, XEXP (cnd, 0), XEXP (cnd, 1));
1980               move2add_note_store (SET_DEST (implicit_set), implicit_set, insn);
1981             }
1982         }
1983
1984       /* If this is a CALL_INSN, all call used registers are stored with
1985          unknown values.  */
1986       if (CALL_P (insn))
1987         {
1988           for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
1989             {
1990               if (call_used_regs[i])
1991                 /* Reset the information about this register.  */
1992                 reg_set_luid[i] = 0;
1993             }
1994         }
1995     }
1996   return changed;
1997 }
1998
1999 /* SET is a SET or CLOBBER that sets DST.  DATA is the insn which
2000    contains SET.
2001    Update reg_set_luid, reg_offset and reg_base_reg accordingly.
2002    Called from reload_cse_move2add via note_stores.  */
2003
2004 static void
2005 move2add_note_store (rtx dst, const_rtx set, void *data)
2006 {
2007   rtx insn = (rtx) data;
2008   unsigned int regno = 0;
2009   unsigned int nregs = 0;
2010   unsigned int i;
2011   enum machine_mode mode = GET_MODE (dst);
2012
2013   if (GET_CODE (dst) == SUBREG)
2014     {
2015       regno = subreg_regno_offset (REGNO (SUBREG_REG (dst)),
2016                                    GET_MODE (SUBREG_REG (dst)),
2017                                    SUBREG_BYTE (dst),
2018                                    GET_MODE (dst));
2019       nregs = subreg_nregs (dst);
2020       dst = SUBREG_REG (dst);
2021     }
2022
2023   /* Some targets do argument pushes without adding REG_INC notes.  */
2024
2025   if (MEM_P (dst))
2026     {
2027       dst = XEXP (dst, 0);
2028       if (GET_CODE (dst) == PRE_INC || GET_CODE (dst) == POST_INC
2029           || GET_CODE (dst) == PRE_DEC || GET_CODE (dst) == POST_DEC)
2030         reg_set_luid[REGNO (XEXP (dst, 0))] = 0;
2031       return;
2032     }
2033   if (!REG_P (dst))
2034     return;
2035
2036   regno += REGNO (dst);
2037   if (!nregs)
2038     nregs = hard_regno_nregs[regno][mode];
2039
2040   if (SCALAR_INT_MODE_P (GET_MODE (dst))
2041       && nregs == 1 && GET_CODE (set) == SET)
2042     {
2043       rtx note, sym = NULL_RTX;
2044       HOST_WIDE_INT off;
2045
2046       note = find_reg_equal_equiv_note (insn);
2047       if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF)
2048         {
2049           sym = XEXP (note, 0);
2050           off = 0;
2051         }
2052       else if (note && GET_CODE (XEXP (note, 0)) == CONST
2053                && GET_CODE (XEXP (XEXP (note, 0), 0)) == PLUS
2054                && GET_CODE (XEXP (XEXP (XEXP (note, 0), 0), 0)) == SYMBOL_REF
2055                && CONST_INT_P (XEXP (XEXP (XEXP (note, 0), 0), 1)))
2056         {
2057           sym = XEXP (XEXP (XEXP (note, 0), 0), 0);
2058           off = INTVAL (XEXP (XEXP (XEXP (note, 0), 0), 1));
2059         }
2060
2061       if (sym != NULL_RTX)
2062         {
2063           reg_base_reg[regno] = -1;
2064           reg_symbol_ref[regno] = sym;
2065           reg_offset[regno] = off;
2066           reg_mode[regno] = mode;
2067           reg_set_luid[regno] = move2add_luid;
2068           return;
2069         }
2070     }
2071
2072   if (SCALAR_INT_MODE_P (GET_MODE (dst))
2073       && nregs == 1 && GET_CODE (set) == SET
2074       && GET_CODE (SET_DEST (set)) != ZERO_EXTRACT
2075       && GET_CODE (SET_DEST (set)) != STRICT_LOW_PART)
2076     {
2077       rtx src = SET_SRC (set);
2078       rtx base_reg;
2079       HOST_WIDE_INT offset;
2080       int base_regno;
2081       /* This may be different from mode, if SET_DEST (set) is a
2082          SUBREG.  */
2083       enum machine_mode dst_mode = GET_MODE (dst);
2084
2085       switch (GET_CODE (src))
2086         {
2087         case PLUS:
2088           if (REG_P (XEXP (src, 0)))
2089             {
2090               base_reg = XEXP (src, 0);
2091
2092               if (CONST_INT_P (XEXP (src, 1)))
2093                 offset = INTVAL (XEXP (src, 1));
2094               else if (REG_P (XEXP (src, 1))
2095                        && (reg_set_luid[REGNO (XEXP (src, 1))]
2096                            > move2add_last_label_luid)
2097                        && (MODES_OK_FOR_MOVE2ADD
2098                            (dst_mode, reg_mode[REGNO (XEXP (src, 1))])))
2099                 {
2100                   if (reg_base_reg[REGNO (XEXP (src, 1))] < 0)
2101                     offset = reg_offset[REGNO (XEXP (src, 1))];
2102                   /* Maybe the first register is known to be a
2103                      constant.  */
2104                   else if (reg_set_luid[REGNO (base_reg)]
2105                            > move2add_last_label_luid
2106                            && (MODES_OK_FOR_MOVE2ADD
2107                                (dst_mode, reg_mode[REGNO (XEXP (src, 1))]))
2108                            && reg_base_reg[REGNO (base_reg)] < 0)
2109                     {
2110                       offset = reg_offset[REGNO (base_reg)];
2111                       base_reg = XEXP (src, 1);
2112                     }
2113                   else
2114                     goto invalidate;
2115                 }
2116               else
2117                 goto invalidate;
2118
2119               break;
2120             }
2121
2122           goto invalidate;
2123
2124         case REG:
2125           base_reg = src;
2126           offset = 0;
2127           break;
2128
2129         case CONST_INT:
2130           /* Start tracking the register as a constant.  */
2131           reg_base_reg[regno] = -1;
2132           reg_symbol_ref[regno] = NULL_RTX;
2133           reg_offset[regno] = INTVAL (SET_SRC (set));
2134           /* We assign the same luid to all registers set to constants.  */
2135           reg_set_luid[regno] = move2add_last_label_luid + 1;
2136           reg_mode[regno] = mode;
2137           return;
2138
2139         default:
2140         invalidate:
2141           /* Invalidate the contents of the register.  */
2142           reg_set_luid[regno] = 0;
2143           return;
2144         }
2145
2146       base_regno = REGNO (base_reg);
2147       /* If information about the base register is not valid, set it
2148          up as a new base register, pretending its value is known
2149          starting from the current insn.  */
2150       if (reg_set_luid[base_regno] <= move2add_last_label_luid)
2151         {
2152           reg_base_reg[base_regno] = base_regno;
2153           reg_symbol_ref[base_regno] = NULL_RTX;
2154           reg_offset[base_regno] = 0;
2155           reg_set_luid[base_regno] = move2add_luid;
2156           reg_mode[base_regno] = mode;
2157         }
2158       else if (! MODES_OK_FOR_MOVE2ADD (dst_mode,
2159                                         reg_mode[base_regno]))
2160         goto invalidate;
2161
2162       reg_mode[regno] = mode;
2163
2164       /* Copy base information from our base register.  */
2165       reg_set_luid[regno] = reg_set_luid[base_regno];
2166       reg_base_reg[regno] = reg_base_reg[base_regno];
2167       reg_symbol_ref[regno] = reg_symbol_ref[base_regno];
2168
2169       /* Compute the sum of the offsets or constants.  */
2170       reg_offset[regno] = trunc_int_for_mode (offset
2171                                               + reg_offset[base_regno],
2172                                               dst_mode);
2173     }
2174   else
2175     {
2176       unsigned int endregno = regno + nregs;
2177
2178       for (i = regno; i < endregno; i++)
2179         /* Reset the information about this register.  */
2180         reg_set_luid[i] = 0;
2181     }
2182 }
2183 \f
2184 static bool
2185 gate_handle_postreload (void)
2186 {
2187   return (optimize > 0 && reload_completed);
2188 }
2189
2190
2191 static unsigned int
2192 rest_of_handle_postreload (void)
2193 {
2194   if (!dbg_cnt (postreload_cse))
2195     return 0;
2196
2197   /* Do a very simple CSE pass over just the hard registers.  */
2198   reload_cse_regs (get_insns ());
2199   /* Reload_cse_regs can eliminate potentially-trapping MEMs.
2200      Remove any EH edges associated with them.  */
2201   if (cfun->can_throw_non_call_exceptions)
2202     purge_all_dead_edges ();
2203
2204   return 0;
2205 }
2206
2207 struct rtl_opt_pass pass_postreload_cse =
2208 {
2209  {
2210   RTL_PASS,
2211   "postreload",                         /* name */
2212   gate_handle_postreload,               /* gate */
2213   rest_of_handle_postreload,            /* execute */
2214   NULL,                                 /* sub */
2215   NULL,                                 /* next */
2216   0,                                    /* static_pass_number */
2217   TV_RELOAD_CSE_REGS,                   /* tv_id */
2218   0,                                    /* properties_required */
2219   0,                                    /* properties_provided */
2220   0,                                    /* properties_destroyed */
2221   0,                                    /* todo_flags_start */
2222   TODO_df_finish | TODO_verify_rtl_sharing |
2223   TODO_dump_func                        /* todo_flags_finish */
2224  }
2225 };