regmove.c 62.9 KB
Newer Older
1
/* Move registers around to reduce number of move instructions needed.
2 3 4
   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
   Free Software Foundation, Inc.
5

6
This file is part of GCC.
7

8 9
GCC is free software; you can redistribute it and/or modify it under
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 14 15 16
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
17 18

You should have received a copy of the GNU General Public License
19 20
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
21 22 23 24 25 26 27 28


/* This module looks for cases where matching constraints would force
   an instruction to need a reload, and this reload would be a register
   to register move.  It then attempts to change the registers used by the
   instruction to avoid the move instruction.  */

#include "config.h"
29
#include "system.h"
30 31
#include "coretypes.h"
#include "tm.h"
32
#include "rtl.h" /* stdio.h must precede rtl.h for FFS.  */
33
#include "tm_p.h"
34 35 36 37
#include "insn-config.h"
#include "recog.h"
#include "output.h"
#include "regs.h"
38 39
#include "hard-reg-set.h"
#include "flags.h"
40
#include "function.h"
41
#include "expr.h"
42
#include "basic-block.h"
43
#include "except.h"
Graham Stott committed
44
#include "toplev.h"
45
#include "reload.h"
46 47
#include "timevar.h"
#include "tree-pass.h"
48
#include "df.h"
49

50 51 52 53
static int perhaps_ends_bb_p (rtx);
static int optimize_reg_copy_1 (rtx, rtx, rtx);
static void optimize_reg_copy_2 (rtx, rtx, rtx);
static void optimize_reg_copy_3 (rtx, rtx, rtx);
54
static void copy_src_to_dest (rtx, rtx, rtx);
55

56 57 58 59 60 61 62
struct match {
  int with[MAX_RECOG_OPERANDS];
  enum { READ, WRITE, READWRITE } use[MAX_RECOG_OPERANDS];
  int commutative[MAX_RECOG_OPERANDS];
  int early_clobber[MAX_RECOG_OPERANDS];
};

63 64
static rtx discover_flags_reg (void);
static void mark_flags_life_zones (rtx);
65
static void flags_set_1 (rtx, const_rtx, void *);
66 67 68 69

static int try_auto_increment (rtx, rtx, rtx, rtx, HOST_WIDE_INT, int);
static int find_matches (rtx, struct match *);
static void replace_in_call_usage (rtx *, unsigned int, rtx, rtx);
70
static int fixup_match_1 (rtx, rtx, rtx, rtx, rtx, int, int, int);
71 72 73
static int stable_and_no_regs_but_for_p (rtx, rtx, rtx);
static int regclass_compatible_p (int, int);
static int replacement_quality (rtx);
74
static int fixup_match_2 (rtx, rtx, rtx, rtx);
75

76
/* Return nonzero if registers with CLASS1 and CLASS2 can be merged without
77 78
   causing too much register allocation problems.  */
static int
79
regclass_compatible_p (int class0, int class1)
80 81 82 83 84 85 86 87
{
  return (class0 == class1
	  || (reg_class_subset_p (class0, class1)
	      && ! CLASS_LIKELY_SPILLED_P (class0))
	  || (reg_class_subset_p (class1, class0)
	      && ! CLASS_LIKELY_SPILLED_P (class1)));
}

88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
/* Find the place in the rtx X where REG is used as a memory address.
   Return the MEM rtx that so uses it.
   If PLUSCONST is nonzero, search instead for a memory address equivalent to
   (plus REG (const_int PLUSCONST)).

   If such an address does not appear, return 0.
   If REG appears more than once, or is used other than in such an address,
   return (rtx) 1.  */

static rtx
find_use_as_address (rtx x, rtx reg, HOST_WIDE_INT plusconst)
{
  enum rtx_code code = GET_CODE (x);
  const char * const fmt = GET_RTX_FORMAT (code);
  int i;
  rtx value = 0;
  rtx tem;

  if (code == MEM && XEXP (x, 0) == reg && plusconst == 0)
    return x;

  if (code == MEM && GET_CODE (XEXP (x, 0)) == PLUS
      && XEXP (XEXP (x, 0), 0) == reg
      && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
      && INTVAL (XEXP (XEXP (x, 0), 1)) == plusconst)
    return x;

  if (code == SIGN_EXTRACT || code == ZERO_EXTRACT)
    {
      /* If REG occurs inside a MEM used in a bit-field reference,
	 that is unacceptable.  */
      if (find_use_as_address (XEXP (x, 0), reg, 0) != 0)
	return (rtx) (size_t) 1;
    }

  if (x == reg)
    return (rtx) (size_t) 1;

  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      if (fmt[i] == 'e')
	{
	  tem = find_use_as_address (XEXP (x, i), reg, plusconst);
	  if (value == 0)
	    value = tem;
	  else if (tem != 0)
	    return (rtx) (size_t) 1;
	}
      else if (fmt[i] == 'E')
	{
	  int j;
	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
	    {
	      tem = find_use_as_address (XVECEXP (x, i, j), reg, plusconst);
	      if (value == 0)
		value = tem;
	      else if (tem != 0)
		return (rtx) (size_t) 1;
	    }
	}
    }

  return value;
}


154 155 156 157 158
/* INC_INSN is an instruction that adds INCREMENT to REG.
   Try to fold INC_INSN as a post/pre in/decrement into INSN.
   Iff INC_INSN_SET is nonzero, inc_insn has a destination different from src.
   Return nonzero for success.  */
static int
159 160
try_auto_increment (rtx insn, rtx inc_insn, rtx inc_insn_set, rtx reg,
		    HOST_WIDE_INT increment, int pre)
161 162 163 164 165 166 167 168 169
{
  enum rtx_code inc_code;

  rtx pset = single_set (insn);
  if (pset)
    {
      /* Can't use the size of SET_SRC, we might have something like
	 (sign_extend:SI (mem:QI ...  */
      rtx use = find_use_as_address (pset, reg, 0);
170
      if (use != 0 && use != (rtx) (size_t) 1)
171 172 173
	{
	  int size = GET_MODE_SIZE (GET_MODE (use));
	  if (0
174 175 176 177 178 179 180 181
	      || (HAVE_POST_INCREMENT
		  && pre == 0 && (inc_code = POST_INC, increment == size))
	      || (HAVE_PRE_INCREMENT
		  && pre == 1 && (inc_code = PRE_INC, increment == size))
	      || (HAVE_POST_DECREMENT
		  && pre == 0 && (inc_code = POST_DEC, increment == -size))
	      || (HAVE_PRE_DECREMENT
		  && pre == 1 && (inc_code = PRE_DEC, increment == -size))
182 183 184 185
	  )
	    {
	      if (inc_insn_set)
		validate_change
186
		  (inc_insn,
187
		   &SET_SRC (inc_insn_set),
188
		   XEXP (SET_SRC (inc_insn_set), 0), 1);
189
	      validate_change (insn, &XEXP (use, 0),
190
			       gen_rtx_fmt_e (inc_code, Pmode, reg), 1);
191 192
	      if (apply_change_group ())
		{
193 194 195
		  /* If there is a REG_DEAD note on this insn, we must
		     change this not to REG_UNUSED meaning that the register
		     is set, but the value is dead.  Failure to do so will
196
		     result in sched1 dying -- when it recomputes lifetime
197 198 199 200 201 202
		     information, the number of REG_DEAD notes will have
		     changed.  */
		  rtx note = find_reg_note (insn, REG_DEAD, reg);
		  if (note)
		    PUT_MODE (note, REG_UNUSED);

203 204
		  add_reg_note (insn, REG_INC, reg);

205
		  if (! inc_insn_set)
206
		    delete_insn (inc_insn);
207
		  return 1;
208 209 210 211 212 213
		}
	    }
	}
    }
  return 0;
}
214 215 216 217 218 219 220 221 222

/* Determine if the pattern generated by add_optab has a clobber,
   such as might be issued for a flags hard register.  To make the
   code elsewhere simpler, we handle cc0 in this same framework.

   Return the register if one was discovered.  Return NULL_RTX if
   if no flags were found.  Return pc_rtx if we got confused.  */

static rtx
223
discover_flags_reg (void)
224 225
{
  rtx tmp;
226
  tmp = gen_rtx_REG (word_mode, 10000);
227
  tmp = gen_add3_insn (tmp, tmp, const2_rtx);
228

229
  /* If we get something that isn't a simple set, or a
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
     [(set ..) (clobber ..)], this whole function will go wrong.  */
  if (GET_CODE (tmp) == SET)
    return NULL_RTX;
  else if (GET_CODE (tmp) == PARALLEL)
    {
      int found;

      if (XVECLEN (tmp, 0) != 2)
	return pc_rtx;
      tmp = XVECEXP (tmp, 0, 1);
      if (GET_CODE (tmp) != CLOBBER)
	return pc_rtx;
      tmp = XEXP (tmp, 0);

      /* Don't do anything foolish if the md wanted to clobber a
	 scratch or something.  We only care about hard regs.
	 Moreover we don't like the notion of subregs of hard regs.  */
      if (GET_CODE (tmp) == SUBREG
248
	  && REG_P (SUBREG_REG (tmp))
249 250
	  && REGNO (SUBREG_REG (tmp)) < FIRST_PSEUDO_REGISTER)
	return pc_rtx;
251
      found = (REG_P (tmp) && REGNO (tmp) < FIRST_PSEUDO_REGISTER);
252 253 254 255 256 257 258 259 260 261

      return (found ? tmp : NULL_RTX);
    }

  return pc_rtx;
}

/* It is a tedious task identifying when the flags register is live and
   when it is safe to optimize.  Since we process the instruction stream
   multiple times, locate and record these live zones by marking the
262
   mode of the instructions --
263 264 265 266 267 268 269 270 271 272 273 274 275

   QImode is used on the instruction at which the flags becomes live.

   HImode is used within the range (exclusive) that the flags are
   live.  Thus the user of the flags is not marked.

   All other instructions are cleared to VOIDmode.  */

/* Used to communicate with flags_set_1.  */
static rtx flags_set_1_rtx;
static int flags_set_1_set;

