* doc/contrib.texi: Fix alphabetical order. Fix typos. Improve
[official-gcc.git] / gcc / regmove.c
blob910c422ee4f4987dfaa885665dcd303e9dd46ad1
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 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 /* This module looks for cases where matching constraints would force
24 an instruction to need a reload, and this reload would be a register
25 to register move. It then attempts to change the registers used by the
26 instruction to avoid the move instruction. */
28 #include "config.h"
29 #include "system.h"
30 #include "rtl.h" /* stdio.h must precede rtl.h for FFS. */
31 #include "tm_p.h"
32 #include "insn-config.h"
33 #include "recog.h"
34 #include "output.h"
35 #include "regs.h"
36 #include "hard-reg-set.h"
37 #include "flags.h"
38 #include "function.h"
39 #include "expr.h"
40 #include "basic-block.h"
41 #include "except.h"
42 #include "toplev.h"
43 #include "reload.h"
46 /* Turn STACK_GROWS_DOWNWARD into a boolean. */
47 #ifdef STACK_GROWS_DOWNWARD
48 #undef STACK_GROWS_DOWNWARD
49 #define STACK_GROWS_DOWNWARD 1
50 #else
51 #define STACK_GROWS_DOWNWARD 0
52 #endif
54 static int perhaps_ends_bb_p PARAMS ((rtx));
55 static int optimize_reg_copy_1 PARAMS ((rtx, rtx, rtx));
56 static void optimize_reg_copy_2 PARAMS ((rtx, rtx, rtx));
57 static void optimize_reg_copy_3 PARAMS ((rtx, rtx, rtx));
58 static rtx gen_add3_insn PARAMS ((rtx, rtx, rtx));
59 static void copy_src_to_dest PARAMS ((rtx, rtx, rtx, int));
60 static int *regmove_bb_head;
62 struct match {
63 int with[MAX_RECOG_OPERANDS];
64 enum { READ, WRITE, READWRITE } use[MAX_RECOG_OPERANDS];
65 int commutative[MAX_RECOG_OPERANDS];
66 int early_clobber[MAX_RECOG_OPERANDS];
69 static rtx discover_flags_reg PARAMS ((void));
70 static void mark_flags_life_zones PARAMS ((rtx));
71 static void flags_set_1 PARAMS ((rtx, rtx, void *));
73 static int try_auto_increment PARAMS ((rtx, rtx, rtx, rtx, HOST_WIDE_INT, int));
74 static int find_matches PARAMS ((rtx, struct match *));
75 static void replace_in_call_usage PARAMS ((rtx *, int, rtx, rtx));
76 static int fixup_match_1 PARAMS ((rtx, rtx, rtx, rtx, rtx, int, int, int, FILE *))
78 static int reg_is_remote_constant_p PARAMS ((rtx, rtx, rtx));
79 static int stable_and_no_regs_but_for_p PARAMS ((rtx, rtx, rtx));
80 static int regclass_compatible_p PARAMS ((int, int));
81 static int replacement_quality PARAMS ((rtx));
82 static int fixup_match_2 PARAMS ((rtx, rtx, rtx, rtx, FILE *));
84 /* Return non-zero if registers with CLASS1 and CLASS2 can be merged without
85 causing too much register allocation problems. */
86 static int
87 regclass_compatible_p (class0, class1)
88 int class0, class1;
90 return (class0 == class1
91 || (reg_class_subset_p (class0, class1)
92 && ! CLASS_LIKELY_SPILLED_P (class0))
93 || (reg_class_subset_p (class1, class0)
94 && ! CLASS_LIKELY_SPILLED_P (class1)));
97 /* Generate and return an insn body to add r1 and c,
98 storing the result in r0. */
99 static rtx
100 gen_add3_insn (r0, r1, c)
101 rtx r0, r1, c;
103 int icode = (int) add_optab->handlers[(int) GET_MODE (r0)].insn_code;
105 if (icode == CODE_FOR_nothing
106 || ! ((*insn_data[icode].operand[0].predicate)
107 (r0, insn_data[icode].operand[0].mode))
108 || ! ((*insn_data[icode].operand[1].predicate)
109 (r1, insn_data[icode].operand[1].mode))
110 || ! ((*insn_data[icode].operand[2].predicate)
111 (c, insn_data[icode].operand[2].mode)))
112 return NULL_RTX;
114 return (GEN_FCN (icode) (r0, r1, c));
118 /* INC_INSN is an instruction that adds INCREMENT to REG.
119 Try to fold INC_INSN as a post/pre in/decrement into INSN.
120 Iff INC_INSN_SET is nonzero, inc_insn has a destination different from src.
121 Return nonzero for success. */
122 static int
123 try_auto_increment (insn, inc_insn, inc_insn_set, reg, increment, pre)
124 rtx reg, insn, inc_insn ,inc_insn_set;
125 HOST_WIDE_INT increment;
126 int pre;
128 enum rtx_code inc_code;
130 rtx pset = single_set (insn);
131 if (pset)
133 /* Can't use the size of SET_SRC, we might have something like
134 (sign_extend:SI (mem:QI ... */
135 rtx use = find_use_as_address (pset, reg, 0);
136 if (use != 0 && use != (rtx) 1)
138 int size = GET_MODE_SIZE (GET_MODE (use));
139 if (0
140 || (HAVE_POST_INCREMENT
141 && pre == 0 && (inc_code = POST_INC, increment == size))
142 || (HAVE_PRE_INCREMENT
143 && pre == 1 && (inc_code = PRE_INC, increment == size))
144 || (HAVE_POST_DECREMENT
145 && pre == 0 && (inc_code = POST_DEC, increment == -size))
146 || (HAVE_PRE_DECREMENT
147 && pre == 1 && (inc_code = PRE_DEC, increment == -size))
150 if (inc_insn_set)
151 validate_change
152 (inc_insn,
153 &SET_SRC (inc_insn_set),
154 XEXP (SET_SRC (inc_insn_set), 0), 1);
155 validate_change (insn, &XEXP (use, 0),
156 gen_rtx_fmt_e (inc_code, Pmode, reg), 1);
157 if (apply_change_group ())
159 /* If there is a REG_DEAD note on this insn, we must
160 change this not to REG_UNUSED meaning that the register
161 is set, but the value is dead. Failure to do so will
162 result in a sched1 abort -- when it recomputes lifetime
163 information, the number of REG_DEAD notes will have
164 changed. */
165 rtx note = find_reg_note (insn, REG_DEAD, reg);
166 if (note)
167 PUT_MODE (note, REG_UNUSED);
169 REG_NOTES (insn)
170 = gen_rtx_EXPR_LIST (REG_INC,
171 reg, REG_NOTES (insn));
172 if (! inc_insn_set)
174 PUT_CODE (inc_insn, NOTE);
175 NOTE_LINE_NUMBER (inc_insn) = NOTE_INSN_DELETED;
176 NOTE_SOURCE_FILE (inc_insn) = 0;
178 return 1;
183 return 0;
186 /* Determine if the pattern generated by add_optab has a clobber,
187 such as might be issued for a flags hard register. To make the
188 code elsewhere simpler, we handle cc0 in this same framework.
190 Return the register if one was discovered. Return NULL_RTX if
191 if no flags were found. Return pc_rtx if we got confused. */
193 static rtx
194 discover_flags_reg ()
196 rtx tmp;
197 tmp = gen_rtx_REG (word_mode, 10000);
198 tmp = gen_add3_insn (tmp, tmp, GEN_INT (2));
200 /* If we get something that isn't a simple set, or a
201 [(set ..) (clobber ..)], this whole function will go wrong. */
202 if (GET_CODE (tmp) == SET)
203 return NULL_RTX;
204 else if (GET_CODE (tmp) == PARALLEL)
206 int found;
208 if (XVECLEN (tmp, 0) != 2)
209 return pc_rtx;
210 tmp = XVECEXP (tmp, 0, 1);
211 if (GET_CODE (tmp) != CLOBBER)
212 return pc_rtx;
213 tmp = XEXP (tmp, 0);
215 /* Don't do anything foolish if the md wanted to clobber a
216 scratch or something. We only care about hard regs.
217 Moreover we don't like the notion of subregs of hard regs. */
218 if (GET_CODE (tmp) == SUBREG
219 && GET_CODE (SUBREG_REG (tmp)) == REG
220 && REGNO (SUBREG_REG (tmp)) < FIRST_PSEUDO_REGISTER)
221 return pc_rtx;
222 found = (GET_CODE (tmp) == REG && REGNO (tmp) < FIRST_PSEUDO_REGISTER);
224 return (found ? tmp : NULL_RTX);
227 return pc_rtx;
230 /* It is a tedious task identifying when the flags register is live and
231 when it is safe to optimize. Since we process the instruction stream
232 multiple times, locate and record these live zones by marking the
233 mode of the instructions --
235 QImode is used on the instruction at which the flags becomes live.
237 HImode is used within the range (exclusive) that the flags are
238 live. Thus the user of the flags is not marked.
240 All other instructions are cleared to VOIDmode. */
242 /* Used to communicate with flags_set_1. */
243 static rtx flags_set_1_rtx;
244 static int flags_set_1_set;
246 static void
247 mark_flags_life_zones (flags)
248 rtx flags;
250 int flags_regno;
251 int flags_nregs;
252 int block;
254 #ifdef HAVE_cc0
255 /* If we found a flags register on a cc0 host, bail. */
256 if (flags == NULL_RTX)
257 flags = cc0_rtx;
258 else if (flags != cc0_rtx)
259 flags = pc_rtx;
260 #endif
262 /* Simple cases first: if no flags, clear all modes. If confusing,
263 mark the entire function as being in a flags shadow. */
264 if (flags == NULL_RTX || flags == pc_rtx)
266 enum machine_mode mode = (flags ? HImode : VOIDmode);
267 rtx insn;
268 for (insn = get_insns(); insn; insn = NEXT_INSN (insn))
269 PUT_MODE (insn, mode);
270 return;
273 #ifdef HAVE_cc0
274 flags_regno = -1;
275 flags_nregs = 1;
276 #else
277 flags_regno = REGNO (flags);
278 flags_nregs = HARD_REGNO_NREGS (flags_regno, GET_MODE (flags));
279 #endif
280 flags_set_1_rtx = flags;
282 /* Process each basic block. */
283 for (block = n_basic_blocks - 1; block >= 0; block--)
285 rtx insn, end;
286 int live;
288 insn = BLOCK_HEAD (block);
289 end = BLOCK_END (block);
291 /* Look out for the (unlikely) case of flags being live across
292 basic block boundaries. */
293 live = 0;
294 #ifndef HAVE_cc0
296 int i;
297 for (i = 0; i < flags_nregs; ++i)
298 live |= REGNO_REG_SET_P (BASIC_BLOCK (block)->global_live_at_start,
299 flags_regno + i);
301 #endif
303 while (1)
305 /* Process liveness in reverse order of importance --
306 alive, death, birth. This lets more important info
307 overwrite the mode of lesser info. */
309 if (INSN_P (insn))
311 #ifdef HAVE_cc0
312 /* In the cc0 case, death is not marked in reg notes,
313 but is instead the mere use of cc0 when it is alive. */
314 if (live && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
315 live = 0;
316 #else
317 /* In the hard reg case, we watch death notes. */
318 if (live && find_regno_note (insn, REG_DEAD, flags_regno))
319 live = 0;
320 #endif
321 PUT_MODE (insn, (live ? HImode : VOIDmode));
323 /* In either case, birth is denoted simply by it's presence
324 as the destination of a set. */
325 flags_set_1_set = 0;
326 note_stores (PATTERN (insn), flags_set_1, NULL);
327 if (flags_set_1_set)
329 live = 1;
330 PUT_MODE (insn, QImode);
333 else
334 PUT_MODE (insn, (live ? HImode : VOIDmode));
336 if (insn == end)
337 break;
338 insn = NEXT_INSN (insn);
343 /* A subroutine of mark_flags_life_zones, called through note_stores. */
345 static void
346 flags_set_1 (x, pat, data)
347 rtx x, pat;
348 void *data ATTRIBUTE_UNUSED;
350 if (GET_CODE (pat) == SET
351 && reg_overlap_mentioned_p (x, flags_set_1_rtx))
352 flags_set_1_set = 1;
355 static int *regno_src_regno;
357 /* Indicate how good a choice REG (which appears as a source) is to replace
358 a destination register with. The higher the returned value, the better
359 the choice. The main objective is to avoid using a register that is
360 a candidate for tying to a hard register, since the output might in
361 turn be a candidate to be tied to a different hard register. */
362 static int
363 replacement_quality(reg)
364 rtx reg;
366 int src_regno;
368 /* Bad if this isn't a register at all. */
369 if (GET_CODE (reg) != REG)
370 return 0;
372 /* If this register is not meant to get a hard register,
373 it is a poor choice. */
374 if (REG_LIVE_LENGTH (REGNO (reg)) < 0)
375 return 0;
377 src_regno = regno_src_regno[REGNO (reg)];
379 /* If it was not copied from another register, it is fine. */
380 if (src_regno < 0)
381 return 3;
383 /* Copied from a hard register? */
384 if (src_regno < FIRST_PSEUDO_REGISTER)
385 return 1;
387 /* Copied from a pseudo register - not as bad as from a hard register,
388 yet still cumbersome, since the register live length will be lengthened
389 when the registers get tied. */
390 return 2;
393 /* Return 1 if INSN might end a basic block. */
395 static int perhaps_ends_bb_p (insn)
396 rtx insn;
398 switch (GET_CODE (insn))
400 case CODE_LABEL:
401 case JUMP_INSN:
402 /* These always end a basic block. */
403 return 1;
405 case CALL_INSN:
406 /* A CALL_INSN might be the last insn of a basic block, if it is inside
407 an EH region or if there are nonlocal gotos. Note that this test is
408 very conservative. */
409 if (nonlocal_goto_handler_labels)
410 return 1;
411 /* FALLTHRU */
412 default:
413 return can_throw_internal (insn);
417 /* INSN is a copy from SRC to DEST, both registers, and SRC does not die
418 in INSN.
420 Search forward to see if SRC dies before either it or DEST is modified,
421 but don't scan past the end of a basic block. If so, we can replace SRC
422 with DEST and let SRC die in INSN.
424 This will reduce the number of registers live in that range and may enable
425 DEST to be tied to SRC, thus often saving one register in addition to a
426 register-register copy. */
428 static int
429 optimize_reg_copy_1 (insn, dest, src)
430 rtx insn;
431 rtx dest;
432 rtx src;
434 rtx p, q;
435 rtx note;
436 rtx dest_death = 0;
437 int sregno = REGNO (src);
438 int dregno = REGNO (dest);
440 /* We don't want to mess with hard regs if register classes are small. */
441 if (sregno == dregno
442 || (SMALL_REGISTER_CLASSES
443 && (sregno < FIRST_PSEUDO_REGISTER
444 || dregno < FIRST_PSEUDO_REGISTER))
445 /* We don't see all updates to SP if they are in an auto-inc memory
446 reference, so we must disallow this optimization on them. */
447 || sregno == STACK_POINTER_REGNUM || dregno == STACK_POINTER_REGNUM)
448 return 0;
450 for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
452 /* ??? We can't scan past the end of a basic block without updating
453 the register lifetime info (REG_DEAD/basic_block_live_at_start). */
454 if (perhaps_ends_bb_p (p))
455 break;
456 else if (! INSN_P (p))
457 continue;
459 if (reg_set_p (src, p) || reg_set_p (dest, p)
460 /* Don't change a USE of a register. */
461 || (GET_CODE (PATTERN (p)) == USE
462 && reg_overlap_mentioned_p (src, XEXP (PATTERN (p), 0))))
463 break;
465 /* See if all of SRC dies in P. This test is slightly more
466 conservative than it needs to be. */
467 if ((note = find_regno_note (p, REG_DEAD, sregno)) != 0
468 && GET_MODE (XEXP (note, 0)) == GET_MODE (src))
470 int failed = 0;
471 int d_length = 0;
472 int s_length = 0;
473 int d_n_calls = 0;
474 int s_n_calls = 0;
476 /* We can do the optimization. Scan forward from INSN again,
477 replacing regs as we go. Set FAILED if a replacement can't
478 be done. In that case, we can't move the death note for SRC.
479 This should be rare. */
481 /* Set to stop at next insn. */
482 for (q = next_real_insn (insn);
483 q != next_real_insn (p);
484 q = next_real_insn (q))
486 if (reg_overlap_mentioned_p (src, PATTERN (q)))
488 /* If SRC is a hard register, we might miss some
489 overlapping registers with validate_replace_rtx,
490 so we would have to undo it. We can't if DEST is
491 present in the insn, so fail in that combination
492 of cases. */
493 if (sregno < FIRST_PSEUDO_REGISTER
494 && reg_mentioned_p (dest, PATTERN (q)))
495 failed = 1;
497 /* Replace all uses and make sure that the register
498 isn't still present. */
499 else if (validate_replace_rtx (src, dest, q)
500 && (sregno >= FIRST_PSEUDO_REGISTER
501 || ! reg_overlap_mentioned_p (src,
502 PATTERN (q))))
504 else
506 validate_replace_rtx (dest, src, q);
507 failed = 1;
511 /* For SREGNO, count the total number of insns scanned.
512 For DREGNO, count the total number of insns scanned after
513 passing the death note for DREGNO. */
514 s_length++;
515 if (dest_death)
516 d_length++;
518 /* If the insn in which SRC dies is a CALL_INSN, don't count it
519 as a call that has been crossed. Otherwise, count it. */
520 if (q != p && GET_CODE (q) == CALL_INSN)
522 /* Similarly, total calls for SREGNO, total calls beyond
523 the death note for DREGNO. */
524 s_n_calls++;
525 if (dest_death)
526 d_n_calls++;
529 /* If DEST dies here, remove the death note and save it for
530 later. Make sure ALL of DEST dies here; again, this is
531 overly conservative. */
532 if (dest_death == 0
533 && (dest_death = find_regno_note (q, REG_DEAD, dregno)) != 0)
535 if (GET_MODE (XEXP (dest_death, 0)) != GET_MODE (dest))
536 failed = 1, dest_death = 0;
537 else
538 remove_note (q, dest_death);
542 if (! failed)
544 /* These counters need to be updated if and only if we are
545 going to move the REG_DEAD note. */
546 if (sregno >= FIRST_PSEUDO_REGISTER)
548 if (REG_LIVE_LENGTH (sregno) >= 0)
550 REG_LIVE_LENGTH (sregno) -= s_length;
551 /* REG_LIVE_LENGTH is only an approximation after
552 combine if sched is not run, so make sure that we
553 still have a reasonable value. */
554 if (REG_LIVE_LENGTH (sregno) < 2)
555 REG_LIVE_LENGTH (sregno) = 2;
558 REG_N_CALLS_CROSSED (sregno) -= s_n_calls;
561 /* Move death note of SRC from P to INSN. */
562 remove_note (p, note);
563 XEXP (note, 1) = REG_NOTES (insn);
564 REG_NOTES (insn) = note;
567 /* DEST is also dead if INSN has a REG_UNUSED note for DEST. */
568 if (! dest_death
569 && (dest_death = find_regno_note (insn, REG_UNUSED, dregno)))
571 PUT_REG_NOTE_KIND (dest_death, REG_DEAD);
572 remove_note (insn, dest_death);
575 /* Put death note of DEST on P if we saw it die. */
576 if (dest_death)
578 XEXP (dest_death, 1) = REG_NOTES (p);
579 REG_NOTES (p) = dest_death;
581 if (dregno >= FIRST_PSEUDO_REGISTER)
583 /* If and only if we are moving the death note for DREGNO,
584 then we need to update its counters. */
585 if (REG_LIVE_LENGTH (dregno) >= 0)
586 REG_LIVE_LENGTH (dregno) += d_length;
587 REG_N_CALLS_CROSSED (dregno) += d_n_calls;
591 return ! failed;
594 /* If SRC is a hard register which is set or killed in some other
595 way, we can't do this optimization. */
596 else if (sregno < FIRST_PSEUDO_REGISTER
597 && dead_or_set_p (p, src))
598 break;
600 return 0;
603 /* INSN is a copy of SRC to DEST, in which SRC dies. See if we now have
604 a sequence of insns that modify DEST followed by an insn that sets
605 SRC to DEST in which DEST dies, with no prior modification of DEST.
606 (There is no need to check if the insns in between actually modify
607 DEST. We should not have cases where DEST is not modified, but
608 the optimization is safe if no such modification is detected.)
609 In that case, we can replace all uses of DEST, starting with INSN and
610 ending with the set of SRC to DEST, with SRC. We do not do this
611 optimization if a CALL_INSN is crossed unless SRC already crosses a
612 call or if DEST dies before the copy back to SRC.
614 It is assumed that DEST and SRC are pseudos; it is too complicated to do
615 this for hard registers since the substitutions we may make might fail. */
617 static void
618 optimize_reg_copy_2 (insn, dest, src)
619 rtx insn;
620 rtx dest;
621 rtx src;
623 rtx p, q;
624 rtx set;
625 int sregno = REGNO (src);
626 int dregno = REGNO (dest);
628 for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
630 /* ??? We can't scan past the end of a basic block without updating
631 the register lifetime info (REG_DEAD/basic_block_live_at_start). */
632 if (perhaps_ends_bb_p (p))
633 break;
634 else if (! INSN_P (p))
635 continue;
637 set = single_set (p);
638 if (set && SET_SRC (set) == dest && SET_DEST (set) == src
639 && find_reg_note (p, REG_DEAD, dest))
641 /* We can do the optimization. Scan forward from INSN again,
642 replacing regs as we go. */
644 /* Set to stop at next insn. */
645 for (q = insn; q != NEXT_INSN (p); q = NEXT_INSN (q))
646 if (INSN_P (q))
648 if (reg_mentioned_p (dest, PATTERN (q)))
649 PATTERN (q) = replace_rtx (PATTERN (q), dest, src);
652 if (GET_CODE (q) == CALL_INSN)
654 REG_N_CALLS_CROSSED (dregno)--;
655 REG_N_CALLS_CROSSED (sregno)++;
659 remove_note (p, find_reg_note (p, REG_DEAD, dest));
660 REG_N_DEATHS (dregno)--;
661 remove_note (insn, find_reg_note (insn, REG_DEAD, src));
662 REG_N_DEATHS (sregno)--;
663 return;
666 if (reg_set_p (src, p)
667 || find_reg_note (p, REG_DEAD, dest)
668 || (GET_CODE (p) == CALL_INSN && REG_N_CALLS_CROSSED (sregno) == 0))
669 break;
672 /* INSN is a ZERO_EXTEND or SIGN_EXTEND of SRC to DEST.
673 Look if SRC dies there, and if it is only set once, by loading
674 it from memory. If so, try to encorporate the zero/sign extension
675 into the memory read, change SRC to the mode of DEST, and alter
676 the remaining accesses to use the appropriate SUBREG. This allows
677 SRC and DEST to be tied later. */
678 static void
679 optimize_reg_copy_3 (insn, dest, src)
680 rtx insn;
681 rtx dest;
682 rtx src;
684 rtx src_reg = XEXP (src, 0);
685 int src_no = REGNO (src_reg);
686 int dst_no = REGNO (dest);
687 rtx p, set, subreg;
688 enum machine_mode old_mode;
690 if (src_no < FIRST_PSEUDO_REGISTER
691 || dst_no < FIRST_PSEUDO_REGISTER
692 || ! find_reg_note (insn, REG_DEAD, src_reg)
693 || REG_N_SETS (src_no) != 1)
694 return;
695 for (p = PREV_INSN (insn); p && ! reg_set_p (src_reg, p); p = PREV_INSN (p))
696 /* ??? We can't scan past the end of a basic block without updating
697 the register lifetime info (REG_DEAD/basic_block_live_at_start). */
698 if (perhaps_ends_bb_p (p))
699 break;
701 if (! p)
702 return;
704 if (! (set = single_set (p))
705 || GET_CODE (SET_SRC (set)) != MEM
706 || SET_DEST (set) != src_reg)
707 return;
709 /* Be conserative: although this optimization is also valid for
710 volatile memory references, that could cause trouble in later passes. */
711 if (MEM_VOLATILE_P (SET_SRC (set)))
712 return;
714 /* Do not use a SUBREG to truncate from one mode to another if truncation
715 is not a nop. */
716 if (GET_MODE_BITSIZE (GET_MODE (src_reg)) <= GET_MODE_BITSIZE (GET_MODE (src))
717 && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (src)),
718 GET_MODE_BITSIZE (GET_MODE (src_reg))))
719 return;
721 old_mode = GET_MODE (src_reg);
722 PUT_MODE (src_reg, GET_MODE (src));
723 XEXP (src, 0) = SET_SRC (set);
725 /* Include this change in the group so that it's easily undone if
726 one of the changes in the group is invalid. */
727 validate_change (p, &SET_SRC (set), src, 1);
729 /* Now walk forward making additional replacements. We want to be able
730 to undo all the changes if a later substitution fails. */
731 subreg = gen_lowpart_SUBREG (old_mode, src_reg);
732 while (p = NEXT_INSN (p), p != insn)
734 if (! INSN_P (p))
735 continue;
737 /* Make a tenative change. */
738 validate_replace_rtx_group (src_reg, subreg, p);
741 validate_replace_rtx_group (src, src_reg, insn);
743 /* Now see if all the changes are valid. */
744 if (! apply_change_group ())
746 /* One or more changes were no good. Back out everything. */
747 PUT_MODE (src_reg, old_mode);
748 XEXP (src, 0) = src_reg;
753 /* If we were not able to update the users of src to use dest directly, try
754 instead moving the value to dest directly before the operation. */
756 static void
757 copy_src_to_dest (insn, src, dest, old_max_uid)
758 rtx insn;
759 rtx src;
760 rtx dest;
761 int old_max_uid;
763 rtx seq;
764 rtx link;
765 rtx next;
766 rtx set;
767 rtx move_insn;
768 rtx *p_insn_notes;
769 rtx *p_move_notes;
770 int src_regno;
771 int dest_regno;
772 int bb;
773 int insn_uid;
774 int move_uid;
776 /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant
777 or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is
778 parameter when there is no frame pointer that is not allocated a register.
779 For now, we just reject them, rather than incrementing the live length. */
781 if (GET_CODE (src) == REG
782 && REG_LIVE_LENGTH (REGNO (src)) > 0
783 && GET_CODE (dest) == REG
784 && !RTX_UNCHANGING_P (dest)
785 && REG_LIVE_LENGTH (REGNO (dest)) > 0
786 && (set = single_set (insn)) != NULL_RTX
787 && !reg_mentioned_p (dest, SET_SRC (set))
788 && GET_MODE (src) == GET_MODE (dest))
790 int old_num_regs = reg_rtx_no;
792 /* Generate the src->dest move. */
793 start_sequence ();
794 emit_move_insn (dest, src);
795 seq = gen_sequence ();
796 end_sequence ();
797 /* If this sequence uses new registers, we may not use it. */
798 if (old_num_regs != reg_rtx_no
799 || ! validate_replace_rtx (src, dest, insn))
801 /* We have to restore reg_rtx_no to its old value, lest
802 recompute_reg_usage will try to compute the usage of the
803 new regs, yet reg_n_info is not valid for them. */
804 reg_rtx_no = old_num_regs;
805 return;
807 emit_insn_before (seq, insn);
808 move_insn = PREV_INSN (insn);
809 p_move_notes = &REG_NOTES (move_insn);
810 p_insn_notes = &REG_NOTES (insn);
812 /* Move any notes mentioning src to the move instruction */
813 for (link = REG_NOTES (insn); link != NULL_RTX; link = next)
815 next = XEXP (link, 1);
816 if (XEXP (link, 0) == src)
818 *p_move_notes = link;
819 p_move_notes = &XEXP (link, 1);
821 else
823 *p_insn_notes = link;
824 p_insn_notes = &XEXP (link, 1);
828 *p_move_notes = NULL_RTX;
829 *p_insn_notes = NULL_RTX;
831 /* Is the insn the head of a basic block? If so extend it */
832 insn_uid = INSN_UID (insn);
833 move_uid = INSN_UID (move_insn);
834 if (insn_uid < old_max_uid)
836 bb = regmove_bb_head[insn_uid];
837 if (bb >= 0)
839 BLOCK_HEAD (bb) = move_insn;
840 regmove_bb_head[insn_uid] = -1;
844 /* Update the various register tables. */
845 dest_regno = REGNO (dest);
846 REG_N_SETS (dest_regno) ++;
847 REG_LIVE_LENGTH (dest_regno)++;
848 if (REGNO_FIRST_UID (dest_regno) == insn_uid)
849 REGNO_FIRST_UID (dest_regno) = move_uid;
851 src_regno = REGNO (src);
852 if (! find_reg_note (move_insn, REG_DEAD, src))
853 REG_LIVE_LENGTH (src_regno)++;
855 if (REGNO_FIRST_UID (src_regno) == insn_uid)
856 REGNO_FIRST_UID (src_regno) = move_uid;
858 if (REGNO_LAST_UID (src_regno) == insn_uid)
859 REGNO_LAST_UID (src_regno) = move_uid;
861 if (REGNO_LAST_NOTE_UID (src_regno) == insn_uid)
862 REGNO_LAST_NOTE_UID (src_regno) = move_uid;
867 /* Return whether REG is set in only one location, and is set to a
868 constant, but is set in a different basic block from INSN (an
869 instructions which uses REG). In this case REG is equivalent to a
870 constant, and we don't want to break that equivalence, because that
871 may increase register pressure and make reload harder. If REG is
872 set in the same basic block as INSN, we don't worry about it,
873 because we'll probably need a register anyhow (??? but what if REG
874 is used in a different basic block as well as this one?). FIRST is
875 the first insn in the function. */
877 static int
878 reg_is_remote_constant_p (reg, insn, first)
879 rtx reg;
880 rtx insn;
881 rtx first;
883 register rtx p;
885 if (REG_N_SETS (REGNO (reg)) != 1)
886 return 0;
888 /* Look for the set. */
889 for (p = LOG_LINKS (insn); p; p = XEXP (p, 1))
891 rtx s;
893 if (REG_NOTE_KIND (p) != 0)
894 continue;
895 s = single_set (XEXP (p, 0));
896 if (s != 0
897 && GET_CODE (SET_DEST (s)) == REG
898 && REGNO (SET_DEST (s)) == REGNO (reg))
900 /* The register is set in the same basic block. */
901 return 0;
905 for (p = first; p && p != insn; p = NEXT_INSN (p))
907 rtx s;
909 if (! INSN_P (p))
910 continue;
911 s = single_set (p);
912 if (s != 0
913 && GET_CODE (SET_DEST (s)) == REG
914 && REGNO (SET_DEST (s)) == REGNO (reg))
916 /* This is the instruction which sets REG. If there is a
917 REG_EQUAL note, then REG is equivalent to a constant. */
918 if (find_reg_note (p, REG_EQUAL, NULL_RTX))
919 return 1;
920 return 0;
924 return 0;
927 /* INSN is adding a CONST_INT to a REG. We search backwards looking for
928 another add immediate instruction with the same source and dest registers,
929 and if we find one, we change INSN to an increment, and return 1. If
930 no changes are made, we return 0.
932 This changes
933 (set (reg100) (plus reg1 offset1))
935 (set (reg100) (plus reg1 offset2))
937 (set (reg100) (plus reg1 offset1))
939 (set (reg100) (plus reg100 offset2-offset1)) */
941 /* ??? What does this comment mean? */
942 /* cse disrupts preincrement / postdecrement squences when it finds a
943 hard register as ultimate source, like the frame pointer. */
945 static int
946 fixup_match_2 (insn, dst, src, offset, regmove_dump_file)
947 rtx insn, dst, src, offset;
948 FILE *regmove_dump_file;
950 rtx p, dst_death = 0;
951 int length, num_calls = 0;
953 /* If SRC dies in INSN, we'd have to move the death note. This is
954 considered to be very unlikely, so we just skip the optimization
955 in this case. */
956 if (find_regno_note (insn, REG_DEAD, REGNO (src)))
957 return 0;
959 /* Scan backward to find the first instruction that sets DST. */
961 for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
963 rtx pset;
965 /* ??? We can't scan past the end of a basic block without updating
966 the register lifetime info (REG_DEAD/basic_block_live_at_start). */
967 if (perhaps_ends_bb_p (p))
968 break;
969 else if (! INSN_P (p))
970 continue;
972 if (find_regno_note (p, REG_DEAD, REGNO (dst)))
973 dst_death = p;
974 if (! dst_death)
975 length++;
977 pset = single_set (p);
978 if (pset && SET_DEST (pset) == dst
979 && GET_CODE (SET_SRC (pset)) == PLUS
980 && XEXP (SET_SRC (pset), 0) == src
981 && GET_CODE (XEXP (SET_SRC (pset), 1)) == CONST_INT)
983 HOST_WIDE_INT newconst
984 = INTVAL (offset) - INTVAL (XEXP (SET_SRC (pset), 1));
985 rtx add = gen_add3_insn (dst, dst, GEN_INT (newconst));
987 if (add && validate_change (insn, &PATTERN (insn), add, 0))
989 /* Remove the death note for DST from DST_DEATH. */
990 if (dst_death)
992 remove_death (REGNO (dst), dst_death);
993 REG_LIVE_LENGTH (REGNO (dst)) += length;
994 REG_N_CALLS_CROSSED (REGNO (dst)) += num_calls;
997 if (regmove_dump_file)
998 fprintf (regmove_dump_file,
999 "Fixed operand of insn %d.\n",
1000 INSN_UID (insn));
1002 #ifdef AUTO_INC_DEC
1003 for (p = PREV_INSN (insn); p; p = PREV_INSN (p))
1005 if (GET_CODE (p) == CODE_LABEL
1006 || GET_CODE (p) == JUMP_INSN)
1007 break;
1008 if (! INSN_P (p))
1009 continue;
1010 if (reg_overlap_mentioned_p (dst, PATTERN (p)))
1012 if (try_auto_increment (p, insn, 0, dst, newconst, 0))
1013 return 1;
1014 break;
1017 for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
1019 if (GET_CODE (p) == CODE_LABEL
1020 || GET_CODE (p) == JUMP_INSN)
1021 break;
1022 if (! INSN_P (p))
1023 continue;
1024 if (reg_overlap_mentioned_p (dst, PATTERN (p)))
1026 try_auto_increment (p, insn, 0, dst, newconst, 1);
1027 break;
1030 #endif
1031 return 1;
1035 if (reg_set_p (dst, PATTERN (p)))
1036 break;
1038 /* If we have passed a call instruction, and the
1039 pseudo-reg SRC is not already live across a call,
1040 then don't perform the optimization. */
1041 /* reg_set_p is overly conservative for CALL_INSNS, thinks that all
1042 hard regs are clobbered. Thus, we only use it for src for
1043 non-call insns. */
1044 if (GET_CODE (p) == CALL_INSN)
1046 if (! dst_death)
1047 num_calls++;
1049 if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
1050 break;
1052 if (call_used_regs [REGNO (dst)]
1053 || find_reg_fusage (p, CLOBBER, dst))
1054 break;
1056 else if (reg_set_p (src, PATTERN (p)))
1057 break;
1060 return 0;
1063 /* Main entry for the register move optimization.
1064 F is the first instruction.
1065 NREGS is one plus the highest pseudo-reg number used in the instruction.
1066 REGMOVE_DUMP_FILE is a stream for output of a trace of actions taken
1067 (or 0 if none should be output). */
1069 void
1070 regmove_optimize (f, nregs, regmove_dump_file)
1071 rtx f;
1072 int nregs;
1073 FILE *regmove_dump_file;
1075 int old_max_uid = get_max_uid ();
1076 rtx insn;
1077 struct match match;
1078 int pass;
1079 int i;
1080 rtx copy_src, copy_dst;
1082 /* ??? Hack. Regmove doesn't examine the CFG, and gets mightily
1083 confused by non-call exceptions ending blocks. */
1084 if (flag_non_call_exceptions)
1085 return;
1087 /* Find out where a potential flags register is live, and so that we
1088 can supress some optimizations in those zones. */
1089 mark_flags_life_zones (discover_flags_reg ());
1091 regno_src_regno = (int *) xmalloc (sizeof *regno_src_regno * nregs);
1092 for (i = nregs; --i >= 0; ) regno_src_regno[i] = -1;
1094 regmove_bb_head = (int *) xmalloc (sizeof (int) * (old_max_uid + 1));
1095 for (i = old_max_uid; i >= 0; i--) regmove_bb_head[i] = -1;
1096 for (i = 0; i < n_basic_blocks; i++)
1097 regmove_bb_head[INSN_UID (BLOCK_HEAD (i))] = i;
1099 /* A forward/backward pass. Replace output operands with input operands. */
1101 for (pass = 0; pass <= 2; pass++)
1103 if (! flag_regmove && pass >= flag_expensive_optimizations)
1104 goto done;
1106 if (regmove_dump_file)
1107 fprintf (regmove_dump_file, "Starting %s pass...\n",
1108 pass ? "backward" : "forward");
1110 for (insn = pass ? get_last_insn () : f; insn;
1111 insn = pass ? PREV_INSN (insn) : NEXT_INSN (insn))
1113 rtx set;
1114 int op_no, match_no;
1116 set = single_set (insn);
1117 if (! set)
1118 continue;
1120 if (flag_expensive_optimizations && ! pass
1121 && (GET_CODE (SET_SRC (set)) == SIGN_EXTEND
1122 || GET_CODE (SET_SRC (set)) == ZERO_EXTEND)
1123 && GET_CODE (XEXP (SET_SRC (set), 0)) == REG
1124 && GET_CODE (SET_DEST(set)) == REG)
1125 optimize_reg_copy_3 (insn, SET_DEST (set), SET_SRC (set));
1127 if (flag_expensive_optimizations && ! pass
1128 && GET_CODE (SET_SRC (set)) == REG
1129 && GET_CODE (SET_DEST(set)) == REG)
1131 /* If this is a register-register copy where SRC is not dead,
1132 see if we can optimize it. If this optimization succeeds,
1133 it will become a copy where SRC is dead. */
1134 if ((find_reg_note (insn, REG_DEAD, SET_SRC (set))
1135 || optimize_reg_copy_1 (insn, SET_DEST (set), SET_SRC (set)))
1136 && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
1138 /* Similarly for a pseudo-pseudo copy when SRC is dead. */
1139 if (REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER)
1140 optimize_reg_copy_2 (insn, SET_DEST (set), SET_SRC (set));
1141 if (regno_src_regno[REGNO (SET_DEST (set))] < 0
1142 && SET_SRC (set) != SET_DEST (set))
1144 int srcregno = REGNO (SET_SRC(set));
1145 if (regno_src_regno[srcregno] >= 0)
1146 srcregno = regno_src_regno[srcregno];
1147 regno_src_regno[REGNO (SET_DEST (set))] = srcregno;
1151 if (! flag_regmove)
1152 continue;
1154 if (! find_matches (insn, &match))
1155 continue;
1157 /* Now scan through the operands looking for a source operand
1158 which is supposed to match the destination operand.
1159 Then scan forward for an instruction which uses the dest
1160 operand.
1161 If it dies there, then replace the dest in both operands with
1162 the source operand. */
1164 for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1166 rtx src, dst, src_subreg;
1167 enum reg_class src_class, dst_class;
1169 match_no = match.with[op_no];
1171 /* Nothing to do if the two operands aren't supposed to match. */
1172 if (match_no < 0)
1173 continue;
1175 src = recog_data.operand[op_no];
1176 dst = recog_data.operand[match_no];
1178 if (GET_CODE (src) != REG)
1179 continue;
1181 src_subreg = src;
1182 if (GET_CODE (dst) == SUBREG
1183 && GET_MODE_SIZE (GET_MODE (dst))
1184 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dst))))
1186 src_subreg
1187 = gen_rtx_SUBREG (GET_MODE (SUBREG_REG (dst)),
1188 src, SUBREG_BYTE (dst));
1189 dst = SUBREG_REG (dst);
1191 if (GET_CODE (dst) != REG
1192 || REGNO (dst) < FIRST_PSEUDO_REGISTER)
1193 continue;
1195 if (REGNO (src) < FIRST_PSEUDO_REGISTER)
1197 if (match.commutative[op_no] < op_no)
1198 regno_src_regno[REGNO (dst)] = REGNO (src);
1199 continue;
1202 if (REG_LIVE_LENGTH (REGNO (src)) < 0)
1203 continue;
1205 /* op_no/src must be a read-only operand, and
1206 match_operand/dst must be a write-only operand. */
1207 if (match.use[op_no] != READ
1208 || match.use[match_no] != WRITE)
1209 continue;
1211 if (match.early_clobber[match_no]
1212 && count_occurrences (PATTERN (insn), src, 0) > 1)
1213 continue;
1215 /* Make sure match_operand is the destination. */
1216 if (recog_data.operand[match_no] != SET_DEST (set))
1217 continue;
1219 /* If the operands already match, then there is nothing to do. */
1220 if (operands_match_p (src, dst))
1221 continue;
1223 /* But in the commutative case, we might find a better match. */
1224 if (match.commutative[op_no] >= 0)
1226 rtx comm = recog_data.operand[match.commutative[op_no]];
1227 if (operands_match_p (comm, dst)
1228 && (replacement_quality (comm)
1229 >= replacement_quality (src)))
1230 continue;
1233 src_class = reg_preferred_class (REGNO (src));
1234 dst_class = reg_preferred_class (REGNO (dst));
1235 if (! regclass_compatible_p (src_class, dst_class))
1236 continue;
1238 if (fixup_match_1 (insn, set, src, src_subreg, dst, pass,
1239 op_no, match_no,
1240 regmove_dump_file))
1241 break;
1246 /* A backward pass. Replace input operands with output operands. */
1248 if (regmove_dump_file)
1249 fprintf (regmove_dump_file, "Starting backward pass...\n");
1251 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
1253 if (INSN_P (insn))
1255 int op_no, match_no;
1256 int success = 0;
1258 if (! find_matches (insn, &match))
1259 continue;
1261 /* Now scan through the operands looking for a destination operand
1262 which is supposed to match a source operand.
1263 Then scan backward for an instruction which sets the source
1264 operand. If safe, then replace the source operand with the
1265 dest operand in both instructions. */
1267 copy_src = NULL_RTX;
1268 copy_dst = NULL_RTX;
1269 for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1271 rtx set, p, src, dst;
1272 rtx src_note, dst_note;
1273 int num_calls = 0;
1274 enum reg_class src_class, dst_class;
1275 int length;
1277 match_no = match.with[op_no];
1279 /* Nothing to do if the two operands aren't supposed to match. */
1280 if (match_no < 0)
1281 continue;
1283 dst = recog_data.operand[match_no];
1284 src = recog_data.operand[op_no];
1286 if (GET_CODE (src) != REG)
1287 continue;
1289 if (GET_CODE (dst) != REG
1290 || REGNO (dst) < FIRST_PSEUDO_REGISTER
1291 || REG_LIVE_LENGTH (REGNO (dst)) < 0
1292 || RTX_UNCHANGING_P (dst))
1293 continue;
1295 /* If the operands already match, then there is nothing to do. */
1296 if (operands_match_p (src, dst))
1297 continue;
1299 if (match.commutative[op_no] >= 0)
1301 rtx comm = recog_data.operand[match.commutative[op_no]];
1302 if (operands_match_p (comm, dst))
1303 continue;
1306 set = single_set (insn);
1307 if (! set)
1308 continue;
1310 /* match_no/dst must be a write-only operand, and
1311 operand_operand/src must be a read-only operand. */
1312 if (match.use[op_no] != READ
1313 || match.use[match_no] != WRITE)
1314 continue;
1316 if (match.early_clobber[match_no]
1317 && count_occurrences (PATTERN (insn), src, 0) > 1)
1318 continue;
1320 /* Make sure match_no is the destination. */
1321 if (recog_data.operand[match_no] != SET_DEST (set))
1322 continue;
1324 if (REGNO (src) < FIRST_PSEUDO_REGISTER)
1326 if (GET_CODE (SET_SRC (set)) == PLUS
1327 && GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT
1328 && XEXP (SET_SRC (set), 0) == src
1329 && fixup_match_2 (insn, dst, src,
1330 XEXP (SET_SRC (set), 1),
1331 regmove_dump_file))
1332 break;
1333 continue;
1335 src_class = reg_preferred_class (REGNO (src));
1336 dst_class = reg_preferred_class (REGNO (dst));
1337 if (! regclass_compatible_p (src_class, dst_class))
1339 if (!copy_src)
1341 copy_src = src;
1342 copy_dst = dst;
1344 continue;
1347 /* Can not modify an earlier insn to set dst if this insn
1348 uses an old value in the source. */
1349 if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
1351 if (!copy_src)
1353 copy_src = src;
1354 copy_dst = dst;
1356 continue;
1359 if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
1361 if (!copy_src)
1363 copy_src = src;
1364 copy_dst = dst;
1366 continue;
1370 /* If src is set once in a different basic block,
1371 and is set equal to a constant, then do not use
1372 it for this optimization, as this would make it
1373 no longer equivalent to a constant. */
1375 if (reg_is_remote_constant_p (src, insn, f))
1377 if (!copy_src)
1379 copy_src = src;
1380 copy_dst = dst;
1382 continue;
1386 if (regmove_dump_file)
1387 fprintf (regmove_dump_file,
1388 "Could fix operand %d of insn %d matching operand %d.\n",
1389 op_no, INSN_UID (insn), match_no);
1391 /* Scan backward to find the first instruction that uses
1392 the input operand. If the operand is set here, then
1393 replace it in both instructions with match_no. */
1395 for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
1397 rtx pset;
1399 /* ??? We can't scan past the end of a basic block without
1400 updating the register lifetime info
1401 (REG_DEAD/basic_block_live_at_start). */
1402 if (perhaps_ends_bb_p (p))
1403 break;
1404 else if (! INSN_P (p))
1405 continue;
1407 length++;
1409 /* ??? See if all of SRC is set in P. This test is much
1410 more conservative than it needs to be. */
1411 pset = single_set (p);
1412 if (pset && SET_DEST (pset) == src)
1414 /* We use validate_replace_rtx, in case there
1415 are multiple identical source operands. All of
1416 them have to be changed at the same time. */
1417 if (validate_replace_rtx (src, dst, insn))
1419 if (validate_change (p, &SET_DEST (pset),
1420 dst, 0))
1421 success = 1;
1422 else
1424 /* Change all source operands back.
1425 This modifies the dst as a side-effect. */
1426 validate_replace_rtx (dst, src, insn);
1427 /* Now make sure the dst is right. */
1428 validate_change (insn,
1429 recog_data.operand_loc[match_no],
1430 dst, 0);
1433 break;
1436 if (reg_overlap_mentioned_p (src, PATTERN (p))
1437 || reg_overlap_mentioned_p (dst, PATTERN (p)))
1438 break;
1440 /* If we have passed a call instruction, and the
1441 pseudo-reg DST is not already live across a call,
1442 then don't perform the optimization. */
1443 if (GET_CODE (p) == CALL_INSN)
1445 num_calls++;
1447 if (REG_N_CALLS_CROSSED (REGNO (dst)) == 0)
1448 break;
1452 if (success)
1454 int dstno, srcno;
1456 /* Remove the death note for SRC from INSN. */
1457 remove_note (insn, src_note);
1458 /* Move the death note for SRC to P if it is used
1459 there. */
1460 if (reg_overlap_mentioned_p (src, PATTERN (p)))
1462 XEXP (src_note, 1) = REG_NOTES (p);
1463 REG_NOTES (p) = src_note;
1465 /* If there is a REG_DEAD note for DST on P, then remove
1466 it, because DST is now set there. */
1467 if ((dst_note = find_reg_note (p, REG_DEAD, dst)))
1468 remove_note (p, dst_note);
1470 dstno = REGNO (dst);
1471 srcno = REGNO (src);
1473 REG_N_SETS (dstno)++;
1474 REG_N_SETS (srcno)--;
1476 REG_N_CALLS_CROSSED (dstno) += num_calls;
1477 REG_N_CALLS_CROSSED (srcno) -= num_calls;
1479 REG_LIVE_LENGTH (dstno) += length;
1480 if (REG_LIVE_LENGTH (srcno) >= 0)
1482 REG_LIVE_LENGTH (srcno) -= length;
1483 /* REG_LIVE_LENGTH is only an approximation after
1484 combine if sched is not run, so make sure that we
1485 still have a reasonable value. */
1486 if (REG_LIVE_LENGTH (srcno) < 2)
1487 REG_LIVE_LENGTH (srcno) = 2;
1490 if (regmove_dump_file)
1491 fprintf (regmove_dump_file,
1492 "Fixed operand %d of insn %d matching operand %d.\n",
1493 op_no, INSN_UID (insn), match_no);
1495 break;
1499 /* If we weren't able to replace any of the alternatives, try an
1500 alternative appoach of copying the source to the destination. */
1501 if (!success && copy_src != NULL_RTX)
1502 copy_src_to_dest (insn, copy_src, copy_dst, old_max_uid);
1507 /* In fixup_match_1, some insns may have been inserted after basic block
1508 ends. Fix that here. */
1509 for (i = 0; i < n_basic_blocks; i++)
1511 rtx end = BLOCK_END (i);
1512 rtx new = end;
1513 rtx next = NEXT_INSN (new);
1514 while (next != 0 && INSN_UID (next) >= old_max_uid
1515 && (i == n_basic_blocks - 1 || BLOCK_HEAD (i + 1) != next))
1516 new = next, next = NEXT_INSN (new);
1517 BLOCK_END (i) = new;
1520 done:
1521 /* Clean up. */
1522 free (regno_src_regno);
1523 free (regmove_bb_head);
1526 /* Returns nonzero if INSN's pattern has matching constraints for any operand.
1527 Returns 0 if INSN can't be recognized, or if the alternative can't be
1528 determined.
1530 Initialize the info in MATCHP based on the constraints. */
1532 static int
1533 find_matches (insn, matchp)
1534 rtx insn;
1535 struct match *matchp;
1537 int likely_spilled[MAX_RECOG_OPERANDS];
1538 int op_no;
1539 int any_matches = 0;
1541 extract_insn (insn);
1542 if (! constrain_operands (0))
1543 return 0;
1545 /* Must initialize this before main loop, because the code for
1546 the commutative case may set matches for operands other than
1547 the current one. */
1548 for (op_no = recog_data.n_operands; --op_no >= 0; )
1549 matchp->with[op_no] = matchp->commutative[op_no] = -1;
1551 for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1553 const char *p;
1554 char c;
1555 int i = 0;
1557 p = recog_data.constraints[op_no];
1559 likely_spilled[op_no] = 0;
1560 matchp->use[op_no] = READ;
1561 matchp->early_clobber[op_no] = 0;
1562 if (*p == '=')
1563 matchp->use[op_no] = WRITE;
1564 else if (*p == '+')
1565 matchp->use[op_no] = READWRITE;
1567 for (;*p && i < which_alternative; p++)
1568 if (*p == ',')
1569 i++;
1571 while ((c = *p++) != '\0' && c != ',')
1572 switch (c)
1574 case '=':
1575 break;
1576 case '+':
1577 break;
1578 case '&':
1579 matchp->early_clobber[op_no] = 1;
1580 break;
1581 case '%':
1582 matchp->commutative[op_no] = op_no + 1;
1583 matchp->commutative[op_no + 1] = op_no;
1584 break;
1585 case '0': case '1': case '2': case '3': case '4':
1586 case '5': case '6': case '7': case '8': case '9':
1587 c -= '0';
1588 if (c < op_no && likely_spilled[(unsigned char) c])
1589 break;
1590 matchp->with[op_no] = c;
1591 any_matches = 1;
1592 if (matchp->commutative[op_no] >= 0)
1593 matchp->with[matchp->commutative[op_no]] = c;
1594 break;
1595 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'h':
1596 case 'j': case 'k': case 'l': case 'p': case 'q': case 't': case 'u':
1597 case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B':
1598 case 'C': case 'D': case 'W': case 'Y': case 'Z':
1599 if (CLASS_LIKELY_SPILLED_P (REG_CLASS_FROM_LETTER ((unsigned char)c)))
1600 likely_spilled[op_no] = 1;
1601 break;
1604 return any_matches;
1607 /* Try to replace all occurrences of DST_REG with SRC in LOC, that is
1608 assumed to be in INSN. */
1610 static void
1611 replace_in_call_usage (loc, dst_reg, src, insn)
1612 rtx *loc;
1613 int dst_reg;
1614 rtx src;
1615 rtx insn;
1617 rtx x = *loc;
1618 enum rtx_code code;
1619 const char *fmt;
1620 int i, j;
1622 if (! x)
1623 return;
1625 code = GET_CODE (x);
1626 if (code == REG)
1628 if (REGNO (x) != dst_reg)
1629 return;
1631 validate_change (insn, loc, src, 1);
1633 return;
1636 /* Process each of our operands recursively. */
1637 fmt = GET_RTX_FORMAT (code);
1638 for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
1639 if (*fmt == 'e')
1640 replace_in_call_usage (&XEXP (x, i), dst_reg, src, insn);
1641 else if (*fmt == 'E')
1642 for (j = 0; j < XVECLEN (x, i); j++)
1643 replace_in_call_usage (& XVECEXP (x, i, j), dst_reg, src, insn);
1646 /* Try to replace output operand DST in SET, with input operand SRC. SET is
1647 the only set in INSN. INSN has just been recognized and constrained.
1648 SRC is operand number OPERAND_NUMBER in INSN.
1649 DST is operand number MATCH_NUMBER in INSN.
1650 If BACKWARD is nonzero, we have been called in a backward pass.
1651 Return nonzero for success. */
1653 static int
1654 fixup_match_1 (insn, set, src, src_subreg, dst, backward, operand_number,
1655 match_number, regmove_dump_file)
1656 rtx insn, set, src, src_subreg, dst;
1657 int backward, operand_number, match_number;
1658 FILE *regmove_dump_file;
1660 rtx p;
1661 rtx post_inc = 0, post_inc_set = 0, search_end = 0;
1662 int success = 0;
1663 int num_calls = 0, s_num_calls = 0;
1664 enum rtx_code code = NOTE;
1665 HOST_WIDE_INT insn_const = 0, newconst;
1666 rtx overlap = 0; /* need to move insn ? */
1667 rtx src_note = find_reg_note (insn, REG_DEAD, src), dst_note = NULL_RTX;
1668 int length, s_length;
1670 /* If SRC is marked as unchanging, we may not change it.
1671 ??? Maybe we could get better code by removing the unchanging bit
1672 instead, and changing it back if we don't succeed? */
1673 if (RTX_UNCHANGING_P (src))
1674 return 0;
1676 if (! src_note)
1678 /* Look for (set (regX) (op regA constX))
1679 (set (regY) (op regA constY))
1680 and change that to
1681 (set (regA) (op regA constX)).
1682 (set (regY) (op regA constY-constX)).
1683 This works for add and shift operations, if
1684 regA is dead after or set by the second insn. */
1686 code = GET_CODE (SET_SRC (set));
1687 if ((code == PLUS || code == LSHIFTRT
1688 || code == ASHIFT || code == ASHIFTRT)
1689 && XEXP (SET_SRC (set), 0) == src
1690 && GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT)
1691 insn_const = INTVAL (XEXP (SET_SRC (set), 1));
1692 else if (! stable_and_no_regs_but_for_p (SET_SRC (set), src, dst))
1693 return 0;
1694 else
1695 /* We might find a src_note while scanning. */
1696 code = NOTE;
1699 if (regmove_dump_file)
1700 fprintf (regmove_dump_file,
1701 "Could fix operand %d of insn %d matching operand %d.\n",
1702 operand_number, INSN_UID (insn), match_number);
1704 /* If SRC is equivalent to a constant set in a different basic block,
1705 then do not use it for this optimization. We want the equivalence
1706 so that if we have to reload this register, we can reload the
1707 constant, rather than extending the lifespan of the register. */
1708 if (reg_is_remote_constant_p (src, insn, get_insns ()))
1709 return 0;
1711 /* Scan forward to find the next instruction that
1712 uses the output operand. If the operand dies here,
1713 then replace it in both instructions with
1714 operand_number. */
1716 for (length = s_length = 0, p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
1718 if (GET_CODE (p) == CALL_INSN)
1719 replace_in_call_usage (& CALL_INSN_FUNCTION_USAGE (p),
1720 REGNO (dst), src, p);
1722 /* ??? We can't scan past the end of a basic block without updating
1723 the register lifetime info (REG_DEAD/basic_block_live_at_start). */
1724 if (perhaps_ends_bb_p (p))
1725 break;
1726 else if (! INSN_P (p))
1727 continue;
1729 length++;
1730 if (src_note)
1731 s_length++;
1733 if (reg_set_p (src, p) || reg_set_p (dst, p)
1734 || (GET_CODE (PATTERN (p)) == USE
1735 && reg_overlap_mentioned_p (src, XEXP (PATTERN (p), 0))))
1736 break;
1738 /* See if all of DST dies in P. This test is
1739 slightly more conservative than it needs to be. */
1740 if ((dst_note = find_regno_note (p, REG_DEAD, REGNO (dst)))
1741 && (GET_MODE (XEXP (dst_note, 0)) == GET_MODE (dst)))
1743 /* If we would be moving INSN, check that we won't move it
1744 into the shadow of a live a live flags register. */
1745 /* ??? We only try to move it in front of P, although
1746 we could move it anywhere between OVERLAP and P. */
1747 if (overlap && GET_MODE (PREV_INSN (p)) != VOIDmode)
1748 break;
1750 if (! src_note)
1752 rtx q;
1753 rtx set2 = NULL_RTX;
1755 /* If an optimization is done, the value of SRC while P
1756 is executed will be changed. Check that this is OK. */
1757 if (reg_overlap_mentioned_p (src, PATTERN (p)))
1758 break;
1759 for (q = p; q; q = NEXT_INSN (q))
1761 /* ??? We can't scan past the end of a basic block without
1762 updating the register lifetime info
1763 (REG_DEAD/basic_block_live_at_start). */
1764 if (perhaps_ends_bb_p (q))
1766 q = 0;
1767 break;
1769 else if (! INSN_P (q))
1770 continue;
1771 else if (reg_overlap_mentioned_p (src, PATTERN (q))
1772 || reg_set_p (src, q))
1773 break;
1775 if (q)
1776 set2 = single_set (q);
1777 if (! q || ! set2 || GET_CODE (SET_SRC (set2)) != code
1778 || XEXP (SET_SRC (set2), 0) != src
1779 || GET_CODE (XEXP (SET_SRC (set2), 1)) != CONST_INT
1780 || (SET_DEST (set2) != src
1781 && ! find_reg_note (q, REG_DEAD, src)))
1783 /* If this is a PLUS, we can still save a register by doing
1784 src += insn_const;
1786 src -= insn_const; .
1787 This also gives opportunities for subsequent
1788 optimizations in the backward pass, so do it there. */
1789 if (code == PLUS && backward
1790 /* Don't do this if we can likely tie DST to SET_DEST
1791 of P later; we can't do this tying here if we got a
1792 hard register. */
1793 && ! (dst_note && ! REG_N_CALLS_CROSSED (REGNO (dst))
1794 && single_set (p)
1795 && GET_CODE (SET_DEST (single_set (p))) == REG
1796 && (REGNO (SET_DEST (single_set (p)))
1797 < FIRST_PSEUDO_REGISTER))
1798 /* We may only emit an insn directly after P if we
1799 are not in the shadow of a live flags register. */
1800 && GET_MODE (p) == VOIDmode)
1802 search_end = q;
1803 q = insn;
1804 set2 = set;
1805 newconst = -insn_const;
1806 code = MINUS;
1808 else
1809 break;
1811 else
1813 newconst = INTVAL (XEXP (SET_SRC (set2), 1)) - insn_const;
1814 /* Reject out of range shifts. */
1815 if (code != PLUS
1816 && (newconst < 0
1817 || ((unsigned HOST_WIDE_INT) newconst
1818 >= (GET_MODE_BITSIZE (GET_MODE
1819 (SET_SRC (set2)))))))
1820 break;
1821 if (code == PLUS)
1823 post_inc = q;
1824 if (SET_DEST (set2) != src)
1825 post_inc_set = set2;
1828 /* We use 1 as last argument to validate_change so that all
1829 changes are accepted or rejected together by apply_change_group
1830 when it is called by validate_replace_rtx . */
1831 validate_change (q, &XEXP (SET_SRC (set2), 1),
1832 GEN_INT (newconst), 1);
1834 validate_change (insn, recog_data.operand_loc[match_number], src, 1);
1835 if (validate_replace_rtx (dst, src_subreg, p))
1836 success = 1;
1837 break;
1840 if (reg_overlap_mentioned_p (dst, PATTERN (p)))
1841 break;
1842 if (! src_note && reg_overlap_mentioned_p (src, PATTERN (p)))
1844 /* INSN was already checked to be movable wrt. the registers that it
1845 sets / uses when we found no REG_DEAD note for src on it, but it
1846 still might clobber the flags register. We'll have to check that
1847 we won't insert it into the shadow of a live flags register when
1848 we finally know where we are to move it. */
1849 overlap = p;
1850 src_note = find_reg_note (p, REG_DEAD, src);
1853 /* If we have passed a call instruction, and the pseudo-reg SRC is not
1854 already live across a call, then don't perform the optimization. */
1855 if (GET_CODE (p) == CALL_INSN)
1857 if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
1858 break;
1860 num_calls++;
1862 if (src_note)
1863 s_num_calls++;
1868 if (! success)
1869 return 0;
1871 /* Remove the death note for DST from P. */
1872 remove_note (p, dst_note);
1873 if (code == MINUS)
1875 post_inc = emit_insn_after (copy_rtx (PATTERN (insn)), p);
1876 if ((HAVE_PRE_INCREMENT || HAVE_PRE_DECREMENT)
1877 && search_end
1878 && try_auto_increment (search_end, post_inc, 0, src, newconst, 1))
1879 post_inc = 0;
1880 validate_change (insn, &XEXP (SET_SRC (set), 1), GEN_INT (insn_const), 0);
1881 REG_N_SETS (REGNO (src))++;
1882 REG_LIVE_LENGTH (REGNO (src))++;
1884 if (overlap)
1886 /* The lifetime of src and dest overlap,
1887 but we can change this by moving insn. */
1888 rtx pat = PATTERN (insn);
1889 if (src_note)
1890 remove_note (overlap, src_note);
1891 if ((HAVE_POST_INCREMENT || HAVE_POST_DECREMENT)
1892 && code == PLUS
1893 && try_auto_increment (overlap, insn, 0, src, insn_const, 0))
1894 insn = overlap;
1895 else
1897 rtx notes = REG_NOTES (insn);
1899 emit_insn_after_with_line_notes (pat, PREV_INSN (p), insn);
1900 PUT_CODE (insn, NOTE);
1901 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
1902 NOTE_SOURCE_FILE (insn) = 0;
1903 /* emit_insn_after_with_line_notes has no
1904 return value, so search for the new insn. */
1905 insn = p;
1906 while (! INSN_P (insn) || PATTERN (insn) != pat)
1907 insn = PREV_INSN (insn);
1909 REG_NOTES (insn) = notes;
1912 /* Sometimes we'd generate src = const; src += n;
1913 if so, replace the instruction that set src
1914 in the first place. */
1916 if (! overlap && (code == PLUS || code == MINUS))
1918 rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
1919 rtx q, set2 = NULL_RTX;
1920 int num_calls2 = 0, s_length2 = 0;
1922 if (note && CONSTANT_P (XEXP (note, 0)))
1924 for (q = PREV_INSN (insn); q; q = PREV_INSN(q))
1926 /* ??? We can't scan past the end of a basic block without
1927 updating the register lifetime info
1928 (REG_DEAD/basic_block_live_at_start). */
1929 if (perhaps_ends_bb_p (q))
1931 q = 0;
1932 break;
1934 else if (! INSN_P (q))
1935 continue;
1937 s_length2++;
1938 if (reg_set_p (src, q))
1940 set2 = single_set (q);
1941 break;
1943 if (reg_overlap_mentioned_p (src, PATTERN (q)))
1945 q = 0;
1946 break;
1948 if (GET_CODE (p) == CALL_INSN)
1949 num_calls2++;
1951 if (q && set2 && SET_DEST (set2) == src && CONSTANT_P (SET_SRC (set2))
1952 && validate_change (insn, &SET_SRC (set), XEXP (note, 0), 0))
1954 PUT_CODE (q, NOTE);
1955 NOTE_LINE_NUMBER (q) = NOTE_INSN_DELETED;
1956 NOTE_SOURCE_FILE (q) = 0;
1957 REG_N_SETS (REGNO (src))--;
1958 REG_N_CALLS_CROSSED (REGNO (src)) -= num_calls2;
1959 REG_LIVE_LENGTH (REGNO (src)) -= s_length2;
1960 insn_const = 0;
1965 if ((HAVE_PRE_INCREMENT || HAVE_PRE_DECREMENT)
1966 && (code == PLUS || code == MINUS) && insn_const
1967 && try_auto_increment (p, insn, 0, src, insn_const, 1))
1968 insn = p;
1969 else if ((HAVE_POST_INCREMENT || HAVE_POST_DECREMENT)
1970 && post_inc
1971 && try_auto_increment (p, post_inc, post_inc_set, src, newconst, 0))
1972 post_inc = 0;
1973 /* If post_inc still prevails, try to find an
1974 insn where it can be used as a pre-in/decrement.
1975 If code is MINUS, this was already tried. */
1976 if (post_inc && code == PLUS
1977 /* Check that newconst is likely to be usable
1978 in a pre-in/decrement before starting the search. */
1979 && ((HAVE_PRE_INCREMENT && newconst > 0 && newconst <= MOVE_MAX)
1980 || (HAVE_PRE_DECREMENT && newconst < 0 && newconst >= -MOVE_MAX))
1981 && exact_log2 (newconst))
1983 rtx q, inc_dest;
1985 inc_dest = post_inc_set ? SET_DEST (post_inc_set) : src;
1986 for (q = post_inc; (q = NEXT_INSN (q)); )
1988 /* ??? We can't scan past the end of a basic block without updating
1989 the register lifetime info
1990 (REG_DEAD/basic_block_live_at_start). */
1991 if (perhaps_ends_bb_p (q))
1992 break;
1993 else if (! INSN_P (q))
1994 continue;
1995 else if (src != inc_dest
1996 && (reg_overlap_mentioned_p (src, PATTERN (q))
1997 || reg_set_p (src, q)))
1998 break;
1999 else if (reg_set_p (inc_dest, q))
2000 break;
2001 else if (reg_overlap_mentioned_p (inc_dest, PATTERN (q)))
2003 try_auto_increment (q, post_inc,
2004 post_inc_set, inc_dest, newconst, 1);
2005 break;
2010 /* Move the death note for DST to INSN if it is used
2011 there. */
2012 if (reg_overlap_mentioned_p (dst, PATTERN (insn)))
2014 XEXP (dst_note, 1) = REG_NOTES (insn);
2015 REG_NOTES (insn) = dst_note;
2018 if (src_note)
2020 /* Move the death note for SRC from INSN to P. */
2021 if (! overlap)
2022 remove_note (insn, src_note);
2023 XEXP (src_note, 1) = REG_NOTES (p);
2024 REG_NOTES (p) = src_note;
2026 REG_N_CALLS_CROSSED (REGNO (src)) += s_num_calls;
2029 REG_N_SETS (REGNO (src))++;
2030 REG_N_SETS (REGNO (dst))--;
2032 REG_N_CALLS_CROSSED (REGNO (dst)) -= num_calls;
2034 REG_LIVE_LENGTH (REGNO (src)) += s_length;
2035 if (REG_LIVE_LENGTH (REGNO (dst)) >= 0)
2037 REG_LIVE_LENGTH (REGNO (dst)) -= length;
2038 /* REG_LIVE_LENGTH is only an approximation after
2039 combine if sched is not run, so make sure that we
2040 still have a reasonable value. */
2041 if (REG_LIVE_LENGTH (REGNO (dst)) < 2)
2042 REG_LIVE_LENGTH (REGNO (dst)) = 2;
2044 if (regmove_dump_file)
2045 fprintf (regmove_dump_file,
2046 "Fixed operand %d of insn %d matching operand %d.\n",
2047 operand_number, INSN_UID (insn), match_number);
2048 return 1;
2052 /* return nonzero if X is stable and mentions no regsiters but for
2053 mentioning SRC or mentioning / changing DST . If in doubt, presume
2054 it is unstable.
2055 The rationale is that we want to check if we can move an insn easily
2056 while just paying attention to SRC and DST. A register is considered
2057 stable if it has the RTX_UNCHANGING_P bit set, but that would still
2058 leave the burden to update REG_DEAD / REG_UNUSED notes, so we don't
2059 want any registers but SRC and DST. */
2060 static int
2061 stable_and_no_regs_but_for_p (x, src, dst)
2062 rtx x, src, dst;
2064 RTX_CODE code = GET_CODE (x);
2065 switch (GET_RTX_CLASS (code))
2067 case '<': case '1': case 'c': case '2': case 'b': case '3':
2069 int i;
2070 const char *fmt = GET_RTX_FORMAT (code);
2071 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2072 if (fmt[i] == 'e'
2073 && ! stable_and_no_regs_but_for_p (XEXP (x, i), src, dst))
2074 return 0;
2075 return 1;
2077 case 'o':
2078 if (code == REG)
2079 return x == src || x == dst;
2080 /* If this is a MEM, look inside - there might be a register hidden in
2081 the address of an unchanging MEM. */
2082 if (code == MEM
2083 && ! stable_and_no_regs_but_for_p (XEXP (x, 0), src, dst))
2084 return 0;
2085 /* fall through */
2086 default:
2087 return ! rtx_unstable_p (x);
2091 /* Track stack adjustments and stack memory references. Attempt to
2092 reduce the number of stack adjustments by back-propogating across
2093 the memory references.
2095 This is intended primarily for use with targets that do not define
2096 ACCUMULATE_OUTGOING_ARGS. It is of significantly more value to
2097 targets that define PREFERRED_STACK_BOUNDARY more aligned than
2098 STACK_BOUNDARY (e.g. x86), or if not all registers can be pushed
2099 (e.g. x86 fp regs) which would ordinarily have to be implemented
2100 as a sub/mov pair due to restrictions in calls.c.
2102 Propogation stops when any of the insns that need adjusting are
2103 (a) no longer valid because we've exceeded their range, (b) a
2104 non-trivial push instruction, or (c) a call instruction.
2106 Restriction B is based on the assumption that push instructions
2107 are smaller or faster. If a port really wants to remove all
2108 pushes, it should have defined ACCUMULATE_OUTGOING_ARGS. The
2109 one exception that is made is for an add immediately followed
2110 by a push. */
2112 /* This structure records stack memory references between stack adjusting
2113 instructions. */
2115 struct csa_memlist
2117 HOST_WIDE_INT sp_offset;
2118 rtx insn, *mem;
2119 struct csa_memlist *next;
2122 static int stack_memref_p PARAMS ((rtx));
2123 static rtx single_set_for_csa PARAMS ((rtx));
2124 static void free_csa_memlist PARAMS ((struct csa_memlist *));
2125 static struct csa_memlist *record_one_stack_memref
2126 PARAMS ((rtx, rtx *, struct csa_memlist *));
2127 static int try_apply_stack_adjustment
2128 PARAMS ((rtx, struct csa_memlist *, HOST_WIDE_INT, HOST_WIDE_INT));
2129 static void combine_stack_adjustments_for_block PARAMS ((basic_block));
2130 static int record_stack_memrefs PARAMS ((rtx *, void *));
2133 /* Main entry point for stack adjustment combination. */
2135 void
2136 combine_stack_adjustments ()
2138 int i;
2140 for (i = 0; i < n_basic_blocks; ++i)
2141 combine_stack_adjustments_for_block (BASIC_BLOCK (i));
2144 /* Recognize a MEM of the form (sp) or (plus sp const). */
2146 static int
2147 stack_memref_p (x)
2148 rtx x;
2150 if (GET_CODE (x) != MEM)
2151 return 0;
2152 x = XEXP (x, 0);
2154 if (x == stack_pointer_rtx)
2155 return 1;
2156 if (GET_CODE (x) == PLUS
2157 && XEXP (x, 0) == stack_pointer_rtx
2158 && GET_CODE (XEXP (x, 1)) == CONST_INT)
2159 return 1;
2161 return 0;
2164 /* Recognize either normal single_set or the hack in i386.md for
2165 tying fp and sp adjustments. */
2167 static rtx
2168 single_set_for_csa (insn)
2169 rtx insn;
2171 int i;
2172 rtx tmp = single_set (insn);
2173 if (tmp)
2174 return tmp;
2176 if (GET_CODE (insn) != INSN
2177 || GET_CODE (PATTERN (insn)) != PARALLEL)
2178 return NULL_RTX;
2180 tmp = PATTERN (insn);
2181 if (GET_CODE (XVECEXP (tmp, 0, 0)) != SET)
2182 return NULL_RTX;
2184 for (i = 1; i < XVECLEN (tmp, 0); ++i)
2186 rtx this = XVECEXP (tmp, 0, i);
2188 /* The special case is allowing a no-op set. */
2189 if (GET_CODE (this) == SET
2190 && SET_SRC (this) == SET_DEST (this))
2192 else if (GET_CODE (this) != CLOBBER
2193 && GET_CODE (this) != USE)
2194 return NULL_RTX;
2197 return XVECEXP (tmp, 0, 0);
2200 /* Free the list of csa_memlist nodes. */
2202 static void
2203 free_csa_memlist (memlist)
2204 struct csa_memlist *memlist;
2206 struct csa_memlist *next;
2207 for (; memlist ; memlist = next)
2209 next = memlist->next;
2210 free (memlist);
2214 /* Create a new csa_memlist node from the given memory reference.
2215 It is already known that the memory is stack_memref_p. */
2217 static struct csa_memlist *
2218 record_one_stack_memref (insn, mem, next_memlist)
2219 rtx insn, *mem;
2220 struct csa_memlist *next_memlist;
2222 struct csa_memlist *ml;
2224 ml = (struct csa_memlist *) xmalloc (sizeof (*ml));
2226 if (XEXP (*mem, 0) == stack_pointer_rtx)
2227 ml->sp_offset = 0;
2228 else
2229 ml->sp_offset = INTVAL (XEXP (XEXP (*mem, 0), 1));
2231 ml->insn = insn;
2232 ml->mem = mem;
2233 ml->next = next_memlist;
2235 return ml;
2238 /* Attempt to apply ADJUST to the stack adjusting insn INSN, as well
2239 as each of the memories in MEMLIST. Return true on success. */
2241 static int
2242 try_apply_stack_adjustment (insn, memlist, new_adjust, delta)
2243 rtx insn;
2244 struct csa_memlist *memlist;
2245 HOST_WIDE_INT new_adjust, delta;
2247 struct csa_memlist *ml;
2248 rtx set;
2250 set = single_set_for_csa (insn);
2251 validate_change (insn, &XEXP (SET_SRC (set), 1), GEN_INT (new_adjust), 1);
2253 for (ml = memlist; ml ; ml = ml->next)
2255 HOST_WIDE_INT c = ml->sp_offset - delta;
2256 rtx new = gen_rtx_MEM (GET_MODE (*ml->mem),
2257 plus_constant (stack_pointer_rtx, c));
2259 MEM_COPY_ATTRIBUTES (new, *ml->mem);
2260 validate_change (ml->insn, ml->mem, new, 1);
2263 if (apply_change_group ())
2265 /* Succeeded. Update our knowledge of the memory references. */
2266 for (ml = memlist; ml ; ml = ml->next)
2267 ml->sp_offset -= delta;
2269 return 1;
2271 else
2272 return 0;
2275 /* Called via for_each_rtx and used to record all stack memory references in
2276 the insn and discard all other stack pointer references. */
2277 struct record_stack_memrefs_data
2279 rtx insn;
2280 struct csa_memlist *memlist;
2283 static int
2284 record_stack_memrefs (xp, data)
2285 rtx *xp;
2286 void *data;
2288 rtx x = *xp;
2289 struct record_stack_memrefs_data *d =
2290 (struct record_stack_memrefs_data *) data;
2291 if (!x)
2292 return 0;
2293 switch (GET_CODE (x))
2295 case MEM:
2296 if (!reg_mentioned_p (stack_pointer_rtx, x))
2297 return -1;
2298 /* We are not able to handle correctly all possible memrefs containing
2299 stack pointer, so this check is neccesary. */
2300 if (stack_memref_p (x))
2302 d->memlist = record_one_stack_memref (d->insn, xp, d->memlist);
2303 return -1;
2305 return 1;
2306 case REG:
2307 /* ??? We want be able to handle non-memory stack pointer
2308 references later. For now just discard all insns refering to
2309 stack pointer outside mem expressions. We would probably
2310 want to teach validate_replace to simplify expressions first.
2312 We can't just compare with STACK_POINTER_RTX because the
2313 reference to the stack pointer might be in some other mode.
2314 In particular, an explict clobber in an asm statement will
2315 result in a QImode clober. */
2316 if (REGNO (x) == STACK_POINTER_REGNUM)
2317 return 1;
2318 break;
2319 default:
2320 break;
2322 return 0;
2325 /* Subroutine of combine_stack_adjustments, called for each basic block. */
2327 static void
2328 combine_stack_adjustments_for_block (bb)
2329 basic_block bb;
2331 HOST_WIDE_INT last_sp_adjust = 0;
2332 rtx last_sp_set = NULL_RTX;
2333 struct csa_memlist *memlist = NULL;
2334 rtx pending_delete;
2335 rtx insn, next;
2336 struct record_stack_memrefs_data data;
2338 for (insn = bb->head; ; insn = next)
2340 rtx set;
2342 pending_delete = NULL_RTX;
2343 next = NEXT_INSN (insn);
2345 if (! INSN_P (insn))
2346 goto processed;
2348 set = single_set_for_csa (insn);
2349 if (set)
2351 rtx dest = SET_DEST (set);
2352 rtx src = SET_SRC (set);
2354 /* Find constant additions to the stack pointer. */
2355 if (dest == stack_pointer_rtx
2356 && GET_CODE (src) == PLUS
2357 && XEXP (src, 0) == stack_pointer_rtx
2358 && GET_CODE (XEXP (src, 1)) == CONST_INT)
2360 HOST_WIDE_INT this_adjust = INTVAL (XEXP (src, 1));
2362 /* If we've not seen an adjustment previously, record
2363 it now and continue. */
2364 if (! last_sp_set)
2366 last_sp_set = insn;
2367 last_sp_adjust = this_adjust;
2368 goto processed;
2371 /* If not all recorded memrefs can be adjusted, or the
2372 adjustment is now too large for a constant addition,
2373 we cannot merge the two stack adjustments.
2375 Also we need to be carefull to not move stack pointer
2376 such that we create stack accesses outside the allocated
2377 area. We can combine an allocation into the first insn,
2378 or a deallocation into the second insn. We can not
2379 combine an allocation followed by a deallocation.
2381 The only somewhat frequent ocurrence of the later is when
2382 a function allocates a stack frame but does not use it.
2383 For this case, we would need to analyze rtl stream to be
2384 sure that allocated area is really unused. This means not
2385 only checking the memory references, but also all registers
2386 or global memory references possibly containing a stack
2387 frame address.
2389 Perhaps the best way to address this problem is to teach
2390 gcc not to allocate stack for objects never used. */
2392 /* Combine an allocation into the first instruction. */
2393 if (STACK_GROWS_DOWNWARD ? this_adjust <= 0 : this_adjust >= 0)
2395 if (try_apply_stack_adjustment (last_sp_set, memlist,
2396 last_sp_adjust + this_adjust,
2397 this_adjust))
2399 /* It worked! */
2400 pending_delete = insn;
2401 last_sp_adjust += this_adjust;
2402 goto processed;
2406 /* Otherwise we have a deallocation. Do not combine with
2407 a previous allocation. Combine into the second insn. */
2408 else if (STACK_GROWS_DOWNWARD
2409 ? last_sp_adjust >= 0 : last_sp_adjust <= 0)
2411 if (try_apply_stack_adjustment (insn, memlist,
2412 last_sp_adjust + this_adjust,
2413 -last_sp_adjust))
2415 /* It worked! */
2416 flow_delete_insn (last_sp_set);
2417 last_sp_set = insn;
2418 last_sp_adjust += this_adjust;
2419 free_csa_memlist (memlist);
2420 memlist = NULL;
2421 goto processed;
2425 /* Combination failed. Restart processing from here. */
2426 free_csa_memlist (memlist);
2427 memlist = NULL;
2428 last_sp_set = insn;
2429 last_sp_adjust = this_adjust;
2430 goto processed;
2433 /* Find a predecrement of exactly the previous adjustment and
2434 turn it into a direct store. Obviously we can't do this if
2435 there were any intervening uses of the stack pointer. */
2436 if (memlist == NULL
2437 && GET_CODE (dest) == MEM
2438 && ((GET_CODE (XEXP (dest, 0)) == PRE_DEC
2439 && (last_sp_adjust
2440 == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (dest))))
2441 || (GET_CODE (XEXP (dest, 0)) == PRE_MODIFY
2442 && GET_CODE (XEXP (XEXP (dest, 0), 1)) == PLUS
2443 && XEXP (XEXP (XEXP (dest, 0), 1), 0) == stack_pointer_rtx
2444 && (GET_CODE (XEXP (XEXP (XEXP (dest, 0), 1), 1))
2445 == CONST_INT)
2446 && (INTVAL (XEXP (XEXP (XEXP (dest, 0), 1), 1))
2447 == -last_sp_adjust)))
2448 && XEXP (XEXP (dest, 0), 0) == stack_pointer_rtx
2449 && ! reg_mentioned_p (stack_pointer_rtx, src)
2450 && memory_address_p (GET_MODE (dest), stack_pointer_rtx)
2451 && validate_change (insn, &SET_DEST (set),
2452 change_address (dest, VOIDmode,
2453 stack_pointer_rtx), 0))
2455 if (last_sp_set == bb->head)
2456 bb->head = NEXT_INSN (last_sp_set);
2457 flow_delete_insn (last_sp_set);
2459 free_csa_memlist (memlist);
2460 memlist = NULL;
2461 last_sp_set = NULL_RTX;
2462 last_sp_adjust = 0;
2463 goto processed;
2467 data.insn = insn;
2468 data.memlist = memlist;
2469 if (GET_CODE (insn) != CALL_INSN && last_sp_set
2470 && !for_each_rtx (&PATTERN (insn), record_stack_memrefs, &data))
2472 memlist = data.memlist;
2473 goto processed;
2475 memlist = data.memlist;
2477 /* Otherwise, we were not able to process the instruction.
2478 Do not continue collecting data across such a one. */
2479 if (last_sp_set
2480 && (GET_CODE (insn) == CALL_INSN
2481 || reg_mentioned_p (stack_pointer_rtx, PATTERN (insn))))
2483 free_csa_memlist (memlist);
2484 memlist = NULL;
2485 last_sp_set = NULL_RTX;
2486 last_sp_adjust = 0;
2489 processed:
2490 if (insn == bb->end)
2491 break;
2493 if (pending_delete)
2494 flow_delete_insn (pending_delete);
2497 if (pending_delete)
2499 bb->end = PREV_INSN (pending_delete);
2500 flow_delete_insn (pending_delete);