xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/postreload.c (revision b7b7574d3bf8eeb51a1fa3977b59142ec6434a55)
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 "real.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);
60 static void reload_combine_note_store (rtx, const_rtx, void *);
61 
62 static void 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   reload_cse_regs_1 (first);
71   reload_combine ();
72   reload_cse_move2add (first);
73   if (flag_expensive_optimizations)
74     reload_cse_regs_1 (first);
75 }
76 
77 /* See whether a single set SET is a noop.  */
78 static int
79 reload_cse_noop_set_p (rtx set)
80 {
81   if (cselib_reg_set_mode (SET_DEST (set)) != GET_MODE (SET_DEST (set)))
82     return 0;
83 
84   return rtx_equal_for_cselib_p (SET_DEST (set), SET_SRC (set));
85 }
86 
87 /* Try to simplify INSN.  */
88 static void
89 reload_cse_simplify (rtx insn, rtx testreg)
90 {
91   rtx body = PATTERN (insn);
92 
93   if (GET_CODE (body) == SET)
94     {
95       int count = 0;
96 
97       /* Simplify even if we may think it is a no-op.
98          We may think a memory load of a value smaller than WORD_SIZE
99          is redundant because we haven't taken into account possible
100          implicit extension.  reload_cse_simplify_set() will bring
101          this out, so it's safer to simplify before we delete.  */
102       count += reload_cse_simplify_set (body, insn);
103 
104       if (!count && reload_cse_noop_set_p (body))
105 	{
106 	  rtx value = SET_DEST (body);
107 	  if (REG_P (value)
108 	      && ! REG_FUNCTION_VALUE_P (value))
109 	    value = 0;
110 	  delete_insn_and_edges (insn);
111 	  return;
112 	}
113 
114       if (count > 0)
115 	apply_change_group ();
116       else
117 	reload_cse_simplify_operands (insn, testreg);
118     }
119   else if (GET_CODE (body) == PARALLEL)
120     {
121       int i;
122       int count = 0;
123       rtx value = NULL_RTX;
124 
125       /* Registers mentioned in the clobber list for an asm cannot be reused
126 	 within the body of the asm.  Invalidate those registers now so that
127 	 we don't try to substitute values for them.  */
128       if (asm_noperands (body) >= 0)
129 	{
130 	  for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
131 	    {
132 	      rtx part = XVECEXP (body, 0, i);
133 	      if (GET_CODE (part) == CLOBBER && REG_P (XEXP (part, 0)))
134 		cselib_invalidate_rtx (XEXP (part, 0));
135 	    }
136 	}
137 
138       /* If every action in a PARALLEL is a noop, we can delete
139 	 the entire PARALLEL.  */
140       for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
141 	{
142 	  rtx part = XVECEXP (body, 0, i);
143 	  if (GET_CODE (part) == SET)
144 	    {
145 	      if (! reload_cse_noop_set_p (part))
146 		break;
147 	      if (REG_P (SET_DEST (part))
148 		  && REG_FUNCTION_VALUE_P (SET_DEST (part)))
149 		{
150 		  if (value)
151 		    break;
152 		  value = SET_DEST (part);
153 		}
154 	    }
155 	  else if (GET_CODE (part) != CLOBBER)
156 	    break;
157 	}
158 
159       if (i < 0)
160 	{
161 	  delete_insn_and_edges (insn);
162 	  /* We're done with this insn.  */
163 	  return;
164 	}
165 
166       /* It's not a no-op, but we can try to simplify it.  */
167       for (i = XVECLEN (body, 0) - 1; i >= 0; --i)
168 	if (GET_CODE (XVECEXP (body, 0, i)) == SET)
169 	  count += reload_cse_simplify_set (XVECEXP (body, 0, i), insn);
170 
171       if (count > 0)
172 	apply_change_group ();
173       else
174 	reload_cse_simplify_operands (insn, testreg);
175     }
176 }
177 
178 /* Do a very simple CSE pass over the hard registers.
179 
180    This function detects no-op moves where we happened to assign two
181    different pseudo-registers to the same hard register, and then
182    copied one to the other.  Reload will generate a useless
183    instruction copying a register to itself.
184 
185    This function also detects cases where we load a value from memory
186    into two different registers, and (if memory is more expensive than
187    registers) changes it to simply copy the first register into the
188    second register.
189 
190    Another optimization is performed that scans the operands of each
191    instruction to see whether the value is already available in a
192    hard register.  It then replaces the operand with the hard register
193    if possible, much like an optional reload would.  */
194 
195 static void
196 reload_cse_regs_1 (rtx first)
197 {
198   rtx insn;
199   rtx testreg = gen_rtx_REG (VOIDmode, -1);
200 
201   cselib_init (CSELIB_RECORD_MEMORY);
202   init_alias_analysis ();
203 
204   for (insn = first; insn; insn = NEXT_INSN (insn))
205     {
206       if (INSN_P (insn))
207 	reload_cse_simplify (insn, testreg);
208 
209       cselib_process_insn (insn);
210     }
211 
212   /* Clean up.  */
213   end_alias_analysis ();
214   cselib_finish ();
215 }
216 
217 /* Try to simplify a single SET instruction.  SET is the set pattern.
218    INSN is the instruction it came from.
219    This function only handles one case: if we set a register to a value
220    which is not a register, we try to find that value in some other register
221    and change the set into a register copy.  */
222 
223 static int
224 reload_cse_simplify_set (rtx set, rtx insn)
225 {
226   int did_change = 0;
227   int dreg;
228   rtx src;
229   enum reg_class dclass;
230   int old_cost;
231   cselib_val *val;
232   struct elt_loc_list *l;
233 #ifdef LOAD_EXTEND_OP
234   enum rtx_code extend_op = UNKNOWN;
235 #endif
236   bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
237 
238   dreg = true_regnum (SET_DEST (set));
239   if (dreg < 0)
240     return 0;
241 
242   src = SET_SRC (set);
243   if (side_effects_p (src) || true_regnum (src) >= 0)
244     return 0;
245 
246   dclass = REGNO_REG_CLASS (dreg);
247 
248 #ifdef LOAD_EXTEND_OP
249   /* When replacing a memory with a register, we need to honor assumptions
250      that combine made wrt the contents of sign bits.  We'll do this by
251      generating an extend instruction instead of a reg->reg copy.  Thus
252      the destination must be a register that we can widen.  */
253   if (MEM_P (src)
254       && GET_MODE_BITSIZE (GET_MODE (src)) < BITS_PER_WORD
255       && (extend_op = LOAD_EXTEND_OP (GET_MODE (src))) != UNKNOWN
256       && !REG_P (SET_DEST (set)))
257     return 0;
258 #endif
259 
260   val = cselib_lookup (src, GET_MODE (SET_DEST (set)), 0);
261   if (! val)
262     return 0;
263 
264   /* If memory loads are cheaper than register copies, don't change them.  */
265   if (MEM_P (src))
266     old_cost = MEMORY_MOVE_COST (GET_MODE (src), dclass, 1);
267   else if (REG_P (src))
268     old_cost = REGISTER_MOVE_COST (GET_MODE (src),
269 				   REGNO_REG_CLASS (REGNO (src)), dclass);
270   else
271     old_cost = rtx_cost (src, SET, speed);
272 
273   for (l = val->locs; l; l = l->next)
274     {
275       rtx this_rtx = l->loc;
276       int this_cost;
277 
278       if (CONSTANT_P (this_rtx) && ! references_value_p (this_rtx, 0))
279 	{
280 #ifdef LOAD_EXTEND_OP
281 	  if (extend_op != UNKNOWN)
282 	    {
283 	      HOST_WIDE_INT this_val;
284 
285 	      /* ??? I'm lazy and don't wish to handle CONST_DOUBLE.  Other
286 		 constants, such as SYMBOL_REF, cannot be extended.  */
287 	      if (!CONST_INT_P (this_rtx))
288 		continue;
289 
290 	      this_val = INTVAL (this_rtx);
291 	      switch (extend_op)
292 		{
293 		case ZERO_EXTEND:
294 		  this_val &= GET_MODE_MASK (GET_MODE (src));
295 		  break;
296 		case SIGN_EXTEND:
297 		  /* ??? In theory we're already extended.  */
298 		  if (this_val == trunc_int_for_mode (this_val, GET_MODE (src)))
299 		    break;
300 		default:
301 		  gcc_unreachable ();
302 		}
303 	      this_rtx = GEN_INT (this_val);
304 	    }
305 #endif
306 	  this_cost = rtx_cost (this_rtx, SET, speed);
307 	}
308       else if (REG_P (this_rtx))
309 	{
310 #ifdef LOAD_EXTEND_OP
311 	  if (extend_op != UNKNOWN)
312 	    {
313 	      this_rtx = gen_rtx_fmt_e (extend_op, word_mode, this_rtx);
314 	      this_cost = rtx_cost (this_rtx, SET, speed);
315 	    }
316 	  else
317 #endif
318 	    this_cost = REGISTER_MOVE_COST (GET_MODE (this_rtx),
319 					    REGNO_REG_CLASS (REGNO (this_rtx)),
320 					    dclass);
321 	}
322       else
323 	continue;
324 
325       /* If equal costs, prefer registers over anything else.  That
326 	 tends to lead to smaller instructions on some machines.  */
327       if (this_cost < old_cost
328 	  || (this_cost == old_cost
329 	      && REG_P (this_rtx)
330 	      && !REG_P (SET_SRC (set))))
331 	{
332 #ifdef LOAD_EXTEND_OP
333 	  if (GET_MODE_BITSIZE (GET_MODE (SET_DEST (set))) < BITS_PER_WORD
334 	      && extend_op != UNKNOWN
335 #ifdef CANNOT_CHANGE_MODE_CLASS
336 	      && !CANNOT_CHANGE_MODE_CLASS (GET_MODE (SET_DEST (set)),
337 					    word_mode,
338 					    REGNO_REG_CLASS (REGNO (SET_DEST (set))))
339 #endif
340 	      )
341 	    {
342 	      rtx wide_dest = gen_rtx_REG (word_mode, REGNO (SET_DEST (set)));
343 	      ORIGINAL_REGNO (wide_dest) = ORIGINAL_REGNO (SET_DEST (set));
344 	      validate_change (insn, &SET_DEST (set), wide_dest, 1);
345 	    }
346 #endif
347 
348 	  validate_unshare_change (insn, &SET_SRC (set), this_rtx, 1);
349 	  old_cost = this_cost, did_change = 1;
350 	}
351     }
352 
353   return did_change;
354 }
355 
356 /* Try to replace operands in INSN with equivalent values that are already
357    in registers.  This can be viewed as optional reloading.
358 
359    For each non-register operand in the insn, see if any hard regs are
360    known to be equivalent to that operand.  Record the alternatives which
361    can accept these hard registers.  Among all alternatives, select the
362    ones which are better or equal to the one currently matching, where
363    "better" is in terms of '?' and '!' constraints.  Among the remaining
364    alternatives, select the one which replaces most operands with
365    hard registers.  */
366 
367 static int
368 reload_cse_simplify_operands (rtx insn, rtx testreg)
369 {
370   int i, j;
371 
372   /* For each operand, all registers that are equivalent to it.  */
373   HARD_REG_SET equiv_regs[MAX_RECOG_OPERANDS];
374 
375   const char *constraints[MAX_RECOG_OPERANDS];
376 
377   /* Vector recording how bad an alternative is.  */
378   int *alternative_reject;
379   /* Vector recording how many registers can be introduced by choosing
380      this alternative.  */
381   int *alternative_nregs;
382   /* Array of vectors recording, for each operand and each alternative,
383      which hard register to substitute, or -1 if the operand should be
384      left as it is.  */
385   int *op_alt_regno[MAX_RECOG_OPERANDS];
386   /* Array of alternatives, sorted in order of decreasing desirability.  */
387   int *alternative_order;
388 
389   extract_insn (insn);
390 
391   if (recog_data.n_alternatives == 0 || recog_data.n_operands == 0)
392     return 0;
393 
394   /* Figure out which alternative currently matches.  */
395   if (! constrain_operands (1))
396     fatal_insn_not_found (insn);
397 
398   alternative_reject = XALLOCAVEC (int, recog_data.n_alternatives);
399   alternative_nregs = XALLOCAVEC (int, recog_data.n_alternatives);
400   alternative_order = XALLOCAVEC (int, recog_data.n_alternatives);
401   memset (alternative_reject, 0, recog_data.n_alternatives * sizeof (int));
402   memset (alternative_nregs, 0, recog_data.n_alternatives * sizeof (int));
403 
404   /* For each operand, find out which regs are equivalent.  */
405   for (i = 0; i < recog_data.n_operands; i++)
406     {
407       cselib_val *v;
408       struct elt_loc_list *l;
409       rtx op;
410 
411       CLEAR_HARD_REG_SET (equiv_regs[i]);
412 
413       /* cselib blows up on CODE_LABELs.  Trying to fix that doesn't seem
414 	 right, so avoid the problem here.  Likewise if we have a constant
415          and the insn pattern doesn't tell us the mode we need.  */
416       if (LABEL_P (recog_data.operand[i])
417 	  || (CONSTANT_P (recog_data.operand[i])
418 	      && recog_data.operand_mode[i] == VOIDmode))
419 	continue;
420 
421       op = recog_data.operand[i];
422 #ifdef LOAD_EXTEND_OP
423       if (MEM_P (op)
424 	  && GET_MODE_BITSIZE (GET_MODE (op)) < BITS_PER_WORD
425 	  && LOAD_EXTEND_OP (GET_MODE (op)) != UNKNOWN)
426 	{
427 	  rtx set = single_set (insn);
428 
429 	  /* We might have multiple sets, some of which do implicit
430 	     extension.  Punt on this for now.  */
431 	  if (! set)
432 	    continue;
433 	  /* If the destination is also a MEM or a STRICT_LOW_PART, no
434 	     extension applies.
435 	     Also, if there is an explicit extension, we don't have to
436 	     worry about an implicit one.  */
437 	  else if (MEM_P (SET_DEST (set))
438 		   || GET_CODE (SET_DEST (set)) == STRICT_LOW_PART
439 		   || GET_CODE (SET_SRC (set)) == ZERO_EXTEND
440 		   || GET_CODE (SET_SRC (set)) == SIGN_EXTEND)
441 	    ; /* Continue ordinary processing.  */
442 #ifdef CANNOT_CHANGE_MODE_CLASS
443 	  /* If the register cannot change mode to word_mode, it follows that
444 	     it cannot have been used in word_mode.  */
445 	  else if (REG_P (SET_DEST (set))
446 		   && CANNOT_CHANGE_MODE_CLASS (GET_MODE (SET_DEST (set)),
447 						word_mode,
448 						REGNO_REG_CLASS (REGNO (SET_DEST (set)))))
449 	    ; /* Continue ordinary processing.  */
450 #endif
451 	  /* If this is a straight load, make the extension explicit.  */
452 	  else if (REG_P (SET_DEST (set))
453 		   && recog_data.n_operands == 2
454 		   && SET_SRC (set) == op
455 		   && SET_DEST (set) == recog_data.operand[1-i])
456 	    {
457 	      validate_change (insn, recog_data.operand_loc[i],
458 			       gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (op)),
459 					      word_mode, op),
460 			       1);
461 	      validate_change (insn, recog_data.operand_loc[1-i],
462 			       gen_rtx_REG (word_mode, REGNO (SET_DEST (set))),
463 			       1);
464 	      if (! apply_change_group ())
465 		return 0;
466 	      return reload_cse_simplify_operands (insn, testreg);
467 	    }
468 	  else
469 	    /* ??? There might be arithmetic operations with memory that are
470 	       safe to optimize, but is it worth the trouble?  */
471 	    continue;
472 	}
473 #endif /* LOAD_EXTEND_OP */
474       v = cselib_lookup (op, recog_data.operand_mode[i], 0);
475       if (! v)
476 	continue;
477 
478       for (l = v->locs; l; l = l->next)
479 	if (REG_P (l->loc))
480 	  SET_HARD_REG_BIT (equiv_regs[i], REGNO (l->loc));
481     }
482 
483   for (i = 0; i < recog_data.n_operands; i++)
484     {
485       enum machine_mode mode;
486       int regno;
487       const char *p;
488 
489       op_alt_regno[i] = XALLOCAVEC (int, recog_data.n_alternatives);
490       for (j = 0; j < recog_data.n_alternatives; j++)
491 	op_alt_regno[i][j] = -1;
492 
493       p = constraints[i] = recog_data.constraints[i];
494       mode = recog_data.operand_mode[i];
495 
496       /* Add the reject values for each alternative given by the constraints
497 	 for this operand.  */
498       j = 0;
499       while (*p != '\0')
500 	{
501 	  char c = *p++;
502 	  if (c == ',')
503 	    j++;
504 	  else if (c == '?')
505 	    alternative_reject[j] += 3;
506 	  else if (c == '!')
507 	    alternative_reject[j] += 300;
508 	}
509 
510       /* We won't change operands which are already registers.  We
511 	 also don't want to modify output operands.  */
512       regno = true_regnum (recog_data.operand[i]);
513       if (regno >= 0
514 	  || constraints[i][0] == '='
515 	  || constraints[i][0] == '+')
516 	continue;
517 
518       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
519 	{
520 	  enum reg_class rclass = NO_REGS;
521 
522 	  if (! TEST_HARD_REG_BIT (equiv_regs[i], regno))
523 	    continue;
524 
525 	  SET_REGNO (testreg, regno);
526 	  PUT_MODE (testreg, mode);
527 
528 	  /* We found a register equal to this operand.  Now look for all
529 	     alternatives that can accept this register and have not been
530 	     assigned a register they can use yet.  */
531 	  j = 0;
532 	  p = constraints[i];
533 	  for (;;)
534 	    {
535 	      char c = *p;
536 
537 	      switch (c)
538 		{
539 		case '=':  case '+':  case '?':
540 		case '#':  case '&':  case '!':
541 		case '*':  case '%':
542 		case '0':  case '1':  case '2':  case '3':  case '4':
543 		case '5':  case '6':  case '7':  case '8':  case '9':
544 		case '<':  case '>':  case 'V':  case 'o':
545 		case 'E':  case 'F':  case 'G':  case 'H':
546 		case 's':  case 'i':  case 'n':
547 		case 'I':  case 'J':  case 'K':  case 'L':
548 		case 'M':  case 'N':  case 'O':  case 'P':
549 		case 'p':  case 'X':  case TARGET_MEM_CONSTRAINT:
550 		  /* These don't say anything we care about.  */
551 		  break;
552 
553 		case 'g': case 'r':
554 		  rclass = reg_class_subunion[(int) rclass][(int) GENERAL_REGS];
555 		  break;
556 
557 		default:
558 		  rclass
559 		    = (reg_class_subunion
560 		       [(int) rclass]
561 		       [(int) REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p)]);
562 		  break;
563 
564 		case ',': case '\0':
565 		  /* See if REGNO fits this alternative, and set it up as the
566 		     replacement register if we don't have one for this
567 		     alternative yet and the operand being replaced is not
568 		     a cheap CONST_INT.  */
569 		  if (op_alt_regno[i][j] == -1
570 		      && reg_fits_class_p (testreg, rclass, 0, mode)
571 		      && (!CONST_INT_P (recog_data.operand[i])
572 			  || (rtx_cost (recog_data.operand[i], SET,
573 			  		optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn)))
574 			      > rtx_cost (testreg, SET,
575 			  		optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn))))))
576 		    {
577 		      alternative_nregs[j]++;
578 		      op_alt_regno[i][j] = regno;
579 		    }
580 		  j++;
581 		  rclass = NO_REGS;
582 		  break;
583 		}
584 	      p += CONSTRAINT_LEN (c, p);
585 
586 	      if (c == '\0')
587 		break;
588 	    }
589 	}
590     }
591 
592   /* Record all alternatives which are better or equal to the currently
593      matching one in the alternative_order array.  */
594   for (i = j = 0; i < recog_data.n_alternatives; i++)
595     if (alternative_reject[i] <= alternative_reject[which_alternative])
596       alternative_order[j++] = i;
597   recog_data.n_alternatives = j;
598 
599   /* Sort it.  Given a small number of alternatives, a dumb algorithm
600      won't hurt too much.  */
601   for (i = 0; i < recog_data.n_alternatives - 1; i++)
602     {
603       int best = i;
604       int best_reject = alternative_reject[alternative_order[i]];
605       int best_nregs = alternative_nregs[alternative_order[i]];
606       int tmp;
607 
608       for (j = i + 1; j < recog_data.n_alternatives; j++)
609 	{
610 	  int this_reject = alternative_reject[alternative_order[j]];
611 	  int this_nregs = alternative_nregs[alternative_order[j]];
612 
613 	  if (this_reject < best_reject
614 	      || (this_reject == best_reject && this_nregs > best_nregs))
615 	    {
616 	      best = j;
617 	      best_reject = this_reject;
618 	      best_nregs = this_nregs;
619 	    }
620 	}
621 
622       tmp = alternative_order[best];
623       alternative_order[best] = alternative_order[i];
624       alternative_order[i] = tmp;
625     }
626 
627   /* Substitute the operands as determined by op_alt_regno for the best
628      alternative.  */
629   j = alternative_order[0];
630 
631   for (i = 0; i < recog_data.n_operands; i++)
632     {
633       enum machine_mode mode = recog_data.operand_mode[i];
634       if (op_alt_regno[i][j] == -1)
635 	continue;
636 
637       validate_change (insn, recog_data.operand_loc[i],
638 		       gen_rtx_REG (mode, op_alt_regno[i][j]), 1);
639     }
640 
641   for (i = recog_data.n_dups - 1; i >= 0; i--)
642     {
643       int op = recog_data.dup_num[i];
644       enum machine_mode mode = recog_data.operand_mode[op];
645 
646       if (op_alt_regno[op][j] == -1)
647 	continue;
648 
649       validate_change (insn, recog_data.dup_loc[i],
650 		       gen_rtx_REG (mode, op_alt_regno[op][j]), 1);
651     }
652 
653   return apply_change_group ();
654 }
655 
656 /* If reload couldn't use reg+reg+offset addressing, try to use reg+reg
657    addressing now.
658    This code might also be useful when reload gave up on reg+reg addressing
659    because of clashes between the return register and INDEX_REG_CLASS.  */
660 
661 /* The maximum number of uses of a register we can keep track of to
662    replace them with reg+reg addressing.  */
663 #define RELOAD_COMBINE_MAX_USES 6
664 
665 /* INSN is the insn where a register has been used, and USEP points to the
666    location of the register within the rtl.  */
667 struct reg_use { rtx insn, *usep; };
668 
669 /* If the register is used in some unknown fashion, USE_INDEX is negative.
670    If it is dead, USE_INDEX is RELOAD_COMBINE_MAX_USES, and STORE_RUID
671    indicates where it becomes live again.
672    Otherwise, USE_INDEX is the index of the last encountered use of the
673    register (which is first among these we have seen since we scan backwards),
674    OFFSET contains the constant offset that is added to the register in
675    all encountered uses, and USE_RUID indicates the first encountered, i.e.
676    last, of these uses.
677    STORE_RUID is always meaningful if we only want to use a value in a
678    register in a different place: it denotes the next insn in the insn
679    stream (i.e. the last encountered) that sets or clobbers the register.  */
680 static struct
681   {
682     struct reg_use reg_use[RELOAD_COMBINE_MAX_USES];
683     int use_index;
684     rtx offset;
685     int store_ruid;
686     int use_ruid;
687   } reg_state[FIRST_PSEUDO_REGISTER];
688 
689 /* Reverse linear uid.  This is increased in reload_combine while scanning
690    the instructions from last to first.  It is used to set last_label_ruid
691    and the store_ruid / use_ruid fields in reg_state.  */
692 static int reload_combine_ruid;
693 
694 #define LABEL_LIVE(LABEL) \
695   (label_live[CODE_LABEL_NUMBER (LABEL) - min_labelno])
696 
697 static void
698 reload_combine (void)
699 {
700   rtx insn, set;
701   int first_index_reg = -1;
702   int last_index_reg = 0;
703   int i;
704   basic_block bb;
705   unsigned int r;
706   int last_label_ruid;
707   int min_labelno, n_labels;
708   HARD_REG_SET ever_live_at_start, *label_live;
709 
710   /* If reg+reg can be used in offsetable memory addresses, the main chunk of
711      reload has already used it where appropriate, so there is no use in
712      trying to generate it now.  */
713   if (double_reg_address_ok && INDEX_REG_CLASS != NO_REGS)
714     return;
715 
716   /* To avoid wasting too much time later searching for an index register,
717      determine the minimum and maximum index register numbers.  */
718   for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
719     if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS], r))
720       {
721 	if (first_index_reg == -1)
722 	  first_index_reg = r;
723 
724 	last_index_reg = r;
725       }
726 
727   /* If no index register is available, we can quit now.  */
728   if (first_index_reg == -1)
729     return;
730 
731   /* Set up LABEL_LIVE and EVER_LIVE_AT_START.  The register lifetime
732      information is a bit fuzzy immediately after reload, but it's
733      still good enough to determine which registers are live at a jump
734      destination.  */
735   min_labelno = get_first_label_num ();
736   n_labels = max_label_num () - min_labelno;
737   label_live = XNEWVEC (HARD_REG_SET, n_labels);
738   CLEAR_HARD_REG_SET (ever_live_at_start);
739 
740   FOR_EACH_BB_REVERSE (bb)
741     {
742       insn = BB_HEAD (bb);
743       if (LABEL_P (insn))
744 	{
745 	  HARD_REG_SET live;
746 	  bitmap live_in = df_get_live_in (bb);
747 
748 	  REG_SET_TO_HARD_REG_SET (live, live_in);
749 	  compute_use_by_pseudos (&live, live_in);
750 	  COPY_HARD_REG_SET (LABEL_LIVE (insn), live);
751 	  IOR_HARD_REG_SET (ever_live_at_start, live);
752 	}
753     }
754 
755   /* Initialize last_label_ruid, reload_combine_ruid and reg_state.  */
756   last_label_ruid = reload_combine_ruid = 0;
757   for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
758     {
759       reg_state[r].store_ruid = reload_combine_ruid;
760       if (fixed_regs[r])
761 	reg_state[r].use_index = -1;
762       else
763 	reg_state[r].use_index = RELOAD_COMBINE_MAX_USES;
764     }
765 
766   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
767     {
768       rtx note;
769 
770       /* We cannot do our optimization across labels.  Invalidating all the use
771 	 information we have would be costly, so we just note where the label
772 	 is and then later disable any optimization that would cross it.  */
773       if (LABEL_P (insn))
774 	last_label_ruid = reload_combine_ruid;
775       else if (BARRIER_P (insn))
776 	for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
777 	  if (! fixed_regs[r])
778 	      reg_state[r].use_index = RELOAD_COMBINE_MAX_USES;
779 
780       if (! INSN_P (insn))
781 	continue;
782 
783       reload_combine_ruid++;
784 
785       /* Look for (set (REGX) (CONST_INT))
786 	 (set (REGX) (PLUS (REGX) (REGY)))
787 	 ...
788 	 ... (MEM (REGX)) ...
789 	 and convert it to
790 	 (set (REGZ) (CONST_INT))
791 	 ...
792 	 ... (MEM (PLUS (REGZ) (REGY)))... .
793 
794 	 First, check that we have (set (REGX) (PLUS (REGX) (REGY)))
795 	 and that we know all uses of REGX before it dies.
796 	 Also, explicitly check that REGX != REGY; our life information
797 	 does not yet show whether REGY changes in this insn.  */
798       set = single_set (insn);
799       if (set != NULL_RTX
800 	  && REG_P (SET_DEST (set))
801 	  && (hard_regno_nregs[REGNO (SET_DEST (set))]
802 			      [GET_MODE (SET_DEST (set))]
803 	      == 1)
804 	  && GET_CODE (SET_SRC (set)) == PLUS
805 	  && REG_P (XEXP (SET_SRC (set), 1))
806 	  && rtx_equal_p (XEXP (SET_SRC (set), 0), SET_DEST (set))
807 	  && !rtx_equal_p (XEXP (SET_SRC (set), 1), SET_DEST (set))
808 	  && last_label_ruid < reg_state[REGNO (SET_DEST (set))].use_ruid)
809 	{
810 	  rtx reg = SET_DEST (set);
811 	  rtx plus = SET_SRC (set);
812 	  rtx base = XEXP (plus, 1);
813 	  rtx prev = prev_nonnote_nondebug_insn (insn);
814 	  rtx prev_set = prev ? single_set (prev) : NULL_RTX;
815 	  unsigned int regno = REGNO (reg);
816 	  rtx index_reg = NULL_RTX;
817 	  rtx reg_sum = NULL_RTX;
818 
819 	  /* Now we need to set INDEX_REG to an index register (denoted as
820 	     REGZ in the illustration above) and REG_SUM to the expression
821 	     register+register that we want to use to substitute uses of REG
822 	     (typically in MEMs) with.  First check REG and BASE for being
823 	     index registers; we can use them even if they are not dead.  */
824 	  if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS], regno)
825 	      || TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS],
826 				    REGNO (base)))
827 	    {
828 	      index_reg = reg;
829 	      reg_sum = plus;
830 	    }
831 	  else
832 	    {
833 	      /* Otherwise, look for a free index register.  Since we have
834 		 checked above that neither REG nor BASE are index registers,
835 		 if we find anything at all, it will be different from these
836 		 two registers.  */
837 	      for (i = first_index_reg; i <= last_index_reg; i++)
838 		{
839 		  if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS],
840 					 i)
841 		      && reg_state[i].use_index == RELOAD_COMBINE_MAX_USES
842 		      && reg_state[i].store_ruid <= reg_state[regno].use_ruid
843 		      && hard_regno_nregs[i][GET_MODE (reg)] == 1)
844 		    {
845 		      index_reg = gen_rtx_REG (GET_MODE (reg), i);
846 		      reg_sum = gen_rtx_PLUS (GET_MODE (reg), index_reg, base);
847 		      break;
848 		    }
849 		}
850 	    }
851 
852 	  /* Check that PREV_SET is indeed (set (REGX) (CONST_INT)) and that
853 	     (REGY), i.e. BASE, is not clobbered before the last use we'll
854 	     create.  */
855 	  if (reg_sum
856 	      && prev_set
857 	      && CONST_INT_P (SET_SRC (prev_set))
858 	      && rtx_equal_p (SET_DEST (prev_set), reg)
859 	      && reg_state[regno].use_index >= 0
860 	      && (reg_state[REGNO (base)].store_ruid
861 		  <= reg_state[regno].use_ruid))
862 	    {
863 	      int i;
864 
865 	      /* Change destination register and, if necessary, the constant
866 		 value in PREV, the constant loading instruction.  */
867 	      validate_change (prev, &SET_DEST (prev_set), index_reg, 1);
868 	      if (reg_state[regno].offset != const0_rtx)
869 		validate_change (prev,
870 				 &SET_SRC (prev_set),
871 				 GEN_INT (INTVAL (SET_SRC (prev_set))
872 					  + INTVAL (reg_state[regno].offset)),
873 				 1);
874 
875 	      /* Now for every use of REG that we have recorded, replace REG
876 		 with REG_SUM.  */
877 	      for (i = reg_state[regno].use_index;
878 		   i < RELOAD_COMBINE_MAX_USES; i++)
879 		validate_unshare_change (reg_state[regno].reg_use[i].insn,
880 				 	 reg_state[regno].reg_use[i].usep,
881 				 	 /* Each change must have its own
882 				    	    replacement.  */
883 				 	 reg_sum, 1);
884 
885 	      if (apply_change_group ())
886 		{
887 		  /* For every new use of REG_SUM, we have to record the use
888 		     of BASE therein, i.e. operand 1.  */
889 		  for (i = reg_state[regno].use_index;
890 		       i < RELOAD_COMBINE_MAX_USES; i++)
891 		    reload_combine_note_use
892 		      (&XEXP (*reg_state[regno].reg_use[i].usep, 1),
893 		       reg_state[regno].reg_use[i].insn);
894 
895 		  if (reg_state[REGNO (base)].use_ruid
896 		      > reg_state[regno].use_ruid)
897 		    reg_state[REGNO (base)].use_ruid
898 		      = reg_state[regno].use_ruid;
899 
900 		  /* Delete the reg-reg addition.  */
901 		  delete_insn (insn);
902 
903 		  if (reg_state[regno].offset != const0_rtx)
904 		    /* Previous REG_EQUIV / REG_EQUAL notes for PREV
905 		       are now invalid.  */
906 		    remove_reg_equal_equiv_notes (prev);
907 
908 		  reg_state[regno].use_index = RELOAD_COMBINE_MAX_USES;
909 		  reg_state[REGNO (index_reg)].store_ruid
910 		    = reload_combine_ruid;
911 		  continue;
912 		}
913 	    }
914 	}
915 
916       note_stores (PATTERN (insn), reload_combine_note_store, NULL);
917 
918       if (CALL_P (insn))
919 	{
920 	  rtx link;
921 
922 	  for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
923 	    if (call_used_regs[r])
924 	      {
925 		reg_state[r].use_index = RELOAD_COMBINE_MAX_USES;
926 		reg_state[r].store_ruid = reload_combine_ruid;
927 	      }
928 
929 	  for (link = CALL_INSN_FUNCTION_USAGE (insn); link;
930 	       link = XEXP (link, 1))
931 	    {
932 	      rtx usage_rtx = XEXP (XEXP (link, 0), 0);
933 	      if (REG_P (usage_rtx))
934 	        {
935 		  unsigned int i;
936 		  unsigned int start_reg = REGNO (usage_rtx);
937 		  unsigned int num_regs =
938 			hard_regno_nregs[start_reg][GET_MODE (usage_rtx)];
939 		  unsigned int end_reg  = start_reg + num_regs - 1;
940 		  for (i = start_reg; i <= end_reg; i++)
941 		    if (GET_CODE (XEXP (link, 0)) == CLOBBER)
942 		      {
943 		        reg_state[i].use_index = RELOAD_COMBINE_MAX_USES;
944 		        reg_state[i].store_ruid = reload_combine_ruid;
945 		      }
946 		    else
947 		      reg_state[i].use_index = -1;
948 	         }
949 	     }
950 
951 	}
952       else if (JUMP_P (insn)
953 	       && GET_CODE (PATTERN (insn)) != RETURN)
954 	{
955 	  /* Non-spill registers might be used at the call destination in
956 	     some unknown fashion, so we have to mark the unknown use.  */
957 	  HARD_REG_SET *live;
958 
959 	  if ((condjump_p (insn) || condjump_in_parallel_p (insn))
960 	      && JUMP_LABEL (insn))
961 	    live = &LABEL_LIVE (JUMP_LABEL (insn));
962 	  else
963 	    live = &ever_live_at_start;
964 
965 	  for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; --i)
966 	    if (TEST_HARD_REG_BIT (*live, i))
967 	      reg_state[i].use_index = -1;
968 	}
969 
970       reload_combine_note_use (&PATTERN (insn), insn);
971       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
972 	{
973 	  if (REG_NOTE_KIND (note) == REG_INC
974 	      && REG_P (XEXP (note, 0)))
975 	    {
976 	      int regno = REGNO (XEXP (note, 0));
977 
978 	      reg_state[regno].store_ruid = reload_combine_ruid;
979 	      reg_state[regno].use_index = -1;
980 	    }
981 	}
982     }
983 
984   free (label_live);
985 }
986 
987 /* Check if DST is a register or a subreg of a register; if it is,
988    update reg_state[regno].store_ruid and reg_state[regno].use_index
989    accordingly.  Called via note_stores from reload_combine.  */
990 
991 static void
992 reload_combine_note_store (rtx dst, const_rtx set, void *data ATTRIBUTE_UNUSED)
993 {
994   int regno = 0;
995   int i;
996   enum machine_mode mode = GET_MODE (dst);
997 
998   if (GET_CODE (dst) == SUBREG)
999     {
1000       regno = subreg_regno_offset (REGNO (SUBREG_REG (dst)),
1001 				   GET_MODE (SUBREG_REG (dst)),
1002 				   SUBREG_BYTE (dst),
1003 				   GET_MODE (dst));
1004       dst = SUBREG_REG (dst);
1005     }
1006   if (!REG_P (dst))
1007     return;
1008   regno += REGNO (dst);
1009 
1010   /* note_stores might have stripped a STRICT_LOW_PART, so we have to be
1011      careful with registers / register parts that are not full words.
1012      Similarly for ZERO_EXTRACT.  */
1013   if (GET_CODE (set) != SET
1014       || GET_CODE (SET_DEST (set)) == ZERO_EXTRACT
1015       || GET_CODE (SET_DEST (set)) == STRICT_LOW_PART)
1016     {
1017       for (i = hard_regno_nregs[regno][mode] - 1 + regno; i >= regno; i--)
1018 	{
1019 	  reg_state[i].use_index = -1;
1020 	  reg_state[i].store_ruid = reload_combine_ruid;
1021 	}
1022     }
1023   else
1024     {
1025       for (i = hard_regno_nregs[regno][mode] - 1 + regno; i >= regno; i--)
1026 	{
1027 	  reg_state[i].store_ruid = reload_combine_ruid;
1028 	  reg_state[i].use_index = RELOAD_COMBINE_MAX_USES;
1029 	}
1030     }
1031 }
1032 
1033 /* XP points to a piece of rtl that has to be checked for any uses of
1034    registers.
1035    *XP is the pattern of INSN, or a part of it.
1036    Called from reload_combine, and recursively by itself.  */
1037 static void
1038 reload_combine_note_use (rtx *xp, rtx insn)
1039 {
1040   rtx x = *xp;
1041   enum rtx_code code = x->code;
1042   const char *fmt;
1043   int i, j;
1044   rtx offset = const0_rtx; /* For the REG case below.  */
1045 
1046   switch (code)
1047     {
1048     case SET:
1049       if (REG_P (SET_DEST (x)))
1050 	{
1051 	  reload_combine_note_use (&SET_SRC (x), insn);
1052 	  return;
1053 	}
1054       break;
1055 
1056     case USE:
1057       /* If this is the USE of a return value, we can't change it.  */
1058       if (REG_P (XEXP (x, 0)) && REG_FUNCTION_VALUE_P (XEXP (x, 0)))
1059 	{
1060 	/* Mark the return register as used in an unknown fashion.  */
1061 	  rtx reg = XEXP (x, 0);
1062 	  int regno = REGNO (reg);
1063 	  int nregs = hard_regno_nregs[regno][GET_MODE (reg)];
1064 
1065 	  while (--nregs >= 0)
1066 	    reg_state[regno + nregs].use_index = -1;
1067 	  return;
1068 	}
1069       break;
1070 
1071     case CLOBBER:
1072       if (REG_P (SET_DEST (x)))
1073 	{
1074 	  /* No spurious CLOBBERs of pseudo registers may remain.  */
1075 	  gcc_assert (REGNO (SET_DEST (x)) < FIRST_PSEUDO_REGISTER);
1076 	  return;
1077 	}
1078       break;
1079 
1080     case PLUS:
1081       /* We are interested in (plus (reg) (const_int)) .  */
1082       if (!REG_P (XEXP (x, 0))
1083 	  || !CONST_INT_P (XEXP (x, 1)))
1084 	break;
1085       offset = XEXP (x, 1);
1086       x = XEXP (x, 0);
1087       /* Fall through.  */
1088     case REG:
1089       {
1090 	int regno = REGNO (x);
1091 	int use_index;
1092 	int nregs;
1093 
1094 	/* No spurious USEs of pseudo registers may remain.  */
1095 	gcc_assert (regno < FIRST_PSEUDO_REGISTER);
1096 
1097 	nregs = hard_regno_nregs[regno][GET_MODE (x)];
1098 
1099 	/* We can't substitute into multi-hard-reg uses.  */
1100 	if (nregs > 1)
1101 	  {
1102 	    while (--nregs >= 0)
1103 	      reg_state[regno + nregs].use_index = -1;
1104 	    return;
1105 	  }
1106 
1107 	/* If this register is already used in some unknown fashion, we
1108 	   can't do anything.
1109 	   If we decrement the index from zero to -1, we can't store more
1110 	   uses, so this register becomes used in an unknown fashion.  */
1111 	use_index = --reg_state[regno].use_index;
1112 	if (use_index < 0)
1113 	  return;
1114 
1115 	if (use_index != RELOAD_COMBINE_MAX_USES - 1)
1116 	  {
1117 	    /* We have found another use for a register that is already
1118 	       used later.  Check if the offsets match; if not, mark the
1119 	       register as used in an unknown fashion.  */
1120 	    if (! rtx_equal_p (offset, reg_state[regno].offset))
1121 	      {
1122 		reg_state[regno].use_index = -1;
1123 		return;
1124 	      }
1125 	  }
1126 	else
1127 	  {
1128 	    /* This is the first use of this register we have seen since we
1129 	       marked it as dead.  */
1130 	    reg_state[regno].offset = offset;
1131 	    reg_state[regno].use_ruid = reload_combine_ruid;
1132 	  }
1133 	reg_state[regno].reg_use[use_index].insn = insn;
1134 	reg_state[regno].reg_use[use_index].usep = xp;
1135 	return;
1136       }
1137 
1138     default:
1139       break;
1140     }
1141 
1142   /* Recursively process the components of X.  */
1143   fmt = GET_RTX_FORMAT (code);
1144   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1145     {
1146       if (fmt[i] == 'e')
1147 	reload_combine_note_use (&XEXP (x, i), insn);
1148       else if (fmt[i] == 'E')
1149 	{
1150 	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1151 	    reload_combine_note_use (&XVECEXP (x, i, j), insn);
1152 	}
1153     }
1154 }
1155 
1156 /* See if we can reduce the cost of a constant by replacing a move
1157    with an add.  We track situations in which a register is set to a
1158    constant or to a register plus a constant.  */
1159 /* We cannot do our optimization across labels.  Invalidating all the
1160    information about register contents we have would be costly, so we
1161    use move2add_last_label_luid to note where the label is and then
1162    later disable any optimization that would cross it.
1163    reg_offset[n] / reg_base_reg[n] / reg_mode[n] are only valid if
1164    reg_set_luid[n] is greater than move2add_last_label_luid.  */
1165 static int reg_set_luid[FIRST_PSEUDO_REGISTER];
1166 
1167 /* If reg_base_reg[n] is negative, register n has been set to
1168    reg_offset[n] in mode reg_mode[n] .
1169    If reg_base_reg[n] is non-negative, register n has been set to the
1170    sum of reg_offset[n] and the value of register reg_base_reg[n]
1171    before reg_set_luid[n], calculated in mode reg_mode[n] .  */
1172 static HOST_WIDE_INT reg_offset[FIRST_PSEUDO_REGISTER];
1173 static int reg_base_reg[FIRST_PSEUDO_REGISTER];
1174 static enum machine_mode reg_mode[FIRST_PSEUDO_REGISTER];
1175 
1176 /* move2add_luid is linearly increased while scanning the instructions
1177    from first to last.  It is used to set reg_set_luid in
1178    reload_cse_move2add and move2add_note_store.  */
1179 static int move2add_luid;
1180 
1181 /* move2add_last_label_luid is set whenever a label is found.  Labels
1182    invalidate all previously collected reg_offset data.  */
1183 static int move2add_last_label_luid;
1184 
1185 /* ??? We don't know how zero / sign extension is handled, hence we
1186    can't go from a narrower to a wider mode.  */
1187 #define MODES_OK_FOR_MOVE2ADD(OUTMODE, INMODE) \
1188   (GET_MODE_SIZE (OUTMODE) == GET_MODE_SIZE (INMODE) \
1189    || (GET_MODE_SIZE (OUTMODE) <= GET_MODE_SIZE (INMODE) \
1190        && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (OUTMODE), \
1191 				 GET_MODE_BITSIZE (INMODE))))
1192 
1193 static void
1194 reload_cse_move2add (rtx first)
1195 {
1196   int i;
1197   rtx insn;
1198 
1199   for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
1200     reg_set_luid[i] = 0;
1201 
1202   move2add_last_label_luid = 0;
1203   move2add_luid = 2;
1204   for (insn = first; insn; insn = NEXT_INSN (insn), move2add_luid++)
1205     {
1206       rtx pat, note;
1207 
1208       if (LABEL_P (insn))
1209 	{
1210 	  move2add_last_label_luid = move2add_luid;
1211 	  /* We're going to increment move2add_luid twice after a
1212 	     label, so that we can use move2add_last_label_luid + 1 as
1213 	     the luid for constants.  */
1214 	  move2add_luid++;
1215 	  continue;
1216 	}
1217       if (! INSN_P (insn))
1218 	continue;
1219       pat = PATTERN (insn);
1220       /* For simplicity, we only perform this optimization on
1221 	 straightforward SETs.  */
1222       if (GET_CODE (pat) == SET
1223 	  && REG_P (SET_DEST (pat)))
1224 	{
1225 	  rtx reg = SET_DEST (pat);
1226 	  int regno = REGNO (reg);
1227 	  rtx src = SET_SRC (pat);
1228 
1229 	  /* Check if we have valid information on the contents of this
1230 	     register in the mode of REG.  */
1231 	  if (reg_set_luid[regno] > move2add_last_label_luid
1232 	      && MODES_OK_FOR_MOVE2ADD (GET_MODE (reg), reg_mode[regno])
1233               && dbg_cnt (cse2_move2add))
1234 	    {
1235 	      /* Try to transform (set (REGX) (CONST_INT A))
1236 				  ...
1237 				  (set (REGX) (CONST_INT B))
1238 		 to
1239 				  (set (REGX) (CONST_INT A))
1240 				  ...
1241 				  (set (REGX) (plus (REGX) (CONST_INT B-A)))
1242 		 or
1243 				  (set (REGX) (CONST_INT A))
1244 				  ...
1245 				  (set (STRICT_LOW_PART (REGX)) (CONST_INT B))
1246 	      */
1247 
1248 	      if (CONST_INT_P (src) && reg_base_reg[regno] < 0)
1249 		{
1250 		  rtx new_src = gen_int_mode (INTVAL (src) - reg_offset[regno],
1251 					      GET_MODE (reg));
1252 		  bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
1253 
1254 		  /* (set (reg) (plus (reg) (const_int 0))) is not canonical;
1255 		     use (set (reg) (reg)) instead.
1256 		     We don't delete this insn, nor do we convert it into a
1257 		     note, to avoid losing register notes or the return
1258 		     value flag.  jump2 already knows how to get rid of
1259 		     no-op moves.  */
1260 		  if (new_src == const0_rtx)
1261 		    {
1262 		      /* If the constants are different, this is a
1263 			 truncation, that, if turned into (set (reg)
1264 			 (reg)), would be discarded.  Maybe we should
1265 			 try a truncMN pattern?  */
1266 		      if (INTVAL (src) == reg_offset [regno])
1267 			validate_change (insn, &SET_SRC (pat), reg, 0);
1268 		    }
1269 		  else if (rtx_cost (new_src, PLUS, speed) < rtx_cost (src, SET, speed)
1270 			   && have_add2_insn (reg, new_src))
1271 		    {
1272 		      rtx tem = gen_rtx_PLUS (GET_MODE (reg), reg, new_src);
1273 		      validate_change (insn, &SET_SRC (pat), tem, 0);
1274 		    }
1275 		  else if (GET_MODE (reg) != BImode)
1276 		    {
1277 		      enum machine_mode narrow_mode;
1278 		      for (narrow_mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1279 			   narrow_mode != VOIDmode
1280 			   && narrow_mode != GET_MODE (reg);
1281 			   narrow_mode = GET_MODE_WIDER_MODE (narrow_mode))
1282 			{
1283 			  if (have_insn_for (STRICT_LOW_PART, narrow_mode)
1284 			      && ((reg_offset[regno]
1285 				   & ~GET_MODE_MASK (narrow_mode))
1286 				  == (INTVAL (src)
1287 				      & ~GET_MODE_MASK (narrow_mode))))
1288 			    {
1289 			      rtx narrow_reg = gen_rtx_REG (narrow_mode,
1290 							    REGNO (reg));
1291 			      rtx narrow_src = gen_int_mode (INTVAL (src),
1292 							     narrow_mode);
1293 			      rtx new_set =
1294 				gen_rtx_SET (VOIDmode,
1295 					     gen_rtx_STRICT_LOW_PART (VOIDmode,
1296 								      narrow_reg),
1297 					     narrow_src);
1298 			      if (validate_change (insn, &PATTERN (insn),
1299 						   new_set, 0))
1300 				break;
1301 			    }
1302 			}
1303 		    }
1304 		  reg_set_luid[regno] = move2add_luid;
1305 		  reg_mode[regno] = GET_MODE (reg);
1306 		  reg_offset[regno] = INTVAL (src);
1307 		  continue;
1308 		}
1309 
1310 	      /* Try to transform (set (REGX) (REGY))
1311 				  (set (REGX) (PLUS (REGX) (CONST_INT A)))
1312 				  ...
1313 				  (set (REGX) (REGY))
1314 				  (set (REGX) (PLUS (REGX) (CONST_INT B)))
1315 		 to
1316 				  (set (REGX) (REGY))
1317 				  (set (REGX) (PLUS (REGX) (CONST_INT A)))
1318 				  ...
1319 				  (set (REGX) (plus (REGX) (CONST_INT B-A)))  */
1320 	      else if (REG_P (src)
1321 		       && reg_set_luid[regno] == reg_set_luid[REGNO (src)]
1322 		       && reg_base_reg[regno] == reg_base_reg[REGNO (src)]
1323 		       && MODES_OK_FOR_MOVE2ADD (GET_MODE (reg),
1324 						 reg_mode[REGNO (src)]))
1325 		{
1326 		  rtx next = next_nonnote_nondebug_insn (insn);
1327 		  rtx set = NULL_RTX;
1328 		  if (next)
1329 		    set = single_set (next);
1330 		  if (set
1331 		      && SET_DEST (set) == reg
1332 		      && GET_CODE (SET_SRC (set)) == PLUS
1333 		      && XEXP (SET_SRC (set), 0) == reg
1334 		      && CONST_INT_P (XEXP (SET_SRC (set), 1)))
1335 		    {
1336 		      rtx src3 = XEXP (SET_SRC (set), 1);
1337 		      HOST_WIDE_INT added_offset = INTVAL (src3);
1338 		      HOST_WIDE_INT base_offset = reg_offset[REGNO (src)];
1339 		      HOST_WIDE_INT regno_offset = reg_offset[regno];
1340 		      rtx new_src =
1341 			gen_int_mode (added_offset
1342 				      + base_offset
1343 				      - regno_offset,
1344 				      GET_MODE (reg));
1345 		      bool success = false;
1346 		      bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
1347 
1348 		      if (new_src == const0_rtx)
1349 			/* See above why we create (set (reg) (reg)) here.  */
1350 			success
1351 			  = validate_change (next, &SET_SRC (set), reg, 0);
1352 		      else if ((rtx_cost (new_src, PLUS, speed)
1353 				< COSTS_N_INSNS (1) + rtx_cost (src3, SET, speed))
1354 			       && have_add2_insn (reg, new_src))
1355 			{
1356 			  rtx newpat = gen_rtx_SET (VOIDmode,
1357 						    reg,
1358 						    gen_rtx_PLUS (GET_MODE (reg),
1359 						 		  reg,
1360 								  new_src));
1361 			  success
1362 			    = validate_change (next, &PATTERN (next),
1363 					       newpat, 0);
1364 			}
1365 		      if (success)
1366 			delete_insn (insn);
1367 		      insn = next;
1368 		      reg_mode[regno] = GET_MODE (reg);
1369 		      reg_offset[regno] =
1370 			trunc_int_for_mode (added_offset + base_offset,
1371 					    GET_MODE (reg));
1372 		      continue;
1373 		    }
1374 		}
1375 	    }
1376 	}
1377 
1378       for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1379 	{
1380 	  if (REG_NOTE_KIND (note) == REG_INC
1381 	      && REG_P (XEXP (note, 0)))
1382 	    {
1383 	      /* Reset the information about this register.  */
1384 	      int regno = REGNO (XEXP (note, 0));
1385 	      if (regno < FIRST_PSEUDO_REGISTER)
1386 		reg_set_luid[regno] = 0;
1387 	    }
1388 	}
1389       note_stores (PATTERN (insn), move2add_note_store, NULL);
1390 
1391       /* If INSN is a conditional branch, we try to extract an
1392 	 implicit set out of it.  */
1393       if (any_condjump_p (insn))
1394 	{
1395 	  rtx cnd = fis_get_condition (insn);
1396 
1397 	  if (cnd != NULL_RTX
1398 	      && GET_CODE (cnd) == NE
1399 	      && REG_P (XEXP (cnd, 0))
1400 	      && !reg_set_p (XEXP (cnd, 0), insn)
1401 	      /* The following two checks, which are also in
1402 		 move2add_note_store, are intended to reduce the
1403 		 number of calls to gen_rtx_SET to avoid memory
1404 		 allocation if possible.  */
1405 	      && SCALAR_INT_MODE_P (GET_MODE (XEXP (cnd, 0)))
1406 	      && hard_regno_nregs[REGNO (XEXP (cnd, 0))][GET_MODE (XEXP (cnd, 0))] == 1
1407 	      && CONST_INT_P (XEXP (cnd, 1)))
1408 	    {
1409 	      rtx implicit_set =
1410 		gen_rtx_SET (VOIDmode, XEXP (cnd, 0), XEXP (cnd, 1));
1411 	      move2add_note_store (SET_DEST (implicit_set), implicit_set, 0);
1412 	    }
1413 	}
1414 
1415       /* If this is a CALL_INSN, all call used registers are stored with
1416 	 unknown values.  */
1417       if (CALL_P (insn))
1418 	{
1419 	  for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
1420 	    {
1421 	      if (call_used_regs[i])
1422 		/* Reset the information about this register.  */
1423 		reg_set_luid[i] = 0;
1424 	    }
1425 	}
1426     }
1427 }
1428 
1429 /* SET is a SET or CLOBBER that sets DST.
1430    Update reg_set_luid, reg_offset and reg_base_reg accordingly.
1431    Called from reload_cse_move2add via note_stores.  */
1432 
1433 static void
1434 move2add_note_store (rtx dst, const_rtx set, void *data ATTRIBUTE_UNUSED)
1435 {
1436   unsigned int regno = 0;
1437   unsigned int nregs = 0;
1438   unsigned int i;
1439   enum machine_mode mode = GET_MODE (dst);
1440 
1441   if (GET_CODE (dst) == SUBREG)
1442     {
1443       regno = subreg_regno_offset (REGNO (SUBREG_REG (dst)),
1444 				   GET_MODE (SUBREG_REG (dst)),
1445 				   SUBREG_BYTE (dst),
1446 				   GET_MODE (dst));
1447       nregs = subreg_nregs (dst);
1448       dst = SUBREG_REG (dst);
1449     }
1450 
1451   /* Some targets do argument pushes without adding REG_INC notes.  */
1452 
1453   if (MEM_P (dst))
1454     {
1455       dst = XEXP (dst, 0);
1456       if (GET_CODE (dst) == PRE_INC || GET_CODE (dst) == POST_INC
1457 	  || GET_CODE (dst) == PRE_DEC || GET_CODE (dst) == POST_DEC)
1458 	reg_set_luid[REGNO (XEXP (dst, 0))] = 0;
1459       return;
1460     }
1461   if (!REG_P (dst))
1462     return;
1463 
1464   regno += REGNO (dst);
1465   if (!nregs)
1466     nregs = hard_regno_nregs[regno][mode];
1467 
1468   if (SCALAR_INT_MODE_P (GET_MODE (dst))
1469       && nregs == 1 && GET_CODE (set) == SET
1470       && GET_CODE (SET_DEST (set)) != ZERO_EXTRACT
1471       && GET_CODE (SET_DEST (set)) != STRICT_LOW_PART)
1472     {
1473       rtx src = SET_SRC (set);
1474       rtx base_reg;
1475       HOST_WIDE_INT offset;
1476       int base_regno;
1477       /* This may be different from mode, if SET_DEST (set) is a
1478 	 SUBREG.  */
1479       enum machine_mode dst_mode = GET_MODE (dst);
1480 
1481       switch (GET_CODE (src))
1482 	{
1483 	case PLUS:
1484 	  if (REG_P (XEXP (src, 0)))
1485 	    {
1486 	      base_reg = XEXP (src, 0);
1487 
1488 	      if (CONST_INT_P (XEXP (src, 1)))
1489 		offset = INTVAL (XEXP (src, 1));
1490 	      else if (REG_P (XEXP (src, 1))
1491 		       && (reg_set_luid[REGNO (XEXP (src, 1))]
1492 			   > move2add_last_label_luid)
1493 		       && (MODES_OK_FOR_MOVE2ADD
1494 			   (dst_mode, reg_mode[REGNO (XEXP (src, 1))])))
1495 		{
1496 		  if (reg_base_reg[REGNO (XEXP (src, 1))] < 0)
1497 		    offset = reg_offset[REGNO (XEXP (src, 1))];
1498 		  /* Maybe the first register is known to be a
1499 		     constant.  */
1500 		  else if (reg_set_luid[REGNO (base_reg)]
1501 			   > move2add_last_label_luid
1502 			   && (MODES_OK_FOR_MOVE2ADD
1503 			       (dst_mode, reg_mode[REGNO (XEXP (src, 1))]))
1504 			   && reg_base_reg[REGNO (base_reg)] < 0)
1505 		    {
1506 		      offset = reg_offset[REGNO (base_reg)];
1507 		      base_reg = XEXP (src, 1);
1508 		    }
1509 		  else
1510 		    goto invalidate;
1511 		}
1512 	      else
1513 		goto invalidate;
1514 
1515 	      break;
1516 	    }
1517 
1518 	  goto invalidate;
1519 
1520 	case REG:
1521 	  base_reg = src;
1522 	  offset = 0;
1523 	  break;
1524 
1525 	case CONST_INT:
1526 	  /* Start tracking the register as a constant.  */
1527 	  reg_base_reg[regno] = -1;
1528 	  reg_offset[regno] = INTVAL (SET_SRC (set));
1529 	  /* We assign the same luid to all registers set to constants.  */
1530 	  reg_set_luid[regno] = move2add_last_label_luid + 1;
1531 	  reg_mode[regno] = mode;
1532 	  return;
1533 
1534 	default:
1535 	invalidate:
1536 	  /* Invalidate the contents of the register.  */
1537 	  reg_set_luid[regno] = 0;
1538 	  return;
1539 	}
1540 
1541       base_regno = REGNO (base_reg);
1542       /* If information about the base register is not valid, set it
1543 	 up as a new base register, pretending its value is known
1544 	 starting from the current insn.  */
1545       if (reg_set_luid[base_regno] <= move2add_last_label_luid)
1546 	{
1547 	  reg_base_reg[base_regno] = base_regno;
1548 	  reg_offset[base_regno] = 0;
1549 	  reg_set_luid[base_regno] = move2add_luid;
1550 	  reg_mode[base_regno] = mode;
1551 	}
1552       else if (! MODES_OK_FOR_MOVE2ADD (dst_mode,
1553 					reg_mode[base_regno]))
1554 	goto invalidate;
1555 
1556       reg_mode[regno] = mode;
1557 
1558       /* Copy base information from our base register.  */
1559       reg_set_luid[regno] = reg_set_luid[base_regno];
1560       reg_base_reg[regno] = reg_base_reg[base_regno];
1561 
1562       /* Compute the sum of the offsets or constants.  */
1563       reg_offset[regno] = trunc_int_for_mode (offset
1564 					      + reg_offset[base_regno],
1565 					      dst_mode);
1566     }
1567   else
1568     {
1569       unsigned int endregno = regno + nregs;
1570 
1571       for (i = regno; i < endregno; i++)
1572 	/* Reset the information about this register.  */
1573 	reg_set_luid[i] = 0;
1574     }
1575 }
1576 
1577 static bool
1578 gate_handle_postreload (void)
1579 {
1580   return (optimize > 0 && reload_completed);
1581 }
1582 
1583 
1584 static unsigned int
1585 rest_of_handle_postreload (void)
1586 {
1587   if (!dbg_cnt (postreload_cse))
1588     return 0;
1589 
1590   /* Do a very simple CSE pass over just the hard registers.  */
1591   reload_cse_regs (get_insns ());
1592   /* Reload_cse_regs can eliminate potentially-trapping MEMs.
1593      Remove any EH edges associated with them.  */
1594   if (flag_non_call_exceptions)
1595     purge_all_dead_edges ();
1596 
1597   return 0;
1598 }
1599 
1600 struct rtl_opt_pass pass_postreload_cse =
1601 {
1602  {
1603   RTL_PASS,
1604   "postreload",                         /* name */
1605   gate_handle_postreload,               /* gate */
1606   rest_of_handle_postreload,            /* execute */
1607   NULL,                                 /* sub */
1608   NULL,                                 /* next */
1609   0,                                    /* static_pass_number */
1610   TV_RELOAD_CSE_REGS,                   /* tv_id */
1611   0,                                    /* properties_required */
1612   0,                                    /* properties_provided */
1613   0,                                    /* properties_destroyed */
1614   0,                                    /* todo_flags_start */
1615   TODO_df_finish | TODO_verify_rtl_sharing |
1616   TODO_dump_func                        /* todo_flags_finish */
1617  }
1618 };
1619