static void
276
mark_flags_life_zones (rtx flags)
277 278 279
{
  int flags_regno;
  int flags_nregs;
280
  basic_block block;
281

282 283 284 285 286 287 288
#ifdef HAVE_cc0
  /* If we found a flags register on a cc0 host, bail.  */
  if (flags == NULL_RTX)
    flags = cc0_rtx;
  else if (flags != cc0_rtx)
    flags = pc_rtx;
#endif
289

290 291 292 293 294 295
  /* Simple cases first: if no flags, clear all modes.  If confusing,
     mark the entire function as being in a flags shadow.  */
  if (flags == NULL_RTX || flags == pc_rtx)
    {
      enum machine_mode mode = (flags ? HImode : VOIDmode);
      rtx insn;
296
      for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
297 298 299 300 301 302 303 304 305
	PUT_MODE (insn, mode);
      return;
    }

#ifdef HAVE_cc0
  flags_regno = -1;
  flags_nregs = 1;
#else
  flags_regno = REGNO (flags);
306
  flags_nregs = hard_regno_nregs[flags_regno][GET_MODE (flags)];
307 308
#endif
  flags_set_1_rtx = flags;
309

310
  /* Process each basic block.  */
311
  FOR_EACH_BB_REVERSE (block)
312 313 314 315
    {
      rtx insn, end;
      int live;

316 317
      insn = BB_HEAD (block);
      end = BB_END (block);
318 319 320 321 322 323 324 325

      /* Look out for the (unlikely) case of flags being live across
	 basic block boundaries.  */
      live = 0;
#ifndef HAVE_cc0
      {
	int i;
	for (i = 0; i < flags_nregs; ++i)
326
	  live |= REGNO_REG_SET_P (df_get_live_in (block), flags_regno + i);
327 328 329 330 331 332 333 334 335
      }
#endif

      while (1)
	{
	  /* Process liveness in reverse order of importance --
	     alive, death, birth.  This lets more important info
	     overwrite the mode of lesser info.  */

336
	  if (INSN_P (insn))
337 338 339 340 341 342 343 344 345 346 347 348 349
	    {
#ifdef HAVE_cc0
	      /* In the cc0 case, death is not marked in reg notes,
		 but is instead the mere use of cc0 when it is alive.  */
	      if (live && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
		live = 0;
#else
	      /* In the hard reg case, we watch death notes.  */
	      if (live && find_regno_note (insn, REG_DEAD, flags_regno))
		live = 0;
#endif
	      PUT_MODE (insn, (live ? HImode : VOIDmode));

350
	      /* In either case, birth is denoted simply by its presence
351 352
		 as the destination of a set.  */
	      flags_set_1_set = 0;
353
	      note_stores (PATTERN (insn), flags_set_1, NULL);
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
	      if (flags_set_1_set)
		{
		  live = 1;
		  PUT_MODE (insn, QImode);
		}
	    }
	  else
	    PUT_MODE (insn, (live ? HImode : VOIDmode));

	  if (insn == end)
	    break;
	  insn = NEXT_INSN (insn);
	}
    }
}

/* A subroutine of mark_flags_life_zones, called through note_stores.  */

static void
373
flags_set_1 (rtx x, const_rtx pat, void *data ATTRIBUTE_UNUSED)
374 375 376 377 378 379
{
  if (GET_CODE (pat) == SET
      && reg_overlap_mentioned_p (x, flags_set_1_rtx))
    flags_set_1_set = 1;
}

380 381 382 383 384 385 386
static int *regno_src_regno;

/* Indicate how good a choice REG (which appears as a source) is to replace
   a destination register with.  The higher the returned value, the better
   the choice.  The main objective is to avoid using a register that is
   a candidate for tying to a hard register, since the output might in
   turn be a candidate to be tied to a different hard register.  */
387
static int
388
replacement_quality (rtx reg)
389 390 391 392
{
  int src_regno;

  /* Bad if this isn't a register at all.  */
393
  if (!REG_P (reg))
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
    return 0;

  /* If this register is not meant to get a hard register,
     it is a poor choice.  */
  if (REG_LIVE_LENGTH (REGNO (reg)) < 0)
    return 0;

  src_regno = regno_src_regno[REGNO (reg)];

  /* If it was not copied from another register, it is fine.  */
  if (src_regno < 0)
    return 3;

  /* Copied from a hard register?  */
  if (src_regno < FIRST_PSEUDO_REGISTER)
    return 1;

  /* Copied from a pseudo register - not as bad as from a hard register,
     yet still cumbersome, since the register live length will be lengthened
     when the registers get tied.  */
  return 2;
}
416 417 418

/* Return 1 if INSN might end a basic block.  */

419
static int perhaps_ends_bb_p (rtx insn)
420 421 422 423 424 425 426
{
  switch (GET_CODE (insn))
    {
    case CODE_LABEL:
    case JUMP_INSN:
      /* These always end a basic block.  */
      return 1;
427

428 429 430 431
    case CALL_INSN:
      /* A CALL_INSN might be the last insn of a basic block, if it is inside
	 an EH region or if there are nonlocal gotos.  Note that this test is
	 very conservative.  */
432 433
      if (nonlocal_goto_handler_labels)
	return 1;
434
      /* Fall through.  */
435
    default:
436
      return can_throw_internal (insn);
437 438 439
    }
}

J"orn Rennecke committed
440 441 442 443 444
/* INSN is a copy from SRC to DEST, both registers, and SRC does not die
   in INSN.

   Search forward to see if SRC dies before either it or DEST is modified,
   but don't scan past the end of a basic block.  If so, we can replace SRC
445
   with DEST and let SRC die in INSN.
J"orn Rennecke committed
446 447 448 449 450 451

   This will reduce the number of registers live in that range and may enable
   DEST to be tied to SRC, thus often saving one register in addition to a
   register-register copy.  */

static int
452
optimize_reg_copy_1 (rtx insn, rtx dest, rtx src)
J"orn Rennecke committed
453 454 455 456 457 458 459
{
  rtx p, q;
  rtx note;
  rtx dest_death = 0;
  int sregno = REGNO (src);
  int dregno = REGNO (dest);

460
  /* We don't want to mess with hard regs if register classes are small.  */
J"orn Rennecke committed
461 462 463 464 465 466 467 468 469 470 471
  if (sregno == dregno
      || (SMALL_REGISTER_CLASSES
	  && (sregno < FIRST_PSEUDO_REGISTER
	      || dregno < FIRST_PSEUDO_REGISTER))
      /* We don't see all updates to SP if they are in an auto-inc memory
	 reference, so we must disallow this optimization on them.  */
      || sregno == STACK_POINTER_REGNUM || dregno == STACK_POINTER_REGNUM)
    return 0;

  for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
    {
472
      /* ??? We can't scan past the end of a basic block without updating
473 474
	 the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
      if (perhaps_ends_bb_p (p))
475
	break;
476
      else if (! INSN_P (p))
J"orn Rennecke committed
477 478 479
	continue;

      if (reg_set_p (src, p) || reg_set_p (dest, p)
480 481 482 483 484 485 486 487 488 489
	  /* If SRC is an asm-declared register, it must not be replaced
	     in any asm.  Unfortunately, the REG_EXPR tree for the asm
	     variable may be absent in the SRC rtx, so we can't check the
	     actual register declaration easily (the asm operand will have
	     it, though).  To avoid complicating the test for a rare case,
	     we just don't perform register replacement for a hard reg
	     mentioned in an asm.  */
	  || (sregno < FIRST_PSEUDO_REGISTER
	      && asm_noperands (PATTERN (p)) >= 0
	      && reg_overlap_mentioned_p (src, PATTERN (p)))
490 491 492
	  /* Don't change hard registers used by a call.  */
	  || (CALL_P (p) && sregno < FIRST_PSEUDO_REGISTER
	      && find_reg_fusage (p, USE, src))
J"orn Rennecke committed
493 494 495 496 497 498 499 500 501 502 503 504
	  /* Don't change a USE of a register.  */
	  || (GET_CODE (PATTERN (p)) == USE
	      && reg_overlap_mentioned_p (src, XEXP (PATTERN (p), 0))))
	break;

      /* See if all of SRC dies in P.  This test is slightly more
	 conservative than it needs to be.  */
      if ((note = find_regno_note (p, REG_DEAD, sregno)) != 0
	  && GET_MODE (XEXP (note, 0)) == GET_MODE (src))
	{
	  int failed = 0;
	  int d_length = 0;
505
	  int s_length = 0;
J"orn Rennecke committed
506
	  int d_n_calls = 0;
507
	  int s_n_calls = 0;
508 509
	  int s_freq_calls = 0;
	  int d_freq_calls = 0;
J"orn Rennecke committed
510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530

	  /* We can do the optimization.  Scan forward from INSN again,
	     replacing regs as we go.  Set FAILED if a replacement can't
	     be done.  In that case, we can't move the death note for SRC.
	     This should be rare.  */

	  /* Set to stop at next insn.  */
	  for (q = next_real_insn (insn);
	       q != next_real_insn (p);
	       q = next_real_insn (q))
	    {
	      if (reg_overlap_mentioned_p (src, PATTERN (q)))
		{
		  /* If SRC is a hard register, we might miss some
		     overlapping registers with validate_replace_rtx,
		     so we would have to undo it.  We can't if DEST is
		     present in the insn, so fail in that combination
		     of cases.  */
		  if (sregno < FIRST_PSEUDO_REGISTER
		      && reg_mentioned_p (dest, PATTERN (q)))
		    failed = 1;
531 532 533 534
		  
		  /* Attempt to replace all uses.  */
		  else if (!validate_replace_rtx (src, dest, q))
		    failed = 1;
J"orn Rennecke committed
535

536 537 538 539
		  /* If this succeeded, but some part of the register
		     is still present, undo the replacement.  */
		  else if (sregno < FIRST_PSEUDO_REGISTER
			   && reg_overlap_mentioned_p (src, PATTERN (q)))
J"orn Rennecke committed
540 541 542 543 544 545
		    {
		      validate_replace_rtx (dest, src, q);
		      failed = 1;
		    }
		}

546 547 548 549
	      /* For SREGNO, count the total number of insns scanned.
		 For DREGNO, count the total number of insns scanned after
		 passing the death note for DREGNO.  */
	      s_length++;
J"orn Rennecke committed
550 551 552 553 554
	      if (dest_death)
		d_length++;

	      /* If the insn in which SRC dies is a CALL_INSN, don't count it
		 as a call that has been crossed.  Otherwise, count it.  */
555
	      if (q != p && CALL_P (q))
J"orn Rennecke committed
556
		{
557 558 559
		  /* Similarly, total calls for SREGNO, total calls beyond
		     the death note for DREGNO.  */
		  s_n_calls++;
560
		  s_freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (q));
J"orn Rennecke committed
561
		  if (dest_death)
562 563 564 565
		    {
		      d_n_calls++;
		      d_freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (q));
		    }
J"orn Rennecke committed
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
		}

	      /* If DEST dies here, remove the death note and save it for
		 later.  Make sure ALL of DEST dies here; again, this is
		 overly conservative.  */
	      if (dest_death == 0
		  && (dest_death = find_regno_note (q, REG_DEAD, dregno)) != 0)
		{
		  if (GET_MODE (XEXP (dest_death, 0)) != GET_MODE (dest))
		    failed = 1, dest_death = 0;
		  else
		    remove_note (q, dest_death);
		}
	    }

	  if (! failed)
	    {
583 584
	      /* These counters need to be updated if and only if we are
		 going to move the REG_DEAD note.  */
J"orn Rennecke committed
585 586 587 588
	      if (sregno >= FIRST_PSEUDO_REGISTER)
		{
		  if (REG_LIVE_LENGTH (sregno) >= 0)
		    {
589
		      REG_LIVE_LENGTH (sregno) -= s_length;
J"orn Rennecke committed
590 591 592 593 594 595 596
		      /* REG_LIVE_LENGTH is only an approximation after
			 combine if sched is not run, so make sure that we
			 still have a reasonable value.  */
		      if (REG_LIVE_LENGTH (sregno) < 2)
			REG_LIVE_LENGTH (sregno) = 2;
		    }

597
		  REG_N_CALLS_CROSSED (sregno) -= s_n_calls;
598
		  REG_FREQ_CALLS_CROSSED (sregno) -= s_freq_calls;
J"orn Rennecke committed
599 600 601 602 603 604 605 606
		}

	      /* Move death note of SRC from P to INSN.  */
	      remove_note (p, note);
	      XEXP (note, 1) = REG_NOTES (insn);
	      REG_NOTES (insn) = note;
	    }

607 608 609 610 611 612 613 614
	  /* DEST is also dead if INSN has a REG_UNUSED note for DEST.  */
	  if (! dest_death
	      && (dest_death = find_regno_note (insn, REG_UNUSED, dregno)))
	    {
	      PUT_REG_NOTE_KIND (dest_death, REG_DEAD);
	      remove_note (insn, dest_death);
	    }

J"orn Rennecke committed
615 616 617 618 619
	  /* Put death note of DEST on P if we saw it die.  */
	  if (dest_death)
	    {
	      XEXP (dest_death, 1) = REG_NOTES (p);
	      REG_NOTES (p) = dest_death;
620 621 622 623 624 625 626 627

	      if (dregno >= FIRST_PSEUDO_REGISTER)
		{
		  /* If and only if we are moving the death note for DREGNO,
		     then we need to update its counters.  */
		  if (REG_LIVE_LENGTH (dregno) >= 0)
		    REG_LIVE_LENGTH (dregno) += d_length;
		  REG_N_CALLS_CROSSED (dregno) += d_n_calls;
628
		  REG_FREQ_CALLS_CROSSED (dregno) += d_freq_calls;
629
		}
J"orn Rennecke committed
630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658
	    }

	  return ! failed;
	}

      /* If SRC is a hard register which is set or killed in some other
	 way, we can't do this optimization.  */
      else if (sregno < FIRST_PSEUDO_REGISTER
	       && dead_or_set_p (p, src))
	break;
    }
  return 0;
}

