1 /* Move registers around to reduce number of move instructions needed.
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 Free Software Foundation, Inc.
6 This file is part of GCC.
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
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
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/>. */
23 /* This module makes some simple RTL code transformations which
24 improve the subsequent register allocation. */
28 #include "coretypes.h"
30 #include "rtl.h" /* stdio.h must precede rtl.h for FFS. */
32 #include "insn-config.h"
36 #include "hard-reg-set.h"
40 #include "basic-block.h"
45 #include "tree-pass.h"
48 static int optimize_reg_copy_1 (rtx
, rtx
, rtx
);
49 static void optimize_reg_copy_2 (rtx
, rtx
, rtx
);
50 static void optimize_reg_copy_3 (rtx
, rtx
, rtx
);
51 static void copy_src_to_dest (rtx
, rtx
, rtx
);
61 int with
[MAX_RECOG_OPERANDS
];
62 enum match_use use
[MAX_RECOG_OPERANDS
];
63 int commutative
[MAX_RECOG_OPERANDS
];
64 int early_clobber
[MAX_RECOG_OPERANDS
];
67 static int find_matches (rtx
, struct match
*);
68 static int fixup_match_2 (rtx
, rtx
, rtx
, rtx
);
70 /* Return nonzero if registers with CLASS1 and CLASS2 can be merged without
71 causing too much register allocation problems. */
73 regclass_compatible_p (enum reg_class class0
, enum reg_class class1
)
75 return (class0
== class1
76 || (reg_class_subset_p (class0
, class1
)
77 && ! CLASS_LIKELY_SPILLED_P (class0
))
78 || (reg_class_subset_p (class1
, class0
)
79 && ! CLASS_LIKELY_SPILLED_P (class1
)));
85 /* Find the place in the rtx X where REG is used as a memory address.
86 Return the MEM rtx that so uses it.
87 If PLUSCONST is nonzero, search instead for a memory address equivalent to
88 (plus REG (const_int PLUSCONST)).
90 If such an address does not appear, return 0.
91 If REG appears more than once, or is used other than in such an address,
95 find_use_as_address (rtx x
, rtx reg
, HOST_WIDE_INT plusconst
)
97 enum rtx_code code
= GET_CODE (x
);
98 const char * const fmt
= GET_RTX_FORMAT (code
);
103 if (code
== MEM
&& XEXP (x
, 0) == reg
&& plusconst
== 0)
106 if (code
== MEM
&& GET_CODE (XEXP (x
, 0)) == PLUS
107 && XEXP (XEXP (x
, 0), 0) == reg
108 && CONST_INT_P (XEXP (XEXP (x
, 0), 1))
109 && INTVAL (XEXP (XEXP (x
, 0), 1)) == plusconst
)
112 if (code
== SIGN_EXTRACT
|| code
== ZERO_EXTRACT
)
114 /* If REG occurs inside a MEM used in a bit-field reference,
115 that is unacceptable. */
116 if (find_use_as_address (XEXP (x
, 0), reg
, 0) != 0)
117 return (rtx
) (size_t) 1;
121 return (rtx
) (size_t) 1;
123 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
127 tem
= find_use_as_address (XEXP (x
, i
), reg
, plusconst
);
131 return (rtx
) (size_t) 1;
133 else if (fmt
[i
] == 'E')
136 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
138 tem
= find_use_as_address (XVECEXP (x
, i
, j
), reg
, plusconst
);
142 return (rtx
) (size_t) 1;
151 /* INC_INSN is an instruction that adds INCREMENT to REG.
152 Try to fold INC_INSN as a post/pre in/decrement into INSN.
153 Iff INC_INSN_SET is nonzero, inc_insn has a destination different from src.
154 Return nonzero for success. */
156 try_auto_increment (rtx insn
, rtx inc_insn
, rtx inc_insn_set
, rtx reg
,
157 HOST_WIDE_INT increment
, int pre
)
159 enum rtx_code inc_code
;
161 rtx pset
= single_set (insn
);
164 /* Can't use the size of SET_SRC, we might have something like
165 (sign_extend:SI (mem:QI ... */
166 rtx use
= find_use_as_address (pset
, reg
, 0);
167 if (use
!= 0 && use
!= (rtx
) (size_t) 1)
169 int size
= GET_MODE_SIZE (GET_MODE (use
));
171 || (HAVE_POST_INCREMENT
172 && pre
== 0 && (inc_code
= POST_INC
, increment
== size
))
173 || (HAVE_PRE_INCREMENT
174 && pre
== 1 && (inc_code
= PRE_INC
, increment
== size
))
175 || (HAVE_POST_DECREMENT
176 && pre
== 0 && (inc_code
= POST_DEC
, increment
== -size
))
177 || (HAVE_PRE_DECREMENT
178 && pre
== 1 && (inc_code
= PRE_DEC
, increment
== -size
))
184 &SET_SRC (inc_insn_set
),
185 XEXP (SET_SRC (inc_insn_set
), 0), 1);
186 validate_change (insn
, &XEXP (use
, 0),
187 gen_rtx_fmt_e (inc_code
, Pmode
, reg
), 1);
188 if (apply_change_group ())
190 /* If there is a REG_DEAD note on this insn, we must
191 change this not to REG_UNUSED meaning that the register
192 is set, but the value is dead. Failure to do so will
193 result in sched1 dying -- when it recomputes lifetime
194 information, the number of REG_DEAD notes will have
196 rtx note
= find_reg_note (insn
, REG_DEAD
, reg
);
198 PUT_REG_NOTE_KIND (note
, REG_UNUSED
);
200 add_reg_note (insn
, REG_INC
, reg
);
203 delete_insn (inc_insn
);
214 static int *regno_src_regno
;
216 /* INSN is a copy from SRC to DEST, both registers, and SRC does not die
219 Search forward to see if SRC dies before either it or DEST is modified,
220 but don't scan past the end of a basic block. If so, we can replace SRC
221 with DEST and let SRC die in INSN.
223 This will reduce the number of registers live in that range and may enable
224 DEST to be tied to SRC, thus often saving one register in addition to a
225 register-register copy. */
228 optimize_reg_copy_1 (rtx insn
, rtx dest
, rtx src
)
233 int sregno
= REGNO (src
);
234 int dregno
= REGNO (dest
);
235 basic_block bb
= BLOCK_FOR_INSN (insn
);
237 /* We don't want to mess with hard regs if register classes are small. */
239 || (SMALL_REGISTER_CLASSES
240 && (sregno
< FIRST_PSEUDO_REGISTER
241 || dregno
< FIRST_PSEUDO_REGISTER
))
242 /* We don't see all updates to SP if they are in an auto-inc memory
243 reference, so we must disallow this optimization on them. */
244 || sregno
== STACK_POINTER_REGNUM
|| dregno
== STACK_POINTER_REGNUM
)
247 for (p
= NEXT_INSN (insn
); p
; p
= NEXT_INSN (p
))
251 if (BLOCK_FOR_INSN (p
) != bb
)
254 if (reg_set_p (src
, p
) || reg_set_p (dest
, p
)
255 /* If SRC is an asm-declared register, it must not be replaced
256 in any asm. Unfortunately, the REG_EXPR tree for the asm
257 variable may be absent in the SRC rtx, so we can't check the
258 actual register declaration easily (the asm operand will have
259 it, though). To avoid complicating the test for a rare case,
260 we just don't perform register replacement for a hard reg
261 mentioned in an asm. */
262 || (sregno
< FIRST_PSEUDO_REGISTER
263 && asm_noperands (PATTERN (p
)) >= 0
264 && reg_overlap_mentioned_p (src
, PATTERN (p
)))
265 /* Don't change hard registers used by a call. */
266 || (CALL_P (p
) && sregno
< FIRST_PSEUDO_REGISTER
267 && find_reg_fusage (p
, USE
, src
))
268 /* Don't change a USE of a register. */
269 || (GET_CODE (PATTERN (p
)) == USE
270 && reg_overlap_mentioned_p (src
, XEXP (PATTERN (p
), 0))))
273 /* See if all of SRC dies in P. This test is slightly more
274 conservative than it needs to be. */
275 if ((note
= find_regno_note (p
, REG_DEAD
, sregno
)) != 0
276 && GET_MODE (XEXP (note
, 0)) == GET_MODE (src
))
283 int s_freq_calls
= 0;
284 int d_freq_calls
= 0;
286 /* We can do the optimization. Scan forward from INSN again,
287 replacing regs as we go. Set FAILED if a replacement can't
288 be done. In that case, we can't move the death note for SRC.
289 This should be rare. */
291 /* Set to stop at next insn. */
292 for (q
= next_real_insn (insn
);
293 q
!= next_real_insn (p
);
294 q
= next_real_insn (q
))
296 if (reg_overlap_mentioned_p (src
, PATTERN (q
)))
298 /* If SRC is a hard register, we might miss some
299 overlapping registers with validate_replace_rtx,
300 so we would have to undo it. We can't if DEST is
301 present in the insn, so fail in that combination
303 if (sregno
< FIRST_PSEUDO_REGISTER
304 && reg_mentioned_p (dest
, PATTERN (q
)))
307 /* Attempt to replace all uses. */
308 else if (!validate_replace_rtx (src
, dest
, q
))
311 /* If this succeeded, but some part of the register
312 is still present, undo the replacement. */
313 else if (sregno
< FIRST_PSEUDO_REGISTER
314 && reg_overlap_mentioned_p (src
, PATTERN (q
)))
316 validate_replace_rtx (dest
, src
, q
);
321 /* For SREGNO, count the total number of insns scanned.
322 For DREGNO, count the total number of insns scanned after
323 passing the death note for DREGNO. */
324 if (!DEBUG_INSN_P (p
))
331 /* If the insn in which SRC dies is a CALL_INSN, don't count it
332 as a call that has been crossed. Otherwise, count it. */
333 if (q
!= p
&& CALL_P (q
))
335 /* Similarly, total calls for SREGNO, total calls beyond
336 the death note for DREGNO. */
338 s_freq_calls
+= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (q
));
342 d_freq_calls
+= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (q
));
346 /* If DEST dies here, remove the death note and save it for
347 later. Make sure ALL of DEST dies here; again, this is
348 overly conservative. */
350 && (dest_death
= find_regno_note (q
, REG_DEAD
, dregno
)) != 0)
352 if (GET_MODE (XEXP (dest_death
, 0)) != GET_MODE (dest
))
353 failed
= 1, dest_death
= 0;
355 remove_note (q
, dest_death
);
361 /* These counters need to be updated if and only if we are
362 going to move the REG_DEAD note. */
363 if (sregno
>= FIRST_PSEUDO_REGISTER
)
365 if (REG_LIVE_LENGTH (sregno
) >= 0)
367 REG_LIVE_LENGTH (sregno
) -= s_length
;
368 /* REG_LIVE_LENGTH is only an approximation after
369 combine if sched is not run, so make sure that we
370 still have a reasonable value. */
371 if (REG_LIVE_LENGTH (sregno
) < 2)
372 REG_LIVE_LENGTH (sregno
) = 2;
375 REG_N_CALLS_CROSSED (sregno
) -= s_n_calls
;
376 REG_FREQ_CALLS_CROSSED (sregno
) -= s_freq_calls
;
379 /* Move death note of SRC from P to INSN. */
380 remove_note (p
, note
);
381 XEXP (note
, 1) = REG_NOTES (insn
);
382 REG_NOTES (insn
) = note
;
385 /* DEST is also dead if INSN has a REG_UNUSED note for DEST. */
387 && (dest_death
= find_regno_note (insn
, REG_UNUSED
, dregno
)))
389 PUT_REG_NOTE_KIND (dest_death
, REG_DEAD
);
390 remove_note (insn
, dest_death
);
393 /* Put death note of DEST on P if we saw it die. */
396 XEXP (dest_death
, 1) = REG_NOTES (p
);
397 REG_NOTES (p
) = dest_death
;
399 if (dregno
>= FIRST_PSEUDO_REGISTER
)
401 /* If and only if we are moving the death note for DREGNO,
402 then we need to update its counters. */
403 if (REG_LIVE_LENGTH (dregno
) >= 0)
404 REG_LIVE_LENGTH (dregno
) += d_length
;
405 REG_N_CALLS_CROSSED (dregno
) += d_n_calls
;
406 REG_FREQ_CALLS_CROSSED (dregno
) += d_freq_calls
;
413 /* If SRC is a hard register which is set or killed in some other
414 way, we can't do this optimization. */
415 else if (sregno
< FIRST_PSEUDO_REGISTER
416 && dead_or_set_p (p
, src
))
422 /* INSN is a copy of SRC to DEST, in which SRC dies. See if we now have
423 a sequence of insns that modify DEST followed by an insn that sets
424 SRC to DEST in which DEST dies, with no prior modification of DEST.
425 (There is no need to check if the insns in between actually modify
426 DEST. We should not have cases where DEST is not modified, but
427 the optimization is safe if no such modification is detected.)
428 In that case, we can replace all uses of DEST, starting with INSN and
429 ending with the set of SRC to DEST, with SRC. We do not do this
430 optimization if a CALL_INSN is crossed unless SRC already crosses a
431 call or if DEST dies before the copy back to SRC.
433 It is assumed that DEST and SRC are pseudos; it is too complicated to do
434 this for hard registers since the substitutions we may make might fail. */
437 optimize_reg_copy_2 (rtx insn
, rtx dest
, rtx src
)
441 int sregno
= REGNO (src
);
442 int dregno
= REGNO (dest
);
443 basic_block bb
= BLOCK_FOR_INSN (insn
);
445 for (p
= NEXT_INSN (insn
); p
; p
= NEXT_INSN (p
))
449 if (BLOCK_FOR_INSN (p
) != bb
)
452 set
= single_set (p
);
453 if (set
&& SET_SRC (set
) == dest
&& SET_DEST (set
) == src
454 && find_reg_note (p
, REG_DEAD
, dest
))
456 /* We can do the optimization. Scan forward from INSN again,
457 replacing regs as we go. */
459 /* Set to stop at next insn. */
460 for (q
= insn
; q
!= NEXT_INSN (p
); q
= NEXT_INSN (q
))
463 if (reg_mentioned_p (dest
, PATTERN (q
)))
467 PATTERN (q
) = replace_rtx (PATTERN (q
), dest
, src
);
468 note
= FIND_REG_INC_NOTE (q
, dest
);
471 remove_note (q
, note
);
472 add_reg_note (q
, REG_INC
, src
);
479 int freq
= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (q
));
480 REG_N_CALLS_CROSSED (dregno
)--;
481 REG_N_CALLS_CROSSED (sregno
)++;
482 REG_FREQ_CALLS_CROSSED (dregno
) -= freq
;
483 REG_FREQ_CALLS_CROSSED (sregno
) += freq
;
487 remove_note (p
, find_reg_note (p
, REG_DEAD
, dest
));
488 REG_N_DEATHS (dregno
)--;
489 remove_note (insn
, find_reg_note (insn
, REG_DEAD
, src
));
490 REG_N_DEATHS (sregno
)--;
494 if (reg_set_p (src
, p
)
495 || find_reg_note (p
, REG_DEAD
, dest
)
496 || (CALL_P (p
) && REG_N_CALLS_CROSSED (sregno
) == 0))
501 /* INSN is a ZERO_EXTEND or SIGN_EXTEND of SRC to DEST.
502 Look if SRC dies there, and if it is only set once, by loading
503 it from memory. If so, try to incorporate the zero/sign extension
504 into the memory read, change SRC to the mode of DEST, and alter
505 the remaining accesses to use the appropriate SUBREG. This allows
506 SRC and DEST to be tied later. */
508 optimize_reg_copy_3 (rtx insn
, rtx dest
, rtx src
)
510 rtx src_reg
= XEXP (src
, 0);
511 int src_no
= REGNO (src_reg
);
512 int dst_no
= REGNO (dest
);
514 enum machine_mode old_mode
;
515 basic_block bb
= BLOCK_FOR_INSN (insn
);
517 if (src_no
< FIRST_PSEUDO_REGISTER
518 || dst_no
< FIRST_PSEUDO_REGISTER
519 || ! find_reg_note (insn
, REG_DEAD
, src_reg
)
520 || REG_N_DEATHS (src_no
) != 1
521 || REG_N_SETS (src_no
) != 1)
524 for (p
= PREV_INSN (insn
); p
&& ! reg_set_p (src_reg
, p
); p
= PREV_INSN (p
))
525 if (INSN_P (p
) && BLOCK_FOR_INSN (p
) != bb
)
528 if (! p
|| BLOCK_FOR_INSN (p
) != bb
)
531 if (! (set
= single_set (p
))
532 || !MEM_P (SET_SRC (set
))
533 /* If there's a REG_EQUIV note, this must be an insn that loads an
534 argument. Prefer keeping the note over doing this optimization. */
535 || find_reg_note (p
, REG_EQUIV
, NULL_RTX
)
536 || SET_DEST (set
) != src_reg
)
539 /* Be conservative: although this optimization is also valid for
540 volatile memory references, that could cause trouble in later passes. */
541 if (MEM_VOLATILE_P (SET_SRC (set
)))
544 /* Do not use a SUBREG to truncate from one mode to another if truncation
546 if (GET_MODE_BITSIZE (GET_MODE (src_reg
)) <= GET_MODE_BITSIZE (GET_MODE (src
))
547 && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (src
)),
548 GET_MODE_BITSIZE (GET_MODE (src_reg
))))
551 old_mode
= GET_MODE (src_reg
);
552 PUT_MODE (src_reg
, GET_MODE (src
));
553 XEXP (src
, 0) = SET_SRC (set
);
555 /* Include this change in the group so that it's easily undone if
556 one of the changes in the group is invalid. */
557 validate_change (p
, &SET_SRC (set
), src
, 1);
559 /* Now walk forward making additional replacements. We want to be able
560 to undo all the changes if a later substitution fails. */
561 while (p
= NEXT_INSN (p
), p
!= insn
)
566 /* Make a tentative change. */
567 validate_replace_rtx_group (src_reg
,
568 gen_lowpart_SUBREG (old_mode
, src_reg
),
572 validate_replace_rtx_group (src
, src_reg
, insn
);
574 /* Now see if all the changes are valid. */
575 if (! apply_change_group ())
577 /* One or more changes were no good. Back out everything. */
578 PUT_MODE (src_reg
, old_mode
);
579 XEXP (src
, 0) = src_reg
;
583 rtx note
= find_reg_note (p
, REG_EQUAL
, NULL_RTX
);
585 remove_note (p
, note
);
590 /* If we were not able to update the users of src to use dest directly, try
591 instead moving the value to dest directly before the operation. */
594 copy_src_to_dest (rtx insn
, rtx src
, rtx dest
)
608 /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant
609 or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is
610 parameter when there is no frame pointer that is not allocated a register.
611 For now, we just reject them, rather than incrementing the live length. */
614 && REG_LIVE_LENGTH (REGNO (src
)) > 0
616 && REG_LIVE_LENGTH (REGNO (dest
)) > 0
617 && (set
= single_set (insn
)) != NULL_RTX
618 && !reg_mentioned_p (dest
, SET_SRC (set
))
619 && GET_MODE (src
) == GET_MODE (dest
))
621 int old_num_regs
= reg_rtx_no
;
623 /* Generate the src->dest move. */
625 emit_move_insn (dest
, src
);
628 /* If this sequence uses new registers, we may not use it. */
629 if (old_num_regs
!= reg_rtx_no
630 || ! validate_replace_rtx (src
, dest
, insn
))
632 /* We have to restore reg_rtx_no to its old value, lest
633 recompute_reg_usage will try to compute the usage of the
634 new regs, yet reg_n_info is not valid for them. */
635 reg_rtx_no
= old_num_regs
;
638 emit_insn_before (seq
, insn
);
639 move_insn
= PREV_INSN (insn
);
640 p_move_notes
= ®_NOTES (move_insn
);
641 p_insn_notes
= ®_NOTES (insn
);
643 /* Move any notes mentioning src to the move instruction. */
644 for (link
= REG_NOTES (insn
); link
!= NULL_RTX
; link
= next
)
646 next
= XEXP (link
, 1);
647 if (XEXP (link
, 0) == src
)
649 *p_move_notes
= link
;
650 p_move_notes
= &XEXP (link
, 1);
654 *p_insn_notes
= link
;
655 p_insn_notes
= &XEXP (link
, 1);
659 *p_move_notes
= NULL_RTX
;
660 *p_insn_notes
= NULL_RTX
;
662 insn_uid
= INSN_UID (insn
);
663 move_uid
= INSN_UID (move_insn
);
665 /* Update the various register tables. */
666 dest_regno
= REGNO (dest
);
667 INC_REG_N_SETS (dest_regno
, 1);
668 REG_LIVE_LENGTH (dest_regno
)++;
669 src_regno
= REGNO (src
);
670 if (! find_reg_note (move_insn
, REG_DEAD
, src
))
671 REG_LIVE_LENGTH (src_regno
)++;
675 /* reg_set_in_bb[REGNO] points to basic block iff the register is set
676 only once in the given block and has REG_EQUAL note. */
678 static basic_block
*reg_set_in_bb
;
680 /* Size of reg_set_in_bb array. */
681 static unsigned int max_reg_computed
;
684 /* Return whether REG is set in only one location, and is set to a
685 constant, but is set in a different basic block from INSN (an
686 instructions which uses REG). In this case REG is equivalent to a
687 constant, and we don't want to break that equivalence, because that
688 may increase register pressure and make reload harder. If REG is
689 set in the same basic block as INSN, we don't worry about it,
690 because we'll probably need a register anyhow (??? but what if REG
691 is used in a different basic block as well as this one?). */
694 reg_is_remote_constant_p (rtx reg
, rtx insn
)
702 max_reg_computed
= max
= max_reg_num ();
703 reg_set_in_bb
= XCNEWVEC (basic_block
, max
);
713 /* This is the instruction which sets REG. If there is a
714 REG_EQUAL note, then REG is equivalent to a constant. */
716 && REG_P (SET_DEST (s
))
717 && REG_N_SETS (REGNO (SET_DEST (s
))) == 1
718 && find_reg_note (p
, REG_EQUAL
, NULL_RTX
))
719 reg_set_in_bb
[REGNO (SET_DEST (s
))] = bb
;
723 gcc_assert (REGNO (reg
) < max_reg_computed
);
724 if (reg_set_in_bb
[REGNO (reg
)] == NULL
)
726 return (reg_set_in_bb
[REGNO (reg
)] != BLOCK_FOR_INSN (insn
));
729 /* INSN is adding a CONST_INT to a REG. We search backwards looking for
730 another add immediate instruction with the same source and dest registers,
731 and if we find one, we change INSN to an increment, and return 1. If
732 no changes are made, we return 0.
735 (set (reg100) (plus reg1 offset1))
737 (set (reg100) (plus reg1 offset2))
739 (set (reg100) (plus reg1 offset1))
741 (set (reg100) (plus reg100 offset2-offset1)) */
743 /* ??? What does this comment mean? */
744 /* cse disrupts preincrement / postdecrement sequences when it finds a
745 hard register as ultimate source, like the frame pointer. */
748 fixup_match_2 (rtx insn
, rtx dst
, rtx src
, rtx offset
)
750 rtx p
, dst_death
= 0;
751 int length
, num_calls
= 0, freq_calls
= 0;
752 basic_block bb
= BLOCK_FOR_INSN (insn
);
754 /* If SRC dies in INSN, we'd have to move the death note. This is
755 considered to be very unlikely, so we just skip the optimization
757 if (find_regno_note (insn
, REG_DEAD
, REGNO (src
)))
760 /* Scan backward to find the first instruction that sets DST. */
762 for (length
= 0, p
= PREV_INSN (insn
); p
; p
= PREV_INSN (p
))
768 if (BLOCK_FOR_INSN (p
) != bb
)
771 if (find_regno_note (p
, REG_DEAD
, REGNO (dst
)))
773 if (! dst_death
&& !DEBUG_INSN_P (p
))
776 pset
= single_set (p
);
777 if (pset
&& SET_DEST (pset
) == dst
778 && GET_CODE (SET_SRC (pset
)) == PLUS
779 && XEXP (SET_SRC (pset
), 0) == src
780 && CONST_INT_P (XEXP (SET_SRC (pset
), 1)))
782 HOST_WIDE_INT newconst
783 = INTVAL (offset
) - INTVAL (XEXP (SET_SRC (pset
), 1));
784 rtx add
= gen_add3_insn (dst
, dst
, GEN_INT (newconst
));
786 if (add
&& validate_change (insn
, &PATTERN (insn
), add
, 0))
788 /* Remove the death note for DST from DST_DEATH. */
791 remove_death (REGNO (dst
), dst_death
);
792 REG_LIVE_LENGTH (REGNO (dst
)) += length
;
793 REG_N_CALLS_CROSSED (REGNO (dst
)) += num_calls
;
794 REG_FREQ_CALLS_CROSSED (REGNO (dst
)) += freq_calls
;
799 "Fixed operand of insn %d.\n",
803 for (p
= PREV_INSN (insn
); p
; p
= PREV_INSN (p
))
807 if (BLOCK_FOR_INSN (p
) != bb
)
809 if (reg_overlap_mentioned_p (dst
, PATTERN (p
)))
811 if (try_auto_increment (p
, insn
, 0, dst
, newconst
, 0))
816 for (p
= NEXT_INSN (insn
); p
; p
= NEXT_INSN (p
))
820 if (BLOCK_FOR_INSN (p
) != bb
)
822 if (reg_overlap_mentioned_p (dst
, PATTERN (p
)))
824 try_auto_increment (p
, insn
, 0, dst
, newconst
, 1);
833 if (reg_set_p (dst
, PATTERN (p
)))
836 /* If we have passed a call instruction, and the
837 pseudo-reg SRC is not already live across a call,
838 then don't perform the optimization. */
839 /* reg_set_p is overly conservative for CALL_INSNS, thinks that all
840 hard regs are clobbered. Thus, we only use it for src for
847 freq_calls
+= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (p
));
850 if (REG_N_CALLS_CROSSED (REGNO (src
)) == 0)
853 if (call_used_regs
[REGNO (dst
)]
854 || find_reg_fusage (p
, CLOBBER
, dst
))
857 else if (reg_set_p (src
, PATTERN (p
)))
864 /* A forward pass. Replace output operands with input operands. */
867 regmove_forward_pass (void)
872 if (! flag_expensive_optimizations
)
876 fprintf (dump_file
, "Starting forward pass...\n");
880 FOR_BB_INSNS (bb
, insn
)
882 rtx set
= single_set (insn
);
886 if ((GET_CODE (SET_SRC (set
)) == SIGN_EXTEND
887 || GET_CODE (SET_SRC (set
)) == ZERO_EXTEND
)
888 && REG_P (XEXP (SET_SRC (set
), 0))
889 && REG_P (SET_DEST (set
)))
890 optimize_reg_copy_3 (insn
, SET_DEST (set
), SET_SRC (set
));
892 if (REG_P (SET_SRC (set
))
893 && REG_P (SET_DEST (set
)))
895 /* If this is a register-register copy where SRC is not dead,
896 see if we can optimize it. If this optimization succeeds,
897 it will become a copy where SRC is dead. */
898 if ((find_reg_note (insn
, REG_DEAD
, SET_SRC (set
))
899 || optimize_reg_copy_1 (insn
, SET_DEST (set
), SET_SRC (set
)))
900 && REGNO (SET_DEST (set
)) >= FIRST_PSEUDO_REGISTER
)
902 /* Similarly for a pseudo-pseudo copy when SRC is dead. */
903 if (REGNO (SET_SRC (set
)) >= FIRST_PSEUDO_REGISTER
)
904 optimize_reg_copy_2 (insn
, SET_DEST (set
), SET_SRC (set
));
905 if (regno_src_regno
[REGNO (SET_DEST (set
))] < 0
906 && SET_SRC (set
) != SET_DEST (set
))
908 int srcregno
= REGNO (SET_SRC (set
));
909 if (regno_src_regno
[srcregno
] >= 0)
910 srcregno
= regno_src_regno
[srcregno
];
911 regno_src_regno
[REGNO (SET_DEST (set
))] = srcregno
;
919 /* A backward pass. Replace input operands with output operands. */
922 regmove_backward_pass (void)
928 fprintf (dump_file
, "Starting backward pass...\n");
930 FOR_EACH_BB_REVERSE (bb
)
932 /* ??? Use the safe iterator because fixup_match_2 can remove
933 insns via try_auto_increment. */
934 FOR_BB_INSNS_REVERSE_SAFE (bb
, insn
, prev
)
937 rtx copy_src
, copy_dst
;
944 if (! find_matches (insn
, &match
))
947 /* Now scan through the operands looking for a destination operand
948 which is supposed to match a source operand.
949 Then scan backward for an instruction which sets the source
950 operand. If safe, then replace the source operand with the
951 dest operand in both instructions. */
955 for (op_no
= 0; op_no
< recog_data
.n_operands
; op_no
++)
957 rtx set
, p
, src
, dst
;
958 rtx src_note
, dst_note
;
959 int num_calls
= 0, freq_calls
= 0;
960 enum reg_class src_class
, dst_class
;
963 match_no
= match
.with
[op_no
];
965 /* Nothing to do if the two operands aren't supposed to match. */
969 dst
= recog_data
.operand
[match_no
];
970 src
= recog_data
.operand
[op_no
];
976 || REGNO (dst
) < FIRST_PSEUDO_REGISTER
977 || REG_LIVE_LENGTH (REGNO (dst
)) < 0
978 || GET_MODE (src
) != GET_MODE (dst
))
981 /* If the operands already match, then there is nothing to do. */
982 if (operands_match_p (src
, dst
))
985 if (match
.commutative
[op_no
] >= 0)
987 rtx comm
= recog_data
.operand
[match
.commutative
[op_no
]];
988 if (operands_match_p (comm
, dst
))
992 set
= single_set (insn
);
996 /* Note that single_set ignores parts of a parallel set for
997 which one of the destinations is REG_UNUSED. We can't
998 handle that here, since we can wind up rewriting things
999 such that a single register is set twice within a single
1001 if (reg_set_p (src
, insn
))
1004 /* match_no/dst must be a write-only operand, and
1005 operand_operand/src must be a read-only operand. */
1006 if (match
.use
[op_no
] != READ
1007 || match
.use
[match_no
] != WRITE
)
1010 if (match
.early_clobber
[match_no
]
1011 && count_occurrences (PATTERN (insn
), src
, 0) > 1)
1014 /* Make sure match_no is the destination. */
1015 if (recog_data
.operand
[match_no
] != SET_DEST (set
))
1018 if (REGNO (src
) < FIRST_PSEUDO_REGISTER
)
1020 if (GET_CODE (SET_SRC (set
)) == PLUS
1021 && CONST_INT_P (XEXP (SET_SRC (set
), 1))
1022 && XEXP (SET_SRC (set
), 0) == src
1023 && fixup_match_2 (insn
, dst
, src
,
1024 XEXP (SET_SRC (set
), 1)))
1028 src_class
= reg_preferred_class (REGNO (src
));
1029 dst_class
= reg_preferred_class (REGNO (dst
));
1031 if (! (src_note
= find_reg_note (insn
, REG_DEAD
, src
)))
1033 /* We used to force the copy here like in other cases, but
1034 it produces worse code, as it eliminates no copy
1035 instructions and the copy emitted will be produced by
1036 reload anyway. On patterns with multiple alternatives,
1037 there may be better solution available.
1039 In particular this change produced slower code for numeric
1045 if (! regclass_compatible_p (src_class
, dst_class
))
1055 /* Can not modify an earlier insn to set dst if this insn
1056 uses an old value in the source. */
1057 if (reg_overlap_mentioned_p (dst
, SET_SRC (set
)))
1067 /* If src is set once in a different basic block,
1068 and is set equal to a constant, then do not use
1069 it for this optimization, as this would make it
1070 no longer equivalent to a constant. */
1072 if (reg_is_remote_constant_p (src
, insn
))
1085 "Could fix operand %d of insn %d matching operand %d.\n",
1086 op_no
, INSN_UID (insn
), match_no
);
1088 /* Scan backward to find the first instruction that uses
1089 the input operand. If the operand is set here, then
1090 replace it in both instructions with match_no. */
1092 for (length
= 0, p
= PREV_INSN (insn
); p
; p
= PREV_INSN (p
))
1098 if (BLOCK_FOR_INSN (p
) != bb
)
1101 if (!DEBUG_INSN_P (p
))
1104 /* ??? See if all of SRC is set in P. This test is much
1105 more conservative than it needs to be. */
1106 pset
= single_set (p
);
1107 if (pset
&& SET_DEST (pset
) == src
)
1109 /* We use validate_replace_rtx, in case there
1110 are multiple identical source operands. All
1111 of them have to be changed at the same time:
1112 when validate_replace_rtx() calls
1113 apply_change_group(). */
1114 validate_change (p
, &SET_DEST (pset
), dst
, 1);
1115 if (validate_replace_rtx (src
, dst
, insn
))
1120 /* We can't make this change if SRC is read or
1121 partially written in P, since we are going to
1122 eliminate SRC. We can't make this change
1123 if DST is mentioned at all in P,
1124 since we are going to change its value. */
1125 if (reg_overlap_mentioned_p (src
, PATTERN (p
)))
1127 if (DEBUG_INSN_P (p
))
1128 validate_replace_rtx_group (dst
, src
, insn
);
1132 if (reg_mentioned_p (dst
, PATTERN (p
)))
1134 if (DEBUG_INSN_P (p
))
1135 validate_change (p
, &INSN_VAR_LOCATION_LOC (p
),
1136 gen_rtx_UNKNOWN_VAR_LOC (), 1);
1141 /* If we have passed a call instruction, and the
1142 pseudo-reg DST is not already live across a call,
1143 then don't perform the optimization. */
1147 freq_calls
+= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (p
));
1149 if (REG_N_CALLS_CROSSED (REGNO (dst
)) == 0)
1158 /* Remove the death note for SRC from INSN. */
1159 remove_note (insn
, src_note
);
1160 /* Move the death note for SRC to P if it is used
1162 if (reg_overlap_mentioned_p (src
, PATTERN (p
)))
1164 XEXP (src_note
, 1) = REG_NOTES (p
);
1165 REG_NOTES (p
) = src_note
;
1167 /* If there is a REG_DEAD note for DST on P, then remove
1168 it, because DST is now set there. */
1169 if ((dst_note
= find_reg_note (p
, REG_DEAD
, dst
)))
1170 remove_note (p
, dst_note
);
1172 dstno
= REGNO (dst
);
1173 srcno
= REGNO (src
);
1175 INC_REG_N_SETS (dstno
, 1);
1176 INC_REG_N_SETS (srcno
, -1);
1178 REG_N_CALLS_CROSSED (dstno
) += num_calls
;
1179 REG_N_CALLS_CROSSED (srcno
) -= num_calls
;
1180 REG_FREQ_CALLS_CROSSED (dstno
) += freq_calls
;
1181 REG_FREQ_CALLS_CROSSED (srcno
) -= freq_calls
;
1183 REG_LIVE_LENGTH (dstno
) += length
;
1184 if (REG_LIVE_LENGTH (srcno
) >= 0)
1186 REG_LIVE_LENGTH (srcno
) -= length
;
1187 /* REG_LIVE_LENGTH is only an approximation after
1188 combine if sched is not run, so make sure that we
1189 still have a reasonable value. */
1190 if (REG_LIVE_LENGTH (srcno
) < 2)
1191 REG_LIVE_LENGTH (srcno
) = 2;
1196 "Fixed operand %d of insn %d matching operand %d.\n",
1197 op_no
, INSN_UID (insn
), match_no
);
1201 else if (num_changes_pending () > 0)
1205 /* If we weren't able to replace any of the alternatives, try an
1206 alternative approach of copying the source to the destination. */
1207 if (!success
&& copy_src
!= NULL_RTX
)
1208 copy_src_to_dest (insn
, copy_src
, copy_dst
);
1213 /* Main entry for the register move optimization. */
1216 regmove_optimize (void)
1219 int nregs
= max_reg_num ();
1221 df_note_add_problem ();
1224 regstat_init_n_sets_and_refs ();
1225 regstat_compute_ri ();
1227 regno_src_regno
= XNEWVEC (int, nregs
);
1228 for (i
= nregs
; --i
>= 0; )
1229 regno_src_regno
[i
] = -1;
1231 /* A forward pass. Replace output operands with input operands. */
1232 regmove_forward_pass ();
1234 /* A backward pass. Replace input operands with output operands. */
1235 regmove_backward_pass ();
1238 free (regno_src_regno
);
1241 free (reg_set_in_bb
);
1242 reg_set_in_bb
= NULL
;
1244 regstat_free_n_sets_and_refs ();
1249 /* Returns nonzero if INSN's pattern has matching constraints for any operand.
1250 Returns 0 if INSN can't be recognized, or if the alternative can't be
1253 Initialize the info in MATCHP based on the constraints. */
1256 find_matches (rtx insn
, struct match
*matchp
)
1258 int likely_spilled
[MAX_RECOG_OPERANDS
];
1260 int any_matches
= 0;
1262 extract_insn (insn
);
1263 if (! constrain_operands (0))
1266 /* Must initialize this before main loop, because the code for
1267 the commutative case may set matches for operands other than
1269 for (op_no
= recog_data
.n_operands
; --op_no
>= 0; )
1270 matchp
->with
[op_no
] = matchp
->commutative
[op_no
] = -1;
1272 for (op_no
= 0; op_no
< recog_data
.n_operands
; op_no
++)
1278 p
= recog_data
.constraints
[op_no
];
1280 likely_spilled
[op_no
] = 0;
1281 matchp
->use
[op_no
] = READ
;
1282 matchp
->early_clobber
[op_no
] = 0;
1284 matchp
->use
[op_no
] = WRITE
;
1286 matchp
->use
[op_no
] = READWRITE
;
1288 for (;*p
&& i
< which_alternative
; p
++)
1292 while ((c
= *p
) != '\0' && c
!= ',')
1301 matchp
->early_clobber
[op_no
] = 1;
1304 matchp
->commutative
[op_no
] = op_no
+ 1;
1305 matchp
->commutative
[op_no
+ 1] = op_no
;
1308 case '0': case '1': case '2': case '3': case '4':
1309 case '5': case '6': case '7': case '8': case '9':
1312 unsigned long match_ul
= strtoul (p
, &end
, 10);
1313 int match
= match_ul
;
1317 if (match
< op_no
&& likely_spilled
[match
])
1319 matchp
->with
[op_no
] = match
;
1321 if (matchp
->commutative
[op_no
] >= 0)
1322 matchp
->with
[matchp
->commutative
[op_no
]] = match
;
1326 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'h':
1327 case 'j': case 'k': case 'l': case 'p': case 'q': case 't': case 'u':
1328 case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B':
1329 case 'C': case 'D': case 'W': case 'Y': case 'Z':
1330 if (CLASS_LIKELY_SPILLED_P (REG_CLASS_FROM_CONSTRAINT ((unsigned char) c
, p
) ))
1331 likely_spilled
[op_no
] = 1;
1334 p
+= CONSTRAINT_LEN (c
, p
);
1343 gate_handle_regmove (void)
1345 return (optimize
> 0 && flag_regmove
);
1349 struct rtl_opt_pass pass_regmove
=
1353 "regmove", /* name */
1354 gate_handle_regmove
, /* gate */
1355 regmove_optimize
, /* execute */
1358 0, /* static_pass_number */
1359 TV_REGMOVE
, /* tv_id */
1360 0, /* properties_required */
1361 0, /* properties_provided */
1362 0, /* properties_destroyed */
1363 0, /* todo_flags_start */
1364 TODO_df_finish
| TODO_verify_rtl_sharing
|
1366 TODO_ggc_collect
/* todo_flags_finish */