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