/* INSN is a copy of SRC to DEST, in which SRC dies.  See if we now have
   a sequence of insns that modify DEST followed by an insn that sets
   SRC to DEST in which DEST dies, with no prior modification of DEST.
   (There is no need to check if the insns in between actually modify
   DEST.  We should not have cases where DEST is not modified, but
   the optimization is safe if no such modification is detected.)
   In that case, we can replace all uses of DEST, starting with INSN and
   ending with the set of SRC to DEST, with SRC.  We do not do this
   optimization if a CALL_INSN is crossed unless SRC already crosses a
   call or if DEST dies before the copy back to SRC.

   It is assumed that DEST and SRC are pseudos; it is too complicated to do
   this for hard registers since the substitutions we may make might fail.  */

static void
659
optimize_reg_copy_2 (rtx insn, rtx dest, rtx src)
J"orn Rennecke committed
660 661 662 663 664 665 666 667
{
  rtx p, q;
  rtx set;
  int sregno = REGNO (src);
  int dregno = REGNO (dest);

  for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
    {
668
      /* ??? We can't scan past the end of a basic block without updating
669 670
	 the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
      if (perhaps_ends_bb_p (p))
671
	break;
672
      else if (! INSN_P (p))
J"orn Rennecke committed
673 674 675 676 677 678 679 680 681 682 683
	continue;

      set = single_set (p);
      if (set && SET_SRC (set) == dest && SET_DEST (set) == src
	  && find_reg_note (p, REG_DEAD, dest))
	{
	  /* We can do the optimization.  Scan forward from INSN again,
	     replacing regs as we go.  */

	  /* Set to stop at next insn.  */
	  for (q = insn; q != NEXT_INSN (p); q = NEXT_INSN (q))
684
	    if (INSN_P (q))
J"orn Rennecke committed
685 686
	      {
		if (reg_mentioned_p (dest, PATTERN (q)))
687
		  {
688 689
		    rtx note;

690
		    PATTERN (q) = replace_rtx (PATTERN (q), dest, src);
691 692 693 694 695 696
		    note = FIND_REG_INC_NOTE (q, dest);
		    if (note)
		      {
			remove_note (q, note);
			add_reg_note (q, REG_INC, src);
		      }
697 698
		    df_insn_rescan (q);
		  }
J"orn Rennecke committed
699

700 701
		if (CALL_P (q))
		  {
702
		    int freq = REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (q));
703 704
		    REG_N_CALLS_CROSSED (dregno)--;
		    REG_N_CALLS_CROSSED (sregno)++;
705 706
		    REG_FREQ_CALLS_CROSSED (dregno) -= freq;
		    REG_FREQ_CALLS_CROSSED (sregno) += freq;
707
		  }
J"orn Rennecke committed
708 709 710 711 712 713 714 715 716 717 718
	      }

	  remove_note (p, find_reg_note (p, REG_DEAD, dest));
	  REG_N_DEATHS (dregno)--;
	  remove_note (insn, find_reg_note (insn, REG_DEAD, src));
	  REG_N_DEATHS (sregno)--;
	  return;
	}

      if (reg_set_p (src, p)
	  || find_reg_note (p, REG_DEAD, dest)
719
	  || (CALL_P (p) && REG_N_CALLS_CROSSED (sregno) == 0))
J"orn Rennecke committed
720 721 722
	break;
    }
}
723

724 725
/* INSN is a ZERO_EXTEND or SIGN_EXTEND of SRC to DEST.
   Look if SRC dies there, and if it is only set once, by loading
726
   it from memory.  If so, try to incorporate the zero/sign extension
727 728 729 730
   into the memory read, change SRC to the mode of DEST, and alter
   the remaining accesses to use the appropriate SUBREG.  This allows
   SRC and DEST to be tied later.  */
static void
731
optimize_reg_copy_3 (rtx insn, rtx dest, rtx src)
732 733 734 735
{
  rtx src_reg = XEXP (src, 0);
  int src_no = REGNO (src_reg);
  int dst_no = REGNO (dest);
736
  rtx p, set;
737 738 739 740 741
  enum machine_mode old_mode;

  if (src_no < FIRST_PSEUDO_REGISTER
      || dst_no < FIRST_PSEUDO_REGISTER
      || ! find_reg_note (insn, REG_DEAD, src_reg)
742
      || REG_N_DEATHS (src_no) != 1
743 744
      || REG_N_SETS (src_no) != 1)
    return;
745
  for (p = PREV_INSN (insn); p && ! reg_set_p (src_reg, p); p = PREV_INSN (p))
746 747 748 749
    /* ??? We can't scan past the end of a basic block without updating
       the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
    if (perhaps_ends_bb_p (p))
      break;
750

751 752 753
  if (! p)
    return;

754
  if (! (set = single_set (p))
755
      || !MEM_P (SET_SRC (set))
756 757 758
      /* If there's a REG_EQUIV note, this must be an insn that loads an
	 argument.  Prefer keeping the note over doing this optimization.  */
      || find_reg_note (p, REG_EQUIV, NULL_RTX)
759 760
      || SET_DEST (set) != src_reg)
    return;
761

762
  /* Be conservative: although this optimization is also valid for
763 764 765 766
     volatile memory references, that could cause trouble in later passes.  */
  if (MEM_VOLATILE_P (SET_SRC (set)))
    return;

767 768 769 770 771 772 773
  /* Do not use a SUBREG to truncate from one mode to another if truncation
     is not a nop.  */
  if (GET_MODE_BITSIZE (GET_MODE (src_reg)) <= GET_MODE_BITSIZE (GET_MODE (src))
      && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (src)),
				 GET_MODE_BITSIZE (GET_MODE (src_reg))))
    return;

774 775 776
  old_mode = GET_MODE (src_reg);
  PUT_MODE (src_reg, GET_MODE (src));
  XEXP (src, 0) = SET_SRC (set);
777 778 779 780 781 782 783

  /* Include this change in the group so that it's easily undone if
     one of the changes in the group is invalid.  */
  validate_change (p, &SET_SRC (set), src, 1);

  /* Now walk forward making additional replacements.  We want to be able
     to undo all the changes if a later substitution fails.  */
784 785
  while (p = NEXT_INSN (p), p != insn)
    {
786
      if (! INSN_P (p))
787
	continue;
788

789
      /* Make a tentative change.  */
790 791 792
      validate_replace_rtx_group (src_reg,
				  gen_lowpart_SUBREG (old_mode, src_reg),
				  p);
793 794 795 796 797 798 799 800 801 802
    }

  validate_replace_rtx_group (src, src_reg, insn);

  /* Now see if all the changes are valid.  */
  if (! apply_change_group ())
    {
      /* One or more changes were no good.  Back out everything.  */
      PUT_MODE (src_reg, old_mode);
      XEXP (src, 0) = src_reg;
803
    }
804 805 806 807 808 809
  else
    {
      rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
      if (note)
	remove_note (p, note);
    }
810 811
}

812 813 814 815

/* If we were not able to update the users of src to use dest directly, try
   instead moving the value to dest directly before the operation.  */

