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