Don't crash declaring a function named "_".
[gcc.git] / gcc / regmove.c
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.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22
23 /* This module makes some simple RTL code transformations which
24 improve the subsequent register allocation. */
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "rtl.h"
31 #include "tm_p.h"
32 #include "insn-config.h"
33 #include "recog.h"
34 #include "target.h"
35 #include "output.h"
36 #include "regs.h"
37 #include "hard-reg-set.h"
38 #include "flags.h"
39 #include "function.h"
40 #include "expr.h"
41 #include "basic-block.h"
42 #include "except.h"
43 #include "diagnostic-core.h"
44 #include "reload.h"
45 #include "timevar.h"
46 #include "tree-pass.h"
47 #include "df.h"
48 #include "ira.h"
49
50 static int optimize_reg_copy_1 (rtx, rtx, rtx);
51 static void optimize_reg_copy_2 (rtx, rtx, rtx);
52 static void optimize_reg_copy_3 (rtx, rtx, rtx);
53 static void copy_src_to_dest (rtx, rtx, rtx);
54
55 enum match_use
56 {
57 READ,
58 WRITE,
59 READWRITE
60 };
61
62 struct match {
63 int with[MAX_RECOG_OPERANDS];
64 enum match_use use[MAX_RECOG_OPERANDS];
65 int commutative[MAX_RECOG_OPERANDS];
66 int early_clobber[MAX_RECOG_OPERANDS];
67 };
68
69 static int find_matches (rtx, struct match *);
70 static int fixup_match_2 (rtx, rtx, rtx, rtx);
71
72 /* Return nonzero if registers with CLASS1 and CLASS2 can be merged without
73 causing too much register allocation problems. */
74 static int
75 regclass_compatible_p (reg_class_t class0, reg_class_t class1)
76 {
77 return (class0 == class1
78 || (reg_class_subset_p (class0, class1)
79 && ! targetm.class_likely_spilled_p (class0))
80 || (reg_class_subset_p (class1, class0)
81 && ! targetm.class_likely_spilled_p (class1)));
82 }
83
84 \f
85 #ifdef AUTO_INC_DEC
86
87 /* Find the place in the rtx X where REG is used as a memory address.
88 Return the MEM rtx that so uses it.
89 If PLUSCONST is nonzero, search instead for a memory address equivalent to
90 (plus REG (const_int PLUSCONST)).
91
92 If such an address does not appear, return 0.
93 If REG appears more than once, or is used other than in such an address,
94 return (rtx) 1. */
95
96 static rtx
97 find_use_as_address (rtx x, rtx reg, HOST_WIDE_INT plusconst)
98 {
99 enum rtx_code code = GET_CODE (x);
100 const char * const fmt = GET_RTX_FORMAT (code);
101 int i;
102 rtx value = 0;
103 rtx tem;
104
105 if (code == MEM && XEXP (x, 0) == reg && plusconst == 0)
106 return x;
107
108 if (code == MEM && GET_CODE (XEXP (x, 0)) == PLUS
109 && XEXP (XEXP (x, 0), 0) == reg
110 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
111 && INTVAL (XEXP (XEXP (x, 0), 1)) == plusconst)
112 return x;
113
114 if (code == SIGN_EXTRACT || code == ZERO_EXTRACT)
115 {
116 /* If REG occurs inside a MEM used in a bit-field reference,
117 that is unacceptable. */
118 if (find_use_as_address (XEXP (x, 0), reg, 0) != 0)
119 return (rtx) (size_t) 1;
120 }
121
122 if (x == reg)
123 return (rtx) (size_t) 1;
124
125 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
126 {
127 if (fmt[i] == 'e')
128 {
129 tem = find_use_as_address (XEXP (x, i), reg, plusconst);
130 if (value == 0)
131 value = tem;
132 else if (tem != 0)
133 return (rtx) (size_t) 1;
134 }
135 else if (fmt[i] == 'E')
136 {
137 int j;
138 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
139 {
140 tem = find_use_as_address (XVECEXP (x, i, j), reg, plusconst);
141 if (value == 0)
142 value = tem;
143 else if (tem != 0)
144 return (rtx) (size_t) 1;
145 }
146 }
147 }
148
149 return value;
150 }
151
152
153 /* INC_INSN is an instruction that adds INCREMENT to REG.
154 Try to fold INC_INSN as a post/pre in/decrement into INSN.
155 Iff INC_INSN_SET is nonzero, inc_insn has a destination different from src.
156 Return nonzero for success. */
157 static int
158 try_auto_increment (rtx insn, rtx inc_insn, rtx inc_insn_set, rtx reg,
159 HOST_WIDE_INT increment, int pre)
160 {
161 enum rtx_code inc_code;
162
163 rtx pset = single_set (insn);
164 if (pset)
165 {
166 /* Can't use the size of SET_SRC, we might have something like
167 (sign_extend:SI (mem:QI ... */
168 rtx use = find_use_as_address (pset, reg, 0);
169 if (use != 0 && use != (rtx) (size_t) 1)
170 {
171 int size = GET_MODE_SIZE (GET_MODE (use));
172 if (0
173 || (HAVE_POST_INCREMENT
174 && pre == 0 && (inc_code = POST_INC, increment == size))
175 || (HAVE_PRE_INCREMENT
176 && pre == 1 && (inc_code = PRE_INC, increment == size))
177 || (HAVE_POST_DECREMENT
178 && pre == 0 && (inc_code = POST_DEC, increment == -size))
179 || (HAVE_PRE_DECREMENT
180 && pre == 1 && (inc_code = PRE_DEC, increment == -size))
181 )
182 {
183 if (inc_insn_set)
184 validate_change
185 (inc_insn,
186 &SET_SRC (inc_insn_set),
187 XEXP (SET_SRC (inc_insn_set), 0), 1);
188 validate_change (insn, &XEXP (use, 0),
189 gen_rtx_fmt_e (inc_code,
190 GET_MODE (XEXP (use, 0)), reg),
191 1);
192 if (apply_change_group ())
193 {
194 /* If there is a REG_DEAD note on this insn, we must
195 change this not to REG_UNUSED meaning that the register
196 is set, but the value is dead. Failure to do so will
197 result in sched1 dying -- when it recomputes lifetime
198 information, the number of REG_DEAD notes will have
199 changed. */
200 rtx note = find_reg_note (insn, REG_DEAD, reg);
201 if (note)
202 PUT_REG_NOTE_KIND (note, REG_UNUSED);
203
204 add_reg_note (insn, REG_INC, reg);
205
206 if (! inc_insn_set)
207 delete_insn (inc_insn);
208 return 1;
209 }
210 }
211 }
212 }
213 return 0;
214 }
215 #endif
216
217 \f
218 static int *regno_src_regno;
219
220 /* INSN is a copy from SRC to DEST, both registers, and SRC does not die
221 in INSN.
222
223 Search forward to see if SRC dies before either it or DEST is modified,
224 but don't scan past the end of a basic block. If so, we can replace SRC
225 with DEST and let SRC die in INSN.
226
227 This will reduce the number of registers live in that range and may enable
228 DEST to be tied to SRC, thus often saving one register in addition to a
229 register-register copy. */
230
231 static int
232 optimize_reg_copy_1 (rtx insn, rtx dest, rtx src)
233 {
234 rtx p, q;
235 rtx note;
236 rtx dest_death = 0;
237 int sregno = REGNO (src);
238 int dregno = REGNO (dest);
239 basic_block bb = BLOCK_FOR_INSN (insn);
240
241 /* We don't want to mess with hard regs if register classes are small. */
242 if (sregno == dregno
243 || (targetm.small_register_classes_for_mode_p (GET_MODE (src))
244 && (sregno < FIRST_PSEUDO_REGISTER
245 || dregno < FIRST_PSEUDO_REGISTER))
246 /* We don't see all updates to SP if they are in an auto-inc memory
247 reference, so we must disallow this optimization on them. */
248 || sregno == STACK_POINTER_REGNUM || dregno == STACK_POINTER_REGNUM)
249 return 0;
250
251 for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
252 {
253 if (! INSN_P (p))
254 continue;
255 if (BLOCK_FOR_INSN (p) != bb)
256 break;
257
258 if (reg_set_p (src, p) || reg_set_p (dest, p)
259 /* If SRC is an asm-declared register, it must not be replaced
260 in any asm. Unfortunately, the REG_EXPR tree for the asm
261 variable may be absent in the SRC rtx, so we can't check the
262 actual register declaration easily (the asm operand will have
263 it, though). To avoid complicating the test for a rare case,
264 we just don't perform register replacement for a hard reg
265 mentioned in an asm. */
266 || (sregno < FIRST_PSEUDO_REGISTER
267 && asm_noperands (PATTERN (p)) >= 0
268 && reg_overlap_mentioned_p (src, PATTERN (p)))
269 /* Don't change hard registers used by a call. */
270 || (CALL_P (p) && sregno < FIRST_PSEUDO_REGISTER
271 && find_reg_fusage (p, USE, src))
272 /* Don't change a USE of a register. */
273 || (GET_CODE (PATTERN (p)) == USE
274 && reg_overlap_mentioned_p (src, XEXP (PATTERN (p), 0))))
275 break;
276
277 /* See if all of SRC dies in P. This test is slightly more
278 conservative than it needs to be. */
279 if ((note = find_regno_note (p, REG_DEAD, sregno)) != 0
280 && GET_MODE (XEXP (note, 0)) == GET_MODE (src))
281 {
282 int failed = 0;
283 int d_length = 0;
284 int s_length = 0;
285 int d_n_calls = 0;
286 int s_n_calls = 0;
287 int s_freq_calls = 0;
288 int d_freq_calls = 0;
289
290 /* We can do the optimization. Scan forward from INSN again,
291 replacing regs as we go. Set FAILED if a replacement can't
292 be done. In that case, we can't move the death note for SRC.
293 This should be rare. */
294
295 /* Set to stop at next insn. */
296 for (q = next_real_insn (insn);
297 q != next_real_insn (p);
298 q = next_real_insn (q))
299 {
300 if (reg_overlap_mentioned_p (src, PATTERN (q)))
301 {
302 /* If SRC is a hard register, we might miss some
303 overlapping registers with validate_replace_rtx,
304 so we would have to undo it. We can't if DEST is
305 present in the insn, so fail in that combination
306 of cases. */
307 if (sregno < FIRST_PSEUDO_REGISTER
308 && reg_mentioned_p (dest, PATTERN (q)))
309 failed = 1;
310
311 /* Attempt to replace all uses. */
312 else if (!validate_replace_rtx (src, dest, q))
313 failed = 1;
314
315 /* If this succeeded, but some part of the register
316 is still present, undo the replacement. */
317 else if (sregno < FIRST_PSEUDO_REGISTER
318 && reg_overlap_mentioned_p (src, PATTERN (q)))
319 {
320 validate_replace_rtx (dest, src, q);
321 failed = 1;
322 }
323 }
324
325 /* For SREGNO, count the total number of insns scanned.
326 For DREGNO, count the total number of insns scanned after
327 passing the death note for DREGNO. */
328 if (!DEBUG_INSN_P (p))
329 {
330 s_length++;
331 if (dest_death)
332 d_length++;
333 }
334
335 /* If the insn in which SRC dies is a CALL_INSN, don't count it
336 as a call that has been crossed. Otherwise, count it. */
337 if (q != p && CALL_P (q))
338 {
339 /* Similarly, total calls for SREGNO, total calls beyond
340 the death note for DREGNO. */
341 s_n_calls++;
342 s_freq_calls += REG_FREQ_FROM_BB (BLOCK_FOR_INSN (q));
343 if (dest_death)
344 {
345 d_n_calls++;
346 d_freq_calls += REG_FREQ_FROM_BB (BLOCK_FOR_INSN (q));
347 }
348 }
349
350 /* If DEST dies here, remove the death note and save it for
351 later. Make sure ALL of DEST dies here; again, this is
352 overly conservative. */
353 if (dest_death == 0
354 && (dest_death = find_regno_note (q, REG_DEAD, dregno)) != 0)
355 {
356 if (GET_MODE (XEXP (dest_death, 0)) != GET_MODE (dest))
357 failed = 1, dest_death = 0;
358 else
359 remove_note (q, dest_death);
360 }
361 }
362
363 if (! failed)
364 {
365 /* These counters need to be updated if and only if we are
366 going to move the REG_DEAD note. */
367 if (sregno >= FIRST_PSEUDO_REGISTER)
368 {
369 if (REG_LIVE_LENGTH (sregno) >= 0)
370 {
371 REG_LIVE_LENGTH (sregno) -= s_length;
372 /* REG_LIVE_LENGTH is only an approximation after
373 combine if sched is not run, so make sure that we
374 still have a reasonable value. */
375 if (REG_LIVE_LENGTH (sregno) < 2)
376 REG_LIVE_LENGTH (sregno) = 2;
377 }
378
379 REG_N_CALLS_CROSSED (sregno) -= s_n_calls;
380 REG_FREQ_CALLS_CROSSED (sregno) -= s_freq_calls;
381 }
382
383 /* Move death note of SRC from P to INSN. */
384 remove_note (p, note);
385 XEXP (note, 1) = REG_NOTES (insn);
386 REG_NOTES (insn) = note;
387 }
388
389 /* DEST is also dead if INSN has a REG_UNUSED note for DEST. */
390 if (! dest_death
391 && (dest_death = find_regno_note (insn, REG_UNUSED, dregno)))
392 {
393 PUT_REG_NOTE_KIND (dest_death, REG_DEAD);
394 remove_note (insn, dest_death);
395 }
396
397 /* Put death note of DEST on P if we saw it die. */
398 if (dest_death)
399 {
400 XEXP (dest_death, 1) = REG_NOTES (p);
401 REG_NOTES (p) = dest_death;
402
403 if (dregno >= FIRST_PSEUDO_REGISTER)
404 {
405 /* If and only if we are moving the death note for DREGNO,
406 then we need to update its counters. */
407 if (REG_LIVE_LENGTH (dregno) >= 0)
408 REG_LIVE_LENGTH (dregno) += d_length;
409 REG_N_CALLS_CROSSED (dregno) += d_n_calls;
410 REG_FREQ_CALLS_CROSSED (dregno) += d_freq_calls;
411 }
412 }
413
414 return ! failed;
415 }
416
417 /* If SRC is a hard register which is set or killed in some other
418 way, we can't do this optimization. */
419 else if (sregno < FIRST_PSEUDO_REGISTER
420 && dead_or_set_p (p, src))
421 break;
422 }
423 return 0;
424 }
425 \f
426 /* INSN is a copy of SRC to DEST, in which SRC dies. See if we now have
427 a sequence of insns that modify DEST followed by an insn that sets
428 SRC to DEST in which DEST dies, with no prior modification of DEST.
429 (There is no need to check if the insns in between actually modify
430 DEST. We should not have cases where DEST is not modified, but
431 the optimization is safe if no such modification is detected.)
432 In that case, we can replace all uses of DEST, starting with INSN and
433 ending with the set of SRC to DEST, with SRC. We do not do this
434 optimization if a CALL_INSN is crossed unless SRC already crosses a
435 call or if DEST dies before the copy back to SRC.
436
437 It is assumed that DEST and SRC are pseudos; it is too complicated to do
438 this for hard registers since the substitutions we may make might fail. */
439
440 static void
441 optimize_reg_copy_2 (rtx insn, rtx dest, rtx src)
442 {
443 rtx p, q;
444 rtx set;
445 int sregno = REGNO (src);
446 int dregno = REGNO (dest);
447 basic_block bb = BLOCK_FOR_INSN (insn);
448
449 for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
450 {
451 if (! INSN_P (p))
452 continue;
453 if (BLOCK_FOR_INSN (p) != bb)
454 break;
455
456 set = single_set (p);
457 if (set && SET_SRC (set) == dest && SET_DEST (set) == src
458 && find_reg_note (p, REG_DEAD, dest))
459 {
460 /* We can do the optimization. Scan forward from INSN again,
461 replacing regs as we go. */
462
463 /* Set to stop at next insn. */
464 for (q = insn; q != NEXT_INSN (p); q = NEXT_INSN (q))
465 if (INSN_P (q))
466 {
467 if (reg_mentioned_p (dest, PATTERN (q)))
468 {
469 rtx note;
470
471 PATTERN (q) = replace_rtx (PATTERN (q), dest, src);
472 note = FIND_REG_INC_NOTE (q, dest);
473 if (note)
474 {
475 remove_note (q, note);
476 add_reg_note (q, REG_INC, src);
477 }
478 df_insn_rescan (q);
479 }
480
481 if (CALL_P (q))
482 {
483 int freq = REG_FREQ_FROM_BB (BLOCK_FOR_INSN (q));
484 REG_N_CALLS_CROSSED (dregno)--;
485 REG_N_CALLS_CROSSED (sregno)++;
486 REG_FREQ_CALLS_CROSSED (dregno) -= freq;
487 REG_FREQ_CALLS_CROSSED (sregno) += freq;
488 }
489 }
490
491 remove_note (p, find_reg_note (p, REG_DEAD, dest));
492 REG_N_DEATHS (dregno)--;
493 remove_note (insn, find_reg_note (insn, REG_DEAD, src));
494 REG_N_DEATHS (sregno)--;
495 return;
496 }
497
498 if (reg_set_p (src, p)
499 || find_reg_note (p, REG_DEAD, dest)
500 || (CALL_P (p) && REG_N_CALLS_CROSSED (sregno) == 0))
501 break;
502 }
503 }
504
505 /* INSN is a ZERO_EXTEND or SIGN_EXTEND of SRC to DEST.
506 Look if SRC dies there, and if it is only set once, by loading
507 it from memory. If so, try to incorporate the zero/sign extension
508 into the memory read, change SRC to the mode of DEST, and alter
509 the remaining accesses to use the appropriate SUBREG. This allows
510 SRC and DEST to be tied later. */
511 static void
512 optimize_reg_copy_3 (rtx insn, rtx dest, rtx src)
513 {
514 rtx src_reg = XEXP (src, 0);
515 int src_no = REGNO (src_reg);
516 int dst_no = REGNO (dest);
517 rtx p, set, set_insn;
518 enum machine_mode old_mode;
519 basic_block bb = BLOCK_FOR_INSN (insn);
520
521 if (src_no < FIRST_PSEUDO_REGISTER
522 || dst_no < FIRST_PSEUDO_REGISTER
523 || ! find_reg_note (insn, REG_DEAD, src_reg)
524 || REG_N_DEATHS (src_no) != 1
525 || REG_N_SETS (src_no) != 1)
526 return;
527
528 for (p = PREV_INSN (insn); p && ! reg_set_p (src_reg, p); p = PREV_INSN (p))
529 if (INSN_P (p) && BLOCK_FOR_INSN (p) != bb)
530 break;
531
532 if (! p || BLOCK_FOR_INSN (p) != bb)
533 return;
534
535 if (! (set = single_set (p))
536 || !MEM_P (SET_SRC (set))
537 /* If there's a REG_EQUIV note, this must be an insn that loads an
538 argument. Prefer keeping the note over doing this optimization. */
539 || find_reg_note (p, REG_EQUIV, NULL_RTX)
540 || SET_DEST (set) != src_reg)
541 return;
542
543 /* Be conservative: although this optimization is also valid for
544 volatile memory references, that could cause trouble in later passes. */
545 if (MEM_VOLATILE_P (SET_SRC (set)))
546 return;
547
548 /* Do not use a SUBREG to truncate from one mode to another if truncation
549 is not a nop. */
550 if (GET_MODE_BITSIZE (GET_MODE (src_reg)) <= GET_MODE_BITSIZE (GET_MODE (src))
551 && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (src)),
552 GET_MODE_BITSIZE (GET_MODE (src_reg))))
553 return;
554
555 set_insn = p;
556 old_mode = GET_MODE (src_reg);
557 PUT_MODE (src_reg, GET_MODE (src));
558 XEXP (src, 0) = SET_SRC (set);
559
560 /* Include this change in the group so that it's easily undone if
561 one of the changes in the group is invalid. */
562 validate_change (p, &SET_SRC (set), src, 1);
563
564 /* Now walk forward making additional replacements. We want to be able
565 to undo all the changes if a later substitution fails. */
566 while (p = NEXT_INSN (p), p != insn)
567 {
568 if (! INSN_P (p))
569 continue;
570
571 /* Make a tentative change. */
572 validate_replace_rtx_group (src_reg,
573 gen_lowpart_SUBREG (old_mode, src_reg),
574 p);
575 }
576
577 validate_replace_rtx_group (src, src_reg, insn);
578
579 /* Now see if all the changes are valid. */
580 if (! apply_change_group ())
581 {
582 /* One or more changes were no good. Back out everything. */
583 PUT_MODE (src_reg, old_mode);
584 XEXP (src, 0) = src_reg;
585 }
586 else
587 {
588 rtx note = find_reg_note (set_insn, REG_EQUAL, NULL_RTX);
589 if (note)
590 {
591 if (rtx_equal_p (XEXP (note, 0), XEXP (src, 0)))
592 {
593 XEXP (note, 0)
594 = gen_rtx_fmt_e (GET_CODE (src), GET_MODE (src),
595 XEXP (note, 0));
596 df_notes_rescan (set_insn);
597 }
598 else
599 remove_note (set_insn, note);
600 }
601 }
602 }
603
604 \f
605 /* If we were not able to update the users of src to use dest directly, try
606 instead moving the value to dest directly before the operation. */
607
608 static void
609 copy_src_to_dest (rtx insn, rtx src, rtx dest)
610 {
611 rtx seq;
612 rtx link;
613 rtx next;
614 rtx set;
615 rtx move_insn;
616 rtx *p_insn_notes;
617 rtx *p_move_notes;
618 int src_regno;
619 int dest_regno;
620
621 /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant
622 or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is
623 parameter when there is no frame pointer that is not allocated a register.
624 For now, we just reject them, rather than incrementing the live length. */
625
626 if (REG_P (src)
627 && REG_LIVE_LENGTH (REGNO (src)) > 0
628 && REG_P (dest)
629 && REG_LIVE_LENGTH (REGNO (dest)) > 0
630 && (set = single_set (insn)) != NULL_RTX
631 && !reg_mentioned_p (dest, SET_SRC (set))
632 && GET_MODE (src) == GET_MODE (dest))
633 {
634 int old_num_regs = reg_rtx_no;
635
636 /* Generate the src->dest move. */
637 start_sequence ();
638 emit_move_insn (dest, src);
639 seq = get_insns ();
640 end_sequence ();
641 /* If this sequence uses new registers, we may not use it. */
642 if (old_num_regs != reg_rtx_no
643 || ! validate_replace_rtx (src, dest, insn))
644 {
645 /* We have to restore reg_rtx_no to its old value, lest
646 recompute_reg_usage will try to compute the usage of the
647 new regs, yet reg_n_info is not valid for them. */
648 reg_rtx_no = old_num_regs;
649 return;
650 }
651 emit_insn_before (seq, insn);
652 move_insn = PREV_INSN (insn);
653 p_move_notes = &REG_NOTES (move_insn);
654 p_insn_notes = &REG_NOTES (insn);
655
656 /* Move any notes mentioning src to the move instruction. */
657 for (link = REG_NOTES (insn); link != NULL_RTX; link = next)
658 {
659 next = XEXP (link, 1);
660 if (XEXP (link, 0) == src)
661 {
662 *p_move_notes = link;
663 p_move_notes = &XEXP (link, 1);
664 }
665 else
666 {
667 *p_insn_notes = link;
668 p_insn_notes = &XEXP (link, 1);
669 }
670 }
671
672 *p_move_notes = NULL_RTX;
673 *p_insn_notes = NULL_RTX;
674
675 /* Update the various register tables. */
676 dest_regno = REGNO (dest);
677 INC_REG_N_SETS (dest_regno, 1);
678 REG_LIVE_LENGTH (dest_regno)++;
679 src_regno = REGNO (src);
680 if (! find_reg_note (move_insn, REG_DEAD, src))
681 REG_LIVE_LENGTH (src_regno)++;
682 }
683 }
684
685 /* reg_set_in_bb[REGNO] points to basic block iff the register is set
686 only once in the given block and has REG_EQUAL note. */
687
688 static basic_block *reg_set_in_bb;
689
690 /* Size of reg_set_in_bb array. */
691 static unsigned int max_reg_computed;
692
693 \f
694 /* Return whether REG is set in only one location, and is set to a
695 constant, but is set in a different basic block from INSN (an
696 instructions which uses REG). In this case REG is equivalent to a
697 constant, and we don't want to break that equivalence, because that
698 may increase register pressure and make reload harder. If REG is
699 set in the same basic block as INSN, we don't worry about it,
700 because we'll probably need a register anyhow (??? but what if REG
701 is used in a different basic block as well as this one?). */
702
703 static bool
704 reg_is_remote_constant_p (rtx reg, rtx insn)
705 {
706 basic_block bb;
707 rtx p;
708 int max;
709
710 if (!reg_set_in_bb)
711 {
712 max_reg_computed = max = max_reg_num ();
713 reg_set_in_bb = XCNEWVEC (basic_block, max);
714
715 FOR_EACH_BB (bb)
716 FOR_BB_INSNS (bb, p)
717 {
718 rtx s;
719
720 if (!INSN_P (p))
721 continue;
722 s = single_set (p);
723 /* This is the instruction which sets REG. If there is a
724 REG_EQUAL note, then REG is equivalent to a constant. */
725 if (s != 0
726 && REG_P (SET_DEST (s))
727 && REG_N_SETS (REGNO (SET_DEST (s))) == 1
728 && find_reg_note (p, REG_EQUAL, NULL_RTX))
729 reg_set_in_bb[REGNO (SET_DEST (s))] = bb;
730 }
731 }
732
733 gcc_assert (REGNO (reg) < max_reg_computed);
734 if (reg_set_in_bb[REGNO (reg)] == NULL)
735 return false;
736 return (reg_set_in_bb[REGNO (reg)] != BLOCK_FOR_INSN (insn));
737 }
738
739 /* INSN is adding a CONST_INT to a REG. We search backwards looking for
740 another add immediate instruction with the same source and dest registers,
741 and if we find one, we change INSN to an increment, and return 1. If
742 no changes are made, we return 0.
743
744 This changes
745 (set (reg100) (plus reg1 offset1))
746 ...
747 (set (reg100) (plus reg1 offset2))
748 to
749 (set (reg100) (plus reg1 offset1))
750 ...
751 (set (reg100) (plus reg100 offset2-offset1)) */
752
753 /* ??? What does this comment mean? */
754 /* cse disrupts preincrement / postdecrement sequences when it finds a
755 hard register as ultimate source, like the frame pointer. */
756
757 static int
758 fixup_match_2 (rtx insn, rtx dst, rtx src, rtx offset)
759 {
760 rtx p, dst_death = 0;
761 int length, num_calls = 0, freq_calls = 0;
762 basic_block bb = BLOCK_FOR_INSN (insn);
763
764 /* If SRC dies in INSN, we'd have to move the death note. This is
765 considered to be very unlikely, so we just skip the optimization
766 in this case. */
767 if (find_regno_note (insn, REG_DEAD, REGNO (src)))
768 return 0;
769
770 /* Scan backward to find the first instruction that sets DST. */
771
772 for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
773 {
774 rtx pset;
775
776 if (! INSN_P (p))
777 continue;
778 if (BLOCK_FOR_INSN (p) != bb)
779 break;
780
781 if (find_regno_note (p, REG_DEAD, REGNO (dst)))
782 dst_death = p;
783 if (! dst_death && !DEBUG_INSN_P (p))
784 length++;
785
786 pset = single_set (p);
787 if (pset && SET_DEST (pset) == dst
788 && GET_CODE (SET_SRC (pset)) == PLUS
789 && XEXP (SET_SRC (pset), 0) == src
790 && CONST_INT_P (XEXP (SET_SRC (pset), 1)))
791 {
792 HOST_WIDE_INT newconst
793 = INTVAL (offset) - INTVAL (XEXP (SET_SRC (pset), 1));
794 rtx add = gen_add3_insn (dst, dst, GEN_INT (newconst));
795
796 if (add && validate_change (insn, &PATTERN (insn), add, 0))
797 {
798 /* Remove the death note for DST from DST_DEATH. */
799 if (dst_death)
800 {
801 remove_death (REGNO (dst), dst_death);
802 REG_LIVE_LENGTH (REGNO (dst)) += length;
803 REG_N_CALLS_CROSSED (REGNO (dst)) += num_calls;
804 REG_FREQ_CALLS_CROSSED (REGNO (dst)) += freq_calls;
805 }
806
807 if (dump_file)
808 fprintf (dump_file,
809 "Fixed operand of insn %d.\n",
810 INSN_UID (insn));
811
812 #ifdef AUTO_INC_DEC
813 for (p = PREV_INSN (insn); p; p = PREV_INSN (p))
814 {
815 if (! INSN_P (p))
816 continue;
817 if (BLOCK_FOR_INSN (p) != bb)
818 break;
819 if (reg_overlap_mentioned_p (dst, PATTERN (p)))
820 {
821 if (try_auto_increment (p, insn, 0, dst, newconst, 0))
822 return 1;
823 break;
824 }
825 }
826 for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
827 {
828 if (! INSN_P (p))
829 continue;
830 if (BLOCK_FOR_INSN (p) != bb)
831 break;
832 if (reg_overlap_mentioned_p (dst, PATTERN (p)))
833 {
834 try_auto_increment (p, insn, 0, dst, newconst, 1);
835 break;
836 }
837 }
838 #endif
839 return 1;
840 }
841 }
842
843 if (reg_set_p (dst, PATTERN (p)))
844 break;
845
846 /* If we have passed a call instruction, and the
847 pseudo-reg SRC is not already live across a call,
848 then don't perform the optimization. */
849 /* reg_set_p is overly conservative for CALL_INSNS, thinks that all
850 hard regs are clobbered. Thus, we only use it for src for
851 non-call insns. */
852 if (CALL_P (p))
853 {
854 if (! dst_death)
855 {
856 num_calls++;
857 freq_calls += REG_FREQ_FROM_BB (BLOCK_FOR_INSN (p));
858 }
859
860 if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
861 break;
862
863 if (call_used_regs [REGNO (dst)]
864 || find_reg_fusage (p, CLOBBER, dst))
865 break;
866 }
867 else if (reg_set_p (src, PATTERN (p)))
868 break;
869 }
870
871 return 0;
872 }
873
874 /* A forward pass. Replace output operands with input operands. */
875
876 static void
877 regmove_forward_pass (void)
878 {
879 basic_block bb;
880 rtx insn;
881
882 if (! flag_expensive_optimizations)
883 return;
884
885 if (dump_file)
886 fprintf (dump_file, "Starting forward pass...\n");
887
888 FOR_EACH_BB (bb)
889 {
890 FOR_BB_INSNS (bb, insn)
891 {
892 rtx set = single_set (insn);
893 if (! set)
894 continue;
895
896 if ((GET_CODE (SET_SRC (set)) == SIGN_EXTEND
897 || GET_CODE (SET_SRC (set)) == ZERO_EXTEND)
898 && REG_P (XEXP (SET_SRC (set), 0))
899 && REG_P (SET_DEST (set)))
900 optimize_reg_copy_3 (insn, SET_DEST (set), SET_SRC (set));
901
902 if (REG_P (SET_SRC (set))
903 && REG_P (SET_DEST (set)))
904 {
905 /* If this is a register-register copy where SRC is not dead,
906 see if we can optimize it. If this optimization succeeds,
907 it will become a copy where SRC is dead. */
908 if ((find_reg_note (insn, REG_DEAD, SET_SRC (set))
909 || optimize_reg_copy_1 (insn, SET_DEST (set), SET_SRC (set)))
910 && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
911 {
912 /* Similarly for a pseudo-pseudo copy when SRC is dead. */
913 if (REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER)
914 optimize_reg_copy_2 (insn, SET_DEST (set), SET_SRC (set));
915 if (regno_src_regno[REGNO (SET_DEST (set))] < 0
916 && SET_SRC (set) != SET_DEST (set))
917 {
918 int srcregno = REGNO (SET_SRC (set));
919 if (regno_src_regno[srcregno] >= 0)
920 srcregno = regno_src_regno[srcregno];
921 regno_src_regno[REGNO (SET_DEST (set))] = srcregno;
922 }
923 }
924 }
925 }
926 }
927 }
928
929 /* A backward pass. Replace input operands with output operands. */
930
931 static void
932 regmove_backward_pass (void)
933 {
934 basic_block bb;
935 rtx insn, prev;
936
937 if (dump_file)
938 fprintf (dump_file, "Starting backward pass...\n");
939
940 FOR_EACH_BB_REVERSE (bb)
941 {
942 /* ??? Use the safe iterator because fixup_match_2 can remove
943 insns via try_auto_increment. */
944 FOR_BB_INSNS_REVERSE_SAFE (bb, insn, prev)
945 {
946 struct match match;
947 rtx copy_src, copy_dst;
948 int op_no, match_no;
949 int success = 0;
950
951 if (! INSN_P (insn))
952 continue;
953
954 if (! find_matches (insn, &match))
955 continue;
956
957 /* Now scan through the operands looking for a destination operand
958 which is supposed to match a source operand.
959 Then scan backward for an instruction which sets the source
960 operand. If safe, then replace the source operand with the
961 dest operand in both instructions. */
962
963 copy_src = NULL_RTX;
964 copy_dst = NULL_RTX;
965 for (op_no = 0; op_no < recog_data.n_operands; op_no++)
966 {
967 rtx set, p, src, dst;
968 rtx src_note, dst_note;
969 int num_calls = 0, freq_calls = 0;
970 enum reg_class src_class, dst_class;
971 int length;
972
973 match_no = match.with[op_no];
974
975 /* Nothing to do if the two operands aren't supposed to match. */
976 if (match_no < 0)
977 continue;
978
979 dst = recog_data.operand[match_no];
980 src = recog_data.operand[op_no];
981
982 if (!REG_P (src))
983 continue;
984
985 if (!REG_P (dst)
986 || REGNO (dst) < FIRST_PSEUDO_REGISTER
987 || REG_LIVE_LENGTH (REGNO (dst)) < 0
988 || GET_MODE (src) != GET_MODE (dst))
989 continue;
990
991 /* If the operands already match, then there is nothing to do. */
992 if (operands_match_p (src, dst))
993 continue;
994
995 if (match.commutative[op_no] >= 0)
996 {
997 rtx comm = recog_data.operand[match.commutative[op_no]];
998 if (operands_match_p (comm, dst))
999 continue;
1000 }
1001
1002 set = single_set (insn);
1003 if (! set)
1004 continue;
1005
1006 /* Note that single_set ignores parts of a parallel set for
1007 which one of the destinations is REG_UNUSED. We can't
1008 handle that here, since we can wind up rewriting things
1009 such that a single register is set twice within a single
1010 parallel. */
1011 if (reg_set_p (src, insn))
1012 continue;
1013
1014 /* match_no/dst must be a write-only operand, and
1015 operand_operand/src must be a read-only operand. */
1016 if (match.use[op_no] != READ
1017 || match.use[match_no] != WRITE)
1018 continue;
1019
1020 if (match.early_clobber[match_no]
1021 && count_occurrences (PATTERN (insn), src, 0) > 1)
1022 continue;
1023
1024 /* Make sure match_no is the destination. */
1025 if (recog_data.operand[match_no] != SET_DEST (set))
1026 continue;
1027
1028 if (REGNO (src) < FIRST_PSEUDO_REGISTER)
1029 {
1030 if (GET_CODE (SET_SRC (set)) == PLUS
1031 && CONST_INT_P (XEXP (SET_SRC (set), 1))
1032 && XEXP (SET_SRC (set), 0) == src
1033 && fixup_match_2 (insn, dst, src,
1034 XEXP (SET_SRC (set), 1)))
1035 break;
1036 continue;
1037 }
1038 src_class = reg_preferred_class (REGNO (src));
1039 dst_class = reg_preferred_class (REGNO (dst));
1040
1041 if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
1042 {
1043 /* We used to force the copy here like in other cases, but
1044 it produces worse code, as it eliminates no copy
1045 instructions and the copy emitted will be produced by
1046 reload anyway. On patterns with multiple alternatives,
1047 there may be better solution available.
1048
1049 In particular this change produced slower code for numeric
1050 i387 programs. */
1051
1052 continue;
1053 }
1054
1055 if (! regclass_compatible_p (src_class, dst_class))
1056 {
1057 if (!copy_src)
1058 {
1059 copy_src = src;
1060 copy_dst = dst;
1061 }
1062 continue;
1063 }
1064
1065 /* Can not modify an earlier insn to set dst if this insn
1066 uses an old value in the source. */
1067 if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
1068 {
1069 if (!copy_src)
1070 {
1071 copy_src = src;
1072 copy_dst = dst;
1073 }
1074 continue;
1075 }
1076
1077 /* If src is set once in a different basic block,
1078 and is set equal to a constant, then do not use
1079 it for this optimization, as this would make it
1080 no longer equivalent to a constant. */
1081
1082 if (reg_is_remote_constant_p (src, insn))
1083 {
1084 if (!copy_src)
1085 {
1086 copy_src = src;
1087 copy_dst = dst;
1088 }
1089 continue;
1090 }
1091
1092
1093 if (dump_file)
1094 fprintf (dump_file,
1095 "Could fix operand %d of insn %d matching operand %d.\n",
1096 op_no, INSN_UID (insn), match_no);
1097
1098 /* Scan backward to find the first instruction that uses
1099 the input operand. If the operand is set here, then
1100 replace it in both instructions with match_no. */
1101
1102 for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
1103 {
1104 rtx pset;
1105
1106 if (! INSN_P (p))
1107 continue;
1108 if (BLOCK_FOR_INSN (p) != bb)
1109 break;
1110
1111 if (!DEBUG_INSN_P (p))
1112 length++;
1113
1114 /* ??? See if all of SRC is set in P. This test is much
1115 more conservative than it needs to be. */
1116 pset = single_set (p);
1117 if (pset && SET_DEST (pset) == src)
1118 {
1119 /* We use validate_replace_rtx, in case there
1120 are multiple identical source operands. All
1121 of them have to be changed at the same time:
1122 when validate_replace_rtx() calls
1123 apply_change_group(). */
1124 validate_change (p, &SET_DEST (pset), dst, 1);
1125 if (validate_replace_rtx (src, dst, insn))
1126 success = 1;
1127 break;
1128 }
1129
1130 /* We can't make this change if DST is mentioned at
1131 all in P, since we are going to change its value.
1132 We can't make this change if SRC is read or
1133 partially written in P, since we are going to
1134 eliminate SRC. However, if it's a debug insn, we
1135 can't refrain from making the change, for this
1136 would cause codegen differences, so instead we
1137 invalidate debug expressions that reference DST,
1138 and adjust references to SRC in them so that they
1139 become references to DST. */
1140 if (reg_mentioned_p (dst, PATTERN (p)))
1141 {
1142 if (DEBUG_INSN_P (p))
1143 validate_change (p, &INSN_VAR_LOCATION_LOC (p),
1144 gen_rtx_UNKNOWN_VAR_LOC (), 1);
1145 else
1146 break;
1147 }
1148 if (reg_overlap_mentioned_p (src, PATTERN (p)))
1149 {
1150 if (DEBUG_INSN_P (p))
1151 validate_replace_rtx_group (src, dst, p);
1152 else
1153 break;
1154 }
1155
1156 /* If we have passed a call instruction, and the
1157 pseudo-reg DST is not already live across a call,
1158 then don't perform the optimization. */
1159 if (CALL_P (p))
1160 {
1161 num_calls++;
1162 freq_calls += REG_FREQ_FROM_BB (BLOCK_FOR_INSN (p));
1163
1164 if (REG_N_CALLS_CROSSED (REGNO (dst)) == 0)
1165 break;
1166 }
1167 }
1168
1169 if (success)
1170 {
1171 int dstno, srcno;
1172
1173 /* Remove the death note for SRC from INSN. */
1174 remove_note (insn, src_note);
1175 /* Move the death note for SRC to P if it is used
1176 there. */
1177 if (reg_overlap_mentioned_p (src, PATTERN (p)))
1178 {
1179 XEXP (src_note, 1) = REG_NOTES (p);
1180 REG_NOTES (p) = src_note;
1181 }
1182 /* If there is a REG_DEAD note for DST on P, then remove
1183 it, because DST is now set there. */
1184 if ((dst_note = find_reg_note (p, REG_DEAD, dst)))
1185 remove_note (p, dst_note);
1186
1187 dstno = REGNO (dst);
1188 srcno = REGNO (src);
1189
1190 INC_REG_N_SETS (dstno, 1);
1191 INC_REG_N_SETS (srcno, -1);
1192
1193 REG_N_CALLS_CROSSED (dstno) += num_calls;
1194 REG_N_CALLS_CROSSED (srcno) -= num_calls;
1195 REG_FREQ_CALLS_CROSSED (dstno) += freq_calls;
1196 REG_FREQ_CALLS_CROSSED (srcno) -= freq_calls;
1197
1198 REG_LIVE_LENGTH (dstno) += length;
1199 if (REG_LIVE_LENGTH (srcno) >= 0)
1200 {
1201 REG_LIVE_LENGTH (srcno) -= length;
1202 /* REG_LIVE_LENGTH is only an approximation after
1203 combine if sched is not run, so make sure that we
1204 still have a reasonable value. */
1205 if (REG_LIVE_LENGTH (srcno) < 2)
1206 REG_LIVE_LENGTH (srcno) = 2;
1207 }
1208
1209 if (dump_file)
1210 fprintf (dump_file,
1211 "Fixed operand %d of insn %d matching operand %d.\n",
1212 op_no, INSN_UID (insn), match_no);
1213
1214 break;
1215 }
1216 else if (num_changes_pending () > 0)
1217 cancel_changes (0);
1218 }
1219
1220 /* If we weren't able to replace any of the alternatives, try an
1221 alternative approach of copying the source to the destination. */
1222 if (!success && copy_src != NULL_RTX)
1223 copy_src_to_dest (insn, copy_src, copy_dst);
1224 }
1225 }
1226 }
1227
1228 /* Main entry for the register move optimization. */
1229
1230 static unsigned int
1231 regmove_optimize (void)
1232 {
1233 int i;
1234 int nregs = max_reg_num ();
1235
1236 df_note_add_problem ();
1237 df_analyze ();
1238
1239 if (flag_ira_loop_pressure)
1240 ira_set_pseudo_classes (dump_file);
1241
1242 regstat_init_n_sets_and_refs ();
1243 regstat_compute_ri ();
1244
1245 regno_src_regno = XNEWVEC (int, nregs);
1246 for (i = nregs; --i >= 0; )
1247 regno_src_regno[i] = -1;
1248
1249 /* A forward pass. Replace output operands with input operands. */
1250 regmove_forward_pass ();
1251
1252 /* A backward pass. Replace input operands with output operands. */
1253 regmove_backward_pass ();
1254
1255 /* Clean up. */
1256 free (regno_src_regno);
1257 if (reg_set_in_bb)
1258 {
1259 free (reg_set_in_bb);
1260 reg_set_in_bb = NULL;
1261 }
1262 regstat_free_n_sets_and_refs ();
1263 regstat_free_ri ();
1264 if (flag_ira_loop_pressure)
1265 free_reg_info ();
1266 return 0;
1267 }
1268
1269 /* Returns nonzero if INSN's pattern has matching constraints for any operand.
1270 Returns 0 if INSN can't be recognized, or if the alternative can't be
1271 determined.
1272
1273 Initialize the info in MATCHP based on the constraints. */
1274
1275 static int
1276 find_matches (rtx insn, struct match *matchp)
1277 {
1278 int likely_spilled[MAX_RECOG_OPERANDS];
1279 int op_no;
1280 int any_matches = 0;
1281
1282 extract_insn (insn);
1283 if (! constrain_operands (0))
1284 return 0;
1285
1286 /* Must initialize this before main loop, because the code for
1287 the commutative case may set matches for operands other than
1288 the current one. */
1289 for (op_no = recog_data.n_operands; --op_no >= 0; )
1290 matchp->with[op_no] = matchp->commutative[op_no] = -1;
1291
1292 for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1293 {
1294 const char *p;
1295 char c;
1296 int i = 0;
1297
1298 p = recog_data.constraints[op_no];
1299
1300 likely_spilled[op_no] = 0;
1301 matchp->use[op_no] = READ;
1302 matchp->early_clobber[op_no] = 0;
1303 if (*p == '=')
1304 matchp->use[op_no] = WRITE;
1305 else if (*p == '+')
1306 matchp->use[op_no] = READWRITE;
1307
1308 for (;*p && i < which_alternative; p++)
1309 if (*p == ',')
1310 i++;
1311
1312 while ((c = *p) != '\0' && c != ',')
1313 {
1314 switch (c)
1315 {
1316 case '=':
1317 break;
1318 case '+':
1319 break;
1320 case '&':
1321 matchp->early_clobber[op_no] = 1;
1322 break;
1323 case '%':
1324 matchp->commutative[op_no] = op_no + 1;
1325 matchp->commutative[op_no + 1] = op_no;
1326 break;
1327
1328 case '0': case '1': case '2': case '3': case '4':
1329 case '5': case '6': case '7': case '8': case '9':
1330 {
1331 char *end;
1332 unsigned long match_ul = strtoul (p, &end, 10);
1333 int match = match_ul;
1334
1335 p = end;
1336
1337 if (match < op_no && likely_spilled[match])
1338 continue;
1339 matchp->with[op_no] = match;
1340 any_matches = 1;
1341 if (matchp->commutative[op_no] >= 0)
1342 matchp->with[matchp->commutative[op_no]] = match;
1343 }
1344 continue;
1345
1346 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'h':
1347 case 'j': case 'k': case 'l': case 'p': case 'q': case 't': case 'u':
1348 case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B':
1349 case 'C': case 'D': case 'W': case 'Y': case 'Z':
1350 if (targetm.class_likely_spilled_p (REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p)))
1351 likely_spilled[op_no] = 1;
1352 break;
1353 }
1354 p += CONSTRAINT_LEN (c, p);
1355 }
1356 }
1357 return any_matches;
1358 }
1359
1360 \f
1361
1362 static bool
1363 gate_handle_regmove (void)
1364 {
1365 return (optimize > 0 && flag_regmove);
1366 }
1367
1368
1369 struct rtl_opt_pass pass_regmove =
1370 {
1371 {
1372 RTL_PASS,
1373 "regmove", /* name */
1374 gate_handle_regmove, /* gate */
1375 regmove_optimize, /* execute */
1376 NULL, /* sub */
1377 NULL, /* next */
1378 0, /* static_pass_number */
1379 TV_REGMOVE, /* tv_id */
1380 0, /* properties_required */
1381 0, /* properties_provided */
1382 0, /* properties_destroyed */
1383 0, /* todo_flags_start */
1384 TODO_df_finish | TODO_verify_rtl_sharing |
1385 TODO_dump_func |
1386 TODO_ggc_collect /* todo_flags_finish */
1387 }
1388 };