1 /* Move registers around to reduce number of move instructions needed.
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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"
32 #include "insn-config.h"
36 #include "hard-reg-set.h"
40 #include "basic-block.h"
42 #include "diagnostic-core.h"
45 #include "tree-pass.h"
49 static int optimize_reg_copy_1 (rtx
, rtx
, rtx
);
50 static void optimize_reg_copy_2 (rtx
, rtx
, rtx
);
51 static void optimize_reg_copy_3 (rtx
, rtx
, rtx
);
52 static void copy_src_to_dest (rtx
, rtx
, rtx
);
62 int with
[MAX_RECOG_OPERANDS
];
63 enum match_use use
[MAX_RECOG_OPERANDS
];
64 int commutative
[MAX_RECOG_OPERANDS
];
65 int early_clobber
[MAX_RECOG_OPERANDS
];
68 static int find_matches (rtx
, struct match
*);
69 static int fixup_match_2 (rtx
, rtx
, rtx
, rtx
);
71 /* Return nonzero if registers with CLASS1 and CLASS2 can be merged without
72 causing too much register allocation problems. */
74 regclass_compatible_p (reg_class_t class0
, reg_class_t class1
)
76 return (class0
== class1
77 || (reg_class_subset_p (class0
, class1
)
78 && ! targetm
.class_likely_spilled_p (class0
))
79 || (reg_class_subset_p (class1
, class0
)
80 && ! targetm
.class_likely_spilled_p (class1
)));
86 /* Find the place in the rtx X where REG is used as a memory address.
87 Return the MEM rtx that so uses it.
88 If PLUSCONST is nonzero, search instead for a memory address equivalent to
89 (plus REG (const_int PLUSCONST)).
91 If such an address does not appear, return 0.
92 If REG appears more than once, or is used other than in such an address,
96 find_use_as_address (rtx x
, rtx reg
, HOST_WIDE_INT plusconst
)
98 enum rtx_code code
= GET_CODE (x
);
99 const char * const fmt
= GET_RTX_FORMAT (code
);
104 if (code
== MEM
&& XEXP (x
, 0) == reg
&& plusconst
== 0)
107 if (code
== MEM
&& GET_CODE (XEXP (x
, 0)) == PLUS
108 && XEXP (XEXP (x
, 0), 0) == reg
109 && CONST_INT_P (XEXP (XEXP (x
, 0), 1))
110 && INTVAL (XEXP (XEXP (x
, 0), 1)) == plusconst
)
113 if (code
== SIGN_EXTRACT
|| code
== ZERO_EXTRACT
)
115 /* If REG occurs inside a MEM used in a bit-field reference,
116 that is unacceptable. */
117 if (find_use_as_address (XEXP (x
, 0), reg
, 0) != 0)
118 return (rtx
) (size_t) 1;
122 return (rtx
) (size_t) 1;
124 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
128 tem
= find_use_as_address (XEXP (x
, i
), reg
, plusconst
);
132 return (rtx
) (size_t) 1;
134 else if (fmt
[i
] == 'E')
137 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
139 tem
= find_use_as_address (XVECEXP (x
, i
, j
), reg
, plusconst
);
143 return (rtx
) (size_t) 1;
152 /* INC_INSN is an instruction that adds INCREMENT to REG.
153 Try to fold INC_INSN as a post/pre in/decrement into INSN.
154 Iff INC_INSN_SET is nonzero, inc_insn has a destination different from src.
155 Return nonzero for success. */
157 try_auto_increment (rtx insn
, rtx inc_insn
, rtx inc_insn_set
, rtx reg
,
158 HOST_WIDE_INT increment
, int pre
)
160 enum rtx_code inc_code
;
162 rtx pset
= single_set (insn
);
165 /* Can't use the size of SET_SRC, we might have something like
166 (sign_extend:SI (mem:QI ... */
167 rtx use
= find_use_as_address (pset
, reg
, 0);
168 if (use
!= 0 && use
!= (rtx
) (size_t) 1)
170 int size
= GET_MODE_SIZE (GET_MODE (use
));
172 || (HAVE_POST_INCREMENT
173 && pre
== 0 && (inc_code
= POST_INC
, increment
== size
))
174 || (HAVE_PRE_INCREMENT
175 && pre
== 1 && (inc_code
= PRE_INC
, increment
== size
))
176 || (HAVE_POST_DECREMENT
177 && pre
== 0 && (inc_code
= POST_DEC
, increment
== -size
))
178 || (HAVE_PRE_DECREMENT
179 && pre
== 1 && (inc_code
= PRE_DEC
, increment
== -size
))
185 &SET_SRC (inc_insn_set
),
186 XEXP (SET_SRC (inc_insn_set
), 0), 1);
187 validate_change (insn
, &XEXP (use
, 0),
188 gen_rtx_fmt_e (inc_code
,
189 GET_MODE (XEXP (use
, 0)), reg
),
191 if (apply_change_group ())
193 /* If there is a REG_DEAD note on this insn, we must
194 change this not to REG_UNUSED meaning that the register
195 is set, but the value is dead. Failure to do so will
196 result in sched1 dying -- when it recomputes lifetime
197 information, the number of REG_DEAD notes will have
199 rtx note
= find_reg_note (insn
, REG_DEAD
, reg
);
201 PUT_REG_NOTE_KIND (note
, REG_UNUSED
);
203 add_reg_note (insn
, REG_INC
, reg
);
206 delete_insn (inc_insn
);
217 static int *regno_src_regno
;
219 /* INSN is a copy from SRC to DEST, both registers, and SRC does not die
222 Search forward to see if SRC dies before either it or DEST is modified,
223 but don't scan past the end of a basic block. If so, we can replace SRC
224 with DEST and let SRC die in INSN.
226 This will reduce the number of registers live in that range and may enable
227 DEST to be tied to SRC, thus often saving one register in addition to a
228 register-register copy. */
231 optimize_reg_copy_1 (rtx insn
, rtx dest
, rtx src
)
236 int sregno
= REGNO (src
);
237 int dregno
= REGNO (dest
);
238 basic_block bb
= BLOCK_FOR_INSN (insn
);
240 /* We don't want to mess with hard regs if register classes are small. */
242 || (targetm
.small_register_classes_for_mode_p (GET_MODE (src
))
243 && (sregno
< FIRST_PSEUDO_REGISTER
244 || dregno
< FIRST_PSEUDO_REGISTER
))
245 /* We don't see all updates to SP if they are in an auto-inc memory
246 reference, so we must disallow this optimization on them. */
247 || sregno
== STACK_POINTER_REGNUM
|| dregno
== STACK_POINTER_REGNUM
)
250 for (p
= NEXT_INSN (insn
); p
; p
= NEXT_INSN (p
))
254 if (BLOCK_FOR_INSN (p
) != bb
)
257 if (reg_set_p (src
, p
) || reg_set_p (dest
, p
)
258 /* If SRC is an asm-declared register, it must not be replaced
259 in any asm. Unfortunately, the REG_EXPR tree for the asm
260 variable may be absent in the SRC rtx, so we can't check the
261 actual register declaration easily (the asm operand will have
262 it, though). To avoid complicating the test for a rare case,
263 we just don't perform register replacement for a hard reg
264 mentioned in an asm. */
265 || (sregno
< FIRST_PSEUDO_REGISTER
266 && asm_noperands (PATTERN (p
)) >= 0
267 && reg_overlap_mentioned_p (src
, PATTERN (p
)))
268 /* Don't change hard registers used by a call. */
269 || (CALL_P (p
) && sregno
< FIRST_PSEUDO_REGISTER
270 && find_reg_fusage (p
, USE
, src
))
271 /* Don't change a USE of a register. */
272 || (GET_CODE (PATTERN (p
)) == USE
273 && reg_overlap_mentioned_p (src
, XEXP (PATTERN (p
), 0))))
276 /* See if all of SRC dies in P. This test is slightly more
277 conservative than it needs to be. */
278 if ((note
= find_regno_note (p
, REG_DEAD
, sregno
)) != 0
279 && GET_MODE (XEXP (note
, 0)) == GET_MODE (src
))
286 int s_freq_calls
= 0;
287 int d_freq_calls
= 0;
289 /* We can do the optimization. Scan forward from INSN again,
290 replacing regs as we go. Set FAILED if a replacement can't
291 be done. In that case, we can't move the death note for SRC.
292 This should be rare. */
294 /* Set to stop at next insn. */
295 for (q
= next_real_insn (insn
);
296 q
!= next_real_insn (p
);
297 q
= next_real_insn (q
))
299 if (reg_overlap_mentioned_p (src
, PATTERN (q
)))
301 /* If SRC is a hard register, we might miss some
302 overlapping registers with validate_replace_rtx,
303 so we would have to undo it. We can't if DEST is
304 present in the insn, so fail in that combination
306 if (sregno
< FIRST_PSEUDO_REGISTER
307 && reg_mentioned_p (dest
, PATTERN (q
)))
310 /* Attempt to replace all uses. */
311 else if (!validate_replace_rtx (src
, dest
, q
))
314 /* If this succeeded, but some part of the register
315 is still present, undo the replacement. */
316 else if (sregno
< FIRST_PSEUDO_REGISTER
317 && reg_overlap_mentioned_p (src
, PATTERN (q
)))
319 validate_replace_rtx (dest
, src
, q
);
324 /* For SREGNO, count the total number of insns scanned.
325 For DREGNO, count the total number of insns scanned after
326 passing the death note for DREGNO. */
327 if (!DEBUG_INSN_P (p
))
334 /* If the insn in which SRC dies is a CALL_INSN, don't count it
335 as a call that has been crossed. Otherwise, count it. */
336 if (q
!= p
&& CALL_P (q
))
338 /* Similarly, total calls for SREGNO, total calls beyond
339 the death note for DREGNO. */
341 s_freq_calls
+= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (q
));
345 d_freq_calls
+= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (q
));
349 /* If DEST dies here, remove the death note and save it for
350 later. Make sure ALL of DEST dies here; again, this is
351 overly conservative. */
353 && (dest_death
= find_regno_note (q
, REG_DEAD
, dregno
)) != 0)
355 if (GET_MODE (XEXP (dest_death
, 0)) != GET_MODE (dest
))
356 failed
= 1, dest_death
= 0;
358 remove_note (q
, dest_death
);
364 /* These counters need to be updated if and only if we are
365 going to move the REG_DEAD note. */
366 if (sregno
>= FIRST_PSEUDO_REGISTER
)
368 if (REG_LIVE_LENGTH (sregno
) >= 0)
370 REG_LIVE_LENGTH (sregno
) -= s_length
;
371 /* REG_LIVE_LENGTH is only an approximation after
372 combine if sched is not run, so make sure that we
373 still have a reasonable value. */
374 if (REG_LIVE_LENGTH (sregno
) < 2)
375 REG_LIVE_LENGTH (sregno
) = 2;
378 REG_N_CALLS_CROSSED (sregno
) -= s_n_calls
;
379 REG_FREQ_CALLS_CROSSED (sregno
) -= s_freq_calls
;
382 /* Move death note of SRC from P to INSN. */
383 remove_note (p
, note
);
384 XEXP (note
, 1) = REG_NOTES (insn
);
385 REG_NOTES (insn
) = note
;
388 /* DEST is also dead if INSN has a REG_UNUSED note for DEST. */
390 && (dest_death
= find_regno_note (insn
, REG_UNUSED
, dregno
)))
392 PUT_REG_NOTE_KIND (dest_death
, REG_DEAD
);
393 remove_note (insn
, dest_death
);
396 /* Put death note of DEST on P if we saw it die. */
399 XEXP (dest_death
, 1) = REG_NOTES (p
);
400 REG_NOTES (p
) = dest_death
;
402 if (dregno
>= FIRST_PSEUDO_REGISTER
)
404 /* If and only if we are moving the death note for DREGNO,
405 then we need to update its counters. */
406 if (REG_LIVE_LENGTH (dregno
) >= 0)
407 REG_LIVE_LENGTH (dregno
) += d_length
;
408 REG_N_CALLS_CROSSED (dregno
) += d_n_calls
;
409 REG_FREQ_CALLS_CROSSED (dregno
) += d_freq_calls
;
416 /* If SRC is a hard register which is set or killed in some other
417 way, we can't do this optimization. */
418 else if (sregno
< FIRST_PSEUDO_REGISTER
419 && dead_or_set_p (p
, src
))
425 /* INSN is a copy of SRC to DEST, in which SRC dies. See if we now have
426 a sequence of insns that modify DEST followed by an insn that sets
427 SRC to DEST in which DEST dies, with no prior modification of DEST.
428 (There is no need to check if the insns in between actually modify
429 DEST. We should not have cases where DEST is not modified, but
430 the optimization is safe if no such modification is detected.)
431 In that case, we can replace all uses of DEST, starting with INSN and
432 ending with the set of SRC to DEST, with SRC. We do not do this
433 optimization if a CALL_INSN is crossed unless SRC already crosses a
434 call or if DEST dies before the copy back to SRC.
436 It is assumed that DEST and SRC are pseudos; it is too complicated to do
437 this for hard registers since the substitutions we may make might fail. */
440 optimize_reg_copy_2 (rtx insn
, rtx dest
, rtx src
)
444 int sregno
= REGNO (src
);
445 int dregno
= REGNO (dest
);
446 basic_block bb
= BLOCK_FOR_INSN (insn
);
448 for (p
= NEXT_INSN (insn
); p
; p
= NEXT_INSN (p
))
452 if (BLOCK_FOR_INSN (p
) != bb
)
455 set
= single_set (p
);
456 if (set
&& SET_SRC (set
) == dest
&& SET_DEST (set
) == src
457 && find_reg_note (p
, REG_DEAD
, dest
))
459 /* We can do the optimization. Scan forward from INSN again,
460 replacing regs as we go. */
462 /* Set to stop at next insn. */
463 for (q
= insn
; q
!= NEXT_INSN (p
); q
= NEXT_INSN (q
))
466 if (reg_mentioned_p (dest
, PATTERN (q
)))
470 PATTERN (q
) = replace_rtx (PATTERN (q
), dest
, src
);
471 note
= FIND_REG_INC_NOTE (q
, dest
);
474 remove_note (q
, note
);
475 add_reg_note (q
, REG_INC
, src
);
482 int freq
= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (q
));
483 REG_N_CALLS_CROSSED (dregno
)--;
484 REG_N_CALLS_CROSSED (sregno
)++;
485 REG_FREQ_CALLS_CROSSED (dregno
) -= freq
;
486 REG_FREQ_CALLS_CROSSED (sregno
) += freq
;
490 remove_note (p
, find_reg_note (p
, REG_DEAD
, dest
));
491 REG_N_DEATHS (dregno
)--;
492 remove_note (insn
, find_reg_note (insn
, REG_DEAD
, src
));
493 REG_N_DEATHS (sregno
)--;
497 if (reg_set_p (src
, p
)
498 || find_reg_note (p
, REG_DEAD
, dest
)
499 || (CALL_P (p
) && REG_N_CALLS_CROSSED (sregno
) == 0))
504 /* INSN is a ZERO_EXTEND or SIGN_EXTEND of SRC to DEST.
505 Look if SRC dies there, and if it is only set once, by loading
506 it from memory. If so, try to incorporate the zero/sign extension
507 into the memory read, change SRC to the mode of DEST, and alter
508 the remaining accesses to use the appropriate SUBREG. This allows
509 SRC and DEST to be tied later. */
511 optimize_reg_copy_3 (rtx insn
, rtx dest
, rtx src
)
513 rtx src_reg
= XEXP (src
, 0);
514 int src_no
= REGNO (src_reg
);
515 int dst_no
= REGNO (dest
);
516 rtx p
, set
, set_insn
;
517 enum machine_mode old_mode
;
518 basic_block bb
= BLOCK_FOR_INSN (insn
);
520 if (src_no
< FIRST_PSEUDO_REGISTER
521 || dst_no
< FIRST_PSEUDO_REGISTER
522 || ! find_reg_note (insn
, REG_DEAD
, src_reg
)
523 || REG_N_DEATHS (src_no
) != 1
524 || REG_N_SETS (src_no
) != 1)
527 for (p
= PREV_INSN (insn
); p
&& ! reg_set_p (src_reg
, p
); p
= PREV_INSN (p
))
528 if (INSN_P (p
) && BLOCK_FOR_INSN (p
) != bb
)
531 if (! p
|| BLOCK_FOR_INSN (p
) != bb
)
534 if (! (set
= single_set (p
))
535 || !MEM_P (SET_SRC (set
))
536 /* If there's a REG_EQUIV note, this must be an insn that loads an
537 argument. Prefer keeping the note over doing this optimization. */
538 || find_reg_note (p
, REG_EQUIV
, NULL_RTX
)
539 || SET_DEST (set
) != src_reg
)
542 /* Be conservative: although this optimization is also valid for
543 volatile memory references, that could cause trouble in later passes. */
544 if (MEM_VOLATILE_P (SET_SRC (set
)))
547 /* Do not use a SUBREG to truncate from one mode to another if truncation
549 if (GET_MODE_BITSIZE (GET_MODE (src_reg
)) <= GET_MODE_BITSIZE (GET_MODE (src
))
550 && !TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (src
), GET_MODE (src_reg
)))
554 old_mode
= GET_MODE (src_reg
);
555 PUT_MODE (src_reg
, GET_MODE (src
));
556 XEXP (src
, 0) = SET_SRC (set
);
558 /* Include this change in the group so that it's easily undone if
559 one of the changes in the group is invalid. */
560 validate_change (p
, &SET_SRC (set
), src
, 1);
562 /* Now walk forward making additional replacements. We want to be able
563 to undo all the changes if a later substitution fails. */
564 while (p
= NEXT_INSN (p
), p
!= insn
)
569 /* Make a tentative change. */
570 validate_replace_rtx_group (src_reg
,
571 gen_lowpart_SUBREG (old_mode
, src_reg
),
575 validate_replace_rtx_group (src
, src_reg
, insn
);
577 /* Now see if all the changes are valid. */
578 if (! apply_change_group ())
580 /* One or more changes were no good. Back out everything. */
581 PUT_MODE (src_reg
, old_mode
);
582 XEXP (src
, 0) = src_reg
;
586 rtx note
= find_reg_note (set_insn
, REG_EQUAL
, NULL_RTX
);
589 if (rtx_equal_p (XEXP (note
, 0), XEXP (src
, 0)))
592 = gen_rtx_fmt_e (GET_CODE (src
), GET_MODE (src
),
594 df_notes_rescan (set_insn
);
597 remove_note (set_insn
, note
);
603 /* If we were not able to update the users of src to use dest directly, try
604 instead moving the value to dest directly before the operation. */
607 copy_src_to_dest (rtx insn
, rtx src
, rtx dest
)
619 /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant
620 or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is
621 parameter when there is no frame pointer that is not allocated a register.
622 For now, we just reject them, rather than incrementing the live length. */
625 && REG_LIVE_LENGTH (REGNO (src
)) > 0
627 && REG_LIVE_LENGTH (REGNO (dest
)) > 0
628 && (set
= single_set (insn
)) != NULL_RTX
629 && !reg_mentioned_p (dest
, SET_SRC (set
))
630 && GET_MODE (src
) == GET_MODE (dest
))
632 int old_num_regs
= reg_rtx_no
;
634 /* Generate the src->dest move. */
636 emit_move_insn (dest
, src
);
639 /* If this sequence uses new registers, we may not use it. */
640 if (old_num_regs
!= reg_rtx_no
641 || ! validate_replace_rtx (src
, dest
, insn
))
643 /* We have to restore reg_rtx_no to its old value, lest
644 recompute_reg_usage will try to compute the usage of the
645 new regs, yet reg_n_info is not valid for them. */
646 reg_rtx_no
= old_num_regs
;
649 emit_insn_before (seq
, insn
);
650 move_insn
= PREV_INSN (insn
);
651 p_move_notes
= ®_NOTES (move_insn
);
652 p_insn_notes
= ®_NOTES (insn
);
654 /* Move any notes mentioning src to the move instruction. */
655 for (link
= REG_NOTES (insn
); link
!= NULL_RTX
; link
= next
)
657 next
= XEXP (link
, 1);
658 if (XEXP (link
, 0) == src
)
660 *p_move_notes
= link
;
661 p_move_notes
= &XEXP (link
, 1);
665 *p_insn_notes
= link
;
666 p_insn_notes
= &XEXP (link
, 1);
670 *p_move_notes
= NULL_RTX
;
671 *p_insn_notes
= NULL_RTX
;
673 /* Update the various register tables. */
674 dest_regno
= REGNO (dest
);
675 INC_REG_N_SETS (dest_regno
, 1);
676 REG_LIVE_LENGTH (dest_regno
)++;
677 src_regno
= REGNO (src
);
678 if (! find_reg_note (move_insn
, REG_DEAD
, src
))
679 REG_LIVE_LENGTH (src_regno
)++;
683 /* reg_set_in_bb[REGNO] points to basic block iff the register is set
684 only once in the given block and has REG_EQUAL note. */
686 static basic_block
*reg_set_in_bb
;
688 /* Size of reg_set_in_bb array. */
689 static unsigned int max_reg_computed
;
692 /* Return whether REG is set in only one location, and is set to a
693 constant, but is set in a different basic block from INSN (an
694 instructions which uses REG). In this case REG is equivalent to a
695 constant, and we don't want to break that equivalence, because that
696 may increase register pressure and make reload harder. If REG is
697 set in the same basic block as INSN, we don't worry about it,
698 because we'll probably need a register anyhow (??? but what if REG
699 is used in a different basic block as well as this one?). */
702 reg_is_remote_constant_p (rtx reg
, rtx insn
)
710 max_reg_computed
= max
= max_reg_num ();
711 reg_set_in_bb
= XCNEWVEC (basic_block
, max
);
721 /* This is the instruction which sets REG. If there is a
722 REG_EQUAL note, then REG is equivalent to a constant. */
724 && REG_P (SET_DEST (s
))
725 && REG_N_SETS (REGNO (SET_DEST (s
))) == 1
726 && find_reg_note (p
, REG_EQUAL
, NULL_RTX
))
727 reg_set_in_bb
[REGNO (SET_DEST (s
))] = bb
;
731 gcc_assert (REGNO (reg
) < max_reg_computed
);
732 if (reg_set_in_bb
[REGNO (reg
)] == NULL
)
734 return (reg_set_in_bb
[REGNO (reg
)] != BLOCK_FOR_INSN (insn
));
737 /* INSN is adding a CONST_INT to a REG. We search backwards looking for
738 another add immediate instruction with the same source and dest registers,
739 and if we find one, we change INSN to an increment, and return 1. If
740 no changes are made, we return 0.
743 (set (reg100) (plus reg1 offset1))
745 (set (reg100) (plus reg1 offset2))
747 (set (reg100) (plus reg1 offset1))
749 (set (reg100) (plus reg100 offset2-offset1)) */
751 /* ??? What does this comment mean? */
752 /* cse disrupts preincrement / postdecrement sequences when it finds a
753 hard register as ultimate source, like the frame pointer. */
756 fixup_match_2 (rtx insn
, rtx dst
, rtx src
, rtx offset
)
758 rtx p
, dst_death
= 0;
759 int length
, num_calls
= 0, freq_calls
= 0;
760 basic_block bb
= BLOCK_FOR_INSN (insn
);
762 /* If SRC dies in INSN, we'd have to move the death note. This is
763 considered to be very unlikely, so we just skip the optimization
765 if (find_regno_note (insn
, REG_DEAD
, REGNO (src
)))
768 /* Scan backward to find the first instruction that sets DST. */
770 for (length
= 0, p
= PREV_INSN (insn
); p
; p
= PREV_INSN (p
))
776 if (BLOCK_FOR_INSN (p
) != bb
)
779 if (find_regno_note (p
, REG_DEAD
, REGNO (dst
)))
781 if (! dst_death
&& !DEBUG_INSN_P (p
))
784 pset
= single_set (p
);
785 if (pset
&& SET_DEST (pset
) == dst
786 && GET_CODE (SET_SRC (pset
)) == PLUS
787 && XEXP (SET_SRC (pset
), 0) == src
788 && CONST_INT_P (XEXP (SET_SRC (pset
), 1)))
790 HOST_WIDE_INT newconst
791 = INTVAL (offset
) - INTVAL (XEXP (SET_SRC (pset
), 1));
792 rtx add
= gen_add3_insn (dst
, dst
, GEN_INT (newconst
));
794 if (add
&& validate_change (insn
, &PATTERN (insn
), add
, 0))
796 /* Remove the death note for DST from DST_DEATH. */
799 remove_death (REGNO (dst
), dst_death
);
800 REG_LIVE_LENGTH (REGNO (dst
)) += length
;
801 REG_N_CALLS_CROSSED (REGNO (dst
)) += num_calls
;
802 REG_FREQ_CALLS_CROSSED (REGNO (dst
)) += freq_calls
;
807 "Fixed operand of insn %d.\n",
811 for (p
= PREV_INSN (insn
); p
; p
= PREV_INSN (p
))
815 if (BLOCK_FOR_INSN (p
) != bb
)
817 if (reg_overlap_mentioned_p (dst
, PATTERN (p
)))
819 if (try_auto_increment (p
, insn
, 0, dst
, newconst
, 0))
824 for (p
= NEXT_INSN (insn
); p
; p
= NEXT_INSN (p
))
828 if (BLOCK_FOR_INSN (p
) != bb
)
830 if (reg_overlap_mentioned_p (dst
, PATTERN (p
)))
832 try_auto_increment (p
, insn
, 0, dst
, newconst
, 1);
841 if (reg_set_p (dst
, PATTERN (p
)))
844 /* If we have passed a call instruction, and the
845 pseudo-reg SRC is not already live across a call,
846 then don't perform the optimization. */
847 /* reg_set_p is overly conservative for CALL_INSNS, thinks that all
848 hard regs are clobbered. Thus, we only use it for src for
855 freq_calls
+= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (p
));
858 if (REG_N_CALLS_CROSSED (REGNO (src
)) == 0)
861 if ((HARD_REGISTER_P (dst
) && call_used_regs
[REGNO (dst
)])
862 || find_reg_fusage (p
, CLOBBER
, dst
))
865 else if (reg_set_p (src
, PATTERN (p
)))
872 /* A forward pass. Replace output operands with input operands. */
875 regmove_forward_pass (void)
880 if (! flag_expensive_optimizations
)
884 fprintf (dump_file
, "Starting forward pass...\n");
888 FOR_BB_INSNS (bb
, insn
)
890 rtx set
= single_set (insn
);
894 if ((GET_CODE (SET_SRC (set
)) == SIGN_EXTEND
895 || GET_CODE (SET_SRC (set
)) == ZERO_EXTEND
)
896 && REG_P (XEXP (SET_SRC (set
), 0))
897 && REG_P (SET_DEST (set
)))
898 optimize_reg_copy_3 (insn
, SET_DEST (set
), SET_SRC (set
));
900 if (REG_P (SET_SRC (set
))
901 && REG_P (SET_DEST (set
)))
903 /* If this is a register-register copy where SRC is not dead,
904 see if we can optimize it. If this optimization succeeds,
905 it will become a copy where SRC is dead. */
906 if ((find_reg_note (insn
, REG_DEAD
, SET_SRC (set
))
907 || optimize_reg_copy_1 (insn
, SET_DEST (set
), SET_SRC (set
)))
908 && REGNO (SET_DEST (set
)) >= FIRST_PSEUDO_REGISTER
)
910 /* Similarly for a pseudo-pseudo copy when SRC is dead. */
911 if (REGNO (SET_SRC (set
)) >= FIRST_PSEUDO_REGISTER
)
912 optimize_reg_copy_2 (insn
, SET_DEST (set
), SET_SRC (set
));
913 if (regno_src_regno
[REGNO (SET_DEST (set
))] < 0
914 && SET_SRC (set
) != SET_DEST (set
))
916 int srcregno
= REGNO (SET_SRC (set
));
917 if (regno_src_regno
[srcregno
] >= 0)
918 srcregno
= regno_src_regno
[srcregno
];
919 regno_src_regno
[REGNO (SET_DEST (set
))] = srcregno
;
927 /* A backward pass. Replace input operands with output operands. */
930 regmove_backward_pass (void)
936 fprintf (dump_file
, "Starting backward pass...\n");
938 FOR_EACH_BB_REVERSE (bb
)
940 /* ??? Use the safe iterator because fixup_match_2 can remove
941 insns via try_auto_increment. */
942 FOR_BB_INSNS_REVERSE_SAFE (bb
, insn
, prev
)
945 rtx copy_src
, copy_dst
;
952 if (! find_matches (insn
, &match
))
955 /* Now scan through the operands looking for a destination operand
956 which is supposed to match a source operand.
957 Then scan backward for an instruction which sets the source
958 operand. If safe, then replace the source operand with the
959 dest operand in both instructions. */
963 for (op_no
= 0; op_no
< recog_data
.n_operands
; op_no
++)
965 rtx set
, p
, src
, dst
;
966 rtx src_note
, dst_note
;
967 int num_calls
= 0, freq_calls
= 0;
968 enum reg_class src_class
, dst_class
;
971 match_no
= match
.with
[op_no
];
973 /* Nothing to do if the two operands aren't supposed to match. */
977 dst
= recog_data
.operand
[match_no
];
978 src
= recog_data
.operand
[op_no
];
984 || REGNO (dst
) < FIRST_PSEUDO_REGISTER
985 || REG_LIVE_LENGTH (REGNO (dst
)) < 0
986 || GET_MODE (src
) != GET_MODE (dst
))
989 /* If the operands already match, then there is nothing to do. */
990 if (operands_match_p (src
, dst
))
993 if (match
.commutative
[op_no
] >= 0)
995 rtx comm
= recog_data
.operand
[match
.commutative
[op_no
]];
996 if (operands_match_p (comm
, dst
))
1000 set
= single_set (insn
);
1004 /* Note that single_set ignores parts of a parallel set for
1005 which one of the destinations is REG_UNUSED. We can't
1006 handle that here, since we can wind up rewriting things
1007 such that a single register is set twice within a single
1009 if (reg_set_p (src
, insn
))
1012 /* match_no/dst must be a write-only operand, and
1013 operand_operand/src must be a read-only operand. */
1014 if (match
.use
[op_no
] != READ
1015 || match
.use
[match_no
] != WRITE
)
1018 if (match
.early_clobber
[match_no
]
1019 && count_occurrences (PATTERN (insn
), src
, 0) > 1)
1022 /* Make sure match_no is the destination. */
1023 if (recog_data
.operand
[match_no
] != SET_DEST (set
))
1026 if (REGNO (src
) < FIRST_PSEUDO_REGISTER
)
1028 if (GET_CODE (SET_SRC (set
)) == PLUS
1029 && CONST_INT_P (XEXP (SET_SRC (set
), 1))
1030 && XEXP (SET_SRC (set
), 0) == src
1031 && fixup_match_2 (insn
, dst
, src
,
1032 XEXP (SET_SRC (set
), 1)))
1036 src_class
= reg_preferred_class (REGNO (src
));
1037 dst_class
= reg_preferred_class (REGNO (dst
));
1039 if (! (src_note
= find_reg_note (insn
, REG_DEAD
, src
)))
1041 /* We used to force the copy here like in other cases, but
1042 it produces worse code, as it eliminates no copy
1043 instructions and the copy emitted will be produced by
1044 reload anyway. On patterns with multiple alternatives,
1045 there may be better solution available.
1047 In particular this change produced slower code for numeric
1053 if (! regclass_compatible_p (src_class
, dst_class
))
1063 /* Can not modify an earlier insn to set dst if this insn
1064 uses an old value in the source. */
1065 if (reg_overlap_mentioned_p (dst
, SET_SRC (set
)))
1075 /* If src is set once in a different basic block,
1076 and is set equal to a constant, then do not use
1077 it for this optimization, as this would make it
1078 no longer equivalent to a constant. */
1080 if (reg_is_remote_constant_p (src
, insn
))
1093 "Could fix operand %d of insn %d matching operand %d.\n",
1094 op_no
, INSN_UID (insn
), match_no
);
1096 /* Scan backward to find the first instruction that uses
1097 the input operand. If the operand is set here, then
1098 replace it in both instructions with match_no. */
1100 for (length
= 0, p
= PREV_INSN (insn
); p
; p
= PREV_INSN (p
))
1106 if (BLOCK_FOR_INSN (p
) != bb
)
1109 if (!DEBUG_INSN_P (p
))
1112 /* ??? See if all of SRC is set in P. This test is much
1113 more conservative than it needs to be. */
1114 pset
= single_set (p
);
1115 if (pset
&& SET_DEST (pset
) == src
)
1117 /* We use validate_replace_rtx, in case there
1118 are multiple identical source operands. All
1119 of them have to be changed at the same time:
1120 when validate_replace_rtx() calls
1121 apply_change_group(). */
1122 validate_change (p
, &SET_DEST (pset
), dst
, 1);
1123 if (validate_replace_rtx (src
, dst
, insn
))
1128 /* We can't make this change if DST is mentioned at
1129 all in P, since we are going to change its value.
1130 We can't make this change if SRC is read or
1131 partially written in P, since we are going to
1132 eliminate SRC. However, if it's a debug insn, we
1133 can't refrain from making the change, for this
1134 would cause codegen differences, so instead we
1135 invalidate debug expressions that reference DST,
1136 and adjust references to SRC in them so that they
1137 become references to DST. */
1138 if (reg_mentioned_p (dst
, PATTERN (p
)))
1140 if (DEBUG_INSN_P (p
))
1141 validate_change (p
, &INSN_VAR_LOCATION_LOC (p
),
1142 gen_rtx_UNKNOWN_VAR_LOC (), 1);
1146 if (reg_overlap_mentioned_p (src
, PATTERN (p
)))
1148 if (DEBUG_INSN_P (p
))
1149 validate_replace_rtx_group (src
, dst
, p
);
1154 /* If we have passed a call instruction, and the
1155 pseudo-reg DST is not already live across a call,
1156 then don't perform the optimization. */
1160 freq_calls
+= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (p
));
1162 if (REG_N_CALLS_CROSSED (REGNO (dst
)) == 0)
1171 /* Remove the death note for SRC from INSN. */
1172 remove_note (insn
, src_note
);
1173 /* Move the death note for SRC to P if it is used
1175 if (reg_overlap_mentioned_p (src
, PATTERN (p
)))
1177 XEXP (src_note
, 1) = REG_NOTES (p
);
1178 REG_NOTES (p
) = src_note
;
1180 /* If there is a REG_DEAD note for DST on P, then remove
1181 it, because DST is now set there. */
1182 if ((dst_note
= find_reg_note (p
, REG_DEAD
, dst
)))
1183 remove_note (p
, dst_note
);
1185 dstno
= REGNO (dst
);
1186 srcno
= REGNO (src
);
1188 INC_REG_N_SETS (dstno
, 1);
1189 INC_REG_N_SETS (srcno
, -1);
1191 REG_N_CALLS_CROSSED (dstno
) += num_calls
;
1192 REG_N_CALLS_CROSSED (srcno
) -= num_calls
;
1193 REG_FREQ_CALLS_CROSSED (dstno
) += freq_calls
;
1194 REG_FREQ_CALLS_CROSSED (srcno
) -= freq_calls
;
1196 REG_LIVE_LENGTH (dstno
) += length
;
1197 if (REG_LIVE_LENGTH (srcno
) >= 0)
1199 REG_LIVE_LENGTH (srcno
) -= length
;
1200 /* REG_LIVE_LENGTH is only an approximation after
1201 combine if sched is not run, so make sure that we
1202 still have a reasonable value. */
1203 if (REG_LIVE_LENGTH (srcno
) < 2)
1204 REG_LIVE_LENGTH (srcno
) = 2;
1209 "Fixed operand %d of insn %d matching operand %d.\n",
1210 op_no
, INSN_UID (insn
), match_no
);
1214 else if (num_changes_pending () > 0)
1218 /* If we weren't able to replace any of the alternatives, try an
1219 alternative approach of copying the source to the destination. */
1220 if (!success
&& copy_src
!= NULL_RTX
)
1221 copy_src_to_dest (insn
, copy_src
, copy_dst
);
1226 /* Main entry for the register move optimization. */
1229 regmove_optimize (void)
1232 int nregs
= max_reg_num ();
1234 df_note_add_problem ();
1237 regstat_init_n_sets_and_refs ();
1238 regstat_compute_ri ();
1240 if (flag_ira_loop_pressure
)
1241 ira_set_pseudo_classes (dump_file
);
1243 regno_src_regno
= XNEWVEC (int, nregs
);
1244 for (i
= nregs
; --i
>= 0; )
1245 regno_src_regno
[i
] = -1;
1247 /* A forward pass. Replace output operands with input operands. */
1248 regmove_forward_pass ();
1250 /* A backward pass. Replace input operands with output operands. */
1251 regmove_backward_pass ();
1254 free (regno_src_regno
);
1257 free (reg_set_in_bb
);
1258 reg_set_in_bb
= NULL
;
1260 regstat_free_n_sets_and_refs ();
1262 if (flag_ira_loop_pressure
)
1267 /* Returns nonzero if INSN's pattern has matching constraints for any operand.
1268 Returns 0 if INSN can't be recognized, or if the alternative can't be
1271 Initialize the info in MATCHP based on the constraints. */
1274 find_matches (rtx insn
, struct match
*matchp
)
1276 int likely_spilled
[MAX_RECOG_OPERANDS
];
1278 int any_matches
= 0;
1280 extract_insn (insn
);
1281 if (! constrain_operands (0))
1284 /* Must initialize this before main loop, because the code for
1285 the commutative case may set matches for operands other than
1287 for (op_no
= recog_data
.n_operands
; --op_no
>= 0; )
1288 matchp
->with
[op_no
] = matchp
->commutative
[op_no
] = -1;
1290 for (op_no
= 0; op_no
< recog_data
.n_operands
; op_no
++)
1296 p
= recog_data
.constraints
[op_no
];
1298 likely_spilled
[op_no
] = 0;
1299 matchp
->use
[op_no
] = READ
;
1300 matchp
->early_clobber
[op_no
] = 0;
1302 matchp
->use
[op_no
] = WRITE
;
1304 matchp
->use
[op_no
] = READWRITE
;
1306 for (;*p
&& i
< which_alternative
; p
++)
1310 while ((c
= *p
) != '\0' && c
!= ',')
1319 matchp
->early_clobber
[op_no
] = 1;
1322 matchp
->commutative
[op_no
] = op_no
+ 1;
1323 matchp
->commutative
[op_no
+ 1] = op_no
;
1326 case '0': case '1': case '2': case '3': case '4':
1327 case '5': case '6': case '7': case '8': case '9':
1330 unsigned long match_ul
= strtoul (p
, &end
, 10);
1331 int match
= match_ul
;
1335 if (match
< op_no
&& likely_spilled
[match
])
1337 matchp
->with
[op_no
] = match
;
1339 if (matchp
->commutative
[op_no
] >= 0)
1340 matchp
->with
[matchp
->commutative
[op_no
]] = match
;
1344 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'h':
1345 case 'j': case 'k': case 'l': case 'p': case 'q': case 't': case 'u':
1346 case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B':
1347 case 'C': case 'D': case 'W': case 'Y': case 'Z':
1348 if (targetm
.class_likely_spilled_p (REG_CLASS_FROM_CONSTRAINT ((unsigned char) c
, p
)))
1349 likely_spilled
[op_no
] = 1;
1352 p
+= CONSTRAINT_LEN (c
, p
);
1361 gate_handle_regmove (void)
1363 return (optimize
> 0 && flag_regmove
);
1367 struct rtl_opt_pass pass_regmove
=
1371 "regmove", /* name */
1372 gate_handle_regmove
, /* gate */
1373 regmove_optimize
, /* execute */
1376 0, /* static_pass_number */
1377 TV_REGMOVE
, /* tv_id */
1378 0, /* properties_required */
1379 0, /* properties_provided */
1380 0, /* properties_destroyed */
1381 0, /* todo_flags_start */
1382 TODO_df_finish
| TODO_verify_rtl_sharing
|
1383 TODO_ggc_collect
/* todo_flags_finish */