Kaveh R. Ghazi committed
816
static void
817
copy_src_to_dest (rtx insn, rtx src, rtx dest)
818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835
{
  rtx seq;
  rtx link;
  rtx next;
  rtx set;
  rtx move_insn;
  rtx *p_insn_notes;
  rtx *p_move_notes;
  int src_regno;
  int dest_regno;
  int insn_uid;
  int move_uid;

  /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant
     or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is
     parameter when there is no frame pointer that is not allocated a register.
     For now, we just reject them, rather than incrementing the live length.  */

836
  if (REG_P (src)
837
      && REG_LIVE_LENGTH (REGNO (src)) > 0
838
      && REG_P (dest)
839
      && REG_LIVE_LENGTH (REGNO (dest)) > 0
840
      && (set = single_set (insn)) != NULL_RTX
841 842
      && !reg_mentioned_p (dest, SET_SRC (set))
      && GET_MODE (src) == GET_MODE (dest))
843
    {
844 845
      int old_num_regs = reg_rtx_no;

846 847 848
      /* Generate the src->dest move.  */
      start_sequence ();
      emit_move_insn (dest, src);
849
      seq = get_insns ();
850
      end_sequence ();
851 852 853 854 855 856 857 858 859 860
      /* If this sequence uses new registers, we may not use it.  */
      if (old_num_regs != reg_rtx_no
	  || ! validate_replace_rtx (src, dest, insn))
	{
	  /* We have to restore reg_rtx_no to its old value, lest
	     recompute_reg_usage will try to compute the usage of the
	     new regs, yet reg_n_info is not valid for them.  */
	  reg_rtx_no = old_num_regs;
	  return;
	}
861 862 863 864 865
      emit_insn_before (seq, insn);
      move_insn = PREV_INSN (insn);
      p_move_notes = &REG_NOTES (move_insn);
      p_insn_notes = &REG_NOTES (insn);

866
      /* Move any notes mentioning src to the move instruction.  */
867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889
      for (link = REG_NOTES (insn); link != NULL_RTX; link = next)
	{
	  next = XEXP (link, 1);
	  if (XEXP (link, 0) == src)
	    {
	      *p_move_notes = link;
	      p_move_notes = &XEXP (link, 1);
	    }
	  else
	    {
	      *p_insn_notes = link;
	      p_insn_notes = &XEXP (link, 1);
	    }
	}

      *p_move_notes = NULL_RTX;
      *p_insn_notes = NULL_RTX;

      insn_uid = INSN_UID (insn);
      move_uid = INSN_UID (move_insn);

      /* Update the various register tables.  */
      dest_regno = REGNO (dest);
890
      INC_REG_N_SETS (dest_regno, 1);
891 892 893 894 895 896 897
      REG_LIVE_LENGTH (dest_regno)++;
      src_regno = REGNO (src);
      if (! find_reg_note (move_insn, REG_DEAD, src))
	REG_LIVE_LENGTH (src_regno)++;
    }
}

898 899 900 901 902 903 904 905
/* reg_set_in_bb[REGNO] points to basic block iff the register is set
   only once in the given block and has REG_EQUAL note.  */

basic_block *reg_set_in_bb;

/* Size of reg_set_in_bb array.  */
static unsigned int max_reg_computed;

906

907 908 909 910 911 912 913
/* Return whether REG is set in only one location, and is set to a
   constant, but is set in a different basic block from INSN (an
   instructions which uses REG).  In this case REG is equivalent to a
   constant, and we don't want to break that equivalence, because that
   may increase register pressure and make reload harder.  If REG is
   set in the same basic block as INSN, we don't worry about it,
   because we'll probably need a register anyhow (??? but what if REG
914
   is used in a different basic block as well as this one?).  */
915

916 917
static bool
reg_is_remote_constant_p (rtx reg, rtx insn)
918
{
919
  basic_block bb;
920
  rtx p;
921
  int max;
922

923
  if (!reg_set_in_bb)
924
    {
925
      max_reg_computed = max = max_reg_num ();
926
      reg_set_in_bb = XCNEWVEC (basic_block, max);
927

928
      FOR_EACH_BB (bb)
929 930 931 932 933 934 935 936 937 938 939 940 941 942 943
	FOR_BB_INSNS (bb, p)
	  {
	    rtx s;

	    if (!INSN_P (p))
	      continue;
	    s = single_set (p);
	    /* This is the instruction which sets REG.  If there is a
	       REG_EQUAL note, then REG is equivalent to a constant.  */
	    if (s != 0
	        && REG_P (SET_DEST (s))
	        && REG_N_SETS (REGNO (SET_DEST (s))) == 1
	        && find_reg_note (p, REG_EQUAL, NULL_RTX))
	      reg_set_in_bb[REGNO (SET_DEST (s))] = bb;
	  }
944
    }
945

946 947 948
  gcc_assert (REGNO (reg) < max_reg_computed);
  if (reg_set_in_bb[REGNO (reg)] == NULL)
    return false;
949
  return (reg_set_in_bb[REGNO (reg)] != BLOCK_FOR_INSN (insn));
950 951
}

952 953 954 955 956 957 958 959 960 961 962 963 964 965 966
/* INSN is adding a CONST_INT to a REG.  We search backwards looking for
   another add immediate instruction with the same source and dest registers,
   and if we find one, we change INSN to an increment, and return 1.  If
   no changes are made, we return 0.

   This changes
     (set (reg100) (plus reg1 offset1))
     ...
     (set (reg100) (plus reg1 offset2))
   to
     (set (reg100) (plus reg1 offset1))
     ...
     (set (reg100) (plus reg100 offset2-offset1))  */

/* ??? What does this comment mean?  */
967
/* cse disrupts preincrement / postdecrement sequences when it finds a
968
   hard register as ultimate source, like the frame pointer.  */
969

970
static int
971
fixup_match_2 (rtx insn, rtx dst, rtx src, rtx offset)
972 973
{
  rtx p, dst_death = 0;
974
  int length, num_calls = 0, freq_calls = 0;
975 976 977 978 979 980 981 982 983 984 985 986 987

  /* If SRC dies in INSN, we'd have to move the death note.  This is
     considered to be very unlikely, so we just skip the optimization
     in this case.  */
  if (find_regno_note (insn, REG_DEAD, REGNO (src)))
    return 0;

  /* Scan backward to find the first instruction that sets DST.  */

  for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
    {
      rtx pset;

988
      /* ??? We can't scan past the end of a basic block without updating
989 990
	 the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
      if (perhaps_ends_bb_p (p))
991
	break;
992
      else if (! INSN_P (p))
993
	continue;
994

995 996 997 998
      if (find_regno_note (p, REG_DEAD, REGNO (dst)))
	dst_death = p;
      if (! dst_death)
	length++;
999 1000 1001 1002 1003 1004

      pset = single_set (p);
      if (pset && SET_DEST (pset) == dst
	  && GET_CODE (SET_SRC (pset)) == PLUS
	  && XEXP (SET_SRC (pset), 0) == src
	  && GET_CODE (XEXP (SET_SRC (pset), 1)) == CONST_INT)
1005
	{
1006 1007
	  HOST_WIDE_INT newconst
	    = INTVAL (offset) - INTVAL (XEXP (SET_SRC (pset), 1));
1008 1009 1010
	  rtx add = gen_add3_insn (dst, dst, GEN_INT (newconst));

	  if (add && validate_change (insn, &PATTERN (insn), add, 0))
1011 1012 1013 1014 1015 1016 1017
	    {
	      /* Remove the death note for DST from DST_DEATH.  */
	      if (dst_death)
		{
		  remove_death (REGNO (dst), dst_death);
		  REG_LIVE_LENGTH (REGNO (dst)) += length;
		  REG_N_CALLS_CROSSED (REGNO (dst)) += num_calls;
1018
		  REG_FREQ_CALLS_CROSSED (REGNO (dst)) += freq_calls;
1019 1020
		}

1021 1022
	      if (dump_file)
		fprintf (dump_file,
1023 1024 1025 1026 1027 1028
			 "Fixed operand of insn %d.\n",
			  INSN_UID (insn));

#ifdef AUTO_INC_DEC
	      for (p = PREV_INSN (insn); p; p = PREV_INSN (p))
		{
1029 1030
		  if (LABEL_P (p)
		      || JUMP_P (p))
1031
		    break;
1032
		  if (! INSN_P (p))
1033
		    continue;
1034 1035 1036 1037 1038 1039 1040 1041 1042
		  if (reg_overlap_mentioned_p (dst, PATTERN (p)))
		    {
		      if (try_auto_increment (p, insn, 0, dst, newconst, 0))
			return 1;
		      break;
		    }
		}
	      for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
		{
1043 1044
		  if (LABEL_P (p)
		      || JUMP_P (p))
1045
		    break;
1046
		  if (! INSN_P (p))
1047
		    continue;
1048 1049 1050 1051 1052 1053 1054 1055 1056
		  if (reg_overlap_mentioned_p (dst, PATTERN (p)))
		    {
		      try_auto_increment (p, insn, 0, dst, newconst, 1);
		      break;
		    }
		}
#endif
	      return 1;
	    }
1057
	}
1058 1059

      if (reg_set_p (dst, PATTERN (p)))
1060
	break;
1061 1062 1063 1064 1065 1066 1067

      /* If we have passed a call instruction, and the
         pseudo-reg SRC is not already live across a call,
         then don't perform the optimization.  */
      /* reg_set_p is overly conservative for CALL_INSNS, thinks that all
	 hard regs are clobbered.  Thus, we only use it for src for
	 non-call insns.  */
1068
      if (CALL_P (p))
1069
	{
1070
	  if (! dst_death)
1071 1072 1073 1074
	    {
	      num_calls++;
	      freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (p));
	    }
1075

1076 1077
	  if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
	    break;
1078 1079 1080 1081

	  if (call_used_regs [REGNO (dst)]
	      || find_reg_fusage (p, CLOBBER, dst))
	    break;
1082
	}
1083
      else if (reg_set_p (src, PATTERN (p)))
1084
	break;
1085
    }
1086

1087 1088 1089
  return 0;
}

1090 1091 1092 1093 1094 1095
/* Main entry for the register move optimization.
   F is the first instruction.
   NREGS is one plus the highest pseudo-reg number used in the instruction.
   REGMOVE_DUMP_FILE is a stream for output of a trace of actions taken
   (or 0 if none should be output).  */

