loop.c 264 KB
Newer Older
Richard Kenner committed
1
/* Perform various loop optimizations, including strength reduction.
Jeff Law committed
2
   Copyright (C) 1987, 88, 89, 91-98, 1999 Free Software Foundation, Inc.
Richard Stallman committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

This file is part of GNU CC.

GNU CC 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 Software Foundation; either version 2, or (at your option)
any later version.

GNU CC 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.

You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING.  If not, write to
Richard Kenner committed
18 19
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */
Richard Stallman committed
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37


/* This is the loop optimization pass of the compiler.
   It finds invariant computations within loops and moves them
   to the beginning of the loop.  Then it identifies basic and 
   general induction variables.  Strength reduction is applied to the general
   induction variables, and induction variable elimination is applied to
   the basic induction variables.

   It also finds cases where
   a register is set within the loop by zero-extending a narrower value
   and changes these to zero the entire register once before the loop
   and merely copy the low part within the loop.

   Most of the complexity is in heuristics to decide when it is worth
   while to do these things.  */

#include "config.h"
38
#include "system.h"
Richard Stallman committed
39 40 41 42 43 44 45 46 47 48 49
#include "rtl.h"
#include "obstack.h"
#include "expr.h"
#include "insn-config.h"
#include "insn-flags.h"
#include "regs.h"
#include "hard-reg-set.h"
#include "recog.h"
#include "flags.h"
#include "real.h"
#include "loop.h"
Mike Stump committed
50
#include "except.h"
Graham Stott committed
51
#include "toplev.h"
Richard Stallman committed
52 53

/* Vector mapping INSN_UIDs to luids.
54
   The luids are like uids but increase monotonically always.
Richard Stallman committed
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
   We use them to see whether a jump comes from outside a given loop.  */

int *uid_luid;

/* Indexed by INSN_UID, contains the ordinal giving the (innermost) loop
   number the insn is contained in.  */

int *uid_loop_num;

/* 1 + largest uid of any insn.  */

int max_uid_for_loop;

/* 1 + luid of last insn.  */

static int max_luid;

/* Number of loops detected in current function.  Used as index to the
   next few tables.  */

static int max_loop_num;

/* Indexed by loop number, contains the first and last insn of each loop.  */

static rtx *loop_number_loop_starts, *loop_number_loop_ends;

/* For each loop, gives the containing loop number, -1 if none.  */

int *loop_outer_loop;

85 86
#ifdef HAVE_decrement_and_branch_on_count
/* Records whether resource in use by inner loop.  */
87 88

int *loop_used_count_register;
89
#endif  /* HAVE_decrement_and_branch_on_count */
90

Richard Stallman committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
/* Indexed by loop number, contains a nonzero value if the "loop" isn't
   really a loop (an insn outside the loop branches into it).  */

static char *loop_invalid;

/* Indexed by loop number, links together all LABEL_REFs which refer to
   code labels outside the loop.  Used by routines that need to know all
   loop exits, such as final_biv_value and final_giv_value.

   This does not include loop exits due to return instructions.  This is
   because all bivs and givs are pseudos, and hence must be dead after a
   return, so the presense of a return does not affect any of the
   optimizations that use this info.  It is simpler to just not include return
   instructions on this list.  */

rtx *loop_number_exit_labels;

108 109 110 111 112
/* Indexed by loop number, counts the number of LABEL_REFs on
   loop_number_exit_labels for this loop and all loops nested inside it.  */

int *loop_number_exit_count;

113
/* Nonzero if there is a subroutine call in the current loop.  */
Richard Stallman committed
114 115 116

static int loop_has_call;

117 118 119 120 121
/* Nonzero if there is a volatile memory reference in the current
   loop.  */

static int loop_has_volatile;

122 123 124 125
/* Nonzero if there is a tablejump in the current loop.  */

static int loop_has_tablejump;

Richard Stallman committed
126 127 128 129 130 131 132 133 134 135
/* Added loop_continue which is the NOTE_INSN_LOOP_CONT of the
   current loop.  A continue statement will generate a branch to
   NEXT_INSN (loop_continue).  */

static rtx loop_continue;

/* Indexed by register number, contains the number of times the reg
   is set during the loop being scanned.
   During code motion, a negative value indicates a reg that has been
   made a candidate; in particular -2 means that it is an candidate that
136
   we know is equal to a constant and -1 means that it is an candidate
Richard Stallman committed
137 138 139 140 141 142 143
   not known equal to a constant.
   After code motion, regs moved have 0 (which is accurate now)
   while the failed candidates have the original number of times set.

   Therefore, at all times, == 0 indicates an invariant register;
   < 0 a conditionally invariant one.  */

144
static varray_type set_in_loop;
Richard Stallman committed
145

146
/* Original value of set_in_loop; same except that this value
Richard Stallman committed
147 148 149
   is not set negative for a reg whose sets have been made candidates
   and not set to 0 for a reg that is moved.  */

150
static varray_type n_times_set;
Richard Stallman committed
151 152 153 154

/* Index by register number, 1 indicates that the register
   cannot be moved or strength reduced.  */

155
static varray_type may_not_optimize;
Richard Stallman committed
156 157 158 159 160 161

/* Nonzero means reg N has already been moved out of one loop.
   This reduces the desire to move it out of another.  */

static char *moved_once;

Jeff Law committed
162
/* List of MEMs that are stored in this loop.  */
Richard Stallman committed
163

Jeff Law committed
164
static rtx loop_store_mems;
Richard Stallman committed
165

166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
typedef struct loop_mem_info {
  rtx mem;      /* The MEM itself.  */
  rtx reg;      /* Corresponding pseudo, if any.  */
  int optimize; /* Nonzero if we can optimize access to this MEM.  */
} loop_mem_info;

/* Array of MEMs that are used (read or written) in this loop, but
   cannot be aliased by anything in this loop, except perhaps
   themselves.  In other words, if loop_mems[i] is altered during the
   loop, it is altered by an expression that is rtx_equal_p to it.  */

static loop_mem_info *loop_mems;

/* The index of the next available slot in LOOP_MEMS.  */

static int loop_mems_idx;

/* The number of elements allocated in LOOP_MEMs.  */

static int loop_mems_allocated;

Richard Stallman committed
187
/* Nonzero if we don't know what MEMs were changed in the current loop.
188
   This happens if the loop contains a call (in which case `loop_has_call'
Richard Stallman committed
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
   will also be set) or if we store into more than NUM_STORES MEMs.  */

static int unknown_address_altered;

/* Count of movable (i.e. invariant) instructions discovered in the loop.  */
static int num_movables;

/* Count of memory write instructions discovered in the loop.  */
static int num_mem_sets;

/* Number of loops contained within the current one, including itself.  */
static int loops_enclosed;

/* Bound on pseudo register number before loop optimization.
   A pseudo has valid regscan info if its number is < max_reg_before_loop.  */
int max_reg_before_loop;

/* This obstack is used in product_cheap_p to allocate its rtl.  It
   may call gen_reg_rtx which, in turn, may reallocate regno_reg_rtx.
   If we used the same obstack that it did, we would be deallocating
   that array.  */

static struct obstack temp_obstack;

/* This is where the pointer to the obstack being used for RTL is stored.  */

extern struct obstack *rtl_obstack;

#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free

/* During the analysis of a loop, a chain of `struct movable's
   is made to record all the movable insns found.
   Then the entire chain can be scanned to decide which to move.  */

struct movable
{
  rtx insn;			/* A movable insn */
Mike Stump committed
227 228
  rtx set_src;			/* The expression this reg is set from.  */
  rtx set_dest;			/* The destination of this SET.  */
Richard Stallman committed
229
  rtx dependencies;		/* When INSN is libcall, this is an EXPR_LIST
Mike Stump committed
230
				   of any registers used within the LIBCALL.  */
Richard Stallman committed
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
  int consec;			/* Number of consecutive following insns 
				   that must be moved with this one.  */
  int regno;			/* The register it sets */
  short lifetime;		/* lifetime of that register;
				   may be adjusted when matching movables
				   that load the same value are found.  */
  short savings;		/* Number of insns we can move for this reg,
				   including other movables that force this
				   or match this one.  */
  unsigned int cond : 1;	/* 1 if only conditionally movable */
  unsigned int force : 1;	/* 1 means MUST move this insn */
  unsigned int global : 1;	/* 1 means reg is live outside this loop */
		/* If PARTIAL is 1, GLOBAL means something different:
		   that the reg is live outside the range from where it is set
		   to the following label.  */
  unsigned int done : 1;	/* 1 inhibits further processing of this */
  
  unsigned int partial : 1;	/* 1 means this reg is used for zero-extending.
				   In particular, moving it does not make it
				   invariant.  */
  unsigned int move_insn : 1;	/* 1 means that we call emit_move_insn to
				   load SRC, rather than copying INSN.  */
253 254
  unsigned int move_insn_first:1;/* Same as above, if this is necessary for the
				    first insn of a consecutive sets group.  */
Mike Stump committed
255
  unsigned int is_equiv : 1;	/* 1 means a REG_EQUIV is present on INSN.  */
Richard Stallman committed
256 257 258 259 260 261 262 263
  enum machine_mode savemode;   /* Nonzero means it is a mode for a low part
				   that we should avoid changing when clearing
				   the rest of the reg.  */
  struct movable *match;	/* First entry for same value */
  struct movable *forces;	/* An insn that must be moved if this is */
  struct movable *next;
};

264 265
static struct movable *the_movables;

Richard Stallman committed
266 267 268 269
FILE *loop_dump_stream;

/* Forward declarations.  */

270 271 272 273 274 275 276
static void find_and_verify_loops PROTO((rtx));
static void mark_loop_jump PROTO((rtx, int));
static void prescan_loop PROTO((rtx, rtx));
static int reg_in_basic_block_p PROTO((rtx, rtx));
static int consec_sets_invariant_p PROTO((rtx, int, rtx));
static rtx libcall_other_reg PROTO((rtx, rtx));
static int labels_in_range_p PROTO((rtx, int));
277 278
static void count_one_set PROTO((rtx, rtx, varray_type, rtx *));

279 280
static void count_loop_regs_set PROTO((rtx, rtx, varray_type, varray_type,
				       int *, int)); 
281
static void note_addr_stored PROTO((rtx, rtx));
282
static int loop_reg_used_before_p PROTO((rtx, rtx, rtx, rtx, rtx));
283
static void scan_loop PROTO((rtx, rtx, int, int));
284
#if 0
285
static void replace_call_address PROTO((rtx, rtx, rtx));
286
#endif
287 288 289 290 291
static rtx skip_consec_insns PROTO((rtx, int));
static int libcall_benefit PROTO((rtx));
static void ignore_some_movables PROTO((struct movable *));
static void force_movables PROTO((struct movable *));
static void combine_movables PROTO((struct movable *, int));
292
static int regs_match_p PROTO((rtx, rtx, struct movable *));
293
static int rtx_equal_for_loop_p PROTO((rtx, rtx, struct movable *));
294
static void add_label_notes PROTO((rtx, rtx));
295
static void move_movables PROTO((struct movable *, int, int, rtx, rtx, int));
296
static int count_nonfixed_reads PROTO((rtx));
297
static void strength_reduce PROTO((rtx, rtx, rtx, int, rtx, rtx, int, int));
298
static void find_single_use_in_loop PROTO((rtx, rtx, varray_type));
299 300 301
static int valid_initial_value_p PROTO((rtx, rtx, int, rtx));
static void find_mem_givs PROTO((rtx, rtx, int, rtx, rtx));
static void record_biv PROTO((struct induction *, rtx, rtx, rtx, rtx, int, int));
302 303
static void check_final_value PROTO((struct induction *, rtx, rtx, 
				     unsigned HOST_WIDE_INT));
304 305 306 307
static void record_giv PROTO((struct induction *, rtx, rtx, rtx, rtx, rtx, int, enum g_types, int, rtx *, rtx, rtx));
static void update_giv_derive PROTO((rtx));
static int basic_induction_var PROTO((rtx, enum machine_mode, rtx, rtx, rtx *, rtx *));
static rtx simplify_giv_expr PROTO((rtx, int *));
308
static int general_induction_var PROTO((rtx, rtx *, rtx *, rtx *, int, int *));
309
static int consec_sets_giv PROTO((int, rtx, rtx, rtx, rtx *, rtx *, rtx *));
310
static int check_dbra_loop PROTO((rtx, int, rtx, struct loop_info *));
311
static rtx express_from_1 PROTO((rtx, rtx, rtx));
312
static rtx express_from PROTO((struct induction *, struct induction *));
313
static rtx combine_givs_p PROTO((struct induction *, struct induction *));
314 315 316 317 318 319 320
static void combine_givs PROTO((struct iv_class *));
static int product_cheap_p PROTO((rtx, rtx));
static int maybe_eliminate_biv PROTO((struct iv_class *, rtx, rtx, int, int, int));
static int maybe_eliminate_biv_1 PROTO((rtx, rtx, struct iv_class *, int, rtx));
static int last_use_this_basic_block PROTO((rtx, rtx));
static void record_initial PROTO((rtx, rtx));
static void update_reg_last_use PROTO((rtx, rtx));
321 322
static rtx next_insn_in_loop PROTO((rtx, rtx, rtx, rtx));
static void load_mems_and_recount_loop_regs_set PROTO((rtx, rtx, rtx,
323 324
						       rtx, varray_type, 
						       int *));
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
static void load_mems PROTO((rtx, rtx, rtx, rtx));
static int insert_loop_mem PROTO((rtx *, void *));
static int replace_loop_mem PROTO((rtx *, void *));
static int replace_label PROTO((rtx *, void *));

typedef struct rtx_and_int {
  rtx r;
  int i;
} rtx_and_int;

typedef struct rtx_pair {
  rtx r1;
  rtx r2;
} rtx_pair;

/* Nonzero iff INSN is between START and END, inclusive.  */
#define INSN_IN_RANGE_P(INSN, START, END) 	\
  (INSN_UID (INSN) < max_uid_for_loop 		\
   && INSN_LUID (INSN) >= INSN_LUID (START)	\
   && INSN_LUID (INSN) <= INSN_LUID (END))
345

Kaveh R. Ghazi committed
346
#ifdef HAVE_decrement_and_branch_on_count
347
/* Test whether BCT applicable and safe.  */
348
static void insert_bct PROTO((rtx, rtx, struct loop_info *));
349

350
/* Auxiliary function that inserts the BCT pattern into the loop.  */
351
static void instrument_loop_bct PROTO((rtx, rtx, rtx));
Kaveh R. Ghazi committed
352
#endif /* HAVE_decrement_and_branch_on_count */
353

354 355
/* Indirect_jump_in_function is computed once per function.  */
int indirect_jump_in_function = 0;
356
static int indirect_jump_in_function_p PROTO((rtx));
357

Richard Stallman committed
358 359

/* Relative gain of eliminating various kinds of operations.  */
360
static int add_cost;
Richard Stallman committed
361
#if 0
362 363
static int shift_cost;
static int mult_cost;
Richard Stallman committed
364 365 366 367
#endif

/* Benefit penalty, if a giv is not replaceable, i.e. must emit an insn to
   copy the value of the strength reduced giv to its original register.  */
368 369 370 371 372
static int copy_cost;

/* Cost of using a register, to normalize the benefits of a giv.  */
static int reg_address_cost;

Richard Stallman committed
373 374 375 376 377

void
init_loop ()
{
  char *free_point = (char *) oballoc (1);
378
  rtx reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
Richard Stallman committed
379

380
  add_cost = rtx_cost (gen_rtx_PLUS (word_mode, reg, reg), SET);
Richard Stallman committed
381

382 383 384 385 386 387
#ifdef ADDRESS_COST
  reg_address_cost = ADDRESS_COST (reg);
#else
  reg_address_cost = rtx_cost (reg, MEM);
#endif

Richard Stallman committed
388 389 390
  /* We multiply by 2 to reconcile the difference in scale between
     these two ways of computing costs.  Otherwise the cost of a copy
     will be far less than the cost of an add.  */
391

Richard Stallman committed
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
  copy_cost = 2 * 2;

  /* Free the objects we just allocated.  */
  obfree (free_point);

  /* Initialize the obstack used for rtl in product_cheap_p.  */
  gcc_obstack_init (&temp_obstack);
}

/* Entry point of this file.  Perform loop optimization
   on the current function.  F is the first insn of the function
   and DUMPFILE is a stream for output of a trace of actions taken
   (or 0 if none should be output).  */

void
407
loop_optimize (f, dumpfile, unroll_p, bct_p)
Richard Stallman committed
408 409 410
     /* f is the first instruction of a chain of insns for one function */
     rtx f;
     FILE *dumpfile;
411
     int unroll_p, bct_p;
Richard Stallman committed
412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
{
  register rtx insn;
  register int i;
  rtx last_insn;

  loop_dump_stream = dumpfile;

  init_recog_no_volatile ();

  max_reg_before_loop = max_reg_num ();

  moved_once = (char *) alloca (max_reg_before_loop);
  bzero (moved_once, max_reg_before_loop);

  regs_may_share = 0;

Mike Stump committed
428
  /* Count the number of loops.  */
Richard Stallman committed
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443

  max_loop_num = 0;
  for (insn = f; insn; insn = NEXT_INSN (insn))
    {
      if (GET_CODE (insn) == NOTE
	  && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
	max_loop_num++;
    }

  /* Don't waste time if no loops.  */
  if (max_loop_num == 0)
    return;

  /* Get size to use for tables indexed by uids.
     Leave some space for labels allocated by find_and_verify_loops.  */
444
  max_uid_for_loop = get_max_uid () + 1 + max_loop_num * 32;
Richard Stallman committed
445 446 447 448

  uid_luid = (int *) alloca (max_uid_for_loop * sizeof (int));
  uid_loop_num = (int *) alloca (max_uid_for_loop * sizeof (int));

449 450
  bzero ((char *) uid_luid, max_uid_for_loop * sizeof (int));
  bzero ((char *) uid_loop_num, max_uid_for_loop * sizeof (int));
Richard Stallman committed
451 452 453 454 455 456 457 458

  /* Allocate tables for recording each loop.  We set each entry, so they need
     not be zeroed.  */
  loop_number_loop_starts = (rtx *) alloca (max_loop_num * sizeof (rtx));
  loop_number_loop_ends = (rtx *) alloca (max_loop_num * sizeof (rtx));
  loop_outer_loop = (int *) alloca (max_loop_num * sizeof (int));
  loop_invalid = (char *) alloca (max_loop_num * sizeof (char));
  loop_number_exit_labels = (rtx *) alloca (max_loop_num * sizeof (rtx));
459
  loop_number_exit_count = (int *) alloca (max_loop_num * sizeof (int));
Richard Stallman committed
460

461
#ifdef HAVE_decrement_and_branch_on_count
462 463 464
  /* Allocate for BCT optimization */
  loop_used_count_register = (int *) alloca (max_loop_num * sizeof (int));
  bzero ((char *) loop_used_count_register, max_loop_num * sizeof (int));
465
#endif  /* HAVE_decrement_and_branch_on_count */
466

Richard Stallman committed
467 468 469 470 471 472 473 474 475
  /* Find and process each loop.
     First, find them, and record them in order of their beginnings.  */
  find_and_verify_loops (f);

  /* Now find all register lifetimes.  This must be done after
     find_and_verify_loops, because it might reorder the insns in the
     function.  */
  reg_scan (f, max_reg_num (), 1);

476 477 478 479 480 481 482
  /* This must occur after reg_scan so that registers created by gcse
     will have entries in the register tables.

     We could have added a call to reg_scan after gcse_main in toplev.c,
     but moving this call to init_alias_analysis is more efficient.  */
  init_alias_analysis ();

483 484 485
  /* See if we went too far.  */
  if (get_max_uid () > max_uid_for_loop)
    abort ();
486 487
  /* Now reset it to the actual size we need.  See above.  */
  max_uid_for_loop = get_max_uid () + 1;
488

Richard Stallman committed
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
  /* Compute the mapping from uids to luids.
     LUIDs are numbers assigned to insns, like uids,
     except that luids increase monotonically through the code.
     Don't assign luids to line-number NOTEs, so that the distance in luids
     between two insns is not affected by -g.  */

  for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
    {
      last_insn = insn;
      if (GET_CODE (insn) != NOTE
	  || NOTE_LINE_NUMBER (insn) <= 0)
	uid_luid[INSN_UID (insn)] = ++i;
      else
	/* Give a line number note the same luid as preceding insn.  */
	uid_luid[INSN_UID (insn)] = i;
    }

  max_luid = i + 1;

  /* Don't leave gaps in uid_luid for insns that have been
     deleted.  It is possible that the first or last insn
     using some register has been deleted by cross-jumping.
     Make sure that uid_luid for that former insn's uid
     points to the general area where that insn used to be.  */
  for (i = 0; i < max_uid_for_loop; i++)
    {
      uid_luid[0] = uid_luid[i];
      if (uid_luid[0] != 0)
	break;
    }
  for (i = 0; i < max_uid_for_loop; i++)
    if (uid_luid[i] == 0)
      uid_luid[i] = uid_luid[i - 1];

  /* Create a mapping from loops to BLOCK tree nodes.  */
524
  if (unroll_p && write_symbols != NO_DEBUG)
525
    find_loop_tree_blocks ();
Richard Stallman committed
526

527 528
  /* Determine if the function has indirect jump.  On some systems
     this prevents low overhead loop instructions from being used.  */
529 530
  indirect_jump_in_function = indirect_jump_in_function_p (f);

Richard Stallman committed
531 532 533 534 535
  /* Now scan the loops, last ones first, since this means inner ones are done
     before outer ones.  */
  for (i = max_loop_num-1; i >= 0; i--)
    if (! loop_invalid[i] && loop_number_loop_ends[i])
      scan_loop (loop_number_loop_starts[i], loop_number_loop_ends[i],
536
		 unroll_p, bct_p);
537 538 539 540

  /* If debugging and unrolling loops, we must replicate the tree nodes
     corresponding to the blocks inside the loop, so that the original one
     to one mapping will remain.  */
541
  if (unroll_p && write_symbols != NO_DEBUG)
542
    unroll_block_trees ();
543 544

  end_alias_analysis ();
Richard Stallman committed
545 546
}

547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578
/* Returns the next insn, in execution order, after INSN.  START and
   END are the NOTE_INSN_LOOP_BEG and NOTE_INSN_LOOP_END for the loop,
   respectively.  LOOP_TOP, if non-NULL, is the top of the loop in the
   insn-stream; it is used with loops that are entered near the
   bottom.  */

static rtx
next_insn_in_loop (insn, start, end, loop_top)
     rtx insn;
     rtx start;
     rtx end;
     rtx loop_top;
{
  insn = NEXT_INSN (insn);

  if (insn == end)
    {
      if (loop_top)
	/* Go to the top of the loop, and continue there.  */
	insn = loop_top;
      else
	/* We're done.  */
	insn = NULL_RTX;
    }

  if (insn == start)
    /* We're done.  */
    insn = NULL_RTX;

  return insn;
}

Richard Stallman committed
579 580 581 582 583 584 585 586 587 588 589
/* Optimize one loop whose start is LOOP_START and end is END.
   LOOP_START is the NOTE_INSN_LOOP_BEG and END is the matching
   NOTE_INSN_LOOP_END.  */

/* ??? Could also move memory writes out of loops if the destination address
   is invariant, the source is invariant, the memory write is not volatile,
   and if we can prove that no read inside the loop can read this address
   before the write occurs.  If there is a read of this address after the
   write, then we can also mark the memory read as invariant.  */

static void
590
scan_loop (loop_start, end, unroll_p, bct_p)
Richard Stallman committed
591
     rtx loop_start, end;
592
     int unroll_p, bct_p;
Richard Stallman committed
593 594
{
  register int i;
595
  rtx p;
Richard Stallman committed
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626
  /* 1 if we are scanning insns that could be executed zero times.  */
  int maybe_never = 0;
  /* 1 if we are scanning insns that might never be executed
     due to a subroutine call which might exit before they are reached.  */
  int call_passed = 0;
  /* For a rotated loop that is entered near the bottom,
     this is the label at the top.  Otherwise it is zero.  */
  rtx loop_top = 0;
  /* Jump insn that enters the loop, or 0 if control drops in.  */
  rtx loop_entry_jump = 0;
  /* Place in the loop where control enters.  */
  rtx scan_start;
  /* Number of insns in the loop.  */
  int insn_count;
  int in_libcall = 0;
  int tem;
  rtx temp;
  /* The SET from an insn, if it is the only SET in the insn.  */
  rtx set, set1;
  /* Chain describing insns movable in current loop.  */
  struct movable *movables = 0;
  /* Last element in `movables' -- so we can add elements at the end.  */
  struct movable *last_movable = 0;
  /* Ratio of extra register life span we can justify
     for saving an instruction.  More if loop doesn't call subroutines
     since in that case saving an insn makes more difference
     and more registers are available.  */
  int threshold;
  /* If we have calls, contains the insn in which a register was used
     if it was used exactly once; contains const0_rtx if it was used more
     than once.  */
627
  varray_type reg_single_usage = 0;
628 629
  /* Nonzero if we are scanning instructions in a sub-loop.  */
  int loop_depth = 0;
630
  int nregs;
Richard Stallman committed
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 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680

  /* Determine whether this loop starts with a jump down to a test at
     the end.  This will occur for a small number of loops with a test
     that is too complex to duplicate in front of the loop.

     We search for the first insn or label in the loop, skipping NOTEs.
     However, we must be careful not to skip past a NOTE_INSN_LOOP_BEG
     (because we might have a loop executed only once that contains a
     loop which starts with a jump to its exit test) or a NOTE_INSN_LOOP_END
     (in case we have a degenerate loop).

     Note that if we mistakenly think that a loop is entered at the top
     when, in fact, it is entered at the exit test, the only effect will be
     slightly poorer optimization.  Making the opposite error can generate
     incorrect code.  Since very few loops now start with a jump to the 
     exit test, the code here to detect that case is very conservative.  */

  for (p = NEXT_INSN (loop_start);
       p != end
	 && GET_CODE (p) != CODE_LABEL && GET_RTX_CLASS (GET_CODE (p)) != 'i'
	 && (GET_CODE (p) != NOTE
	     || (NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_BEG
		 && NOTE_LINE_NUMBER (p) != NOTE_INSN_LOOP_END));
       p = NEXT_INSN (p))
    ;

  scan_start = p;

  /* Set up variables describing this loop.  */
  prescan_loop (loop_start, end);
  threshold = (loop_has_call ? 1 : 2) * (1 + n_non_fixed_regs);

  /* If loop has a jump before the first label,
     the true entry is the target of that jump.
     Start scan from there.
     But record in LOOP_TOP the place where the end-test jumps
     back to so we can scan that after the end of the loop.  */
  if (GET_CODE (p) == JUMP_INSN)
    {
      loop_entry_jump = p;

      /* Loop entry must be unconditional jump (and not a RETURN)  */
      if (simplejump_p (p)
	  && JUMP_LABEL (p) != 0
	  /* Check to see whether the jump actually
	     jumps out of the loop (meaning it's no loop).
	     This case can happen for things like
	     do {..} while (0).  If this label was generated previously
	     by loop, we can't tell anything about it and have to reject
	     the loop.  */
681
	  && INSN_IN_RANGE_P (JUMP_LABEL (p), loop_start, end))
Richard Stallman committed
682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
	{
	  loop_top = next_label (scan_start);
	  scan_start = JUMP_LABEL (p);
	}
    }

  /* If SCAN_START was an insn created by loop, we don't know its luid
     as required by loop_reg_used_before_p.  So skip such loops.  (This
     test may never be true, but it's best to play it safe.) 

     Also, skip loops where we do not start scanning at a label.  This
     test also rejects loops starting with a JUMP_INSN that failed the
     test above.  */

  if (INSN_UID (scan_start) >= max_uid_for_loop
      || GET_CODE (scan_start) != CODE_LABEL)
    {
      if (loop_dump_stream)
	fprintf (loop_dump_stream, "\nLoop from %d to %d is phony.\n\n",
		 INSN_UID (loop_start), INSN_UID (end));
      return;
    }

  /* Count number of times each reg is set during this loop.
706
     Set VARRAY_CHAR (may_not_optimize, I) if it is not safe to move out
Richard Stallman committed
707
     the setting of register I.  If this loop has calls, set
708
     VARRAY_RTX (reg_single_usage, I).  */
709 710
  
  /* Allocate extra space for REGS that might be created by
711 712 713 714 715
     load_mems.  We allocate a little extra slop as well, in the hopes
     that even after the moving of movables creates some new registers
     we won't have to reallocate these arrays.  However, we do grow
     the arrays, if necessary, in load_mems_recount_loop_regs_set.  */
  nregs = max_reg_num () + loop_mems_idx + 16;
716
  VARRAY_INT_INIT (set_in_loop, nregs, "set_in_loop");
717 718
  VARRAY_INT_INIT (n_times_set, nregs, "n_times_set");
  VARRAY_CHAR_INIT (may_not_optimize, nregs, "may_not_optimize");
Richard Stallman committed
719 720

  if (loop_has_call)
721
    VARRAY_RTX_INIT (reg_single_usage, nregs, "reg_single_usage");
Richard Stallman committed
722 723 724 725 726

  count_loop_regs_set (loop_top ? loop_top : loop_start, end,
		       may_not_optimize, reg_single_usage, &insn_count, nregs);

  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
727 728
    {
      VARRAY_CHAR (may_not_optimize, i) = 1;
729
      VARRAY_INT (set_in_loop, i) = 1;
730
    }
731 732 733 734

#ifdef AVOID_CCMODE_COPIES
  /* Don't try to move insns which set CC registers if we should not
     create CCmode register copies.  */
735
  for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
736
    if (GET_MODE_CLASS (GET_MODE (regno_reg_rtx[i])) == MODE_CC)
737
      VARRAY_CHAR (may_not_optimize, i) = 1;
738 739
#endif

740 741
  bcopy ((char *) &set_in_loop->data, 
	 (char *) &n_times_set->data, nregs * sizeof (int));
Richard Stallman committed
742 743 744 745 746 747 748 749 750 751 752

  if (loop_dump_stream)
    {
      fprintf (loop_dump_stream, "\nLoop from %d to %d: %d real insns.\n",
	       INSN_UID (loop_start), INSN_UID (end), insn_count);
      if (loop_continue)
	fprintf (loop_dump_stream, "Continue at insn %d.\n",
		 INSN_UID (loop_continue));
    }

  /* Scan through the loop finding insns that are safe to move.
753
     Set set_in_loop negative for the reg being set, so that
Richard Stallman committed
754 755 756 757 758 759 760 761 762 763 764
     this reg will be considered invariant for subsequent insns.
     We consider whether subsequent insns use the reg
     in deciding whether it is worth actually moving.

     MAYBE_NEVER is nonzero if we have passed a conditional jump insn
     and therefore it is possible that the insns we are scanning
     would never be executed.  At such times, we must make sure
     that it is safe to execute the insn once instead of zero times.
     When MAYBE_NEVER is 0, all insns will be executed at least once
     so that is not a problem.  */

765 766 767
  for (p = next_insn_in_loop (scan_start, scan_start, end, loop_top); 
       p != NULL_RTX;
       p = next_insn_in_loop (p, scan_start, end, loop_top))
Richard Stallman committed
768 769
    {
      if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
770
	  && find_reg_note (p, REG_LIBCALL, NULL_RTX))
Richard Stallman committed
771 772
	in_libcall = 1;
      else if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
773
	       && find_reg_note (p, REG_RETVAL, NULL_RTX))
Richard Stallman committed
774 775 776 777 778
	in_libcall = 0;

      if (GET_CODE (p) == INSN
	  && (set = single_set (p))
	  && GET_CODE (SET_DEST (set)) == REG
779
	  && ! VARRAY_CHAR (may_not_optimize, REGNO (SET_DEST (set))))
Richard Stallman committed
780 781 782 783 784 785 786 787 788 789 790 791 792 793 794
	{
	  int tem1 = 0;
	  int tem2 = 0;
	  int move_insn = 0;
	  rtx src = SET_SRC (set);
	  rtx dependencies = 0;

	  /* Figure out what to use as a source of this insn.  If a REG_EQUIV
	     note is given or if a REG_EQUAL note with a constant operand is
	     specified, use it as the source and mark that we should move
	     this insn by calling emit_move_insn rather that duplicating the
	     insn.

	     Otherwise, only use the REG_EQUAL contents if a REG_RETVAL note
	     is present.  */
795
	  temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
Richard Stallman committed
796 797 798 799
	  if (temp)
	    src = XEXP (temp, 0), move_insn = 1;
	  else 
	    {
800
	      temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
Richard Stallman committed
801 802
	      if (temp && CONSTANT_P (XEXP (temp, 0)))
		src = XEXP (temp, 0), move_insn = 1;
803
	      if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
Richard Stallman committed
804 805 806 807 808 809 810 811 812 813 814 815 816 817
		{
		  src = XEXP (temp, 0);
		  /* A libcall block can use regs that don't appear in
		     the equivalent expression.  To move the libcall,
		     we must move those regs too.  */
		  dependencies = libcall_other_reg (p, src);
		}
	    }

	  /* Don't try to optimize a register that was made
	     by loop-optimization for an inner loop.
	     We don't know its life-span, so we can't compute the benefit.  */
	  if (REGNO (SET_DEST (set)) >= max_reg_before_loop)
	    ;
818
	  else if (/* The set is not guaranteed to be executed one
819 820
		      the loop starts, or the value before the set is
		      needed before the set occurs... */
Jeff Law committed
821 822 823
		   (maybe_never
		    || loop_reg_used_before_p (set, p, loop_start,
					       scan_start, end))
824 825 826 827 828
		   /* And the register is used in basic blocks other
		      than the one where it is set (meaning that
		      something after this point in the loop might
		      depend on its value before the set).  */
		   && !reg_in_basic_block_p (p, SET_DEST (set)))
829 830 831 832 833
	    /* It is unsafe to move the set.  

	       This code used to consider it OK to move a set of a variable
	       which was not created by the user and not used in an exit test.
	       That behavior is incorrect and was removed.  */
Richard Stallman committed
834 835 836 837
	    ;
	  else if ((tem = invariant_p (src))
		   && (dependencies == 0
		       || (tem2 = invariant_p (dependencies)) != 0)
838
		   && (VARRAY_INT (set_in_loop, 
839
				   REGNO (SET_DEST (set))) == 1
Richard Stallman committed
840
		       || (tem1
841 842
			   = consec_sets_invariant_p 
			   (SET_DEST (set),
843
			    VARRAY_INT (set_in_loop, REGNO (SET_DEST (set))),
844
			    p)))
Richard Stallman committed
845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869
		   /* If the insn can cause a trap (such as divide by zero),
		      can't move it unless it's guaranteed to be executed
		      once loop is entered.  Even a function call might
		      prevent the trap insn from being reached
		      (since it might exit!)  */
		   && ! ((maybe_never || call_passed)
			 && may_trap_p (src)))
	    {
	      register struct movable *m;
	      register int regno = REGNO (SET_DEST (set));

	      /* A potential lossage is where we have a case where two insns
		 can be combined as long as they are both in the loop, but
		 we move one of them outside the loop.  For large loops,
		 this can lose.  The most common case of this is the address
		 of a function being called.  

		 Therefore, if this register is marked as being used exactly
		 once if we are in a loop with calls (a "large loop"), see if
		 we can replace the usage of this register with the source
		 of this SET.  If we can, delete this insn. 

		 Don't do this if P has a REG_RETVAL note or if we have
		 SMALL_REGISTER_CLASSES and SET_SRC is a hard register.  */

870 871
	      if (reg_single_usage && VARRAY_RTX (reg_single_usage, regno) != 0
		  && VARRAY_RTX (reg_single_usage, regno) != const0_rtx
872 873
		  && REGNO_FIRST_UID (regno) == INSN_UID (p)
		  && (REGNO_LAST_UID (regno)
874
		      == INSN_UID (VARRAY_RTX (reg_single_usage, regno)))
875
		  && VARRAY_INT (set_in_loop, regno) == 1
Richard Stallman committed
876
		  && ! side_effects_p (SET_SRC (set))
877
		  && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
878 879 880
		  && (! SMALL_REGISTER_CLASSES
		      || (! (GET_CODE (SET_SRC (set)) == REG
			     && REGNO (SET_SRC (set)) < FIRST_PSEUDO_REGISTER)))
Richard Stallman committed
881 882 883 884
		  /* This test is not redundant; SET_SRC (set) might be
		     a call-clobbered register and the life of REGNO
		     might span a call.  */
		  && ! modified_between_p (SET_SRC (set), p,
885 886 887
					   VARRAY_RTX
					   (reg_single_usage, regno)) 
		  && no_labels_between_p (p, VARRAY_RTX (reg_single_usage, regno))
Richard Stallman committed
888
		  && validate_replace_rtx (SET_DEST (set), SET_SRC (set),
889 890
					   VARRAY_RTX
					   (reg_single_usage, regno))) 
Richard Stallman committed
891
		{
892 893 894
		  /* Replace any usage in a REG_EQUAL note.  Must copy the
		     new source, so that we don't get rtx sharing between the
		     SET_SOURCE and REG_NOTES of insn p.  */
895 896 897
		  REG_NOTES (VARRAY_RTX (reg_single_usage, regno))
		    = replace_rtx (REG_NOTES (VARRAY_RTX
					      (reg_single_usage, regno)), 
898
				   SET_DEST (set), copy_rtx (SET_SRC (set)));
Richard Stallman committed
899 900 901 902
				   
		  PUT_CODE (p, NOTE);
		  NOTE_LINE_NUMBER (p) = NOTE_INSN_DELETED;
		  NOTE_SOURCE_FILE (p) = 0;
903
		  VARRAY_INT (set_in_loop, regno) = 0;
Richard Stallman committed
904 905 906 907 908 909 910 911 912 913
		  continue;
		}

	      m = (struct movable *) alloca (sizeof (struct movable));
	      m->next = 0;
	      m->insn = p;
	      m->set_src = src;
	      m->dependencies = dependencies;
	      m->set_dest = SET_DEST (set);
	      m->force = 0;
914
	      m->consec = VARRAY_INT (set_in_loop, 
915
				      REGNO (SET_DEST (set))) - 1;
Richard Stallman committed
916 917 918 919
	      m->done = 0;
	      m->forces = 0;
	      m->partial = 0;
	      m->move_insn = move_insn;
920
	      m->move_insn_first = 0;
921
	      m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
Richard Stallman committed
922 923 924 925 926
	      m->savemode = VOIDmode;
	      m->regno = regno;
	      /* Set M->cond if either invariant_p or consec_sets_invariant_p
		 returned 2 (only conditionally invariant).  */
	      m->cond = ((tem | tem1 | tem2) > 1);
927 928
	      m->global = (uid_luid[REGNO_LAST_UID (regno)] > INSN_LUID (end)
			   || uid_luid[REGNO_FIRST_UID (regno)] < INSN_LUID (loop_start));
Richard Stallman committed
929
	      m->match = 0;
930 931
	      m->lifetime = (uid_luid[REGNO_LAST_UID (regno)]
			     - uid_luid[REGNO_FIRST_UID (regno)]);
932
	      m->savings = VARRAY_INT (n_times_set, regno);
933
	      if (find_reg_note (p, REG_RETVAL, NULL_RTX))
Richard Stallman committed
934
		m->savings += libcall_benefit (p);
935
	      VARRAY_INT (set_in_loop, regno) = move_insn ? -2 : -1;
Richard Stallman committed
936 937 938 939 940 941 942 943 944
	      /* Add M to the end of the chain MOVABLES.  */
	      if (movables == 0)
		movables = m;
	      else
		last_movable->next = m;
	      last_movable = m;

	      if (m->consec > 0)
		{
945 946 947 948 949 950
		  /* It is possible for the first instruction to have a
		     REG_EQUAL note but a non-invariant SET_SRC, so we must
		     remember the status of the first instruction in case
		     the last instruction doesn't have a REG_EQUAL note.  */
		  m->move_insn_first = m->move_insn;

Richard Stallman committed
951
		  /* Skip this insn, not checking REG_LIBCALL notes.  */
952
		  p = next_nonnote_insn (p);
Richard Stallman committed
953 954 955 956 957 958 959 960
		  /* Skip the consecutive insns, if there are any.  */
		  p = skip_consec_insns (p, m->consec);
		  /* Back up to the last insn of the consecutive group.  */
		  p = prev_nonnote_insn (p);

		  /* We must now reset m->move_insn, m->is_equiv, and possibly
		     m->set_src to correspond to the effects of all the
		     insns.  */
961
		  temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
Richard Stallman committed
962 963 964 965
		  if (temp)
		    m->set_src = XEXP (temp, 0), m->move_insn = 1;
		  else
		    {
966
		      temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
Richard Stallman committed
967 968 969 970 971 972
		      if (temp && CONSTANT_P (XEXP (temp, 0)))
			m->set_src = XEXP (temp, 0), m->move_insn = 1;
		      else
			m->move_insn = 0;

		    }
973
		  m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
Richard Stallman committed
974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993
		}
	    }
	  /* If this register is always set within a STRICT_LOW_PART
	     or set to zero, then its high bytes are constant.
	     So clear them outside the loop and within the loop
	     just load the low bytes.
	     We must check that the machine has an instruction to do so.
	     Also, if the value loaded into the register
	     depends on the same register, this cannot be done.  */
	  else if (SET_SRC (set) == const0_rtx
		   && GET_CODE (NEXT_INSN (p)) == INSN
		   && (set1 = single_set (NEXT_INSN (p)))
		   && GET_CODE (set1) == SET
		   && (GET_CODE (SET_DEST (set1)) == STRICT_LOW_PART)
		   && (GET_CODE (XEXP (SET_DEST (set1), 0)) == SUBREG)
		   && (SUBREG_REG (XEXP (SET_DEST (set1), 0))
		       == SET_DEST (set))
		   && !reg_mentioned_p (SET_DEST (set), SET_SRC (set1)))
	    {
	      register int regno = REGNO (SET_DEST (set));
994
	      if (VARRAY_INT (set_in_loop, regno) == 2)
Richard Stallman committed
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
		{
		  register struct movable *m;
		  m = (struct movable *) alloca (sizeof (struct movable));
		  m->next = 0;
		  m->insn = p;
		  m->set_dest = SET_DEST (set);
		  m->dependencies = 0;
		  m->force = 0;
		  m->consec = 0;
		  m->done = 0;
		  m->forces = 0;
		  m->move_insn = 0;
1007
		  m->move_insn_first = 0;
Richard Stallman committed
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
		  m->partial = 1;
		  /* If the insn may not be executed on some cycles,
		     we can't clear the whole reg; clear just high part.
		     Not even if the reg is used only within this loop.
		     Consider this:
		     while (1)
		       while (s != t) {
		         if (foo ()) x = *s;
			 use (x);
		       }
		     Clearing x before the inner loop could clobber a value
		     being saved from the last time around the outer loop.
		     However, if the reg is not used outside this loop
		     and all uses of the register are in the same
		     basic block as the store, there is no problem.

		     If this insn was made by loop, we don't know its
		     INSN_LUID and hence must make a conservative
Mike Stump committed
1026
		     assumption.  */
Richard Stallman committed
1027
		  m->global = (INSN_UID (p) >= max_uid_for_loop
1028
			       || (uid_luid[REGNO_LAST_UID (regno)]
Richard Stallman committed
1029
				   > INSN_LUID (end))
1030
			       || (uid_luid[REGNO_FIRST_UID (regno)]
Richard Stallman committed
1031 1032
				   < INSN_LUID (p))
			       || (labels_in_range_p
1033
				   (p, uid_luid[REGNO_FIRST_UID (regno)])));
Richard Stallman committed
1034 1035 1036 1037 1038 1039 1040
		  if (maybe_never && m->global)
		    m->savemode = GET_MODE (SET_SRC (set1));
		  else
		    m->savemode = VOIDmode;
		  m->regno = regno;
		  m->cond = 0;
		  m->match = 0;
1041 1042
		  m->lifetime = (uid_luid[REGNO_LAST_UID (regno)]
				 - uid_luid[REGNO_FIRST_UID (regno)]);
Richard Stallman committed
1043
		  m->savings = 1;
1044
		  VARRAY_INT (set_in_loop, regno) = -1;
Richard Stallman committed
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064
		  /* Add M to the end of the chain MOVABLES.  */
		  if (movables == 0)
		    movables = m;
		  else
		    last_movable->next = m;
		  last_movable = m;
		}
	    }
	}
      /* Past a call insn, we get to insns which might not be executed
	 because the call might exit.  This matters for insns that trap.
	 Call insns inside a REG_LIBCALL/REG_RETVAL block always return,
	 so they don't count.  */
      else if (GET_CODE (p) == CALL_INSN && ! in_libcall)
	call_passed = 1;
      /* Past a label or a jump, we get to insns for which we
	 can't count on whether or how many times they will be
	 executed during each iteration.  Therefore, we can
	 only move out sets of trivial variables
	 (those not used after the loop).  */
1065
      /* Similar code appears twice in strength_reduce.  */
Richard Stallman committed
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075
      else if ((GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN)
	       /* If we enter the loop in the middle, and scan around to the
		  beginning, don't set maybe_never for that.  This must be an
		  unconditional jump, otherwise the code at the top of the
		  loop might never be executed.  Unconditional jumps are
		  followed a by barrier then loop end.  */
               && ! (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == loop_top
		     && NEXT_INSN (NEXT_INSN (p)) == end
		     && simplejump_p (p)))
	maybe_never = 1;
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
      else if (GET_CODE (p) == NOTE)
	{
	  /* At the virtual top of a converted loop, insns are again known to
	     be executed: logically, the loop begins here even though the exit
	     code has been duplicated.  */
	  if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
	    maybe_never = call_passed = 0;
	  else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
	    loop_depth++;
	  else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
	    loop_depth--;
	}
Richard Stallman committed
1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108
    }

  /* If one movable subsumes another, ignore that other.  */

  ignore_some_movables (movables);

  /* For each movable insn, see if the reg that it loads
     leads when it dies right into another conditionally movable insn.
     If so, record that the second insn "forces" the first one,
     since the second can be moved only if the first is.  */

  force_movables (movables);

  /* See if there are multiple movable insns that load the same value.
     If there are, make all but the first point at the first one
     through the `match' field, and add the priorities of them
     all together as the priority of the first.  */

  combine_movables (movables, nregs);
	
  /* Now consider each movable insn to decide whether it is worth moving.
1109
     Store 0 in set_in_loop for each reg that is moved.
Richard Stallman committed
1110

1111 1112 1113 1114 1115 1116
     Generally this increases code size, so do not move moveables when
     optimizing for code size.  */

  if (! optimize_size)
    move_movables (movables, threshold,
		   insn_count, loop_start, end, nregs);
Richard Stallman committed
1117 1118

  /* Now candidates that still are negative are those not moved.
1119
     Change set_in_loop to indicate that those are not actually invariant.  */
Richard Stallman committed
1120
  for (i = 0; i < nregs; i++)
1121 1122
    if (VARRAY_INT (set_in_loop, i) < 0)
      VARRAY_INT (set_in_loop, i) = VARRAY_INT (n_times_set, i);
Richard Stallman committed
1123

1124 1125 1126 1127 1128 1129 1130
  /* Now that we've moved some things out of the loop, we able to
     hoist even more memory references.  There's no need to pass
     reg_single_usage this time, since we're done with it.  */
  load_mems_and_recount_loop_regs_set (scan_start, end, loop_top,
				       loop_start, 0,
				       &insn_count);

1131 1132 1133
  /* set_in_loop is still used by invariant_p, so we can't free it now.  */
  VARRAY_FREE (reg_single_usage);

Richard Stallman committed
1134
  if (flag_strength_reduce)
1135 1136 1137
    {
      the_movables = movables;
      strength_reduce (scan_start, end, loop_top,
1138
		       insn_count, loop_start, end, unroll_p, bct_p);
1139
    }
1140

1141
  VARRAY_FREE (set_in_loop);
1142 1143
  VARRAY_FREE (n_times_set);
  VARRAY_FREE (may_not_optimize);
Richard Stallman committed
1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173
}

/* Add elements to *OUTPUT to record all the pseudo-regs
   mentioned in IN_THIS but not mentioned in NOT_IN_THIS.  */

void
record_excess_regs (in_this, not_in_this, output)
     rtx in_this, not_in_this;
     rtx *output;
{
  enum rtx_code code;
  char *fmt;
  int i;

  code = GET_CODE (in_this);

  switch (code)
    {
    case PC:
    case CC0:
    case CONST_INT:
    case CONST_DOUBLE:
    case CONST:
    case SYMBOL_REF:
    case LABEL_REF:
      return;

    case REG:
      if (REGNO (in_this) >= FIRST_PSEUDO_REGISTER
	  && ! reg_mentioned_p (in_this, not_in_this))
1174
	*output = gen_rtx_EXPR_LIST (VOIDmode, in_this, *output);
Richard Stallman committed
1175
      return;
1176 1177 1178
      
    default:
      break;
Richard Stallman committed
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
    }

  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      int j;

      switch (fmt[i])
	{
	case 'E':
	  for (j = 0; j < XVECLEN (in_this, i); j++)
	    record_excess_regs (XVECEXP (in_this, i, j), not_in_this, output);
	  break;

	case 'e':
	  record_excess_regs (XEXP (in_this, i), not_in_this, output);
	  break;
	}
    }
}

/* Check what regs are referred to in the libcall block ending with INSN,
   aside from those mentioned in the equivalent value.
   If there are none, return 0.
   If there are one or more, return an EXPR_LIST containing all of them.  */

static rtx
libcall_other_reg (insn, equiv)
     rtx insn, equiv;
{
1209
  rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
Richard Stallman committed
1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236
  rtx p = XEXP (note, 0);
  rtx output = 0;

  /* First, find all the regs used in the libcall block
     that are not mentioned as inputs to the result.  */

  while (p != insn)
    {
      if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
	  || GET_CODE (p) == CALL_INSN)
	record_excess_regs (PATTERN (p), equiv, &output);
      p = NEXT_INSN (p);
    }

  return output;
}

/* Return 1 if all uses of REG
   are between INSN and the end of the basic block.  */

static int 
reg_in_basic_block_p (insn, reg)
     rtx insn, reg;
{
  int regno = REGNO (reg);
  rtx p;

1237
  if (REGNO_FIRST_UID (regno) != INSN_UID (insn))
Richard Stallman committed
1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
    return 0;

  /* Search this basic block for the already recorded last use of the reg.  */
  for (p = insn; p; p = NEXT_INSN (p))
    {
      switch (GET_CODE (p))
	{
	case NOTE:
	  break;

	case INSN:
	case CALL_INSN:
	  /* Ordinary insn: if this is the last use, we win.  */
1251
	  if (REGNO_LAST_UID (regno) == INSN_UID (p))
Richard Stallman committed
1252 1253 1254 1255 1256
	    return 1;
	  break;

	case JUMP_INSN:
	  /* Jump insn: if this is the last use, we win.  */
1257
	  if (REGNO_LAST_UID (regno) == INSN_UID (p))
Richard Stallman committed
1258 1259 1260 1261 1262 1263 1264 1265
	    return 1;
	  /* Otherwise, it's the end of the basic block, so we lose.  */
	  return 0;

	case CODE_LABEL:
	case BARRIER:
	  /* It's the end of the basic block, so we lose.  */
	  return 0;
1266 1267 1268
	  
	default:
	  break;
Richard Stallman committed
1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286
	}
    }

  /* The "last use" doesn't follow the "first use"??  */
  abort ();
}

/* Compute the benefit of eliminating the insns in the block whose
   last insn is LAST.  This may be a group of insns used to compute a
   value directly or can contain a library call.  */

static int
libcall_benefit (last)
     rtx last;
{
  rtx insn;
  int benefit = 0;

1287
  for (insn = XEXP (find_reg_note (last, REG_RETVAL, NULL_RTX), 0);
Richard Stallman committed
1288 1289 1290 1291
       insn != last; insn = NEXT_INSN (insn))
    {
      if (GET_CODE (insn) == CALL_INSN)
	benefit += 10;		/* Assume at least this many insns in a library
Mike Stump committed
1292
				   routine.  */
Richard Stallman committed
1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316
      else if (GET_CODE (insn) == INSN
	       && GET_CODE (PATTERN (insn)) != USE
	       && GET_CODE (PATTERN (insn)) != CLOBBER)
	benefit++;
    }

  return benefit;
}

/* Skip COUNT insns from INSN, counting library calls as 1 insn.  */

static rtx
skip_consec_insns (insn, count)
     rtx insn;
     int count;
{
  for (; count > 0; count--)
    {
      rtx temp;

      /* If first insn of libcall sequence, skip to end.  */
      /* Do this at start of loop, since INSN is guaranteed to 
	 be an insn here.  */
      if (GET_CODE (insn) != NOTE
1317
	  && (temp = find_reg_note (insn, REG_LIBCALL, NULL_RTX)))
Richard Stallman committed
1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340
	insn = XEXP (temp, 0);

      do insn = NEXT_INSN (insn);
      while (GET_CODE (insn) == NOTE);
    }

  return insn;
}

/* Ignore any movable whose insn falls within a libcall
   which is part of another movable.
   We make use of the fact that the movable for the libcall value
   was made later and so appears later on the chain.  */

static void
ignore_some_movables (movables)
     struct movable *movables;
{
  register struct movable *m, *m1;

  for (m = movables; m; m = m->next)
    {
      /* Is this a movable for the value of a libcall?  */
1341
      rtx note = find_reg_note (m->insn, REG_RETVAL, NULL_RTX);
Richard Stallman committed
1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
      if (note)
	{
	  rtx insn;
	  /* Check for earlier movables inside that range,
	     and mark them invalid.  We cannot use LUIDs here because
	     insns created by loop.c for prior loops don't have LUIDs.
	     Rather than reject all such insns from movables, we just
	     explicitly check each insn in the libcall (since invariant
	     libcalls aren't that common).  */
	  for (insn = XEXP (note, 0); insn != m->insn; insn = NEXT_INSN (insn))
	    for (m1 = movables; m1 != m; m1 = m1->next)
	      if (m1->insn == insn)
		m1->done = 1;
	}
    }
}	  

/* For each movable insn, see if the reg that it loads
   leads when it dies right into another conditionally movable insn.
   If so, record that the second insn "forces" the first one,
   since the second can be moved only if the first is.  */

static void
force_movables (movables)
     struct movable *movables;
{
  register struct movable *m, *m1;
  for (m1 = movables; m1; m1 = m1->next)
    /* Omit this if moving just the (SET (REG) 0) of a zero-extend.  */
    if (!m1->partial && !m1->done)
      {
	int regno = m1->regno;
	for (m = m1->next; m; m = m->next)
	  /* ??? Could this be a bug?  What if CSE caused the
	     register of M1 to be used after this insn?
	     Since CSE does not update regno_last_uid,
	     this insn M->insn might not be where it dies.
	     But very likely this doesn't matter; what matters is
	     that M's reg is computed from M1's reg.  */
1381
	  if (INSN_UID (m->insn) == REGNO_LAST_UID (regno)
Richard Stallman committed
1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394
	      && !m->done)
	    break;
	if (m != 0 && m->set_src == m1->set_dest
	    /* If m->consec, m->set_src isn't valid.  */
	    && m->consec == 0)
	  m = 0;

	/* Increase the priority of the moving the first insn
	   since it permits the second to be moved as well.  */
	if (m != 0)
	  {
	    m->forces = m1;
	    m1->lifetime += m->lifetime;
1395
	    m1->savings += m->savings;
Richard Stallman committed
1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416
	  }
      }
}

/* Find invariant expressions that are equal and can be combined into
   one register.  */

static void
combine_movables (movables, nregs)
     struct movable *movables;
     int nregs;
{
  register struct movable *m;
  char *matched_regs = (char *) alloca (nregs);
  enum machine_mode mode;

  /* Regs that are set more than once are not allowed to match
     or be matched.  I'm no longer sure why not.  */
  /* Perhaps testing m->consec_sets would be more appropriate here?  */

  for (m = movables; m; m = m->next)
1417
    if (m->match == 0 && VARRAY_INT (n_times_set, m->regno) == 1 && !m->partial)
Richard Stallman committed
1418 1419 1420 1421 1422 1423 1424
      {
	register struct movable *m1;
	int regno = m->regno;

	bzero (matched_regs, nregs);
	matched_regs[regno] = 1;

1425 1426 1427
	/* We want later insns to match the first one.  Don't make the first
	   one match any later ones.  So start this loop at m->next.  */
	for (m1 = m->next; m1; m1 = m1->next)
1428
	  if (m != m1 && m1->match == 0 && VARRAY_INT (n_times_set, m1->regno) == 1
Richard Stallman committed
1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479
	      /* A reg used outside the loop mustn't be eliminated.  */
	      && !m1->global
	      /* A reg used for zero-extending mustn't be eliminated.  */
	      && !m1->partial
	      && (matched_regs[m1->regno]
		  ||
		  (
		   /* Can combine regs with different modes loaded from the
		      same constant only if the modes are the same or
		      if both are integer modes with M wider or the same
		      width as M1.  The check for integer is redundant, but
		      safe, since the only case of differing destination
		      modes with equal sources is when both sources are
		      VOIDmode, i.e., CONST_INT.  */
		   (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest)
		    || (GET_MODE_CLASS (GET_MODE (m->set_dest)) == MODE_INT
			&& GET_MODE_CLASS (GET_MODE (m1->set_dest)) == MODE_INT
			&& (GET_MODE_BITSIZE (GET_MODE (m->set_dest))
			    >= GET_MODE_BITSIZE (GET_MODE (m1->set_dest)))))
		   /* See if the source of M1 says it matches M.  */
		   && ((GET_CODE (m1->set_src) == REG
			&& matched_regs[REGNO (m1->set_src)])
		       || rtx_equal_for_loop_p (m->set_src, m1->set_src,
						movables))))
	      && ((m->dependencies == m1->dependencies)
		  || rtx_equal_p (m->dependencies, m1->dependencies)))
	    {
	      m->lifetime += m1->lifetime;
	      m->savings += m1->savings;
	      m1->done = 1;
	      m1->match = m;
	      matched_regs[m1->regno] = 1;
	    }
      }

  /* Now combine the regs used for zero-extension.
     This can be done for those not marked `global'
     provided their lives don't overlap.  */

  for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
       mode = GET_MODE_WIDER_MODE (mode))
    {
      register struct movable *m0 = 0;

      /* Combine all the registers for extension from mode MODE.
	 Don't combine any that are used outside this loop.  */
      for (m = movables; m; m = m->next)
	if (m->partial && ! m->global
	    && mode == GET_MODE (SET_SRC (PATTERN (NEXT_INSN (m->insn)))))
	  {
	    register struct movable *m1;
1480 1481
	    int first = uid_luid[REGNO_FIRST_UID (m->regno)];
	    int last = uid_luid[REGNO_LAST_UID (m->regno)];
Richard Stallman committed
1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498

	    if (m0 == 0)
	      {
		/* First one: don't check for overlap, just record it.  */
		m0 = m;
		  continue;
	      }

	    /* Make sure they extend to the same mode.
	       (Almost always true.)  */
	    if (GET_MODE (m->set_dest) != GET_MODE (m0->set_dest))
		continue;

	    /* We already have one: check for overlap with those
	       already combined together.  */
	    for (m1 = movables; m1 != m; m1 = m1->next)
	      if (m1 == m0 || (m1->partial && m1->match == m0))
1499 1500
		if (! (uid_luid[REGNO_FIRST_UID (m1->regno)] > last
		       || uid_luid[REGNO_LAST_UID (m1->regno)] < first))
Richard Stallman committed
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564
		  goto overlap;

	    /* No overlap: we can combine this with the others.  */
	    m0->lifetime += m->lifetime;
	    m0->savings += m->savings;
	    m->done = 1;
	    m->match = m0;

	  overlap: ;
	  }
    }
}

/* Return 1 if regs X and Y will become the same if moved.  */

static int
regs_match_p (x, y, movables)
     rtx x, y;
     struct movable *movables;
{
  int xn = REGNO (x);
  int yn = REGNO (y);
  struct movable *mx, *my;

  for (mx = movables; mx; mx = mx->next)
    if (mx->regno == xn)
      break;

  for (my = movables; my; my = my->next)
    if (my->regno == yn)
      break;

  return (mx && my
	  && ((mx->match == my->match && mx->match != 0)
	      || mx->match == my
	      || mx == my->match));
}

/* Return 1 if X and Y are identical-looking rtx's.
   This is the Lisp function EQUAL for rtx arguments.

   If two registers are matching movables or a movable register and an
   equivalent constant, consider them equal.  */

static int
rtx_equal_for_loop_p (x, y, movables)
     rtx x, y;
     struct movable *movables;
{
  register int i;
  register int j;
  register struct movable *m;
  register enum rtx_code code;
  register char *fmt;

  if (x == y)
    return 1;
  if (x == 0 || y == 0)
    return 0;

  code = GET_CODE (x);

  /* If we have a register and a constant, they may sometimes be
     equal.  */
1565
  if (GET_CODE (x) == REG && VARRAY_INT (set_in_loop, REGNO (x)) == -2
Richard Stallman committed
1566
      && CONSTANT_P (y))
1567 1568 1569 1570 1571 1572
    {
      for (m = movables; m; m = m->next)
	if (m->move_insn && m->regno == REGNO (x)
	    && rtx_equal_p (m->set_src, y))
	  return 1;
    }
1573
  else if (GET_CODE (y) == REG && VARRAY_INT (set_in_loop, REGNO (y)) == -2
Richard Stallman committed
1574
	   && CONSTANT_P (x))
1575 1576 1577 1578 1579 1580
    {
      for (m = movables; m; m = m->next)
	if (m->move_insn && m->regno == REGNO (y)
	    && rtx_equal_p (m->set_src, x))
	  return 1;
    }
Richard Stallman committed
1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608

  /* Otherwise, rtx's of different codes cannot be equal.  */
  if (code != GET_CODE (y))
    return 0;

  /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
     (REG:SI x) and (REG:HI x) are NOT equivalent.  */

  if (GET_MODE (x) != GET_MODE (y))
    return 0;

  /* These three types of rtx's can be compared nonrecursively.  */
  if (code == REG)
    return (REGNO (x) == REGNO (y) || regs_match_p (x, y, movables));

  if (code == LABEL_REF)
    return XEXP (x, 0) == XEXP (y, 0);
  if (code == SYMBOL_REF)
    return XSTR (x, 0) == XSTR (y, 0);

  /* Compare the elements.  If any pair of corresponding elements
     fail to match, return 0 for the whole things.  */

  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      switch (fmt[i])
	{
1609 1610 1611 1612 1613
	case 'w':
	  if (XWINT (x, i) != XWINT (y, i))
	    return 0;
	  break;

Richard Stallman committed
1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656
	case 'i':
	  if (XINT (x, i) != XINT (y, i))
	    return 0;
	  break;

	case 'E':
	  /* Two vectors must have the same length.  */
	  if (XVECLEN (x, i) != XVECLEN (y, i))
	    return 0;

	  /* And the corresponding elements must match.  */
	  for (j = 0; j < XVECLEN (x, i); j++)
	    if (rtx_equal_for_loop_p (XVECEXP (x, i, j), XVECEXP (y, i, j), movables) == 0)
	      return 0;
	  break;

	case 'e':
	  if (rtx_equal_for_loop_p (XEXP (x, i), XEXP (y, i), movables) == 0)
	    return 0;
	  break;

	case 's':
	  if (strcmp (XSTR (x, i), XSTR (y, i)))
	    return 0;
	  break;

	case 'u':
	  /* These are just backpointers, so they don't matter.  */
	  break;

	case '0':
	  break;

	  /* It is believed that rtx's at this level will never
	     contain anything but integers and other rtx's,
	     except for within LABEL_REFs and SYMBOL_REFs.  */
	default:
	  abort ();
	}
    }
  return 1;
}

1657 1658 1659 1660 1661 1662 1663 1664 1665
/* If X contains any LABEL_REF's, add REG_LABEL notes for them to all
  insns in INSNS which use thet reference.  */

static void
add_label_notes (x, insns)
     rtx x;
     rtx insns;
{
  enum rtx_code code = GET_CODE (x);
1666
  int i, j;
1667 1668 1669
  char *fmt;
  rtx insn;

1670
  if (code == LABEL_REF && !LABEL_REF_NONLOCAL_P (x))
1671
    {
1672 1673 1674 1675 1676 1677 1678 1679 1680
      /* This code used to ignore labels that referred to dispatch tables to
         avoid flow generating (slighly) worse code.

         We no longer ignore such label references (see LABEL_REF handling in
         mark_jump_label for additional information).  */
      for (insn = insns; insn; insn = NEXT_INSN (insn))
	if (reg_mentioned_p (XEXP (x, 0), insn))
	  REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_LABEL, XEXP (x, 0),
						REG_NOTES (insn));
1681 1682 1683 1684
    }

  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1685 1686 1687 1688 1689 1690 1691
    {
      if (fmt[i] == 'e')
	add_label_notes (XEXP (x, i), insns);
      else if (fmt[i] == 'E')
	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
	  add_label_notes (XVECEXP (x, i, j), insns);
    }
1692 1693
}

Richard Stallman committed
1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716
/* Scan MOVABLES, and move the insns that deserve to be moved.
   If two matching movables are combined, replace one reg with the
   other throughout.  */

static void
move_movables (movables, threshold, insn_count, loop_start, end, nregs)
     struct movable *movables;
     int threshold;
     int insn_count;
     rtx loop_start;
     rtx end;
     int nregs;
{
  rtx new_start = 0;
  register struct movable *m;
  register rtx p;
  /* Map of pseudo-register replacements to handle combining
     when we move several insns that load the same value
     into different pseudo-registers.  */
  rtx *reg_map = (rtx *) alloca (nregs * sizeof (rtx));
  char *already_moved = (char *) alloca (nregs);

  bzero (already_moved, nregs);
1717
  bzero ((char *) reg_map, nregs * sizeof (rtx));
Richard Stallman committed
1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778

  num_movables = 0;

  for (m = movables; m; m = m->next)
    {
      /* Describe this movable insn.  */

      if (loop_dump_stream)
	{
	  fprintf (loop_dump_stream, "Insn %d: regno %d (life %d), ",
		   INSN_UID (m->insn), m->regno, m->lifetime);
	  if (m->consec > 0)
	    fprintf (loop_dump_stream, "consec %d, ", m->consec);
	  if (m->cond)
	    fprintf (loop_dump_stream, "cond ");
	  if (m->force)
	    fprintf (loop_dump_stream, "force ");
	  if (m->global)
	    fprintf (loop_dump_stream, "global ");
	  if (m->done)
	    fprintf (loop_dump_stream, "done ");
	  if (m->move_insn)
	    fprintf (loop_dump_stream, "move-insn ");
	  if (m->match)
	    fprintf (loop_dump_stream, "matches %d ",
		     INSN_UID (m->match->insn));
	  if (m->forces)
	    fprintf (loop_dump_stream, "forces %d ",
		     INSN_UID (m->forces->insn));
	}

      /* Count movables.  Value used in heuristics in strength_reduce.  */
      num_movables++;

      /* Ignore the insn if it's already done (it matched something else).
	 Otherwise, see if it is now safe to move.  */

      if (!m->done
	  && (! m->cond
	      || (1 == invariant_p (m->set_src)
		  && (m->dependencies == 0
		      || 1 == invariant_p (m->dependencies))
		  && (m->consec == 0
		      || 1 == consec_sets_invariant_p (m->set_dest,
						       m->consec + 1,
						       m->insn))))
	  && (! m->forces || m->forces->done))
	{
	  register int regno;
	  register rtx p;
	  int savings = m->savings;

	  /* We have an insn that is safe to move.
	     Compute its desirability.  */

	  p = m->insn;
	  regno = m->regno;

	  if (loop_dump_stream)
	    fprintf (loop_dump_stream, "savings %d ", savings);

1779 1780
	  if (moved_once[regno] && loop_dump_stream)
	    fprintf (loop_dump_stream, "halved since already moved ");
Richard Stallman committed
1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795

	  /* An insn MUST be moved if we already moved something else
	     which is safe only if this one is moved too: that is,
	     if already_moved[REGNO] is nonzero.  */

	  /* An insn is desirable to move if the new lifetime of the
	     register is no more than THRESHOLD times the old lifetime.
	     If it's not desirable, it means the loop is so big
	     that moving won't speed things up much,
	     and it is liable to make register usage worse.  */

	  /* It is also desirable to move if it can be moved at no
	     extra cost because something else was already moved.  */

	  if (already_moved[regno]
1796
	      || flag_move_all_movables
1797 1798
	      || (threshold * savings * m->lifetime) >=
		 (moved_once[regno] ? insn_count * 2 : insn_count)
Richard Stallman committed
1799
	      || (m->forces && m->forces->done
1800
		  && VARRAY_INT (n_times_set, m->forces->regno) == 1))
Richard Stallman committed
1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825
	    {
	      int count;
	      register struct movable *m1;
	      rtx first;

	      /* Now move the insns that set the reg.  */

	      if (m->partial && m->match)
		{
		  rtx newpat, i1;
		  rtx r1, r2;
		  /* Find the end of this chain of matching regs.
		     Thus, we load each reg in the chain from that one reg.
		     And that reg is loaded with 0 directly,
		     since it has ->match == 0.  */
		  for (m1 = m; m1->match; m1 = m1->match);
		  newpat = gen_move_insn (SET_DEST (PATTERN (m->insn)),
					  SET_DEST (PATTERN (m1->insn)));
		  i1 = emit_insn_before (newpat, loop_start);

		  /* Mark the moved, invariant reg as being allowed to
		     share a hard reg with the other matching invariant.  */
		  REG_NOTES (i1) = REG_NOTES (m->insn);
		  r1 = SET_DEST (PATTERN (m->insn));
		  r2 = SET_DEST (PATTERN (m1->insn));
1826 1827 1828 1829
		  regs_may_share
		    = gen_rtx_EXPR_LIST (VOIDmode, r1,
					 gen_rtx_EXPR_LIST (VOIDmode, r2,
							    regs_may_share));
Richard Stallman committed
1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849
		  delete_insn (m->insn);

		  if (new_start == 0)
		    new_start = i1;

		  if (loop_dump_stream)
		    fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
		}
	      /* If we are to re-generate the item being moved with a
		 new move insn, first delete what we have and then emit
		 the move insn before the loop.  */
	      else if (m->move_insn)
		{
		  rtx i1, temp;

		  for (count = m->consec; count >= 0; count--)
		    {
		      /* If this is the first insn of a library call sequence,
			 skip to the end.  */
		      if (GET_CODE (p) != NOTE
1850
			  && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
Richard Stallman committed
1851 1852 1853 1854 1855 1856
			p = XEXP (temp, 0);

		      /* If this is the last insn of a libcall sequence, then
			 delete every insn in the sequence except the last.
			 The last insn is handled in the normal manner.  */
		      if (GET_CODE (p) != NOTE
1857
			  && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
Richard Stallman committed
1858 1859 1860 1861 1862 1863
			{
			  temp = XEXP (temp, 0);
			  while (temp != p)
			    temp = delete_insn (temp);
			}

1864
		      temp = p;
Richard Stallman committed
1865
		      p = delete_insn (p);
1866 1867 1868 1869 1870 1871 1872

		      /* simplify_giv_expr expects that it can walk the insns
			 at m->insn forwards and see this old sequence we are
			 tossing here.  delete_insn does preserve the next
			 pointers, but when we skip over a NOTE we must fix
			 it up.  Otherwise that code walks into the non-deleted
			 insn stream.  */
1873
		      while (p && GET_CODE (p) == NOTE)
1874
			p = NEXT_INSN (temp) = NEXT_INSN (p);
Richard Stallman committed
1875 1876 1877 1878
		    }

		  start_sequence ();
		  emit_move_insn (m->set_dest, m->set_src);
1879
		  temp = get_insns ();
Richard Stallman committed
1880 1881
		  end_sequence ();

1882 1883 1884
		  add_label_notes (m->set_src, temp);

		  i1 = emit_insns_before (temp, loop_start);
1885
		  if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
Richard Stallman committed
1886
		    REG_NOTES (i1)
1887 1888
		      = gen_rtx_EXPR_LIST (m->is_equiv ? REG_EQUIV : REG_EQUAL,
					   m->set_src, REG_NOTES (i1));
Richard Stallman committed
1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901

		  if (loop_dump_stream)
		    fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));

		  /* The more regs we move, the less we like moving them.  */
		  threshold -= 3;
		}
	      else
		{
		  for (count = m->consec; count >= 0; count--)
		    {
		      rtx i1, temp;

Mike Stump committed
1902
		      /* If first insn of libcall sequence, skip to end.  */
Richard Stallman committed
1903 1904 1905
		      /* Do this at start of loop, since p is guaranteed to 
			 be an insn here.  */
		      if (GET_CODE (p) != NOTE
1906
			  && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
Richard Stallman committed
1907 1908 1909 1910 1911 1912
			p = XEXP (temp, 0);

		      /* If last insn of libcall sequence, move all
			 insns except the last before the loop.  The last
			 insn is handled in the normal manner.  */
		      if (GET_CODE (p) != NOTE
1913
			  && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
Richard Stallman committed
1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954
			{
			  rtx fn_address = 0;
			  rtx fn_reg = 0;
			  rtx fn_address_insn = 0;

			  first = 0;
			  for (temp = XEXP (temp, 0); temp != p;
			       temp = NEXT_INSN (temp))
			    {
			      rtx body;
			      rtx n;
			      rtx next;

			      if (GET_CODE (temp) == NOTE)
				continue;

			      body = PATTERN (temp);

			      /* Find the next insn after TEMP,
				 not counting USE or NOTE insns.  */
			      for (next = NEXT_INSN (temp); next != p;
				   next = NEXT_INSN (next))
				if (! (GET_CODE (next) == INSN
				       && GET_CODE (PATTERN (next)) == USE)
				    && GET_CODE (next) != NOTE)
				  break;
			      
			      /* If that is the call, this may be the insn
				 that loads the function address.

				 Extract the function address from the insn
				 that loads it into a register.
				 If this insn was cse'd, we get incorrect code.

				 So emit a new move insn that copies the
				 function address into the register that the
				 call insn will use.  flow.c will delete any
				 redundant stores that we have created.  */
			      if (GET_CODE (next) == CALL_INSN
				  && GET_CODE (body) == SET
				  && GET_CODE (SET_DEST (body)) == REG
1955 1956
				  && (n = find_reg_note (temp, REG_EQUAL,
							 NULL_RTX)))
Richard Stallman committed
1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968
				{
				  fn_reg = SET_SRC (body);
				  if (GET_CODE (fn_reg) != REG)
				    fn_reg = SET_DEST (body);
				  fn_address = XEXP (n, 0);
				  fn_address_insn = temp;
				}
			      /* We have the call insn.
				 If it uses the register we suspect it might,
				 load it with the correct address directly.  */
			      if (GET_CODE (temp) == CALL_INSN
				  && fn_address != 0
Richard Stallman committed
1969
				  && reg_referenced_p (fn_reg, body))
Richard Stallman committed
1970 1971 1972 1973 1974
				emit_insn_after (gen_move_insn (fn_reg,
								fn_address),
						 fn_address_insn);

			      if (GET_CODE (temp) == CALL_INSN)
1975 1976 1977 1978 1979
				{
				  i1 = emit_call_insn_before (body, loop_start);
				  /* Because the USAGE information potentially
				     contains objects other than hard registers
				     we need to copy it.  */
1980
				  if (CALL_INSN_FUNCTION_USAGE (temp))
1981 1982
				    CALL_INSN_FUNCTION_USAGE (i1)
				      = copy_rtx (CALL_INSN_FUNCTION_USAGE (temp));
1983
				}
Richard Stallman committed
1984 1985 1986 1987 1988 1989 1990 1991 1992
			      else
				i1 = emit_insn_before (body, loop_start);
			      if (first == 0)
				first = i1;
			      if (temp == fn_address_insn)
				fn_address_insn = i1;
			      REG_NOTES (i1) = REG_NOTES (temp);
			      delete_insn (temp);
			    }
1993 1994
			  if (new_start == 0)
			    new_start = first;
Richard Stallman committed
1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007
			}
		      if (m->savemode != VOIDmode)
			{
			  /* P sets REG to zero; but we should clear only
			     the bits that are not covered by the mode
			     m->savemode.  */
			  rtx reg = m->set_dest;
			  rtx sequence;
			  rtx tem;
		      
			  start_sequence ();
			  tem = expand_binop
			    (GET_MODE (reg), and_optab, reg,
2008 2009
			     GEN_INT ((((HOST_WIDE_INT) 1
					<< GET_MODE_BITSIZE (m->savemode)))
Richard Stallman committed
2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020
				      - 1),
			     reg, 1, OPTAB_LIB_WIDEN);
			  if (tem == 0)
			    abort ();
			  if (tem != reg)
			    emit_move_insn (reg, tem);
			  sequence = gen_sequence ();
			  end_sequence ();
			  i1 = emit_insn_before (sequence, loop_start);
			}
		      else if (GET_CODE (p) == CALL_INSN)
2021 2022 2023 2024 2025
			{
			  i1 = emit_call_insn_before (PATTERN (p), loop_start);
			  /* Because the USAGE information potentially
			     contains objects other than hard registers
			     we need to copy it.  */
2026
			  if (CALL_INSN_FUNCTION_USAGE (p))
2027 2028
			    CALL_INSN_FUNCTION_USAGE (i1)
			      = copy_rtx (CALL_INSN_FUNCTION_USAGE (p));
2029
			}
2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047
		      else if (count == m->consec && m->move_insn_first)
			{
			  /* The SET_SRC might not be invariant, so we must
			     use the REG_EQUAL note.  */
			  start_sequence ();
			  emit_move_insn (m->set_dest, m->set_src);
			  temp = get_insns ();
			  end_sequence ();

			  add_label_notes (m->set_src, temp);

			  i1 = emit_insns_before (temp, loop_start);
			  if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
			    REG_NOTES (i1)
			      = gen_rtx_EXPR_LIST ((m->is_equiv ? REG_EQUIV
						    : REG_EQUAL),
						   m->set_src, REG_NOTES (i1));
			}
Richard Stallman committed
2048 2049 2050
		      else
			i1 = emit_insn_before (PATTERN (p), loop_start);

2051 2052 2053
		      if (REG_NOTES (i1) == 0)
			{
			  REG_NOTES (i1) = REG_NOTES (p);
Richard Stallman committed
2054

2055 2056 2057 2058 2059
			  /* If there is a REG_EQUAL note present whose value
			     is not loop invariant, then delete it, since it
			     may cause problems with later optimization passes.
			     It is possible for cse to create such notes
			     like this as a result of record_jump_cond.  */
2060
		      
2061 2062 2063 2064
			  if ((temp = find_reg_note (i1, REG_EQUAL, NULL_RTX))
			      && ! invariant_p (XEXP (temp, 0)))
			    remove_note (i1, temp);
			}
2065

Richard Stallman committed
2066 2067 2068 2069 2070 2071 2072 2073 2074 2075
		      if (new_start == 0)
			new_start = i1;

		      if (loop_dump_stream)
			fprintf (loop_dump_stream, " moved to %d",
				 INSN_UID (i1));

		      /* If library call, now fix the REG_NOTES that contain
			 insn pointers, namely REG_LIBCALL on FIRST
			 and REG_RETVAL on I1.  */
Kaveh R. Ghazi committed
2076
		      if ((temp = find_reg_note (i1, REG_RETVAL, NULL_RTX)))
Richard Stallman committed
2077 2078
			{
			  XEXP (temp, 0) = first;
2079
			  temp = find_reg_note (first, REG_LIBCALL, NULL_RTX);
Richard Stallman committed
2080 2081 2082
			  XEXP (temp, 0) = i1;
			}

2083
		      temp = p;
Richard Stallman committed
2084
		      delete_insn (p);
2085 2086 2087 2088 2089 2090 2091 2092 2093 2094
		      p = NEXT_INSN (p);

		      /* simplify_giv_expr expects that it can walk the insns
			 at m->insn forwards and see this old sequence we are
			 tossing here.  delete_insn does preserve the next
			 pointers, but when we skip over a NOTE we must fix
			 it up.  Otherwise that code walks into the non-deleted
			 insn stream.  */
		      while (p && GET_CODE (p) == NOTE)
			p = NEXT_INSN (temp) = NEXT_INSN (p);
Richard Stallman committed
2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109
		    }

		  /* The more regs we move, the less we like moving them.  */
		  threshold -= 3;
		}

	      /* Any other movable that loads the same register
		 MUST be moved.  */
	      already_moved[regno] = 1;

	      /* This reg has been moved out of one loop.  */
	      moved_once[regno] = 1;

	      /* The reg set here is now invariant.  */
	      if (! m->partial)
2110
		VARRAY_INT (set_in_loop, regno) = 0;
Richard Stallman committed
2111 2112 2113 2114 2115 2116 2117

	      m->done = 1;

	      /* Change the length-of-life info for the register
		 to say it lives at least the full length of this loop.
		 This will help guide optimizations in outer loops.  */

2118
	      if (uid_luid[REGNO_FIRST_UID (regno)] > INSN_LUID (loop_start))
Richard Stallman committed
2119 2120 2121
		/* This is the old insn before all the moved insns.
		   We can't use the moved insn because it is out of range
		   in uid_luid.  Only the old insns have luids.  */
2122 2123 2124
		REGNO_FIRST_UID (regno) = INSN_UID (loop_start);
	      if (uid_luid[REGNO_LAST_UID (regno)] < INSN_LUID (end))
		REGNO_LAST_UID (regno) = INSN_UID (end);
Richard Stallman committed
2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150

	      /* Combine with this moved insn any other matching movables.  */

	      if (! m->partial)
		for (m1 = movables; m1; m1 = m1->next)
		  if (m1->match == m)
		    {
		      rtx temp;

		      /* Schedule the reg loaded by M1
			 for replacement so that shares the reg of M.
			 If the modes differ (only possible in restricted
			 circumstances, make a SUBREG.  */
		      if (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest))
			reg_map[m1->regno] = m->set_dest;
		      else
			reg_map[m1->regno]
			  = gen_lowpart_common (GET_MODE (m1->set_dest),
						m->set_dest);
		    
		      /* Get rid of the matching insn
			 and prevent further processing of it.  */
		      m1->done = 1;

		      /* if library call, delete all insn except last, which
			 is deleted below */
Kaveh R. Ghazi committed
2151 2152
		      if ((temp = find_reg_note (m1->insn, REG_RETVAL,
						 NULL_RTX)))
Richard Stallman committed
2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166
			{
			  for (temp = XEXP (temp, 0); temp != m1->insn;
			       temp = NEXT_INSN (temp))
			    delete_insn (temp);
			}
		      delete_insn (m1->insn);

		      /* Any other movable that loads the same register
			 MUST be moved.  */
		      already_moved[m1->regno] = 1;

		      /* The reg merged here is now invariant,
			 if the reg it matches is invariant.  */
		      if (! m->partial)
2167
			VARRAY_INT (set_in_loop, m1->regno) = 0;
Richard Stallman committed
2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190
		    }
	    }
	  else if (loop_dump_stream)
	    fprintf (loop_dump_stream, "not desirable");
	}
      else if (loop_dump_stream && !m->match)
	fprintf (loop_dump_stream, "not safe");

      if (loop_dump_stream)
	fprintf (loop_dump_stream, "\n");
    }

  if (new_start == 0)
    new_start = loop_start;

  /* Go through all the instructions in the loop, making
     all the register substitutions scheduled in REG_MAP.  */
  for (p = new_start; p != end; p = NEXT_INSN (p))
    if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
	|| GET_CODE (p) == CALL_INSN)
      {
	replace_regs (PATTERN (p), reg_map, nregs, 0);
	replace_regs (REG_NOTES (p), reg_map, nregs, 0);
2191
	INSN_CODE (p) = -1;
Richard Stallman committed
2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238
      }
}

#if 0
/* Scan X and replace the address of any MEM in it with ADDR.
   REG is the address that MEM should have before the replacement.  */

static void
replace_call_address (x, reg, addr)
     rtx x, reg, addr;
{
  register enum rtx_code code;
  register int i;
  register char *fmt;

  if (x == 0)
    return;
  code = GET_CODE (x);
  switch (code)
    {
    case PC:
    case CC0:
    case CONST_INT:
    case CONST_DOUBLE:
    case CONST:
    case SYMBOL_REF:
    case LABEL_REF:
    case REG:
      return;

    case SET:
      /* Short cut for very common case.  */
      replace_call_address (XEXP (x, 1), reg, addr);
      return;

    case CALL:
      /* Short cut for very common case.  */
      replace_call_address (XEXP (x, 0), reg, addr);
      return;

    case MEM:
      /* If this MEM uses a reg other than the one we expected,
	 something is wrong.  */
      if (XEXP (x, 0) != reg)
	abort ();
      XEXP (x, 0) = addr;
      return;
2239 2240 2241
      
    default:
      break;
Richard Stallman committed
2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289
    }

  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      if (fmt[i] == 'e')
	replace_call_address (XEXP (x, i), reg, addr);
      if (fmt[i] == 'E')
	{
	  register int j;
	  for (j = 0; j < XVECLEN (x, i); j++)
	    replace_call_address (XVECEXP (x, i, j), reg, addr);
	}
    }
}
#endif

/* Return the number of memory refs to addresses that vary
   in the rtx X.  */

static int
count_nonfixed_reads (x)
     rtx x;
{
  register enum rtx_code code;
  register int i;
  register char *fmt;
  int value;

  if (x == 0)
    return 0;

  code = GET_CODE (x);
  switch (code)
    {
    case PC:
    case CC0:
    case CONST_INT:
    case CONST_DOUBLE:
    case CONST:
    case SYMBOL_REF:
    case LABEL_REF:
    case REG:
      return 0;

    case MEM:
      return ((invariant_p (XEXP (x, 0)) != 1)
	      + count_nonfixed_reads (XEXP (x, 0)));
2290 2291 2292
      
    default:
      break;
Richard Stallman committed
2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327
    }

  value = 0;
  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      if (fmt[i] == 'e')
	value += count_nonfixed_reads (XEXP (x, i));
      if (fmt[i] == 'E')
	{
	  register int j;
	  for (j = 0; j < XVECLEN (x, i); j++)
	    value += count_nonfixed_reads (XVECEXP (x, i, j));
	}
    }
  return value;
}


#if 0
/* P is an instruction that sets a register to the result of a ZERO_EXTEND.
   Replace it with an instruction to load just the low bytes
   if the machine supports such an instruction,
   and insert above LOOP_START an instruction to clear the register.  */

static void
constant_high_bytes (p, loop_start)
     rtx p, loop_start;
{
  register rtx new;
  register int insn_code_number;

  /* Try to change (SET (REG ...) (ZERO_EXTEND (..:B ...)))
     to (SET (STRICT_LOW_PART (SUBREG:B (REG...))) ...).  */

2328 2329 2330
  new = gen_rtx_SET (VOIDmode,
		     gen_rtx_STRICT_LOW_PART (VOIDmode,
					      gen_rtx_SUBREG (GET_MODE (XEXP (SET_SRC (PATTERN (p)), 0)),
Richard Stallman committed
2331 2332 2333 2334 2335 2336 2337 2338 2339 2340
				   SET_DEST (PATTERN (p)),
				   0)),
		 XEXP (SET_SRC (PATTERN (p)), 0));
  insn_code_number = recog (new, p);

  if (insn_code_number)
    {
      register int i;

      /* Clear destination register before the loop.  */
2341 2342
      emit_insn_before (gen_rtx_SET (VOIDmode, SET_DEST (PATTERN (p)),
				     const0_rtx),
Richard Stallman committed
2343 2344 2345 2346 2347 2348 2349 2350 2351
			loop_start);

      /* Inside the loop, just load the low part.  */
      PATTERN (p) = new;
    }
}
#endif

/* Scan a loop setting the variables `unknown_address_altered',
2352 2353
   `num_mem_sets', `loop_continue', `loops_enclosed', `loop_has_call',
   `loop_has_volatile', and `loop_has_tablejump'.
Jeff Law committed
2354
   Also, fill in the array `loop_mems' and the list `loop_store_mems'.  */
Richard Stallman committed
2355 2356 2357 2358 2359 2360

static void
prescan_loop (start, end)
     rtx start, end;
{
  register int level = 1;
2361 2362 2363 2364 2365 2366 2367 2368 2369
  rtx insn;
  int loop_has_multiple_exit_targets = 0;
  /* The label after END.  Jumping here is just like falling off the
     end of the loop.  We use next_nonnote_insn instead of next_label
     as a hedge against the (pathological) case where some actual insn
     might end up between the two.  */
  rtx exit_target = next_nonnote_insn (end);
  if (exit_target == NULL_RTX || GET_CODE (exit_target) != CODE_LABEL)
    loop_has_multiple_exit_targets = 1;
Richard Stallman committed
2370 2371 2372

  unknown_address_altered = 0;
  loop_has_call = 0;
2373
  loop_has_volatile = 0;
2374
  loop_has_tablejump = 0;
Jeff Law committed
2375
  loop_store_mems = NULL_RTX;
2376
  loop_mems_idx = 0;
Richard Stallman committed
2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409

  num_mem_sets = 0;
  loops_enclosed = 1;
  loop_continue = 0;

  for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
       insn = NEXT_INSN (insn))
    {
      if (GET_CODE (insn) == NOTE)
	{
	  if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
	    {
	      ++level;
	      /* Count number of loops contained in this one.  */
	      loops_enclosed++;
	    }
	  else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
	    {
	      --level;
	      if (level == 0)
		{
		  end = insn;
		  break;
		}
	    }
	  else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT)
	    {
	      if (level == 1)
		loop_continue = insn;
	    }
	}
      else if (GET_CODE (insn) == CALL_INSN)
	{
2410 2411
	  if (! CONST_CALL_P (insn))
	    unknown_address_altered = 1;
Richard Stallman committed
2412 2413
	  loop_has_call = 1;
	}
2414
      else if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
Richard Stallman committed
2415
	{
2416 2417 2418 2419 2420
	  rtx label1 = NULL_RTX;
	  rtx label2 = NULL_RTX;

	  if (volatile_refs_p (PATTERN (insn)))
	    loop_has_volatile = 1;
2421 2422 2423 2424 2425

	  if (GET_CODE (insn) == JUMP_INSN
	      && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
		  || GET_CODE (PATTERN (insn)) == ADDR_VEC))
	    loop_has_tablejump = 1;
2426 2427 2428
	  
	  note_stores (PATTERN (insn), note_addr_stored);

2429
	  if (! loop_has_multiple_exit_targets
2430 2431 2432
	      && GET_CODE (insn) == JUMP_INSN
	      && GET_CODE (PATTERN (insn)) == SET
	      && SET_DEST (PATTERN (insn)) == pc_rtx)
2433
	    {
2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460
	      if (GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE)
		{
		  label1 = XEXP (SET_SRC (PATTERN (insn)), 1);
		  label2 = XEXP (SET_SRC (PATTERN (insn)), 2);
		}
	      else
		{
		  label1 = SET_SRC (PATTERN (insn));
		}

	      do {
		if (label1 && label1 != pc_rtx)
		  {
		    if (GET_CODE (label1) != LABEL_REF)
		      {
			/* Something tricky.  */
			loop_has_multiple_exit_targets = 1;
			break;
		      }
		    else if (XEXP (label1, 0) != exit_target
			     && LABEL_OUTSIDE_LOOP_P (label1))
		      {
			/* A jump outside the current loop.  */
			loop_has_multiple_exit_targets = 1;
			break;
		      }
		  }
2461

2462 2463 2464
		label1 = label2;
		label2 = NULL_RTX;
	      } while (label1);
2465
	    }
Richard Stallman committed
2466
	}
2467 2468
      else if (GET_CODE (insn) == RETURN)
	loop_has_multiple_exit_targets = 1;
Richard Stallman committed
2469
    }
2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487

  /* Now, rescan the loop, setting up the LOOP_MEMS array.  */
  if (/* We can't tell what MEMs are aliased by what.  */
      !unknown_address_altered 
      /* An exception thrown by a called function might land us
	 anywhere.  */
      && !loop_has_call
      /* We don't want loads for MEMs moved to a location before the
	 one at which their stack memory becomes allocated.  (Note
	 that this is not a problem for malloc, etc., since those
	 require actual function calls.  */
      && !current_function_calls_alloca
      /* There are ways to leave the loop other than falling off the
	 end.  */
      && !loop_has_multiple_exit_targets)
    for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
	 insn = NEXT_INSN (insn))
      for_each_rtx (&insn, insert_loop_mem, 0);
Richard Stallman committed
2488 2489 2490 2491 2492 2493 2494 2495 2496 2497
}

/* Scan the function looking for loops.  Record the start and end of each loop.
   Also mark as invalid loops any loops that contain a setjmp or are branched
   to from outside the loop.  */

static void
find_and_verify_loops (f)
     rtx f;
{
2498
  rtx insn, label;
Richard Stallman committed
2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521
  int current_loop = -1;
  int next_loop = -1;
  int loop;

  /* If there are jumps to undefined labels,
     treat them as jumps out of any/all loops.
     This also avoids writing past end of tables when there are no loops.  */
  uid_loop_num[0] = -1;

  /* Find boundaries of loops, mark which loops are contained within
     loops, and invalidate loops that have setjmp.  */

  for (insn = f; insn; insn = NEXT_INSN (insn))
    {
      if (GET_CODE (insn) == NOTE)
	switch (NOTE_LINE_NUMBER (insn))
	  {
	  case NOTE_INSN_LOOP_BEG:
	    loop_number_loop_starts[++next_loop] =  insn;
	    loop_number_loop_ends[next_loop] = 0;
	    loop_outer_loop[next_loop] = current_loop;
	    loop_invalid[next_loop] = 0;
	    loop_number_exit_labels[next_loop] = 0;
2522
	    loop_number_exit_count[next_loop] = 0;
Richard Stallman committed
2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546
	    current_loop = next_loop;
	    break;

	  case NOTE_INSN_SETJMP:
	    /* In this case, we must invalidate our current loop and any
	       enclosing loop.  */
	    for (loop = current_loop; loop != -1; loop = loop_outer_loop[loop])
	      {
		loop_invalid[loop] = 1;
		if (loop_dump_stream)
		  fprintf (loop_dump_stream,
			   "\nLoop at %d ignored due to setjmp.\n",
			   INSN_UID (loop_number_loop_starts[loop]));
	      }
	    break;

	  case NOTE_INSN_LOOP_END:
	    if (current_loop == -1)
	      abort ();

	    loop_number_loop_ends[current_loop] = insn;
	    current_loop = loop_outer_loop[current_loop];
	    break;

2547 2548
	  default:
	    break;
Richard Stallman committed
2549 2550 2551 2552 2553 2554 2555
	  }

      /* Note that this will mark the NOTE_INSN_LOOP_END note as being in the
	 enclosing loop, but this doesn't matter.  */
      uid_loop_num[INSN_UID (insn)] = current_loop;
    }

2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568
  /* Any loop containing a label used in an initializer must be invalidated,
     because it can be jumped into from anywhere.  */

  for (label = forced_labels; label; label = XEXP (label, 1))
    {
      int loop_num;

      for (loop_num = uid_loop_num[INSN_UID (XEXP (label, 0))];
	   loop_num != -1;
	   loop_num = loop_outer_loop[loop_num])
	loop_invalid[loop_num] = 1;
    }

Mike Stump committed
2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581
  /* Any loop containing a label used for an exception handler must be
     invalidated, because it can be jumped into from anywhere.  */

  for (label = exception_handler_labels; label; label = XEXP (label, 1))
    {
      int loop_num;

      for (loop_num = uid_loop_num[INSN_UID (XEXP (label, 0))];
	   loop_num != -1;
	   loop_num = loop_outer_loop[loop_num])
	loop_invalid[loop_num] = 1;
    }

2582 2583 2584 2585 2586
  /* Now scan all insn's in the function.  If any JUMP_INSN branches into a
     loop that it is not contained within, that loop is marked invalid.
     If any INSN or CALL_INSN uses a label's address, then the loop containing
     that label is marked invalid, because it could be jumped into from
     anywhere.
Richard Stallman committed
2587 2588 2589 2590 2591 2592 2593 2594 2595

     Also look for blocks of code ending in an unconditional branch that
     exits the loop.  If such a block is surrounded by a conditional 
     branch around the block, move the block elsewhere (see below) and
     invert the jump to point to the code block.  This may eliminate a
     label in our loop and will simplify processing by both us and a
     possible second cse pass.  */

  for (insn = f; insn; insn = NEXT_INSN (insn))
2596
    if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
Richard Stallman committed
2597 2598 2599
      {
	int this_loop_num = uid_loop_num[INSN_UID (insn)];

2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616
	if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
	  {
	    rtx note = find_reg_note (insn, REG_LABEL, NULL_RTX);
	    if (note)
	      {
		int loop_num;

		for (loop_num = uid_loop_num[INSN_UID (XEXP (note, 0))];
		     loop_num != -1;
		     loop_num = loop_outer_loop[loop_num])
		  loop_invalid[loop_num] = 1;
	      }
	  }

	if (GET_CODE (insn) != JUMP_INSN)
	  continue;

Richard Stallman committed
2617 2618 2619 2620 2621 2622 2623
	mark_loop_jump (PATTERN (insn), this_loop_num);

	/* See if this is an unconditional branch outside the loop.  */
	if (this_loop_num != -1
	    && (GET_CODE (PATTERN (insn)) == RETURN
		|| (simplejump_p (insn)
		    && (uid_loop_num[INSN_UID (JUMP_LABEL (insn))]
2624 2625
			!= this_loop_num)))
	    && get_max_uid () < max_uid_for_loop)
Richard Stallman committed
2626 2627 2628
	  {
	    rtx p;
	    rtx our_next = next_real_insn (insn);
2629 2630
	    int dest_loop;
	    int outer_loop = -1;
Richard Stallman committed
2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641

	    /* Go backwards until we reach the start of the loop, a label,
	       or a JUMP_INSN.  */
	    for (p = PREV_INSN (insn);
		 GET_CODE (p) != CODE_LABEL
		 && ! (GET_CODE (p) == NOTE
		       && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
		 && GET_CODE (p) != JUMP_INSN;
		 p = PREV_INSN (p))
	      ;

2642 2643 2644
	    /* Check for the case where we have a jump to an inner nested
	       loop, and do not perform the optimization in that case.  */

2645
	    if (JUMP_LABEL (insn))
2646
	      {
2647 2648 2649 2650 2651 2652 2653 2654
		dest_loop = uid_loop_num[INSN_UID (JUMP_LABEL (insn))];
		if (dest_loop != -1)
		  {
		    for (outer_loop = dest_loop; outer_loop != -1;
			 outer_loop = loop_outer_loop[outer_loop])
		      if (outer_loop == this_loop_num)
			break;
		  }
2655 2656
	      }

2657 2658
	    /* Make sure that the target of P is within the current loop.  */

2659
	    if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
2660 2661 2662
		&& uid_loop_num[INSN_UID (JUMP_LABEL (p))] != this_loop_num)
	      outer_loop = this_loop_num;

Richard Stallman committed
2663 2664 2665 2666 2667 2668 2669 2670 2671
	    /* If we stopped on a JUMP_INSN to the next insn after INSN,
	       we have a block of code to try to move.

	       We look backward and then forward from the target of INSN
	       to find a BARRIER at the same loop depth as the target.
	       If we find such a BARRIER, we make a new label for the start
	       of the block, invert the jump in P and point it to that label,
	       and move the block of code to the spot we found.  */

2672 2673
	    if (outer_loop == -1
		&& GET_CODE (p) == JUMP_INSN
2674 2675 2676 2677 2678 2679 2680
		&& JUMP_LABEL (p) != 0
		/* Just ignore jumps to labels that were never emitted.
		   These always indicate compilation errors.  */
		&& INSN_UID (JUMP_LABEL (p)) != 0
		&& condjump_p (p)
		&& ! simplejump_p (p)
		&& next_real_insn (JUMP_LABEL (p)) == our_next)
Richard Stallman committed
2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706
	      {
		rtx target
		  = JUMP_LABEL (insn) ? JUMP_LABEL (insn) : get_last_insn ();
		int target_loop_num = uid_loop_num[INSN_UID (target)];
		rtx loc;

		for (loc = target; loc; loc = PREV_INSN (loc))
		  if (GET_CODE (loc) == BARRIER
		      && uid_loop_num[INSN_UID (loc)] == target_loop_num)
		    break;

		if (loc == 0)
		  for (loc = target; loc; loc = NEXT_INSN (loc))
		    if (GET_CODE (loc) == BARRIER
			&& uid_loop_num[INSN_UID (loc)] == target_loop_num)
		      break;

		if (loc)
		  {
		    rtx cond_label = JUMP_LABEL (p);
		    rtx new_label = get_label_after (p);

		    /* Ensure our label doesn't go away.  */
		    LABEL_NUSES (cond_label)++;

		    /* Verify that uid_loop_num is large enough and that
Mike Stump committed
2707
		       we can invert P.  */
2708
		   if (invert_jump (p, new_label))
Richard Stallman committed
2709 2710 2711
		     {
		       rtx q, r;

2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732
		       /* If no suitable BARRIER was found, create a suitable
			  one before TARGET.  Since TARGET is a fall through
			  path, we'll need to insert an jump around our block
			  and a add a BARRIER before TARGET.

			  This creates an extra unconditional jump outside
			  the loop.  However, the benefits of removing rarely
			  executed instructions from inside the loop usually
			  outweighs the cost of the extra unconditional jump
			  outside the loop.  */
		       if (loc == 0)
			 {
			   rtx temp;

		           temp = gen_jump (JUMP_LABEL (insn));
			   temp = emit_jump_insn_before (temp, target);
			   JUMP_LABEL (temp) = JUMP_LABEL (insn);
			   LABEL_NUSES (JUMP_LABEL (insn))++;
			   loc = emit_barrier_before (target);
			 }

Richard Stallman committed
2733 2734
		       /* Include the BARRIER after INSN and copy the
			  block after LOC.  */
Jim Wilson committed
2735
		       new_label = squeeze_notes (new_label, NEXT_INSN (insn));
Richard Stallman committed
2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749
		       reorder_insns (new_label, NEXT_INSN (insn), loc);

		       /* All those insns are now in TARGET_LOOP_NUM.  */
		       for (q = new_label; q != NEXT_INSN (NEXT_INSN (insn));
			    q = NEXT_INSN (q))
			 uid_loop_num[INSN_UID (q)] = target_loop_num;

		       /* The label jumped to by INSN is no longer a loop exit.
			  Unless INSN does not have a label (e.g., it is a
			  RETURN insn), search loop_number_exit_labels to find
			  its label_ref, and remove it.  Also turn off
			  LABEL_OUTSIDE_LOOP_P bit.  */
		       if (JUMP_LABEL (insn))
			 {
2750 2751
			   int loop_num;

Richard Stallman committed
2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765
			   for (q = 0,
				r = loop_number_exit_labels[this_loop_num];
				r; q = r, r = LABEL_NEXTREF (r))
			     if (XEXP (r, 0) == JUMP_LABEL (insn))
			       {
				 LABEL_OUTSIDE_LOOP_P (r) = 0;
				 if (q)
				   LABEL_NEXTREF (q) = LABEL_NEXTREF (r);
				 else
				   loop_number_exit_labels[this_loop_num]
				     = LABEL_NEXTREF (r);
				 break;
			       }

2766 2767 2768 2769 2770
			   for (loop_num = this_loop_num;
				loop_num != -1 && loop_num != target_loop_num;
				loop_num = loop_outer_loop[loop_num])
			     loop_number_exit_count[loop_num]--;

Mike Stump committed
2771
			   /* If we didn't find it, then something is wrong.  */
Richard Stallman committed
2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797
			   if (! r)
			     abort ();
			 }

		       /* P is now a jump outside the loop, so it must be put
			  in loop_number_exit_labels, and marked as such.
			  The easiest way to do this is to just call
			  mark_loop_jump again for P.  */
		       mark_loop_jump (PATTERN (p), this_loop_num);

		       /* If INSN now jumps to the insn after it,
			  delete INSN.  */
		       if (JUMP_LABEL (insn) != 0
			   && (next_real_insn (JUMP_LABEL (insn))
			       == next_real_insn (insn)))
			 delete_insn (insn);
		     }

		    /* Continue the loop after where the conditional
		       branch used to jump, since the only branch insn
		       in the block (if it still remains) is an inter-loop
		       branch and hence needs no processing.  */
		    insn = NEXT_INSN (cond_label);

		    if (--LABEL_NUSES (cond_label) == 0)
		      delete_insn (cond_label);
2798 2799 2800

		    /* This loop will be continued with NEXT_INSN (insn).  */
		    insn = PREV_INSN (insn);
Richard Stallman committed
2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857
		  }
	      }
	  }
      }
}

/* If any label in X jumps to a loop different from LOOP_NUM and any of the
   loops it is contained in, mark the target loop invalid.

   For speed, we assume that X is part of a pattern of a JUMP_INSN.  */

static void
mark_loop_jump (x, loop_num)
     rtx x;
     int loop_num;
{
  int dest_loop;
  int outer_loop;
  int i;

  switch (GET_CODE (x))
    {
    case PC:
    case USE:
    case CLOBBER:
    case REG:
    case MEM:
    case CONST_INT:
    case CONST_DOUBLE:
    case RETURN:
      return;

    case CONST:
      /* There could be a label reference in here.  */
      mark_loop_jump (XEXP (x, 0), loop_num);
      return;

    case PLUS:
    case MINUS:
    case MULT:
      mark_loop_jump (XEXP (x, 0), loop_num);
      mark_loop_jump (XEXP (x, 1), loop_num);
      return;

    case SIGN_EXTEND:
    case ZERO_EXTEND:
      mark_loop_jump (XEXP (x, 0), loop_num);
      return;

    case LABEL_REF:
      dest_loop = uid_loop_num[INSN_UID (XEXP (x, 0))];

      /* Link together all labels that branch outside the loop.  This
	 is used by final_[bg]iv_value and the loop unrolling code.  Also
	 mark this LABEL_REF so we know that this branch should predict
	 false.  */

2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870
      /* A check to make sure the label is not in an inner nested loop,
	 since this does not count as a loop exit.  */
      if (dest_loop != -1)
	{
	  for (outer_loop = dest_loop; outer_loop != -1;
	       outer_loop = loop_outer_loop[outer_loop])
	    if (outer_loop == loop_num)
	      break;
	}
      else
	outer_loop = -1;

      if (loop_num != -1 && outer_loop == -1)
Richard Stallman committed
2871 2872 2873 2874
	{
	  LABEL_OUTSIDE_LOOP_P (x) = 1;
	  LABEL_NEXTREF (x) = loop_number_exit_labels[loop_num];
	  loop_number_exit_labels[loop_num] = x;
2875 2876 2877 2878 2879

	  for (outer_loop = loop_num;
	       outer_loop != -1 && outer_loop != dest_loop;
	       outer_loop = loop_outer_loop[outer_loop])
	    loop_number_exit_count[outer_loop]++;
Richard Stallman committed
2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931
	}

      /* If this is inside a loop, but not in the current loop or one enclosed
	 by it, it invalidates at least one loop.  */

      if (dest_loop == -1)
	return;

      /* We must invalidate every nested loop containing the target of this
	 label, except those that also contain the jump insn.  */

      for (; dest_loop != -1; dest_loop = loop_outer_loop[dest_loop])
	{
	  /* Stop when we reach a loop that also contains the jump insn.  */
	  for (outer_loop = loop_num; outer_loop != -1;
	       outer_loop = loop_outer_loop[outer_loop])
	    if (dest_loop == outer_loop)
	      return;

	  /* If we get here, we know we need to invalidate a loop.  */
	  if (loop_dump_stream && ! loop_invalid[dest_loop])
	    fprintf (loop_dump_stream,
		     "\nLoop at %d ignored due to multiple entry points.\n",
		     INSN_UID (loop_number_loop_starts[dest_loop]));
	  
	  loop_invalid[dest_loop] = 1;
	}
      return;

    case SET:
      /* If this is not setting pc, ignore.  */
      if (SET_DEST (x) == pc_rtx)
	mark_loop_jump (SET_SRC (x), loop_num);
      return;

    case IF_THEN_ELSE:
      mark_loop_jump (XEXP (x, 1), loop_num);
      mark_loop_jump (XEXP (x, 2), loop_num);
      return;

    case PARALLEL:
    case ADDR_VEC:
      for (i = 0; i < XVECLEN (x, 0); i++)
	mark_loop_jump (XVECEXP (x, 0, i), loop_num);
      return;

    case ADDR_DIFF_VEC:
      for (i = 0; i < XVECLEN (x, 1); i++)
	mark_loop_jump (XVECEXP (x, 1, i), loop_num);
      return;

    default:
2932 2933 2934 2935
      /* Treat anything else (such as a symbol_ref)
	 as a branch out of this loop, but not into any loop.  */

      if (loop_num != -1)
2936
	{
2937
#ifdef HAVE_decrement_and_branch_on_count
2938 2939
	  LABEL_OUTSIDE_LOOP_P (x) = 1;
	  LABEL_NEXTREF (x) = loop_number_exit_labels[loop_num];
2940
#endif  /* HAVE_decrement_and_branch_on_count */
2941

2942
	  loop_number_exit_labels[loop_num] = x;
2943

2944 2945 2946 2947
	  for (outer_loop = loop_num; outer_loop != -1;
	       outer_loop = loop_outer_loop[outer_loop])
	    loop_number_exit_count[outer_loop]++;
	}
2948
      return;
Richard Stallman committed
2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974
    }
}

/* Return nonzero if there is a label in the range from
   insn INSN to and including the insn whose luid is END
   INSN must have an assigned luid (i.e., it must not have
   been previously created by loop.c).  */

static int
labels_in_range_p (insn, end)
     rtx insn;
     int end;
{
  while (insn && INSN_LUID (insn) <= end)
    {
      if (GET_CODE (insn) == CODE_LABEL)
	return 1;
      insn = NEXT_INSN (insn);
    }

  return 0;
}

/* Record that a memory reference X is being set.  */

static void
2975
note_addr_stored (x, y)
Richard Stallman committed
2976
     rtx x;
2977
     rtx y ATTRIBUTE_UNUSED;
Richard Stallman committed
2978 2979 2980 2981 2982 2983 2984 2985
{
  if (x == 0 || GET_CODE (x) != MEM)
    return;

  /* Count number of memory writes.
     This affects heuristics in strength_reduce.  */
  num_mem_sets++;

2986 2987 2988 2989
  /* BLKmode MEM means all memory is clobbered.  */
  if (GET_MODE (x) == BLKmode)
    unknown_address_altered = 1;

Richard Stallman committed
2990 2991 2992
  if (unknown_address_altered)
    return;

Jeff Law committed
2993
  loop_store_mems = gen_rtx_EXPR_LIST (VOIDmode, x, loop_store_mems);
Richard Stallman committed
2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011
}

/* Return nonzero if the rtx X is invariant over the current loop.

   The value is 2 if we refer to something only conditionally invariant.

   If `unknown_address_altered' is nonzero, no memory ref is invariant.
   Otherwise, a memory ref is invariant if it does not conflict with
   anything stored in `loop_store_mems'.  */

int
invariant_p (x)
     register rtx x;
{
  register int i;
  register enum rtx_code code;
  register char *fmt;
  int conditional = 0;
Jeff Law committed
3012
  rtx mem_list_entry;
Richard Stallman committed
3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034

  if (x == 0)
    return 1;
  code = GET_CODE (x);
  switch (code)
    {
    case CONST_INT:
    case CONST_DOUBLE:
    case SYMBOL_REF:
    case CONST:
      return 1;

    case LABEL_REF:
      /* A LABEL_REF is normally invariant, however, if we are unrolling
	 loops, and this label is inside the loop, then it isn't invariant.
	 This is because each unrolled copy of the loop body will have
	 a copy of this label.  If this was invariant, then an insn loading
	 the address of this label into a register might get moved outside
	 the loop, and then each loop body would end up using the same label.

	 We don't know the loop bounds here though, so just fail for all
	 labels.  */
3035
      if (flag_unroll_loops)
Richard Stallman committed
3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047
	return 0;
      else
	return 1;

    case PC:
    case CC0:
    case UNSPEC_VOLATILE:
      return 0;

    case REG:
      /* We used to check RTX_UNCHANGING_P (x) here, but that is invalid
	 since the reg might be set by initialization within the loop.  */
3048 3049 3050 3051

      if ((x == frame_pointer_rtx || x == hard_frame_pointer_rtx
	   || x == arg_pointer_rtx)
	  && ! current_function_has_nonlocal_goto)
Richard Stallman committed
3052
	return 1;
3053

Richard Stallman committed
3054 3055 3056
      if (loop_has_call
	  && REGNO (x) < FIRST_PSEUDO_REGISTER && call_used_regs[REGNO (x)])
	return 0;
3057

3058
      if (VARRAY_INT (set_in_loop, REGNO (x)) < 0)
Richard Stallman committed
3059
	return 2;
3060

3061
      return VARRAY_INT (set_in_loop, REGNO (x)) == 0;
Richard Stallman committed
3062 3063

    case MEM:
3064 3065 3066 3067 3068 3069
      /* Volatile memory references must be rejected.  Do this before
	 checking for read-only items, so that volatile read-only items
	 will be rejected also.  */
      if (MEM_VOLATILE_P (x))
	return 0;

Richard Stallman committed
3070 3071 3072 3073 3074
      /* Read-only items (such as constants in a constant pool) are
	 invariant if their address is.  */
      if (RTX_UNCHANGING_P (x))
	break;

Jeff Law committed
3075 3076
      /* If we had a subroutine call, any location in memory could have been
	 clobbered.  */
3077
      if (unknown_address_altered)
Richard Stallman committed
3078 3079 3080
	return 0;

      /* See if there is any dependence between a store and this load.  */
Jeff Law committed
3081 3082 3083 3084 3085 3086 3087 3088
      mem_list_entry = loop_store_mems;
      while (mem_list_entry)
	{
	  if (true_dependence (XEXP (mem_list_entry, 0), VOIDmode,
			       x, rtx_varies_p))
	    return 0;
	  mem_list_entry = XEXP (mem_list_entry, 1);
	}
Richard Stallman committed
3089 3090 3091 3092 3093 3094 3095 3096 3097

      /* It's not invalidated by a store in memory
	 but we must still verify the address is invariant.  */
      break;

    case ASM_OPERANDS:
      /* Don't mess with insns declared volatile.  */
      if (MEM_VOLATILE_P (x))
	return 0;
3098 3099 3100 3101
      break;
      
    default:
      break;
Richard Stallman committed
3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153
    }

  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      if (fmt[i] == 'e')
	{
	  int tem = invariant_p (XEXP (x, i));
	  if (tem == 0)
	    return 0;
	  if (tem == 2)
	    conditional = 1;
	}
      else if (fmt[i] == 'E')
	{
	  register int j;
	  for (j = 0; j < XVECLEN (x, i); j++)
	    {
	      int tem = invariant_p (XVECEXP (x, i, j));
	      if (tem == 0)
		return 0;
	      if (tem == 2)
		conditional = 1;
	    }

	}
    }

  return 1 + conditional;
}


/* Return nonzero if all the insns in the loop that set REG
   are INSN and the immediately following insns,
   and if each of those insns sets REG in an invariant way
   (not counting uses of REG in them).

   The value is 2 if some of these insns are only conditionally invariant.

   We assume that INSN itself is the first set of REG
   and that its source is invariant.  */

static int
consec_sets_invariant_p (reg, n_sets, insn)
     int n_sets;
     rtx reg, insn;
{
  register rtx p = insn;
  register int regno = REGNO (reg);
  rtx temp;
  /* Number of sets we have to insist on finding after INSN.  */
  int count = n_sets - 1;
3154
  int old = VARRAY_INT (set_in_loop, regno);
Richard Stallman committed
3155 3156 3157 3158 3159 3160 3161
  int value = 0;
  int this;

  /* If N_SETS hit the limit, we can't rely on its value.  */
  if (n_sets == 127)
    return 0;

3162
  VARRAY_INT (set_in_loop, regno) = 0;
Richard Stallman committed
3163 3164 3165 3166 3167 3168 3169 3170 3171

  while (count > 0)
    {
      register enum rtx_code code;
      rtx set;

      p = NEXT_INSN (p);
      code = GET_CODE (p);

Jeff Law committed
3172
      /* If library call, skip to end of it.  */
3173
      if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
Richard Stallman committed
3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184
	p = XEXP (temp, 0);

      this = 0;
      if (code == INSN
	  && (set = single_set (p))
	  && GET_CODE (SET_DEST (set)) == REG
	  && REGNO (SET_DEST (set)) == regno)
	{
	  this = invariant_p (SET_SRC (set));
	  if (this != 0)
	    value |= this;
Kaveh R. Ghazi committed
3185
	  else if ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX)))
Richard Stallman committed
3186
	    {
3187 3188 3189 3190 3191 3192
	      /* If this is a libcall, then any invariant REG_EQUAL note is OK.
		 If this is an ordinary insn, then only CONSTANT_P REG_EQUAL
		 notes are OK.  */
	      this = (CONSTANT_P (XEXP (temp, 0))
		      || (find_reg_note (p, REG_RETVAL, NULL_RTX)
			  && invariant_p (XEXP (temp, 0))));
Richard Stallman committed
3193 3194 3195 3196 3197 3198 3199 3200
	      if (this != 0)
		value |= this;
	    }
	}
      if (this != 0)
	count--;
      else if (code != NOTE)
	{
3201
	  VARRAY_INT (set_in_loop, regno) = old;
Richard Stallman committed
3202 3203 3204 3205
	  return 0;
	}
    }

3206
  VARRAY_INT (set_in_loop, regno) = old;
Richard Stallman committed
3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251
  /* If invariant_p ever returned 2, we return 2.  */
  return 1 + (value & 2);
}

#if 0
/* I don't think this condition is sufficient to allow INSN
   to be moved, so we no longer test it.  */

/* Return 1 if all insns in the basic block of INSN and following INSN
   that set REG are invariant according to TABLE.  */

static int
all_sets_invariant_p (reg, insn, table)
     rtx reg, insn;
     short *table;
{
  register rtx p = insn;
  register int regno = REGNO (reg);

  while (1)
    {
      register enum rtx_code code;
      p = NEXT_INSN (p);
      code = GET_CODE (p);
      if (code == CODE_LABEL || code == JUMP_INSN)
	return 1;
      if (code == INSN && GET_CODE (PATTERN (p)) == SET
	  && GET_CODE (SET_DEST (PATTERN (p))) == REG
	  && REGNO (SET_DEST (PATTERN (p))) == regno)
	{
	  if (!invariant_p (SET_SRC (PATTERN (p)), table))
	    return 0;
	}
    }
}
#endif /* 0 */

/* Look at all uses (not sets) of registers in X.  For each, if it is
   the single use, set USAGE[REGNO] to INSN; if there was a previous use in
   a different insn, set USAGE[REGNO] to const0_rtx.  */

static void
find_single_use_in_loop (insn, x, usage)
     rtx insn;
     rtx x;
3252
     varray_type usage;
Richard Stallman committed
3253 3254 3255 3256 3257 3258
{
  enum rtx_code code = GET_CODE (x);
  char *fmt = GET_RTX_FORMAT (code);
  int i, j;

  if (code == REG)
3259 3260 3261
    VARRAY_RTX (usage, REGNO (x))
      = (VARRAY_RTX (usage, REGNO (x)) != 0 
	 && VARRAY_RTX (usage, REGNO (x)) != insn)
Richard Stallman committed
3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284
	? const0_rtx : insn;

  else if (code == SET)
    {
      /* Don't count SET_DEST if it is a REG; otherwise count things
	 in SET_DEST because if a register is partially modified, it won't
	 show up as a potential movable so we don't care how USAGE is set 
	 for it.  */
      if (GET_CODE (SET_DEST (x)) != REG)
	find_single_use_in_loop (insn, SET_DEST (x), usage);
      find_single_use_in_loop (insn, SET_SRC (x), usage);
    }
  else
    for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
      {
	if (fmt[i] == 'e' && XEXP (x, i) != 0)
	  find_single_use_in_loop (insn, XEXP (x, i), usage);
	else if (fmt[i] == 'E')
	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
	    find_single_use_in_loop (insn, XVECEXP (x, i, j), usage);
      }
}

3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313
/* Count and record any set in X which is contained in INSN.  Update
   MAY_NOT_MOVE and LAST_SET for any register set in X.  */

static void
count_one_set (insn, x, may_not_move, last_set)
     rtx insn, x;
     varray_type may_not_move;
     rtx *last_set;
{
  if (GET_CODE (x) == CLOBBER && GET_CODE (XEXP (x, 0)) == REG)
    /* Don't move a reg that has an explicit clobber.
       It's not worth the pain to try to do it correctly.  */
    VARRAY_CHAR (may_not_move, REGNO (XEXP (x, 0))) = 1;

  if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
    {
      rtx dest = SET_DEST (x);
      while (GET_CODE (dest) == SUBREG
	     || GET_CODE (dest) == ZERO_EXTRACT
	     || GET_CODE (dest) == SIGN_EXTRACT
	     || GET_CODE (dest) == STRICT_LOW_PART)
	dest = XEXP (dest, 0);
      if (GET_CODE (dest) == REG)
	{
	  register int regno = REGNO (dest);
	  /* If this is the first setting of this reg
	     in current basic block, and it was set before,
	     it must be set in two basic blocks, so it cannot
	     be moved out of the loop.  */
3314
	  if (VARRAY_INT (set_in_loop, regno) > 0 
3315 3316 3317 3318 3319 3320 3321 3322
	      && last_set[regno] == 0)
	    VARRAY_CHAR (may_not_move, regno) = 1;
	  /* If this is not first setting in current basic block,
	     see if reg was used in between previous one and this.
	     If so, neither one can be moved.  */
	  if (last_set[regno] != 0
	      && reg_used_between_p (dest, last_set[regno], insn))
	    VARRAY_CHAR (may_not_move, regno) = 1;
3323 3324
	  if (VARRAY_INT (set_in_loop, regno) < 127)
	    ++VARRAY_INT (set_in_loop, regno);
3325 3326 3327 3328 3329
	  last_set[regno] = insn;
	}
    }
}

3330
/* Increment SET_IN_LOOP at the index of each register
Richard Stallman committed
3331
   that is modified by an insn between FROM and TO.
3332
   If the value of an element of SET_IN_LOOP becomes 127 or more,
Richard Stallman committed
3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348
   stop incrementing it, to avoid overflow.

   Store in SINGLE_USAGE[I] the single insn in which register I is
   used, if it is only used once.  Otherwise, it is set to 0 (for no
   uses) or const0_rtx for more than one use.  This parameter may be zero,
   in which case this processing is not done.

   Store in *COUNT_PTR the number of actual instruction
   in the loop.  We use this to decide what is worth moving out.  */

/* last_set[n] is nonzero iff reg n has been set in the current basic block.
   In that case, it is the insn that last set reg n.  */

static void
count_loop_regs_set (from, to, may_not_move, single_usage, count_ptr, nregs)
     register rtx from, to;
3349 3350
     varray_type may_not_move;
     varray_type single_usage;
Richard Stallman committed
3351 3352 3353 3354 3355 3356 3357
     int *count_ptr;
     int nregs;
{
  register rtx *last_set = (rtx *) alloca (nregs * sizeof (rtx));
  register rtx insn;
  register int count = 0;

3358
  bzero ((char *) last_set, nregs * sizeof (rtx));
Richard Stallman committed
3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376
  for (insn = from; insn != to; insn = NEXT_INSN (insn))
    {
      if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
	{
	  ++count;

	  /* If requested, record registers that have exactly one use.  */
	  if (single_usage)
	    {
	      find_single_use_in_loop (insn, PATTERN (insn), single_usage);

	      /* Include uses in REG_EQUAL notes.  */
	      if (REG_NOTES (insn))
		find_single_use_in_loop (insn, REG_NOTES (insn), single_usage);
	    }

	  if (GET_CODE (PATTERN (insn)) == SET
	      || GET_CODE (PATTERN (insn)) == CLOBBER)
3377
	    count_one_set (insn, PATTERN (insn), may_not_move, last_set);
Richard Stallman committed
3378 3379 3380 3381
	  else if (GET_CODE (PATTERN (insn)) == PARALLEL)
	    {
	      register int i;
	      for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
3382 3383
		count_one_set (insn, XVECEXP (PATTERN (insn), 0, i),
			       may_not_move, last_set);
Richard Stallman committed
3384 3385
	    }
	}
3386

Richard Stallman committed
3387
      if (GET_CODE (insn) == CODE_LABEL || GET_CODE (insn) == JUMP_INSN)
3388
	bzero ((char *) last_set, nregs * sizeof (rtx));
Richard Stallman committed
3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430
    }
  *count_ptr = count;
}

/* Given a loop that is bounded by LOOP_START and LOOP_END
   and that is entered at SCAN_START,
   return 1 if the register set in SET contained in insn INSN is used by
   any insn that precedes INSN in cyclic order starting
   from the loop entry point.

   We don't want to use INSN_LUID here because if we restrict INSN to those
   that have a valid INSN_LUID, it means we cannot move an invariant out
   from an inner loop past two loops.  */

static int
loop_reg_used_before_p (set, insn, loop_start, scan_start, loop_end)
     rtx set, insn, loop_start, scan_start, loop_end;
{
  rtx reg = SET_DEST (set);
  rtx p;

  /* Scan forward checking for register usage.  If we hit INSN, we
     are done.  Otherwise, if we hit LOOP_END, wrap around to LOOP_START.  */
  for (p = scan_start; p != insn; p = NEXT_INSN (p))
    {
      if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
	  && reg_overlap_mentioned_p (reg, PATTERN (p)))
	return 1;

      if (p == loop_end)
	p = loop_start;
    }

  return 0;
}

/* A "basic induction variable" or biv is a pseudo reg that is set
   (within this loop) only by incrementing or decrementing it.  */
/* A "general induction variable" or giv is a pseudo reg whose
   value is a linear function of a biv.  */

/* Bivs are recognized by `basic_induction_var';
3431
   Givs by `general_induction_var'.  */
Richard Stallman committed
3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467

/* Indexed by register number, indicates whether or not register is an
   induction variable, and if so what type.  */

enum iv_mode *reg_iv_type;

/* Indexed by register number, contains pointer to `struct induction'
   if register is an induction variable.  This holds general info for
   all induction variables.  */

struct induction **reg_iv_info;

/* Indexed by register number, contains pointer to `struct iv_class'
   if register is a basic induction variable.  This holds info describing
   the class (a related group) of induction variables that the biv belongs
   to.  */

struct iv_class **reg_biv_class;

/* The head of a list which links together (via the next field)
   every iv class for the current loop.  */

struct iv_class *loop_iv_list;

/* Communication with routines called via `note_stores'.  */

static rtx note_insn;

/* Dummy register to have non-zero DEST_REG for DEST_ADDR type givs.  */

static rtx addr_placeholder;

/* ??? Unfinished optimizations, and possible future optimizations,
   for the strength reduction code.  */

/* ??? The interaction of biv elimination, and recognition of 'constant'
Mike Stump committed
3468
   bivs, may cause problems.  */
Richard Stallman committed
3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490

/* ??? Add heuristics so that DEST_ADDR strength reduction does not cause
   performance problems.

   Perhaps don't eliminate things that can be combined with an addressing
   mode.  Find all givs that have the same biv, mult_val, and add_val;
   then for each giv, check to see if its only use dies in a following
   memory address.  If so, generate a new memory address and check to see
   if it is valid.   If it is valid, then store the modified memory address,
   otherwise, mark the giv as not done so that it will get its own iv.  */

/* ??? Could try to optimize branches when it is known that a biv is always
   positive.  */

/* ??? When replace a biv in a compare insn, we should replace with closest
   giv so that an optimized branch can still be recognized by the combiner,
   e.g. the VAX acb insn.  */

/* ??? Many of the checks involving uid_luid could be simplified if regscan
   was rerun in loop_optimize whenever a register was added or moved.
   Also, some of the optimizations could be a little less conservative.  */

3491
/* Perform strength reduction and induction variable elimination.  
Richard Stallman committed
3492

3493
   Pseudo registers created during this function will be beyond the last
Richard Stallman committed
3494 3495 3496
   valid index in several tables including n_times_set and regno_last_uid.
   This does not cause a problem here, because the added registers cannot be
   givs outside of their loop, and hence will never be reconsidered.
3497 3498 3499 3500 3501 3502
   But scan_loop must check regnos to make sure they are in bounds. 
   
   SCAN_START is the first instruction in the loop, as the loop would
   actually be executed.  END is the NOTE_INSN_LOOP_END.  LOOP_TOP is
   the first instruction in the loop, as it is layed out in the
   instruction stream.  LOOP_START is the NOTE_INSN_LOOP_BEG.  */
Richard Stallman committed
3503 3504 3505

static void
strength_reduce (scan_start, end, loop_top, insn_count,
3506
		 loop_start, loop_end, unroll_p, bct_p)
Richard Stallman committed
3507 3508 3509 3510 3511 3512
     rtx scan_start;
     rtx end;
     rtx loop_top;
     int insn_count;
     rtx loop_start;
     rtx loop_end;
3513
     int unroll_p, bct_p ATTRIBUTE_UNUSED;
Richard Stallman committed
3514 3515 3516 3517 3518 3519 3520 3521 3522
{
  rtx p;
  rtx set;
  rtx inc_val;
  rtx mult_val;
  rtx dest_reg;
  /* This is 1 if current insn is not executed at least once for every loop
     iteration.  */
  int not_every_iteration = 0;
3523 3524 3525
  /* This is 1 if current insn may be executed more than once for every
     loop iteration.  */
  int maybe_multiple = 0;
Richard Stallman committed
3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538
  /* Temporary list pointers for traversing loop_iv_list.  */
  struct iv_class *bl, **backbl;
  /* Ratio of extra register life span we can justify
     for saving an instruction.  More if loop doesn't call subroutines
     since in that case saving an insn makes more difference
     and more registers are available.  */
  /* ??? could set this to last value of threshold in move_movables */
  int threshold = (loop_has_call ? 1 : 2) * (3 + n_non_fixed_regs);
  /* Map of pseudo-register replacements.  */
  rtx *reg_map;
  int call_seen;
  rtx test;
  rtx end_insert_before;
3539
  int loop_depth = 0;
3540 3541
  struct loop_info loop_iteration_info;
  struct loop_info *loop_info = &loop_iteration_info;
Richard Stallman committed
3542

3543 3544 3545 3546 3547
  /* If scan_start points to the loop exit test, we have to be wary of
     subversive use of gotos inside expression statements.  */
  if (prev_nonnote_insn (scan_start) != prev_nonnote_insn (loop_start))
    maybe_multiple = back_branch_in_range_p (scan_start, loop_start, loop_end);

Richard Stallman committed
3548
  reg_iv_type = (enum iv_mode *) alloca (max_reg_before_loop
3549 3550
					 * sizeof (enum iv_mode));
  bzero ((char *) reg_iv_type, max_reg_before_loop * sizeof (enum iv_mode));
Richard Stallman committed
3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564
  reg_iv_info = (struct induction **)
    alloca (max_reg_before_loop * sizeof (struct induction *));
  bzero ((char *) reg_iv_info, (max_reg_before_loop
				* sizeof (struct induction *)));
  reg_biv_class = (struct iv_class **)
    alloca (max_reg_before_loop * sizeof (struct iv_class *));
  bzero ((char *) reg_biv_class, (max_reg_before_loop
				  * sizeof (struct iv_class *)));

  loop_iv_list = 0;
  addr_placeholder = gen_reg_rtx (Pmode);

  /* Save insn immediately after the loop_end.  Insns inserted after loop_end
     must be put before this insn, so that they will appear in the right
3565
     order (i.e. loop order). 
Richard Stallman committed
3566

3567 3568 3569 3570 3571 3572 3573
     If loop_end is the end of the current function, then emit a 
     NOTE_INSN_DELETED after loop_end and set end_insert_before to the
     dummy note insn.  */
  if (NEXT_INSN (loop_end) != 0)
    end_insert_before = NEXT_INSN (loop_end);
  else
    end_insert_before = emit_note_after (NOTE_INSN_DELETED, loop_end);
Richard Stallman committed
3574 3575 3576

  /* Scan through loop to find all possible bivs.  */

3577 3578 3579
  for (p = next_insn_in_loop (scan_start, scan_start, end, loop_top);
       p != NULL_RTX;
       p = next_insn_in_loop (p, scan_start, end, loop_top))
Richard Stallman committed
3580 3581 3582 3583 3584 3585 3586 3587 3588 3589
    {
      if (GET_CODE (p) == INSN
	  && (set = single_set (p))
	  && GET_CODE (SET_DEST (set)) == REG)
	{
	  dest_reg = SET_DEST (set);
	  if (REGNO (dest_reg) < max_reg_before_loop
	      && REGNO (dest_reg) >= FIRST_PSEUDO_REGISTER
	      && reg_iv_type[REGNO (dest_reg)] != NOT_BASIC_INDUCT)
	    {
3590 3591
	      if (basic_induction_var (SET_SRC (set), GET_MODE (SET_SRC (set)),
				       dest_reg, p, &inc_val, &mult_val))
Richard Stallman committed
3592 3593 3594 3595 3596 3597 3598 3599
		{
		  /* It is a possible basic induction variable.
		     Create and initialize an induction structure for it.  */

		  struct induction *v
		    = (struct induction *) alloca (sizeof (struct induction));

		  record_biv (v, p, dest_reg, inc_val, mult_val,
3600
			      not_every_iteration, maybe_multiple);
Richard Stallman committed
3601 3602 3603 3604 3605 3606 3607
		  reg_iv_type[REGNO (dest_reg)] = BASIC_INDUCT;
		}
	      else if (REGNO (dest_reg) < max_reg_before_loop)
		reg_iv_type[REGNO (dest_reg)] = NOT_BASIC_INDUCT;
	    }
	}

3608 3609
      /* Past CODE_LABEL, we get to insns that may be executed multiple
	 times.  The only way we can be sure that they can't is if every
Jeff Law committed
3610
	 jump insn between here and the end of the loop either
3611 3612
	 returns, exits the loop, is a jump to a location that is still
	 behind the label, or is a jump to the loop start.  */
3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627

      if (GET_CODE (p) == CODE_LABEL)
	{
	  rtx insn = p;

	  maybe_multiple = 0;

	  while (1)
	    {
	      insn = NEXT_INSN (insn);
	      if (insn == scan_start)
		break;
	      if (insn == end)
		{
		  if (loop_top != 0)
3628
		    insn = loop_top;
3629 3630 3631 3632 3633 3634 3635 3636 3637 3638
		  else
		    break;
		  if (insn == scan_start)
		    break;
		}

	      if (GET_CODE (insn) == JUMP_INSN
		  && GET_CODE (PATTERN (insn)) != RETURN
		  && (! condjump_p (insn)
		      || (JUMP_LABEL (insn) != 0
3639
			  && JUMP_LABEL (insn) != scan_start
Tom Wood committed
3640
			  && (INSN_UID (JUMP_LABEL (insn)) >= max_uid_for_loop
3641 3642 3643 3644 3645 3646
			      || (INSN_UID (p) < max_uid_for_loop
				  ? (INSN_LUID (JUMP_LABEL (insn))
				     <= INSN_LUID (p))
				  : (INSN_UID (insn) >= max_uid_for_loop
				     || (INSN_LUID (JUMP_LABEL (insn))
					 < INSN_LUID (insn))))))))
3647 3648 3649 3650
		{
		  maybe_multiple = 1;
		  break;
		}
3651 3652 3653
	    }
	}

3654 3655 3656 3657 3658
      /* Past a jump, we get to insns for which we can't count
	 on whether they will be executed during each iteration.  */
      /* This code appears twice in strength_reduce.  There is also similar
	 code in scan_loop.  */
      if (GET_CODE (p) == JUMP_INSN
Richard Stallman committed
3659 3660 3661 3662
	  /* If we enter the loop in the middle, and scan around to the
	     beginning, don't set not_every_iteration for that.
	     This can be any kind of jump, since we want to know if insns
	     will be executed if the loop is executed.  */
3663
	  && ! (JUMP_LABEL (p) == loop_top
Richard Stallman committed
3664 3665
		&& ((NEXT_INSN (NEXT_INSN (p)) == loop_end && simplejump_p (p))
		    || (NEXT_INSN (p) == loop_end && condjump_p (p)))))
3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681
	{
	  rtx label = 0;

	  /* If this is a jump outside the loop, then it also doesn't
	     matter.  Check to see if the target of this branch is on the
	     loop_number_exits_labels list.  */
	     
	  for (label = loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]];
	       label;
	       label = LABEL_NEXTREF (label))
	    if (XEXP (label, 0) == JUMP_LABEL (p))
	      break;

	  if (! label)
	    not_every_iteration = 1;
	}
Richard Stallman committed
3682

3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694
      else if (GET_CODE (p) == NOTE)
	{
	  /* At the virtual top of a converted loop, insns are again known to
	     be executed each iteration: logically, the loop begins here
	     even though the exit code has been duplicated.  */
	  if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
	    not_every_iteration = 0;
	  else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
	    loop_depth++;
	  else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
	    loop_depth--;
	}
Richard Stallman committed
3695 3696 3697 3698 3699 3700 3701 3702

      /* Unlike in the code motion pass where MAYBE_NEVER indicates that
	 an insn may never be executed, NOT_EVERY_ITERATION indicates whether
	 or not an insn is known to be executed each iteration of the
	 loop, whether or not any iterations are known to occur.

	 Therefore, if we have just passed a label and have no more labels
	 between here and the test insn of the loop, we know these insns
3703
	 will be executed each iteration.  */
Richard Stallman committed
3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716

      if (not_every_iteration && GET_CODE (p) == CODE_LABEL
	  && no_labels_between_p (p, loop_end))
	not_every_iteration = 0;
    }

  /* Scan loop_iv_list to remove all regs that proved not to be bivs.
     Make a sanity check against n_times_set.  */
  for (backbl = &loop_iv_list, bl = *backbl; bl; bl = bl->next)
    {
      if (reg_iv_type[bl->regno] != BASIC_INDUCT
	  /* Above happens if register modified by subreg, etc.  */
	  /* Make sure it is not recognized as a basic induction var: */
3717
	  || VARRAY_INT (n_times_set, bl->regno) != bl->biv_count
Richard Stallman committed
3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746
	  /* If never incremented, it is invariant that we decided not to
	     move.  So leave it alone.  */
	  || ! bl->incremented)
	{
	  if (loop_dump_stream)
	    fprintf (loop_dump_stream, "Reg %d: biv discarded, %s\n",
		     bl->regno,
		     (reg_iv_type[bl->regno] != BASIC_INDUCT
		      ? "not induction variable"
		      : (! bl->incremented ? "never incremented"
			 : "count error")));
	  
	  reg_iv_type[bl->regno] = NOT_BASIC_INDUCT;
	  *backbl = bl->next;
	}
      else
	{
	  backbl = &bl->next;

	  if (loop_dump_stream)
	    fprintf (loop_dump_stream, "Reg %d: biv verified\n", bl->regno);
	}
    }

  /* Exit if there are no bivs.  */
  if (! loop_iv_list)
    {
      /* Can still unroll the loop anyways, but indicate that there is no
	 strength reduction info available.  */
3747
      if (unroll_p)
3748 3749
	unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
		     loop_info, 0);
Richard Stallman committed
3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785

      return;
    }

  /* Find initial value for each biv by searching backwards from loop_start,
     halting at first label.  Also record any test condition.  */

  call_seen = 0;
  for (p = loop_start; p && GET_CODE (p) != CODE_LABEL; p = PREV_INSN (p))
    {
      note_insn = p;

      if (GET_CODE (p) == CALL_INSN)
	call_seen = 1;

      if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
	  || GET_CODE (p) == CALL_INSN)
	note_stores (PATTERN (p), record_initial);

      /* Record any test of a biv that branches around the loop if no store
	 between it and the start of loop.  We only care about tests with
	 constants and registers and only certain of those.  */
      if (GET_CODE (p) == JUMP_INSN
	  && JUMP_LABEL (p) != 0
	  && next_real_insn (JUMP_LABEL (p)) == next_real_insn (loop_end)
	  && (test = get_condition_for_loop (p)) != 0
	  && GET_CODE (XEXP (test, 0)) == REG
	  && REGNO (XEXP (test, 0)) < max_reg_before_loop
	  && (bl = reg_biv_class[REGNO (XEXP (test, 0))]) != 0
	  && valid_initial_value_p (XEXP (test, 1), p, call_seen, loop_start)
	  && bl->init_insn == 0)
	{
	  /* If an NE test, we have an initial value!  */
	  if (GET_CODE (test) == NE)
	    {
	      bl->init_insn = p;
3786 3787
	      bl->init_set = gen_rtx_SET (VOIDmode,
					  XEXP (test, 0), XEXP (test, 1));
Richard Stallman committed
3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799
	    }
	  else
	    bl->initial_test = test;
	}
    }

  /* Look at the each biv and see if we can say anything better about its
     initial value from any initializing insns set up above.  (This is done
     in two passes to avoid missing SETs in a PARALLEL.)  */
  for (bl = loop_iv_list; bl; bl = bl->next)
    {
      rtx src;
Jeff Law committed
3800
      rtx note;
Richard Stallman committed
3801 3802 3803 3804

      if (! bl->init_insn)
	continue;

Jeff Law committed
3805 3806 3807 3808 3809 3810 3811 3812 3813
      /* IF INIT_INSN has a REG_EQUAL or REG_EQUIV note and the value
	 is a constant, use the value of that.  */
      if (((note = find_reg_note (bl->init_insn, REG_EQUAL, 0)) != NULL
	   && CONSTANT_P (XEXP (note, 0)))
	  || ((note = find_reg_note (bl->init_insn, REG_EQUIV, 0)) != NULL
	      && CONSTANT_P (XEXP (note, 0))))
	src = XEXP (note, 0);
      else
	src = SET_SRC (bl->init_set);
Richard Stallman committed
3814 3815 3816 3817 3818 3819

      if (loop_dump_stream)
	fprintf (loop_dump_stream,
		 "Biv %d initialized at insn %d: initial value ",
		 bl->regno, INSN_UID (bl->init_insn));

3820 3821
      if ((GET_MODE (src) == GET_MODE (regno_reg_rtx[bl->regno])
	   || GET_MODE (src) == VOIDmode)
3822
	  && valid_initial_value_p (src, bl->init_insn, call_seen, loop_start))
Richard Stallman committed
3823 3824 3825 3826 3827 3828
	{
	  bl->initial_value = src;

	  if (loop_dump_stream)
	    {
	      if (GET_CODE (src) == CONST_INT)
3829 3830 3831 3832
		{
		  fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (src));
		  fputc ('\n', loop_dump_stream);
		}
Richard Stallman committed
3833 3834 3835 3836 3837 3838 3839 3840 3841 3842
	      else
		{
		  print_rtl (loop_dump_stream, src);
		  fprintf (loop_dump_stream, "\n");
		}
	    }
	}
      else
	{
	  /* Biv initial value is not simple move,
3843
	     so let it keep initial value of "itself".  */
Richard Stallman committed
3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855

	  if (loop_dump_stream)
	    fprintf (loop_dump_stream, "is complex\n");
	}
    }

  /* Search the loop for general induction variables.  */

  /* A register is a giv if: it is only set once, it is a function of a
     biv and a constant (or invariant), and it is not a biv.  */

  not_every_iteration = 0;
3856
  loop_depth = 0;
Richard Stallman committed
3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867
  p = scan_start;
  while (1)
    {
      p = NEXT_INSN (p);
      /* At end of a straight-in loop, we are done.
	 At end of a loop entered at the bottom, scan the top.  */
      if (p == scan_start)
	break;
      if (p == end)
	{
	  if (loop_top != 0)
3868
	    p = loop_top;
Richard Stallman committed
3869 3870 3871 3872 3873 3874 3875 3876 3877 3878
	  else
	    break;
	  if (p == scan_start)
	    break;
	}

      /* Look for a general induction variable in a register.  */
      if (GET_CODE (p) == INSN
	  && (set = single_set (p))
	  && GET_CODE (SET_DEST (set)) == REG
3879
	  && ! VARRAY_CHAR (may_not_optimize, REGNO (SET_DEST (set))))
Richard Stallman committed
3880 3881 3882 3883 3884 3885
	{
	  rtx src_reg;
	  rtx add_val;
	  rtx mult_val;
	  int benefit;
	  rtx regnote = 0;
3886
	  rtx last_consec_insn;
Richard Stallman committed
3887 3888 3889 3890 3891 3892

	  dest_reg = SET_DEST (set);
	  if (REGNO (dest_reg) < FIRST_PSEUDO_REGISTER)
	    continue;

	  if (/* SET_SRC is a giv.  */
3893 3894
	      (general_induction_var (SET_SRC (set), &src_reg, &add_val,
				      &mult_val, 0, &benefit)
Mike Stump committed
3895
	       /* Equivalent expression is a giv.  */
3896
	       || ((regnote = find_reg_note (p, REG_EQUAL, NULL_RTX))
3897 3898 3899
		   && general_induction_var (XEXP (regnote, 0), &src_reg,
					     &add_val, &mult_val, 0,
					     &benefit)))
Richard Stallman committed
3900 3901 3902 3903 3904 3905
	      /* Don't try to handle any regs made by loop optimization.
		 We have nothing on them in regno_first_uid, etc.  */
	      && REGNO (dest_reg) < max_reg_before_loop
	      /* Don't recognize a BASIC_INDUCT_VAR here.  */
	      && dest_reg != src_reg
	      /* This must be the only place where the register is set.  */
3906
	      && (VARRAY_INT (n_times_set, REGNO (dest_reg)) == 1
Mike Stump committed
3907
		  /* or all sets must be consecutive and make a giv.  */
Richard Stallman committed
3908 3909
		  || (benefit = consec_sets_giv (benefit, p,
						 src_reg, dest_reg,
3910 3911
						 &add_val, &mult_val,
						 &last_consec_insn))))
Richard Stallman committed
3912 3913 3914 3915 3916
	    {
	      struct induction *v
		= (struct induction *) alloca (sizeof (struct induction));

	      /* If this is a library call, increase benefit.  */
3917
	      if (find_reg_note (p, REG_RETVAL, NULL_RTX))
Richard Stallman committed
3918 3919 3920
		benefit += libcall_benefit (p);

	      /* Skip the consecutive insns, if there are any.  */
3921 3922
	      if (VARRAY_INT (n_times_set, REGNO (dest_reg)) != 1)
		p = last_consec_insn;
Richard Stallman committed
3923 3924

	      record_giv (v, p, src_reg, dest_reg, mult_val, add_val, benefit,
3925
			  DEST_REG, not_every_iteration, NULL_PTR, loop_start,
Richard Stallman committed
3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941
			  loop_end);

	    }
	}

#ifndef DONT_REDUCE_ADDR
      /* Look for givs which are memory addresses.  */
      /* This resulted in worse code on a VAX 8600.  I wonder if it
	 still does.  */
      if (GET_CODE (p) == INSN)
	find_mem_givs (PATTERN (p), p, not_every_iteration, loop_start,
		       loop_end);
#endif

      /* Update the status of whether giv can derive other givs.  This can
	 change when we pass a label or an insn that updates a biv.  */
3942 3943
      if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
	|| GET_CODE (p) == CODE_LABEL)
Richard Stallman committed
3944 3945
	update_giv_derive (p);

3946 3947 3948 3949 3950 3951 3952
      /* Past a jump, we get to insns for which we can't count
	 on whether they will be executed during each iteration.  */
      /* This code appears twice in strength_reduce.  There is also similar
	 code in scan_loop.  */
      if (GET_CODE (p) == JUMP_INSN
	  /* If we enter the loop in the middle, and scan around to the
	     beginning, don't set not_every_iteration for that.
Richard Stallman committed
3953 3954
	     This can be any kind of jump, since we want to know if insns
	     will be executed if the loop is executed.  */
3955
	  && ! (JUMP_LABEL (p) == loop_top
Richard Stallman committed
3956 3957
		&& ((NEXT_INSN (NEXT_INSN (p)) == loop_end && simplejump_p (p))
		    || (NEXT_INSN (p) == loop_end && condjump_p (p)))))
3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973
	{
	  rtx label = 0;

	  /* If this is a jump outside the loop, then it also doesn't
	     matter.  Check to see if the target of this branch is on the
	     loop_number_exits_labels list.  */
	     
	  for (label = loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]];
	       label;
	       label = LABEL_NEXTREF (label))
	    if (XEXP (label, 0) == JUMP_LABEL (p))
	      break;

	  if (! label)
	    not_every_iteration = 1;
	}
Richard Stallman committed
3974

3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986
      else if (GET_CODE (p) == NOTE)
	{
	  /* At the virtual top of a converted loop, insns are again known to
	     be executed each iteration: logically, the loop begins here
	     even though the exit code has been duplicated.  */
	  if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_VTOP && loop_depth == 0)
	    not_every_iteration = 0;
	  else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG)
	    loop_depth++;
	  else if (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
	    loop_depth--;
	}
Richard Stallman committed
3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006

      /* Unlike in the code motion pass where MAYBE_NEVER indicates that
	 an insn may never be executed, NOT_EVERY_ITERATION indicates whether
	 or not an insn is known to be executed each iteration of the
	 loop, whether or not any iterations are known to occur.

	 Therefore, if we have just passed a label and have no more labels
	 between here and the test insn of the loop, we know these insns
	 will be executed each iteration.  */

      if (not_every_iteration && GET_CODE (p) == CODE_LABEL
	  && no_labels_between_p (p, loop_end))
	not_every_iteration = 0;
    }

  /* Try to calculate and save the number of loop iterations.  This is
     set to zero if the actual number can not be calculated.  This must
     be called after all giv's have been identified, since otherwise it may
     fail if the iteration variable is a giv.  */

4007
  loop_iterations (loop_start, loop_end, loop_info);
Richard Stallman committed
4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019

  /* Now for each giv for which we still don't know whether or not it is
     replaceable, check to see if it is replaceable because its final value
     can be calculated.  This must be done after loop_iterations is called,
     so that final_giv_value will work correctly.  */

  for (bl = loop_iv_list; bl; bl = bl->next)
    {
      struct induction *v;

      for (v = bl->giv; v; v = v->next_iv)
	if (! v->replaceable && ! v->not_replaceable)
4020
	  check_final_value (v, loop_start, loop_end, loop_info->n_iterations);
Richard Stallman committed
4021 4022 4023 4024 4025
    }

  /* Try to prove that the loop counter variable (if any) is always
     nonnegative; if so, record that fact with a REG_NONNEG note
     so that "decrement and branch until zero" insn can be used.  */
4026
  check_dbra_loop (loop_end, insn_count, loop_start, loop_info);
Richard Stallman committed
4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057

  /* Create reg_map to hold substitutions for replaceable giv regs.  */
  reg_map = (rtx *) alloca (max_reg_before_loop * sizeof (rtx));
  bzero ((char *) reg_map, max_reg_before_loop * sizeof (rtx));

  /* Examine each iv class for feasibility of strength reduction/induction
     variable elimination.  */

  for (bl = loop_iv_list; bl; bl = bl->next)
    {
      struct induction *v;
      int benefit;
      int all_reduced;
      rtx final_value = 0;

      /* Test whether it will be possible to eliminate this biv
	 provided all givs are reduced.  This is possible if either
	 the reg is not used outside the loop, or we can compute
	 what its final value will be.

	 For architectures with a decrement_and_branch_until_zero insn,
	 don't do this if we put a REG_NONNEG note on the endtest for
	 this biv.  */

      /* Compare against bl->init_insn rather than loop_start.
	 We aren't concerned with any uses of the biv between
	 init_insn and loop_start since these won't be affected
	 by the value of the biv elsewhere in the function, so
	 long as init_insn doesn't use the biv itself.
	 March 14, 1989 -- self@bayes.arc.nasa.gov */

4058
      if ((uid_luid[REGNO_LAST_UID (bl->regno)] < INSN_LUID (loop_end)
Richard Stallman committed
4059 4060
	   && bl->init_insn
	   && INSN_UID (bl->init_insn) < max_uid_for_loop
4061
	   && uid_luid[REGNO_FIRST_UID (bl->regno)] >= INSN_LUID (bl->init_insn)
Richard Stallman committed
4062 4063 4064 4065
#ifdef HAVE_decrement_and_branch_until_zero
	   && ! bl->nonneg
#endif
	   && ! reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set)))
4066 4067
	  || ((final_value = final_biv_value (bl, loop_start, loop_end, 
					      loop_info->n_iterations))
Richard Stallman committed
4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082
#ifdef HAVE_decrement_and_branch_until_zero
	      && ! bl->nonneg
#endif
	      ))
	bl->eliminable = maybe_eliminate_biv (bl, loop_start, end, 0,
					      threshold, insn_count);
      else
	{
	  if (loop_dump_stream)
	    {
	      fprintf (loop_dump_stream,
		       "Cannot eliminate biv %d.\n",
		       bl->regno);
	      fprintf (loop_dump_stream,
		       "First use: insn %d, last use: insn %d.\n",
4083 4084
		       REGNO_FIRST_UID (bl->regno),
		       REGNO_LAST_UID (bl->regno));
Richard Stallman committed
4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128
	    }
	}

      /* Combine all giv's for this iv_class.  */
      combine_givs (bl);

      /* This will be true at the end, if all givs which depend on this
	 biv have been strength reduced.
	 We can't (currently) eliminate the biv unless this is so.  */
      all_reduced = 1;

      /* Check each giv in this class to see if we will benefit by reducing
	 it.  Skip giv's combined with others.  */
      for (v = bl->giv; v; v = v->next_iv)
	{
	  struct induction *tv;

	  if (v->ignore || v->same)
	    continue;

	  benefit = v->benefit;

	  /* Reduce benefit if not replaceable, since we will insert
	     a move-insn to replace the insn that calculates this giv.
	     Don't do this unless the giv is a user variable, since it
	     will often be marked non-replaceable because of the duplication
	     of the exit code outside the loop.  In such a case, the copies
	     we insert are dead and will be deleted.  So they don't have
	     a cost.  Similar situations exist.  */
	  /* ??? The new final_[bg]iv_value code does a much better job
	     of finding replaceable giv's, and hence this code may no longer
	     be necessary.  */
	  if (! v->replaceable && ! bl->eliminable
	      && REG_USERVAR_P (v->dest_reg))
	    benefit -= copy_cost;

	  /* Decrease the benefit to count the add-insns that we will
	     insert to increment the reduced reg for the giv.  */
	  benefit -= add_cost * bl->biv_count;

	  /* Decide whether to strength-reduce this giv or to leave the code
	     unchanged (recompute it from the biv each time it is used).
	     This decision can be made independently for each giv.  */

4129 4130 4131 4132 4133 4134 4135
#ifdef AUTO_INC_DEC
	  /* Attempt to guess whether autoincrement will handle some of the
	     new add insns; if so, increase BENEFIT (undo the subtraction of
	     add_cost that was done above).  */
	  if (v->giv_type == DEST_ADDR
	      && GET_CODE (v->mult_val) == CONST_INT)
	    {
4136 4137
	      if (HAVE_POST_INCREMENT
		  && INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
4138
		benefit += add_cost * bl->biv_count;
4139 4140 4141 4142 4143 4144 4145 4146
	      else if (HAVE_PRE_INCREMENT
		       && INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
		benefit += add_cost * bl->biv_count;
	      else if (HAVE_POST_DECREMENT
		       && -INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
		benefit += add_cost * bl->biv_count;
	      else if (HAVE_PRE_DECREMENT
		       && -INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
4147 4148 4149
		benefit += add_cost * bl->biv_count;
	    }
#endif
Richard Stallman committed
4150 4151 4152 4153

	  /* If an insn is not to be strength reduced, then set its ignore
	     flag, and clear all_reduced.  */

4154 4155 4156 4157 4158 4159
	  /* A giv that depends on a reversed biv must be reduced if it is
	     used after the loop exit, otherwise, it would have the wrong
	     value after the loop exit.  To make it simple, just reduce all
	     of such giv's whether or not we know they are used after the loop
	     exit.  */

4160 4161
	  if ( ! flag_reduce_all_givs && v->lifetime * threshold * benefit < insn_count
	      && ! bl->reversed )
Richard Stallman committed
4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197
	    {
	      if (loop_dump_stream)
		fprintf (loop_dump_stream,
			 "giv of insn %d not worth while, %d vs %d.\n",
			 INSN_UID (v->insn),
			 v->lifetime * threshold * benefit, insn_count);
	      v->ignore = 1;
	      all_reduced = 0;
	    }
	  else
	    {
	      /* Check that we can increment the reduced giv without a
		 multiply insn.  If not, reject it.  */

	      for (tv = bl->biv; tv; tv = tv->next_iv)
		if (tv->mult_val == const1_rtx
		    && ! product_cheap_p (tv->add_val, v->mult_val))
		  {
		    if (loop_dump_stream)
		      fprintf (loop_dump_stream,
			       "giv of insn %d: would need a multiply.\n",
			       INSN_UID (v->insn));
		    v->ignore = 1;
		    all_reduced = 0;
		    break;
		  }
	    }
	}

      /* Reduce each giv that we decided to reduce.  */

      for (v = bl->giv; v; v = v->next_iv)
	{
	  struct induction *tv;
	  if (! v->ignore && v->same == 0)
	    {
4198 4199
	      int auto_inc_opt = 0;

Richard Stallman committed
4200 4201
	      v->new_reg = gen_reg_rtx (v->mode);

4202 4203 4204 4205 4206 4207
#ifdef AUTO_INC_DEC
	      /* If the target has auto-increment addressing modes, and
		 this is an address giv, then try to put the increment
		 immediately after its use, so that flow can create an
		 auto-increment addressing mode.  */
	      if (v->giv_type == DEST_ADDR && bl->biv_count == 1
4208 4209 4210 4211
		  && bl->biv->always_executed && ! bl->biv->maybe_multiple
		  /* We don't handle reversed biv's because bl->biv->insn
		     does not have a valid INSN_LUID.  */
		  && ! bl->reversed
4212 4213
		  && v->always_executed && ! v->maybe_multiple
		  && INSN_UID (v->insn) < max_uid_for_loop)
4214 4215 4216 4217 4218 4219 4220 4221
		{
		  /* If other giv's have been combined with this one, then
		     this will work only if all uses of the other giv's occur
		     before this giv's insn.  This is difficult to check.

		     We simplify this by looking for the common case where
		     there is one DEST_REG giv, and this giv's insn is the
		     last use of the dest_reg of that DEST_REG giv.  If the
Jeff Law committed
4222
		     increment occurs after the address giv, then we can
4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239
		     perform the optimization.  (Otherwise, the increment
		     would have to go before other_giv, and we would not be
		     able to combine it with the address giv to get an
		     auto-inc address.)  */
		  if (v->combined_with)
		    {
		      struct induction *other_giv = 0;

		      for (tv = bl->giv; tv; tv = tv->next_iv)
			if (tv->same == v)
			  {
			    if (other_giv)
			      break;
			    else
			      other_giv = tv;
			  }
		      if (! tv && other_giv
4240
			  && REGNO (other_giv->dest_reg) < max_reg_before_loop
4241
			  && (REGNO_LAST_UID (REGNO (other_giv->dest_reg))
4242 4243 4244 4245
			      == INSN_UID (v->insn))
			  && INSN_LUID (v->insn) < INSN_LUID (bl->biv->insn))
			auto_inc_opt = 1;
		    }
Jeff Law committed
4246
		  /* Check for case where increment is before the address
4247 4248 4249 4250 4251 4252 4253 4254
		     giv.  Do this test in "loop order".  */
		  else if ((INSN_LUID (v->insn) > INSN_LUID (bl->biv->insn)
			    && (INSN_LUID (v->insn) < INSN_LUID (scan_start)
				|| (INSN_LUID (bl->biv->insn)
				    > INSN_LUID (scan_start))))
			   || (INSN_LUID (v->insn) < INSN_LUID (scan_start)
			       && (INSN_LUID (scan_start)
				   < INSN_LUID (bl->biv->insn))))
4255 4256 4257 4258
		    auto_inc_opt = -1;
		  else
		    auto_inc_opt = 1;

4259
#ifdef HAVE_cc0
4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271
		  {
		    rtx prev;

		    /* We can't put an insn immediately after one setting
		       cc0, or immediately before one using cc0.  */
		    if ((auto_inc_opt == 1 && sets_cc0_p (PATTERN (v->insn)))
			|| (auto_inc_opt == -1
			    && (prev = prev_nonnote_insn (v->insn)) != 0
			    && GET_RTX_CLASS (GET_CODE (prev)) == 'i'
			    && sets_cc0_p (PATTERN (prev))))
		      auto_inc_opt = 0;
		  }
4272 4273
#endif

4274 4275 4276 4277 4278 4279 4280
		  if (auto_inc_opt)
		    v->auto_inc_opt = 1;
		}
#endif

	      /* For each place where the biv is incremented, add an insn
		 to increment the new, reduced reg for the giv.  */
Richard Stallman committed
4281 4282
	      for (tv = bl->biv; tv; tv = tv->next_iv)
		{
4283 4284 4285 4286 4287 4288 4289 4290 4291
		  rtx insert_before;

		  if (! auto_inc_opt)
		    insert_before = tv->insn;
		  else if (auto_inc_opt == 1)
		    insert_before = NEXT_INSN (v->insn);
		  else
		    insert_before = v->insn;

Richard Stallman committed
4292 4293
		  if (tv->mult_val == const1_rtx)
		    emit_iv_add_mult (tv->add_val, v->mult_val,
4294
				      v->new_reg, v->new_reg, insert_before);
Richard Stallman committed
4295 4296 4297 4298
		  else /* tv->mult_val == const0_rtx */
		    /* A multiply is acceptable here
		       since this is presumed to be seldom executed.  */
		    emit_iv_add_mult (tv->add_val, v->mult_val,
4299
				      v->add_val, v->new_reg, insert_before);
Richard Stallman committed
4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327
		}

	      /* Add code at loop start to initialize giv's reduced reg.  */

	      emit_iv_add_mult (bl->initial_value, v->mult_val,
				v->add_val, v->new_reg, loop_start);
	    }
	}

      /* Rescan all givs.  If a giv is the same as a giv not reduced, mark it
	 as not reduced.
	 
	 For each giv register that can be reduced now: if replaceable,
	 substitute reduced reg wherever the old giv occurs;
	 else add new move insn "giv_reg = reduced_reg".

	 Also check for givs whose first use is their definition and whose
	 last use is the definition of another giv.  If so, it is likely
	 dead and should not be used to eliminate a biv.  */
      for (v = bl->giv; v; v = v->next_iv)
	{
	  if (v->same && v->same->ignore)
	    v->ignore = 1;

	  if (v->ignore)
	    continue;

	  if (v->giv_type == DEST_REG
4328
	      && REGNO_FIRST_UID (REGNO (v->dest_reg)) == INSN_UID (v->insn))
Richard Stallman committed
4329 4330 4331 4332
	    {
	      struct induction *v1;

	      for (v1 = bl->giv; v1; v1 = v1->next_iv)
4333
		if (REGNO_LAST_UID (REGNO (v->dest_reg)) == INSN_UID (v1->insn))
Richard Stallman committed
4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345
		  v->maybe_dead = 1;
	    }

	  /* Update expression if this was combined, in case other giv was
	     replaced.  */
	  if (v->same)
	    v->new_reg = replace_rtx (v->new_reg,
				      v->same->dest_reg, v->same->new_reg);

	  if (v->giv_type == DEST_ADDR)
	    /* Store reduced reg as the address in the memref where we found
	       this giv.  */
4346
	    validate_change (v->insn, v->location, v->new_reg, 0);
Richard Stallman committed
4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392
	  else if (v->replaceable)
	    {
	      reg_map[REGNO (v->dest_reg)] = v->new_reg;

#if 0
	      /* I can no longer duplicate the original problem.  Perhaps
		 this is unnecessary now?  */

	      /* Replaceable; it isn't strictly necessary to delete the old
		 insn and emit a new one, because v->dest_reg is now dead.

		 However, especially when unrolling loops, the special
		 handling for (set REG0 REG1) in the second cse pass may
		 make v->dest_reg live again.  To avoid this problem, emit
		 an insn to set the original giv reg from the reduced giv.
		 We can not delete the original insn, since it may be part
		 of a LIBCALL, and the code in flow that eliminates dead
		 libcalls will fail if it is deleted.  */
	      emit_insn_after (gen_move_insn (v->dest_reg, v->new_reg),
			       v->insn);
#endif
	    }
	  else
	    {
	      /* Not replaceable; emit an insn to set the original giv reg from
		 the reduced giv, same as above.  */
	      emit_insn_after (gen_move_insn (v->dest_reg, v->new_reg),
			       v->insn);
	    }

	  /* When a loop is reversed, givs which depend on the reversed
	     biv, and which are live outside the loop, must be set to their
	     correct final value.  This insn is only needed if the giv is
	     not replaceable.  The correct final value is the same as the
	     value that the giv starts the reversed loop with.  */
	  if (bl->reversed && ! v->replaceable)
	    emit_iv_add_mult (bl->initial_value, v->mult_val,
			      v->add_val, v->dest_reg, end_insert_before);
	  else if (v->final_value)
	    {
	      rtx insert_before;

	      /* If the loop has multiple exits, emit the insn before the
		 loop to ensure that it will always be executed no matter
		 how the loop exits.  Otherwise, emit the insn after the loop,
		 since this is slightly more efficient.  */
4393
	      if (loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]])
Richard Stallman committed
4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445
		insert_before = loop_start;
	      else
		insert_before = end_insert_before;
	      emit_insn_before (gen_move_insn (v->dest_reg, v->final_value),
				insert_before);

#if 0
	      /* If the insn to set the final value of the giv was emitted
		 before the loop, then we must delete the insn inside the loop
		 that sets it.  If this is a LIBCALL, then we must delete
		 every insn in the libcall.  Note, however, that
		 final_giv_value will only succeed when there are multiple
		 exits if the giv is dead at each exit, hence it does not
		 matter that the original insn remains because it is dead
		 anyways.  */
	      /* Delete the insn inside the loop that sets the giv since
		 the giv is now set before (or after) the loop.  */
	      delete_insn (v->insn);
#endif
	    }

	  if (loop_dump_stream)
	    {
	      fprintf (loop_dump_stream, "giv at %d reduced to ",
		       INSN_UID (v->insn));
	      print_rtl (loop_dump_stream, v->new_reg);
	      fprintf (loop_dump_stream, "\n");
	    }
	}

      /* All the givs based on the biv bl have been reduced if they
	 merit it.  */

      /* For each giv not marked as maybe dead that has been combined with a
	 second giv, clear any "maybe dead" mark on that second giv.
	 v->new_reg will either be or refer to the register of the giv it
	 combined with.

	 Doing this clearing avoids problems in biv elimination where a
	 giv's new_reg is a complex value that can't be put in the insn but
	 the giv combined with (with a reg as new_reg) is marked maybe_dead.
	 Since the register will be used in either case, we'd prefer it be
	 used from the simpler giv.  */

      for (v = bl->giv; v; v = v->next_iv)
	if (! v->maybe_dead && v->same)
	  v->same->maybe_dead = 0;

      /* Try to eliminate the biv, if it is a candidate.
	 This won't work if ! all_reduced,
	 since the givs we planned to use might not have been reduced.

4446
	 We have to be careful that we didn't initially think we could eliminate
Richard Stallman committed
4447 4448 4449 4450 4451 4452 4453
	 this biv because of a giv that we now think may be dead and shouldn't
	 be used as a biv replacement.  

	 Also, there is the possibility that we may have a giv that looks
	 like it can be used to eliminate a biv, but the resulting insn
	 isn't valid.  This can happen, for example, on the 88k, where a 
	 JUMP_INSN can compare a register only with zero.  Attempts to
4454
	 replace it with a compare with a constant will fail.
Richard Stallman committed
4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468

	 Note that in cases where this call fails, we may have replaced some
	 of the occurrences of the biv with a giv, but no harm was done in
	 doing so in the rare cases where it can occur.  */

      if (all_reduced == 1 && bl->eliminable
	  && maybe_eliminate_biv (bl, loop_start, end, 1,
				  threshold, insn_count))

	{
	  /* ?? If we created a new test to bypass the loop entirely,
	     or otherwise drop straight in, based on this test, then
	     we might want to rewrite it also.  This way some later
	     pass has more hope of removing the initialization of this
Mike Stump committed
4469
	     biv entirely.  */
Richard Stallman committed
4470 4471 4472 4473 4474 4475

	  /* If final_value != 0, then the biv may be used after loop end
	     and we must emit an insn to set it just in case.

	     Reversed bivs already have an insn after the loop setting their
	     value, so we don't need another one.  We can't calculate the
Mike Stump committed
4476
	     proper final value for such a biv here anyways.  */
Richard Stallman committed
4477 4478 4479 4480 4481 4482 4483 4484
	  if (final_value != 0 && ! bl->reversed)
	    {
	      rtx insert_before;

	      /* If the loop has multiple exits, emit the insn before the
		 loop to ensure that it will always be executed no matter
		 how the loop exits.  Otherwise, emit the insn after the
		 loop, since this is slightly more efficient.  */
4485
	      if (loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]])
Richard Stallman committed
4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521
		insert_before = loop_start;
	      else
		insert_before = end_insert_before;

	      emit_insn_before (gen_move_insn (bl->biv->dest_reg, final_value),
				end_insert_before);
	    }

#if 0
	  /* Delete all of the instructions inside the loop which set
	     the biv, as they are all dead.  If is safe to delete them,
	     because an insn setting a biv will never be part of a libcall.  */
	  /* However, deleting them will invalidate the regno_last_uid info,
	     so keeping them around is more convenient.  Final_biv_value
	     will only succeed when there are multiple exits if the biv
	     is dead at each exit, hence it does not matter that the original
	     insn remains, because it is dead anyways.  */
	  for (v = bl->biv; v; v = v->next_iv)
	    delete_insn (v->insn);
#endif

	  if (loop_dump_stream)
	    fprintf (loop_dump_stream, "Reg %d: biv eliminated\n",
		     bl->regno);
	}
    }

  /* Go through all the instructions in the loop, making all the
     register substitutions scheduled in REG_MAP.  */

  for (p = loop_start; p != end; p = NEXT_INSN (p))
    if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
 	|| GET_CODE (p) == CALL_INSN)
      {
	replace_regs (PATTERN (p), reg_map, max_reg_before_loop, 0);
	replace_regs (REG_NOTES (p), reg_map, max_reg_before_loop, 0);
4522
	INSN_CODE (p) = -1;
Richard Stallman committed
4523 4524 4525 4526 4527 4528
      }

  /* Unroll loops from within strength reduction so that we can use the
     induction variable information that strength_reduce has already
     collected.  */
  
4529
  if (unroll_p)
4530 4531
    unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
		 loop_info, 1);
Richard Stallman committed
4532

4533
#ifdef HAVE_decrement_and_branch_on_count
4534 4535 4536
  /* Instrument the loop with BCT insn.  */
  if (HAVE_decrement_and_branch_on_count && bct_p
      && flag_branch_on_count_reg)
4537
    insert_bct (loop_start, loop_end, loop_info);
4538
#endif  /* HAVE_decrement_and_branch_on_count */
4539

Richard Stallman committed
4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561
  if (loop_dump_stream)
    fprintf (loop_dump_stream, "\n");
}

/* Return 1 if X is a valid source for an initial value (or as value being
   compared against in an initial test).

   X must be either a register or constant and must not be clobbered between
   the current insn and the start of the loop.

   INSN is the insn containing X.  */

static int
valid_initial_value_p (x, insn, call_seen, loop_start)
     rtx x;
     rtx insn;
     int call_seen;
     rtx loop_start;
{
  if (CONSTANT_P (x))
    return 1;

4562
  /* Only consider pseudos we know about initialized in insns whose luids
Richard Stallman committed
4563 4564 4565 4566 4567 4568 4569 4570
     we know.  */
  if (GET_CODE (x) != REG
      || REGNO (x) >= max_reg_before_loop)
    return 0;

  /* Don't use call-clobbered registers across a call which clobbers it.  On
     some machines, don't use any hard registers at all.  */
  if (REGNO (x) < FIRST_PSEUDO_REGISTER
4571 4572
      && (SMALL_REGISTER_CLASSES
	  || (call_used_regs[REGNO (x)] && call_seen)))
Richard Stallman committed
4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625
    return 0;

  /* Don't use registers that have been clobbered before the start of the
     loop.  */
  if (reg_set_between_p (x, insn, loop_start))
    return 0;

  return 1;
}

/* Scan X for memory refs and check each memory address
   as a possible giv.  INSN is the insn whose pattern X comes from.
   NOT_EVERY_ITERATION is 1 if the insn might not be executed during
   every loop iteration.  */

static void
find_mem_givs (x, insn, not_every_iteration, loop_start, loop_end)
     rtx x;
     rtx insn;
     int not_every_iteration;
     rtx loop_start, loop_end;
{
  register int i, j;
  register enum rtx_code code;
  register char *fmt;

  if (x == 0)
    return;

  code = GET_CODE (x);
  switch (code)
    {
    case REG:
    case CONST_INT:
    case CONST:
    case CONST_DOUBLE:
    case SYMBOL_REF:
    case LABEL_REF:
    case PC:
    case CC0:
    case ADDR_VEC:
    case ADDR_DIFF_VEC:
    case USE:
    case CLOBBER:
      return;

    case MEM:
      {
	rtx src_reg;
	rtx add_val;
	rtx mult_val;
	int benefit;

4626 4627 4628 4629
	/* This code used to disable creating GIVs with mult_val == 1 and
	   add_val == 0.  However, this leads to lost optimizations when 
	   it comes time to combine a set of related DEST_ADDR GIVs, since
	   this one would not be seen.   */
Richard Stallman committed
4630

4631 4632
	if (general_induction_var (XEXP (x, 0), &src_reg, &add_val,
				   &mult_val, 1, &benefit))
Richard Stallman committed
4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644
	  {
	    /* Found one; record it.  */
	    struct induction *v
	      = (struct induction *) oballoc (sizeof (struct induction));

	    record_giv (v, insn, src_reg, addr_placeholder, mult_val,
			add_val, benefit, DEST_ADDR, not_every_iteration,
			&XEXP (x, 0), loop_start, loop_end);

	    v->mem_mode = GET_MODE (x);
	  }
      }
4645 4646 4647 4648
      return;

    default:
      break;
Richard Stallman committed
4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671
    }

  /* Recursively scan the subexpressions for other mem refs.  */

  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    if (fmt[i] == 'e')
      find_mem_givs (XEXP (x, i), insn, not_every_iteration, loop_start,
		     loop_end);
    else if (fmt[i] == 'E')
      for (j = 0; j < XVECLEN (x, i); j++)
	find_mem_givs (XVECEXP (x, i, j), insn, not_every_iteration,
		       loop_start, loop_end);
}

/* Fill in the data about one biv update.
   V is the `struct induction' in which we record the biv.  (It is
   allocated by the caller, with alloca.)
   INSN is the insn that sets it.
   DEST_REG is the biv's reg.

   MULT_VAL is const1_rtx if the biv is being incremented here, in which case
   INC_VAL is the increment.  Otherwise, MULT_VAL is const0_rtx and the biv is
4672 4673 4674 4675 4676 4677 4678
   being set to INC_VAL.

   NOT_EVERY_ITERATION is nonzero if this biv update is not know to be
   executed every iteration; MAYBE_MULTIPLE is nonzero if this biv update
   can be executed more than once per iteration.  If MAYBE_MULTIPLE
   and NOT_EVERY_ITERATION are both zero, we know that the biv update is
   executed exactly once per iteration.  */
Richard Stallman committed
4679 4680

static void
4681 4682
record_biv (v, insn, dest_reg, inc_val, mult_val,
	    not_every_iteration, maybe_multiple)
Richard Stallman committed
4683 4684 4685 4686 4687 4688
     struct induction *v;
     rtx insn;
     rtx dest_reg;
     rtx inc_val;
     rtx mult_val;
     int not_every_iteration;
4689
     int maybe_multiple;
Richard Stallman committed
4690 4691 4692 4693 4694 4695 4696 4697 4698 4699
{
  struct iv_class *bl;

  v->insn = insn;
  v->src_reg = dest_reg;
  v->dest_reg = dest_reg;
  v->mult_val = mult_val;
  v->add_val = inc_val;
  v->mode = GET_MODE (dest_reg);
  v->always_computable = ! not_every_iteration;
4700
  v->always_executed = ! not_every_iteration;
4701
  v->maybe_multiple = maybe_multiple;
Richard Stallman committed
4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720

  /* Add this to the reg's iv_class, creating a class
     if this is the first incrementation of the reg.  */

  bl = reg_biv_class[REGNO (dest_reg)];
  if (bl == 0)
    {
      /* Create and initialize new iv_class.  */

      bl = (struct iv_class *) oballoc (sizeof (struct iv_class));

      bl->regno = REGNO (dest_reg);
      bl->biv = 0;
      bl->giv = 0;
      bl->biv_count = 0;
      bl->giv_count = 0;

      /* Set initial value to the reg itself.  */
      bl->initial_value = dest_reg;
4721
      /* We haven't seen the initializing insn yet */
Richard Stallman committed
4722 4723 4724 4725 4726 4727 4728
      bl->init_insn = 0;
      bl->init_set = 0;
      bl->initial_test = 0;
      bl->incremented = 0;
      bl->eliminable = 0;
      bl->nonneg = 0;
      bl->reversed = 0;
4729
      bl->total_benefit = 0;
Richard Stallman committed
4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751

      /* Add this class to loop_iv_list.  */
      bl->next = loop_iv_list;
      loop_iv_list = bl;

      /* Put it in the array of biv register classes.  */
      reg_biv_class[REGNO (dest_reg)] = bl;
    }

  /* Update IV_CLASS entry for this biv.  */
  v->next_iv = bl->biv;
  bl->biv = v;
  bl->biv_count++;
  if (mult_val == const1_rtx)
    bl->incremented = 1;

  if (loop_dump_stream)
    {
      fprintf (loop_dump_stream,
	       "Insn %d: possible biv, reg %d,",
	       INSN_UID (insn), REGNO (dest_reg));
      if (GET_CODE (inc_val) == CONST_INT)
4752 4753 4754 4755 4756
	{
	  fprintf (loop_dump_stream, " const =");
	  fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (inc_val));
	  fputc ('\n', loop_dump_stream);
	}
Richard Stallman committed
4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806
      else
	{
	  fprintf (loop_dump_stream, " const = ");
	  print_rtl (loop_dump_stream, inc_val);
	  fprintf (loop_dump_stream, "\n");
	}
    }
}

/* Fill in the data about one giv.
   V is the `struct induction' in which we record the giv.  (It is
   allocated by the caller, with alloca.)
   INSN is the insn that sets it.
   BENEFIT estimates the savings from deleting this insn.
   TYPE is DEST_REG or DEST_ADDR; it says whether the giv is computed
   into a register or is used as a memory address.

   SRC_REG is the biv reg which the giv is computed from.
   DEST_REG is the giv's reg (if the giv is stored in a reg).
   MULT_VAL and ADD_VAL are the coefficients used to compute the giv.
   LOCATION points to the place where this giv's value appears in INSN.  */

static void
record_giv (v, insn, src_reg, dest_reg, mult_val, add_val, benefit,
	    type, not_every_iteration, location, loop_start, loop_end)
     struct induction *v;
     rtx insn;
     rtx src_reg;
     rtx dest_reg;
     rtx mult_val, add_val;
     int benefit;
     enum g_types type;
     int not_every_iteration;
     rtx *location;
     rtx loop_start, loop_end;
{
  struct induction *b;
  struct iv_class *bl;
  rtx set = single_set (insn);

  v->insn = insn;
  v->src_reg = src_reg;
  v->giv_type = type;
  v->dest_reg = dest_reg;
  v->mult_val = mult_val;
  v->add_val = add_val;
  v->benefit = benefit;
  v->location = location;
  v->cant_derive = 0;
  v->combined_with = 0;
4807
  v->maybe_multiple = 0;
Richard Stallman committed
4808 4809 4810 4811 4812 4813
  v->maybe_dead = 0;
  v->derive_adjustment = 0;
  v->same = 0;
  v->ignore = 0;
  v->new_reg = 0;
  v->final_value = 0;
4814
  v->same_insn = 0;
4815
  v->auto_inc_opt = 0;
4816 4817
  v->unrolled = 0;
  v->shared = 0;
Richard Stallman committed
4818 4819 4820 4821 4822 4823 4824

  /* The v->always_computable field is used in update_giv_derive, to
     determine whether a giv can be used to derive another giv.  For a
     DEST_REG giv, INSN computes a new value for the giv, so its value
     isn't computable if INSN insn't executed every iteration.
     However, for a DEST_ADDR giv, INSN merely uses the value of the giv;
     it does not compute a new value.  Hence the value is always computable
4825
     regardless of whether INSN is executed each iteration.  */
Richard Stallman committed
4826 4827 4828 4829 4830 4831

  if (type == DEST_ADDR)
    v->always_computable = 1;
  else
    v->always_computable = ! not_every_iteration;

4832 4833
  v->always_executed = ! not_every_iteration;

Richard Stallman committed
4834 4835 4836 4837 4838 4839 4840 4841 4842
  if (type == DEST_ADDR)
    {
      v->mode = GET_MODE (*location);
      v->lifetime = 1;
    }
  else /* type == DEST_REG */
    {
      v->mode = GET_MODE (SET_DEST (set));

4843 4844
      v->lifetime = (uid_luid[REGNO_LAST_UID (REGNO (dest_reg))]
		     - uid_luid[REGNO_FIRST_UID (REGNO (dest_reg))]);
Richard Stallman committed
4845 4846 4847

      /* If the lifetime is zero, it means that this register is
	 really a dead store.  So mark this as a giv that can be
Mike Stump committed
4848
	 ignored.  This will not prevent the biv from being eliminated.  */
Richard Stallman committed
4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886
      if (v->lifetime == 0)
	v->ignore = 1;

      reg_iv_type[REGNO (dest_reg)] = GENERAL_INDUCT;
      reg_iv_info[REGNO (dest_reg)] = v;
    }

  /* Add the giv to the class of givs computed from one biv.  */

  bl = reg_biv_class[REGNO (src_reg)];
  if (bl)
    {
      v->next_iv = bl->giv;
      bl->giv = v;
      /* Don't count DEST_ADDR.  This is supposed to count the number of
	 insns that calculate givs.  */
      if (type == DEST_REG)
	bl->giv_count++;
      bl->total_benefit += benefit;
    }
  else
    /* Fatal error, biv missing for this giv?  */
    abort ();

  if (type == DEST_ADDR)
    v->replaceable = 1;
  else
    {
      /* The giv can be replaced outright by the reduced register only if all
	 of the following conditions are true:
 	 - the insn that sets the giv is always executed on any iteration
	   on which the giv is used at all
	   (there are two ways to deduce this:
	    either the insn is executed on every iteration,
	    or all uses follow that insn in the same basic block),
 	 - the giv is not used outside the loop
	 - no assignments to the biv occur during the giv's lifetime.  */

4887
      if (REGNO_FIRST_UID (REGNO (dest_reg)) == INSN_UID (insn)
Richard Stallman committed
4888
	  /* Previous line always fails if INSN was moved by loop opt.  */
4889
	  && uid_luid[REGNO_LAST_UID (REGNO (dest_reg))] < INSN_LUID (loop_end)
Richard Stallman committed
4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911
	  && (! not_every_iteration
	      || last_use_this_basic_block (dest_reg, insn)))
 	{
	  /* Now check that there are no assignments to the biv within the
	     giv's lifetime.  This requires two separate checks.  */

	  /* Check each biv update, and fail if any are between the first
	     and last use of the giv.
	     
	     If this loop contains an inner loop that was unrolled, then
	     the insn modifying the biv may have been emitted by the loop
	     unrolling code, and hence does not have a valid luid.  Just
	     mark the biv as not replaceable in this case.  It is not very
	     useful as a biv, because it is used in two different loops.
	     It is very unlikely that we would be able to optimize the giv
	     using this biv anyways.  */

	  v->replaceable = 1;
	  for (b = bl->biv; b; b = b->next_iv)
	    {
	      if (INSN_UID (b->insn) >= max_uid_for_loop
		  || ((uid_luid[INSN_UID (b->insn)]
4912
		       >= uid_luid[REGNO_FIRST_UID (REGNO (dest_reg))])
Richard Stallman committed
4913
		      && (uid_luid[INSN_UID (b->insn)]
4914
			  <= uid_luid[REGNO_LAST_UID (REGNO (dest_reg))])))
Richard Stallman committed
4915 4916 4917 4918 4919 4920 4921
		{
		  v->replaceable = 0;
		  v->not_replaceable = 1;
		  break;
 		}
	    }

4922 4923
	  /* If there are any backwards branches that go from after the
	     biv update to before it, then this giv is not replaceable.  */
Richard Stallman committed
4924
	  if (v->replaceable)
4925 4926 4927 4928 4929 4930 4931
	    for (b = bl->biv; b; b = b->next_iv)
	      if (back_branch_in_range_p (b->insn, loop_start, loop_end))
		{
		  v->replaceable = 0;
		  v->not_replaceable = 1;
		  break;
		}
Richard Stallman committed
4932 4933 4934 4935 4936 4937 4938 4939 4940 4941
	}
      else
	{
	  /* May still be replaceable, we don't have enough info here to
	     decide.  */
	  v->replaceable = 0;
	  v->not_replaceable = 0;
	}
    }

4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967
  /* Record whether the add_val contains a const_int, for later use by
     combine_givs.  */
  {
    rtx tem = add_val;

    v->no_const_addval = 1;
    if (tem == const0_rtx)
      ;
    else if (GET_CODE (tem) == CONST_INT)
      v->no_const_addval = 0;
    else if (GET_CODE (tem) == PLUS)
      {
        while (1)
	  {
	    if (GET_CODE (XEXP (tem, 0)) == PLUS)
	      tem = XEXP (tem, 0);
	    else if (GET_CODE (XEXP (tem, 1)) == PLUS)
	      tem = XEXP (tem, 1);
	    else
	      break;
	  }
        if (GET_CODE (XEXP (tem, 1)) == CONST_INT)
          v->no_const_addval = 0;
      }
  }

Richard Stallman committed
4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978
  if (loop_dump_stream)
    {
      if (type == DEST_REG)
 	fprintf (loop_dump_stream, "Insn %d: giv reg %d",
		 INSN_UID (insn), REGNO (dest_reg));
      else
 	fprintf (loop_dump_stream, "Insn %d: dest address",
 		 INSN_UID (insn));

      fprintf (loop_dump_stream, " src reg %d benefit %d",
	       REGNO (src_reg), v->benefit);
4979 4980
      fprintf (loop_dump_stream, " lifetime %d",
	       v->lifetime);
Richard Stallman committed
4981 4982 4983 4984

      if (v->replaceable)
 	fprintf (loop_dump_stream, " replaceable");

4985 4986 4987
      if (v->no_const_addval)
	fprintf (loop_dump_stream, " ncav");

Richard Stallman committed
4988
      if (GET_CODE (mult_val) == CONST_INT)
4989 4990 4991 4992
	{
	  fprintf (loop_dump_stream, " mult ");
	  fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (mult_val));
	}
Richard Stallman committed
4993 4994 4995 4996 4997 4998 4999
      else
	{
	  fprintf (loop_dump_stream, " mult ");
	  print_rtl (loop_dump_stream, mult_val);
	}

      if (GET_CODE (add_val) == CONST_INT)
5000 5001 5002 5003
	{
	  fprintf (loop_dump_stream, " add ");
	  fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC, INTVAL (add_val));
	}
Richard Stallman committed
5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023
      else
	{
	  fprintf (loop_dump_stream, " add ");
	  print_rtl (loop_dump_stream, add_val);
	}
    }

  if (loop_dump_stream)
    fprintf (loop_dump_stream, "\n");

}


/* All this does is determine whether a giv can be made replaceable because
   its final value can be calculated.  This code can not be part of record_giv
   above, because final_giv_value requires that the number of loop iterations
   be known, and that can not be accurately calculated until after all givs
   have been identified.  */

static void
5024
check_final_value (v, loop_start, loop_end, n_iterations)
Richard Stallman committed
5025 5026
     struct induction *v;
     rtx loop_start, loop_end;
5027
     unsigned HOST_WIDE_INT n_iterations;
Richard Stallman committed
5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053
{
  struct iv_class *bl;
  rtx final_value = 0;

  bl = reg_biv_class[REGNO (v->src_reg)];

  /* DEST_ADDR givs will never reach here, because they are always marked
     replaceable above in record_giv.  */

  /* The giv can be replaced outright by the reduced register only if all
     of the following conditions are true:
     - the insn that sets the giv is always executed on any iteration
       on which the giv is used at all
       (there are two ways to deduce this:
        either the insn is executed on every iteration,
        or all uses follow that insn in the same basic block),
     - its final value can be calculated (this condition is different
       than the one above in record_giv)
     - no assignments to the biv occur during the giv's lifetime.  */

#if 0
  /* This is only called now when replaceable is known to be false.  */
  /* Clear replaceable, so that it won't confuse final_giv_value.  */
  v->replaceable = 0;
#endif

5054
  if ((final_value = final_giv_value (v, loop_start, loop_end, n_iterations))
Richard Stallman committed
5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102
      && (v->always_computable || last_use_this_basic_block (v->dest_reg, v->insn)))
    {
      int biv_increment_seen = 0;
      rtx p = v->insn;
      rtx last_giv_use;

      v->replaceable = 1;

      /* When trying to determine whether or not a biv increment occurs
	 during the lifetime of the giv, we can ignore uses of the variable
	 outside the loop because final_value is true.  Hence we can not
	 use regno_last_uid and regno_first_uid as above in record_giv.  */

      /* Search the loop to determine whether any assignments to the
	 biv occur during the giv's lifetime.  Start with the insn
	 that sets the giv, and search around the loop until we come
	 back to that insn again.

	 Also fail if there is a jump within the giv's lifetime that jumps
	 to somewhere outside the lifetime but still within the loop.  This
	 catches spaghetti code where the execution order is not linear, and
	 hence the above test fails.  Here we assume that the giv lifetime
	 does not extend from one iteration of the loop to the next, so as
	 to make the test easier.  Since the lifetime isn't known yet,
	 this requires two loops.  See also record_giv above.  */

      last_giv_use = v->insn;

      while (1)
	{
	  p = NEXT_INSN (p);
	  if (p == loop_end)
	    p = NEXT_INSN (loop_start);
	  if (p == v->insn)
	    break;

	  if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
	      || GET_CODE (p) == CALL_INSN)
	    {
	      if (biv_increment_seen)
		{
		  if (reg_mentioned_p (v->dest_reg, PATTERN (p)))
		    {
		      v->replaceable = 0;
		      v->not_replaceable = 1;
		      break;
		    }
		}
5103
	      else if (reg_set_p (v->src_reg, PATTERN (p)))
Richard Stallman committed
5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126
		biv_increment_seen = 1;
	      else if (reg_mentioned_p (v->dest_reg, PATTERN (p)))
		last_giv_use = p;
	    }
	}
      
      /* Now that the lifetime of the giv is known, check for branches
	 from within the lifetime to outside the lifetime if it is still
	 replaceable.  */

      if (v->replaceable)
	{
	  p = v->insn;
	  while (1)
	    {
	      p = NEXT_INSN (p);
	      if (p == loop_end)
		p = NEXT_INSN (loop_start);
	      if (p == last_giv_use)
		break;

	      if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
		  && LABEL_NAME (JUMP_LABEL (p))
5127 5128 5129 5130 5131
		  && ((INSN_UID (JUMP_LABEL (p)) >= max_uid_for_loop)
		      || (INSN_UID (v->insn) >= max_uid_for_loop)
		      || (INSN_UID (last_giv_use) >= max_uid_for_loop)
		      || (INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (v->insn)
			  && INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop_start))
Richard Stallman committed
5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178
		      || (INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (last_giv_use)
			  && INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop_end))))
		{
		  v->replaceable = 0;
		  v->not_replaceable = 1;

		  if (loop_dump_stream)
		    fprintf (loop_dump_stream,
			     "Found branch outside giv lifetime.\n");

		  break;
		}
	    }
	}

      /* If it is replaceable, then save the final value.  */
      if (v->replaceable)
	v->final_value = final_value;
    }

  if (loop_dump_stream && v->replaceable)
    fprintf (loop_dump_stream, "Insn %d: giv reg %d final_value replaceable\n",
	     INSN_UID (v->insn), REGNO (v->dest_reg));
}

/* Update the status of whether a giv can derive other givs.

   We need to do something special if there is or may be an update to the biv
   between the time the giv is defined and the time it is used to derive
   another giv.

   In addition, a giv that is only conditionally set is not allowed to
   derive another giv once a label has been passed.

   The cases we look at are when a label or an update to a biv is passed.  */

static void
update_giv_derive (p)
     rtx p;
{
  struct iv_class *bl;
  struct induction *biv, *giv;
  rtx tem;
  int dummy;

  /* Search all IV classes, then all bivs, and finally all givs.

5179
     There are three cases we are concerned with.  First we have the situation
Richard Stallman committed
5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194
     of a giv that is only updated conditionally.  In that case, it may not
     derive any givs after a label is passed.

     The second case is when a biv update occurs, or may occur, after the
     definition of a giv.  For certain biv updates (see below) that are
     known to occur between the giv definition and use, we can adjust the
     giv definition.  For others, or when the biv update is conditional,
     we must prevent the giv from deriving any other givs.  There are two
     sub-cases within this case.

     If this is a label, we are concerned with any biv update that is done
     conditionally, since it may be done after the giv is defined followed by
     a branch here (actually, we need to pass both a jump and a label, but
     this extra tracking doesn't seem worth it).

5195 5196 5197 5198 5199 5200
     If this is a jump, we are concerned about any biv update that may be
     executed multiple times.  We are actually only concerned about
     backward jumps, but it is probably not worth performing the test
     on the jump again here.

     If this is a biv update, we must adjust the giv status to show that a
Richard Stallman committed
5201 5202 5203 5204 5205
     subsequent biv update was performed.  If this adjustment cannot be done,
     the giv cannot derive further givs.  */

  for (bl = loop_iv_list; bl; bl = bl->next)
    for (biv = bl->biv; biv; biv = biv->next_iv)
5206 5207
      if (GET_CODE (p) == CODE_LABEL || GET_CODE (p) == JUMP_INSN
	  || biv->insn == p)
Richard Stallman committed
5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233
	{
	  for (giv = bl->giv; giv; giv = giv->next_iv)
	    {
	      /* If cant_derive is already true, there is no point in
		 checking all of these conditions again.  */
	      if (giv->cant_derive)
		continue;

	      /* If this giv is conditionally set and we have passed a label,
		 it cannot derive anything.  */
	      if (GET_CODE (p) == CODE_LABEL && ! giv->always_computable)
		giv->cant_derive = 1;

	      /* Skip givs that have mult_val == 0, since
		 they are really invariants.  Also skip those that are
		 replaceable, since we know their lifetime doesn't contain
		 any biv update.  */
	      else if (giv->mult_val == const0_rtx || giv->replaceable)
		continue;

	      /* The only way we can allow this giv to derive another
		 is if this is a biv increment and we can form the product
		 of biv->add_val and giv->mult_val.  In this case, we will
		 be able to compute a compensation.  */
	      else if (biv->insn == p)
		{
5234 5235 5236
		  tem = 0;

		  if (biv->mult_val == const1_rtx)
5237 5238 5239
		    tem = simplify_giv_expr (gen_rtx_MULT (giv->mode,
							   biv->add_val,
							   giv->mult_val),
5240 5241 5242
					     &dummy);

		  if (tem && giv->derive_adjustment)
5243 5244
		    tem = simplify_giv_expr (gen_rtx_PLUS (giv->mode, tem,
							   giv->derive_adjustment),
5245 5246
					     &dummy);
		  if (tem)
Richard Stallman committed
5247 5248 5249 5250
		    giv->derive_adjustment = tem;
		  else
		    giv->cant_derive = 1;
		}
5251 5252
	      else if ((GET_CODE (p) == CODE_LABEL && ! biv->always_computable)
		       || (GET_CODE (p) == JUMP_INSN && biv->maybe_multiple))
Richard Stallman committed
5253 5254 5255 5256 5257 5258
		giv->cant_derive = 1;
	    }
	}
}

/* Check whether an insn is an increment legitimate for a basic induction var.
5259 5260 5261
   X is the source of insn P, or a part of it.
   MODE is the mode in which X should be interpreted.

Richard Stallman committed
5262 5263
   DEST_REG is the putative biv, also the destination of the insn.
   We accept patterns of these forms:
5264
     REG = REG + INVARIANT (includes REG = REG - CONSTANT)
Richard Stallman committed
5265 5266 5267 5268 5269 5270 5271 5272
     REG = INVARIANT + REG

   If X is suitable, we return 1, set *MULT_VAL to CONST1_RTX,
   and store the additive term into *INC_VAL.

   If X is an assignment of an invariant into DEST_REG, we set
   *MULT_VAL to CONST0_RTX, and store the invariant into *INC_VAL.

5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292
   We also want to detect a BIV when it corresponds to a variable
   whose mode was promoted via PROMOTED_MODE.  In that case, an increment
   of the variable may be a PLUS that adds a SUBREG of that variable to
   an invariant and then sign- or zero-extends the result of the PLUS
   into the variable.

   Most GIVs in such cases will be in the promoted mode, since that is the
   probably the natural computation mode (and almost certainly the mode
   used for addresses) on the machine.  So we view the pseudo-reg containing
   the variable as the BIV, as if it were simply incremented.

   Note that treating the entire pseudo as a BIV will result in making
   simple increments to any GIVs based on it.  However, if the variable
   overflows in its declared mode but not its promoted mode, the result will
   be incorrect.  This is acceptable if the variable is signed, since 
   overflows in such cases are undefined, but not if it is unsigned, since
   those overflows are defined.  So we only check for SIGN_EXTEND and
   not ZERO_EXTEND.

   If we cannot find a biv, we return 0.  */
Richard Stallman committed
5293 5294

static int
5295
basic_induction_var (x, mode, dest_reg, p, inc_val, mult_val)
Richard Stallman committed
5296
     register rtx x;
5297
     enum machine_mode mode;
5298
     rtx p;
Richard Stallman committed
5299 5300 5301 5302 5303 5304
     rtx dest_reg;
     rtx *inc_val;
     rtx *mult_val;
{
  register enum rtx_code code;
  rtx arg;
5305
  rtx insn, set = 0;
Richard Stallman committed
5306 5307 5308 5309 5310

  code = GET_CODE (x);
  switch (code)
    {
    case PLUS:
5311
      if (rtx_equal_p (XEXP (x, 0), dest_reg)
5312 5313 5314
	  || (GET_CODE (XEXP (x, 0)) == SUBREG
	      && SUBREG_PROMOTED_VAR_P (XEXP (x, 0))
	      && SUBREG_REG (XEXP (x, 0)) == dest_reg))
Richard Stallman committed
5315
 	arg = XEXP (x, 1);
5316
      else if (rtx_equal_p (XEXP (x, 1), dest_reg)
5317
	       || (GET_CODE (XEXP (x, 1)) == SUBREG
5318 5319
		   && SUBREG_PROMOTED_VAR_P (XEXP (x, 1))
		   && SUBREG_REG (XEXP (x, 1)) == dest_reg))
Richard Stallman committed
5320 5321 5322 5323 5324 5325 5326
	arg = XEXP (x, 0);
      else
 	return 0;

      if (invariant_p (arg) != 1)
	return 0;

5327
      *inc_val = convert_modes (GET_MODE (dest_reg), GET_MODE (x), arg, 0);
Richard Stallman committed
5328 5329 5330
      *mult_val = const1_rtx;
      return 1;

5331 5332 5333 5334
    case SUBREG:
      /* If this is a SUBREG for a promoted variable, check the inner
	 value.  */
      if (SUBREG_PROMOTED_VAR_P (x))
5335 5336
	return basic_induction_var (SUBREG_REG (x), GET_MODE (SUBREG_REG (x)),
				    dest_reg, p, inc_val, mult_val);
5337
      return 0;
Richard Stallman committed
5338

5339
    case REG:
5340
      /* If this register is assigned in a previous insn, look at its
5341 5342
	 source, but don't go outside the loop or past a label.  */

5343 5344 5345 5346 5347 5348 5349
      insn = p;
      while (1)
	{
	  do {
	    insn = PREV_INSN (insn);
	  } while (insn && GET_CODE (insn) == NOTE
	           && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
5350

5351 5352 5353 5354 5355
          if (!insn)
	    break;
	  set = single_set (insn);
	  if (set == 0)
	    break;
5356

5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369
	  if ((SET_DEST (set) == x
	       || (GET_CODE (SET_DEST (set)) == SUBREG
		   && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
		       <= UNITS_PER_WORD)
		   && SUBREG_REG (SET_DEST (set)) == x))
	      && basic_induction_var (SET_SRC (set),
				      (GET_MODE (SET_SRC (set)) == VOIDmode
				       ? GET_MODE (x)
				       : GET_MODE (SET_SRC (set))),
				      dest_reg, insn,
				      inc_val, mult_val))
	    return 1;
	}
Mike Stump committed
5370
      /* ... fall through ...  */
Richard Stallman committed
5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381

      /* Can accept constant setting of biv only when inside inner most loop.
  	 Otherwise, a biv of an inner loop may be incorrectly recognized
	 as a biv of the outer loop,
	 causing code to be moved INTO the inner loop.  */
    case MEM:
      if (invariant_p (x) != 1)
	return 0;
    case CONST_INT:
    case SYMBOL_REF:
    case CONST:
Bill Moyer committed
5382 5383 5384 5385 5386 5387
      /* convert_modes aborts if we try to convert to or from CCmode, so just
         exclude that case.  It is very unlikely that a condition code value
	 would be a useful iterator anyways.  */
      if (loops_enclosed == 1
	  && GET_MODE_CLASS (mode) != MODE_CC
	  && GET_MODE_CLASS (GET_MODE (dest_reg)) != MODE_CC)
Richard Stallman committed
5388
 	{
5389 5390
	  /* Possible bug here?  Perhaps we don't know the mode of X.  */
	  *inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0);
Richard Stallman committed
5391 5392 5393 5394 5395 5396
 	  *mult_val = const0_rtx;
 	  return 1;
 	}
      else
 	return 0;

5397
    case SIGN_EXTEND:
5398 5399
      return basic_induction_var (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
				  dest_reg, p, inc_val, mult_val);
5400

5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416
    case ASHIFTRT:
      /* Similar, since this can be a sign extension.  */
      for (insn = PREV_INSN (p);
	   (insn && GET_CODE (insn) == NOTE
	    && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG);
	   insn = PREV_INSN (insn))
	;

      if (insn)
	set = single_set (insn);

      if (set && SET_DEST (set) == XEXP (x, 0)
	  && GET_CODE (XEXP (x, 1)) == CONST_INT
	  && INTVAL (XEXP (x, 1)) >= 0
	  && GET_CODE (SET_SRC (set)) == ASHIFT
	  && XEXP (x, 1) == XEXP (SET_SRC (set), 1))
5417 5418 5419
	return basic_induction_var (XEXP (SET_SRC (set), 0),
				    GET_MODE (XEXP (x, 0)),
				    dest_reg, insn, inc_val, mult_val);
5420 5421
      return 0;

Richard Stallman committed
5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441
    default:
      return 0;
    }
}

/* A general induction variable (giv) is any quantity that is a linear
   function   of a basic induction variable,
   i.e. giv = biv * mult_val + add_val.
   The coefficients can be any loop invariant quantity.
   A giv need not be computed directly from the biv;
   it can be computed by way of other givs.  */

/* Determine whether X computes a giv.
   If it does, return a nonzero value
     which is the benefit from eliminating the computation of X;
   set *SRC_REG to the register of the biv that it is computed from;
   set *ADD_VAL and *MULT_VAL to the coefficients,
     such that the value of X is biv * mult + add;  */

static int
5442
general_induction_var (x, src_reg, add_val, mult_val, is_addr, pbenefit)
Richard Stallman committed
5443 5444 5445 5446
     rtx x;
     rtx *src_reg;
     rtx *add_val;
     rtx *mult_val;
5447 5448
     int is_addr;
     int *pbenefit;
Richard Stallman committed
5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459
{
  rtx orig_x = x;
  char *storage;

  /* If this is an invariant, forget it, it isn't a giv.  */
  if (invariant_p (x) == 1)
    return 0;

  /* See if the expression could be a giv and get its form.
     Mark our place on the obstack in case we don't find a giv.  */
  storage = (char *) oballoc (0);
5460 5461
  *pbenefit = 0;
  x = simplify_giv_expr (x, pbenefit);
Richard Stallman committed
5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520
  if (x == 0)
    {
      obfree (storage);
      return 0;
    }

  switch (GET_CODE (x))
    {
    case USE:
    case CONST_INT:
      /* Since this is now an invariant and wasn't before, it must be a giv
	 with MULT_VAL == 0.  It doesn't matter which BIV we associate this
	 with.  */
      *src_reg = loop_iv_list->biv->dest_reg;
      *mult_val = const0_rtx;
      *add_val = x;
      break;

    case REG:
      /* This is equivalent to a BIV.  */
      *src_reg = x;
      *mult_val = const1_rtx;
      *add_val = const0_rtx;
      break;

    case PLUS:
      /* Either (plus (biv) (invar)) or
	 (plus (mult (biv) (invar_1)) (invar_2)).  */
      if (GET_CODE (XEXP (x, 0)) == MULT)
	{
	  *src_reg = XEXP (XEXP (x, 0), 0);
	  *mult_val = XEXP (XEXP (x, 0), 1);
	}
      else
	{
	  *src_reg = XEXP (x, 0);
	  *mult_val = const1_rtx;
	}
      *add_val = XEXP (x, 1);
      break;

    case MULT:
      /* ADD_VAL is zero.  */
      *src_reg = XEXP (x, 0);
      *mult_val = XEXP (x, 1);
      *add_val = const0_rtx;
      break;

    default:
      abort ();
    }

  /* Remove any enclosing USE from ADD_VAL and MULT_VAL (there will be
     unless they are CONST_INT).  */
  if (GET_CODE (*add_val) == USE)
    *add_val = XEXP (*add_val, 0);
  if (GET_CODE (*mult_val) == USE)
    *mult_val = XEXP (*mult_val, 0);

5521 5522 5523 5524 5525 5526 5527 5528 5529 5530
  if (is_addr)
    {
#ifdef ADDRESS_COST
      *pbenefit += ADDRESS_COST (orig_x) - reg_address_cost;
#else
      *pbenefit += rtx_cost (orig_x, MEM) - reg_address_cost;
#endif
    }
  else
    *pbenefit += rtx_cost (orig_x, SET);
Richard Stallman committed
5531

5532 5533 5534 5535
  /* Always return true if this is a giv so it will be detected as such,
     even if the benefit is zero or negative.  This allows elimination  
     of bivs that might otherwise not be eliminated.  */                
  return 1;                                                             
Richard Stallman committed
5536 5537 5538 5539 5540 5541
}

/* Given an expression, X, try to form it as a linear function of a biv.
   We will canonicalize it to be of the form
   	(plus (mult (BIV) (invar_1))
	      (invar_2))
5542
   with possible degeneracies.
Richard Stallman committed
5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557

   The invariant expressions must each be of a form that can be used as a
   machine operand.  We surround then with a USE rtx (a hack, but localized
   and certainly unambiguous!) if not a CONST_INT for simplicity in this
   routine; it is the caller's responsibility to strip them.

   If no such canonicalization is possible (i.e., two biv's are used or an
   expression that is neither invariant nor a biv or giv), this routine
   returns 0.

   For a non-zero return, the result will have a code of CONST_INT, USE,
   REG (for a BIV), PLUS, or MULT.  No other codes will occur.  

   *BENEFIT will be incremented by the benefit of any sub-giv encountered.  */

5558 5559 5560
static rtx sge_plus PROTO ((enum machine_mode, rtx, rtx));
static rtx sge_plus_constant PROTO ((rtx, rtx));

Richard Stallman committed
5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573
static rtx
simplify_giv_expr (x, benefit)
     rtx x;
     int *benefit;
{
  enum machine_mode mode = GET_MODE (x);
  rtx arg0, arg1;
  rtx tem;

  /* If this is not an integer mode, or if we cannot do arithmetic in this
     mode, this can't be a giv.  */
  if (mode != VOIDmode
      && (GET_MODE_CLASS (mode) != MODE_INT
5574
	  || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT))
5575
    return NULL_RTX;
Richard Stallman committed
5576 5577 5578 5579 5580 5581 5582

  switch (GET_CODE (x))
    {
    case PLUS:
      arg0 = simplify_giv_expr (XEXP (x, 0), benefit);
      arg1 = simplify_giv_expr (XEXP (x, 1), benefit);
      if (arg0 == 0 || arg1 == 0)
5583
	return NULL_RTX;
Richard Stallman committed
5584 5585 5586 5587

      /* Put constant last, CONST_INT last if both constant.  */
      if ((GET_CODE (arg0) == USE
	   || GET_CODE (arg0) == CONST_INT)
5588 5589 5590
	  && ! ((GET_CODE (arg0) == USE
		 && GET_CODE (arg1) == USE)
		|| GET_CODE (arg1) == CONST_INT))
Richard Stallman committed
5591 5592 5593 5594 5595 5596 5597 5598 5599 5600
	tem = arg0, arg0 = arg1, arg1 = tem;

      /* Handle addition of zero, then addition of an invariant.  */
      if (arg1 == const0_rtx)
	return arg0;
      else if (GET_CODE (arg1) == CONST_INT || GET_CODE (arg1) == USE)
	switch (GET_CODE (arg0))
	  {
	  case CONST_INT:
	  case USE:
5601 5602
	    /* Adding two invariants must result in an invariant, so enclose
 	       addition operation inside a USE and return it.  */
Richard Stallman committed
5603 5604
	    if (GET_CODE (arg0) == USE)
	      arg0 = XEXP (arg0, 0);
5605 5606 5607
	    if (GET_CODE (arg1) == USE)
	      arg1 = XEXP (arg1, 0);

5608 5609 5610 5611
	    if (GET_CODE (arg0) == CONST_INT)
	      tem = arg0, arg0 = arg1, arg1 = tem;
	    if (GET_CODE (arg1) == CONST_INT)
	      tem = sge_plus_constant (arg0, arg1);
5612
	    else
5613
	      tem = sge_plus (mode, arg0, arg1);
Richard Stallman committed
5614

5615 5616
	    if (GET_CODE (tem) != CONST_INT)
	      tem = gen_rtx_USE (mode, tem);
Richard Stallman committed
5617 5618 5619 5620 5621
	    return tem;

	  case REG:
	  case MULT:
	    /* biv + invar or mult + invar.  Return sum.  */
5622
	    return gen_rtx_PLUS (mode, arg0, arg1);
Richard Stallman committed
5623 5624 5625

	  case PLUS:
	    /* (a + invar_1) + invar_2.  Associate.  */
5626 5627 5628 5629
	    return simplify_giv_expr (
		gen_rtx_PLUS (mode, XEXP (arg0, 0),
			      gen_rtx_PLUS (mode, XEXP (arg0, 1), arg1)),
		benefit);
Richard Stallman committed
5630 5631 5632 5633 5634 5635 5636 5637

	  default:
	    abort ();
	  }

      /* Each argument must be either REG, PLUS, or MULT.  Convert REG to
	 MULT to reduce cases.  */
      if (GET_CODE (arg0) == REG)
5638
	arg0 = gen_rtx_MULT (mode, arg0, const1_rtx);
Richard Stallman committed
5639
      if (GET_CODE (arg1) == REG)
5640
	arg1 = gen_rtx_MULT (mode, arg1, const1_rtx);
Richard Stallman committed
5641 5642 5643 5644 5645 5646 5647 5648

      /* Now have PLUS + PLUS, PLUS + MULT, MULT + PLUS, or MULT + MULT.
	 Put a MULT first, leaving PLUS + PLUS, MULT + PLUS, or MULT + MULT.
	 Recurse to associate the second PLUS.  */
      if (GET_CODE (arg1) == MULT)
	tem = arg0, arg0 = arg1, arg1 = tem;

      if (GET_CODE (arg1) == PLUS)
5649 5650 5651 5652
	  return simplify_giv_expr (gen_rtx_PLUS (mode,
						  gen_rtx_PLUS (mode, arg0,
								XEXP (arg1, 0)),
						  XEXP (arg1, 1)),
Richard Stallman committed
5653 5654 5655 5656
				    benefit);

      /* Now must have MULT + MULT.  Distribute if same biv, else not giv.  */
      if (GET_CODE (arg0) != MULT || GET_CODE (arg1) != MULT)
5657
	return NULL_RTX;
Richard Stallman committed
5658

5659 5660
      if (!rtx_equal_p (arg0, arg1))
	return NULL_RTX;
Richard Stallman committed
5661

5662 5663 5664 5665 5666
      return simplify_giv_expr (gen_rtx_MULT (mode,
					      XEXP (arg0, 0),
					      gen_rtx_PLUS (mode,
							    XEXP (arg0, 1),
							    XEXP (arg1, 1))),
Richard Stallman committed
5667 5668 5669
				benefit);

    case MINUS:
Mike Stump committed
5670
      /* Handle "a - b" as "a + b * (-1)".  */
5671 5672 5673 5674
      return simplify_giv_expr (gen_rtx_PLUS (mode,
					      XEXP (x, 0),
					      gen_rtx_MULT (mode, XEXP (x, 1),
							    constm1_rtx)),
Richard Stallman committed
5675 5676 5677 5678 5679 5680
				benefit);

    case MULT:
      arg0 = simplify_giv_expr (XEXP (x, 0), benefit);
      arg1 = simplify_giv_expr (XEXP (x, 1), benefit);
      if (arg0 == 0 || arg1 == 0)
5681
	return NULL_RTX;
Richard Stallman committed
5682 5683 5684 5685 5686 5687 5688 5689

      /* Put constant last, CONST_INT last if both constant.  */
      if ((GET_CODE (arg0) == USE || GET_CODE (arg0) == CONST_INT)
	  && GET_CODE (arg1) != CONST_INT)
	tem = arg0, arg0 = arg1, arg1 = tem;

      /* If second argument is not now constant, not giv.  */
      if (GET_CODE (arg1) != USE && GET_CODE (arg1) != CONST_INT)
5690
	return NULL_RTX;
Richard Stallman committed
5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702

      /* Handle multiply by 0 or 1.  */
      if (arg1 == const0_rtx)
	return const0_rtx;

      else if (arg1 == const1_rtx)
	return arg0;

      switch (GET_CODE (arg0))
	{
	case REG:
	  /* biv * invar.  Done.  */
5703
	  return gen_rtx_MULT (mode, arg0, arg1);
Richard Stallman committed
5704 5705 5706

	case CONST_INT:
	  /* Product of two constants.  */
5707
	  return GEN_INT (INTVAL (arg0) * INTVAL (arg1));
Richard Stallman committed
5708 5709

	case USE:
5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728
	  /* invar * invar.  It is a giv, but very few of these will 
	     actually pay off, so limit to simple registers.  */
	  if (GET_CODE (arg1) != CONST_INT)
	    return NULL_RTX;

	  arg0 = XEXP (arg0, 0);
	  if (GET_CODE (arg0) == REG)
	    tem = gen_rtx_MULT (mode, arg0, arg1);
	  else if (GET_CODE (arg0) == MULT
		   && GET_CODE (XEXP (arg0, 0)) == REG
		   && GET_CODE (XEXP (arg0, 1)) == CONST_INT)
	    {
	      tem = gen_rtx_MULT (mode, XEXP (arg0, 0), 
				  GEN_INT (INTVAL (XEXP (arg0, 1))
					   * INTVAL (arg1)));
	    }
	  else
	    return NULL_RTX;
	  return gen_rtx_USE (mode, tem);
Richard Stallman committed
5729 5730 5731

	case MULT:
	  /* (a * invar_1) * invar_2.  Associate.  */
5732 5733 5734 5735
	  return simplify_giv_expr (gen_rtx_MULT (mode, XEXP (arg0, 0),
						  gen_rtx_MULT (mode,
								XEXP (arg0, 1),
								arg1)),
Richard Stallman committed
5736 5737 5738 5739
				    benefit);

	case PLUS:
	  /* (a + invar_1) * invar_2.  Distribute.  */
5740 5741 5742 5743 5744 5745 5746
	  return simplify_giv_expr (gen_rtx_PLUS (mode,
						  gen_rtx_MULT (mode,
								XEXP (arg0, 0),
								arg1),
						  gen_rtx_MULT (mode,
								XEXP (arg0, 1),
								arg1)),
Richard Stallman committed
5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757
				    benefit);

	default:
	  abort ();
	}

    case ASHIFT:
      /* Shift by constant is multiply by power of two.  */
      if (GET_CODE (XEXP (x, 1)) != CONST_INT)
	return 0;

5758 5759 5760 5761
      return simplify_giv_expr (gen_rtx_MULT (mode,
					      XEXP (x, 0),
					      GEN_INT ((HOST_WIDE_INT) 1
						       << INTVAL (XEXP (x, 1)))),
Richard Stallman committed
5762 5763 5764 5765
				benefit);

    case NEG:
      /* "-a" is "a * (-1)" */
5766
      return simplify_giv_expr (gen_rtx_MULT (mode, XEXP (x, 0), constm1_rtx),
Richard Stallman committed
5767 5768 5769 5770
				benefit);

    case NOT:
      /* "~a" is "-a - 1". Silly, but easy.  */
5771 5772 5773
      return simplify_giv_expr (gen_rtx_MINUS (mode,
					       gen_rtx_NEG (mode, XEXP (x, 0)),
					       const1_rtx),
Richard Stallman committed
5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799
				benefit);

    case USE:
      /* Already in proper form for invariant.  */
      return x;

    case REG:
      /* If this is a new register, we can't deal with it.  */
      if (REGNO (x) >= max_reg_before_loop)
	return 0;

      /* Check for biv or giv.  */
      switch (reg_iv_type[REGNO (x)])
	{
	case BASIC_INDUCT:
	  return x;
	case GENERAL_INDUCT:
	  {
	    struct induction *v = reg_iv_info[REGNO (x)];

	    /* Form expression from giv and add benefit.  Ensure this giv
	       can derive another and subtract any needed adjustment if so.  */
	    *benefit += v->benefit;
	    if (v->cant_derive)
	      return 0;

5800 5801
	    tem = gen_rtx_PLUS (mode, gen_rtx_MULT (mode, v->src_reg,
						    v->mult_val),
Richard Stallman committed
5802 5803
			   v->add_val);
	    if (v->derive_adjustment)
5804
	      tem = gen_rtx_MINUS (mode, tem, v->derive_adjustment);
Richard Stallman committed
5805 5806
	    return simplify_giv_expr (tem, benefit);
	  }
5807 5808

	default:
5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874
	  /* If it isn't an induction variable, and it is invariant, we
	     may be able to simplify things further by looking through
	     the bits we just moved outside the loop.  */
	  if (invariant_p (x) == 1)
	    {
	      struct movable *m;

	      for (m = the_movables; m ; m = m->next)
		if (rtx_equal_p (x, m->set_dest))
		  {
		    /* Ok, we found a match.  Substitute and simplify.  */

		    /* If we match another movable, we must use that, as 
		       this one is going away.  */
		    if (m->match)
		      return simplify_giv_expr (m->match->set_dest, benefit);

		    /* If consec is non-zero, this is a member of a group of
		       instructions that were moved together.  We handle this
		       case only to the point of seeking to the last insn and
		       looking for a REG_EQUAL.  Fail if we don't find one.  */
		    if (m->consec != 0)
		      {
			int i = m->consec;
			tem = m->insn;
			do { tem = NEXT_INSN (tem); } while (--i > 0);

			tem = find_reg_note (tem, REG_EQUAL, NULL_RTX);
			if (tem)
			  tem = XEXP (tem, 0);
		      }
		    else
		      {
		        tem = single_set (m->insn);
		        if (tem)
			  tem = SET_SRC (tem);
		      }

		    if (tem)
		      {
			/* What we are most interested in is pointer
			   arithmetic on invariants -- only take
			   patterns we may be able to do something with.  */
			if (GET_CODE (tem) == PLUS
			    || GET_CODE (tem) == MULT
			    || GET_CODE (tem) == ASHIFT
			    || GET_CODE (tem) == CONST_INT
			    || GET_CODE (tem) == SYMBOL_REF)
			  {
			    tem = simplify_giv_expr (tem, benefit);
			    if (tem)
			      return tem;
			  }
			else if (GET_CODE (tem) == CONST
			    && GET_CODE (XEXP (tem, 0)) == PLUS
			    && GET_CODE (XEXP (XEXP (tem, 0), 0)) == SYMBOL_REF
			    && GET_CODE (XEXP (XEXP (tem, 0), 1)) == CONST_INT)
			  {
			    tem = simplify_giv_expr (XEXP (tem, 0), benefit);
			    if (tem)
			      return tem;
			  }
		      }
		    break;
		  }
	    }
5875
	  break;
Richard Stallman committed
5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888
	}

      /* Fall through to general case.  */
    default:
      /* If invariant, return as USE (unless CONST_INT).
	 Otherwise, not giv.  */
      if (GET_CODE (x) == USE)
	x = XEXP (x, 0);

      if (invariant_p (x) == 1)
	{
	  if (GET_CODE (x) == CONST_INT)
	    return x;
5889 5890 5891 5892 5893 5894
	  if (GET_CODE (x) == CONST
	      && GET_CODE (XEXP (x, 0)) == PLUS
	      && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
	      && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
	    x = XEXP (x, 0);
	  return gen_rtx_USE (mode, x);
Richard Stallman committed
5895 5896 5897 5898 5899
	}
      else
	return 0;
    }
}
5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949

/* This routine folds invariants such that there is only ever one
   CONST_INT in the summation.  It is only used by simplify_giv_expr.  */

static rtx
sge_plus_constant (x, c)
     rtx x, c;
{
  if (GET_CODE (x) == CONST_INT)
    return GEN_INT (INTVAL (x) + INTVAL (c));
  else if (GET_CODE (x) != PLUS)
    return gen_rtx_PLUS (GET_MODE (x), x, c);
  else if (GET_CODE (XEXP (x, 1)) == CONST_INT)
    {
      return gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0),
			   GEN_INT (INTVAL (XEXP (x, 1)) + INTVAL (c)));
    }
  else if (GET_CODE (XEXP (x, 0)) == PLUS
	   || GET_CODE (XEXP (x, 1)) != PLUS)
    {
      return gen_rtx_PLUS (GET_MODE (x),
			   sge_plus_constant (XEXP (x, 0), c), XEXP (x, 1));
    }
  else
    {
      return gen_rtx_PLUS (GET_MODE (x),
			   sge_plus_constant (XEXP (x, 1), c), XEXP (x, 0));
    }
}

static rtx
sge_plus (mode, x, y)
     enum machine_mode mode;
     rtx x, y;
{
  while (GET_CODE (y) == PLUS)
    {
      rtx a = XEXP (y, 0);
      if (GET_CODE (a) == CONST_INT)
	x = sge_plus_constant (x, a);
      else
	x = gen_rtx_PLUS (mode, x, a);
      y = XEXP (y, 1);
    }
  if (GET_CODE (y) == CONST_INT)
    x = sge_plus_constant (x, y);
  else
    x = gen_rtx_PLUS (mode, x, y);
  return x;
}
Richard Stallman committed
5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971

/* Help detect a giv that is calculated by several consecutive insns;
   for example,
      giv = biv * M
      giv = giv + A
   The caller has already identified the first insn P as having a giv as dest;
   we check that all other insns that set the same register follow
   immediately after P, that they alter nothing else,
   and that the result of the last is still a giv.

   The value is 0 if the reg set in P is not really a giv.
   Otherwise, the value is the amount gained by eliminating
   all the consecutive insns that compute the value.

   FIRST_BENEFIT is the amount gained by eliminating the first insn, P.
   SRC_REG is the reg of the biv; DEST_REG is the reg of the giv.

   The coefficients of the ultimate giv value are stored in
   *MULT_VAL and *ADD_VAL.  */

static int
consec_sets_giv (first_benefit, p, src_reg, dest_reg,
5972
		 add_val, mult_val, last_consec_insn)
Richard Stallman committed
5973 5974 5975 5976 5977 5978
     int first_benefit;
     rtx p;
     rtx src_reg;
     rtx dest_reg;
     rtx *add_val;
     rtx *mult_val;
5979
     rtx *last_consec_insn;
Richard Stallman committed
5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005
{
  int count;
  enum rtx_code code;
  int benefit;
  rtx temp;
  rtx set;

  /* Indicate that this is a giv so that we can update the value produced in
     each insn of the multi-insn sequence. 

     This induction structure will be used only by the call to
     general_induction_var below, so we can allocate it on our stack.
     If this is a giv, our caller will replace the induct var entry with
     a new induction structure.  */
  struct induction *v
    = (struct induction *) alloca (sizeof (struct induction));
  v->src_reg = src_reg;
  v->mult_val = *mult_val;
  v->add_val = *add_val;
  v->benefit = first_benefit;
  v->cant_derive = 0;
  v->derive_adjustment = 0;

  reg_iv_type[REGNO (dest_reg)] = GENERAL_INDUCT;
  reg_iv_info[REGNO (dest_reg)] = v;

6006
  count = VARRAY_INT (n_times_set, REGNO (dest_reg)) - 1;
Richard Stallman committed
6007 6008 6009 6010 6011 6012 6013

  while (count > 0)
    {
      p = NEXT_INSN (p);
      code = GET_CODE (p);

      /* If libcall, skip to end of call sequence.  */
6014
      if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
Richard Stallman committed
6015 6016 6017 6018 6019 6020
	p = XEXP (temp, 0);

      if (code == INSN
	  && (set = single_set (p))
	  && GET_CODE (SET_DEST (set)) == REG
	  && SET_DEST (set) == dest_reg
6021 6022
	  && (general_induction_var (SET_SRC (set), &src_reg,
				     add_val, mult_val, 0, &benefit)
Richard Stallman committed
6023
	      /* Giv created by equivalent expression.  */
6024
	      || ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX))
6025 6026
		  && general_induction_var (XEXP (temp, 0), &src_reg,
					    add_val, mult_val, 0, &benefit)))
Richard Stallman committed
6027 6028
	  && src_reg == v->src_reg)
	{
6029
	  if (find_reg_note (p, REG_RETVAL, NULL_RTX))
Richard Stallman committed
6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052
	    benefit += libcall_benefit (p);

	  count--;
	  v->mult_val = *mult_val;
	  v->add_val = *add_val;
	  v->benefit = benefit;
	}
      else if (code != NOTE)
	{
	  /* Allow insns that set something other than this giv to a
	     constant.  Such insns are needed on machines which cannot
	     include long constants and should not disqualify a giv.  */
	  if (code == INSN
	      && (set = single_set (p))
	      && SET_DEST (set) != dest_reg
	      && CONSTANT_P (SET_SRC (set)))
	    continue;

	  reg_iv_type[REGNO (dest_reg)] = UNKNOWN_INDUCT;
	  return 0;
	}
    }

6053
  *last_consec_insn = p;
Richard Stallman committed
6054 6055 6056 6057 6058 6059 6060 6061
  return v->benefit;
}

/* Return an rtx, if any, that expresses giv G2 as a function of the register
   represented by G1.  If no such expression can be found, or it is clear that
   it cannot possibly be a valid address, 0 is returned. 

   To perform the computation, we note that
6062 6063
   	G1 = x * v + a		and
	G2 = y * v + b
Richard Stallman committed
6064 6065
   where `v' is the biv.

6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133
   So G2 = (y/b) * G1 + (b - a*y/x).

   Note that MULT = y/x.

   Update: A and B are now allowed to be additive expressions such that
   B contains all variables in A.  That is, computing B-A will not require
   subtracting variables.  */

static rtx
express_from_1 (a, b, mult)
     rtx a, b, mult;
{
  /* If MULT is zero, then A*MULT is zero, and our expression is B.  */

  if (mult == const0_rtx)
    return b;

  /* If MULT is not 1, we cannot handle A with non-constants, since we
     would then be required to subtract multiples of the registers in A.
     This is theoretically possible, and may even apply to some Fortran
     constructs, but it is a lot of work and we do not attempt it here.  */

  if (mult != const1_rtx && GET_CODE (a) != CONST_INT)
    return NULL_RTX;

  /* In general these structures are sorted top to bottom (down the PLUS
     chain), but not left to right across the PLUS.  If B is a higher
     order giv than A, we can strip one level and recurse.  If A is higher
     order, we'll eventually bail out, but won't know that until the end.
     If they are the same, we'll strip one level around this loop.  */

  while (GET_CODE (a) == PLUS && GET_CODE (b) == PLUS)
    {
      rtx ra, rb, oa, ob, tmp;

      ra = XEXP (a, 0), oa = XEXP (a, 1);
      if (GET_CODE (ra) == PLUS)
        tmp = ra, ra = oa, oa = tmp;

      rb = XEXP (b, 0), ob = XEXP (b, 1);
      if (GET_CODE (rb) == PLUS)
        tmp = rb, rb = ob, ob = tmp;

      if (rtx_equal_p (ra, rb))
	/* We matched: remove one reg completely.  */
	a = oa, b = ob;
      else if (GET_CODE (ob) != PLUS && rtx_equal_p (ra, ob))
	/* An alternate match.  */
	a = oa, b = rb;
      else if (GET_CODE (oa) != PLUS && rtx_equal_p (oa, rb))
	/* An alternate match.  */
	a = ra, b = ob;
      else
	{
          /* Indicates an extra register in B.  Strip one level from B and 
	     recurse, hoping B was the higher order expression.  */
	  ob = express_from_1 (a, ob, mult);
	  if (ob == NULL_RTX)
	    return NULL_RTX;
	  return gen_rtx_PLUS (GET_MODE (b), rb, ob);
	}
    }

  /* Here we are at the last level of A, go through the cases hoping to
     get rid of everything but a constant.  */

  if (GET_CODE (a) == PLUS)
    {
6134
      rtx ra, oa;
6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164

      ra = XEXP (a, 0), oa = XEXP (a, 1);
      if (rtx_equal_p (oa, b))
	oa = ra;
      else if (!rtx_equal_p (ra, b))
	return NULL_RTX;

      if (GET_CODE (oa) != CONST_INT)
	return NULL_RTX;

      return GEN_INT (-INTVAL (oa) * INTVAL (mult));
    }
  else if (GET_CODE (a) == CONST_INT)
    {
      return plus_constant (b, -INTVAL (a) * INTVAL (mult));
    }
  else if (GET_CODE (b) == PLUS)
    {
      if (rtx_equal_p (a, XEXP (b, 0)))
	return XEXP (b, 1);
      else if (rtx_equal_p (a, XEXP (b, 1)))
	return XEXP (b, 0);
      else
	return NULL_RTX;
    }
  else if (rtx_equal_p (a, b))
    return const0_rtx;

  return NULL_RTX;
}
Richard Stallman committed
6165 6166 6167 6168 6169 6170 6171 6172 6173 6174

static rtx
express_from (g1, g2)
     struct induction *g1, *g2;
{
  rtx mult, add;

  /* The value that G1 will be multiplied by must be a constant integer.  Also,
     the only chance we have of getting a valid address is if b*c/a (see above
     for notation) is also an integer.  */
6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189
  if (GET_CODE (g1->mult_val) == CONST_INT
      && GET_CODE (g2->mult_val) == CONST_INT)
    {
      if (g1->mult_val == const0_rtx
          || INTVAL (g2->mult_val) % INTVAL (g1->mult_val) != 0)
        return NULL_RTX;
      mult = GEN_INT (INTVAL (g2->mult_val) / INTVAL (g1->mult_val));
    }
  else if (rtx_equal_p (g1->mult_val, g2->mult_val))
    mult = const1_rtx;
  else
    {
      /* ??? Find out if the one is a multiple of the other?  */
      return NULL_RTX;
    }
Richard Stallman committed
6190

6191 6192 6193
  add = express_from_1 (g1->add_val, g2->add_val, mult);
  if (add == NULL_RTX)
    return NULL_RTX;
Richard Stallman committed
6194 6195 6196 6197 6198 6199 6200

  /* Form simplified final result.  */
  if (mult == const0_rtx)
    return add;
  else if (mult == const1_rtx)
    mult = g1->dest_reg;
  else
6201
    mult = gen_rtx_MULT (g2->mode, g1->dest_reg, mult);
Richard Stallman committed
6202 6203 6204 6205

  if (add == const0_rtx)
    return mult;
  else
6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217
    {
      if (GET_CODE (add) == PLUS
	  && CONSTANT_P (XEXP (add, 1)))
	{
	  rtx tem = XEXP (add, 1);
	  mult = gen_rtx_PLUS (g2->mode, mult, XEXP (add, 0));
	  add = tem;
	}
      
      return gen_rtx_PLUS (g2->mode, mult, add);
    }
  
Richard Stallman committed
6218 6219
}

6220 6221 6222 6223
/* Return an rtx, if any, that expresses giv G2 as a function of the register
   represented by G1.  This indicates that G2 should be combined with G1 and
   that G2 can use (either directly or via an address expression) a register
   used to represent G1.  */
Richard Stallman committed
6224

6225
static rtx
Richard Stallman committed
6226 6227 6228
combine_givs_p (g1, g2)
     struct induction *g1, *g2;
{
6229
  rtx tem = express_from (g1, g2);
Richard Stallman committed
6230

6231 6232 6233
  /* If these givs are identical, they can be combined.  We use the results
     of express_from because the addends are not in a canonical form, so
     rtx_equal_p is a weaker test.  */
6234
  if (tem == g1->dest_reg)
Richard Stallman committed
6235
    {
6236
      return g1->dest_reg;
Richard Stallman committed
6237 6238 6239 6240 6241
    }

  /* If G2 can be expressed as a function of G1 and that function is valid
     as an address and no more expensive than using a register for G2,
     the expression of G2 in terms of G1 can be used.  */
6242 6243
  if (tem != NULL_RTX
      && g2->giv_type == DEST_ADDR
Richard Stallman committed
6244
      && memory_address_p (g2->mem_mode, tem)
6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255
      /* ??? Looses, especially with -fforce-addr, where *g2->location
	 will always be a register, and so anything more complicated
	 gets discarded.  */
#if 0
#ifdef ADDRESS_COST
      && ADDRESS_COST (tem) <= ADDRESS_COST (*g2->location)
#else
      && rtx_cost (tem, MEM) <= rtx_cost (*g2->location, MEM)
#endif
#endif
      )
Richard Stallman committed
6256
    {
6257
      return tem;
Richard Stallman committed
6258 6259
    }

6260
  return NULL_RTX;
Richard Stallman committed
6261 6262
}

6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280
struct combine_givs_stats
{
  int giv_number;
  int total_benefit;
};

static int
cmp_combine_givs_stats (x, y)
     struct combine_givs_stats *x, *y;
{
  int d;
  d = y->total_benefit - x->total_benefit;
  /* Stabilize the sort.  */
  if (!d)
    d = x->giv_number - y->giv_number;
  return d;
}

6281 6282
/* If one of these givs is a DEST_REG that was used by the other giv,
   this is actually a single use.  Return 0 if this is not
6283
   the case, -1 if g1 is the DEST_REG involved, and 1 if it was g2.  */
6284 6285

static int
6286
combine_givs_used_by_other (g1, g2)
6287
     struct induction *g1, *g2;
6288
{
6289 6290 6291 6292 6293 6294 6295
  if (g1->giv_type == DEST_REG
      && reg_mentioned_p (g1->dest_reg, PATTERN (g2->insn)))
    return -1;

  if (g2->giv_type == DEST_REG
      && reg_mentioned_p (g2->dest_reg, PATTERN (g1->insn)))
    return 1;
6296 6297 6298

  return 0;
}
6299 6300 6301 6302 6303
 
static int
combine_givs_benefit_from (g1, g2)
     struct induction *g1, *g2;
{
6304
  int tmp = combine_givs_used_by_other (g1, g2);
6305 6306 6307 6308 6309 6310 6311
  if (tmp < 0)
    return 0;
  else if (tmp > 0)
    return g2->benefit - g1->benefit;
  else
    return g2->benefit;
}
6312

Richard Stallman committed
6313 6314 6315 6316 6317 6318 6319 6320 6321
/* Check all pairs of givs for iv_class BL and see if any can be combined with
   any other.  If so, point SAME to the giv combined with and set NEW_REG to
   be an expression (in terms of the other giv's DEST_REG) equivalent to the
   giv.  Also, update BENEFIT and related fields for cost/benefit analysis.  */

static void
combine_givs (bl)
     struct iv_class *bl;
{
6322
  struct induction *g1, *g2, **giv_array;
6323 6324 6325
  int i, j, k, giv_count;
  struct combine_givs_stats *stats;
  rtx *can_combine;
Richard Stallman committed
6326

6327 6328
  /* Count givs, because bl->giv_count is incorrect here.  */
  giv_count = 0;
Richard Stallman committed
6329
  for (g1 = bl->giv; g1; g1 = g1->next_iv)
6330 6331
    if (!g1->ignore)
      giv_count++;
6332 6333 6334 6335 6336

  giv_array
    = (struct induction **) alloca (giv_count * sizeof (struct induction *));
  i = 0;
  for (g1 = bl->giv; g1; g1 = g1->next_iv)
6337 6338
    if (!g1->ignore)
      giv_array[i++] = g1;
6339

6340
  stats = (struct combine_givs_stats *) alloca (giv_count * sizeof (*stats));
6341
  bzero ((char *) stats, giv_count * sizeof (*stats));
6342

6343
  can_combine = (rtx *) alloca (giv_count * giv_count * sizeof(rtx));
6344
  bzero ((char *) can_combine, giv_count * giv_count * sizeof(rtx));
6345 6346 6347

  for (i = 0; i < giv_count; i++)
    {
6348 6349
      int this_benefit;

6350
      g1 = giv_array[i];
6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423

      this_benefit = g1->benefit;
      /* Add an additional weight for zero addends.  */
      if (g1->no_const_addval)
	this_benefit += 1;
      for (j = 0; j < giv_count; j++)
	{
	  rtx this_combine;

	  g2 = giv_array[j];
	  if (g1 != g2
	      && (this_combine = combine_givs_p (g1, g2)) != NULL_RTX)
	    {
	      can_combine[i*giv_count + j] = this_combine;
	      this_benefit += combine_givs_benefit_from (g1, g2);
	      /* Add an additional weight for being reused more times.  */
	      this_benefit += 3;
	    }
	}
      stats[i].giv_number = i;
      stats[i].total_benefit = this_benefit;
    }

  /* Iterate, combining until we can't.  */
restart:
  qsort (stats, giv_count, sizeof(*stats), cmp_combine_givs_stats);

  if (loop_dump_stream)
    {
      fprintf (loop_dump_stream, "Sorted combine statistics:\n");
      for (k = 0; k < giv_count; k++)
	{
	  g1 = giv_array[stats[k].giv_number];
	  if (!g1->combined_with && !g1->same)
	    fprintf (loop_dump_stream, " {%d, %d}", 
		     INSN_UID (giv_array[stats[k].giv_number]->insn),
		     stats[k].total_benefit);
	}
      putc ('\n', loop_dump_stream);
    }

  for (k = 0; k < giv_count; k++)
    {
      int g1_add_benefit = 0;

      i = stats[k].giv_number;
      g1 = giv_array[i];

      /* If it has already been combined, skip.  */
      if (g1->combined_with || g1->same)
	continue;

      for (j = 0; j < giv_count; j++)
	{
	  g2 = giv_array[j];
	  if (g1 != g2 && can_combine[i*giv_count + j]
	      /* If it has already been combined, skip.  */
	      && ! g2->same && ! g2->combined_with)
	    {
	      int l;

	      g2->new_reg = can_combine[i*giv_count + j];
	      g2->same = g1;
	      g1->combined_with = 1;
	      g1->lifetime += g2->lifetime;

	      g1_add_benefit += combine_givs_benefit_from (g1, g2);

	      /* ??? The new final_[bg]iv_value code does a much better job
		 of finding replaceable giv's, and hence this code may no
		 longer be necessary.  */
	      if (! g2->replaceable && REG_USERVAR_P (g2->dest_reg))
		g1_add_benefit -= copy_cost;
6424
		
6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469
	      /* To help optimize the next set of combinations, remove
		 this giv from the benefits of other potential mates.  */
	      for (l = 0; l < giv_count; ++l)
		{
		  int m = stats[l].giv_number;
		  if (can_combine[m*giv_count + j])
		    {
		      /* Remove additional weight for being reused.  */
		      stats[l].total_benefit -= 3 + 
			combine_givs_benefit_from (giv_array[m], g2);
		    }
		}

	      if (loop_dump_stream)
		fprintf (loop_dump_stream,
			 "giv at %d combined with giv at %d\n",
			 INSN_UID (g2->insn), INSN_UID (g1->insn));
	    }
	}

      /* To help optimize the next set of combinations, remove
	 this giv from the benefits of other potential mates.  */
      if (g1->combined_with)
	{
	  for (j = 0; j < giv_count; ++j)
	    {
	      int m = stats[j].giv_number;
	      if (can_combine[m*giv_count + j])
		{
		  /* Remove additional weight for being reused.  */
		  stats[j].total_benefit -= 3 + 
		    combine_givs_benefit_from (giv_array[m], g1);
		}
	    }

	  g1->benefit += g1_add_benefit;

	  /* We've finished with this giv, and everything it touched.
	     Restart the combination so that proper weights for the 
	     rest of the givs are properly taken into account.  */
	  /* ??? Ideally we would compact the arrays at this point, so
	     as to not cover old ground.  But sanely compacting
	     can_combine is tricky.  */
	  goto restart;
	}
6470
    }
Richard Stallman committed
6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489
}

/* EMIT code before INSERT_BEFORE to set REG = B * M + A.  */

void
emit_iv_add_mult (b, m, a, reg, insert_before)
     rtx b;          /* initial value of basic induction variable */
     rtx m;          /* multiplicative constant */
     rtx a;          /* additive constant */
     rtx reg;        /* destination register */
     rtx insert_before;
{
  rtx seq;
  rtx result;

  /* Prevent unexpected sharing of these rtx.  */
  a = copy_rtx (a);
  b = copy_rtx (b);

Mike Stump committed
6490
  /* Increase the lifetime of any invariants moved further in code.  */
Richard Stallman committed
6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502
  update_reg_last_use (a, insert_before);
  update_reg_last_use (b, insert_before);
  update_reg_last_use (m, insert_before);

  start_sequence ();
  result = expand_mult_add (b, reg, m, a, GET_MODE (reg), 0);
  if (reg != result)
    emit_move_insn (reg, result);
  seq = gen_sequence ();
  end_sequence ();

  emit_insn_before (seq, insert_before);
6503

6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520
  /* It is entirely possible that the expansion created lots of new 
     registers.  Iterate over the sequence we just created and 
     record them all.  */

  if (GET_CODE (seq) == SEQUENCE)
    {
      int i;
      for (i = 0; i < XVECLEN (seq, 0); ++i)
	{
	  rtx set = single_set (XVECEXP (seq, 0, i));
	  if (set && GET_CODE (SET_DEST (set)) == REG)
	    record_base_value (REGNO (SET_DEST (set)), SET_SRC (set), 0);
	}
    }
  else if (GET_CODE (seq) == SET
	   && GET_CODE (SET_DEST (seq)) == REG)
    record_base_value (REGNO (SET_DEST (seq)), SET_SRC (seq), 0);
Richard Stallman committed
6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536
}

/* Test whether A * B can be computed without
   an actual multiply insn.  Value is 1 if so.  */

static int
product_cheap_p (a, b)
     rtx a;
     rtx b;
{
  int i;
  rtx tmp;
  struct obstack *old_rtl_obstack = rtl_obstack;
  char *storage = (char *) obstack_alloc (&temp_obstack, 0);
  int win = 1;

Mike Stump committed
6537
  /* If only one is constant, make it B.  */
Richard Stallman committed
6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554
  if (GET_CODE (a) == CONST_INT)
    tmp = a, a = b, b = tmp;

  /* If first constant, both constant, so don't need multiply.  */
  if (GET_CODE (a) == CONST_INT)
    return 1;

  /* If second not constant, neither is constant, so would need multiply.  */
  if (GET_CODE (b) != CONST_INT)
    return 0;

  /* One operand is constant, so might not need multiply insn.  Generate the
     code for the multiply and see if a call or multiply, or long sequence
     of insns is generated.  */

  rtl_obstack = &temp_obstack;
  start_sequence ();
6555
  expand_mult (GET_MODE (a), a, b, NULL_RTX, 0);
Richard Stallman committed
6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613
  tmp = gen_sequence ();
  end_sequence ();

  if (GET_CODE (tmp) == SEQUENCE)
    {
      if (XVEC (tmp, 0) == 0)
	win = 1;
      else if (XVECLEN (tmp, 0) > 3)
	win = 0;
      else
	for (i = 0; i < XVECLEN (tmp, 0); i++)
	  {
	    rtx insn = XVECEXP (tmp, 0, i);

	    if (GET_CODE (insn) != INSN
		|| (GET_CODE (PATTERN (insn)) == SET
		    && GET_CODE (SET_SRC (PATTERN (insn))) == MULT)
		|| (GET_CODE (PATTERN (insn)) == PARALLEL
		    && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET
		    && GET_CODE (SET_SRC (XVECEXP (PATTERN (insn), 0, 0))) == MULT))
	      {
		win = 0;
		break;
	      }
	  }
    }
  else if (GET_CODE (tmp) == SET
	   && GET_CODE (SET_SRC (tmp)) == MULT)
    win = 0;
  else if (GET_CODE (tmp) == PARALLEL
	   && GET_CODE (XVECEXP (tmp, 0, 0)) == SET
	   && GET_CODE (SET_SRC (XVECEXP (tmp, 0, 0))) == MULT)
    win = 0;

  /* Free any storage we obtained in generating this multiply and restore rtl
     allocation to its normal obstack.  */
  obstack_free (&temp_obstack, storage);
  rtl_obstack = old_rtl_obstack;

  return win;
}

/* Check to see if loop can be terminated by a "decrement and branch until
   zero" instruction.  If so, add a REG_NONNEG note to the branch insn if so.
   Also try reversing an increment loop to a decrement loop
   to see if the optimization can be performed.
   Value is nonzero if optimization was performed.  */

/* This is useful even if the architecture doesn't have such an insn,
   because it might change a loops which increments from 0 to n to a loop
   which decrements from n to 0.  A loop that decrements to zero is usually
   faster than one that increments from zero.  */

/* ??? This could be rewritten to use some of the loop unrolling procedures,
   such as approx_final_value, biv_total_increment, loop_iterations, and
   final_[bg]iv_value.  */

static int
6614
check_dbra_loop (loop_end, insn_count, loop_start, loop_info)
Richard Stallman committed
6615 6616 6617
     rtx loop_end;
     int insn_count;
     rtx loop_start;
6618
     struct loop_info *loop_info;
Richard Stallman committed
6619 6620 6621 6622 6623 6624 6625 6626 6627 6628
{
  struct iv_class *bl;
  rtx reg;
  rtx jump_label;
  rtx final_value;
  rtx start_value;
  rtx new_add_val;
  rtx comparison;
  rtx before_comparison;
  rtx p;
6629 6630 6631
  rtx jump;
  rtx first_compare;
  int compare_and_branch;
Richard Stallman committed
6632 6633 6634 6635

  /* If last insn is a conditional branch, and the insn before tests a
     register value, try to optimize it.  Otherwise, we can't do anything.  */

6636 6637
  jump = PREV_INSN (loop_end);
  comparison = get_condition_for_loop (jump);
Richard Stallman committed
6638 6639 6640
  if (comparison == 0)
    return 0;

6641 6642 6643 6644 6645 6646 6647 6648 6649 6650
  /* Try to compute whether the compare/branch at the loop end is one or
     two instructions.  */
  get_condition (jump, &first_compare);
  if (first_compare == jump)
    compare_and_branch = 1;
  else if (first_compare == prev_nonnote_insn (jump))
    compare_and_branch = 2;
  else
    return 0;

Richard Stallman committed
6651 6652 6653 6654 6655 6656 6657 6658 6659 6660
  /* Check all of the bivs to see if the compare uses one of them.
     Skip biv's set more than once because we can't guarantee that
     it will be zero on the last iteration.  Also skip if the biv is
     used between its update and the test insn.  */

  for (bl = loop_iv_list; bl; bl = bl->next)
    {
      if (bl->biv_count == 1
	  && bl->biv->dest_reg == XEXP (comparison, 0)
	  && ! reg_used_between_p (regno_reg_rtx[bl->regno], bl->biv->insn,
6661
				   first_compare))
Richard Stallman committed
6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685
	break;
    }

  if (! bl)
    return 0;

  /* Look for the case where the basic induction variable is always
     nonnegative, and equals zero on the last iteration.
     In this case, add a reg_note REG_NONNEG, which allows the
     m68k DBRA instruction to be used.  */

  if (((GET_CODE (comparison) == GT
	&& GET_CODE (XEXP (comparison, 1)) == CONST_INT
	&& INTVAL (XEXP (comparison, 1)) == -1)
       || (GET_CODE (comparison) == NE && XEXP (comparison, 1) == const0_rtx))
      && GET_CODE (bl->biv->add_val) == CONST_INT
      && INTVAL (bl->biv->add_val) < 0)
    {
      /* Initial value must be greater than 0,
	 init_val % -dec_value == 0 to ensure that it equals zero on
	 the last iteration */

      if (GET_CODE (bl->initial_value) == CONST_INT
	  && INTVAL (bl->initial_value) > 0
6686 6687
	  && (INTVAL (bl->initial_value)
	      % (-INTVAL (bl->biv->add_val))) == 0)
Richard Stallman committed
6688 6689 6690
	{
	  /* register always nonnegative, add REG_NOTE to branch */
	  REG_NOTES (PREV_INSN (loop_end))
6691 6692
	    = gen_rtx_EXPR_LIST (REG_NONNEG, NULL_RTX,
				 REG_NOTES (PREV_INSN (loop_end)));
Richard Stallman committed
6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715
	  bl->nonneg = 1;

	  return 1;
	}

      /* If the decrement is 1 and the value was tested as >= 0 before
	 the loop, then we can safely optimize.  */
      for (p = loop_start; p; p = PREV_INSN (p))
	{
	  if (GET_CODE (p) == CODE_LABEL)
	    break;
	  if (GET_CODE (p) != JUMP_INSN)
	    continue;

	  before_comparison = get_condition_for_loop (p);
	  if (before_comparison
	      && XEXP (before_comparison, 0) == bl->biv->dest_reg
	      && GET_CODE (before_comparison) == LT
	      && XEXP (before_comparison, 1) == const0_rtx
	      && ! reg_set_between_p (bl->biv->dest_reg, p, loop_start)
	      && INTVAL (bl->biv->add_val) == -1)
	    {
	      REG_NOTES (PREV_INSN (loop_end))
6716 6717
		= gen_rtx_EXPR_LIST (REG_NONNEG, NULL_RTX,
				     REG_NOTES (PREV_INSN (loop_end)));
Richard Stallman committed
6718 6719 6720 6721 6722 6723
	      bl->nonneg = 1;

	      return 1;
	    }
	}
    }
6724
  else if (INTVAL (bl->biv->add_val) > 0)
Richard Stallman committed
6725 6726 6727 6728 6729 6730 6731
    {
      /* Try to change inc to dec, so can apply above optimization.  */
      /* Can do this if:
	 all registers modified are induction variables or invariant,
	 all memory references have non-overlapping addresses
	 (obviously true if only one write)
	 allow 2 insns for the compare/jump at the end of the loop.  */
6732 6733 6734 6735 6736
      /* Also, we must avoid any instructions which use both the reversed
	 biv and another biv.  Such instructions will fail if the loop is
	 reversed.  We meet this condition by requiring that either
	 no_use_except_counting is true, or else that there is only
	 one biv.  */
Richard Stallman committed
6737 6738 6739
      int num_nonfixed_reads = 0;
      /* 1 if the iteration var is used only to count iterations.  */
      int no_use_except_counting = 0;
6740 6741 6742
      /* 1 if the loop has no memory store, or it has a single memory store
	 which is reversible.  */
      int reversible_mem_store = 1;
Richard Stallman committed
6743 6744

      if (bl->giv_count == 0
6745
	  && ! loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]])
Richard Stallman committed
6746 6747 6748 6749
	{
	  rtx bivreg = regno_reg_rtx[bl->regno];

	  /* If there are no givs for this biv, and the only exit is the
Jeff Law committed
6750
	     fall through at the end of the loop, then
Richard Stallman committed
6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773
	     see if perhaps there are no uses except to count.  */
	  no_use_except_counting = 1;
	  for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
	    if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
	      {
		rtx set = single_set (p);

		if (set && GET_CODE (SET_DEST (set)) == REG
		    && REGNO (SET_DEST (set)) == bl->regno)
		  /* An insn that sets the biv is okay.  */
		  ;
		else if (p == prev_nonnote_insn (prev_nonnote_insn (loop_end))
			 || p == prev_nonnote_insn (loop_end))
		  /* Don't bother about the end test.  */
		  ;
		else if (reg_mentioned_p (bivreg, PATTERN (p)))
		  {
		    no_use_except_counting = 0;
		    break;
		  }
	      }
	}

6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790
      if (no_use_except_counting)
	; /* no need to worry about MEMs.  */
      else if (num_mem_sets <= 1)
	{
	  for (p = loop_start; p != loop_end; p = NEXT_INSN (p))
	    if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
	      num_nonfixed_reads += count_nonfixed_reads (PATTERN (p));

	  /* If the loop has a single store, and the destination address is
	     invariant, then we can't reverse the loop, because this address
	     might then have the wrong value at loop exit.
	     This would work if the source was invariant also, however, in that
	     case, the insn should have been moved out of the loop.  */

	  if (num_mem_sets == 1)
	    reversible_mem_store
	      = (! unknown_address_altered
Jeff Law committed
6791
		 && ! invariant_p (XEXP (loop_store_mems, 0)));
6792 6793 6794
	}
      else
	return 0;
6795

Richard Stallman committed
6796 6797 6798 6799
      /* This code only acts for innermost loops.  Also it simplifies
	 the memory address check by only reversing loops with
	 zero or one memory access.
	 Two memory accesses could involve parts of the same array,
6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811
	 and that can't be reversed.
	 If the biv is used only for counting, than we don't need to worry
	 about all these things.  */

      if ((num_nonfixed_reads <= 1
	   && !loop_has_call
	   && !loop_has_volatile
	   && reversible_mem_store
	   && (bl->giv_count + bl->biv_count + num_mem_sets
	      + num_movables + compare_and_branch == insn_count)
	   && (bl == loop_iv_list && bl->next == 0))
	  || no_use_except_counting)
Richard Stallman committed
6812 6813 6814 6815 6816 6817 6818 6819
	{
	  rtx tem;

	  /* Loop can be reversed.  */
	  if (loop_dump_stream)
	    fprintf (loop_dump_stream, "Can reverse loop\n");

	  /* Now check other conditions:
6820

Jeff Law committed
6821 6822
	     The increment must be a constant, as must the initial value,
	     and the comparison code must be LT. 
Richard Stallman committed
6823 6824 6825 6826 6827

	     This test can probably be improved since +/- 1 in the constant
	     can be obtained by changing LT to LE and vice versa; this is
	     confusing.  */

6828
	  if (comparison
6829 6830 6831 6832
	      /* for constants, LE gets turned into LT */
	      && (GET_CODE (comparison) == LT
		  || (GET_CODE (comparison) == LE
		      && no_use_except_counting)))
Richard Stallman committed
6833
	    {
6834 6835 6836 6837 6838 6839
	      HOST_WIDE_INT add_val, add_adjust, comparison_val;
	      rtx initial_value, comparison_value;
	      int nonneg = 0;
	      enum rtx_code cmp_code;
	      int comparison_const_width;
	      unsigned HOST_WIDE_INT comparison_sign_mask;
6840 6841

	      add_val = INTVAL (bl->biv->add_val);
6842
	      comparison_value = XEXP (comparison, 1);
6843 6844 6845 6846 6847 6848
	      if (GET_MODE (comparison_value) == VOIDmode)
		comparison_const_width
		  = GET_MODE_BITSIZE (GET_MODE (XEXP (comparison, 0)));
	      else
		comparison_const_width
		  = GET_MODE_BITSIZE (GET_MODE (comparison_value));
6849 6850 6851 6852 6853
	      if (comparison_const_width > HOST_BITS_PER_WIDE_INT)
		comparison_const_width = HOST_BITS_PER_WIDE_INT;
	      comparison_sign_mask
		= (unsigned HOST_WIDE_INT)1 << (comparison_const_width - 1);

6854 6855 6856 6857 6858 6859
	      /* If the comparison value is not a loop invariant, then we
		 can not reverse this loop.

		 ??? If the insns which initialize the comparison value as
		 a whole compute an invariant result, then we could move
		 them out of the loop and proceed with loop reversal.  */
6860
	      if (!invariant_p (comparison_value))
6861 6862
		return 0;

6863 6864
	      if (GET_CODE (comparison_value) == CONST_INT)
		comparison_val = INTVAL (comparison_value);
6865 6866
	      initial_value = bl->initial_value;
		
6867 6868 6869 6870
	      /* Normalize the initial value if it is an integer and 
		 has no other use except as a counter.  This will allow
		 a few more loops to be reversed.  */
	      if (no_use_except_counting
6871
		  && GET_CODE (comparison_value) == CONST_INT
6872
		  && GET_CODE (initial_value) == CONST_INT)
6873 6874
		{
		  comparison_val = comparison_val - INTVAL (bl->initial_value);
6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887
		  /* The code below requires comparison_val to be a multiple
		     of add_val in order to do the loop reversal, so
		     round up comparison_val to a multiple of add_val.
		     Since comparison_value is constant, we know that the
		     current comparison code is LT.  */
		  comparison_val = comparison_val + add_val - 1;
		  comparison_val
		    -= (unsigned HOST_WIDE_INT) comparison_val % add_val;
		  /* We postpone overflow checks for COMPARISON_VAL here;
		     even if there is an overflow, we might still be able to
		     reverse the loop, if converting the loop exit test to
		     NE is possible.  */
		  initial_value = const0_rtx;
6888 6889
		}

6890 6891 6892 6893
	      /* First check if we can do a vanilla loop reversal.  */
	      if (initial_value == const0_rtx
		  /* If we have a decrement_and_branch_on_count, prefer
		     the NE test, since this will allow that instruction to
6894 6895 6896
		     be generated.  Note that we must use a vanilla loop
		     reversal if the biv is used to calculate a giv or has
		     a non-counting use.  */
6897
#if ! defined (HAVE_decrement_and_branch_until_zero) && defined (HAVE_decrement_and_branch_on_count)
6898
		  && (! (add_val == 1 && loop_info->vtop
6899 6900
		         && (bl->biv_count == 0
			     || no_use_except_counting)))
6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912
#endif
		  && GET_CODE (comparison_value) == CONST_INT
		     /* Now do postponed overflow checks on COMPARISON_VAL.  */
		  && ! (((comparison_val - add_val) ^ INTVAL (comparison_value))
			& comparison_sign_mask))
		{
		  /* Register will always be nonnegative, with value
		     0 on last iteration */
		  add_adjust = add_val;
		  nonneg = 1;
		  cmp_code = GE;
		}
6913
	      else if (add_val == 1 && loop_info->vtop
6914 6915
		       && (bl->biv_count == 0
			   || no_use_except_counting))
6916 6917 6918 6919 6920 6921 6922 6923 6924 6925
		{
		  add_adjust = 0;
		  cmp_code = NE;
		}
	      else
		return 0;

	      if (GET_CODE (comparison) == LE)
		add_adjust -= add_val;

6926 6927 6928
	      /* If the initial value is not zero, or if the comparison
		 value is not an exact multiple of the increment, then we
		 can not reverse this loop.  */
6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939
	      if (initial_value == const0_rtx
		  && GET_CODE (comparison_value) == CONST_INT)
		{
		  if (((unsigned HOST_WIDE_INT) comparison_val % add_val) != 0)
		    return 0;
		}
	      else
		{
		  if (! no_use_except_counting || add_val != 1)
		    return 0;
		}
6940

6941 6942
	      final_value = comparison_value;

6943 6944
	      /* Reset these in case we normalized the initial value
		 and comparison value above.  */
6945 6946 6947 6948 6949 6950 6951
	      if (GET_CODE (comparison_value) == CONST_INT
		  && GET_CODE (initial_value) == CONST_INT)
		{
		  comparison_value = GEN_INT (comparison_val);
		  final_value
		    = GEN_INT (comparison_val + INTVAL (bl->initial_value));
		}
6952
	      bl->initial_value = initial_value;
Richard Stallman committed
6953 6954 6955 6956

	      /* Save some info needed to produce the new insns.  */
	      reg = bl->biv->dest_reg;
	      jump_label = XEXP (SET_SRC (PATTERN (PREV_INSN (loop_end))), 1);
6957 6958
	      if (jump_label == pc_rtx)
		jump_label = XEXP (SET_SRC (PATTERN (PREV_INSN (loop_end))), 2);
6959
	      new_add_val = GEN_INT (- INTVAL (bl->biv->add_val));
Richard Stallman committed
6960

6961 6962 6963
	      /* Set start_value; if this is not a CONST_INT, we need
		 to generate a SUB.
		 Initialize biv to start_value before loop start.
Richard Stallman committed
6964 6965
		 The old initializing insn will be deleted as a
		 dead store by flow.c.  */
6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013
	      if (initial_value == const0_rtx
		  && GET_CODE (comparison_value) == CONST_INT)
		{
		  start_value = GEN_INT (comparison_val - add_adjust);
		  emit_insn_before (gen_move_insn (reg, start_value),
				    loop_start);
		}
	      else if (GET_CODE (initial_value) == CONST_INT)
		{
		  rtx offset = GEN_INT (-INTVAL (initial_value) - add_adjust);
		  enum machine_mode mode = GET_MODE (reg);
		  enum insn_code icode
		    = add_optab->handlers[(int) mode].insn_code;
		  if (! (*insn_operand_predicate[icode][0]) (reg, mode)
		      || ! ((*insn_operand_predicate[icode][1])
			    (comparison_value, mode))
		      || ! (*insn_operand_predicate[icode][2]) (offset, mode))
		    return 0;
		  start_value
		    = gen_rtx_PLUS (mode, comparison_value, offset);
		  emit_insn_before ((GEN_FCN (icode)
				     (reg, comparison_value, offset)),
				    loop_start);
		  if (GET_CODE (comparison) == LE)
		    final_value = gen_rtx_PLUS (mode, comparison_value,
						GEN_INT (add_val));
		}
	      else if (! add_adjust)
		{
		  enum machine_mode mode = GET_MODE (reg);
		  enum insn_code icode
		    = sub_optab->handlers[(int) mode].insn_code;
		  if (! (*insn_operand_predicate[icode][0]) (reg, mode)
		      || ! ((*insn_operand_predicate[icode][1])
			    (comparison_value, mode))
		      || ! ((*insn_operand_predicate[icode][2])
			    (initial_value, mode)))
		    return 0;
		  start_value
		    = gen_rtx_MINUS (mode, comparison_value, initial_value);
		  emit_insn_before ((GEN_FCN (icode)
				     (reg, comparison_value, initial_value)),
				    loop_start);
		}
	      else
		/* We could handle the other cases too, but it'll be
		   better to have a testcase first.  */
		return 0;
Richard Stallman committed
7014

7015 7016 7017 7018 7019 7020 7021 7022
	      /* We may not have a single insn which can increment a reg, so
		 create a sequence to hold all the insns from expand_inc.  */
	      start_sequence ();
	      expand_inc (reg, new_add_val);
              tem = gen_sequence ();
              end_sequence ();

	      p = emit_insn_before (tem, bl->biv->insn);
Richard Stallman committed
7023 7024 7025 7026 7027 7028 7029
	      delete_insn (bl->biv->insn);
		      
	      /* Update biv info to reflect its new status.  */
	      bl->biv->insn = p;
	      bl->initial_value = start_value;
	      bl->biv->add_val = new_add_val;

7030
	      /* Update loop info.  */
7031 7032
	      loop_info->initial_value = reg;
	      loop_info->initial_equiv_value = reg;
7033 7034 7035 7036 7037 7038
	      loop_info->final_value = const0_rtx;
	      loop_info->final_equiv_value = const0_rtx;
	      loop_info->comparison_value = const0_rtx;
	      loop_info->comparison_code = cmp_code;
	      loop_info->increment = new_add_val;

Richard Stallman committed
7039 7040 7041 7042 7043 7044
	      /* Inc LABEL_NUSES so that delete_insn will
		 not delete the label.  */
	      LABEL_NUSES (XEXP (jump_label, 0)) ++;

	      /* Emit an insn after the end of the loop to set the biv's
		 proper exit value if it is used anywhere outside the loop.  */
7045
	      if ((REGNO_LAST_UID (bl->regno) != INSN_UID (first_compare))
Richard Stallman committed
7046
		  || ! bl->init_insn
7047
		  || REGNO_FIRST_UID (bl->regno) != INSN_UID (bl->init_insn))
Richard Stallman committed
7048 7049 7050 7051 7052
		emit_insn_after (gen_move_insn (reg, final_value),
				 loop_end);

	      /* Delete compare/branch at end of loop.  */
	      delete_insn (PREV_INSN (loop_end));
7053 7054
	      if (compare_and_branch == 2)
		delete_insn (first_compare);
Richard Stallman committed
7055 7056 7057

	      /* Add new compare/branch insn at end of loop.  */
	      start_sequence ();
7058 7059 7060
	      emit_cmp_and_jump_insns (reg, const0_rtx, cmp_code, NULL_RTX,
				       GET_MODE (reg), 0, 0, 
				       XEXP (jump_label, 0));
Richard Stallman committed
7061 7062 7063 7064
	      tem = gen_sequence ();
	      end_sequence ();
	      emit_jump_insn_before (tem, loop_end);

7065 7066 7067 7068 7069 7070 7071 7072
	      for (tem = PREV_INSN (loop_end);
		   tem && GET_CODE (tem) != JUMP_INSN;
		   tem = PREV_INSN (tem))
		;

	      if (tem)
		JUMP_LABEL (tem) = XEXP (jump_label, 0);

7073
	      if (nonneg)
Richard Stallman committed
7074
		{
7075 7076 7077 7078 7079 7080 7081 7082 7083
		  if (tem)
		    {
		      /* Increment of LABEL_NUSES done above.  */
		      /* Register is now always nonnegative,
			 so add REG_NONNEG note to the branch.  */
		      REG_NOTES (tem) = gen_rtx_EXPR_LIST (REG_NONNEG, NULL_RTX,
							   REG_NOTES (tem));
		    }
		  bl->nonneg = 1;
Richard Stallman committed
7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122
		}

	      /* Mark that this biv has been reversed.  Each giv which depends
		 on this biv, and which is also live past the end of the loop
		 will have to be fixed up.  */

	      bl->reversed = 1;

	      if (loop_dump_stream)
		fprintf (loop_dump_stream,
			 "Reversed loop and added reg_nonneg\n");

	      return 1;
	    }
	}
    }

  return 0;
}

/* Verify whether the biv BL appears to be eliminable,
   based on the insns in the loop that refer to it.
   LOOP_START is the first insn of the loop, and END is the end insn.

   If ELIMINATE_P is non-zero, actually do the elimination.

   THRESHOLD and INSN_COUNT are from loop_optimize and are used to
   determine whether invariant insns should be placed inside or at the
   start of the loop.  */

static int
maybe_eliminate_biv (bl, loop_start, end, eliminate_p, threshold, insn_count)
     struct iv_class *bl;
     rtx loop_start;
     rtx end;
     int eliminate_p;
     int threshold, insn_count;
{
  rtx reg = bl->biv->dest_reg;
7123
  rtx p;
Richard Stallman committed
7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176

  /* Scan all insns in the loop, stopping if we find one that uses the
     biv in a way that we cannot eliminate.  */

  for (p = loop_start; p != end; p = NEXT_INSN (p))
    {
      enum rtx_code code = GET_CODE (p);
      rtx where = threshold >= insn_count ? loop_start : p;

      if ((code == INSN || code == JUMP_INSN || code == CALL_INSN)
	  && reg_mentioned_p (reg, PATTERN (p))
	  && ! maybe_eliminate_biv_1 (PATTERN (p), p, bl, eliminate_p, where))
	{
	  if (loop_dump_stream)
	    fprintf (loop_dump_stream,
		     "Cannot eliminate biv %d: biv used in insn %d.\n",
		     bl->regno, INSN_UID (p));
	  break;
	}
    }

  if (p == end)
    {
      if (loop_dump_stream)
	fprintf (loop_dump_stream, "biv %d %s eliminated.\n",
		 bl->regno, eliminate_p ? "was" : "can be");
      return 1;
    }

  return 0;
}

/* If BL appears in X (part of the pattern of INSN), see if we can
   eliminate its use.  If so, return 1.  If not, return 0.

   If BIV does not appear in X, return 1.

   If ELIMINATE_P is non-zero, actually do the elimination.  WHERE indicates
   where extra insns should be added.  Depending on how many items have been
   moved out of the loop, it will either be before INSN or at the start of
   the loop.  */

static int
maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where)
     rtx x, insn;
     struct iv_class *bl;
     int eliminate_p;
     rtx where;
{
  enum rtx_code code = GET_CODE (x);
  rtx reg = bl->biv->dest_reg;
  enum machine_mode mode = GET_MODE (reg);
  struct induction *v;
Kaveh R. Ghazi committed
7177 7178 7179 7180
  rtx arg, tem;
#ifdef HAVE_cc0
  rtx new;
#endif
Richard Stallman committed
7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209
  int arg_operand;
  char *fmt;
  int i, j;

  switch (code)
    {
    case REG:
      /* If we haven't already been able to do something with this BIV,
	 we can't eliminate it.  */
      if (x == reg)
	return 0;
      return 1;

    case SET:
      /* If this sets the BIV, it is not a problem.  */
      if (SET_DEST (x) == reg)
	return 1;

      /* If this is an insn that defines a giv, it is also ok because
	 it will go away when the giv is reduced.  */
      for (v = bl->giv; v; v = v->next_iv)
	if (v->giv_type == DEST_REG && SET_DEST (x) == v->dest_reg)
	  return 1;

#ifdef HAVE_cc0
      if (SET_DEST (x) == cc0_rtx && SET_SRC (x) == reg)
	{
	  /* Can replace with any giv that was reduced and
	     that has (MULT_VAL != 0) and (ADD_VAL == 0).
7210 7211 7212
	     Require a constant for MULT_VAL, so we know it's nonzero.
	     ??? We disable this optimization to avoid potential
	     overflows.  */
Richard Stallman committed
7213 7214 7215 7216

	  for (v = bl->giv; v; v = v->next_iv)
	    if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
		&& v->add_val == const0_rtx
7217
		&& ! v->ignore && ! v->maybe_dead && v->always_computable
7218 7219
		&& v->mode == mode
		&& 0)
Richard Stallman committed
7220
	      {
7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231
		/* If the giv V had the auto-inc address optimization applied
		   to it, and INSN occurs between the giv insn and the biv
		   insn, then we must adjust the value used here.
		   This is rare, so we don't bother to do so.  */
		if (v->auto_inc_opt
		    && ((INSN_LUID (v->insn) < INSN_LUID (insn)
			 && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
			|| (INSN_LUID (v->insn) > INSN_LUID (insn)
			    && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
		  continue;

Richard Stallman committed
7232 7233 7234 7235 7236 7237
		if (! eliminate_p)
		  return 1;

		/* If the giv has the opposite direction of change,
		   then reverse the comparison.  */
		if (INTVAL (v->mult_val) < 0)
7238 7239
		  new = gen_rtx_COMPARE (GET_MODE (v->new_reg),
					 const0_rtx, v->new_reg);
Richard Stallman committed
7240 7241 7242 7243 7244 7245 7246 7247 7248 7249
		else
		  new = v->new_reg;

		/* We can probably test that giv's reduced reg.  */
		if (validate_change (insn, &SET_SRC (x), new, 0))
		  return 1;
	      }

	  /* Look for a giv with (MULT_VAL != 0) and (ADD_VAL != 0);
	     replace test insn with a compare insn (cmp REDUCED_GIV ADD_VAL).
7250 7251 7252
	     Require a constant for MULT_VAL, so we know it's nonzero.
	     ??? Do this only if ADD_VAL is a pointer to avoid a potential
	     overflow problem.  */
Richard Stallman committed
7253 7254 7255

	  for (v = bl->giv; v; v = v->next_iv)
	    if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
7256
		&& ! v->ignore && ! v->maybe_dead && v->always_computable
7257 7258 7259 7260 7261 7262
		&& v->mode == mode
		&& (GET_CODE (v->add_val) == SYMBOL_REF
		    || GET_CODE (v->add_val) == LABEL_REF
		    || GET_CODE (v->add_val) == CONST
		    || (GET_CODE (v->add_val) == REG
			&& REGNO_POINTER_FLAG (REGNO (v->add_val)))))
Richard Stallman committed
7263
	      {
7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274
		/* If the giv V had the auto-inc address optimization applied
		   to it, and INSN occurs between the giv insn and the biv
		   insn, then we must adjust the value used here.
		   This is rare, so we don't bother to do so.  */
		if (v->auto_inc_opt
		    && ((INSN_LUID (v->insn) < INSN_LUID (insn)
			 && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
			|| (INSN_LUID (v->insn) > INSN_LUID (insn)
			    && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
		  continue;

Richard Stallman committed
7275 7276 7277 7278 7279 7280
		if (! eliminate_p)
		  return 1;

		/* If the giv has the opposite direction of change,
		   then reverse the comparison.  */
		if (INTVAL (v->mult_val) < 0)
7281 7282
		  new = gen_rtx_COMPARE (VOIDmode, copy_rtx (v->add_val),
					 v->new_reg);
Richard Stallman committed
7283
		else
7284 7285
		  new = gen_rtx_COMPARE (VOIDmode, v->new_reg,
					 copy_rtx (v->add_val));
Richard Stallman committed
7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298

		/* Replace biv with the giv's reduced register.  */
		update_reg_last_use (v->add_val, insn);
		if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
		  return 1;

		/* Insn doesn't support that constant or invariant.  Copy it
		   into a register (it will be a loop invariant.)  */
		tem = gen_reg_rtx (GET_MODE (v->new_reg));

		emit_insn_before (gen_move_insn (tem, copy_rtx (v->add_val)),
				  where);

7299 7300 7301 7302
		/* Substitute the new register for its invariant value in
		   the compare expression. */
		XEXP (new, (INTVAL (v->mult_val) < 0) ? 0 : 1) = tem;
		if (validate_change (insn, &SET_SRC (PATTERN (insn)), new, 0))
Richard Stallman committed
7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328
		  return 1;
	      }
	}
#endif
      break;

    case COMPARE:
    case EQ:  case NE:
    case GT:  case GE:  case GTU:  case GEU:
    case LT:  case LE:  case LTU:  case LEU:
      /* See if either argument is the biv.  */
      if (XEXP (x, 0) == reg)
	arg = XEXP (x, 1), arg_operand = 1;
      else if (XEXP (x, 1) == reg)
	arg = XEXP (x, 0), arg_operand = 0;
      else
	break;

      if (CONSTANT_P (arg))
	{
	  /* First try to replace with any giv that has constant positive
	     mult_val and constant add_val.  We might be able to support
	     negative mult_val, but it seems complex to do it in general.  */

	  for (v = bl->giv; v; v = v->next_iv)
	    if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
7329 7330 7331 7332 7333
		&& (GET_CODE (v->add_val) == SYMBOL_REF
		    || GET_CODE (v->add_val) == LABEL_REF
		    || GET_CODE (v->add_val) == CONST
		    || (GET_CODE (v->add_val) == REG
			&& REGNO_POINTER_FLAG (REGNO (v->add_val))))
7334
		&& ! v->ignore && ! v->maybe_dead && v->always_computable
Richard Stallman committed
7335 7336
		&& v->mode == mode)
	      {
7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347
		/* If the giv V had the auto-inc address optimization applied
		   to it, and INSN occurs between the giv insn and the biv
		   insn, then we must adjust the value used here.
		   This is rare, so we don't bother to do so.  */
		if (v->auto_inc_opt
		    && ((INSN_LUID (v->insn) < INSN_LUID (insn)
			 && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
			|| (INSN_LUID (v->insn) > INSN_LUID (insn)
			    && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
		  continue;

Richard Stallman committed
7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360
		if (! eliminate_p)
		  return 1;

		/* Replace biv with the giv's reduced reg.  */
		XEXP (x, 1-arg_operand) = v->new_reg;

		/* If all constants are actually constant integers and
		   the derived constant can be directly placed in the COMPARE,
		   do so.  */
		if (GET_CODE (arg) == CONST_INT
		    && GET_CODE (v->mult_val) == CONST_INT
		    && GET_CODE (v->add_val) == CONST_INT
		    && validate_change (insn, &XEXP (x, arg_operand),
7361 7362 7363
					GEN_INT (INTVAL (arg)
						 * INTVAL (v->mult_val)
						 + INTVAL (v->add_val)), 0))
Richard Stallman committed
7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376
		  return 1;

		/* Otherwise, load it into a register.  */
		tem = gen_reg_rtx (mode);
		emit_iv_add_mult (arg, v->mult_val, v->add_val, tem, where);
		if (validate_change (insn, &XEXP (x, arg_operand), tem, 0))
		  return 1;

		/* If that failed, put back the change we made above.  */
		XEXP (x, 1-arg_operand) = reg;
	      }
	  
	  /* Look for giv with positive constant mult_val and nonconst add_val.
7377 7378
	     Insert insns to calculate new compare value.  
	     ??? Turn this off due to possible overflow.  */
Richard Stallman committed
7379 7380

	  for (v = bl->giv; v; v = v->next_iv)
7381
	    if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
7382
		&& ! v->ignore && ! v->maybe_dead && v->always_computable
7383 7384
		&& v->mode == mode
		&& 0)
Richard Stallman committed
7385 7386 7387
	      {
		rtx tem;

7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398
		/* If the giv V had the auto-inc address optimization applied
		   to it, and INSN occurs between the giv insn and the biv
		   insn, then we must adjust the value used here.
		   This is rare, so we don't bother to do so.  */
		if (v->auto_inc_opt
		    && ((INSN_LUID (v->insn) < INSN_LUID (insn)
			 && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
			|| (INSN_LUID (v->insn) > INSN_LUID (insn)
			    && INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
		  continue;

Richard Stallman committed
7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420
		if (! eliminate_p)
		  return 1;

		tem = gen_reg_rtx (mode);

		/* Replace biv with giv's reduced register.  */
		validate_change (insn, &XEXP (x, 1 - arg_operand),
				 v->new_reg, 1);

		/* Compute value to compare against.  */
		emit_iv_add_mult (arg, v->mult_val, v->add_val, tem, where);
		/* Use it in this insn.  */
		validate_change (insn, &XEXP (x, arg_operand), tem, 1);
		if (apply_change_group ())
		  return 1;
	      }
	}
      else if (GET_CODE (arg) == REG || GET_CODE (arg) == MEM)
	{
	  if (invariant_p (arg) == 1)
	    {
	      /* Look for giv with constant positive mult_val and nonconst
7421 7422
		 add_val. Insert insns to compute new compare value. 
		 ??? Turn this off due to possible overflow.  */
Richard Stallman committed
7423 7424 7425

	      for (v = bl->giv; v; v = v->next_iv)
		if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
7426
		    && ! v->ignore && ! v->maybe_dead && v->always_computable
7427 7428
		    && v->mode == mode
		    && 0)
Richard Stallman committed
7429 7430 7431
		  {
		    rtx tem;

7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442
		    /* If the giv V had the auto-inc address optimization applied
		       to it, and INSN occurs between the giv insn and the biv
		       insn, then we must adjust the value used here.
		       This is rare, so we don't bother to do so.  */
		    if (v->auto_inc_opt
			&& ((INSN_LUID (v->insn) < INSN_LUID (insn)
			     && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
			    || (INSN_LUID (v->insn) > INSN_LUID (insn)
				&& INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
		      continue;

Richard Stallman committed
7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493
		    if (! eliminate_p)
		      return 1;

		    tem = gen_reg_rtx (mode);

		    /* Replace biv with giv's reduced register.  */
		    validate_change (insn, &XEXP (x, 1 - arg_operand),
				     v->new_reg, 1);

		    /* Compute value to compare against.  */
		    emit_iv_add_mult (arg, v->mult_val, v->add_val,
				      tem, where);
		    validate_change (insn, &XEXP (x, arg_operand), tem, 1);
		    if (apply_change_group ())
		      return 1;
		  }
	    }

	  /* This code has problems.  Basically, you can't know when
	     seeing if we will eliminate BL, whether a particular giv
	     of ARG will be reduced.  If it isn't going to be reduced,
	     we can't eliminate BL.  We can try forcing it to be reduced,
	     but that can generate poor code.

	     The problem is that the benefit of reducing TV, below should
	     be increased if BL can actually be eliminated, but this means
	     we might have to do a topological sort of the order in which
	     we try to process biv.  It doesn't seem worthwhile to do
	     this sort of thing now.  */

#if 0
	  /* Otherwise the reg compared with had better be a biv.  */
	  if (GET_CODE (arg) != REG
	      || reg_iv_type[REGNO (arg)] != BASIC_INDUCT)
	    return 0;

	  /* Look for a pair of givs, one for each biv,
	     with identical coefficients.  */
	  for (v = bl->giv; v; v = v->next_iv)
	    {
	      struct induction *tv;

	      if (v->ignore || v->maybe_dead || v->mode != mode)
		continue;

	      for (tv = reg_biv_class[REGNO (arg)]->giv; tv; tv = tv->next_iv)
		if (! tv->ignore && ! tv->maybe_dead
		    && rtx_equal_p (tv->mult_val, v->mult_val)
		    && rtx_equal_p (tv->add_val, v->add_val)
		    && tv->mode == mode)
		  {
7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504
		    /* If the giv V had the auto-inc address optimization applied
		       to it, and INSN occurs between the giv insn and the biv
		       insn, then we must adjust the value used here.
		       This is rare, so we don't bother to do so.  */
		    if (v->auto_inc_opt
			&& ((INSN_LUID (v->insn) < INSN_LUID (insn)
			     && INSN_LUID (insn) < INSN_LUID (bl->biv->insn))
			    || (INSN_LUID (v->insn) > INSN_LUID (insn)
				&& INSN_LUID (insn) > INSN_LUID (bl->biv->insn))))
		      continue;

Richard Stallman committed
7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528
		    if (! eliminate_p)
		      return 1;

		    /* Replace biv with its giv's reduced reg.  */
		    XEXP (x, 1-arg_operand) = v->new_reg;
		    /* Replace other operand with the other giv's
		       reduced reg.  */
		    XEXP (x, arg_operand) = tv->new_reg;
		    return 1;
		  }
	    }
#endif
	}

      /* If we get here, the biv can't be eliminated.  */
      return 0;

    case MEM:
      /* If this address is a DEST_ADDR giv, it doesn't matter if the
	 biv is used in it, since it will be replaced.  */
      for (v = bl->giv; v; v = v->next_iv)
	if (v->giv_type == DEST_ADDR && v->location == &XEXP (x, 0))
	  return 1;
      break;
7529 7530 7531

    default:
      break;
Richard Stallman committed
7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570
    }

  /* See if any subexpression fails elimination.  */
  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      switch (fmt[i])
	{
	case 'e':
	  if (! maybe_eliminate_biv_1 (XEXP (x, i), insn, bl, 
				       eliminate_p, where))
	    return 0;
	  break;

	case 'E':
	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
	    if (! maybe_eliminate_biv_1 (XVECEXP (x, i, j), insn, bl,
					 eliminate_p, where))
	      return 0;
	  break;
	}
    }

  return 1;
}  

/* Return nonzero if the last use of REG
   is in an insn following INSN in the same basic block.  */

static int
last_use_this_basic_block (reg, insn)
     rtx reg;
     rtx insn;
{
  rtx n;
  for (n = insn;
       n && GET_CODE (n) != CODE_LABEL && GET_CODE (n) != JUMP_INSN;
       n = NEXT_INSN (n))
    {
7571
      if (REGNO_LAST_UID (REGNO (reg)) == INSN_UID (n))
Richard Stallman committed
7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588
	return 1;
    }
  return 0;
}

/* Called via `note_stores' to record the initial value of a biv.  Here we
   just record the location of the set and process it later.  */

static void
record_initial (dest, set)
     rtx dest;
     rtx set;
{
  struct iv_class *bl;

  if (GET_CODE (dest) != REG
      || REGNO (dest) >= max_reg_before_loop
7589
      || reg_iv_type[REGNO (dest)] != BASIC_INDUCT)
Richard Stallman committed
7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617
    return;

  bl = reg_biv_class[REGNO (dest)];

  /* If this is the first set found, record it.  */
  if (bl->init_insn == 0)
    {
      bl->init_insn = note_insn;
      bl->init_set = set;
    }
}

/* If any of the registers in X are "old" and currently have a last use earlier
   than INSN, update them to have a last use of INSN.  Their actual last use
   will be the previous insn but it will not have a valid uid_luid so we can't
   use it.  */

static void
update_reg_last_use (x, insn)
     rtx x;
     rtx insn;
{
  /* Check for the case where INSN does not have a valid luid.  In this case,
     there is no need to modify the regno_last_uid, as this can only happen
     when code is inserted after the loop_end to set a pseudo's final value,
     and hence this insn will never be the last use of x.  */
  if (GET_CODE (x) == REG && REGNO (x) < max_reg_before_loop
      && INSN_UID (insn) < max_uid_for_loop
7618 7619
      && uid_luid[REGNO_LAST_UID (REGNO (x))] < uid_luid[INSN_UID (insn)])
    REGNO_LAST_UID (REGNO (x)) = INSN_UID (insn);
Richard Stallman committed
7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665
  else
    {
      register int i, j;
      register char *fmt = GET_RTX_FORMAT (GET_CODE (x));
      for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
	{
	  if (fmt[i] == 'e')
	    update_reg_last_use (XEXP (x, i), insn);
	  else if (fmt[i] == 'E')
	    for (j = XVECLEN (x, i) - 1; j >= 0; j--)
	      update_reg_last_use (XVECEXP (x, i, j), insn);
	}
    }
}

/* Given a jump insn JUMP, return the condition that will cause it to branch
   to its JUMP_LABEL.  If the condition cannot be understood, or is an
   inequality floating-point comparison which needs to be reversed, 0 will
   be returned.

   If EARLIEST is non-zero, it is a pointer to a place where the earliest
   insn used in locating the condition was found.  If a replacement test
   of the condition is desired, it should be placed in front of that
   insn and we will be sure that the inputs are still valid.

   The condition will be returned in a canonical form to simplify testing by
   callers.  Specifically:

   (1) The code will always be a comparison operation (EQ, NE, GT, etc.).
   (2) Both operands will be machine operands; (cc0) will have been replaced.
   (3) If an operand is a constant, it will be the second operand.
   (4) (LE x const) will be replaced with (LT x <const+1>) and similarly
       for GE, GEU, and LEU.  */

rtx
get_condition (jump, earliest)
     rtx jump;
     rtx *earliest;
{
  enum rtx_code code;
  rtx prev = jump;
  rtx set;
  rtx tem;
  rtx op0, op1;
  int reverse_code = 0;
  int did_reverse_condition = 0;
7666
  enum machine_mode mode;
Richard Stallman committed
7667 7668 7669 7670 7671 7672 7673

  /* If this is not a standard conditional jump, we can't parse it.  */
  if (GET_CODE (jump) != JUMP_INSN
      || ! condjump_p (jump) || simplejump_p (jump))
    return 0;

  code = GET_CODE (XEXP (SET_SRC (PATTERN (jump)), 0));
7674
  mode = GET_MODE (XEXP (SET_SRC (PATTERN (jump)), 0));
Richard Stallman committed
7675 7676 7677 7678 7679 7680 7681 7682
  op0 = XEXP (XEXP (SET_SRC (PATTERN (jump)), 0), 0);
  op1 = XEXP (XEXP (SET_SRC (PATTERN (jump)), 0), 1);

  if (earliest)
    *earliest = jump;

  /* If this branches to JUMP_LABEL when the condition is false, reverse
     the condition.  */
7683 7684
  if (GET_CODE (XEXP (SET_SRC (PATTERN (jump)), 2)) == LABEL_REF
      && XEXP (XEXP (SET_SRC (PATTERN (jump)), 2), 0) == JUMP_LABEL (jump))
Richard Stallman committed
7685 7686 7687 7688 7689 7690 7691
    code = reverse_condition (code), did_reverse_condition ^= 1;

  /* If we are comparing a register with zero, see if the register is set
     in the previous insn to a COMPARE or a comparison operation.  Perform
     the same tests as a function of STORE_FLAG_VALUE as find_comparison_args
     in cse.c  */

7692
  while (GET_RTX_CLASS (code) == '<' && op1 == CONST0_RTX (GET_MODE (op0)))
Richard Stallman committed
7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736
    {
      /* Set non-zero when we find something of interest.  */
      rtx x = 0;

#ifdef HAVE_cc0
      /* If comparison with cc0, import actual comparison from compare
	 insn.  */
      if (op0 == cc0_rtx)
	{
	  if ((prev = prev_nonnote_insn (prev)) == 0
	      || GET_CODE (prev) != INSN
	      || (set = single_set (prev)) == 0
	      || SET_DEST (set) != cc0_rtx)
	    return 0;

	  op0 = SET_SRC (set);
	  op1 = CONST0_RTX (GET_MODE (op0));
	  if (earliest)
	    *earliest = prev;
	}
#endif

      /* If this is a COMPARE, pick up the two things being compared.  */
      if (GET_CODE (op0) == COMPARE)
	{
	  op1 = XEXP (op0, 1);
	  op0 = XEXP (op0, 0);
	  continue;
	}
      else if (GET_CODE (op0) != REG)
	break;

      /* Go back to the previous insn.  Stop if it is not an INSN.  We also
	 stop if it isn't a single set or if it has a REG_INC note because
	 we don't want to bother dealing with it.  */

      if ((prev = prev_nonnote_insn (prev)) == 0
	  || GET_CODE (prev) != INSN
	  || FIND_REG_INC_NOTE (prev, 0)
	  || (set = single_set (prev)) == 0)
	break;

      /* If this is setting OP0, get what it sets it to if it looks
	 relevant.  */
7737
      if (rtx_equal_p (SET_DEST (set), op0))
Richard Stallman committed
7738 7739 7740
	{
	  enum machine_mode inner_mode = GET_MODE (SET_SRC (set));

7741 7742 7743 7744 7745
	  /* ??? We may not combine comparisons done in a CCmode with
	     comparisons not done in a CCmode.  This is to aid targets
	     like Alpha that have an IEEE compliant EQ instruction, and
	     a non-IEEE compliant BEQ instruction.  The use of CCmode is
	     actually artificial, simply to prevent the combination, but
7746 7747 7748 7749 7750 7751 7752 7753
	     should not affect other platforms.

	     However, we must allow VOIDmode comparisons to match either
	     CCmode or non-CCmode comparison, because some ports have
	     modeless comparisons inside branch patterns.

	     ??? This mode check should perhaps look more like the mode check
	     in simplify_comparison in combine.  */
7754

Richard Stallman committed
7755
	  if ((GET_CODE (SET_SRC (set)) == COMPARE
7756 7757 7758
	       || (((code == NE
		     || (code == LT
			 && GET_MODE_CLASS (inner_mode) == MODE_INT
7759 7760
			 && (GET_MODE_BITSIZE (inner_mode)
			     <= HOST_BITS_PER_WIDE_INT)
7761
			 && (STORE_FLAG_VALUE
7762 7763
			     & ((HOST_WIDE_INT) 1
				<< (GET_MODE_BITSIZE (inner_mode) - 1))))
7764 7765 7766 7767 7768 7769
#ifdef FLOAT_STORE_FLAG_VALUE
		     || (code == LT
			 && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
			 && FLOAT_STORE_FLAG_VALUE < 0)
#endif
		     ))
7770
		   && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'))
7771 7772 7773
	      && (((GET_MODE_CLASS (mode) == MODE_CC)
		   == (GET_MODE_CLASS (inner_mode) == MODE_CC))
		  || mode == VOIDmode || inner_mode == VOIDmode))
Richard Stallman committed
7774
	    x = SET_SRC (set);
7775 7776
	  else if (((code == EQ
		     || (code == GE
7777 7778
			 && (GET_MODE_BITSIZE (inner_mode)
			     <= HOST_BITS_PER_WIDE_INT)
7779 7780
			 && GET_MODE_CLASS (inner_mode) == MODE_INT
			 && (STORE_FLAG_VALUE
7781 7782
			     & ((HOST_WIDE_INT) 1
				<< (GET_MODE_BITSIZE (inner_mode) - 1))))
7783 7784 7785 7786
#ifdef FLOAT_STORE_FLAG_VALUE
		     || (code == GE
			 && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
			 && FLOAT_STORE_FLAG_VALUE < 0)
7787
#endif
7788
		     ))
7789
		   && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'
7790 7791 7792 7793
	           && (((GET_MODE_CLASS (mode) == MODE_CC)
			== (GET_MODE_CLASS (inner_mode) == MODE_CC))
		       || mode == VOIDmode || inner_mode == VOIDmode))

Richard Stallman committed
7794 7795 7796 7797 7798 7799 7800 7801
	    {
	      /* We might have reversed a LT to get a GE here.  But this wasn't
		 actually the comparison of data, so we don't flag that we
		 have had to reverse the condition.  */
	      did_reverse_condition ^= 1;
	      reverse_code = 1;
	      x = SET_SRC (set);
	    }
7802 7803
	  else
	    break;
Richard Stallman committed
7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835
	}

      else if (reg_set_p (op0, prev))
	/* If this sets OP0, but not directly, we have to give up.  */
	break;

      if (x)
	{
	  if (GET_RTX_CLASS (GET_CODE (x)) == '<')
	    code = GET_CODE (x);
	  if (reverse_code)
	    {
	      code = reverse_condition (code);
	      did_reverse_condition ^= 1;
	      reverse_code = 0;
	    }

	  op0 = XEXP (x, 0), op1 = XEXP (x, 1);
	  if (earliest)
	    *earliest = prev;
	}
    }

  /* If constant is first, put it last.  */
  if (CONSTANT_P (op0))
    code = swap_condition (code), tem = op0, op0 = op1, op1 = tem;

  /* If OP0 is the result of a comparison, we weren't able to find what
     was really being compared, so fail.  */
  if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
    return 0;

7836 7837 7838 7839 7840 7841 7842
  /* Canonicalize any ordered comparison with integers involving equality
     if we can do computations in the relevant mode and we do not
     overflow.  */

  if (GET_CODE (op1) == CONST_INT
      && GET_MODE (op0) != VOIDmode
      && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT)
Richard Stallman committed
7843
    {
7844 7845
      HOST_WIDE_INT const_val = INTVAL (op1);
      unsigned HOST_WIDE_INT uconst_val = const_val;
7846 7847
      unsigned HOST_WIDE_INT max_val
	= (unsigned HOST_WIDE_INT) GET_MODE_MASK (GET_MODE (op0));
Richard Stallman committed
7848 7849

      switch (code)
7850 7851
	{
	case LE:
Kaveh R. Ghazi committed
7852
	  if ((unsigned HOST_WIDE_INT) const_val != max_val >> 1)
7853 7854
	    code = LT,	op1 = GEN_INT (const_val + 1);
	  break;
Richard Stallman committed
7855

7856 7857
	/* When cross-compiling, const_val might be sign-extended from
	   BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
7858
	case GE:
Kaveh R. Ghazi committed
7859
	  if ((HOST_WIDE_INT) (const_val & max_val)
7860 7861 7862 7863
	      != (((HOST_WIDE_INT) 1
		   << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
	    code = GT, op1 = GEN_INT (const_val - 1);
	  break;
Richard Stallman committed
7864

7865
	case LEU:
7866
	  if (uconst_val < max_val)
7867 7868
	    code = LTU, op1 = GEN_INT (uconst_val + 1);
	  break;
Richard Stallman committed
7869

7870 7871 7872 7873
	case GEU:
	  if (uconst_val != 0)
	    code = GTU, op1 = GEN_INT (uconst_val - 1);
	  break;
7874 7875 7876

	default:
	  break;
7877
	}
Richard Stallman committed
7878 7879 7880 7881 7882 7883
    }

  /* If this was floating-point and we reversed anything other than an
     EQ or NE, return zero.  */
  if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
      && did_reverse_condition && code != NE && code != EQ
7884
      && ! flag_fast_math
Richard Stallman committed
7885 7886 7887 7888 7889 7890 7891 7892 7893
      && GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
    return 0;

#ifdef HAVE_cc0
  /* Never return CC0; return zero instead.  */
  if (op0 == cc0_rtx)
    return 0;
#endif

7894
  return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
Richard Stallman committed
7895 7896 7897 7898 7899 7900 7901 7902 7903
}

/* Similar to above routine, except that we also put an invariant last
   unless both operands are invariants.  */

rtx
get_condition_for_loop (x)
     rtx x;
{
7904
  rtx comparison = get_condition (x, NULL_PTR);
Richard Stallman committed
7905 7906 7907 7908 7909 7910

  if (comparison == 0
      || ! invariant_p (XEXP (comparison, 0))
      || invariant_p (XEXP (comparison, 1)))
    return comparison;

7911 7912
  return gen_rtx_fmt_ee (swap_condition (GET_CODE (comparison)), VOIDmode,
			 XEXP (comparison, 1), XEXP (comparison, 0));
Richard Stallman committed
7913
}
7914

Kaveh R. Ghazi committed
7915
#ifdef HAVE_decrement_and_branch_on_count
7916 7917 7918 7919 7920 7921
/* Instrument loop for insertion of bct instruction.  We distinguish between
   loops with compile-time bounds and those with run-time bounds. 
   Information from loop_iterations() is used to compute compile-time bounds.
   Run-time bounds should use loop preconditioning, but currently ignored.
 */

7922
static void
7923
insert_bct (loop_start, loop_end, loop_info)
7924
     rtx loop_start, loop_end;
7925
     struct loop_info *loop_info;
7926 7927
{
  int i;
7928
  unsigned HOST_WIDE_INT n_iterations;
7929

Kaveh R. Ghazi committed
7930
#if 0
7931
  int increment_direction, compare_direction;
7932

7933 7934 7935
  /* If the loop condition is <= or >=, the number of iteration
      is 1 more than the range of the bounds of the loop.  */
  int add_iteration = 0;
7936

7937
  enum machine_mode loop_var_mode = word_mode;
Kaveh R. Ghazi committed
7938
#endif
7939

7940
  int loop_num = uid_loop_num [INSN_UID (loop_start)];
7941

7942
  /* It's impossible to instrument a competely unrolled loop.  */
7943
  if (loop_info->unroll_number == -1)
7944 7945
    return;

7946 7947
  /* Make sure that the count register is not in use.  */
  if (loop_used_count_register [loop_num])
7948
    {
7949
      if (loop_dump_stream)
7950
	fprintf (loop_dump_stream,
7951 7952
		 "insert_bct %d: BCT instrumentation failed: count register already in use\n",
		 loop_num);
7953 7954 7955
      return;
    }

7956 7957 7958
  /* Make sure that the function has no indirect jumps.  */
  if (indirect_jump_in_function)
    {
7959 7960
      if (loop_dump_stream)
	fprintf (loop_dump_stream,
7961 7962
		 "insert_bct %d: BCT instrumentation failed: indirect jump in function\n",
		 loop_num);
7963 7964 7965
      return;
    }

7966 7967 7968 7969 7970
  /* Make sure that the last loop insn is a conditional jump.  */
  if (GET_CODE (PREV_INSN (loop_end)) != JUMP_INSN
      || ! condjump_p (PREV_INSN (loop_end))
      || simplejump_p (PREV_INSN (loop_end)))
    {
7971 7972
      if (loop_dump_stream)
	fprintf (loop_dump_stream,
7973 7974
		 "insert_bct %d: BCT instrumentation failed: invalid jump at loop end\n",
		 loop_num);
7975 7976 7977
      return;
    }

7978 7979 7980
  /* Make sure that the loop does not contain a function call
     (the count register might be altered by the called function).  */
  if (loop_has_call)
7981
    {
7982 7983 7984 7985 7986 7987
      if (loop_dump_stream)
	fprintf (loop_dump_stream,
		 "insert_bct %d: BCT instrumentation failed: function call in loop\n",
		 loop_num);
      return;
    }
7988

7989 7990
  /* Make sure that the loop does not jump via a table.
     (the count register might be used to perform the branch on table).  */
7991
  if (loop_has_tablejump)
7992
    {
7993 7994 7995 7996 7997
      if (loop_dump_stream)
	fprintf (loop_dump_stream,
		 "insert_bct %d: BCT instrumentation failed: computed branch in the loop\n",
		 loop_num);
      return;
7998
    }
7999

8000
  /* Account for loop unrolling in instrumented iteration count.  */
8001 8002
  if (loop_info->unroll_number > 1)
    n_iterations = loop_info->n_iterations / loop_info->unroll_number;
8003
  else
8004
    n_iterations = loop_info->n_iterations;
8005

8006 8007 8008 8009 8010 8011 8012 8013 8014
  if (n_iterations != 0 && n_iterations < 3)
    {
      /* Allow an enclosing outer loop to benefit if possible.  */
      if (loop_dump_stream)
	fprintf (loop_dump_stream,
		 "insert_bct %d: Too few iterations to benefit from BCT optimization\n",
		 loop_num);
      return;
    }
8015

8016
  /* Try to instrument the loop.  */
8017

8018 8019 8020 8021
  /* Handle the simpler case, where the bounds are known at compile time.  */
  if (n_iterations > 0)
    {
      /* Mark all enclosing loops that they cannot use count register.  */
8022
      for (i = loop_num; i != -1; i = loop_outer_loop[i])
8023
	loop_used_count_register[i] = 1;
8024 8025 8026 8027
      instrument_loop_bct (loop_start, loop_end, GEN_INT (n_iterations));
      return;
    }

8028 8029 8030 8031
  /* Handle the more complex case, that the bounds are NOT known
     at compile time.  In this case we generate run_time calculation
     of the number of iterations.  */

8032
  if (loop_info->iteration_var == 0)
8033 8034 8035 8036 8037 8038 8039 8040
    {
      if (loop_dump_stream)
	fprintf (loop_dump_stream,
		 "insert_bct %d: BCT Runtime Instrumentation failed: no loop iteration variable found\n",
		 loop_num);
      return;
    }

8041 8042
  if (GET_MODE_CLASS (GET_MODE (loop_info->iteration_var)) != MODE_INT
      || GET_MODE_SIZE (GET_MODE (loop_info->iteration_var)) != UNITS_PER_WORD)
8043 8044 8045
    {
      if (loop_dump_stream)
	fprintf (loop_dump_stream,
8046
		 "insert_bct %d: BCT Runtime Instrumentation failed: loop variable not integer\n",
8047 8048 8049
		 loop_num);
      return;
    }
8050 8051

  /* With runtime bounds, if the compare is of the form '!=' we give up */
8052
  if (loop_info->comparison_code == NE)
8053 8054 8055
    {
      if (loop_dump_stream)
	fprintf (loop_dump_stream,
8056
		 "insert_bct %d: BCT Runtime Instrumentation failed: runtime bounds with != comparison\n",
8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067
		 loop_num);
      return;
    }
/* Use common loop preconditioning code instead.  */
#if 0
  else
    {
      /* We rely on the existence of run-time guard to ensure that the
	 loop executes at least once.  */
      rtx sequence;
      rtx iterations_num_reg;
8068

8069 8070
      unsigned HOST_WIDE_INT increment_value_abs
	= INTVAL (increment) * increment_direction;
8071

8072 8073 8074 8075 8076 8077 8078 8079 8080
      /* make sure that the increment is a power of two, otherwise (an
	 expensive) divide is needed.  */
      if (exact_log2 (increment_value_abs) == -1)
	{
	  if (loop_dump_stream)
	    fprintf (loop_dump_stream,
		     "insert_bct: not instrumenting BCT because the increment is not power of 2\n");
	  return;
	}
8081

8082 8083
      /* compute the number of iterations */
      start_sequence ();
8084
      {
8085
	rtx temp_reg;
8086

8087 8088 8089 8090 8091
	/* Again, the number of iterations is calculated by:
	   ;
	   ;                  compare-val - initial-val + (increment -1) + additional-iteration
	   ; num_iterations = -----------------------------------------------------------------
	   ;                                           increment
8092
	 */
8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107
	/* ??? Do we have to call copy_rtx here before passing rtx to
	   expand_binop?  */
	if (compare_direction > 0)
	  {
	    /* <, <= :the loop variable is increasing */
	    temp_reg = expand_binop (loop_var_mode, sub_optab,
				     comparison_value, initial_value,
				     NULL_RTX, 0, OPTAB_LIB_WIDEN);
	  }
	else
	  {
	    temp_reg = expand_binop (loop_var_mode, sub_optab,
				     initial_value, comparison_value,
				     NULL_RTX, 0, OPTAB_LIB_WIDEN);
	  }
8108

8109 8110 8111 8112 8113
	if (increment_value_abs - 1 + add_iteration != 0)
	  temp_reg = expand_binop (loop_var_mode, add_optab, temp_reg,
				   GEN_INT (increment_value_abs - 1
					    + add_iteration),
				   NULL_RTX, 0, OPTAB_LIB_WIDEN);
8114

8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135
	if (increment_value_abs != 1)
	  {
	    /* ??? This will generate an expensive divide instruction for
	       most targets.  The original authors apparently expected this
	       to be a shift, since they test for power-of-2 divisors above,
	       but just naively generating a divide instruction will not give 
	       a shift.  It happens to work for the PowerPC target because
	       the rs6000.md file has a divide pattern that emits shifts.
	       It will probably not work for any other target.  */
	    iterations_num_reg = expand_binop (loop_var_mode, sdiv_optab,
					       temp_reg,
					       GEN_INT (increment_value_abs),
					       NULL_RTX, 0, OPTAB_LIB_WIDEN);
	  }
	else
	  iterations_num_reg = temp_reg;
      }
      sequence = gen_sequence ();
      end_sequence ();
      emit_insn_before (sequence, loop_start);
      instrument_loop_bct (loop_start, loop_end, iterations_num_reg);
8136
    }
8137 8138 8139

  return;
#endif /* Complex case */
8140 8141
}

8142 8143 8144 8145
/* Instrument loop by inserting a bct in it as follows:
   1. A new counter register is created.
   2. In the head of the loop the new variable is initialized to the value
   passed in the loop_num_iterations parameter.
8146
   3. At the end of the loop, comparison of the register with 0 is generated.
8147 8148 8149 8150 8151
   The created comparison follows the pattern defined for the
   decrement_and_branch_on_count insn, so this insn will be generated.
   4. The branch on the old variable are deleted.  The compare must remain
   because it might be used elsewhere.  If the loop-variable or condition
   register are used elsewhere, they will be eliminated by flow.  */
8152 8153 8154 8155 8156 8157

static void
instrument_loop_bct (loop_start, loop_end, loop_num_iterations)
     rtx loop_start, loop_end;
     rtx loop_num_iterations;
{
8158
  rtx counter_reg;
8159 8160 8161 8162 8163 8164
  rtx start_label;
  rtx sequence;

  if (HAVE_decrement_and_branch_on_count)
    {
      if (loop_dump_stream)
8165 8166 8167 8168 8169 8170 8171 8172 8173
	{
	  fputs ("instrument_bct: Inserting BCT (", loop_dump_stream);
	  if (GET_CODE (loop_num_iterations) == CONST_INT)
	    fprintf (loop_dump_stream, HOST_WIDE_INT_PRINT_DEC,
		     INTVAL (loop_num_iterations));
	  else
	    fputs ("runtime", loop_dump_stream);
	  fputs (" iterations)", loop_dump_stream);
	}
8174

8175 8176
      /* Discard original jump to continue loop.  Original compare result
	 may still be live, so it cannot be discarded explicitly.  */
8177 8178
      delete_insn (PREV_INSN (loop_end));

8179
      /* Insert the label which will delimit the start of the loop.  */
8180 8181 8182
      start_label = gen_label_rtx ();
      emit_label_after (start_label, loop_start);

8183
      /* Insert initialization of the count register into the loop header.  */
8184
      start_sequence ();
8185 8186
      counter_reg = gen_reg_rtx (word_mode);
      emit_insn (gen_move_insn (counter_reg, loop_num_iterations));
8187 8188
      sequence = gen_sequence ();
      end_sequence ();
8189
      emit_insn_before (sequence, loop_start);
8190

8191
      /* Insert new comparison on the count register instead of the
8192 8193
	 old one, generating the needed BCT pattern (that will be
	 later recognized by assembly generation phase).  */
8194
      emit_jump_insn_before (gen_decrement_and_branch_on_count (counter_reg,
8195
								start_label),
8196 8197 8198 8199 8200
			     loop_end);
      LABEL_NUSES (start_label)++;
    }

}
Kaveh R. Ghazi committed
8201 8202
#endif /* HAVE_decrement_and_branch_on_count */

8203
/* Scan the function and determine whether it has indirect (computed) jumps.
8204

8205 8206
   This is taken mostly from flow.c; similar code exists elsewhere
   in the compiler.  It may be useful to put this into rtlanal.c.  */
8207 8208 8209 8210 8211 8212
static int
indirect_jump_in_function_p (start)
     rtx start;
{
  rtx insn;

8213 8214 8215
  for (insn = start; insn; insn = NEXT_INSN (insn))
    if (computed_jump_p (insn))
      return 1;
8216 8217

  return 0;
8218
}
8219 8220 8221 8222 8223 8224 8225 8226

/* Add MEM to the LOOP_MEMS array, if appropriate.  See the
   documentation for LOOP_MEMS for the definition of `appropriate'.
   This function is called from prescan_loop via for_each_rtx.  */

static int
insert_loop_mem (mem, data)
     rtx *mem;
Kaveh R. Ghazi committed
8227
     void *data ATTRIBUTE_UNUSED;
8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284
{
  int i;
  rtx m = *mem;

  if (m == NULL_RTX)
    return 0;

  switch (GET_CODE (m))
    {
    case MEM:
      break;

    case CONST_DOUBLE:
      /* We're not interested in the MEM associated with a
	 CONST_DOUBLE, so there's no need to traverse into this.  */
      return -1;

    default:
      /* This is not a MEM.  */
      return 0;
    }

  /* See if we've already seen this MEM.  */
  for (i = 0; i < loop_mems_idx; ++i)
    if (rtx_equal_p (m, loop_mems[i].mem)) 
      {
	if (GET_MODE (m) != GET_MODE (loop_mems[i].mem))
	  /* The modes of the two memory accesses are different.  If
	     this happens, something tricky is going on, and we just
	     don't optimize accesses to this MEM.  */
	  loop_mems[i].optimize = 0;

	return 0;
      }

  /* Resize the array, if necessary.  */
  if (loop_mems_idx == loop_mems_allocated) 
    {
      if (loop_mems_allocated != 0)
	loop_mems_allocated *= 2;
      else
	loop_mems_allocated = 32;

      loop_mems = (loop_mem_info*) 
	xrealloc (loop_mems,
		  loop_mems_allocated * sizeof (loop_mem_info)); 
    }

  /* Actually insert the MEM.  */
  loop_mems[loop_mems_idx].mem = m;
  /* We can't hoist this MEM out of the loop if it's a BLKmode MEM
     because we can't put it in a register.  We still store it in the
     table, though, so that if we see the same address later, but in a
     non-BLK mode, we'll not think we can optimize it at that point.  */
  loop_mems[loop_mems_idx].optimize = (GET_MODE (m) != BLKmode);
  loop_mems[loop_mems_idx].reg = NULL_RTX;
  ++loop_mems_idx;
8285 8286

  return 0;
8287 8288
}

8289
/* Like load_mems, but also ensures that SET_IN_LOOP,
8290 8291 8292 8293 8294 8295 8296 8297 8298 8299
   MAY_NOT_OPTIMIZE, REG_SINGLE_USAGE, and INSN_COUNT have the correct
   values after load_mems.  */

static void
load_mems_and_recount_loop_regs_set (scan_start, end, loop_top, start,
				     reg_single_usage, insn_count)
     rtx scan_start;
     rtx end;
     rtx loop_top;
     rtx start;
8300
     varray_type reg_single_usage;
8301 8302 8303 8304 8305 8306
     int *insn_count;
{
  int nregs = max_reg_num ();

  load_mems (scan_start, end, loop_top, start);
  
8307
  /* Recalculate set_in_loop and friends since load_mems may have
8308 8309 8310 8311 8312 8313 8314 8315 8316
     created new registers.  */
  if (max_reg_num () > nregs)
    {
      int i;
      int old_nregs;

      old_nregs = nregs;
      nregs = max_reg_num ();

8317
      if ((unsigned) nregs > set_in_loop->num_elements)
8318 8319
	{
	  /* Grow all the arrays.  */
8320
	  VARRAY_GROW (set_in_loop, nregs);
8321 8322 8323 8324 8325 8326
	  VARRAY_GROW (n_times_set, nregs);
	  VARRAY_GROW (may_not_optimize, nregs);
	  if (reg_single_usage)
	    VARRAY_GROW (reg_single_usage, nregs);
	}
      /* Clear the arrays */
8327
      bzero ((char *) &set_in_loop->data, nregs * sizeof (int));
8328 8329 8330
      bzero ((char *) &may_not_optimize->data, nregs * sizeof (char));
      if (reg_single_usage)
	bzero ((char *) &reg_single_usage->data, nregs * sizeof (rtx));
8331 8332 8333 8334 8335 8336

      count_loop_regs_set (loop_top ? loop_top : start, end,
			   may_not_optimize, reg_single_usage,
			   insn_count, nregs); 

      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
8337 8338
	{
	  VARRAY_CHAR (may_not_optimize, i) = 1;
8339
	  VARRAY_INT (set_in_loop, i) = 1;
8340
	}
8341
      
8342 8343 8344
#ifdef AVOID_CCMODE_COPIES
      /* Don't try to move insns which set CC registers if we should not
	 create CCmode register copies.  */
8345
      for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
8346
	if (GET_MODE_CLASS (GET_MODE (regno_reg_rtx[i])) == MODE_CC)
8347
	  VARRAY_CHAR (may_not_optimize, i) = 1;
8348 8349
#endif

8350 8351 8352
      /* Set n_times_set for the new registers.  */
      bcopy ((char *) (&set_in_loop->data.i[0] + old_nregs),
	     (char *) (&n_times_set->data.i[0] + old_nregs),
8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416
	     (nregs - old_nregs) * sizeof (int));
    }
}

/* Move MEMs into registers for the duration of the loop.  SCAN_START
   is the first instruction in the loop (as it is executed).  The
   other parameters are as for next_insn_in_loop.  */

static void
load_mems (scan_start, end, loop_top, start)
     rtx scan_start;
     rtx end;
     rtx loop_top;
     rtx start;
{
  int maybe_never = 0;
  int i;
  rtx p;
  rtx label = NULL_RTX;
  rtx end_label;

  if (loop_mems_idx > 0) 
    {
      /* Nonzero if the next instruction may never be executed.  */
      int next_maybe_never = 0;

      /* Check to see if it's possible that some instructions in the
	 loop are never executed.  */
      for (p = next_insn_in_loop (scan_start, scan_start, end, loop_top); 
	   p != NULL_RTX && !maybe_never; 
	   p = next_insn_in_loop (p, scan_start, end, loop_top))
	{
	  if (GET_CODE (p) == CODE_LABEL)
	    maybe_never = 1;
	  else if (GET_CODE (p) == JUMP_INSN
		   /* If we enter the loop in the middle, and scan
		      around to the beginning, don't set maybe_never
		      for that.  This must be an unconditional jump,
		      otherwise the code at the top of the loop might
		      never be executed.  Unconditional jumps are
		      followed a by barrier then loop end.  */
		   && ! (GET_CODE (p) == JUMP_INSN 
			 && JUMP_LABEL (p) == loop_top
			 && NEXT_INSN (NEXT_INSN (p)) == end
			 && simplejump_p (p)))
	    {
	      if (!condjump_p (p))
		/* Something complicated.  */
		maybe_never = 1;
	      else
		/* If there are any more instructions in the loop, they
		   might not be reached.  */
		next_maybe_never = 1; 
	    } 
	  else if (next_maybe_never)
	    maybe_never = 1;
	}

      /* Actually move the MEMs.  */
      for (i = 0; i < loop_mems_idx; ++i) 
	{
	  int written = 0;
	  rtx reg;
	  rtx mem = loop_mems[i].mem;
Jeff Law committed
8417
	  rtx mem_list_entry;
8418 8419 8420 8421 8422 8423 8424 8425

	  if (MEM_VOLATILE_P (mem) 
	      || invariant_p (XEXP (mem, 0)) != 1)
	    /* There's no telling whether or not MEM is modified.  */
	    loop_mems[i].optimize = 0;

	  /* Go through the MEMs written to in the loop to see if this
	     one is aliased by one of them.  */
Jeff Law committed
8426 8427
	  mem_list_entry = loop_store_mems;
	  while (mem_list_entry)
8428
	    {
Jeff Law committed
8429
	      if (rtx_equal_p (mem, XEXP (mem_list_entry, 0)))
8430
		written = 1;
Jeff Law committed
8431
	      else if (true_dependence (XEXP (mem_list_entry, 0), VOIDmode,
8432 8433 8434 8435 8436 8437
					mem, rtx_varies_p))
		{
		  /* MEM is indeed aliased by this store.  */
		  loop_mems[i].optimize = 0;
		  break;
		}
Jeff Law committed
8438
	      mem_list_entry = XEXP (mem_list_entry, 1);
8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466 8467 8468 8469 8470 8471 8472 8473 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484 8485 8486 8487 8488
	    }
	  
	  /* If this MEM is written to, we must be sure that there
	     are no reads from another MEM that aliases this one.  */ 
	  if (loop_mems[i].optimize && written)
	    {
	      int j;

	      for (j = 0; j < loop_mems_idx; ++j)
		{
		  if (j == i)
		    continue;
		  else if (true_dependence (mem,
					    VOIDmode,
					    loop_mems[j].mem,
					    rtx_varies_p))
		    {
		      /* It's not safe to hoist loop_mems[i] out of
			 the loop because writes to it might not be
			 seen by reads from loop_mems[j].  */
		      loop_mems[i].optimize = 0;
		      break;
		    }
		}
	    }

	  if (maybe_never && may_trap_p (mem))
	    /* We can't access the MEM outside the loop; it might
	       cause a trap that wouldn't have happened otherwise.  */
	    loop_mems[i].optimize = 0;
	  
	  if (!loop_mems[i].optimize)
	    /* We thought we were going to lift this MEM out of the
	       loop, but later discovered that we could not.  */
	    continue;

	  /* Allocate a pseudo for this MEM.  We set REG_USERVAR_P in
	     order to keep scan_loop from moving stores to this MEM
	     out of the loop just because this REG is neither a
	     user-variable nor used in the loop test.  */
	  reg = gen_reg_rtx (GET_MODE (mem));
	  REG_USERVAR_P (reg) = 1;
	  loop_mems[i].reg = reg;

	  /* Now, replace all references to the MEM with the
	     corresponding pesudos.  */
	  for (p = next_insn_in_loop (scan_start, scan_start, end, loop_top);
	       p != NULL_RTX;
	       p = next_insn_in_loop (p, scan_start, end, loop_top))
	    {
8489 8490 8491
	      rtx_and_int ri;
	      ri.r = p;
	      ri.i = i;
8492 8493 8494 8495 8496 8497 8498 8499 8500 8501 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520
	      for_each_rtx (&p, replace_loop_mem, &ri);
	    }

	  if (!apply_change_group ())
	    /* We couldn't replace all occurrences of the MEM.  */
	    loop_mems[i].optimize = 0;
	  else
	    {
	      rtx set;

	      /* Load the memory immediately before START, which is
		 the NOTE_LOOP_BEG.  */
	      set = gen_rtx_SET (GET_MODE (reg), reg, mem);
	      emit_insn_before (set, start);

	      if (written)
		{
		  if (label == NULL_RTX)
		    {
		      /* We must compute the former
			 right-after-the-end label before we insert
			 the new one.  */
		      end_label = next_label (end);
		      label = gen_label_rtx ();
		      emit_label_after (label, end);
		    }

		  /* Store the memory immediately after END, which is
		   the NOTE_LOOP_END.  */
8521
		  set = gen_rtx_SET (GET_MODE (reg), copy_rtx (mem), reg); 
8522 8523 8524 8525 8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 8536 8537 8538 8539
		  emit_insn_after (set, label);
		}

	      if (loop_dump_stream)
		{
		  fprintf (loop_dump_stream, "Hoisted regno %d %s from ",
			   REGNO (reg), (written ? "r/w" : "r/o"));
		  print_rtl (loop_dump_stream, mem);
		  fputc ('\n', loop_dump_stream);
		}
	    }
	}
    }

  if (label != NULL_RTX)
    {
      /* Now, we need to replace all references to the previous exit
	 label with the new one.  */
8540 8541 8542
      rtx_pair rr; 
      rr.r1 = end_label;
      rr.r2 = label;
8543 8544

      for (p = start; p != end; p = NEXT_INSN (p))
8545 8546 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556
	{
	  for_each_rtx (&p, replace_label, &rr);

	  /* If this is a JUMP_INSN, then we also need to fix the JUMP_LABEL
	     field.  This is not handled by for_each_rtx because it doesn't
	     handle unprinted ('0') fields.  We need to update JUMP_LABEL
	     because the immediately following unroll pass will use it.
	     replace_label would not work anyways, because that only handles
	     LABEL_REFs.  */
	  if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p) == end_label)
	    JUMP_LABEL (p) = label;
	}
8557 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 8635 8636
    }
}

/* Replace MEM with its associated pseudo register.  This function is
   called from load_mems via for_each_rtx.  DATA is actually an
   rtx_and_int * describing the instruction currently being scanned
   and the MEM we are currently replacing.  */

static int
replace_loop_mem (mem, data)
     rtx *mem;
     void *data;
{
  rtx_and_int *ri; 
  rtx insn;
  int i;
  rtx m = *mem;

  if (m == NULL_RTX)
    return 0;

  switch (GET_CODE (m))
    {
    case MEM:
      break;

    case CONST_DOUBLE:
      /* We're not interested in the MEM associated with a
	 CONST_DOUBLE, so there's no need to traverse into one.  */
      return -1;

    default:
      /* This is not a MEM.  */
      return 0;
    }

  ri = (rtx_and_int*) data;
  i = ri->i;

  if (!rtx_equal_p (loop_mems[i].mem, m))
    /* This is not the MEM we are currently replacing.  */
    return 0;

  insn = ri->r;

  /* Actually replace the MEM.  */
  validate_change (insn, mem, loop_mems[i].reg, 1);

  return 0;
}

/* Replace occurrences of the old exit label for the loop with the new
   one.  DATA is an rtx_pair containing the old and new labels,
   respectively.  */

static int
replace_label (x, data)
     rtx *x;
     void *data;
{
  rtx l = *x;
  rtx old_label = ((rtx_pair*) data)->r1;
  rtx new_label = ((rtx_pair*) data)->r2;

  if (l == NULL_RTX)
    return 0;

  if (GET_CODE (l) != LABEL_REF)
    return 0;

  if (XEXP (l, 0) != old_label)
    return 0;
  
  XEXP (l, 0) = new_label;
  ++LABEL_NUSES (new_label);
  --LABEL_NUSES (old_label);

  return 0;
}