OSDN Git Service

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