1096
static void
1097
regmove_optimize (rtx f, int nregs)
1098 1099
{
  rtx insn;
1100
  struct match match;
1101
  int pass;
1102
  int i;
1103
  rtx copy_src, copy_dst;
1104

1105 1106 1107 1108 1109
  /* ??? Hack.  Regmove doesn't examine the CFG, and gets mightily
     confused by non-call exceptions ending blocks.  */
  if (flag_non_call_exceptions)
    return;

1110 1111 1112 1113 1114 1115
  df_note_add_problem ();
  df_analyze ();

  regstat_init_n_sets_and_refs ();
  regstat_compute_ri ();

1116
  /* Find out where a potential flags register is live, and so that we
1117
     can suppress some optimizations in those zones.  */
1118 1119
  mark_flags_life_zones (discover_flags_reg ());

1120
  regno_src_regno = XNEWVEC (int, nregs);
1121 1122
  for (i = nregs; --i >= 0; )
    regno_src_regno[i] = -1;
1123

1124 1125
  /* A forward/backward pass.  Replace output operands with input operands.  */

1126
  for (pass = 0; pass <= 2; pass++)
1127
    {
Vladimir Makarov committed
1128 1129
      /* We need fewer optimizations for IRA.  */
      if ((! flag_regmove || flag_ira) && pass >= flag_expensive_optimizations)
1130
	goto done;
1131

1132 1133
      if (dump_file)
	fprintf (dump_file, "Starting %s pass...\n",
1134 1135 1136 1137 1138
		 pass ? "backward" : "forward");

      for (insn = pass ? get_last_insn () : f; insn;
	   insn = pass ? PREV_INSN (insn) : NEXT_INSN (insn))
	{
1139
	  rtx set;
1140
	  int op_no, match_no;
1141 1142 1143 1144

	  set = single_set (insn);
	  if (! set)
	    continue;
1145

1146 1147 1148
	  if (flag_expensive_optimizations && ! pass
	      && (GET_CODE (SET_SRC (set)) == SIGN_EXTEND
		  || GET_CODE (SET_SRC (set)) == ZERO_EXTEND)
1149 1150
	      && REG_P (XEXP (SET_SRC (set), 0))
	      && REG_P (SET_DEST (set)))
1151 1152 1153
	    optimize_reg_copy_3 (insn, SET_DEST (set), SET_SRC (set));

	  if (flag_expensive_optimizations && ! pass
1154 1155
	      && REG_P (SET_SRC (set))
	      && REG_P (SET_DEST (set)))
1156 1157 1158 1159 1160 1161 1162
	    {
	      /* If this is a register-register copy where SRC is not dead,
		 see if we can optimize it.  If this optimization succeeds,
		 it will become a copy where SRC is dead.  */
	      if ((find_reg_note (insn, REG_DEAD, SET_SRC (set))
		   || optimize_reg_copy_1 (insn, SET_DEST (set), SET_SRC (set)))
		  && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
1163
		{
1164 1165 1166 1167 1168
		  /* Similarly for a pseudo-pseudo copy when SRC is dead.  */
		  if (REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER)
		    optimize_reg_copy_2 (insn, SET_DEST (set), SET_SRC (set));
		  if (regno_src_regno[REGNO (SET_DEST (set))] < 0
		      && SET_SRC (set) != SET_DEST (set))
1169
		    {
1170
		      int srcregno = REGNO (SET_SRC (set));
1171 1172 1173
		      if (regno_src_regno[srcregno] >= 0)
			srcregno = regno_src_regno[srcregno];
		      regno_src_regno[REGNO (SET_DEST (set))] = srcregno;
1174 1175
		    }
		}
1176
	    }
Vladimir Makarov committed
1177 1178 1179

	  /* All optimizations important for IRA have been done.  */
	  if (! flag_regmove || flag_ira)
1180
	    continue;
1181

Jeff Law committed
1182
	  if (! find_matches (insn, &match))
1183 1184 1185 1186 1187 1188 1189 1190 1191
	    continue;

	  /* Now scan through the operands looking for a source operand
	     which is supposed to match the destination operand.
	     Then scan forward for an instruction which uses the dest
	     operand.
	     If it dies there, then replace the dest in both operands with
	     the source operand.  */

1192
	  for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1193
	    {
1194
	      rtx src, dst, src_subreg;
1195 1196
	      enum reg_class src_class, dst_class;

1197
	      match_no = match.with[op_no];
1198 1199

	      /* Nothing to do if the two operands aren't supposed to match.  */
1200
	      if (match_no < 0)
1201 1202
		continue;

1203 1204
	      src = recog_data.operand[op_no];
	      dst = recog_data.operand[match_no];
1205

1206
	      if (!REG_P (src))
1207 1208 1209 1210 1211 1212 1213 1214
		continue;

	      src_subreg = src;
	      if (GET_CODE (dst) == SUBREG
		  && GET_MODE_SIZE (GET_MODE (dst))
		     >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dst))))
		{
		  dst = SUBREG_REG (dst);
1215 1216 1217 1218
		  src_subreg = lowpart_subreg (GET_MODE (dst),
					       src, GET_MODE (src));
		  if (!src_subreg)
		    continue;
1219
		}
1220
	      if (!REG_P (dst)
1221 1222 1223 1224 1225
		  || REGNO (dst) < FIRST_PSEUDO_REGISTER)
		continue;

	      if (REGNO (src) < FIRST_PSEUDO_REGISTER)
		{
1226
		  if (match.commutative[op_no] < op_no)
1227 1228 1229 1230 1231 1232 1233
		    regno_src_regno[REGNO (dst)] = REGNO (src);
		  continue;
		}

	      if (REG_LIVE_LENGTH (REGNO (src)) < 0)
		continue;

1234
	      /* op_no/src must be a read-only operand, and
1235
		 match_operand/dst must be a write-only operand.  */
1236 1237
	      if (match.use[op_no] != READ
		  || match.use[match_no] != WRITE)
1238 1239
		continue;

1240
	      if (match.early_clobber[match_no]
1241
		  && count_occurrences (PATTERN (insn), src, 0) > 1)
1242 1243 1244
		continue;

	      /* Make sure match_operand is the destination.  */
1245
	      if (recog_data.operand[match_no] != SET_DEST (set))
1246 1247
		continue;

1248
	      /* If the operands already match, then there is nothing to do.  */
1249
	      if (operands_match_p (src, dst))
1250 1251
		continue;

1252 1253 1254 1255 1256 1257 1258 1259 1260 1261
	      /* But in the commutative case, we might find a better match.  */
	      if (match.commutative[op_no] >= 0)
		{
		  rtx comm = recog_data.operand[match.commutative[op_no]];
		  if (operands_match_p (comm, dst)
		      && (replacement_quality (comm)
			  >= replacement_quality (src)))
		    continue;
		}

1262 1263
	      src_class = reg_preferred_class (REGNO (src));
	      dst_class = reg_preferred_class (REGNO (dst));
1264
	      if (! regclass_compatible_p (src_class, dst_class))
1265
		continue;
1266

1267 1268 1269
	      if (GET_MODE (src) != GET_MODE (dst))
		continue;

1270
	      if (fixup_match_1 (insn, set, src, src_subreg, dst, pass,
1271
				 op_no, match_no))
1272
		break;
1273 1274 1275 1276 1277 1278
	    }
	}
    }

  /* A backward pass.  Replace input operands with output operands.  */

1279 1280
  if (dump_file)
    fprintf (dump_file, "Starting backward pass...\n");
