i386.c (legitimize_tls_address): Generate tls_initial_exec_64_sun only when !TARGET_X32.
[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_MODES_P (GET_MODE (src), GET_MODE (src_reg)))
552 return;
553
554 set_insn = p;
555 old_mode = GET_MODE (src_reg);
556 PUT_MODE (src_reg, GET_MODE (src));
557 XEXP (src, 0) = SET_SRC (set);
558
559 /* Include this change in the group so that it's easily undone if
560 one of the changes in the group is invalid. */
561 validate_change (p, &SET_SRC (set), src, 1);
562
563 /* Now walk forward making additional replacements. We want to be able
564 to undo all the changes if a later substitution fails. */
565 while (p = NEXT_INSN (p), p != insn)
566 {
567 if (! INSN_P (p))
568 continue;
569
570 /* Make a tentative change. */
571 validate_replace_rtx_group (src_reg,
572 gen_lowpart_SUBREG (old_mode, src_reg),
573 p);
574 }
575
576 validate_replace_rtx_group (src, src_reg, insn);
577
578 /* Now see if all the changes are valid. */
579 if (! apply_change_group ())
580 {
581 /* One or more changes were no good. Back out everything. */
582 PUT_MODE (src_reg, old_mode);
583 XEXP (src, 0) = src_reg;
584 }
585 else
586 {
587 rtx note = find_reg_note (set_insn, REG_EQUAL, NULL_RTX);
588 if (note)
589 {
590 if (rtx_equal_p (XEXP (note, 0), XEXP (src, 0)))
591 {
592 XEXP (note, 0)
593 = gen_rtx_fmt_e (GET_CODE (src), GET_MODE (src),
594 XEXP (note, 0));
595 df_notes_rescan (set_insn);
596 }
597 else
598 remove_note (set_insn, note);
599 }
600 }
601 }
602
603 \f
604 /* If we were not able to update the users of src to use dest directly, try
605 instead moving the value to dest directly before the operation. */
606
607 static void
608 copy_src_to_dest (rtx insn, rtx src, rtx dest)
609 {
610 rtx seq;
611 rtx link;
612 rtx next;
613 rtx set;
614 rtx move_insn;
615 rtx *p_insn_notes;
616 rtx *p_move_notes;
617 int src_regno;
618 int dest_regno;
619
620 /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant
621 or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is
622 parameter when there is no frame pointer that is not allocated a register.
623 For now, we just reject them, rather than incrementing the live length. */
624
625 if (REG_P (src)
626 && REG_LIVE_LENGTH (REGNO (src)) > 0
627 && REG_P (dest)
628 && REG_LIVE_LENGTH (REGNO (dest)) > 0
629 && (set = single_set (insn)) != NULL_RTX
630 && !reg_mentioned_p (dest, SET_SRC (set))
631 && GET_MODE (src) == GET_MODE (dest))
632 {
633 int old_num_regs = reg_rtx_no;
634
635 /* Generate the src->dest move. */
636 start_sequence ();
637 emit_move_insn (dest, src);
638 seq = get_insns ();
639 end_sequence ();
640 /* If this sequence uses new registers, we may not use it. */
641 if (old_num_regs != reg_rtx_no
642 || ! validate_replace_rtx (src, dest, insn))
643 {
644 /* We have to restore reg_rtx_no to its old value, lest
645 recompute_reg_usage will try to compute the usage of the
646 new regs, yet reg_n_info is not valid for them. */
647 reg_rtx_no = old_num_regs;
648 return;
649 }
650 emit_insn_before (seq, insn);
651 move_insn = PREV_INSN (insn);
652 p_move_notes = &REG_NOTES (move_insn);
653 p_insn_notes = &REG_NOTES (insn);
654
655 /* Move any notes mentioning src to the move instruction. */
656 for (link = REG_NOTES (insn); link != NULL_RTX; link = next)
657 {
658 next = XEXP (link, 1);
659 if (XEXP (link, 0) == src)
660 {
661 *p_move_notes = link;
662 p_move_notes = &XEXP (link, 1);
663 }
664 else
665 {
666 *p_insn_notes = link;
667 p_insn_notes = &XEXP (link, 1);
668 }
669 }
670
671 *p_move_notes = NULL_RTX;
672 *p_insn_notes = NULL_RTX;
673
674 /* Update the various register tables. */
675 dest_regno = REGNO (dest);
676 INC_REG_N_SETS (dest_regno, 1);
677 REG_LIVE_LENGTH (dest_regno)++;
678 src_regno = REGNO (src);
679 if (! find_reg_note (move_insn, REG_DEAD, src))
680 REG_LIVE_LENGTH (src_regno)++;
681 }
682 }
683
684 /* reg_set_in_bb[REGNO] points to basic block iff the register is set
685 only once in the given block and has REG_EQUAL note. */
686
687 static basic_block *reg_set_in_bb;
688
689 /* Size of reg_set_in_bb array. */
690 static unsigned int max_reg_computed;
691
692 \f
693 /* Return whether REG is set in only one location, and is set to a
694 constant, but is set in a different basic block from INSN (an
695 instructions which uses REG). In this case REG is equivalent to a
696 constant, and we don't want to break that equivalence, because that
697 may increase register pressure and make reload harder. If REG is
698 set in the same basic block as INSN, we don't worry about it,
699 because we'll probably need a register anyhow (??? but what if REG
700 is used in a different basic block as well as this one?). */
701
702 static bool
703 reg_is_remote_constant_p (rtx reg, rtx insn)
704 {
705 basic_block bb;
706 rtx p;
707 int max;
708
709 if (!reg_set_in_bb)
710 {
711 max_reg_computed = max = max_reg_num ();
712 reg_set_in_bb = XCNEWVEC (basic_block, max);
713
714 FOR_EACH_BB (bb)
715 FOR_BB_INSNS (bb, p)
716 {
717 rtx s;
718
719 if (!INSN_P (p))
720 continue;
721 s = single_set (p);
722 /* This is the instruction which sets REG. If there is a
723 REG_EQUAL note, then REG is equivalent to a constant. */
724 if (s != 0
725 && REG_P (SET_DEST (s))
726 && REG_N_SETS (REGNO (SET_DEST (s))) == 1
727 && find_reg_note (p, REG_EQUAL, NULL_RTX))
728 reg_set_in_bb[REGNO (SET_DEST (s))] = bb;
729 }
730 }
731
732 gcc_assert (REGNO (reg) < max_reg_computed);
733 if (reg_set_in_bb[REGNO (reg)] == NULL)
734 return false;
735 return (reg_set_in_bb[REGNO (reg)] != BLOCK_FOR_INSN (insn));
736 }
737
738 /* INSN is adding a CONST_INT to a REG. We search backwards looking for
739 another add immediate instruction with the same source and dest registers,
740 and if we find one, we change INSN to an increment, and return 1. If
741 no changes are made, we return 0.
742
743 This changes
744 (set (reg100) (plus reg1 offset1))
745 ...
746 (set (reg100) (plus reg1 offset2))
747 to
748 (set (reg100) (plus reg1 offset1))
749 ...
750 (set (reg100) (plus reg100 offset2-offset1)) */
751
752 /* ??? What does this comment mean? */
753 /* cse disrupts preincrement / postdecrement sequences when it finds a
754 hard register as ultimate source, like the frame pointer. */
755
756 static int
757 fixup_match_2 (rtx insn, rtx dst, rtx src, rtx offset)
758 {
759 rtx p, dst_death = 0;
760 int length, num_calls = 0, freq_calls = 0;
761 basic_block bb = BLOCK_FOR_INSN (insn);
762
763 /* If SRC dies in INSN, we'd have to move the death note. This is
764 considered to be very unlikely, so we just skip the optimization
765 in this case. */
766 if (find_regno_note (insn, REG_DEAD, REGNO (src)))
767 return 0;
768
769 /* Scan backward to find the first instruction that sets DST. */
770
771 for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
772 {
773 rtx pset;
774
775 if (! INSN_P (p))
776 continue;
777 if (BLOCK_FOR_INSN (p) != bb)
778 break;
779
780 if (find_regno_note (p, REG_DEAD, REGNO (dst)))
781 dst_death = p;
782 if (! dst_death && !DEBUG_INSN_P (p))
783 length++;
784
785 pset = single_set (p);
786 if (pset && SET_DEST (pset) == dst
787 && GET_CODE (SET_SRC (pset)) == PLUS
788 && XEXP (SET_SRC (pset), 0) == src
789 && CONST_INT_P (XEXP (SET_SRC (pset), 1)))
790 {
791 HOST_WIDE_INT newconst
792 = INTVAL (offset) - INTVAL (XEXP (SET_SRC (pset), 1));
793 rtx add = gen_add3_insn (dst, dst, GEN_INT (newconst));
794
795 if (add && validate_change (insn, &PATTERN (insn), add, 0))
796 {
797 /* Remove the death note for DST from DST_DEATH. */
798 if (dst_death)
799 {
800 remove_death (REGNO (dst), dst_death);
801 REG_LIVE_LENGTH (REGNO (dst)) += length;
802 REG_N_CALLS_CROSSED (REGNO (dst)) += num_calls;
803 REG_FREQ_CALLS_CROSSED (REGNO (dst)) += freq_calls;
804 }
805
806 if (dump_file)
807 fprintf (dump_file,
808 "Fixed operand of insn %d.\n",
809 INSN_UID (insn));
810
811 #ifdef AUTO_INC_DEC
812 for (p = PREV_INSN (insn); p; p = PREV_INSN (p))
813 {
814 if (! INSN_P (p))
815 continue;
816 if (BLOCK_FOR_INSN (p) != bb)
817 break;
818 if (reg_overlap_mentioned_p (dst, PATTERN (p)))
819 {
820 if (try_auto_increment (p, insn, 0, dst, newconst, 0))
821 return 1;
822 break;
823 }
824 }
825 for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
826 {
827 if (! INSN_P (p))
828 continue;
829 if (BLOCK_FOR_INSN (p) != bb)
830 break;
831 if (reg_overlap_mentioned_p (dst, PATTERN (p)))
832 {
833 try_auto_increment (p, insn, 0, dst, newconst, 1);
834 break;
835 }
836 }
837 #endif
838 return 1;
839 }
840 }
841
842 if (reg_set_p (dst, PATTERN (p)))
843 break;
844
845 /* If we have passed a call instruction, and the
846 pseudo-reg SRC is not already live across a call,
847 then don't perform the optimization. */
848 /* reg_set_p is overly conservative for CALL_INSNS, thinks that all
849 hard regs are clobbered. Thus, we only use it for src for
850 non-call insns. */
851 if (CALL_P (p))
852 {
853 if (! dst_death)
854 {
855 num_calls++;
856 freq_calls += REG_FREQ_FROM_BB (BLOCK_FOR_INSN (p));
857 }
858
859 if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
860 break;
861
862 if ((HARD_REGISTER_P (dst) && call_used_regs [REGNO (dst)])
863 || find_reg_fusage (p, CLOBBER, dst))
864 break;
865 }
866 else if (reg_set_p (src, PATTERN (p)))
867 break;
868 }
869
870 return 0;
871 }
872
873 /* A forward pass. Replace output operands with input operands. */
874
875 static void
876 regmove_forward_pass (void)
877 {
878 basic_block bb;
879 rtx insn;
880
881 if (! flag_expensive_optimizations)
882 return;
883
884 if (dump_file)
885 fprintf (dump_file, "Starting forward pass...\n");
886
887 FOR_EACH_BB (bb)
888 {
889 FOR_BB_INSNS (bb, insn)
890 {
891 rtx set = single_set (insn);
892 if (! set)
893 continue;
894
895 if ((GET_CODE (SET_SRC (set)) == SIGN_EXTEND
896 || GET_CODE (SET_SRC (set)) == ZERO_EXTEND)
897 && REG_P (XEXP (SET_SRC (set), 0))
898 && REG_P (SET_DEST (set)))
899 optimize_reg_copy_3 (insn, SET_DEST (set), SET_SRC (set));
900
901 if (REG_P (SET_SRC (set))
902 && REG_P (SET_DEST (set)))
903 {
904 /* If this is a register-register copy where SRC is not dead,
905 see if we can optimize it. If this optimization succeeds,
906 it will become a copy where SRC is dead. */
907 if ((find_reg_note (insn, REG_DEAD, SET_SRC (set))
908 || optimize_reg_copy_1 (insn, SET_DEST (set), SET_SRC (set)))
909 && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
910 {
911 /* Similarly for a pseudo-pseudo copy when SRC is dead. */
912 if (REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER)
913 optimize_reg_copy_2 (insn, SET_DEST (set), SET_SRC (set));
914 if (regno_src_regno[REGNO (SET_DEST (set))] < 0
915 && SET_SRC (set) != SET_DEST (set))
916 {
917 int srcregno = REGNO (SET_SRC (set));
918 if (regno_src_regno[srcregno] >= 0)
919 srcregno = regno_src_regno[srcregno];
920 regno_src_regno[REGNO (SET_DEST (set))] = srcregno;
921 }
922 }
923 }
924 }
925 }
926 }
927
928 /* A backward pass. Replace input operands with output operands. */
929
930 static void
931 regmove_backward_pass (void)
932 {
933 basic_block bb;
934 rtx insn, prev;
935
936 if (dump_file)
937 fprintf (dump_file, "Starting backward pass...\n");
938
939 FOR_EACH_BB_REVERSE (bb)
940 {
941 /* ??? Use the safe iterator because fixup_match_2 can remove
942 insns via try_auto_increment. */
943 FOR_BB_INSNS_REVERSE_SAFE (bb, insn, prev)
944 {
945 struct match match;
946 rtx copy_src, copy_dst;
947 int op_no, match_no;
948 int success = 0;
949
950 if (! INSN_P (insn))
951 continue;
952
953 if (! find_matches (insn, &match))
954 continue;
955
956 /* Now scan through the operands looking for a destination operand
957 which is supposed to match a source operand.
958 Then scan backward for an instruction which sets the source
959 operand. If safe, then replace the source operand with the
960 dest operand in both instructions. */
961
962 copy_src = NULL_RTX;
963 copy_dst = NULL_RTX;
964 for (op_no = 0; op_no < recog_data.n_operands; op_no++)
965 {
966 rtx set, p, src, dst;
967 rtx src_note, dst_note;
968 int num_calls = 0, freq_calls = 0;
969 enum reg_class src_class, dst_class;
970 int length;
971
972 match_no = match.with[op_no];
973
974 /* Nothing to do if the two operands aren't supposed to match. */
975 if (match_no < 0)
976 continue;
977
978 dst = recog_data.operand[match_no];
979 src = recog_data.operand[op_no];
980
981 if (!REG_P (src))
982 continue;
983
984 if (!REG_P (dst)
985 || REGNO (dst) < FIRST_PSEUDO_REGISTER
986 || REG_LIVE_LENGTH (REGNO (dst)) < 0
987 || GET_MODE (src) != GET_MODE (dst))
988 continue;
989
990 /* If the operands already match, then there is nothing to do. */
991 if (operands_match_p (src, dst))
992 continue;
993
994 if (match.commutative[op_no] >= 0)
995 {
996 rtx comm = recog_data.operand[match.commutative[op_no]];
997 if (operands_match_p (comm, dst))
998 continue;
999 }
1000
1001 set = single_set (insn);
1002 if (! set)
1003 continue;
1004
1005 /* Note that single_set ignores parts of a parallel set for
1006 which one of the destinations is REG_UNUSED. We can't
1007 handle that here, since we can wind up rewriting things
1008 such that a single register is set twice within a single
1009 parallel. */
1010 if (reg_set_p (src, insn))
1011 continue;
1012
1013 /* match_no/dst must be a write-only operand, and
1014 operand_operand/src must be a read-only operand. */
1015 if (match.use[op_no] != READ
1016 || match.use[match_no] != WRITE)
1017 continue;
1018
1019 if (match.early_clobber[match_no]
1020 && count_occurrences (PATTERN (insn), src, 0) > 1)
1021 continue;
1022
1023 /* Make sure match_no is the destination. */
1024 if (recog_data.operand[match_no] != SET_DEST (set))
1025 continue;
1026
1027 if (REGNO (src) < FIRST_PSEUDO_REGISTER)
1028 {
1029 if (GET_CODE (SET_SRC (set)) == PLUS
1030 && CONST_INT_P (XEXP (SET_SRC (set), 1))
1031 && XEXP (SET_SRC (set), 0) == src
1032 && fixup_match_2 (insn, dst, src,
1033 XEXP (SET_SRC (set), 1)))
1034 break;
1035 continue;
1036 }
1037 src_class = reg_preferred_class (REGNO (src));
1038 dst_class = reg_preferred_class (REGNO (dst));
1039
1040 if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
1041 {
1042 /* We used to force the copy here like in other cases, but
1043 it produces worse code, as it eliminates no copy
1044 instructions and the copy emitted will be produced by
1045 reload anyway. On patterns with multiple alternatives,
1046 there may be better solution available.
1047
1048 In particular this change produced slower code for numeric
1049 i387 programs. */
1050
1051 continue;
1052 }
1053
1054 if (! regclass_compatible_p (src_class, dst_class))
1055 {
1056 if (!copy_src)
1057 {
1058 copy_src = src;
1059 copy_dst = dst;
1060 }
1061 continue;
1062 }
1063
1064 /* Can not modify an earlier insn to set dst if this insn
1065 uses an old value in the source. */
1066 if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
1067 {
1068 if (!copy_src)
1069 {
1070 copy_src = src;
1071 copy_dst = dst;
1072 }
1073 continue;
1074 }
1075
1076 /* If src is set once in a different basic block,
1077 and is set equal to a constant, then do not use
1078 it for this optimization, as this would make it
1079 no longer equivalent to a constant. */
1080
1081 if (reg_is_remote_constant_p (src, insn))
1082 {
1083 if (!copy_src)
1084 {
1085 copy_src = src;
1086 copy_dst = dst;
1087 }
1088 continue;
1089 }
1090
1091
1092 if (dump_file)
1093 fprintf (dump_file,
1094 "Could fix operand %d of insn %d matching operand %d.\n",
1095 op_no, INSN_UID (insn), match_no);
1096
1097 /* Scan backward to find the first instruction that uses
1098 the input operand. If the operand is set here, then
1099 replace it in both instructions with match_no. */
1100
1101 for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
1102 {
1103 rtx pset;
1104
1105 if (! INSN_P (p))
1106 continue;
1107 if (BLOCK_FOR_INSN (p) != bb)
1108 break;
1109
1110 if (!DEBUG_INSN_P (p))
1111 length++;
1112
1113 /* ??? See if all of SRC is set in P. This test is much
1114 more conservative than it needs to be. */
1115 pset = single_set (p);
1116 if (pset && SET_DEST (pset) == src)
1117 {
1118 /* We use validate_replace_rtx, in case there
1119 are multiple identical source operands. All
1120 of them have to be changed at the same time:
1121 when validate_replace_rtx() calls
1122 apply_change_group(). */
1123 validate_change (p, &SET_DEST (pset), dst, 1);
1124 if (validate_replace_rtx (src, dst, insn))
1125 success = 1;
1126 break;
1127 }
1128
1129 /* We can't make this change if DST is mentioned at
1130 all in P, since we are going to change its value.
1131 We can't make this change if SRC is read or
1132 partially written in P, since we are going to
1133 eliminate SRC. However, if it's a debug insn, we
1134 can't refrain from making the change, for this
1135 would cause codegen differences, so instead we
1136 invalidate debug expressions that reference DST,
1137 and adjust references to SRC in them so that they
1138 become references to DST. */
1139 if (reg_mentioned_p (dst, PATTERN (p)))
1140 {
1141 if (DEBUG_INSN_P (p))
1142 validate_change (p, &INSN_VAR_LOCATION_LOC (p),
1143 gen_rtx_UNKNOWN_VAR_LOC (), 1);
1144 else
1145 break;
1146 }
1147 if (reg_overlap_mentioned_p (src, PATTERN (p)))
1148 {
1149 if (DEBUG_INSN_P (p))
1150 validate_replace_rtx_group (src, dst, p);
1151 else
1152 break;
1153 }
1154
1155 /* If we have passed a call instruction, and the
1156 pseudo-reg DST is not already live across a call,
1157 then don't perform the optimization. */
1158 if (CALL_P (p))
1159 {
1160 num_calls++;
1161 freq_calls += REG_FREQ_FROM_BB (BLOCK_FOR_INSN (p));
1162
1163 if (REG_N_CALLS_CROSSED (REGNO (dst)) == 0)
1164 break;
1165 }
1166 }
1167
1168 if (success)
1169 {
1170 int dstno, srcno;
1171
1172 /* Remove the death note for SRC from INSN. */
1173 remove_note (insn, src_note);
1174 /* Move the death note for SRC to P if it is used
1175 there. */
1176 if (reg_overlap_mentioned_p (src, PATTERN (p)))
1177 {
1178 XEXP (src_note, 1) = REG_NOTES (p);
1179 REG_NOTES (p) = src_note;
1180 }
1181 /* If there is a REG_DEAD note for DST on P, then remove
1182 it, because DST is now set there. */
1183 if ((dst_note = find_reg_note (p, REG_DEAD, dst)))
1184 remove_note (p, dst_note);
1185
1186 dstno = REGNO (dst);
1187 srcno = REGNO (src);
1188
1189 INC_REG_N_SETS (dstno, 1);
1190 INC_REG_N_SETS (srcno, -1);
1191
1192 REG_N_CALLS_CROSSED (dstno) += num_calls;
1193 REG_N_CALLS_CROSSED (srcno) -= num_calls;
1194 REG_FREQ_CALLS_CROSSED (dstno) += freq_calls;
1195 REG_FREQ_CALLS_CROSSED (srcno) -= freq_calls;
1196
1197 REG_LIVE_LENGTH (dstno) += length;
1198 if (REG_LIVE_LENGTH (srcno) >= 0)
1199 {
1200 REG_LIVE_LENGTH (srcno) -= length;
1201 /* REG_LIVE_LENGTH is only an approximation after
1202 combine if sched is not run, so make sure that we
1203 still have a reasonable value. */
1204 if (REG_LIVE_LENGTH (srcno) < 2)
1205 REG_LIVE_LENGTH (srcno) = 2;
1206 }
1207
1208 if (dump_file)
1209 fprintf (dump_file,
1210 "Fixed operand %d of insn %d matching operand %d.\n",
1211 op_no, INSN_UID (insn), match_no);
1212
1213 break;
1214 }
1215 else if (num_changes_pending () > 0)
1216 cancel_changes (0);
1217 }
1218
1219 /* If we weren't able to replace any of the alternatives, try an
1220 alternative approach of copying the source to the destination. */
1221 if (!success && copy_src != NULL_RTX)
1222 copy_src_to_dest (insn, copy_src, copy_dst);
1223 }
1224 }
1225 }
1226
1227 /* Main entry for the register move optimization. */
1228
1229 static unsigned int
1230 regmove_optimize (void)
1231 {
1232 int i;
1233 int nregs = max_reg_num ();
1234
1235 df_note_add_problem ();
1236 df_analyze ();
1237
1238 regstat_init_n_sets_and_refs ();
1239 regstat_compute_ri ();
1240
1241 if (flag_ira_loop_pressure)
1242 ira_set_pseudo_classes (dump_file);
1243
1244 regno_src_regno = XNEWVEC (int, nregs);
1245 for (i = nregs; --i >= 0; )
1246 regno_src_regno[i] = -1;
1247
1248 /* A forward pass. Replace output operands with input operands. */
1249 regmove_forward_pass ();
1250
1251 /* A backward pass. Replace input operands with output operands. */
1252 regmove_backward_pass ();
1253
1254 /* Clean up. */
1255 free (regno_src_regno);
1256 if (reg_set_in_bb)
1257 {
1258 free (reg_set_in_bb);
1259 reg_set_in_bb = NULL;
1260 }
1261 regstat_free_n_sets_and_refs ();
1262 regstat_free_ri ();
1263 if (flag_ira_loop_pressure)
1264 free_reg_info ();
1265 return 0;
1266 }
1267
1268 /* Returns nonzero if INSN's pattern has matching constraints for any operand.
1269 Returns 0 if INSN can't be recognized, or if the alternative can't be
1270 determined.
1271
1272 Initialize the info in MATCHP based on the constraints. */
1273
1274 static int
1275 find_matches (rtx insn, struct match *matchp)
1276 {
1277 int likely_spilled[MAX_RECOG_OPERANDS];
1278 int op_no;
1279 int any_matches = 0;
1280
1281 extract_insn (insn);
1282 if (! constrain_operands (0))
1283 return 0;
1284
1285 /* Must initialize this before main loop, because the code for
1286 the commutative case may set matches for operands other than
1287 the current one. */
1288 for (op_no = recog_data.n_operands; --op_no >= 0; )
1289 matchp->with[op_no] = matchp->commutative[op_no] = -1;
1290
1291 for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1292 {
1293 const char *p;
1294 char c;
1295 int i = 0;
1296
1297 p = recog_data.constraints[op_no];
1298
1299 likely_spilled[op_no] = 0;
1300 matchp->use[op_no] = READ;
1301 matchp->early_clobber[op_no] = 0;
1302 if (*p == '=')
1303 matchp->use[op_no] = WRITE;
1304 else if (*p == '+')
1305 matchp->use[op_no] = READWRITE;
1306
1307 for (;*p && i < which_alternative; p++)
1308 if (*p == ',')
1309 i++;
1310
1311 while ((c = *p) != '\0' && c != ',')
1312 {
1313 switch (c)
1314 {
1315 case '=':
1316 break;
1317 case '+':
1318 break;
1319 case '&':
1320 matchp->early_clobber[op_no] = 1;
1321 break;
1322 case '%':
1323 matchp->commutative[op_no] = op_no + 1;
1324 matchp->commutative[op_no + 1] = op_no;
1325 break;
1326
1327 case '0': case '1': case '2': case '3': case '4':
1328 case '5': case '6': case '7': case '8': case '9':
1329 {
1330 char *end;
1331 unsigned long match_ul = strtoul (p, &end, 10);
1332 int match = match_ul;
1333
1334 p = end;
1335
1336 if (match < op_no && likely_spilled[match])
1337 continue;
1338 matchp->with[op_no] = match;
1339 any_matches = 1;
1340 if (matchp->commutative[op_no] >= 0)
1341 matchp->with[matchp->commutative[op_no]] = match;
1342 }
1343 continue;
1344
1345 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'h':
1346 case 'j': case 'k': case 'l': case 'p': case 'q': case 't': case 'u':
1347 case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B':
1348 case 'C': case 'D': case 'W': case 'Y': case 'Z':
1349 if (targetm.class_likely_spilled_p (REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p)))
1350 likely_spilled[op_no] = 1;
1351 break;
1352 }
1353 p += CONSTRAINT_LEN (c, p);
1354 }
1355 }
1356 return any_matches;
1357 }
1358
1359 \f
1360
1361 static bool
1362 gate_handle_regmove (void)
1363 {
1364 return (optimize > 0 && flag_regmove);
1365 }
1366
1367
1368 struct rtl_opt_pass pass_regmove =
1369 {
1370 {
1371 RTL_PASS,
1372 "regmove", /* name */
1373 gate_handle_regmove, /* gate */
1374 regmove_optimize, /* execute */
1375 NULL, /* sub */
1376 NULL, /* next */
1377 0, /* static_pass_number */
1378 TV_REGMOVE, /* tv_id */
1379 0, /* properties_required */
1380 0, /* properties_provided */
1381 0, /* properties_destroyed */
1382 0, /* todo_flags_start */
1383 TODO_df_finish | TODO_verify_rtl_sharing |
1384 TODO_ggc_collect /* todo_flags_finish */
1385 }
1386 };