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