1281 1282 1283

  for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
    {
1284
      if (INSN_P (insn))
1285
	{
1286
	  int op_no, match_no;
1287
	  int success = 0;
1288

Jeff Law committed
1289
	  if (! find_matches (insn, &match))
1290 1291 1292 1293 1294 1295 1296 1297
	    continue;

	  /* Now scan through the operands looking for a destination operand
	     which is supposed to match a source operand.
	     Then scan backward for an instruction which sets the source
	     operand.  If safe, then replace the source operand with the
	     dest operand in both instructions.  */

1298 1299
	  copy_src = NULL_RTX;
	  copy_dst = NULL_RTX;
1300
	  for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1301
	    {
1302 1303
	      rtx set, p, src, dst;
	      rtx src_note, dst_note;
1304
	      int num_calls = 0, freq_calls = 0;
1305 1306
	      enum reg_class src_class, dst_class;
	      int length;
1307

1308
	      match_no = match.with[op_no];
1309

1310
	      /* Nothing to do if the two operands aren't supposed to match.  */
1311
	      if (match_no < 0)
1312
		continue;
1313

1314 1315
	      dst = recog_data.operand[match_no];
	      src = recog_data.operand[op_no];
1316

1317
	      if (!REG_P (src))
1318
		continue;
1319

1320
	      if (!REG_P (dst)
1321
		  || REGNO (dst) < FIRST_PSEUDO_REGISTER
1322
		  || REG_LIVE_LENGTH (REGNO (dst)) < 0
1323
		  || GET_MODE (src) != GET_MODE (dst))
1324
		continue;
1325

1326
	      /* If the operands already match, then there is nothing to do.  */
1327
	      if (operands_match_p (src, dst))
1328
		continue;
1329

1330 1331 1332 1333 1334 1335 1336
	      if (match.commutative[op_no] >= 0)
		{
		  rtx comm = recog_data.operand[match.commutative[op_no]];
		  if (operands_match_p (comm, dst))
		    continue;
		}

1337 1338 1339
	      set = single_set (insn);
	      if (! set)
		continue;
1340

1341 1342 1343 1344 1345 1346 1347 1348
	      /* Note that single_set ignores parts of a parallel set for
		 which one of the destinations is REG_UNUSED.  We can't
		 handle that here, since we can wind up rewriting things
		 such that a single register is set twice within a single
		 parallel.  */
	      if (reg_set_p (src, insn))
		continue;

1349
	      /* match_no/dst must be a write-only operand, and
1350
		 operand_operand/src must be a read-only operand.  */
1351 1352
	      if (match.use[op_no] != READ
		  || match.use[match_no] != WRITE)
1353
		continue;
1354

1355
	      if (match.early_clobber[match_no]
1356
		  && count_occurrences (PATTERN (insn), src, 0) > 1)
1357
		continue;
1358

1359
	      /* Make sure match_no is the destination.  */
1360
	      if (recog_data.operand[match_no] != SET_DEST (set))
1361
		continue;
1362

1363 1364 1365 1366 1367 1368
	      if (REGNO (src) < FIRST_PSEUDO_REGISTER)
		{
		  if (GET_CODE (SET_SRC (set)) == PLUS
		      && GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT
		      && XEXP (SET_SRC (set), 0) == src
		      && fixup_match_2 (insn, dst, src,
1369
					XEXP (SET_SRC (set), 1)))
1370 1371 1372 1373 1374
		    break;
		  continue;
		}
	      src_class = reg_preferred_class (REGNO (src));
	      dst_class = reg_preferred_class (REGNO (dst));
1375 1376

	      if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
1377
		{
1378 1379 1380 1381
		  /* We used to force the copy here like in other cases, but
		     it produces worse code, as it eliminates no copy
		     instructions and the copy emitted will be produced by
		     reload anyway.  On patterns with multiple alternatives,
1382
		     there may be better solution available.
1383 1384 1385 1386

		     In particular this change produced slower code for numeric
		     i387 programs.  */

1387 1388
		  continue;
		}
1389

1390
	      if (! regclass_compatible_p (src_class, dst_class))
1391 1392 1393 1394 1395 1396 1397 1398 1399
		{
		  if (!copy_src)
		    {
		      copy_src = src;
		      copy_dst = dst;
		    }
		  continue;
		}

1400 1401 1402
	      /* Can not modify an earlier insn to set dst if this insn
		 uses an old value in the source.  */
	      if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
1403 1404 1405 1406 1407 1408 1409 1410
		{
		  if (!copy_src)
		    {
		      copy_src = src;
		      copy_dst = dst;
		    }
		  continue;
		}
1411

1412 1413 1414 1415
	      /* If src is set once in a different basic block,
		 and is set equal to a constant, then do not use
		 it for this optimization, as this would make it
		 no longer equivalent to a constant.  */
1416

1417
	      if (reg_is_remote_constant_p (src, insn))
1418 1419 1420 1421 1422 1423 1424 1425 1426 1427
		{
		  if (!copy_src)
		    {
		      copy_src = src;
		      copy_dst = dst;
		    }
		  continue;
		}


1428 1429
	      if (dump_file)
		fprintf (dump_file,
1430
			 "Could fix operand %d of insn %d matching operand %d.\n",
1431
			 op_no, INSN_UID (insn), match_no);
1432

1433 1434
	      /* Scan backward to find the first instruction that uses
		 the input operand.  If the operand is set here, then
1435
		 replace it in both instructions with match_no.  */
1436 1437 1438 1439 1440

	      for (length = 0, p = PREV_INSN (insn); p; p = PREV_INSN (p))
		{
		  rtx pset;

1441 1442
		  /* ??? We can't scan past the end of a basic block without
		     updating the register lifetime info
1443 1444
		     (REG_DEAD/basic_block_live_at_start).  */
		  if (perhaps_ends_bb_p (p))
1445
		    break;
1446
		  else if (! INSN_P (p))
1447
		    continue;
1448

1449
		  length++;
1450

1451 1452 1453 1454 1455 1456 1457 1458 1459
		  /* ??? See if all of SRC is set in P.  This test is much
		     more conservative than it needs to be.  */
		  pset = single_set (p);
		  if (pset && SET_DEST (pset) == src)
		    {
		      /* We use validate_replace_rtx, in case there
			 are multiple identical source operands.  All of
			 them have to be changed at the same time.  */
		      if (validate_replace_rtx (src, dst, insn))
1460
			{
1461 1462 1463 1464
			  if (validate_change (p, &SET_DEST (pset),
					       dst, 0))
			    success = 1;
			  else
1465
			    {
1466 1467 1468 1469 1470
			      /* Change all source operands back.
				 This modifies the dst as a side-effect.  */
			      validate_replace_rtx (dst, src, insn);
			      /* Now make sure the dst is right.  */
			      validate_change (insn,
1471
					       recog_data.operand_loc[match_no],
1472
					       dst, 0);
1473 1474
			    }
			}
1475 1476 1477
		      break;
		    }

1478 1479 1480 1481 1482
		  /* We can't make this change if SRC is read or
		     partially written in P, since we are going to
		     eliminate SRC. We can't make this change 
		     if DST is mentioned at all in P,
		     since we are going to change its value.  */
1483
		  if (reg_overlap_mentioned_p (src, PATTERN (p))
1484
		      || reg_mentioned_p (dst, PATTERN (p)))
1485
		    break;
1486

1487 1488 1489
		  /* If we have passed a call instruction, and the
		     pseudo-reg DST is not already live across a call,
		     then don't perform the optimization.  */
1490
		  if (CALL_P (p))
1491 1492
		    {
		      num_calls++;
1493
		      freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (p));
1494 1495

		      if (REG_N_CALLS_CROSSED (REGNO (dst)) == 0)
1496
			break;
1497 1498
		    }
		}
1499

1500 1501 1502
	      if (success)
		{
		  int dstno, srcno;
1503

1504 1505 1506 1507 1508 1509 1510 1511
		  /* Remove the death note for SRC from INSN.  */
		  remove_note (insn, src_note);
		  /* Move the death note for SRC to P if it is used
		     there.  */
		  if (reg_overlap_mentioned_p (src, PATTERN (p)))
		    {
		      XEXP (src_note, 1) = REG_NOTES (p);
		      REG_NOTES (p) = src_note;
1512
		    }
1513 1514
		  /* If there is a REG_DEAD note for DST on P, then remove
		     it, because DST is now set there.  */
1515
		  if ((dst_note = find_reg_note (p, REG_DEAD, dst)))
1516 1517 1518 1519 1520
		    remove_note (p, dst_note);

		  dstno = REGNO (dst);
		  srcno = REGNO (src);

1521 1522
		  INC_REG_N_SETS (dstno, 1);
		  INC_REG_N_SETS (srcno, -1);
1523

1524 1525
		  REG_N_CALLS_CROSSED (dstno) += num_calls;
		  REG_N_CALLS_CROSSED (srcno) -= num_calls;
1526 1527
		  REG_FREQ_CALLS_CROSSED (dstno) += freq_calls;
		  REG_FREQ_CALLS_CROSSED (srcno) -= freq_calls;
1528 1529 1530

		  REG_LIVE_LENGTH (dstno) += length;
		  if (REG_LIVE_LENGTH (srcno) >= 0)
1531
		    {
1532 1533 1534 1535 1536 1537 1538
		      REG_LIVE_LENGTH (srcno) -= length;
		      /* REG_LIVE_LENGTH is only an approximation after
			 combine if sched is not run, so make sure that we
			 still have a reasonable value.  */
		      if (REG_LIVE_LENGTH (srcno) < 2)
			REG_LIVE_LENGTH (srcno) = 2;
		    }
1539

1540 1541
		  if (dump_file)
		    fprintf (dump_file,
1542
			     "Fixed operand %d of insn %d matching operand %d.\n",
1543
			     op_no, INSN_UID (insn), match_no);
1544

1545
		  break;
1546 1547
		}
	    }
1548 1549

	  /* If we weren't able to replace any of the alternatives, try an
1550
	     alternative approach of copying the source to the destination.  */
1551
	  if (!success && copy_src != NULL_RTX)
1552
	    copy_src_to_dest (insn, copy_src, copy_dst);
1553 1554
	}
    }
1555

1556 1557 1558
 done:
  /* Clean up.  */
  free (regno_src_regno);
1559 1560 1561 1562 1563
  if (reg_set_in_bb)
    {
      free (reg_set_in_bb);
      reg_set_in_bb = NULL;
    }
1564 1565
  regstat_free_n_sets_and_refs ();
  regstat_free_ri ();
1566 1567
}

1568 1569 1570
/* Returns nonzero if INSN's pattern has matching constraints for any operand.
   Returns 0 if INSN can't be recognized, or if the alternative can't be
   determined.
1571 1572

   Initialize the info in MATCHP based on the constraints.  */
1573 1574

static int
1575
find_matches (rtx insn, struct match *matchp)
1576 1577
{
  int likely_spilled[MAX_RECOG_OPERANDS];
1578
  int op_no;
1579 1580
  int any_matches = 0;

1581 1582 1583
  extract_insn (insn);
  if (! constrain_operands (0))
    return 0;
1584 1585 1586 1587

  /* Must initialize this before main loop, because the code for
     the commutative case may set matches for operands other than
     the current one.  */
1588
  for (op_no = recog_data.n_operands; --op_no >= 0; )
1589
    matchp->with[op_no] = matchp->commutative[op_no] = -1;
1590

1591
  for (op_no = 0; op_no < recog_data.n_operands; op_no++)
1592
    {
1593 1594
      const char *p;
      char c;
1595 1596
      int i = 0;

1597
      p = recog_data.constraints[op_no];
1598

1599 1600 1601
      likely_spilled[op_no] = 0;
      matchp->use[op_no] = READ;
      matchp->early_clobber[op_no] = 0;
1602
      if (*p == '=')
1603
	matchp->use[op_no] = WRITE;
1604
      else if (*p == '+')
1605
	matchp->use[op_no] = READWRITE;
1606 1607 1608 1609 1610

      for (;*p && i < which_alternative; p++)
	if (*p == ',')
	  i++;

1611 1612 1613
      while ((c = *p) != '\0' && c != ',')
	{
	  switch (c)
1614
	    {
1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632
	    case '=':
	      break;
	    case '+':
	      break;
	    case '&':
	      matchp->early_clobber[op_no] = 1;
	      break;
	    case '%':
	      matchp->commutative[op_no] = op_no + 1;
	      matchp->commutative[op_no + 1] = op_no;
	      break;

	    case '0': case '1': case '2': case '3': case '4':
	    case '5': case '6': case '7': case '8': case '9':
	      {
		char *end;
		unsigned long match_ul = strtoul (p, &end, 10);
		int match = match_ul;
1633

1634
		p = end;
1635

1636 1637 1638 1639 1640 1641 1642 1643
		if (match < op_no && likely_spilled[match])
		  continue;
		matchp->with[op_no] = match;
		any_matches = 1;
		if (matchp->commutative[op_no] >= 0)
		  matchp->with[matchp->commutative[op_no]] = match;
	      }
	    continue;
1644

1645 1646 1647 1648
	  case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'h':
	  case 'j': case 'k': case 'l': case 'p': case 'q': case 't': case 'u':
	  case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B':
	  case 'C': case 'D': case 'W': case 'Y': case 'Z':
1649
	    if (CLASS_LIKELY_SPILLED_P (REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p) ))
1650
	      likely_spilled[op_no] = 1;
1651 1652
	    break;
	  }
1653 1654
	  p += CONSTRAINT_LEN (c, p);
	}
1655
    }
1656
  return any_matches;
1657 1658
}

1659 1660 1661 1662
/* Try to replace all occurrences of DST_REG with SRC in LOC, that is
   assumed to be in INSN.  */

static void
1663
replace_in_call_usage (rtx *loc, unsigned int dst_reg, rtx src, rtx insn)
1664 1665 1666 1667 1668 1669 1670 1671
{
  rtx x = *loc;
  enum rtx_code code;
  const char *fmt;
  int i, j;

  if (! x)
    return;
1672

1673 1674 1675 1676 1677
  code = GET_CODE (x);
  if (code == REG)
    {
      if (REGNO (x) != dst_reg)
	return;
1678

1679 1680 1681 1682
      validate_change (insn, loc, src, 1);

      return;
    }
1683

1684 1685 1686 1687 1688 1689 1690 1691 1692 1693
  /* Process each of our operands recursively.  */
  fmt = GET_RTX_FORMAT (code);
  for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
    if (*fmt == 'e')
      replace_in_call_usage (&XEXP (x, i), dst_reg, src, insn);
    else if (*fmt == 'E')
      for (j = 0; j < XVECLEN (x, i); j++)
	replace_in_call_usage (& XVECEXP (x, i, j), dst_reg, src, insn);
}

1694
/* Try to replace output operand DST in SET, with input operand SRC.  SET is
Jeff Law committed
1695
   the only set in INSN.  INSN has just been recognized and constrained.
1696 1697 1698 1699
   SRC is operand number OPERAND_NUMBER in INSN.
   DST is operand number MATCH_NUMBER in INSN.
   If BACKWARD is nonzero, we have been called in a backward pass.
   Return nonzero for success.  */
1700

1701
static int
1702
fixup_match_1 (rtx insn, rtx set, rtx src, rtx src_subreg, rtx dst,
1703
	       int backward, int operand_number, int match_number)
1704 1705 1706 1707
{
  rtx p;
  rtx post_inc = 0, post_inc_set = 0, search_end = 0;
  int success = 0;
1708
  int num_calls = 0, freq_calls = 0, s_num_calls = 0, s_freq_calls = 0;
1709
  enum rtx_code code = NOTE;
1710
  HOST_WIDE_INT insn_const = 0, newconst = 0;
1711
  rtx overlap = 0; /* need to move insn ? */
1712
  rtx src_note = find_reg_note (insn, REG_DEAD, src), dst_note = NULL_RTX;
1713
  int length, s_length;
1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730

  if (! src_note)
    {
      /* Look for (set (regX) (op regA constX))
		  (set (regY) (op regA constY))
	 and change that to
		  (set (regA) (op regA constX)).
		  (set (regY) (op regA constY-constX)).
	 This works for add and shift operations, if
	 regA is dead after or set by the second insn.  */

      code = GET_CODE (SET_SRC (set));
      if ((code == PLUS || code == LSHIFTRT
	   || code == ASHIFT || code == ASHIFTRT)
	  && XEXP (SET_SRC (set), 0) == src
	  && GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT)
	insn_const = INTVAL (XEXP (SET_SRC (set), 1));
1731
      else if (! stable_and_no_regs_but_for_p (SET_SRC (set), src, dst))
1732 1733 1734 1735 1736 1737
	return 0;
      else
	/* We might find a src_note while scanning.  */
	code = NOTE;
    }

1738 1739
  if (dump_file)
    fprintf (dump_file,
1740 1741 1742 1743 1744 1745 1746
	     "Could fix operand %d of insn %d matching operand %d.\n",
	     operand_number, INSN_UID (insn), match_number);

  /* If SRC is equivalent to a constant set in a different basic block,
     then do not use it for this optimization.  We want the equivalence
     so that if we have to reload this register, we can reload the
     constant, rather than extending the lifespan of the register.  */
1747
  if (reg_is_remote_constant_p (src, insn))
1748 1749 1750 1751 1752 1753 1754 1755 1756
    return 0;

  /* Scan forward to find the next instruction that
     uses the output operand.  If the operand dies here,
     then replace it in both instructions with
     operand_number.  */

  for (length = s_length = 0, p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
    {
1757
      if (CALL_P (p))
1758 1759
	replace_in_call_usage (& CALL_INSN_FUNCTION_USAGE (p),
			       REGNO (dst), src, p);
1760

1761
      /* ??? We can't scan past the end of a basic block without updating
1762 1763
	 the register lifetime info (REG_DEAD/basic_block_live_at_start).  */
      if (perhaps_ends_bb_p (p))
1764
	break;
1765
      else if (! INSN_P (p))
1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781
	continue;

      length++;
      if (src_note)
	s_length++;

      if (reg_set_p (src, p) || reg_set_p (dst, p)
	  || (GET_CODE (PATTERN (p)) == USE
	      && reg_overlap_mentioned_p (src, XEXP (PATTERN (p), 0))))
	break;

      /* See if all of DST dies in P.  This test is
	 slightly more conservative than it needs to be.  */
      if ((dst_note = find_regno_note (p, REG_DEAD, REGNO (dst)))
	  && (GET_MODE (XEXP (dst_note, 0)) == GET_MODE (dst)))
	{
1782 1783 1784 1785 1786 1787 1788
	  /* If we would be moving INSN, check that we won't move it
	     into the shadow of a live a live flags register.  */
	  /* ??? We only try to move it in front of P, although
		 we could move it anywhere between OVERLAP and P.  */
	  if (overlap && GET_MODE (PREV_INSN (p)) != VOIDmode)
	    break;

1789 1790 1791
	  if (! src_note)
	    {
	      rtx q;
1792
	      rtx set2 = NULL_RTX;
1793 1794 1795 1796 1797 1798 1799

	      /* If an optimization is done, the value of SRC while P
		 is executed will be changed.  Check that this is OK.  */
	      if (reg_overlap_mentioned_p (src, PATTERN (p)))
		break;
	      for (q = p; q; q = NEXT_INSN (q))
		{
1800 1801
		  /* ??? We can't scan past the end of a basic block without
		     updating the register lifetime info
1802 1803
		     (REG_DEAD/basic_block_live_at_start).  */
		  if (perhaps_ends_bb_p (q))
1804 1805 1806 1807
		    {
		      q = 0;
		      break;
		    }
1808
		  else if (! INSN_P (q))
1809
		    continue;
1810 1811
		  else if (reg_overlap_mentioned_p (src, PATTERN (q))
			   || reg_set_p (src, q))
1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828
		    break;
		}
	      if (q)
		set2 = single_set (q);
	      if (! q || ! set2 || GET_CODE (SET_SRC (set2)) != code
		  || XEXP (SET_SRC (set2), 0) != src
		  || GET_CODE (XEXP (SET_SRC (set2), 1)) != CONST_INT
		  || (SET_DEST (set2) != src
		      && ! find_reg_note (q, REG_DEAD, src)))
		{
		  /* If this is a PLUS, we can still save a register by doing
		     src += insn_const;
		     P;
		     src -= insn_const; .
		     This also gives opportunities for subsequent
		     optimizations in the backward pass, so do it there.  */
		  if (code == PLUS && backward
1829 1830 1831 1832 1833
		      /* Don't do this if we can likely tie DST to SET_DEST
			 of P later; we can't do this tying here if we got a
			 hard register.  */
		      && ! (dst_note && ! REG_N_CALLS_CROSSED (REGNO (dst))
			    && single_set (p)
1834
			    && REG_P (SET_DEST (single_set (p)))
1835 1836
			    && (REGNO (SET_DEST (single_set (p)))
				< FIRST_PSEUDO_REGISTER))
1837 1838 1839
		      /* We may only emit an insn directly after P if we
			 are not in the shadow of a live flags register.  */
		      && GET_MODE (p) == VOIDmode)
1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855
		    {
		      search_end = q;
		      q = insn;
		      set2 = set;
		      newconst = -insn_const;
		      code = MINUS;
		    }
		  else
		    break;
		}
	      else
		{
		  newconst = INTVAL (XEXP (SET_SRC (set2), 1)) - insn_const;
		  /* Reject out of range shifts.  */
		  if (code != PLUS
		      && (newconst < 0
1856 1857 1858
			  || ((unsigned HOST_WIDE_INT) newconst
			      >= (GET_MODE_BITSIZE (GET_MODE
						    (SET_SRC (set2)))))))
1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872
		    break;
		  if (code == PLUS)
		    {
		      post_inc = q;
		      if (SET_DEST (set2) != src)
			post_inc_set = set2;
		    }
		}
	      /* We use 1 as last argument to validate_change so that all
		 changes are accepted or rejected together by apply_change_group
		 when it is called by validate_replace_rtx .  */
	      validate_change (q, &XEXP (SET_SRC (set2), 1),
			       GEN_INT (newconst), 1);
	    }
1873
	  validate_change (insn, recog_data.operand_loc[match_number], src, 1);
1874 1875 1876 1877 1878 1879 1880 1881 1882
	  if (validate_replace_rtx (dst, src_subreg, p))
	    success = 1;
	  break;
	}

      if (reg_overlap_mentioned_p (dst, PATTERN (p)))
	break;
      if (! src_note && reg_overlap_mentioned_p (src, PATTERN (p)))
	{
1883 1884 1885 1886 1887
	  /* INSN was already checked to be movable wrt. the registers that it
	     sets / uses when we found no REG_DEAD note for src on it, but it
	     still might clobber the flags register.  We'll have to check that
	     we won't insert it into the shadow of a live flags register when
	     we finally know where we are to move it.  */
1888 1889 1890 1891 1892 1893
	  overlap = p;
	  src_note = find_reg_note (p, REG_DEAD, src);
	}

      /* If we have passed a call instruction, and the pseudo-reg SRC is not
	 already live across a call, then don't perform the optimization.  */
1894
      if (CALL_P (p))
1895 1896 1897 1898 1899
	{
	  if (REG_N_CALLS_CROSSED (REGNO (src)) == 0)
	    break;

	  num_calls++;
1900
	  freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (p));
1901 1902

	  if (src_note)
1903 1904 1905 1906
	    {
	      s_num_calls++;
	      s_freq_calls += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (p));
	    }
1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917
	}
    }

  if (! success)
    return 0;

  /* Remove the death note for DST from P.  */
  remove_note (p, dst_note);
  if (code == MINUS)
    {
      post_inc = emit_insn_after (copy_rtx (PATTERN (insn)), p);
1918 1919
      if ((HAVE_PRE_INCREMENT || HAVE_PRE_DECREMENT)
	  && search_end
1920 1921 1922
	  && try_auto_increment (search_end, post_inc, 0, src, newconst, 1))
	post_inc = 0;
      validate_change (insn, &XEXP (SET_SRC (set), 1), GEN_INT (insn_const), 0);
1923
      INC_REG_N_SETS (REGNO (src), 1);
1924 1925 1926 1927 1928 1929 1930 1931 1932
      REG_LIVE_LENGTH (REGNO (src))++;
    }
  if (overlap)
    {
      /* The lifetime of src and dest overlap,
	 but we can change this by moving insn.  */
      rtx pat = PATTERN (insn);
      if (src_note)
	remove_note (overlap, src_note);
1933 1934
      if ((HAVE_POST_INCREMENT || HAVE_POST_DECREMENT)
	  && code == PLUS
1935 1936 1937 1938 1939 1940
	  && try_auto_increment (overlap, insn, 0, src, insn_const, 0))
	insn = overlap;
      else
	{
	  rtx notes = REG_NOTES (insn);

1941
	  p = emit_insn_after_setloc (pat, PREV_INSN (p), INSN_LOCATOR (insn));
1942
	  delete_insn (insn);
1943
	  REG_NOTES (p) = notes;
1944
	  df_notes_rescan (p);
1945 1946 1947 1948 1949 1950 1951 1952 1953
	}
    }
  /* Sometimes we'd generate src = const; src += n;
     if so, replace the instruction that set src
     in the first place.  */

  if (! overlap && (code == PLUS || code == MINUS))
    {
      rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
1954
      rtx q, set2 = NULL_RTX;
1955
      int num_calls2 = 0, s_length2 = 0, freq_calls2 = 0;
1956 1957 1958

      if (note && CONSTANT_P (XEXP (note, 0)))
	{
1959
	  for (q = PREV_INSN (insn); q; q = PREV_INSN (q))
1960
	    {
1961 1962
	      /* ??? We can't scan past the end of a basic block without
		 updating the register lifetime info
1963 1964
		 (REG_DEAD/basic_block_live_at_start).  */
	      if (perhaps_ends_bb_p (q))
1965 1966 1967 1968
		{
		  q = 0;
		  break;
		}
1969
	      else if (! INSN_P (q))
1970
		continue;
1971

1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982
	      s_length2++;
	      if (reg_set_p (src, q))
		{
		  set2 = single_set (q);
		  break;
		}
	      if (reg_overlap_mentioned_p (src, PATTERN (q)))
		{
		  q = 0;
		  break;
		}
1983
	      if (CALL_P (p))
1984 1985 1986 1987
		{
		  num_calls2++;
		  freq_calls2 += REG_FREQ_FROM_BB  (BLOCK_FOR_INSN (p));
		}
1988 1989 1990 1991
	    }
	  if (q && set2 && SET_DEST (set2) == src && CONSTANT_P (SET_SRC (set2))
	      && validate_change (insn, &SET_SRC (set), XEXP (note, 0), 0))
	    {
1992
	      delete_insn (q);
1993
	      INC_REG_N_SETS (REGNO (src), -1);
1994
	      REG_N_CALLS_CROSSED (REGNO (src)) -= num_calls2;
1995
	      REG_FREQ_CALLS_CROSSED (REGNO (src)) -= freq_calls2;
1996 1997 1998 1999 2000
	      REG_LIVE_LENGTH (REGNO (src)) -= s_length2;
	      insn_const = 0;
	    }
	}
    }
2001

2002
  if ((HAVE_PRE_INCREMENT || HAVE_PRE_DECREMENT)
2003
	   && (code == PLUS || code == MINUS) && insn_const
2004 2005
	   && try_auto_increment (p, insn, 0, src, insn_const, 1))
    insn = p;
2006 2007
  else if ((HAVE_POST_INCREMENT || HAVE_POST_DECREMENT)
	   && post_inc
2008 2009 2010 2011 2012 2013 2014 2015
	   && try_auto_increment (p, post_inc, post_inc_set, src, newconst, 0))
    post_inc = 0;
  /* If post_inc still prevails, try to find an
     insn where it can be used as a pre-in/decrement.
     If code is MINUS, this was already tried.  */
  if (post_inc && code == PLUS
  /* Check that newconst is likely to be usable
     in a pre-in/decrement before starting the search.  */
2016 2017 2018
      && ((HAVE_PRE_INCREMENT && newconst > 0 && newconst <= MOVE_MAX)
	  || (HAVE_PRE_DECREMENT && newconst < 0 && newconst >= -MOVE_MAX))
      && exact_log2 (newconst))
2019 2020 2021 2022
    {
      rtx q, inc_dest;

      inc_dest = post_inc_set ? SET_DEST (post_inc_set) : src;
Kaveh R. Ghazi committed
2023
      for (q = post_inc; (q = NEXT_INSN (q)); )
2024
	{
2025
	  /* ??? We can't scan past the end of a basic block without updating
2026
	     the register lifetime info
2027
	     (REG_DEAD/basic_block_live_at_start).  */
2028
	  if (perhaps_ends_bb_p (q))
2029
	    break;
2030
	  else if (! INSN_P (q))
2031
	    continue;
2032 2033 2034
	  else if (src != inc_dest
		   && (reg_overlap_mentioned_p (src, PATTERN (q))
		       || reg_set_p (src, q)))
2035
	    break;
2036
	  else if (reg_set_p (inc_dest, q))
2037
	    break;
2038
	  else if (reg_overlap_mentioned_p (inc_dest, PATTERN (q)))
2039 2040 2041 2042 2043 2044 2045
	    {
	      try_auto_increment (q, post_inc,
				  post_inc_set, inc_dest, newconst, 1);
	      break;
	    }
	}
    }
2046

2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063
  /* Move the death note for DST to INSN if it is used
     there.  */
  if (reg_overlap_mentioned_p (dst, PATTERN (insn)))
    {
      XEXP (dst_note, 1) = REG_NOTES (insn);
      REG_NOTES (insn) = dst_note;
    }

  if (src_note)
    {
      /* Move the death note for SRC from INSN to P.  */
      if (! overlap)
	remove_note (insn, src_note);
      XEXP (src_note, 1) = REG_NOTES (p);
      REG_NOTES (p) = src_note;

      REG_N_CALLS_CROSSED (REGNO (src)) += s_num_calls;
2064
      REG_FREQ_CALLS_CROSSED (REGNO (src)) += s_freq_calls;
2065 2066
    }

2067 2068
  INC_REG_N_SETS (REGNO (src), 1);
  INC_REG_N_SETS (REGNO (dst), -1);
2069 2070

  REG_N_CALLS_CROSSED (REGNO (dst)) -= num_calls;
2071
  REG_FREQ_CALLS_CROSSED (REGNO (dst)) -= freq_calls;
2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082

  REG_LIVE_LENGTH (REGNO (src)) += s_length;
  if (REG_LIVE_LENGTH (REGNO (dst)) >= 0)
    {
      REG_LIVE_LENGTH (REGNO (dst)) -= length;
      /* REG_LIVE_LENGTH is only an approximation after
	 combine if sched is not run, so make sure that we
	 still have a reasonable value.  */
      if (REG_LIVE_LENGTH (REGNO (dst)) < 2)
	REG_LIVE_LENGTH (REGNO (dst)) = 2;
    }
2083 2084
  if (dump_file)
    fprintf (dump_file,
2085 2086 2087 2088 2089 2090
	     "Fixed operand %d of insn %d matching operand %d.\n",
	     operand_number, INSN_UID (insn), match_number);
  return 1;
}


2091
/* Return nonzero if X is stable and mentions no registers but for
2092 2093 2094
   mentioning SRC or mentioning / changing DST .  If in doubt, presume
   it is unstable.
   The rationale is that we want to check if we can move an insn easily
2095
   while just paying attention to SRC and DST.  */
2096
static int
2097
stable_and_no_regs_but_for_p (rtx x, rtx src, rtx dst)
2098 2099 2100 2101
{
  RTX_CODE code = GET_CODE (x);
  switch (GET_RTX_CLASS (code))
    {
2102 2103 2104 2105 2106 2107 2108
    case RTX_UNARY:
    case RTX_BIN_ARITH:
    case RTX_COMM_ARITH:
    case RTX_COMPARE:
    case RTX_COMM_COMPARE:
    case RTX_TERNARY:
    case RTX_BITFIELD_OPS:
2109 2110
      {
	int i;
2111
	const char *fmt = GET_RTX_FORMAT (code);
2112
	for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2113 2114
	  if (fmt[i] == 'e'
	      && ! stable_and_no_regs_but_for_p (XEXP (x, i), src, dst))
2115 2116 2117
	      return 0;
	return 1;
      }
2118
    case RTX_OBJ:
2119 2120 2121 2122 2123 2124 2125
      if (code == REG)
	return x == src || x == dst;
      /* If this is a MEM, look inside - there might be a register hidden in
	 the address of an unchanging MEM.  */
      if (code == MEM
	  && ! stable_and_no_regs_but_for_p (XEXP (x, 0), src, dst))
	return 0;
2126
      /* Fall through.  */
2127 2128 2129 2130
    default:
      return ! rtx_unstable_p (x);
    }
}
2131 2132


2133 2134 2135 2136 2137 2138 2139 2140
static bool
gate_handle_regmove (void)
{
  return (optimize > 0 && flag_regmove);
}

/* Register allocation pre-pass, to reduce number of moves necessary
   for two-address machines.  */
2141
static unsigned int
2142 2143
rest_of_handle_regmove (void)
{
2144
  regmove_optimize (get_insns (), max_reg_num ());
2145
  return 0;
2146 2147
}

2148
struct rtl_opt_pass pass_regmove =
2149
{
2150 2151
 {
  RTL_PASS,
2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162
  "regmove",                            /* name */
  gate_handle_regmove,                  /* gate */
  rest_of_handle_regmove,               /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  0,                                    /* static_pass_number */
  TV_REGMOVE,                           /* tv_id */
  0,                                    /* properties_required */
  0,                                    /* properties_provided */
  0,                                    /* properties_destroyed */
  0,                                    /* todo_flags_start */
2163
  TODO_df_finish | TODO_verify_rtl_sharing |
2164
  TODO_dump_func |
2165 2166
  TODO_ggc_collect                      /* todo_flags_finish */
 }
2167 2168
};