1 /* Straight-line strength reduction.
2    Copyright (C) 2012-2018 Free Software Foundation, Inc.
3    Contributed by Bill Schmidt, IBM <wschmidt@linux.ibm.com>
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 /* There are many algorithms for performing strength reduction on
22    loops.  This is not one of them.  IVOPTS handles strength reduction
23    of induction variables just fine.  This pass is intended to pick
24    up the crumbs it leaves behind, by considering opportunities for
25    strength reduction along dominator paths.
26 
27    Strength reduction addresses explicit multiplies, and certain
28    multiplies implicit in addressing expressions.  It would also be
29    possible to apply strength reduction to divisions and modulos,
30    but such opportunities are relatively uncommon.
31 
32    Strength reduction is also currently restricted to integer operations.
33    If desired, it could be extended to floating-point operations under
34    control of something like -funsafe-math-optimizations.  */
35 
36 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "backend.h"
40 #include "rtl.h"
41 #include "tree.h"
42 #include "gimple.h"
43 #include "cfghooks.h"
44 #include "tree-pass.h"
45 #include "ssa.h"
46 #include "expmed.h"
47 #include "gimple-pretty-print.h"
48 #include "fold-const.h"
49 #include "gimple-iterator.h"
50 #include "gimplify-me.h"
51 #include "stor-layout.h"
52 #include "cfgloop.h"
53 #include "tree-cfg.h"
54 #include "domwalk.h"
55 #include "params.h"
56 #include "tree-ssa-address.h"
57 #include "tree-affine.h"
58 #include "tree-eh.h"
59 #include "builtins.h"
60 
61 /* Information about a strength reduction candidate.  Each statement
62    in the candidate table represents an expression of one of the
63    following forms (the special case of CAND_REF will be described
64    later):
65 
66    (CAND_MULT)  S1:  X = (B + i) * S
67    (CAND_ADD)   S1:  X = B + (i * S)
68 
69    Here X and B are SSA names, i is an integer constant, and S is
70    either an SSA name or a constant.  We call B the "base," i the
71    "index", and S the "stride."
72 
73    Any statement S0 that dominates S1 and is of the form:
74 
75    (CAND_MULT)  S0:  Y = (B + i') * S
76    (CAND_ADD)   S0:  Y = B + (i' * S)
77 
78    is called a "basis" for S1.  In both cases, S1 may be replaced by
79 
80                 S1':  X = Y + (i - i') * S,
81 
82    where (i - i') * S is folded to the extent possible.
83 
84    All gimple statements are visited in dominator order, and each
85    statement that may contribute to one of the forms of S1 above is
86    given at least one entry in the candidate table.  Such statements
87    include addition, pointer addition, subtraction, multiplication,
88    negation, copies, and nontrivial type casts.  If a statement may
89    represent more than one expression of the forms of S1 above,
90    multiple "interpretations" are stored in the table and chained
91    together.  Examples:
92 
93    * An add of two SSA names may treat either operand as the base.
94    * A multiply of two SSA names, likewise.
95    * A copy or cast may be thought of as either a CAND_MULT with
96      i = 0 and S = 1, or as a CAND_ADD with i = 0 or S = 0.
97 
98    Candidate records are allocated from an obstack.  They are addressed
99    both from a hash table keyed on S1, and from a vector of candidate
100    pointers arranged in predominator order.
101 
102    Opportunity note
103    ----------------
104    Currently we don't recognize:
105 
106      S0: Y = (S * i') - B
107      S1: X = (S * i) - B
108 
109    as a strength reduction opportunity, even though this S1 would
110    also be replaceable by the S1' above.  This can be added if it
111    comes up in practice.
112 
113    Strength reduction in addressing
114    --------------------------------
115    There is another kind of candidate known as CAND_REF.  A CAND_REF
116    describes a statement containing a memory reference having
117    complex addressing that might benefit from strength reduction.
118    Specifically, we are interested in references for which
119    get_inner_reference returns a base address, offset, and bitpos as
120    follows:
121 
122      base:    MEM_REF (T1, C1)
123      offset:  MULT_EXPR (PLUS_EXPR (T2, C2), C3)
124      bitpos:  C4 * BITS_PER_UNIT
125 
126    Here T1 and T2 are arbitrary trees, and C1, C2, C3, C4 are
127    arbitrary integer constants.  Note that C2 may be zero, in which
128    case the offset will be MULT_EXPR (T2, C3).
129 
130    When this pattern is recognized, the original memory reference
131    can be replaced with:
132 
133      MEM_REF (POINTER_PLUS_EXPR (T1, MULT_EXPR (T2, C3)),
134               C1 + (C2 * C3) + C4)
135 
136    which distributes the multiply to allow constant folding.  When
137    two or more addressing expressions can be represented by MEM_REFs
138    of this form, differing only in the constants C1, C2, and C4,
139    making this substitution produces more efficient addressing during
140    the RTL phases.  When there are not at least two expressions with
141    the same values of T1, T2, and C3, there is nothing to be gained
142    by the replacement.
143 
144    Strength reduction of CAND_REFs uses the same infrastructure as
145    that used by CAND_MULTs and CAND_ADDs.  We record T1 in the base (B)
146    field, MULT_EXPR (T2, C3) in the stride (S) field, and
147    C1 + (C2 * C3) + C4 in the index (i) field.  A basis for a CAND_REF
148    is thus another CAND_REF with the same B and S values.  When at
149    least two CAND_REFs are chained together using the basis relation,
150    each of them is replaced as above, resulting in improved code
151    generation for addressing.
152 
153    Conditional candidates
154    ======================
155 
156    Conditional candidates are best illustrated with an example.
157    Consider the code sequence:
158 
159    (1)  x_0 = ...;
160    (2)  a_0 = x_0 * 5;          MULT (B: x_0; i: 0; S: 5)
161         if (...)
162    (3)    x_1 = x_0 + 1;        ADD  (B: x_0, i: 1; S: 1)
163    (4)  x_2 = PHI <x_0, x_1>;   PHI  (B: x_0, i: 0, S: 1)
164    (5)  x_3 = x_2 + 1;          ADD  (B: x_2, i: 1, S: 1)
165    (6)  a_1 = x_3 * 5;          MULT (B: x_2, i: 1; S: 5)
166 
167    Here strength reduction is complicated by the uncertain value of x_2.
168    A legitimate transformation is:
169 
170    (1)  x_0 = ...;
171    (2)  a_0 = x_0 * 5;
172         if (...)
173 	  {
174    (3)      [x_1 = x_0 + 1;]
175    (3a)     t_1 = a_0 + 5;
176           }
177    (4)  [x_2 = PHI <x_0, x_1>;]
178    (4a) t_2 = PHI <a_0, t_1>;
179    (5)  [x_3 = x_2 + 1;]
180    (6r) a_1 = t_2 + 5;
181 
182    where the bracketed instructions may go dead.
183 
184    To recognize this opportunity, we have to observe that statement (6)
185    has a "hidden basis" (2).  The hidden basis is unlike a normal basis
186    in that the statement and the hidden basis have different base SSA
187    names (x_2 and x_0, respectively).  The relationship is established
188    when a statement's base name (x_2) is defined by a phi statement (4),
189    each argument of which (x_0, x_1) has an identical "derived base name."
190    If the argument is defined by a candidate (as x_1 is by (3)) that is a
191    CAND_ADD having a stride of 1, the derived base name of the argument is
192    the base name of the candidate (x_0).  Otherwise, the argument itself
193    is its derived base name (as is the case with argument x_0).
194 
195    The hidden basis for statement (6) is the nearest dominating candidate
196    whose base name is the derived base name (x_0) of the feeding phi (4),
197    and whose stride is identical to that of the statement.  We can then
198    create the new "phi basis" (4a) and feeding adds along incoming arcs (3a),
199    allowing the final replacement of (6) by the strength-reduced (6r).
200 
201    To facilitate this, a new kind of candidate (CAND_PHI) is introduced.
202    A CAND_PHI is not a candidate for replacement, but is maintained in the
203    candidate table to ease discovery of hidden bases.  Any phi statement
204    whose arguments share a common derived base name is entered into the
205    table with the derived base name, an (arbitrary) index of zero, and a
206    stride of 1.  A statement with a hidden basis can then be detected by
207    simply looking up its feeding phi definition in the candidate table,
208    extracting the derived base name, and searching for a basis in the
209    usual manner after substituting the derived base name.
210 
211    Note that the transformation is only valid when the original phi and
212    the statements that define the phi's arguments are all at the same
213    position in the loop hierarchy.  */
214 
215 
216 /* Index into the candidate vector, offset by 1.  VECs are zero-based,
217    while cand_idx's are one-based, with zero indicating null.  */
218 typedef unsigned cand_idx;
219 
220 /* The kind of candidate.  */
221 enum cand_kind
222 {
223   CAND_MULT,
224   CAND_ADD,
225   CAND_REF,
226   CAND_PHI
227 };
228 
229 struct slsr_cand_d
230 {
231   /* The candidate statement S1.  */
232   gimple *cand_stmt;
233 
234   /* The base expression B:  often an SSA name, but not always.  */
235   tree base_expr;
236 
237   /* The stride S.  */
238   tree stride;
239 
240   /* The index constant i.  */
241   widest_int index;
242 
243   /* The type of the candidate.  This is normally the type of base_expr,
244      but casts may have occurred when combining feeding instructions.
245      A candidate can only be a basis for candidates of the same final type.
246      (For CAND_REFs, this is the type to be used for operand 1 of the
247      replacement MEM_REF.)  */
248   tree cand_type;
249 
250   /* The type to be used to interpret the stride field when the stride
251      is not a constant.  Normally the same as the type of the recorded
252      stride, but when the stride has been cast we need to maintain that
253      knowledge in order to make legal substitutions without losing
254      precision.  When the stride is a constant, this will be sizetype.  */
255   tree stride_type;
256 
257   /* The kind of candidate (CAND_MULT, etc.).  */
258   enum cand_kind kind;
259 
260   /* Index of this candidate in the candidate vector.  */
261   cand_idx cand_num;
262 
263   /* Index of the next candidate record for the same statement.
264      A statement may be useful in more than one way (e.g., due to
265      commutativity).  So we can have multiple "interpretations"
266      of a statement.  */
267   cand_idx next_interp;
268 
269   /* Index of the basis statement S0, if any, in the candidate vector.  */
270   cand_idx basis;
271 
272   /* First candidate for which this candidate is a basis, if one exists.  */
273   cand_idx dependent;
274 
275   /* Next candidate having the same basis as this one.  */
276   cand_idx sibling;
277 
278   /* If this is a conditional candidate, the CAND_PHI candidate
279      that defines the base SSA name B.  */
280   cand_idx def_phi;
281 
282   /* Savings that can be expected from eliminating dead code if this
283      candidate is replaced.  */
284   int dead_savings;
285 
286   /* For PHI candidates, use a visited flag to keep from processing the
287      same PHI twice from multiple paths.  */
288   int visited;
289 
290   /* We sometimes have to cache a phi basis with a phi candidate to
291      avoid processing it twice.  Valid only if visited==1.  */
292   tree cached_basis;
293 };
294 
295 typedef struct slsr_cand_d slsr_cand, *slsr_cand_t;
296 typedef const struct slsr_cand_d *const_slsr_cand_t;
297 
298 /* Pointers to candidates are chained together as part of a mapping
299    from base expressions to the candidates that use them.  */
300 
301 struct cand_chain_d
302 {
303   /* Base expression for the chain of candidates:  often, but not
304      always, an SSA name.  */
305   tree base_expr;
306 
307   /* Pointer to a candidate.  */
308   slsr_cand_t cand;
309 
310   /* Chain pointer.  */
311   struct cand_chain_d *next;
312 
313 };
314 
315 typedef struct cand_chain_d cand_chain, *cand_chain_t;
316 typedef const struct cand_chain_d *const_cand_chain_t;
317 
318 /* Information about a unique "increment" associated with candidates
319    having an SSA name for a stride.  An increment is the difference
320    between the index of the candidate and the index of its basis,
321    i.e., (i - i') as discussed in the module commentary.
322 
323    When we are not going to generate address arithmetic we treat
324    increments that differ only in sign as the same, allowing sharing
325    of the cost of initializers.  The absolute value of the increment
326    is stored in the incr_info.  */
327 
328 struct incr_info_d
329 {
330   /* The increment that relates a candidate to its basis.  */
331   widest_int incr;
332 
333   /* How many times the increment occurs in the candidate tree.  */
334   unsigned count;
335 
336   /* Cost of replacing candidates using this increment.  Negative and
337      zero costs indicate replacement should be performed.  */
338   int cost;
339 
340   /* If this increment is profitable but is not -1, 0, or 1, it requires
341      an initializer T_0 = stride * incr to be found or introduced in the
342      nearest common dominator of all candidates.  This field holds T_0
343      for subsequent use.  */
344   tree initializer;
345 
346   /* If the initializer was found to already exist, this is the block
347      where it was found.  */
348   basic_block init_bb;
349 };
350 
351 typedef struct incr_info_d incr_info, *incr_info_t;
352 
353 /* Candidates are maintained in a vector.  If candidate X dominates
354    candidate Y, then X appears before Y in the vector; but the
355    converse does not necessarily hold.  */
356 static vec<slsr_cand_t> cand_vec;
357 
358 enum cost_consts
359 {
360   COST_NEUTRAL = 0,
361   COST_INFINITE = 1000
362 };
363 
364 enum stride_status
365 {
366   UNKNOWN_STRIDE = 0,
367   KNOWN_STRIDE = 1
368 };
369 
370 enum phi_adjust_status
371 {
372   NOT_PHI_ADJUST = 0,
373   PHI_ADJUST = 1
374 };
375 
376 enum count_phis_status
377 {
378   DONT_COUNT_PHIS = 0,
379   COUNT_PHIS = 1
380 };
381 
382 /* Constrain how many PHI nodes we will visit for a conditional
383    candidate (depth and breadth).  */
384 const int MAX_SPREAD = 16;
385 
386 /* Pointer map embodying a mapping from statements to candidates.  */
387 static hash_map<gimple *, slsr_cand_t> *stmt_cand_map;
388 
389 /* Obstack for candidates.  */
390 static struct obstack cand_obstack;
391 
392 /* Obstack for candidate chains.  */
393 static struct obstack chain_obstack;
394 
395 /* An array INCR_VEC of incr_infos is used during analysis of related
396    candidates having an SSA name for a stride.  INCR_VEC_LEN describes
397    its current length.  MAX_INCR_VEC_LEN is used to avoid costly
398    pathological cases. */
399 static incr_info_t incr_vec;
400 static unsigned incr_vec_len;
401 const int MAX_INCR_VEC_LEN = 16;
402 
403 /* For a chain of candidates with unknown stride, indicates whether or not
404    we must generate pointer arithmetic when replacing statements.  */
405 static bool address_arithmetic_p;
406 
407 /* Forward function declarations.  */
408 static slsr_cand_t base_cand_from_table (tree);
409 static tree introduce_cast_before_cand (slsr_cand_t, tree, tree);
410 static bool legal_cast_p_1 (tree, tree);
411 
412 /* Produce a pointer to the IDX'th candidate in the candidate vector.  */
413 
414 static slsr_cand_t
415 lookup_cand (cand_idx idx)
416 {
417   return cand_vec[idx - 1];
418 }
419 
420 /* Helper for hashing a candidate chain header.  */
421 
422 struct cand_chain_hasher : nofree_ptr_hash <cand_chain>
423 {
424   static inline hashval_t hash (const cand_chain *);
425   static inline bool equal (const cand_chain *, const cand_chain *);
426 };
427 
428 inline hashval_t
429 cand_chain_hasher::hash (const cand_chain *p)
430 {
431   tree base_expr = p->base_expr;
432   return iterative_hash_expr (base_expr, 0);
433 }
434 
435 inline bool
436 cand_chain_hasher::equal (const cand_chain *chain1, const cand_chain *chain2)
437 {
438   return operand_equal_p (chain1->base_expr, chain2->base_expr, 0);
439 }
440 
441 /* Hash table embodying a mapping from base exprs to chains of candidates.  */
442 static hash_table<cand_chain_hasher> *base_cand_map;
443 
444 /* Pointer map used by tree_to_aff_combination_expand.  */
445 static hash_map<tree, name_expansion *> *name_expansions;
446 /* Pointer map embodying a mapping from bases to alternative bases.  */
447 static hash_map<tree, tree> *alt_base_map;
448 
449 /* Given BASE, use the tree affine combiniation facilities to
450    find the underlying tree expression for BASE, with any
451    immediate offset excluded.
452 
453    N.B. we should eliminate this backtracking with better forward
454    analysis in a future release.  */
455 
456 static tree
457 get_alternative_base (tree base)
458 {
459   tree *result = alt_base_map->get (base);
460 
461   if (result == NULL)
462     {
463       tree expr;
464       aff_tree aff;
465 
466       tree_to_aff_combination_expand (base, TREE_TYPE (base),
467 				      &aff, &name_expansions);
468       aff.offset = 0;
469       expr = aff_combination_to_tree (&aff);
470 
471       gcc_assert (!alt_base_map->put (base, base == expr ? NULL : expr));
472 
473       return expr == base ? NULL : expr;
474     }
475 
476   return *result;
477 }
478 
479 /* Look in the candidate table for a CAND_PHI that defines BASE and
480    return it if found; otherwise return NULL.  */
481 
482 static cand_idx
483 find_phi_def (tree base)
484 {
485   slsr_cand_t c;
486 
487   if (TREE_CODE (base) != SSA_NAME)
488     return 0;
489 
490   c = base_cand_from_table (base);
491 
492   if (!c || c->kind != CAND_PHI
493       || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (c->cand_stmt)))
494     return 0;
495 
496   return c->cand_num;
497 }
498 
499 /* Determine whether all uses of NAME are directly or indirectly
500    used by STMT.  That is, we want to know whether if STMT goes
501    dead, the definition of NAME also goes dead.  */
502 static bool
503 uses_consumed_by_stmt (tree name, gimple *stmt, unsigned recurse = 0)
504 {
505   gimple *use_stmt;
506   imm_use_iterator iter;
507   bool retval = true;
508 
509   FOR_EACH_IMM_USE_STMT (use_stmt, iter, name)
510     {
511       if (use_stmt == stmt || is_gimple_debug (use_stmt))
512 	continue;
513 
514       if (!is_gimple_assign (use_stmt)
515 	  || !gimple_get_lhs (use_stmt)
516 	  || !is_gimple_reg (gimple_get_lhs (use_stmt))
517 	  || recurse >= 10
518 	  || !uses_consumed_by_stmt (gimple_get_lhs (use_stmt), stmt,
519 				     recurse + 1))
520 	{
521 	  retval = false;
522 	  BREAK_FROM_IMM_USE_STMT (iter);
523 	}
524     }
525 
526   return retval;
527 }
528 
529 /* Helper routine for find_basis_for_candidate.  May be called twice:
530    once for the candidate's base expr, and optionally again either for
531    the candidate's phi definition or for a CAND_REF's alternative base
532    expression.  */
533 
534 static slsr_cand_t
535 find_basis_for_base_expr (slsr_cand_t c, tree base_expr)
536 {
537   cand_chain mapping_key;
538   cand_chain_t chain;
539   slsr_cand_t basis = NULL;
540 
541   // Limit potential of N^2 behavior for long candidate chains.
542   int iters = 0;
543   int max_iters = PARAM_VALUE (PARAM_MAX_SLSR_CANDIDATE_SCAN);
544 
545   mapping_key.base_expr = base_expr;
546   chain = base_cand_map->find (&mapping_key);
547 
548   for (; chain && iters < max_iters; chain = chain->next, ++iters)
549     {
550       slsr_cand_t one_basis = chain->cand;
551 
552       if (one_basis->kind != c->kind
553 	  || one_basis->cand_stmt == c->cand_stmt
554 	  || !operand_equal_p (one_basis->stride, c->stride, 0)
555 	  || !types_compatible_p (one_basis->cand_type, c->cand_type)
556 	  || !types_compatible_p (one_basis->stride_type, c->stride_type)
557 	  || !dominated_by_p (CDI_DOMINATORS,
558 			      gimple_bb (c->cand_stmt),
559 			      gimple_bb (one_basis->cand_stmt)))
560 	continue;
561 
562       tree lhs = gimple_assign_lhs (one_basis->cand_stmt);
563       if (lhs && TREE_CODE (lhs) == SSA_NAME
564 	  && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
565 	continue;
566 
567       if (!basis || basis->cand_num < one_basis->cand_num)
568 	basis = one_basis;
569     }
570 
571   return basis;
572 }
573 
574 /* Use the base expr from candidate C to look for possible candidates
575    that can serve as a basis for C.  Each potential basis must also
576    appear in a block that dominates the candidate statement and have
577    the same stride and type.  If more than one possible basis exists,
578    the one with highest index in the vector is chosen; this will be
579    the most immediately dominating basis.  */
580 
581 static int
582 find_basis_for_candidate (slsr_cand_t c)
583 {
584   slsr_cand_t basis = find_basis_for_base_expr (c, c->base_expr);
585 
586   /* If a candidate doesn't have a basis using its base expression,
587      it may have a basis hidden by one or more intervening phis.  */
588   if (!basis && c->def_phi)
589     {
590       basic_block basis_bb, phi_bb;
591       slsr_cand_t phi_cand = lookup_cand (c->def_phi);
592       basis = find_basis_for_base_expr (c, phi_cand->base_expr);
593 
594       if (basis)
595 	{
596 	  /* A hidden basis must dominate the phi-definition of the
597 	     candidate's base name.  */
598 	  phi_bb = gimple_bb (phi_cand->cand_stmt);
599 	  basis_bb = gimple_bb (basis->cand_stmt);
600 
601 	  if (phi_bb == basis_bb
602 	      || !dominated_by_p (CDI_DOMINATORS, phi_bb, basis_bb))
603 	    {
604 	      basis = NULL;
605 	      c->basis = 0;
606 	    }
607 
608 	  /* If we found a hidden basis, estimate additional dead-code
609 	     savings if the phi and its feeding statements can be removed.  */
610 	  tree feeding_var = gimple_phi_result (phi_cand->cand_stmt);
611 	  if (basis && uses_consumed_by_stmt (feeding_var, c->cand_stmt))
612 	    c->dead_savings += phi_cand->dead_savings;
613 	}
614     }
615 
616   if (flag_expensive_optimizations && !basis && c->kind == CAND_REF)
617     {
618       tree alt_base_expr = get_alternative_base (c->base_expr);
619       if (alt_base_expr)
620 	basis = find_basis_for_base_expr (c, alt_base_expr);
621     }
622 
623   if (basis)
624     {
625       c->sibling = basis->dependent;
626       basis->dependent = c->cand_num;
627       return basis->cand_num;
628     }
629 
630   return 0;
631 }
632 
633 /* Record a mapping from BASE to C, indicating that C may potentially serve
634    as a basis using that base expression.  BASE may be the same as
635    C->BASE_EXPR; alternatively BASE can be a different tree that share the
636    underlining expression of C->BASE_EXPR.  */
637 
638 static void
639 record_potential_basis (slsr_cand_t c, tree base)
640 {
641   cand_chain_t node;
642   cand_chain **slot;
643 
644   gcc_assert (base);
645 
646   node = (cand_chain_t) obstack_alloc (&chain_obstack, sizeof (cand_chain));
647   node->base_expr = base;
648   node->cand = c;
649   node->next = NULL;
650   slot = base_cand_map->find_slot (node, INSERT);
651 
652   if (*slot)
653     {
654       cand_chain_t head = (cand_chain_t) (*slot);
655       node->next = head->next;
656       head->next = node;
657     }
658   else
659     *slot = node;
660 }
661 
662 /* Allocate storage for a new candidate and initialize its fields.
663    Attempt to find a basis for the candidate.
664 
665    For CAND_REF, an alternative base may also be recorded and used
666    to find a basis.  This helps cases where the expression hidden
667    behind BASE (which is usually an SSA_NAME) has immediate offset,
668    e.g.
669 
670      a2[i][j] = 1;
671      a2[i + 20][j] = 2;  */
672 
673 static slsr_cand_t
674 alloc_cand_and_find_basis (enum cand_kind kind, gimple *gs, tree base,
675 			   const widest_int &index, tree stride, tree ctype,
676 			   tree stype, unsigned savings)
677 {
678   slsr_cand_t c = (slsr_cand_t) obstack_alloc (&cand_obstack,
679 					       sizeof (slsr_cand));
680   c->cand_stmt = gs;
681   c->base_expr = base;
682   c->stride = stride;
683   c->index = index;
684   c->cand_type = ctype;
685   c->stride_type = stype;
686   c->kind = kind;
687   c->cand_num = cand_vec.length () + 1;
688   c->next_interp = 0;
689   c->dependent = 0;
690   c->sibling = 0;
691   c->def_phi = kind == CAND_MULT ? find_phi_def (base) : 0;
692   c->dead_savings = savings;
693   c->visited = 0;
694   c->cached_basis = NULL_TREE;
695 
696   cand_vec.safe_push (c);
697 
698   if (kind == CAND_PHI)
699     c->basis = 0;
700   else
701     c->basis = find_basis_for_candidate (c);
702 
703   record_potential_basis (c, base);
704   if (flag_expensive_optimizations && kind == CAND_REF)
705     {
706       tree alt_base = get_alternative_base (base);
707       if (alt_base)
708 	record_potential_basis (c, alt_base);
709     }
710 
711   return c;
712 }
713 
714 /* Determine the target cost of statement GS when compiling according
715    to SPEED.  */
716 
717 static int
718 stmt_cost (gimple *gs, bool speed)
719 {
720   tree lhs, rhs1, rhs2;
721   machine_mode lhs_mode;
722 
723   gcc_assert (is_gimple_assign (gs));
724   lhs = gimple_assign_lhs (gs);
725   rhs1 = gimple_assign_rhs1 (gs);
726   lhs_mode = TYPE_MODE (TREE_TYPE (lhs));
727 
728   switch (gimple_assign_rhs_code (gs))
729     {
730     case MULT_EXPR:
731       rhs2 = gimple_assign_rhs2 (gs);
732 
733       if (tree_fits_shwi_p (rhs2))
734 	return mult_by_coeff_cost (tree_to_shwi (rhs2), lhs_mode, speed);
735 
736       gcc_assert (TREE_CODE (rhs1) != INTEGER_CST);
737       return mul_cost (speed, lhs_mode);
738 
739     case PLUS_EXPR:
740     case POINTER_PLUS_EXPR:
741     case MINUS_EXPR:
742       return add_cost (speed, lhs_mode);
743 
744     case NEGATE_EXPR:
745       return neg_cost (speed, lhs_mode);
746 
747     CASE_CONVERT:
748       return convert_cost (lhs_mode, TYPE_MODE (TREE_TYPE (rhs1)), speed);
749 
750     /* Note that we don't assign costs to copies that in most cases
751        will go away.  */
752     case SSA_NAME:
753       return 0;
754 
755     default:
756       ;
757     }
758 
759   gcc_unreachable ();
760   return 0;
761 }
762 
763 /* Look up the defining statement for BASE_IN and return a pointer
764    to its candidate in the candidate table, if any; otherwise NULL.
765    Only CAND_ADD and CAND_MULT candidates are returned.  */
766 
767 static slsr_cand_t
768 base_cand_from_table (tree base_in)
769 {
770   slsr_cand_t *result;
771 
772   gimple *def = SSA_NAME_DEF_STMT (base_in);
773   if (!def)
774     return (slsr_cand_t) NULL;
775 
776   result = stmt_cand_map->get (def);
777 
778   if (result && (*result)->kind != CAND_REF)
779     return *result;
780 
781   return (slsr_cand_t) NULL;
782 }
783 
784 /* Add an entry to the statement-to-candidate mapping.  */
785 
786 static void
787 add_cand_for_stmt (gimple *gs, slsr_cand_t c)
788 {
789   gcc_assert (!stmt_cand_map->put (gs, c));
790 }
791 
792 /* Given PHI which contains a phi statement, determine whether it
793    satisfies all the requirements of a phi candidate.  If so, create
794    a candidate.  Note that a CAND_PHI never has a basis itself, but
795    is used to help find a basis for subsequent candidates.  */
796 
797 static void
798 slsr_process_phi (gphi *phi, bool speed)
799 {
800   unsigned i;
801   tree arg0_base = NULL_TREE, base_type;
802   slsr_cand_t c;
803   struct loop *cand_loop = gimple_bb (phi)->loop_father;
804   unsigned savings = 0;
805 
806   /* A CAND_PHI requires each of its arguments to have the same
807      derived base name.  (See the module header commentary for a
808      definition of derived base names.)  Furthermore, all feeding
809      definitions must be in the same position in the loop hierarchy
810      as PHI.  */
811 
812   for (i = 0; i < gimple_phi_num_args (phi); i++)
813     {
814       slsr_cand_t arg_cand;
815       tree arg = gimple_phi_arg_def (phi, i);
816       tree derived_base_name = NULL_TREE;
817       gimple *arg_stmt = NULL;
818       basic_block arg_bb = NULL;
819 
820       if (TREE_CODE (arg) != SSA_NAME)
821 	return;
822 
823       arg_cand = base_cand_from_table (arg);
824 
825       if (arg_cand)
826 	{
827 	  while (arg_cand->kind != CAND_ADD && arg_cand->kind != CAND_PHI)
828 	    {
829 	      if (!arg_cand->next_interp)
830 		return;
831 
832 	      arg_cand = lookup_cand (arg_cand->next_interp);
833 	    }
834 
835 	  if (!integer_onep (arg_cand->stride))
836 	    return;
837 
838 	  derived_base_name = arg_cand->base_expr;
839 	  arg_stmt = arg_cand->cand_stmt;
840 	  arg_bb = gimple_bb (arg_stmt);
841 
842 	  /* Gather potential dead code savings if the phi statement
843 	     can be removed later on.  */
844 	  if (uses_consumed_by_stmt (arg, phi))
845 	    {
846 	      if (gimple_code (arg_stmt) == GIMPLE_PHI)
847 		savings += arg_cand->dead_savings;
848 	      else
849 		savings += stmt_cost (arg_stmt, speed);
850 	    }
851 	}
852       else if (SSA_NAME_IS_DEFAULT_DEF (arg))
853 	{
854 	  derived_base_name = arg;
855 	  arg_bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun));
856 	}
857 
858       if (!arg_bb || arg_bb->loop_father != cand_loop)
859 	return;
860 
861       if (i == 0)
862 	arg0_base = derived_base_name;
863       else if (!operand_equal_p (derived_base_name, arg0_base, 0))
864 	return;
865     }
866 
867   /* Create the candidate.  "alloc_cand_and_find_basis" is named
868      misleadingly for this case, as no basis will be sought for a
869      CAND_PHI.  */
870   base_type = TREE_TYPE (arg0_base);
871 
872   c = alloc_cand_and_find_basis (CAND_PHI, phi, arg0_base,
873 				 0, integer_one_node, base_type,
874 				 sizetype, savings);
875 
876   /* Add the candidate to the statement-candidate mapping.  */
877   add_cand_for_stmt (phi, c);
878 }
879 
880 /* Given PBASE which is a pointer to tree, look up the defining
881    statement for it and check whether the candidate is in the
882    form of:
883 
884      X = B + (1 * S), S is integer constant
885      X = B + (i * S), S is integer one
886 
887    If so, set PBASE to the candidate's base_expr and return double
888    int (i * S).
889    Otherwise, just return double int zero.  */
890 
891 static widest_int
892 backtrace_base_for_ref (tree *pbase)
893 {
894   tree base_in = *pbase;
895   slsr_cand_t base_cand;
896 
897   STRIP_NOPS (base_in);
898 
899   /* Strip off widening conversion(s) to handle cases where
900      e.g. 'B' is widened from an 'int' in order to calculate
901      a 64-bit address.  */
902   if (CONVERT_EXPR_P (base_in)
903       && legal_cast_p_1 (TREE_TYPE (base_in),
904 			 TREE_TYPE (TREE_OPERAND (base_in, 0))))
905     base_in = get_unwidened (base_in, NULL_TREE);
906 
907   if (TREE_CODE (base_in) != SSA_NAME)
908     return 0;
909 
910   base_cand = base_cand_from_table (base_in);
911 
912   while (base_cand && base_cand->kind != CAND_PHI)
913     {
914       if (base_cand->kind == CAND_ADD
915 	  && base_cand->index == 1
916 	  && TREE_CODE (base_cand->stride) == INTEGER_CST)
917 	{
918 	  /* X = B + (1 * S), S is integer constant.  */
919 	  *pbase = base_cand->base_expr;
920 	  return wi::to_widest (base_cand->stride);
921 	}
922       else if (base_cand->kind == CAND_ADD
923 	       && TREE_CODE (base_cand->stride) == INTEGER_CST
924 	       && integer_onep (base_cand->stride))
925 	{
926 	  /* X = B + (i * S), S is integer one.  */
927 	  *pbase = base_cand->base_expr;
928 	  return base_cand->index;
929 	}
930 
931       if (base_cand->next_interp)
932 	base_cand = lookup_cand (base_cand->next_interp);
933       else
934 	base_cand = NULL;
935     }
936 
937   return 0;
938 }
939 
940 /* Look for the following pattern:
941 
942     *PBASE:    MEM_REF (T1, C1)
943 
944     *POFFSET:  MULT_EXPR (T2, C3)        [C2 is zero]
945                      or
946                MULT_EXPR (PLUS_EXPR (T2, C2), C3)
947                      or
948                MULT_EXPR (MINUS_EXPR (T2, -C2), C3)
949 
950     *PINDEX:   C4 * BITS_PER_UNIT
951 
952    If not present, leave the input values unchanged and return FALSE.
953    Otherwise, modify the input values as follows and return TRUE:
954 
955     *PBASE:    T1
956     *POFFSET:  MULT_EXPR (T2, C3)
957     *PINDEX:   C1 + (C2 * C3) + C4
958 
959    When T2 is recorded by a CAND_ADD in the form of (T2' + C5), it
960    will be further restructured to:
961 
962     *PBASE:    T1
963     *POFFSET:  MULT_EXPR (T2', C3)
964     *PINDEX:   C1 + (C2 * C3) + C4 + (C5 * C3)  */
965 
966 static bool
967 restructure_reference (tree *pbase, tree *poffset, widest_int *pindex,
968 		       tree *ptype)
969 {
970   tree base = *pbase, offset = *poffset;
971   widest_int index = *pindex;
972   tree mult_op0, t1, t2, type;
973   widest_int c1, c2, c3, c4, c5;
974   offset_int mem_offset;
975 
976   if (!base
977       || !offset
978       || TREE_CODE (base) != MEM_REF
979       || !mem_ref_offset (base).is_constant (&mem_offset)
980       || TREE_CODE (offset) != MULT_EXPR
981       || TREE_CODE (TREE_OPERAND (offset, 1)) != INTEGER_CST
982       || wi::umod_floor (index, BITS_PER_UNIT) != 0)
983     return false;
984 
985   t1 = TREE_OPERAND (base, 0);
986   c1 = widest_int::from (mem_offset, SIGNED);
987   type = TREE_TYPE (TREE_OPERAND (base, 1));
988 
989   mult_op0 = TREE_OPERAND (offset, 0);
990   c3 = wi::to_widest (TREE_OPERAND (offset, 1));
991 
992   if (TREE_CODE (mult_op0) == PLUS_EXPR)
993 
994     if (TREE_CODE (TREE_OPERAND (mult_op0, 1)) == INTEGER_CST)
995       {
996 	t2 = TREE_OPERAND (mult_op0, 0);
997 	c2 = wi::to_widest (TREE_OPERAND (mult_op0, 1));
998       }
999     else
1000       return false;
1001 
1002   else if (TREE_CODE (mult_op0) == MINUS_EXPR)
1003 
1004     if (TREE_CODE (TREE_OPERAND (mult_op0, 1)) == INTEGER_CST)
1005       {
1006 	t2 = TREE_OPERAND (mult_op0, 0);
1007 	c2 = -wi::to_widest (TREE_OPERAND (mult_op0, 1));
1008       }
1009     else
1010       return false;
1011 
1012   else
1013     {
1014       t2 = mult_op0;
1015       c2 = 0;
1016     }
1017 
1018   c4 = index >> LOG2_BITS_PER_UNIT;
1019   c5 = backtrace_base_for_ref (&t2);
1020 
1021   *pbase = t1;
1022   *poffset = fold_build2 (MULT_EXPR, sizetype, fold_convert (sizetype, t2),
1023 			  wide_int_to_tree (sizetype, c3));
1024   *pindex = c1 + c2 * c3 + c4 + c5 * c3;
1025   *ptype = type;
1026 
1027   return true;
1028 }
1029 
1030 /* Given GS which contains a data reference, create a CAND_REF entry in
1031    the candidate table and attempt to find a basis.  */
1032 
1033 static void
1034 slsr_process_ref (gimple *gs)
1035 {
1036   tree ref_expr, base, offset, type;
1037   poly_int64 bitsize, bitpos;
1038   machine_mode mode;
1039   int unsignedp, reversep, volatilep;
1040   slsr_cand_t c;
1041 
1042   if (gimple_vdef (gs))
1043     ref_expr = gimple_assign_lhs (gs);
1044   else
1045     ref_expr = gimple_assign_rhs1 (gs);
1046 
1047   if (!handled_component_p (ref_expr)
1048       || TREE_CODE (ref_expr) == BIT_FIELD_REF
1049       || (TREE_CODE (ref_expr) == COMPONENT_REF
1050 	  && DECL_BIT_FIELD (TREE_OPERAND (ref_expr, 1))))
1051     return;
1052 
1053   base = get_inner_reference (ref_expr, &bitsize, &bitpos, &offset, &mode,
1054 			      &unsignedp, &reversep, &volatilep);
1055   HOST_WIDE_INT cbitpos;
1056   if (reversep || !bitpos.is_constant (&cbitpos))
1057     return;
1058   widest_int index = cbitpos;
1059 
1060   if (!restructure_reference (&base, &offset, &index, &type))
1061     return;
1062 
1063   c = alloc_cand_and_find_basis (CAND_REF, gs, base, index, offset,
1064 				 type, sizetype, 0);
1065 
1066   /* Add the candidate to the statement-candidate mapping.  */
1067   add_cand_for_stmt (gs, c);
1068 }
1069 
1070 /* Create a candidate entry for a statement GS, where GS multiplies
1071    two SSA names BASE_IN and STRIDE_IN.  Propagate any known information
1072    about the two SSA names into the new candidate.  Return the new
1073    candidate.  */
1074 
1075 static slsr_cand_t
1076 create_mul_ssa_cand (gimple *gs, tree base_in, tree stride_in, bool speed)
1077 {
1078   tree base = NULL_TREE, stride = NULL_TREE, ctype = NULL_TREE;
1079   tree stype = NULL_TREE;
1080   widest_int index;
1081   unsigned savings = 0;
1082   slsr_cand_t c;
1083   slsr_cand_t base_cand = base_cand_from_table (base_in);
1084 
1085   /* Look at all interpretations of the base candidate, if necessary,
1086      to find information to propagate into this candidate.  */
1087   while (base_cand && !base && base_cand->kind != CAND_PHI)
1088     {
1089 
1090       if (base_cand->kind == CAND_MULT && integer_onep (base_cand->stride))
1091 	{
1092 	  /* Y = (B + i') * 1
1093 	     X = Y * Z
1094 	     ================
1095 	     X = (B + i') * Z  */
1096 	  base = base_cand->base_expr;
1097 	  index = base_cand->index;
1098 	  stride = stride_in;
1099 	  ctype = base_cand->cand_type;
1100 	  stype = TREE_TYPE (stride_in);
1101 	  if (has_single_use (base_in))
1102 	    savings = (base_cand->dead_savings
1103 		       + stmt_cost (base_cand->cand_stmt, speed));
1104 	}
1105       else if (base_cand->kind == CAND_ADD
1106 	       && TREE_CODE (base_cand->stride) == INTEGER_CST)
1107 	{
1108 	  /* Y = B + (i' * S), S constant
1109 	     X = Y * Z
1110 	     ============================
1111 	     X = B + ((i' * S) * Z)  */
1112 	  base = base_cand->base_expr;
1113 	  index = base_cand->index * wi::to_widest (base_cand->stride);
1114 	  stride = stride_in;
1115 	  ctype = base_cand->cand_type;
1116 	  stype = TREE_TYPE (stride_in);
1117 	  if (has_single_use (base_in))
1118 	    savings = (base_cand->dead_savings
1119 		       + stmt_cost (base_cand->cand_stmt, speed));
1120 	}
1121 
1122       if (base_cand->next_interp)
1123 	base_cand = lookup_cand (base_cand->next_interp);
1124       else
1125 	base_cand = NULL;
1126     }
1127 
1128   if (!base)
1129     {
1130       /* No interpretations had anything useful to propagate, so
1131 	 produce X = (Y + 0) * Z.  */
1132       base = base_in;
1133       index = 0;
1134       stride = stride_in;
1135       ctype = TREE_TYPE (base_in);
1136       stype = TREE_TYPE (stride_in);
1137     }
1138 
1139   c = alloc_cand_and_find_basis (CAND_MULT, gs, base, index, stride,
1140 				 ctype, stype, savings);
1141   return c;
1142 }
1143 
1144 /* Create a candidate entry for a statement GS, where GS multiplies
1145    SSA name BASE_IN by constant STRIDE_IN.  Propagate any known
1146    information about BASE_IN into the new candidate.  Return the new
1147    candidate.  */
1148 
1149 static slsr_cand_t
1150 create_mul_imm_cand (gimple *gs, tree base_in, tree stride_in, bool speed)
1151 {
1152   tree base = NULL_TREE, stride = NULL_TREE, ctype = NULL_TREE;
1153   widest_int index, temp;
1154   unsigned savings = 0;
1155   slsr_cand_t c;
1156   slsr_cand_t base_cand = base_cand_from_table (base_in);
1157 
1158   /* Look at all interpretations of the base candidate, if necessary,
1159      to find information to propagate into this candidate.  */
1160   while (base_cand && !base && base_cand->kind != CAND_PHI)
1161     {
1162       if (base_cand->kind == CAND_MULT
1163 	  && TREE_CODE (base_cand->stride) == INTEGER_CST)
1164 	{
1165 	  /* Y = (B + i') * S, S constant
1166 	     X = Y * c
1167 	     ============================
1168 	     X = (B + i') * (S * c)  */
1169 	  temp = wi::to_widest (base_cand->stride) * wi::to_widest (stride_in);
1170 	  if (wi::fits_to_tree_p (temp, TREE_TYPE (stride_in)))
1171 	    {
1172 	      base = base_cand->base_expr;
1173 	      index = base_cand->index;
1174 	      stride = wide_int_to_tree (TREE_TYPE (stride_in), temp);
1175 	      ctype = base_cand->cand_type;
1176 	      if (has_single_use (base_in))
1177 		savings = (base_cand->dead_savings
1178 			   + stmt_cost (base_cand->cand_stmt, speed));
1179 	    }
1180 	}
1181       else if (base_cand->kind == CAND_ADD && integer_onep (base_cand->stride))
1182 	{
1183 	  /* Y = B + (i' * 1)
1184 	     X = Y * c
1185 	     ===========================
1186 	     X = (B + i') * c  */
1187 	  base = base_cand->base_expr;
1188 	  index = base_cand->index;
1189 	  stride = stride_in;
1190 	  ctype = base_cand->cand_type;
1191 	  if (has_single_use (base_in))
1192 	    savings = (base_cand->dead_savings
1193 		       + stmt_cost (base_cand->cand_stmt, speed));
1194 	}
1195       else if (base_cand->kind == CAND_ADD
1196 	       && base_cand->index == 1
1197 	       && TREE_CODE (base_cand->stride) == INTEGER_CST)
1198 	{
1199 	  /* Y = B + (1 * S), S constant
1200 	     X = Y * c
1201 	     ===========================
1202 	     X = (B + S) * c  */
1203 	  base = base_cand->base_expr;
1204 	  index = wi::to_widest (base_cand->stride);
1205 	  stride = stride_in;
1206 	  ctype = base_cand->cand_type;
1207 	  if (has_single_use (base_in))
1208 	    savings = (base_cand->dead_savings
1209 		       + stmt_cost (base_cand->cand_stmt, speed));
1210 	}
1211 
1212       if (base_cand->next_interp)
1213 	base_cand = lookup_cand (base_cand->next_interp);
1214       else
1215 	base_cand = NULL;
1216     }
1217 
1218   if (!base)
1219     {
1220       /* No interpretations had anything useful to propagate, so
1221 	 produce X = (Y + 0) * c.  */
1222       base = base_in;
1223       index = 0;
1224       stride = stride_in;
1225       ctype = TREE_TYPE (base_in);
1226     }
1227 
1228   c = alloc_cand_and_find_basis (CAND_MULT, gs, base, index, stride,
1229 				 ctype, sizetype, savings);
1230   return c;
1231 }
1232 
1233 /* Given GS which is a multiply of scalar integers, make an appropriate
1234    entry in the candidate table.  If this is a multiply of two SSA names,
1235    create two CAND_MULT interpretations and attempt to find a basis for
1236    each of them.  Otherwise, create a single CAND_MULT and attempt to
1237    find a basis.  */
1238 
1239 static void
1240 slsr_process_mul (gimple *gs, tree rhs1, tree rhs2, bool speed)
1241 {
1242   slsr_cand_t c, c2;
1243 
1244   /* If this is a multiply of an SSA name with itself, it is highly
1245      unlikely that we will get a strength reduction opportunity, so
1246      don't record it as a candidate.  This simplifies the logic for
1247      finding a basis, so if this is removed that must be considered.  */
1248   if (rhs1 == rhs2)
1249     return;
1250 
1251   if (TREE_CODE (rhs2) == SSA_NAME)
1252     {
1253       /* Record an interpretation of this statement in the candidate table
1254 	 assuming RHS1 is the base expression and RHS2 is the stride.  */
1255       c = create_mul_ssa_cand (gs, rhs1, rhs2, speed);
1256 
1257       /* Add the first interpretation to the statement-candidate mapping.  */
1258       add_cand_for_stmt (gs, c);
1259 
1260       /* Record another interpretation of this statement assuming RHS1
1261 	 is the stride and RHS2 is the base expression.  */
1262       c2 = create_mul_ssa_cand (gs, rhs2, rhs1, speed);
1263       c->next_interp = c2->cand_num;
1264     }
1265   else if (TREE_CODE (rhs2) == INTEGER_CST)
1266     {
1267       /* Record an interpretation for the multiply-immediate.  */
1268       c = create_mul_imm_cand (gs, rhs1, rhs2, speed);
1269 
1270       /* Add the interpretation to the statement-candidate mapping.  */
1271       add_cand_for_stmt (gs, c);
1272     }
1273 }
1274 
1275 /* Create a candidate entry for a statement GS, where GS adds two
1276    SSA names BASE_IN and ADDEND_IN if SUBTRACT_P is false, and
1277    subtracts ADDEND_IN from BASE_IN otherwise.  Propagate any known
1278    information about the two SSA names into the new candidate.
1279    Return the new candidate.  */
1280 
1281 static slsr_cand_t
1282 create_add_ssa_cand (gimple *gs, tree base_in, tree addend_in,
1283 		     bool subtract_p, bool speed)
1284 {
1285   tree base = NULL_TREE, stride = NULL_TREE, ctype = NULL_TREE;
1286   tree stype = NULL_TREE;
1287   widest_int index;
1288   unsigned savings = 0;
1289   slsr_cand_t c;
1290   slsr_cand_t base_cand = base_cand_from_table (base_in);
1291   slsr_cand_t addend_cand = base_cand_from_table (addend_in);
1292 
1293   /* The most useful transformation is a multiply-immediate feeding
1294      an add or subtract.  Look for that first.  */
1295   while (addend_cand && !base && addend_cand->kind != CAND_PHI)
1296     {
1297       if (addend_cand->kind == CAND_MULT
1298 	  && addend_cand->index == 0
1299 	  && TREE_CODE (addend_cand->stride) == INTEGER_CST)
1300 	{
1301 	  /* Z = (B + 0) * S, S constant
1302 	     X = Y +/- Z
1303 	     ===========================
1304 	     X = Y + ((+/-1 * S) * B)  */
1305 	  base = base_in;
1306 	  index = wi::to_widest (addend_cand->stride);
1307 	  if (subtract_p)
1308 	    index = -index;
1309 	  stride = addend_cand->base_expr;
1310 	  ctype = TREE_TYPE (base_in);
1311 	  stype = addend_cand->cand_type;
1312 	  if (has_single_use (addend_in))
1313 	    savings = (addend_cand->dead_savings
1314 		       + stmt_cost (addend_cand->cand_stmt, speed));
1315 	}
1316 
1317       if (addend_cand->next_interp)
1318 	addend_cand = lookup_cand (addend_cand->next_interp);
1319       else
1320 	addend_cand = NULL;
1321     }
1322 
1323   while (base_cand && !base && base_cand->kind != CAND_PHI)
1324     {
1325       if (base_cand->kind == CAND_ADD
1326 	  && (base_cand->index == 0
1327 	      || operand_equal_p (base_cand->stride,
1328 				  integer_zero_node, 0)))
1329 	{
1330 	  /* Y = B + (i' * S), i' * S = 0
1331 	     X = Y +/- Z
1332 	     ============================
1333 	     X = B + (+/-1 * Z)  */
1334 	  base = base_cand->base_expr;
1335 	  index = subtract_p ? -1 : 1;
1336 	  stride = addend_in;
1337 	  ctype = base_cand->cand_type;
1338 	  stype = (TREE_CODE (addend_in) == INTEGER_CST ? sizetype
1339 		   : TREE_TYPE (addend_in));
1340 	  if (has_single_use (base_in))
1341 	    savings = (base_cand->dead_savings
1342 		       + stmt_cost (base_cand->cand_stmt, speed));
1343 	}
1344       else if (subtract_p)
1345 	{
1346 	  slsr_cand_t subtrahend_cand = base_cand_from_table (addend_in);
1347 
1348 	  while (subtrahend_cand && !base && subtrahend_cand->kind != CAND_PHI)
1349 	    {
1350 	      if (subtrahend_cand->kind == CAND_MULT
1351 		  && subtrahend_cand->index == 0
1352 		  && TREE_CODE (subtrahend_cand->stride) == INTEGER_CST)
1353 		{
1354 		  /* Z = (B + 0) * S, S constant
1355 		     X = Y - Z
1356 		     ===========================
1357 		     Value:  X = Y + ((-1 * S) * B)  */
1358 		  base = base_in;
1359 		  index = wi::to_widest (subtrahend_cand->stride);
1360 		  index = -index;
1361 		  stride = subtrahend_cand->base_expr;
1362 		  ctype = TREE_TYPE (base_in);
1363 		  stype = subtrahend_cand->cand_type;
1364 		  if (has_single_use (addend_in))
1365 		    savings = (subtrahend_cand->dead_savings
1366 			       + stmt_cost (subtrahend_cand->cand_stmt, speed));
1367 		}
1368 
1369 	      if (subtrahend_cand->next_interp)
1370 		subtrahend_cand = lookup_cand (subtrahend_cand->next_interp);
1371 	      else
1372 		subtrahend_cand = NULL;
1373 	    }
1374 	}
1375 
1376       if (base_cand->next_interp)
1377 	base_cand = lookup_cand (base_cand->next_interp);
1378       else
1379 	base_cand = NULL;
1380     }
1381 
1382   if (!base)
1383     {
1384       /* No interpretations had anything useful to propagate, so
1385 	 produce X = Y + (1 * Z).  */
1386       base = base_in;
1387       index = subtract_p ? -1 : 1;
1388       stride = addend_in;
1389       ctype = TREE_TYPE (base_in);
1390       stype = (TREE_CODE (addend_in) == INTEGER_CST ? sizetype
1391 	       : TREE_TYPE (addend_in));
1392     }
1393 
1394   c = alloc_cand_and_find_basis (CAND_ADD, gs, base, index, stride,
1395 				 ctype, stype, savings);
1396   return c;
1397 }
1398 
1399 /* Create a candidate entry for a statement GS, where GS adds SSA
1400    name BASE_IN to constant INDEX_IN.  Propagate any known information
1401    about BASE_IN into the new candidate.  Return the new candidate.  */
1402 
1403 static slsr_cand_t
1404 create_add_imm_cand (gimple *gs, tree base_in, const widest_int &index_in,
1405 		     bool speed)
1406 {
1407   enum cand_kind kind = CAND_ADD;
1408   tree base = NULL_TREE, stride = NULL_TREE, ctype = NULL_TREE;
1409   tree stype = NULL_TREE;
1410   widest_int index, multiple;
1411   unsigned savings = 0;
1412   slsr_cand_t c;
1413   slsr_cand_t base_cand = base_cand_from_table (base_in);
1414 
1415   while (base_cand && !base && base_cand->kind != CAND_PHI)
1416     {
1417       signop sign = TYPE_SIGN (TREE_TYPE (base_cand->stride));
1418 
1419       if (TREE_CODE (base_cand->stride) == INTEGER_CST
1420 	  && wi::multiple_of_p (index_in, wi::to_widest (base_cand->stride),
1421 				sign, &multiple))
1422 	{
1423 	  /* Y = (B + i') * S, S constant, c = kS for some integer k
1424 	     X = Y + c
1425 	     ============================
1426 	     X = (B + (i'+ k)) * S
1427 	  OR
1428 	     Y = B + (i' * S), S constant, c = kS for some integer k
1429 	     X = Y + c
1430 	     ============================
1431 	     X = (B + (i'+ k)) * S  */
1432 	  kind = base_cand->kind;
1433 	  base = base_cand->base_expr;
1434 	  index = base_cand->index + multiple;
1435 	  stride = base_cand->stride;
1436 	  ctype = base_cand->cand_type;
1437 	  stype = base_cand->stride_type;
1438 	  if (has_single_use (base_in))
1439 	    savings = (base_cand->dead_savings
1440 		       + stmt_cost (base_cand->cand_stmt, speed));
1441 	}
1442 
1443       if (base_cand->next_interp)
1444 	base_cand = lookup_cand (base_cand->next_interp);
1445       else
1446 	base_cand = NULL;
1447     }
1448 
1449   if (!base)
1450     {
1451       /* No interpretations had anything useful to propagate, so
1452 	 produce X = Y + (c * 1).  */
1453       kind = CAND_ADD;
1454       base = base_in;
1455       index = index_in;
1456       stride = integer_one_node;
1457       ctype = TREE_TYPE (base_in);
1458       stype = sizetype;
1459     }
1460 
1461   c = alloc_cand_and_find_basis (kind, gs, base, index, stride,
1462 				 ctype, stype, savings);
1463   return c;
1464 }
1465 
1466 /* Given GS which is an add or subtract of scalar integers or pointers,
1467    make at least one appropriate entry in the candidate table.  */
1468 
1469 static void
1470 slsr_process_add (gimple *gs, tree rhs1, tree rhs2, bool speed)
1471 {
1472   bool subtract_p = gimple_assign_rhs_code (gs) == MINUS_EXPR;
1473   slsr_cand_t c = NULL, c2;
1474 
1475   if (TREE_CODE (rhs2) == SSA_NAME)
1476     {
1477       /* First record an interpretation assuming RHS1 is the base expression
1478 	 and RHS2 is the stride.  But it doesn't make sense for the
1479 	 stride to be a pointer, so don't record a candidate in that case.  */
1480       if (!POINTER_TYPE_P (TREE_TYPE (rhs2)))
1481 	{
1482 	  c = create_add_ssa_cand (gs, rhs1, rhs2, subtract_p, speed);
1483 
1484 	  /* Add the first interpretation to the statement-candidate
1485 	     mapping.  */
1486 	  add_cand_for_stmt (gs, c);
1487 	}
1488 
1489       /* If the two RHS operands are identical, or this is a subtract,
1490 	 we're done.  */
1491       if (operand_equal_p (rhs1, rhs2, 0) || subtract_p)
1492 	return;
1493 
1494       /* Otherwise, record another interpretation assuming RHS2 is the
1495 	 base expression and RHS1 is the stride, again provided that the
1496 	 stride is not a pointer.  */
1497       if (!POINTER_TYPE_P (TREE_TYPE (rhs1)))
1498 	{
1499 	  c2 = create_add_ssa_cand (gs, rhs2, rhs1, false, speed);
1500 	  if (c)
1501 	    c->next_interp = c2->cand_num;
1502 	  else
1503 	    add_cand_for_stmt (gs, c2);
1504 	}
1505     }
1506   else if (TREE_CODE (rhs2) == INTEGER_CST)
1507     {
1508       /* Record an interpretation for the add-immediate.  */
1509       widest_int index = wi::to_widest (rhs2);
1510       if (subtract_p)
1511 	index = -index;
1512 
1513       c = create_add_imm_cand (gs, rhs1, index, speed);
1514 
1515       /* Add the interpretation to the statement-candidate mapping.  */
1516       add_cand_for_stmt (gs, c);
1517     }
1518 }
1519 
1520 /* Given GS which is a negate of a scalar integer, make an appropriate
1521    entry in the candidate table.  A negate is equivalent to a multiply
1522    by -1.  */
1523 
1524 static void
1525 slsr_process_neg (gimple *gs, tree rhs1, bool speed)
1526 {
1527   /* Record a CAND_MULT interpretation for the multiply by -1.  */
1528   slsr_cand_t c = create_mul_imm_cand (gs, rhs1, integer_minus_one_node, speed);
1529 
1530   /* Add the interpretation to the statement-candidate mapping.  */
1531   add_cand_for_stmt (gs, c);
1532 }
1533 
1534 /* Help function for legal_cast_p, operating on two trees.  Checks
1535    whether it's allowable to cast from RHS to LHS.  See legal_cast_p
1536    for more details.  */
1537 
1538 static bool
1539 legal_cast_p_1 (tree lhs_type, tree rhs_type)
1540 {
1541   unsigned lhs_size, rhs_size;
1542   bool lhs_wraps, rhs_wraps;
1543 
1544   lhs_size = TYPE_PRECISION (lhs_type);
1545   rhs_size = TYPE_PRECISION (rhs_type);
1546   lhs_wraps = ANY_INTEGRAL_TYPE_P (lhs_type) && TYPE_OVERFLOW_WRAPS (lhs_type);
1547   rhs_wraps = ANY_INTEGRAL_TYPE_P (rhs_type) && TYPE_OVERFLOW_WRAPS (rhs_type);
1548 
1549   if (lhs_size < rhs_size
1550       || (rhs_wraps && !lhs_wraps)
1551       || (rhs_wraps && lhs_wraps && rhs_size != lhs_size))
1552     return false;
1553 
1554   return true;
1555 }
1556 
1557 /* Return TRUE if GS is a statement that defines an SSA name from
1558    a conversion and is legal for us to combine with an add and multiply
1559    in the candidate table.  For example, suppose we have:
1560 
1561      A = B + i;
1562      C = (type) A;
1563      D = C * S;
1564 
1565    Without the type-cast, we would create a CAND_MULT for D with base B,
1566    index i, and stride S.  We want to record this candidate only if it
1567    is equivalent to apply the type cast following the multiply:
1568 
1569      A = B + i;
1570      E = A * S;
1571      D = (type) E;
1572 
1573    We will record the type with the candidate for D.  This allows us
1574    to use a similar previous candidate as a basis.  If we have earlier seen
1575 
1576      A' = B + i';
1577      C' = (type) A';
1578      D' = C' * S;
1579 
1580    we can replace D with
1581 
1582      D = D' + (i - i') * S;
1583 
1584    But if moving the type-cast would change semantics, we mustn't do this.
1585 
1586    This is legitimate for casts from a non-wrapping integral type to
1587    any integral type of the same or larger size.  It is not legitimate
1588    to convert a wrapping type to a non-wrapping type, or to a wrapping
1589    type of a different size.  I.e., with a wrapping type, we must
1590    assume that the addition B + i could wrap, in which case performing
1591    the multiply before or after one of the "illegal" type casts will
1592    have different semantics.  */
1593 
1594 static bool
1595 legal_cast_p (gimple *gs, tree rhs)
1596 {
1597   if (!is_gimple_assign (gs)
1598       || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs)))
1599     return false;
1600 
1601   return legal_cast_p_1 (TREE_TYPE (gimple_assign_lhs (gs)), TREE_TYPE (rhs));
1602 }
1603 
1604 /* Given GS which is a cast to a scalar integer type, determine whether
1605    the cast is legal for strength reduction.  If so, make at least one
1606    appropriate entry in the candidate table.  */
1607 
1608 static void
1609 slsr_process_cast (gimple *gs, tree rhs1, bool speed)
1610 {
1611   tree lhs, ctype;
1612   slsr_cand_t base_cand, c = NULL, c2;
1613   unsigned savings = 0;
1614 
1615   if (!legal_cast_p (gs, rhs1))
1616     return;
1617 
1618   lhs = gimple_assign_lhs (gs);
1619   base_cand = base_cand_from_table (rhs1);
1620   ctype = TREE_TYPE (lhs);
1621 
1622   if (base_cand && base_cand->kind != CAND_PHI)
1623     {
1624       while (base_cand)
1625 	{
1626 	  /* Propagate all data from the base candidate except the type,
1627 	     which comes from the cast, and the base candidate's cast,
1628 	     which is no longer applicable.  */
1629 	  if (has_single_use (rhs1))
1630 	    savings = (base_cand->dead_savings
1631 		       + stmt_cost (base_cand->cand_stmt, speed));
1632 
1633 	  c = alloc_cand_and_find_basis (base_cand->kind, gs,
1634 					 base_cand->base_expr,
1635 					 base_cand->index, base_cand->stride,
1636 					 ctype, base_cand->stride_type,
1637 					 savings);
1638 	  if (base_cand->next_interp)
1639 	    base_cand = lookup_cand (base_cand->next_interp);
1640 	  else
1641 	    base_cand = NULL;
1642 	}
1643     }
1644   else
1645     {
1646       /* If nothing is known about the RHS, create fresh CAND_ADD and
1647 	 CAND_MULT interpretations:
1648 
1649 	 X = Y + (0 * 1)
1650 	 X = (Y + 0) * 1
1651 
1652 	 The first of these is somewhat arbitrary, but the choice of
1653 	 1 for the stride simplifies the logic for propagating casts
1654 	 into their uses.  */
1655       c = alloc_cand_and_find_basis (CAND_ADD, gs, rhs1, 0,
1656 				     integer_one_node, ctype, sizetype, 0);
1657       c2 = alloc_cand_and_find_basis (CAND_MULT, gs, rhs1, 0,
1658 				      integer_one_node, ctype, sizetype, 0);
1659       c->next_interp = c2->cand_num;
1660     }
1661 
1662   /* Add the first (or only) interpretation to the statement-candidate
1663      mapping.  */
1664   add_cand_for_stmt (gs, c);
1665 }
1666 
1667 /* Given GS which is a copy of a scalar integer type, make at least one
1668    appropriate entry in the candidate table.
1669 
1670    This interface is included for completeness, but is unnecessary
1671    if this pass immediately follows a pass that performs copy
1672    propagation, such as DOM.  */
1673 
1674 static void
1675 slsr_process_copy (gimple *gs, tree rhs1, bool speed)
1676 {
1677   slsr_cand_t base_cand, c = NULL, c2;
1678   unsigned savings = 0;
1679 
1680   base_cand = base_cand_from_table (rhs1);
1681 
1682   if (base_cand && base_cand->kind != CAND_PHI)
1683     {
1684       while (base_cand)
1685 	{
1686 	  /* Propagate all data from the base candidate.  */
1687 	  if (has_single_use (rhs1))
1688 	    savings = (base_cand->dead_savings
1689 		       + stmt_cost (base_cand->cand_stmt, speed));
1690 
1691 	  c = alloc_cand_and_find_basis (base_cand->kind, gs,
1692 					 base_cand->base_expr,
1693 					 base_cand->index, base_cand->stride,
1694 					 base_cand->cand_type,
1695 					 base_cand->stride_type, savings);
1696 	  if (base_cand->next_interp)
1697 	    base_cand = lookup_cand (base_cand->next_interp);
1698 	  else
1699 	    base_cand = NULL;
1700 	}
1701     }
1702   else
1703     {
1704       /* If nothing is known about the RHS, create fresh CAND_ADD and
1705 	 CAND_MULT interpretations:
1706 
1707 	 X = Y + (0 * 1)
1708 	 X = (Y + 0) * 1
1709 
1710 	 The first of these is somewhat arbitrary, but the choice of
1711 	 1 for the stride simplifies the logic for propagating casts
1712 	 into their uses.  */
1713       c = alloc_cand_and_find_basis (CAND_ADD, gs, rhs1, 0,
1714 				     integer_one_node, TREE_TYPE (rhs1),
1715 				     sizetype, 0);
1716       c2 = alloc_cand_and_find_basis (CAND_MULT, gs, rhs1, 0,
1717 				      integer_one_node, TREE_TYPE (rhs1),
1718 				      sizetype, 0);
1719       c->next_interp = c2->cand_num;
1720     }
1721 
1722   /* Add the first (or only) interpretation to the statement-candidate
1723      mapping.  */
1724   add_cand_for_stmt (gs, c);
1725 }
1726 
1727 class find_candidates_dom_walker : public dom_walker
1728 {
1729 public:
1730   find_candidates_dom_walker (cdi_direction direction)
1731     : dom_walker (direction) {}
1732   virtual edge before_dom_children (basic_block);
1733 };
1734 
1735 /* Find strength-reduction candidates in block BB.  */
1736 
1737 edge
1738 find_candidates_dom_walker::before_dom_children (basic_block bb)
1739 {
1740   bool speed = optimize_bb_for_speed_p (bb);
1741 
1742   for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
1743        gsi_next (&gsi))
1744     slsr_process_phi (gsi.phi (), speed);
1745 
1746   for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1747        gsi_next (&gsi))
1748     {
1749       gimple *gs = gsi_stmt (gsi);
1750 
1751       if (stmt_could_throw_p (gs))
1752 	continue;
1753 
1754       if (gimple_vuse (gs) && gimple_assign_single_p (gs))
1755 	slsr_process_ref (gs);
1756 
1757       else if (is_gimple_assign (gs)
1758 	       && (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (gs)))
1759 		   || POINTER_TYPE_P (TREE_TYPE (gimple_assign_lhs (gs)))))
1760 	{
1761 	  tree rhs1 = NULL_TREE, rhs2 = NULL_TREE;
1762 
1763 	  switch (gimple_assign_rhs_code (gs))
1764 	    {
1765 	    case MULT_EXPR:
1766 	    case PLUS_EXPR:
1767 	      rhs1 = gimple_assign_rhs1 (gs);
1768 	      rhs2 = gimple_assign_rhs2 (gs);
1769 	      /* Should never happen, but currently some buggy situations
1770 		 in earlier phases put constants in rhs1.  */
1771 	      if (TREE_CODE (rhs1) != SSA_NAME)
1772 		continue;
1773 	      break;
1774 
1775 	    /* Possible future opportunity: rhs1 of a ptr+ can be
1776 	       an ADDR_EXPR.  */
1777 	    case POINTER_PLUS_EXPR:
1778 	    case MINUS_EXPR:
1779 	      rhs2 = gimple_assign_rhs2 (gs);
1780 	      gcc_fallthrough ();
1781 
1782 	    CASE_CONVERT:
1783 	    case SSA_NAME:
1784 	    case NEGATE_EXPR:
1785 	      rhs1 = gimple_assign_rhs1 (gs);
1786 	      if (TREE_CODE (rhs1) != SSA_NAME)
1787 		continue;
1788 	      break;
1789 
1790 	    default:
1791 	      ;
1792 	    }
1793 
1794 	  switch (gimple_assign_rhs_code (gs))
1795 	    {
1796 	    case MULT_EXPR:
1797 	      slsr_process_mul (gs, rhs1, rhs2, speed);
1798 	      break;
1799 
1800 	    case PLUS_EXPR:
1801 	    case POINTER_PLUS_EXPR:
1802 	    case MINUS_EXPR:
1803 	      slsr_process_add (gs, rhs1, rhs2, speed);
1804 	      break;
1805 
1806 	    case NEGATE_EXPR:
1807 	      slsr_process_neg (gs, rhs1, speed);
1808 	      break;
1809 
1810 	    CASE_CONVERT:
1811 	      slsr_process_cast (gs, rhs1, speed);
1812 	      break;
1813 
1814 	    case SSA_NAME:
1815 	      slsr_process_copy (gs, rhs1, speed);
1816 	      break;
1817 
1818 	    default:
1819 	      ;
1820 	    }
1821 	}
1822     }
1823   return NULL;
1824 }
1825 
1826 /* Dump a candidate for debug.  */
1827 
1828 static void
1829 dump_candidate (slsr_cand_t c)
1830 {
1831   fprintf (dump_file, "%3d  [%d] ", c->cand_num,
1832 	   gimple_bb (c->cand_stmt)->index);
1833   print_gimple_stmt (dump_file, c->cand_stmt, 0);
1834   switch (c->kind)
1835     {
1836     case CAND_MULT:
1837       fputs ("     MULT : (", dump_file);
1838       print_generic_expr (dump_file, c->base_expr);
1839       fputs (" + ", dump_file);
1840       print_decs (c->index, dump_file);
1841       fputs (") * ", dump_file);
1842       if (TREE_CODE (c->stride) != INTEGER_CST
1843 	  && c->stride_type != TREE_TYPE (c->stride))
1844 	{
1845 	  fputs ("(", dump_file);
1846 	  print_generic_expr (dump_file, c->stride_type);
1847 	  fputs (")", dump_file);
1848 	}
1849       print_generic_expr (dump_file, c->stride);
1850       fputs (" : ", dump_file);
1851       break;
1852     case CAND_ADD:
1853       fputs ("     ADD  : ", dump_file);
1854       print_generic_expr (dump_file, c->base_expr);
1855       fputs (" + (", dump_file);
1856       print_decs (c->index, dump_file);
1857       fputs (" * ", dump_file);
1858       if (TREE_CODE (c->stride) != INTEGER_CST
1859 	  && c->stride_type != TREE_TYPE (c->stride))
1860 	{
1861 	  fputs ("(", dump_file);
1862 	  print_generic_expr (dump_file, c->stride_type);
1863 	  fputs (")", dump_file);
1864 	}
1865       print_generic_expr (dump_file, c->stride);
1866       fputs (") : ", dump_file);
1867       break;
1868     case CAND_REF:
1869       fputs ("     REF  : ", dump_file);
1870       print_generic_expr (dump_file, c->base_expr);
1871       fputs (" + (", dump_file);
1872       print_generic_expr (dump_file, c->stride);
1873       fputs (") + ", dump_file);
1874       print_decs (c->index, dump_file);
1875       fputs (" : ", dump_file);
1876       break;
1877     case CAND_PHI:
1878       fputs ("     PHI  : ", dump_file);
1879       print_generic_expr (dump_file, c->base_expr);
1880       fputs (" + (unknown * ", dump_file);
1881       print_generic_expr (dump_file, c->stride);
1882       fputs (") : ", dump_file);
1883       break;
1884     default:
1885       gcc_unreachable ();
1886     }
1887   print_generic_expr (dump_file, c->cand_type);
1888   fprintf (dump_file, "\n     basis: %d  dependent: %d  sibling: %d\n",
1889 	   c->basis, c->dependent, c->sibling);
1890   fprintf (dump_file, "     next-interp: %d  dead-savings: %d\n",
1891 	   c->next_interp, c->dead_savings);
1892   if (c->def_phi)
1893     fprintf (dump_file, "     phi:  %d\n", c->def_phi);
1894   fputs ("\n", dump_file);
1895 }
1896 
1897 /* Dump the candidate vector for debug.  */
1898 
1899 static void
1900 dump_cand_vec (void)
1901 {
1902   unsigned i;
1903   slsr_cand_t c;
1904 
1905   fprintf (dump_file, "\nStrength reduction candidate vector:\n\n");
1906 
1907   FOR_EACH_VEC_ELT (cand_vec, i, c)
1908     dump_candidate (c);
1909 }
1910 
1911 /* Callback used to dump the candidate chains hash table.  */
1912 
1913 int
1914 ssa_base_cand_dump_callback (cand_chain **slot, void *ignored ATTRIBUTE_UNUSED)
1915 {
1916   const_cand_chain_t chain = *slot;
1917   cand_chain_t p;
1918 
1919   print_generic_expr (dump_file, chain->base_expr);
1920   fprintf (dump_file, " -> %d", chain->cand->cand_num);
1921 
1922   for (p = chain->next; p; p = p->next)
1923     fprintf (dump_file, " -> %d", p->cand->cand_num);
1924 
1925   fputs ("\n", dump_file);
1926   return 1;
1927 }
1928 
1929 /* Dump the candidate chains.  */
1930 
1931 static void
1932 dump_cand_chains (void)
1933 {
1934   fprintf (dump_file, "\nStrength reduction candidate chains:\n\n");
1935   base_cand_map->traverse_noresize <void *, ssa_base_cand_dump_callback>
1936     (NULL);
1937   fputs ("\n", dump_file);
1938 }
1939 
1940 /* Dump the increment vector for debug.  */
1941 
1942 static void
1943 dump_incr_vec (void)
1944 {
1945   if (dump_file && (dump_flags & TDF_DETAILS))
1946     {
1947       unsigned i;
1948 
1949       fprintf (dump_file, "\nIncrement vector:\n\n");
1950 
1951       for (i = 0; i < incr_vec_len; i++)
1952 	{
1953 	  fprintf (dump_file, "%3d  increment:   ", i);
1954 	  print_decs (incr_vec[i].incr, dump_file);
1955 	  fprintf (dump_file, "\n     count:       %d", incr_vec[i].count);
1956 	  fprintf (dump_file, "\n     cost:        %d", incr_vec[i].cost);
1957 	  fputs ("\n     initializer: ", dump_file);
1958 	  print_generic_expr (dump_file, incr_vec[i].initializer);
1959 	  fputs ("\n\n", dump_file);
1960 	}
1961     }
1962 }
1963 
1964 /* Replace *EXPR in candidate C with an equivalent strength-reduced
1965    data reference.  */
1966 
1967 static void
1968 replace_ref (tree *expr, slsr_cand_t c)
1969 {
1970   tree add_expr, mem_ref, acc_type = TREE_TYPE (*expr);
1971   unsigned HOST_WIDE_INT misalign;
1972   unsigned align;
1973 
1974   /* Ensure the memory reference carries the minimum alignment
1975      requirement for the data type.  See PR58041.  */
1976   get_object_alignment_1 (*expr, &align, &misalign);
1977   if (misalign != 0)
1978     align = least_bit_hwi (misalign);
1979   if (align < TYPE_ALIGN (acc_type))
1980     acc_type = build_aligned_type (acc_type, align);
1981 
1982   add_expr = fold_build2 (POINTER_PLUS_EXPR, c->cand_type,
1983 			  c->base_expr, c->stride);
1984   mem_ref = fold_build2 (MEM_REF, acc_type, add_expr,
1985 			 wide_int_to_tree (c->cand_type, c->index));
1986 
1987   /* Gimplify the base addressing expression for the new MEM_REF tree.  */
1988   gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
1989   TREE_OPERAND (mem_ref, 0)
1990     = force_gimple_operand_gsi (&gsi, TREE_OPERAND (mem_ref, 0),
1991 				/*simple_p=*/true, NULL,
1992 				/*before=*/true, GSI_SAME_STMT);
1993   copy_ref_info (mem_ref, *expr);
1994   *expr = mem_ref;
1995   update_stmt (c->cand_stmt);
1996 }
1997 
1998 /* Replace CAND_REF candidate C, each sibling of candidate C, and each
1999    dependent of candidate C with an equivalent strength-reduced data
2000    reference.  */
2001 
2002 static void
2003 replace_refs (slsr_cand_t c)
2004 {
2005   if (dump_file && (dump_flags & TDF_DETAILS))
2006     {
2007       fputs ("Replacing reference: ", dump_file);
2008       print_gimple_stmt (dump_file, c->cand_stmt, 0);
2009     }
2010 
2011   if (gimple_vdef (c->cand_stmt))
2012     {
2013       tree *lhs = gimple_assign_lhs_ptr (c->cand_stmt);
2014       replace_ref (lhs, c);
2015     }
2016   else
2017     {
2018       tree *rhs = gimple_assign_rhs1_ptr (c->cand_stmt);
2019       replace_ref (rhs, c);
2020     }
2021 
2022   if (dump_file && (dump_flags & TDF_DETAILS))
2023     {
2024       fputs ("With: ", dump_file);
2025       print_gimple_stmt (dump_file, c->cand_stmt, 0);
2026       fputs ("\n", dump_file);
2027     }
2028 
2029   if (c->sibling)
2030     replace_refs (lookup_cand (c->sibling));
2031 
2032   if (c->dependent)
2033     replace_refs (lookup_cand (c->dependent));
2034 }
2035 
2036 /* Return TRUE if candidate C is dependent upon a PHI.  */
2037 
2038 static bool
2039 phi_dependent_cand_p (slsr_cand_t c)
2040 {
2041   /* A candidate is not necessarily dependent upon a PHI just because
2042      it has a phi definition for its base name.  It may have a basis
2043      that relies upon the same phi definition, in which case the PHI
2044      is irrelevant to this candidate.  */
2045   return (c->def_phi
2046 	  && c->basis
2047 	  && lookup_cand (c->basis)->def_phi != c->def_phi);
2048 }
2049 
2050 /* Calculate the increment required for candidate C relative to
2051    its basis.  */
2052 
2053 static widest_int
2054 cand_increment (slsr_cand_t c)
2055 {
2056   slsr_cand_t basis;
2057 
2058   /* If the candidate doesn't have a basis, just return its own
2059      index.  This is useful in record_increments to help us find
2060      an existing initializer.  Also, if the candidate's basis is
2061      hidden by a phi, then its own index will be the increment
2062      from the newly introduced phi basis.  */
2063   if (!c->basis || phi_dependent_cand_p (c))
2064     return c->index;
2065 
2066   basis = lookup_cand (c->basis);
2067   gcc_assert (operand_equal_p (c->base_expr, basis->base_expr, 0));
2068   return c->index - basis->index;
2069 }
2070 
2071 /* Calculate the increment required for candidate C relative to
2072    its basis.  If we aren't going to generate pointer arithmetic
2073    for this candidate, return the absolute value of that increment
2074    instead.  */
2075 
2076 static inline widest_int
2077 cand_abs_increment (slsr_cand_t c)
2078 {
2079   widest_int increment = cand_increment (c);
2080 
2081   if (!address_arithmetic_p && wi::neg_p (increment))
2082     increment = -increment;
2083 
2084   return increment;
2085 }
2086 
2087 /* Return TRUE iff candidate C has already been replaced under
2088    another interpretation.  */
2089 
2090 static inline bool
2091 cand_already_replaced (slsr_cand_t c)
2092 {
2093   return (gimple_bb (c->cand_stmt) == 0);
2094 }
2095 
2096 /* Common logic used by replace_unconditional_candidate and
2097    replace_conditional_candidate.  */
2098 
2099 static void
2100 replace_mult_candidate (slsr_cand_t c, tree basis_name, widest_int bump)
2101 {
2102   tree target_type = TREE_TYPE (gimple_assign_lhs (c->cand_stmt));
2103   enum tree_code cand_code = gimple_assign_rhs_code (c->cand_stmt);
2104 
2105   /* It is not useful to replace casts, copies, negates, or adds of
2106      an SSA name and a constant.  */
2107   if (cand_code == SSA_NAME
2108       || CONVERT_EXPR_CODE_P (cand_code)
2109       || cand_code == PLUS_EXPR
2110       || cand_code == POINTER_PLUS_EXPR
2111       || cand_code == MINUS_EXPR
2112       || cand_code == NEGATE_EXPR)
2113     return;
2114 
2115   enum tree_code code = PLUS_EXPR;
2116   tree bump_tree;
2117   gimple *stmt_to_print = NULL;
2118 
2119   if (wi::neg_p (bump))
2120     {
2121       code = MINUS_EXPR;
2122       bump = -bump;
2123     }
2124 
2125   /* It is possible that the resulting bump doesn't fit in target_type.
2126      Abandon the replacement in this case.  This does not affect
2127      siblings or dependents of C.  */
2128   if (bump != wi::ext (bump, TYPE_PRECISION (target_type),
2129 		       TYPE_SIGN (target_type)))
2130     return;
2131 
2132   bump_tree = wide_int_to_tree (target_type, bump);
2133 
2134   /* If the basis name and the candidate's LHS have incompatible types,
2135      introduce a cast.  */
2136   if (!useless_type_conversion_p (target_type, TREE_TYPE (basis_name)))
2137     basis_name = introduce_cast_before_cand (c, target_type, basis_name);
2138 
2139   if (dump_file && (dump_flags & TDF_DETAILS))
2140     {
2141       fputs ("Replacing: ", dump_file);
2142       print_gimple_stmt (dump_file, c->cand_stmt, 0);
2143     }
2144 
2145   if (bump == 0)
2146     {
2147       tree lhs = gimple_assign_lhs (c->cand_stmt);
2148       gassign *copy_stmt = gimple_build_assign (lhs, basis_name);
2149       gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
2150       slsr_cand_t cc = c;
2151       gimple_set_location (copy_stmt, gimple_location (c->cand_stmt));
2152       gsi_replace (&gsi, copy_stmt, false);
2153       c->cand_stmt = copy_stmt;
2154       while (cc->next_interp)
2155 	{
2156 	  cc = lookup_cand (cc->next_interp);
2157 	  cc->cand_stmt = copy_stmt;
2158 	}
2159       if (dump_file && (dump_flags & TDF_DETAILS))
2160 	stmt_to_print = copy_stmt;
2161     }
2162   else
2163     {
2164       tree rhs1, rhs2;
2165       if (cand_code != NEGATE_EXPR) {
2166 	rhs1 = gimple_assign_rhs1 (c->cand_stmt);
2167 	rhs2 = gimple_assign_rhs2 (c->cand_stmt);
2168       }
2169       if (cand_code != NEGATE_EXPR
2170 	  && ((operand_equal_p (rhs1, basis_name, 0)
2171 	       && operand_equal_p (rhs2, bump_tree, 0))
2172 	      || (operand_equal_p (rhs1, bump_tree, 0)
2173 		  && operand_equal_p (rhs2, basis_name, 0))))
2174 	{
2175 	  if (dump_file && (dump_flags & TDF_DETAILS))
2176 	    {
2177 	      fputs ("(duplicate, not actually replacing)", dump_file);
2178 	      stmt_to_print = c->cand_stmt;
2179 	    }
2180 	}
2181       else
2182 	{
2183 	  gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
2184 	  slsr_cand_t cc = c;
2185 	  gimple_assign_set_rhs_with_ops (&gsi, code, basis_name, bump_tree);
2186 	  update_stmt (gsi_stmt (gsi));
2187 	  c->cand_stmt = gsi_stmt (gsi);
2188 	  while (cc->next_interp)
2189 	    {
2190 	      cc = lookup_cand (cc->next_interp);
2191 	      cc->cand_stmt = gsi_stmt (gsi);
2192 	    }
2193 	  if (dump_file && (dump_flags & TDF_DETAILS))
2194 	    stmt_to_print = gsi_stmt (gsi);
2195 	}
2196     }
2197 
2198   if (dump_file && (dump_flags & TDF_DETAILS))
2199     {
2200       fputs ("With: ", dump_file);
2201       print_gimple_stmt (dump_file, stmt_to_print, 0);
2202       fputs ("\n", dump_file);
2203     }
2204 }
2205 
2206 /* Replace candidate C with an add or subtract.   Note that we only
2207    operate on CAND_MULTs with known strides, so we will never generate
2208    a POINTER_PLUS_EXPR.  Each candidate X = (B + i) * S is replaced by
2209    X = Y + ((i - i') * S), as described in the module commentary.  The
2210    folded value ((i - i') * S) is referred to here as the "bump."  */
2211 
2212 static void
2213 replace_unconditional_candidate (slsr_cand_t c)
2214 {
2215   slsr_cand_t basis;
2216 
2217   if (cand_already_replaced (c))
2218     return;
2219 
2220   basis = lookup_cand (c->basis);
2221   widest_int bump = cand_increment (c) * wi::to_widest (c->stride);
2222 
2223   replace_mult_candidate (c, gimple_assign_lhs (basis->cand_stmt), bump);
2224 }
2225 
2226 /* Return the index in the increment vector of the given INCREMENT,
2227    or -1 if not found.  The latter can occur if more than
2228    MAX_INCR_VEC_LEN increments have been found.  */
2229 
2230 static inline int
2231 incr_vec_index (const widest_int &increment)
2232 {
2233   unsigned i;
2234 
2235   for (i = 0; i < incr_vec_len && increment != incr_vec[i].incr; i++)
2236     ;
2237 
2238   if (i < incr_vec_len)
2239     return i;
2240   else
2241     return -1;
2242 }
2243 
2244 /* Create a new statement along edge E to add BASIS_NAME to the product
2245    of INCREMENT and the stride of candidate C.  Create and return a new
2246    SSA name from *VAR to be used as the LHS of the new statement.
2247    KNOWN_STRIDE is true iff C's stride is a constant.  */
2248 
2249 static tree
2250 create_add_on_incoming_edge (slsr_cand_t c, tree basis_name,
2251 			     widest_int increment, edge e, location_t loc,
2252 			     bool known_stride)
2253 {
2254   tree lhs, basis_type;
2255   gassign *new_stmt, *cast_stmt = NULL;
2256 
2257   /* If the add candidate along this incoming edge has the same
2258      index as C's hidden basis, the hidden basis represents this
2259      edge correctly.  */
2260   if (increment == 0)
2261     return basis_name;
2262 
2263   basis_type = TREE_TYPE (basis_name);
2264   lhs = make_temp_ssa_name (basis_type, NULL, "slsr");
2265 
2266   /* Occasionally people convert integers to pointers without a
2267      cast, leading us into trouble if we aren't careful.  */
2268   enum tree_code plus_code
2269     = POINTER_TYPE_P (basis_type) ? POINTER_PLUS_EXPR : PLUS_EXPR;
2270 
2271   if (known_stride)
2272     {
2273       tree bump_tree;
2274       enum tree_code code = plus_code;
2275       widest_int bump = increment * wi::to_widest (c->stride);
2276       if (wi::neg_p (bump) && !POINTER_TYPE_P (basis_type))
2277 	{
2278 	  code = MINUS_EXPR;
2279 	  bump = -bump;
2280 	}
2281 
2282       tree stride_type = POINTER_TYPE_P (basis_type) ? sizetype : basis_type;
2283       bump_tree = wide_int_to_tree (stride_type, bump);
2284       new_stmt = gimple_build_assign (lhs, code, basis_name, bump_tree);
2285     }
2286   else
2287     {
2288       int i;
2289       bool negate_incr = !POINTER_TYPE_P (basis_type) && wi::neg_p (increment);
2290       i = incr_vec_index (negate_incr ? -increment : increment);
2291       gcc_assert (i >= 0);
2292 
2293       if (incr_vec[i].initializer)
2294 	{
2295 	  enum tree_code code = negate_incr ? MINUS_EXPR : plus_code;
2296 	  new_stmt = gimple_build_assign (lhs, code, basis_name,
2297 					  incr_vec[i].initializer);
2298 	}
2299       else {
2300 	tree stride;
2301 
2302 	if (!types_compatible_p (TREE_TYPE (c->stride), c->stride_type))
2303 	  {
2304 	    tree cast_stride = make_temp_ssa_name (c->stride_type, NULL,
2305 						   "slsr");
2306 	    cast_stmt = gimple_build_assign (cast_stride, NOP_EXPR,
2307 					     c->stride);
2308 	    stride = cast_stride;
2309 	  }
2310 	else
2311 	  stride = c->stride;
2312 
2313 	if (increment == 1)
2314 	  new_stmt = gimple_build_assign (lhs, plus_code, basis_name, stride);
2315 	else if (increment == -1)
2316 	  new_stmt = gimple_build_assign (lhs, MINUS_EXPR, basis_name, stride);
2317 	else
2318 	  gcc_unreachable ();
2319       }
2320     }
2321 
2322   if (cast_stmt)
2323     {
2324       gimple_set_location (cast_stmt, loc);
2325       gsi_insert_on_edge (e, cast_stmt);
2326     }
2327 
2328   gimple_set_location (new_stmt, loc);
2329   gsi_insert_on_edge (e, new_stmt);
2330 
2331   if (dump_file && (dump_flags & TDF_DETAILS))
2332     {
2333       if (cast_stmt)
2334 	{
2335 	  fprintf (dump_file, "Inserting cast on edge %d->%d: ",
2336 		   e->src->index, e->dest->index);
2337 	  print_gimple_stmt (dump_file, cast_stmt, 0);
2338 	}
2339       fprintf (dump_file, "Inserting on edge %d->%d: ", e->src->index,
2340 	       e->dest->index);
2341       print_gimple_stmt (dump_file, new_stmt, 0);
2342     }
2343 
2344   return lhs;
2345 }
2346 
2347 /* Clear the visited field for a tree of PHI candidates.  */
2348 
2349 static void
2350 clear_visited (gphi *phi)
2351 {
2352   unsigned i;
2353   slsr_cand_t phi_cand = *stmt_cand_map->get (phi);
2354 
2355   if (phi_cand->visited)
2356     {
2357       phi_cand->visited = 0;
2358 
2359       for (i = 0; i < gimple_phi_num_args (phi); i++)
2360 	{
2361 	  tree arg = gimple_phi_arg_def (phi, i);
2362 	  gimple *arg_def = SSA_NAME_DEF_STMT (arg);
2363 	  if (gimple_code (arg_def) == GIMPLE_PHI)
2364 	    clear_visited (as_a <gphi *> (arg_def));
2365 	}
2366     }
2367 }
2368 
2369 /* Recursive helper function for create_phi_basis.  */
2370 
2371 static tree
2372 create_phi_basis_1 (slsr_cand_t c, gimple *from_phi, tree basis_name,
2373 		    location_t loc, bool known_stride)
2374 {
2375   int i;
2376   tree name, phi_arg;
2377   gphi *phi;
2378   slsr_cand_t basis = lookup_cand (c->basis);
2379   int nargs = gimple_phi_num_args (from_phi);
2380   basic_block phi_bb = gimple_bb (from_phi);
2381   slsr_cand_t phi_cand = *stmt_cand_map->get (from_phi);
2382   auto_vec<tree> phi_args (nargs);
2383 
2384   if (phi_cand->visited)
2385     return phi_cand->cached_basis;
2386   phi_cand->visited = 1;
2387 
2388   /* Process each argument of the existing phi that represents
2389      conditionally-executed add candidates.  */
2390   for (i = 0; i < nargs; i++)
2391     {
2392       edge e = (*phi_bb->preds)[i];
2393       tree arg = gimple_phi_arg_def (from_phi, i);
2394       tree feeding_def;
2395 
2396       /* If the phi argument is the base name of the CAND_PHI, then
2397 	 this incoming arc should use the hidden basis.  */
2398       if (operand_equal_p (arg, phi_cand->base_expr, 0))
2399 	if (basis->index == 0)
2400 	  feeding_def = gimple_assign_lhs (basis->cand_stmt);
2401 	else
2402 	  {
2403 	    widest_int incr = -basis->index;
2404 	    feeding_def = create_add_on_incoming_edge (c, basis_name, incr,
2405 						       e, loc, known_stride);
2406 	  }
2407       else
2408 	{
2409 	  gimple *arg_def = SSA_NAME_DEF_STMT (arg);
2410 
2411 	  /* If there is another phi along this incoming edge, we must
2412 	     process it in the same fashion to ensure that all basis
2413 	     adjustments are made along its incoming edges.  */
2414 	  if (gimple_code (arg_def) == GIMPLE_PHI)
2415 	    feeding_def = create_phi_basis_1 (c, arg_def, basis_name,
2416 					      loc, known_stride);
2417 	  else
2418 	    {
2419 	      slsr_cand_t arg_cand = base_cand_from_table (arg);
2420 	      widest_int diff = arg_cand->index - basis->index;
2421 	      feeding_def = create_add_on_incoming_edge (c, basis_name, diff,
2422 							 e, loc, known_stride);
2423 	    }
2424 	}
2425 
2426       /* Because of recursion, we need to save the arguments in a vector
2427 	 so we can create the PHI statement all at once.  Otherwise the
2428 	 storage for the half-created PHI can be reclaimed.  */
2429       phi_args.safe_push (feeding_def);
2430     }
2431 
2432   /* Create the new phi basis.  */
2433   name = make_temp_ssa_name (TREE_TYPE (basis_name), NULL, "slsr");
2434   phi = create_phi_node (name, phi_bb);
2435   SSA_NAME_DEF_STMT (name) = phi;
2436 
2437   FOR_EACH_VEC_ELT (phi_args, i, phi_arg)
2438     {
2439       edge e = (*phi_bb->preds)[i];
2440       add_phi_arg (phi, phi_arg, e, loc);
2441     }
2442 
2443   update_stmt (phi);
2444 
2445   if (dump_file && (dump_flags & TDF_DETAILS))
2446     {
2447       fputs ("Introducing new phi basis: ", dump_file);
2448       print_gimple_stmt (dump_file, phi, 0);
2449     }
2450 
2451   phi_cand->cached_basis = name;
2452   return name;
2453 }
2454 
2455 /* Given a candidate C with BASIS_NAME being the LHS of C's basis which
2456    is hidden by the phi node FROM_PHI, create a new phi node in the same
2457    block as FROM_PHI.  The new phi is suitable for use as a basis by C,
2458    with its phi arguments representing conditional adjustments to the
2459    hidden basis along conditional incoming paths.  Those adjustments are
2460    made by creating add statements (and sometimes recursively creating
2461    phis) along those incoming paths.  LOC is the location to attach to
2462    the introduced statements.  KNOWN_STRIDE is true iff C's stride is a
2463    constant.  */
2464 
2465 static tree
2466 create_phi_basis (slsr_cand_t c, gimple *from_phi, tree basis_name,
2467 		  location_t loc, bool known_stride)
2468 {
2469   tree retval = create_phi_basis_1 (c, from_phi, basis_name, loc,
2470 				    known_stride);
2471   gcc_assert (retval);
2472   clear_visited (as_a <gphi *> (from_phi));
2473   return retval;
2474 }
2475 
2476 /* Given a candidate C whose basis is hidden by at least one intervening
2477    phi, introduce a matching number of new phis to represent its basis
2478    adjusted by conditional increments along possible incoming paths.  Then
2479    replace C as though it were an unconditional candidate, using the new
2480    basis.  */
2481 
2482 static void
2483 replace_conditional_candidate (slsr_cand_t c)
2484 {
2485   tree basis_name, name;
2486   slsr_cand_t basis;
2487   location_t loc;
2488 
2489   /* Look up the LHS SSA name from C's basis.  This will be the
2490      RHS1 of the adds we will introduce to create new phi arguments.  */
2491   basis = lookup_cand (c->basis);
2492   basis_name = gimple_assign_lhs (basis->cand_stmt);
2493 
2494   /* Create a new phi statement which will represent C's true basis
2495      after the transformation is complete.  */
2496   loc = gimple_location (c->cand_stmt);
2497   name = create_phi_basis (c, lookup_cand (c->def_phi)->cand_stmt,
2498 			   basis_name, loc, KNOWN_STRIDE);
2499 
2500   /* Replace C with an add of the new basis phi and a constant.  */
2501   widest_int bump = c->index * wi::to_widest (c->stride);
2502 
2503   replace_mult_candidate (c, name, bump);
2504 }
2505 
2506 /* Recursive helper function for phi_add_costs.  SPREAD is a measure of
2507    how many PHI nodes we have visited at this point in the tree walk.  */
2508 
2509 static int
2510 phi_add_costs_1 (gimple *phi, slsr_cand_t c, int one_add_cost, int *spread)
2511 {
2512   unsigned i;
2513   int cost = 0;
2514   slsr_cand_t phi_cand = *stmt_cand_map->get (phi);
2515 
2516   if (phi_cand->visited)
2517     return 0;
2518 
2519   phi_cand->visited = 1;
2520   (*spread)++;
2521 
2522   /* If we work our way back to a phi that isn't dominated by the hidden
2523      basis, this isn't a candidate for replacement.  Indicate this by
2524      returning an unreasonably high cost.  It's not easy to detect
2525      these situations when determining the basis, so we defer the
2526      decision until now.  */
2527   basic_block phi_bb = gimple_bb (phi);
2528   slsr_cand_t basis = lookup_cand (c->basis);
2529   basic_block basis_bb = gimple_bb (basis->cand_stmt);
2530 
2531   if (phi_bb == basis_bb || !dominated_by_p (CDI_DOMINATORS, phi_bb, basis_bb))
2532     return COST_INFINITE;
2533 
2534   for (i = 0; i < gimple_phi_num_args (phi); i++)
2535     {
2536       tree arg = gimple_phi_arg_def (phi, i);
2537 
2538       if (arg != phi_cand->base_expr)
2539 	{
2540 	  gimple *arg_def = SSA_NAME_DEF_STMT (arg);
2541 
2542 	  if (gimple_code (arg_def) == GIMPLE_PHI)
2543 	    {
2544 	      cost += phi_add_costs_1 (arg_def, c, one_add_cost, spread);
2545 
2546 	      if (cost >= COST_INFINITE || *spread > MAX_SPREAD)
2547 		return COST_INFINITE;
2548 	    }
2549 	  else
2550 	    {
2551 	      slsr_cand_t arg_cand = base_cand_from_table (arg);
2552 
2553 	      if (arg_cand->index != c->index)
2554 		cost += one_add_cost;
2555 	    }
2556 	}
2557     }
2558 
2559   return cost;
2560 }
2561 
2562 /* Compute the expected costs of inserting basis adjustments for
2563    candidate C with phi-definition PHI.  The cost of inserting
2564    one adjustment is given by ONE_ADD_COST.  If PHI has arguments
2565    which are themselves phi results, recursively calculate costs
2566    for those phis as well.  */
2567 
2568 static int
2569 phi_add_costs (gimple *phi, slsr_cand_t c, int one_add_cost)
2570 {
2571   int spread = 0;
2572   int retval = phi_add_costs_1 (phi, c, one_add_cost, &spread);
2573   clear_visited (as_a <gphi *> (phi));
2574   return retval;
2575 }
2576 /* For candidate C, each sibling of candidate C, and each dependent of
2577    candidate C, determine whether the candidate is dependent upon a
2578    phi that hides its basis.  If not, replace the candidate unconditionally.
2579    Otherwise, determine whether the cost of introducing compensation code
2580    for the candidate is offset by the gains from strength reduction.  If
2581    so, replace the candidate and introduce the compensation code.  */
2582 
2583 static void
2584 replace_uncond_cands_and_profitable_phis (slsr_cand_t c)
2585 {
2586   if (phi_dependent_cand_p (c))
2587     {
2588       /* A multiply candidate with a stride of 1 is just an artifice
2589 	 of a copy or cast; there is no value in replacing it.  */
2590       if (c->kind == CAND_MULT && wi::to_widest (c->stride) != 1)
2591 	{
2592 	  /* A candidate dependent upon a phi will replace a multiply by
2593 	     a constant with an add, and will insert at most one add for
2594 	     each phi argument.  Add these costs with the potential dead-code
2595 	     savings to determine profitability.  */
2596 	  bool speed = optimize_bb_for_speed_p (gimple_bb (c->cand_stmt));
2597 	  int mult_savings = stmt_cost (c->cand_stmt, speed);
2598 	  gimple *phi = lookup_cand (c->def_phi)->cand_stmt;
2599 	  tree phi_result = gimple_phi_result (phi);
2600 	  int one_add_cost = add_cost (speed,
2601 				       TYPE_MODE (TREE_TYPE (phi_result)));
2602 	  int add_costs = one_add_cost + phi_add_costs (phi, c, one_add_cost);
2603 	  int cost = add_costs - mult_savings - c->dead_savings;
2604 
2605 	  if (dump_file && (dump_flags & TDF_DETAILS))
2606 	    {
2607 	      fprintf (dump_file, "  Conditional candidate %d:\n", c->cand_num);
2608 	      fprintf (dump_file, "    add_costs = %d\n", add_costs);
2609 	      fprintf (dump_file, "    mult_savings = %d\n", mult_savings);
2610 	      fprintf (dump_file, "    dead_savings = %d\n", c->dead_savings);
2611 	      fprintf (dump_file, "    cost = %d\n", cost);
2612 	      if (cost <= COST_NEUTRAL)
2613 		fputs ("  Replacing...\n", dump_file);
2614 	      else
2615 		fputs ("  Not replaced.\n", dump_file);
2616 	    }
2617 
2618 	  if (cost <= COST_NEUTRAL)
2619 	    replace_conditional_candidate (c);
2620 	}
2621     }
2622   else
2623     replace_unconditional_candidate (c);
2624 
2625   if (c->sibling)
2626     replace_uncond_cands_and_profitable_phis (lookup_cand (c->sibling));
2627 
2628   if (c->dependent)
2629     replace_uncond_cands_and_profitable_phis (lookup_cand (c->dependent));
2630 }
2631 
2632 /* Count the number of candidates in the tree rooted at C that have
2633    not already been replaced under other interpretations.  */
2634 
2635 static int
2636 count_candidates (slsr_cand_t c)
2637 {
2638   unsigned count = cand_already_replaced (c) ? 0 : 1;
2639 
2640   if (c->sibling)
2641     count += count_candidates (lookup_cand (c->sibling));
2642 
2643   if (c->dependent)
2644     count += count_candidates (lookup_cand (c->dependent));
2645 
2646   return count;
2647 }
2648 
2649 /* Increase the count of INCREMENT by one in the increment vector.
2650    INCREMENT is associated with candidate C.  If INCREMENT is to be
2651    conditionally executed as part of a conditional candidate replacement,
2652    IS_PHI_ADJUST is true, otherwise false.  If an initializer
2653    T_0 = stride * I is provided by a candidate that dominates all
2654    candidates with the same increment, also record T_0 for subsequent use.  */
2655 
2656 static void
2657 record_increment (slsr_cand_t c, widest_int increment, bool is_phi_adjust)
2658 {
2659   bool found = false;
2660   unsigned i;
2661 
2662   /* Treat increments that differ only in sign as identical so as to
2663      share initializers, unless we are generating pointer arithmetic.  */
2664   if (!address_arithmetic_p && wi::neg_p (increment))
2665     increment = -increment;
2666 
2667   for (i = 0; i < incr_vec_len; i++)
2668     {
2669       if (incr_vec[i].incr == increment)
2670 	{
2671 	  incr_vec[i].count++;
2672 	  found = true;
2673 
2674 	  /* If we previously recorded an initializer that doesn't
2675 	     dominate this candidate, it's not going to be useful to
2676 	     us after all.  */
2677 	  if (incr_vec[i].initializer
2678 	      && !dominated_by_p (CDI_DOMINATORS,
2679 				  gimple_bb (c->cand_stmt),
2680 				  incr_vec[i].init_bb))
2681 	    {
2682 	      incr_vec[i].initializer = NULL_TREE;
2683 	      incr_vec[i].init_bb = NULL;
2684 	    }
2685 
2686 	  break;
2687 	}
2688     }
2689 
2690   if (!found && incr_vec_len < MAX_INCR_VEC_LEN - 1)
2691     {
2692       /* The first time we see an increment, create the entry for it.
2693 	 If this is the root candidate which doesn't have a basis, set
2694 	 the count to zero.  We're only processing it so it can possibly
2695 	 provide an initializer for other candidates.  */
2696       incr_vec[incr_vec_len].incr = increment;
2697       incr_vec[incr_vec_len].count = c->basis || is_phi_adjust ? 1 : 0;
2698       incr_vec[incr_vec_len].cost = COST_INFINITE;
2699 
2700       /* Optimistically record the first occurrence of this increment
2701 	 as providing an initializer (if it does); we will revise this
2702 	 opinion later if it doesn't dominate all other occurrences.
2703          Exception:  increments of 0, 1 never need initializers;
2704 	 and phi adjustments don't ever provide initializers.  */
2705       if (c->kind == CAND_ADD
2706 	  && !is_phi_adjust
2707 	  && c->index == increment
2708 	  && (increment > 1 || increment < 0)
2709 	  && (gimple_assign_rhs_code (c->cand_stmt) == PLUS_EXPR
2710 	      || gimple_assign_rhs_code (c->cand_stmt) == POINTER_PLUS_EXPR))
2711 	{
2712 	  tree t0 = NULL_TREE;
2713 	  tree rhs1 = gimple_assign_rhs1 (c->cand_stmt);
2714 	  tree rhs2 = gimple_assign_rhs2 (c->cand_stmt);
2715 	  if (operand_equal_p (rhs1, c->base_expr, 0))
2716 	    t0 = rhs2;
2717 	  else if (operand_equal_p (rhs2, c->base_expr, 0))
2718 	    t0 = rhs1;
2719 	  if (t0
2720 	      && SSA_NAME_DEF_STMT (t0)
2721 	      && gimple_bb (SSA_NAME_DEF_STMT (t0)))
2722 	    {
2723 	      incr_vec[incr_vec_len].initializer = t0;
2724 	      incr_vec[incr_vec_len++].init_bb
2725 		= gimple_bb (SSA_NAME_DEF_STMT (t0));
2726 	    }
2727 	  else
2728 	    {
2729 	      incr_vec[incr_vec_len].initializer = NULL_TREE;
2730 	      incr_vec[incr_vec_len++].init_bb = NULL;
2731 	    }
2732 	}
2733       else
2734 	{
2735 	  incr_vec[incr_vec_len].initializer = NULL_TREE;
2736 	  incr_vec[incr_vec_len++].init_bb = NULL;
2737 	}
2738     }
2739 }
2740 
2741 /* Recursive helper function for record_phi_increments.  */
2742 
2743 static void
2744 record_phi_increments_1 (slsr_cand_t basis, gimple *phi)
2745 {
2746   unsigned i;
2747   slsr_cand_t phi_cand = *stmt_cand_map->get (phi);
2748 
2749   if (phi_cand->visited)
2750     return;
2751   phi_cand->visited = 1;
2752 
2753   for (i = 0; i < gimple_phi_num_args (phi); i++)
2754     {
2755       tree arg = gimple_phi_arg_def (phi, i);
2756 
2757       if (!operand_equal_p (arg, phi_cand->base_expr, 0))
2758 	{
2759 	  gimple *arg_def = SSA_NAME_DEF_STMT (arg);
2760 
2761 	  if (gimple_code (arg_def) == GIMPLE_PHI)
2762 	    record_phi_increments_1 (basis, arg_def);
2763 	  else
2764 	    {
2765 	      slsr_cand_t arg_cand = base_cand_from_table (arg);
2766 	      widest_int diff = arg_cand->index - basis->index;
2767 	      record_increment (arg_cand, diff, PHI_ADJUST);
2768 	    }
2769 	}
2770     }
2771 }
2772 
2773 /* Given phi statement PHI that hides a candidate from its BASIS, find
2774    the increments along each incoming arc (recursively handling additional
2775    phis that may be present) and record them.  These increments are the
2776    difference in index between the index-adjusting statements and the
2777    index of the basis.  */
2778 
2779 static void
2780 record_phi_increments (slsr_cand_t basis, gimple *phi)
2781 {
2782   record_phi_increments_1 (basis, phi);
2783   clear_visited (as_a <gphi *> (phi));
2784 }
2785 
2786 /* Determine how many times each unique increment occurs in the set
2787    of candidates rooted at C's parent, recording the data in the
2788    increment vector.  For each unique increment I, if an initializer
2789    T_0 = stride * I is provided by a candidate that dominates all
2790    candidates with the same increment, also record T_0 for subsequent
2791    use.  */
2792 
2793 static void
2794 record_increments (slsr_cand_t c)
2795 {
2796   if (!cand_already_replaced (c))
2797     {
2798       if (!phi_dependent_cand_p (c))
2799 	record_increment (c, cand_increment (c), NOT_PHI_ADJUST);
2800       else
2801 	{
2802 	  /* A candidate with a basis hidden by a phi will have one
2803 	     increment for its relationship to the index represented by
2804 	     the phi, and potentially additional increments along each
2805 	     incoming edge.  For the root of the dependency tree (which
2806 	     has no basis), process just the initial index in case it has
2807 	     an initializer that can be used by subsequent candidates.  */
2808 	  record_increment (c, c->index, NOT_PHI_ADJUST);
2809 
2810 	  if (c->basis)
2811 	    record_phi_increments (lookup_cand (c->basis),
2812 				   lookup_cand (c->def_phi)->cand_stmt);
2813 	}
2814     }
2815 
2816   if (c->sibling)
2817     record_increments (lookup_cand (c->sibling));
2818 
2819   if (c->dependent)
2820     record_increments (lookup_cand (c->dependent));
2821 }
2822 
2823 /* Recursive helper function for phi_incr_cost.  */
2824 
2825 static int
2826 phi_incr_cost_1 (slsr_cand_t c, const widest_int &incr, gimple *phi,
2827 		 int *savings)
2828 {
2829   unsigned i;
2830   int cost = 0;
2831   slsr_cand_t basis = lookup_cand (c->basis);
2832   slsr_cand_t phi_cand = *stmt_cand_map->get (phi);
2833 
2834   if (phi_cand->visited)
2835     return 0;
2836   phi_cand->visited = 1;
2837 
2838   for (i = 0; i < gimple_phi_num_args (phi); i++)
2839     {
2840       tree arg = gimple_phi_arg_def (phi, i);
2841 
2842       if (!operand_equal_p (arg, phi_cand->base_expr, 0))
2843 	{
2844 	  gimple *arg_def = SSA_NAME_DEF_STMT (arg);
2845 
2846 	  if (gimple_code (arg_def) == GIMPLE_PHI)
2847 	    {
2848 	      int feeding_savings = 0;
2849 	      tree feeding_var = gimple_phi_result (arg_def);
2850 	      cost += phi_incr_cost_1 (c, incr, arg_def, &feeding_savings);
2851 	      if (uses_consumed_by_stmt (feeding_var, phi))
2852 		*savings += feeding_savings;
2853 	    }
2854 	  else
2855 	    {
2856 	      slsr_cand_t arg_cand = base_cand_from_table (arg);
2857 	      widest_int diff = arg_cand->index - basis->index;
2858 
2859 	      if (incr == diff)
2860 		{
2861 		  tree basis_lhs = gimple_assign_lhs (basis->cand_stmt);
2862 		  tree lhs = gimple_assign_lhs (arg_cand->cand_stmt);
2863 		  cost += add_cost (true, TYPE_MODE (TREE_TYPE (basis_lhs)));
2864 		  if (uses_consumed_by_stmt (lhs, phi))
2865 		    *savings += stmt_cost (arg_cand->cand_stmt, true);
2866 		}
2867 	    }
2868 	}
2869     }
2870 
2871   return cost;
2872 }
2873 
2874 /* Add up and return the costs of introducing add statements that
2875    require the increment INCR on behalf of candidate C and phi
2876    statement PHI.  Accumulate into *SAVINGS the potential savings
2877    from removing existing statements that feed PHI and have no other
2878    uses.  */
2879 
2880 static int
2881 phi_incr_cost (slsr_cand_t c, const widest_int &incr, gimple *phi,
2882 	       int *savings)
2883 {
2884   int retval = phi_incr_cost_1 (c, incr, phi, savings);
2885   clear_visited (as_a <gphi *> (phi));
2886   return retval;
2887 }
2888 
2889 /* Return the first candidate in the tree rooted at C that has not
2890    already been replaced, favoring siblings over dependents.  */
2891 
2892 static slsr_cand_t
2893 unreplaced_cand_in_tree (slsr_cand_t c)
2894 {
2895   if (!cand_already_replaced (c))
2896     return c;
2897 
2898   if (c->sibling)
2899     {
2900       slsr_cand_t sib = unreplaced_cand_in_tree (lookup_cand (c->sibling));
2901       if (sib)
2902 	return sib;
2903     }
2904 
2905   if (c->dependent)
2906     {
2907       slsr_cand_t dep = unreplaced_cand_in_tree (lookup_cand (c->dependent));
2908       if (dep)
2909 	return dep;
2910     }
2911 
2912   return NULL;
2913 }
2914 
2915 /* Return TRUE if the candidates in the tree rooted at C should be
2916    optimized for speed, else FALSE.  We estimate this based on the block
2917    containing the most dominant candidate in the tree that has not yet
2918    been replaced.  */
2919 
2920 static bool
2921 optimize_cands_for_speed_p (slsr_cand_t c)
2922 {
2923   slsr_cand_t c2 = unreplaced_cand_in_tree (c);
2924   gcc_assert (c2);
2925   return optimize_bb_for_speed_p (gimple_bb (c2->cand_stmt));
2926 }
2927 
2928 /* Add COST_IN to the lowest cost of any dependent path starting at
2929    candidate C or any of its siblings, counting only candidates along
2930    such paths with increment INCR.  Assume that replacing a candidate
2931    reduces cost by REPL_SAVINGS.  Also account for savings from any
2932    statements that would go dead.  If COUNT_PHIS is true, include
2933    costs of introducing feeding statements for conditional candidates.  */
2934 
2935 static int
2936 lowest_cost_path (int cost_in, int repl_savings, slsr_cand_t c,
2937 		  const widest_int &incr, bool count_phis)
2938 {
2939   int local_cost, sib_cost, savings = 0;
2940   widest_int cand_incr = cand_abs_increment (c);
2941 
2942   if (cand_already_replaced (c))
2943     local_cost = cost_in;
2944   else if (incr == cand_incr)
2945     local_cost = cost_in - repl_savings - c->dead_savings;
2946   else
2947     local_cost = cost_in - c->dead_savings;
2948 
2949   if (count_phis
2950       && phi_dependent_cand_p (c)
2951       && !cand_already_replaced (c))
2952     {
2953       gimple *phi = lookup_cand (c->def_phi)->cand_stmt;
2954       local_cost += phi_incr_cost (c, incr, phi, &savings);
2955 
2956       if (uses_consumed_by_stmt (gimple_phi_result (phi), c->cand_stmt))
2957 	local_cost -= savings;
2958     }
2959 
2960   if (c->dependent)
2961     local_cost = lowest_cost_path (local_cost, repl_savings,
2962 				   lookup_cand (c->dependent), incr,
2963 				   count_phis);
2964 
2965   if (c->sibling)
2966     {
2967       sib_cost = lowest_cost_path (cost_in, repl_savings,
2968 				   lookup_cand (c->sibling), incr,
2969 				   count_phis);
2970       local_cost = MIN (local_cost, sib_cost);
2971     }
2972 
2973   return local_cost;
2974 }
2975 
2976 /* Compute the total savings that would accrue from all replacements
2977    in the candidate tree rooted at C, counting only candidates with
2978    increment INCR.  Assume that replacing a candidate reduces cost
2979    by REPL_SAVINGS.  Also account for savings from statements that
2980    would go dead.  */
2981 
2982 static int
2983 total_savings (int repl_savings, slsr_cand_t c, const widest_int &incr,
2984 	       bool count_phis)
2985 {
2986   int savings = 0;
2987   widest_int cand_incr = cand_abs_increment (c);
2988 
2989   if (incr == cand_incr && !cand_already_replaced (c))
2990     savings += repl_savings + c->dead_savings;
2991 
2992   if (count_phis
2993       && phi_dependent_cand_p (c)
2994       && !cand_already_replaced (c))
2995     {
2996       int phi_savings = 0;
2997       gimple *phi = lookup_cand (c->def_phi)->cand_stmt;
2998       savings -= phi_incr_cost (c, incr, phi, &phi_savings);
2999 
3000       if (uses_consumed_by_stmt (gimple_phi_result (phi), c->cand_stmt))
3001 	savings += phi_savings;
3002     }
3003 
3004   if (c->dependent)
3005     savings += total_savings (repl_savings, lookup_cand (c->dependent), incr,
3006 			      count_phis);
3007 
3008   if (c->sibling)
3009     savings += total_savings (repl_savings, lookup_cand (c->sibling), incr,
3010 			      count_phis);
3011 
3012   return savings;
3013 }
3014 
3015 /* Use target-specific costs to determine and record which increments
3016    in the current candidate tree are profitable to replace, assuming
3017    MODE and SPEED.  FIRST_DEP is the first dependent of the root of
3018    the candidate tree.
3019 
3020    One slight limitation here is that we don't account for the possible
3021    introduction of casts in some cases.  See replace_one_candidate for
3022    the cases where these are introduced.  This should probably be cleaned
3023    up sometime.  */
3024 
3025 static void
3026 analyze_increments (slsr_cand_t first_dep, machine_mode mode, bool speed)
3027 {
3028   unsigned i;
3029 
3030   for (i = 0; i < incr_vec_len; i++)
3031     {
3032       HOST_WIDE_INT incr = incr_vec[i].incr.to_shwi ();
3033 
3034       /* If somehow this increment is bigger than a HWI, we won't
3035 	 be optimizing candidates that use it.  And if the increment
3036 	 has a count of zero, nothing will be done with it.  */
3037       if (!wi::fits_shwi_p (incr_vec[i].incr) || !incr_vec[i].count)
3038 	incr_vec[i].cost = COST_INFINITE;
3039 
3040       /* Increments of 0, 1, and -1 are always profitable to replace,
3041 	 because they always replace a multiply or add with an add or
3042 	 copy, and may cause one or more existing instructions to go
3043 	 dead.  Exception:  -1 can't be assumed to be profitable for
3044 	 pointer addition.  */
3045       else if (incr == 0
3046 	       || incr == 1
3047 	       || (incr == -1
3048 		   && !POINTER_TYPE_P (first_dep->cand_type)))
3049 	incr_vec[i].cost = COST_NEUTRAL;
3050 
3051       /* If we need to add an initializer, give up if a cast from the
3052 	 candidate's type to its stride's type can lose precision.
3053 	 Note that this already takes into account that the stride may
3054 	 have been cast to a wider type, in which case this test won't
3055 	 fire.  Example:
3056 
3057            short int _1;
3058 	   _2 = (int) _1;
3059 	   _3 = _2 * 10;
3060 	   _4 = x + _3;    ADD: x + (10 * (int)_1) : int
3061 	   _5 = _2 * 15;
3062 	   _6 = x + _5;    ADD: x + (15 * (int)_1) : int
3063 
3064 	 Although the stride was a short int initially, the stride
3065 	 used in the analysis has been widened to an int, and such
3066 	 widening will be done in the initializer as well.  */
3067       else if (!incr_vec[i].initializer
3068 	       && TREE_CODE (first_dep->stride) != INTEGER_CST
3069 	       && !legal_cast_p_1 (first_dep->stride_type,
3070 				   TREE_TYPE (gimple_assign_lhs
3071 					      (first_dep->cand_stmt))))
3072 	incr_vec[i].cost = COST_INFINITE;
3073 
3074       /* If we need to add an initializer, make sure we don't introduce
3075 	 a multiply by a pointer type, which can happen in certain cast
3076 	 scenarios.  */
3077       else if (!incr_vec[i].initializer
3078 	       && TREE_CODE (first_dep->stride) != INTEGER_CST
3079 	       && POINTER_TYPE_P (first_dep->stride_type))
3080 	incr_vec[i].cost = COST_INFINITE;
3081 
3082       /* For any other increment, if this is a multiply candidate, we
3083 	 must introduce a temporary T and initialize it with
3084 	 T_0 = stride * increment.  When optimizing for speed, walk the
3085 	 candidate tree to calculate the best cost reduction along any
3086 	 path; if it offsets the fixed cost of inserting the initializer,
3087 	 replacing the increment is profitable.  When optimizing for
3088          size, instead calculate the total cost reduction from replacing
3089 	 all candidates with this increment.  */
3090       else if (first_dep->kind == CAND_MULT)
3091 	{
3092 	  int cost = mult_by_coeff_cost (incr, mode, speed);
3093 	  int repl_savings;
3094 
3095 	  if (tree_fits_shwi_p (first_dep->stride))
3096 	    {
3097 	      HOST_WIDE_INT hwi_stride = tree_to_shwi (first_dep->stride);
3098 	      repl_savings = mult_by_coeff_cost (hwi_stride, mode, speed);
3099 	    }
3100 	  else
3101 	    repl_savings = mul_cost (speed, mode);
3102 	  repl_savings -= add_cost (speed, mode);
3103 
3104 	  if (speed)
3105 	    cost = lowest_cost_path (cost, repl_savings, first_dep,
3106 				     incr_vec[i].incr, COUNT_PHIS);
3107 	  else
3108 	    cost -= total_savings (repl_savings, first_dep, incr_vec[i].incr,
3109 				   COUNT_PHIS);
3110 
3111 	  incr_vec[i].cost = cost;
3112 	}
3113 
3114       /* If this is an add candidate, the initializer may already
3115 	 exist, so only calculate the cost of the initializer if it
3116 	 doesn't.  We are replacing one add with another here, so the
3117 	 known replacement savings is zero.  We will account for removal
3118 	 of dead instructions in lowest_cost_path or total_savings.  */
3119       else
3120 	{
3121 	  int cost = 0;
3122 	  if (!incr_vec[i].initializer)
3123 	    cost = mult_by_coeff_cost (incr, mode, speed);
3124 
3125 	  if (speed)
3126 	    cost = lowest_cost_path (cost, 0, first_dep, incr_vec[i].incr,
3127 				     DONT_COUNT_PHIS);
3128 	  else
3129 	    cost -= total_savings (0, first_dep, incr_vec[i].incr,
3130 				   DONT_COUNT_PHIS);
3131 
3132 	  incr_vec[i].cost = cost;
3133 	}
3134     }
3135 }
3136 
3137 /* Return the nearest common dominator of BB1 and BB2.  If the blocks
3138    are identical, return the earlier of C1 and C2 in *WHERE.  Otherwise,
3139    if the NCD matches BB1, return C1 in *WHERE; if the NCD matches BB2,
3140    return C2 in *WHERE; and if the NCD matches neither, return NULL in
3141    *WHERE.  Note: It is possible for one of C1 and C2 to be NULL.  */
3142 
3143 static basic_block
3144 ncd_for_two_cands (basic_block bb1, basic_block bb2,
3145 		   slsr_cand_t c1, slsr_cand_t c2, slsr_cand_t *where)
3146 {
3147   basic_block ncd;
3148 
3149   if (!bb1)
3150     {
3151       *where = c2;
3152       return bb2;
3153     }
3154 
3155   if (!bb2)
3156     {
3157       *where = c1;
3158       return bb1;
3159     }
3160 
3161   ncd = nearest_common_dominator (CDI_DOMINATORS, bb1, bb2);
3162 
3163   /* If both candidates are in the same block, the earlier
3164      candidate wins.  */
3165   if (bb1 == ncd && bb2 == ncd)
3166     {
3167       if (!c1 || (c2 && c2->cand_num < c1->cand_num))
3168 	*where = c2;
3169       else
3170 	*where = c1;
3171     }
3172 
3173   /* Otherwise, if one of them produced a candidate in the
3174      dominator, that one wins.  */
3175   else if (bb1 == ncd)
3176     *where = c1;
3177 
3178   else if (bb2 == ncd)
3179     *where = c2;
3180 
3181   /* If neither matches the dominator, neither wins.  */
3182   else
3183     *where = NULL;
3184 
3185   return ncd;
3186 }
3187 
3188 /* Consider all candidates that feed PHI.  Find the nearest common
3189    dominator of those candidates requiring the given increment INCR.
3190    Further find and return the nearest common dominator of this result
3191    with block NCD.  If the returned block contains one or more of the
3192    candidates, return the earliest candidate in the block in *WHERE.  */
3193 
3194 static basic_block
3195 ncd_with_phi (slsr_cand_t c, const widest_int &incr, gphi *phi,
3196 	      basic_block ncd, slsr_cand_t *where)
3197 {
3198   unsigned i;
3199   slsr_cand_t basis = lookup_cand (c->basis);
3200   slsr_cand_t phi_cand = *stmt_cand_map->get (phi);
3201 
3202   for (i = 0; i < gimple_phi_num_args (phi); i++)
3203     {
3204       tree arg = gimple_phi_arg_def (phi, i);
3205 
3206       if (!operand_equal_p (arg, phi_cand->base_expr, 0))
3207 	{
3208 	  gimple *arg_def = SSA_NAME_DEF_STMT (arg);
3209 
3210 	  if (gimple_code (arg_def) == GIMPLE_PHI)
3211 	    ncd = ncd_with_phi (c, incr, as_a <gphi *> (arg_def), ncd,
3212 				where);
3213 	  else
3214 	    {
3215 	      slsr_cand_t arg_cand = base_cand_from_table (arg);
3216 	      widest_int diff = arg_cand->index - basis->index;
3217 	      basic_block pred = gimple_phi_arg_edge (phi, i)->src;
3218 
3219 	      if ((incr == diff) || (!address_arithmetic_p && incr == -diff))
3220 		ncd = ncd_for_two_cands (ncd, pred, *where, NULL, where);
3221 	    }
3222 	}
3223     }
3224 
3225   return ncd;
3226 }
3227 
3228 /* Consider the candidate C together with any candidates that feed
3229    C's phi dependence (if any).  Find and return the nearest common
3230    dominator of those candidates requiring the given increment INCR.
3231    If the returned block contains one or more of the candidates,
3232    return the earliest candidate in the block in *WHERE.  */
3233 
3234 static basic_block
3235 ncd_of_cand_and_phis (slsr_cand_t c, const widest_int &incr, slsr_cand_t *where)
3236 {
3237   basic_block ncd = NULL;
3238 
3239   if (cand_abs_increment (c) == incr)
3240     {
3241       ncd = gimple_bb (c->cand_stmt);
3242       *where = c;
3243     }
3244 
3245   if (phi_dependent_cand_p (c))
3246     ncd = ncd_with_phi (c, incr,
3247 			as_a <gphi *> (lookup_cand (c->def_phi)->cand_stmt),
3248 			ncd, where);
3249 
3250   return ncd;
3251 }
3252 
3253 /* Consider all candidates in the tree rooted at C for which INCR
3254    represents the required increment of C relative to its basis.
3255    Find and return the basic block that most nearly dominates all
3256    such candidates.  If the returned block contains one or more of
3257    the candidates, return the earliest candidate in the block in
3258    *WHERE.  */
3259 
3260 static basic_block
3261 nearest_common_dominator_for_cands (slsr_cand_t c, const widest_int &incr,
3262 				    slsr_cand_t *where)
3263 {
3264   basic_block sib_ncd = NULL, dep_ncd = NULL, this_ncd = NULL, ncd;
3265   slsr_cand_t sib_where = NULL, dep_where = NULL, this_where = NULL, new_where;
3266 
3267   /* First find the NCD of all siblings and dependents.  */
3268   if (c->sibling)
3269     sib_ncd = nearest_common_dominator_for_cands (lookup_cand (c->sibling),
3270 						  incr, &sib_where);
3271   if (c->dependent)
3272     dep_ncd = nearest_common_dominator_for_cands (lookup_cand (c->dependent),
3273 						  incr, &dep_where);
3274   if (!sib_ncd && !dep_ncd)
3275     {
3276       new_where = NULL;
3277       ncd = NULL;
3278     }
3279   else if (sib_ncd && !dep_ncd)
3280     {
3281       new_where = sib_where;
3282       ncd = sib_ncd;
3283     }
3284   else if (dep_ncd && !sib_ncd)
3285     {
3286       new_where = dep_where;
3287       ncd = dep_ncd;
3288     }
3289   else
3290     ncd = ncd_for_two_cands (sib_ncd, dep_ncd, sib_where,
3291 			     dep_where, &new_where);
3292 
3293   /* If the candidate's increment doesn't match the one we're interested
3294      in (and nor do any increments for feeding defs of a phi-dependence),
3295      then the result depends only on siblings and dependents.  */
3296   this_ncd = ncd_of_cand_and_phis (c, incr, &this_where);
3297 
3298   if (!this_ncd || cand_already_replaced (c))
3299     {
3300       *where = new_where;
3301       return ncd;
3302     }
3303 
3304   /* Otherwise, compare this candidate with the result from all siblings
3305      and dependents.  */
3306   ncd = ncd_for_two_cands (ncd, this_ncd, new_where, this_where, where);
3307 
3308   return ncd;
3309 }
3310 
3311 /* Return TRUE if the increment indexed by INDEX is profitable to replace.  */
3312 
3313 static inline bool
3314 profitable_increment_p (unsigned index)
3315 {
3316   return (incr_vec[index].cost <= COST_NEUTRAL);
3317 }
3318 
3319 /* For each profitable increment in the increment vector not equal to
3320    0 or 1 (or -1, for non-pointer arithmetic), find the nearest common
3321    dominator of all statements in the candidate chain rooted at C
3322    that require that increment, and insert an initializer
3323    T_0 = stride * increment at that location.  Record T_0 with the
3324    increment record.  */
3325 
3326 static void
3327 insert_initializers (slsr_cand_t c)
3328 {
3329   unsigned i;
3330 
3331   for (i = 0; i < incr_vec_len; i++)
3332     {
3333       basic_block bb;
3334       slsr_cand_t where = NULL;
3335       gassign *init_stmt;
3336       gassign *cast_stmt = NULL;
3337       tree new_name, incr_tree, init_stride;
3338       widest_int incr = incr_vec[i].incr;
3339 
3340       if (!profitable_increment_p (i)
3341 	  || incr == 1
3342 	  || (incr == -1
3343 	      && (!POINTER_TYPE_P (lookup_cand (c->basis)->cand_type)))
3344 	  || incr == 0)
3345 	continue;
3346 
3347       /* We may have already identified an existing initializer that
3348 	 will suffice.  */
3349       if (incr_vec[i].initializer)
3350 	{
3351 	  if (dump_file && (dump_flags & TDF_DETAILS))
3352 	    {
3353 	      fputs ("Using existing initializer: ", dump_file);
3354 	      print_gimple_stmt (dump_file,
3355 				 SSA_NAME_DEF_STMT (incr_vec[i].initializer),
3356 				 0, 0);
3357 	    }
3358 	  continue;
3359 	}
3360 
3361       /* Find the block that most closely dominates all candidates
3362 	 with this increment.  If there is at least one candidate in
3363 	 that block, the earliest one will be returned in WHERE.  */
3364       bb = nearest_common_dominator_for_cands (c, incr, &where);
3365 
3366       /* If the NCD is not dominated by the block containing the
3367 	 definition of the stride, we can't legally insert a
3368 	 single initializer.  Mark the increment as unprofitable
3369 	 so we don't make any replacements.  FIXME: Multiple
3370 	 initializers could be placed with more analysis.  */
3371       gimple *stride_def = SSA_NAME_DEF_STMT (c->stride);
3372       basic_block stride_bb = gimple_bb (stride_def);
3373 
3374       if (stride_bb && !dominated_by_p (CDI_DOMINATORS, bb, stride_bb))
3375 	{
3376 	  if (dump_file && (dump_flags & TDF_DETAILS))
3377 	    fprintf (dump_file,
3378 		     "Initializer #%d cannot be legally placed\n", i);
3379 	  incr_vec[i].cost = COST_INFINITE;
3380 	  continue;
3381 	}
3382 
3383       /* If the nominal stride has a different type than the recorded
3384 	 stride type, build a cast from the nominal stride to that type.  */
3385       if (!types_compatible_p (TREE_TYPE (c->stride), c->stride_type))
3386 	{
3387 	  init_stride = make_temp_ssa_name (c->stride_type, NULL, "slsr");
3388 	  cast_stmt = gimple_build_assign (init_stride, NOP_EXPR, c->stride);
3389 	}
3390       else
3391 	init_stride = c->stride;
3392 
3393       /* Create a new SSA name to hold the initializer's value.  */
3394       new_name = make_temp_ssa_name (c->stride_type, NULL, "slsr");
3395       incr_vec[i].initializer = new_name;
3396 
3397       /* Create the initializer and insert it in the latest possible
3398 	 dominating position.  */
3399       incr_tree = wide_int_to_tree (c->stride_type, incr);
3400       init_stmt = gimple_build_assign (new_name, MULT_EXPR,
3401 				       init_stride, incr_tree);
3402       if (where)
3403 	{
3404 	  gimple_stmt_iterator gsi = gsi_for_stmt (where->cand_stmt);
3405 	  location_t loc = gimple_location (where->cand_stmt);
3406 
3407 	  if (cast_stmt)
3408 	    {
3409 	      gsi_insert_before (&gsi, cast_stmt, GSI_SAME_STMT);
3410 	      gimple_set_location (cast_stmt, loc);
3411 	    }
3412 
3413 	  gsi_insert_before (&gsi, init_stmt, GSI_SAME_STMT);
3414 	  gimple_set_location (init_stmt, loc);
3415 	}
3416       else
3417 	{
3418 	  gimple_stmt_iterator gsi = gsi_last_bb (bb);
3419 	  gimple *basis_stmt = lookup_cand (c->basis)->cand_stmt;
3420 	  location_t loc = gimple_location (basis_stmt);
3421 
3422 	  if (!gsi_end_p (gsi) && stmt_ends_bb_p (gsi_stmt (gsi)))
3423 	    {
3424 	      if (cast_stmt)
3425 		{
3426 		  gsi_insert_before (&gsi, cast_stmt, GSI_SAME_STMT);
3427 		  gimple_set_location (cast_stmt, loc);
3428 		}
3429 	      gsi_insert_before (&gsi, init_stmt, GSI_SAME_STMT);
3430 	    }
3431 	  else
3432 	    {
3433 	      if (cast_stmt)
3434 		{
3435 		  gsi_insert_after (&gsi, cast_stmt, GSI_NEW_STMT);
3436 		  gimple_set_location (cast_stmt, loc);
3437 		}
3438 	      gsi_insert_after (&gsi, init_stmt, GSI_NEW_STMT);
3439 	    }
3440 
3441 	  gimple_set_location (init_stmt, gimple_location (basis_stmt));
3442 	}
3443 
3444       if (dump_file && (dump_flags & TDF_DETAILS))
3445 	{
3446 	  if (cast_stmt)
3447 	    {
3448 	      fputs ("Inserting stride cast: ", dump_file);
3449 	      print_gimple_stmt (dump_file, cast_stmt, 0);
3450 	    }
3451 	  fputs ("Inserting initializer: ", dump_file);
3452 	  print_gimple_stmt (dump_file, init_stmt, 0);
3453 	}
3454     }
3455 }
3456 
3457 /* Recursive helper function for all_phi_incrs_profitable.  */
3458 
3459 static bool
3460 all_phi_incrs_profitable_1 (slsr_cand_t c, gphi *phi, int *spread)
3461 {
3462   unsigned i;
3463   slsr_cand_t basis = lookup_cand (c->basis);
3464   slsr_cand_t phi_cand = *stmt_cand_map->get (phi);
3465 
3466   if (phi_cand->visited)
3467     return true;
3468 
3469   phi_cand->visited = 1;
3470   (*spread)++;
3471 
3472   /* If the basis doesn't dominate the PHI (including when the PHI is
3473      in the same block as the basis), we won't be able to create a PHI
3474      using the basis here.  */
3475   basic_block basis_bb = gimple_bb (basis->cand_stmt);
3476   basic_block phi_bb = gimple_bb (phi);
3477 
3478   if (phi_bb == basis_bb
3479       || !dominated_by_p (CDI_DOMINATORS, phi_bb, basis_bb))
3480     return false;
3481 
3482   for (i = 0; i < gimple_phi_num_args (phi); i++)
3483     {
3484       /* If the PHI arg resides in a block not dominated by the basis,
3485 	 we won't be able to create a PHI using the basis here.  */
3486       basic_block pred_bb = gimple_phi_arg_edge (phi, i)->src;
3487 
3488       if (!dominated_by_p (CDI_DOMINATORS, pred_bb, basis_bb))
3489 	return false;
3490 
3491       tree arg = gimple_phi_arg_def (phi, i);
3492 
3493       if (!operand_equal_p (arg, phi_cand->base_expr, 0))
3494 	{
3495 	  gimple *arg_def = SSA_NAME_DEF_STMT (arg);
3496 
3497 	  if (gimple_code (arg_def) == GIMPLE_PHI)
3498 	    {
3499 	      if (!all_phi_incrs_profitable_1 (c, as_a <gphi *> (arg_def),
3500 					       spread)
3501 		  || *spread > MAX_SPREAD)
3502 		return false;
3503 	    }
3504 	  else
3505 	    {
3506 	      int j;
3507 	      slsr_cand_t arg_cand = base_cand_from_table (arg);
3508 	      widest_int increment = arg_cand->index - basis->index;
3509 
3510 	      if (!address_arithmetic_p && wi::neg_p (increment))
3511 		increment = -increment;
3512 
3513 	      j = incr_vec_index (increment);
3514 
3515 	      if (dump_file && (dump_flags & TDF_DETAILS))
3516 		{
3517 		  fprintf (dump_file, "  Conditional candidate %d, phi: ",
3518 			   c->cand_num);
3519 		  print_gimple_stmt (dump_file, phi, 0);
3520 		  fputs ("    increment: ", dump_file);
3521 		  print_decs (increment, dump_file);
3522 		  if (j < 0)
3523 		    fprintf (dump_file,
3524 			     "\n  Not replaced; incr_vec overflow.\n");
3525 		  else {
3526 		    fprintf (dump_file, "\n    cost: %d\n", incr_vec[j].cost);
3527 		    if (profitable_increment_p (j))
3528 		      fputs ("  Replacing...\n", dump_file);
3529 		    else
3530 		      fputs ("  Not replaced.\n", dump_file);
3531 		  }
3532 		}
3533 
3534 	      if (j < 0 || !profitable_increment_p (j))
3535 		return false;
3536 	    }
3537 	}
3538     }
3539 
3540   return true;
3541 }
3542 
3543 /* Return TRUE iff all required increments for candidates feeding PHI
3544    are profitable (and legal!) to replace on behalf of candidate C.  */
3545 
3546 static bool
3547 all_phi_incrs_profitable (slsr_cand_t c, gphi *phi)
3548 {
3549   int spread = 0;
3550   bool retval = all_phi_incrs_profitable_1 (c, phi, &spread);
3551   clear_visited (phi);
3552   return retval;
3553 }
3554 
3555 /* Create a NOP_EXPR that copies FROM_EXPR into a new SSA name of
3556    type TO_TYPE, and insert it in front of the statement represented
3557    by candidate C.  Use *NEW_VAR to create the new SSA name.  Return
3558    the new SSA name.  */
3559 
3560 static tree
3561 introduce_cast_before_cand (slsr_cand_t c, tree to_type, tree from_expr)
3562 {
3563   tree cast_lhs;
3564   gassign *cast_stmt;
3565   gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
3566 
3567   cast_lhs = make_temp_ssa_name (to_type, NULL, "slsr");
3568   cast_stmt = gimple_build_assign (cast_lhs, NOP_EXPR, from_expr);
3569   gimple_set_location (cast_stmt, gimple_location (c->cand_stmt));
3570   gsi_insert_before (&gsi, cast_stmt, GSI_SAME_STMT);
3571 
3572   if (dump_file && (dump_flags & TDF_DETAILS))
3573     {
3574       fputs ("  Inserting: ", dump_file);
3575       print_gimple_stmt (dump_file, cast_stmt, 0);
3576     }
3577 
3578   return cast_lhs;
3579 }
3580 
3581 /* Replace the RHS of the statement represented by candidate C with
3582    NEW_CODE, NEW_RHS1, and NEW_RHS2, provided that to do so doesn't
3583    leave C unchanged or just interchange its operands.  The original
3584    operation and operands are in OLD_CODE, OLD_RHS1, and OLD_RHS2.
3585    If the replacement was made and we are doing a details dump,
3586    return the revised statement, else NULL.  */
3587 
3588 static gimple *
3589 replace_rhs_if_not_dup (enum tree_code new_code, tree new_rhs1, tree new_rhs2,
3590 			enum tree_code old_code, tree old_rhs1, tree old_rhs2,
3591 			slsr_cand_t c)
3592 {
3593   if (new_code != old_code
3594       || ((!operand_equal_p (new_rhs1, old_rhs1, 0)
3595 	   || !operand_equal_p (new_rhs2, old_rhs2, 0))
3596 	  && (!operand_equal_p (new_rhs1, old_rhs2, 0)
3597 	      || !operand_equal_p (new_rhs2, old_rhs1, 0))))
3598     {
3599       gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
3600       slsr_cand_t cc = c;
3601       gimple_assign_set_rhs_with_ops (&gsi, new_code, new_rhs1, new_rhs2);
3602       update_stmt (gsi_stmt (gsi));
3603       c->cand_stmt = gsi_stmt (gsi);
3604       while (cc->next_interp)
3605 	{
3606 	  cc = lookup_cand (cc->next_interp);
3607 	  cc->cand_stmt = gsi_stmt (gsi);
3608 	}
3609 
3610       if (dump_file && (dump_flags & TDF_DETAILS))
3611 	return gsi_stmt (gsi);
3612     }
3613 
3614   else if (dump_file && (dump_flags & TDF_DETAILS))
3615     fputs ("  (duplicate, not actually replacing)\n", dump_file);
3616 
3617   return NULL;
3618 }
3619 
3620 /* Strength-reduce the statement represented by candidate C by replacing
3621    it with an equivalent addition or subtraction.  I is the index into
3622    the increment vector identifying C's increment.  NEW_VAR is used to
3623    create a new SSA name if a cast needs to be introduced.  BASIS_NAME
3624    is the rhs1 to use in creating the add/subtract.  */
3625 
3626 static void
3627 replace_one_candidate (slsr_cand_t c, unsigned i, tree basis_name)
3628 {
3629   gimple *stmt_to_print = NULL;
3630   tree orig_rhs1, orig_rhs2;
3631   tree rhs2;
3632   enum tree_code orig_code, repl_code;
3633   widest_int cand_incr;
3634 
3635   orig_code = gimple_assign_rhs_code (c->cand_stmt);
3636   orig_rhs1 = gimple_assign_rhs1 (c->cand_stmt);
3637   orig_rhs2 = gimple_assign_rhs2 (c->cand_stmt);
3638   cand_incr = cand_increment (c);
3639 
3640   if (dump_file && (dump_flags & TDF_DETAILS))
3641     {
3642       fputs ("Replacing: ", dump_file);
3643       print_gimple_stmt (dump_file, c->cand_stmt, 0);
3644       stmt_to_print = c->cand_stmt;
3645     }
3646 
3647   if (address_arithmetic_p)
3648     repl_code = POINTER_PLUS_EXPR;
3649   else
3650     repl_code = PLUS_EXPR;
3651 
3652   /* If the increment has an initializer T_0, replace the candidate
3653      statement with an add of the basis name and the initializer.  */
3654   if (incr_vec[i].initializer)
3655     {
3656       tree init_type = TREE_TYPE (incr_vec[i].initializer);
3657       tree orig_type = TREE_TYPE (orig_rhs2);
3658 
3659       if (types_compatible_p (orig_type, init_type))
3660 	rhs2 = incr_vec[i].initializer;
3661       else
3662 	rhs2 = introduce_cast_before_cand (c, orig_type,
3663 					   incr_vec[i].initializer);
3664 
3665       if (incr_vec[i].incr != cand_incr)
3666 	{
3667 	  gcc_assert (repl_code == PLUS_EXPR);
3668 	  repl_code = MINUS_EXPR;
3669 	}
3670 
3671       stmt_to_print = replace_rhs_if_not_dup (repl_code, basis_name, rhs2,
3672 					      orig_code, orig_rhs1, orig_rhs2,
3673 					      c);
3674     }
3675 
3676   /* Otherwise, the increment is one of -1, 0, and 1.  Replace
3677      with a subtract of the stride from the basis name, a copy
3678      from the basis name, or an add of the stride to the basis
3679      name, respectively.  It may be necessary to introduce a
3680      cast (or reuse an existing cast).  */
3681   else if (cand_incr == 1)
3682     {
3683       tree stride_type = TREE_TYPE (c->stride);
3684       tree orig_type = TREE_TYPE (orig_rhs2);
3685 
3686       if (types_compatible_p (orig_type, stride_type))
3687 	rhs2 = c->stride;
3688       else
3689 	rhs2 = introduce_cast_before_cand (c, orig_type, c->stride);
3690 
3691       stmt_to_print = replace_rhs_if_not_dup (repl_code, basis_name, rhs2,
3692 					      orig_code, orig_rhs1, orig_rhs2,
3693 					      c);
3694     }
3695 
3696   else if (cand_incr == -1)
3697     {
3698       tree stride_type = TREE_TYPE (c->stride);
3699       tree orig_type = TREE_TYPE (orig_rhs2);
3700       gcc_assert (repl_code != POINTER_PLUS_EXPR);
3701 
3702       if (types_compatible_p (orig_type, stride_type))
3703 	rhs2 = c->stride;
3704       else
3705 	rhs2 = introduce_cast_before_cand (c, orig_type, c->stride);
3706 
3707       if (orig_code != MINUS_EXPR
3708 	  || !operand_equal_p (basis_name, orig_rhs1, 0)
3709 	  || !operand_equal_p (rhs2, orig_rhs2, 0))
3710 	{
3711 	  gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
3712 	  slsr_cand_t cc = c;
3713 	  gimple_assign_set_rhs_with_ops (&gsi, MINUS_EXPR, basis_name, rhs2);
3714 	  update_stmt (gsi_stmt (gsi));
3715           c->cand_stmt = gsi_stmt (gsi);
3716 	  while (cc->next_interp)
3717 	    {
3718 	      cc = lookup_cand (cc->next_interp);
3719 	      cc->cand_stmt = gsi_stmt (gsi);
3720 	    }
3721 
3722 	  if (dump_file && (dump_flags & TDF_DETAILS))
3723 	    stmt_to_print = gsi_stmt (gsi);
3724 	}
3725       else if (dump_file && (dump_flags & TDF_DETAILS))
3726 	fputs ("  (duplicate, not actually replacing)\n", dump_file);
3727     }
3728 
3729   else if (cand_incr == 0)
3730     {
3731       tree lhs = gimple_assign_lhs (c->cand_stmt);
3732       tree lhs_type = TREE_TYPE (lhs);
3733       tree basis_type = TREE_TYPE (basis_name);
3734 
3735       if (types_compatible_p (lhs_type, basis_type))
3736 	{
3737 	  gassign *copy_stmt = gimple_build_assign (lhs, basis_name);
3738 	  gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
3739 	  slsr_cand_t cc = c;
3740 	  gimple_set_location (copy_stmt, gimple_location (c->cand_stmt));
3741 	  gsi_replace (&gsi, copy_stmt, false);
3742 	  c->cand_stmt = copy_stmt;
3743 	  while (cc->next_interp)
3744 	    {
3745 	      cc = lookup_cand (cc->next_interp);
3746 	      cc->cand_stmt = copy_stmt;
3747 	    }
3748 
3749 	  if (dump_file && (dump_flags & TDF_DETAILS))
3750 	    stmt_to_print = copy_stmt;
3751 	}
3752       else
3753 	{
3754 	  gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
3755 	  gassign *cast_stmt = gimple_build_assign (lhs, NOP_EXPR, basis_name);
3756 	  slsr_cand_t cc = c;
3757 	  gimple_set_location (cast_stmt, gimple_location (c->cand_stmt));
3758 	  gsi_replace (&gsi, cast_stmt, false);
3759 	  c->cand_stmt = cast_stmt;
3760 	  while (cc->next_interp)
3761 	    {
3762 	      cc = lookup_cand (cc->next_interp);
3763 	      cc->cand_stmt = cast_stmt;
3764 	    }
3765 
3766 	  if (dump_file && (dump_flags & TDF_DETAILS))
3767 	    stmt_to_print = cast_stmt;
3768 	}
3769     }
3770   else
3771     gcc_unreachable ();
3772 
3773   if (dump_file && (dump_flags & TDF_DETAILS) && stmt_to_print)
3774     {
3775       fputs ("With: ", dump_file);
3776       print_gimple_stmt (dump_file, stmt_to_print, 0);
3777       fputs ("\n", dump_file);
3778     }
3779 }
3780 
3781 /* For each candidate in the tree rooted at C, replace it with
3782    an increment if such has been shown to be profitable.  */
3783 
3784 static void
3785 replace_profitable_candidates (slsr_cand_t c)
3786 {
3787   if (!cand_already_replaced (c))
3788     {
3789       widest_int increment = cand_abs_increment (c);
3790       enum tree_code orig_code = gimple_assign_rhs_code (c->cand_stmt);
3791       int i;
3792 
3793       i = incr_vec_index (increment);
3794 
3795       /* Only process profitable increments.  Nothing useful can be done
3796 	 to a cast or copy.  */
3797       if (i >= 0
3798 	  && profitable_increment_p (i)
3799 	  && orig_code != SSA_NAME
3800 	  && !CONVERT_EXPR_CODE_P (orig_code))
3801 	{
3802 	  if (phi_dependent_cand_p (c))
3803 	    {
3804 	      gphi *phi = as_a <gphi *> (lookup_cand (c->def_phi)->cand_stmt);
3805 
3806 	      if (all_phi_incrs_profitable (c, phi))
3807 		{
3808 		  /* Look up the LHS SSA name from C's basis.  This will be
3809 		     the RHS1 of the adds we will introduce to create new
3810 		     phi arguments.  */
3811 		  slsr_cand_t basis = lookup_cand (c->basis);
3812 		  tree basis_name = gimple_assign_lhs (basis->cand_stmt);
3813 
3814 		  /* Create a new phi statement that will represent C's true
3815 		     basis after the transformation is complete.  */
3816 		  location_t loc = gimple_location (c->cand_stmt);
3817 		  tree name = create_phi_basis (c, phi, basis_name,
3818 						loc, UNKNOWN_STRIDE);
3819 
3820 		  /* Replace C with an add of the new basis phi and the
3821 		     increment.  */
3822 		  replace_one_candidate (c, i, name);
3823 		}
3824 	    }
3825 	  else
3826 	    {
3827 	      slsr_cand_t basis = lookup_cand (c->basis);
3828 	      tree basis_name = gimple_assign_lhs (basis->cand_stmt);
3829 	      replace_one_candidate (c, i, basis_name);
3830 	    }
3831 	}
3832     }
3833 
3834   if (c->sibling)
3835     replace_profitable_candidates (lookup_cand (c->sibling));
3836 
3837   if (c->dependent)
3838     replace_profitable_candidates (lookup_cand (c->dependent));
3839 }
3840 
3841 /* Analyze costs of related candidates in the candidate vector,
3842    and make beneficial replacements.  */
3843 
3844 static void
3845 analyze_candidates_and_replace (void)
3846 {
3847   unsigned i;
3848   slsr_cand_t c;
3849 
3850   /* Each candidate that has a null basis and a non-null
3851      dependent is the root of a tree of related statements.
3852      Analyze each tree to determine a subset of those
3853      statements that can be replaced with maximum benefit.  */
3854   FOR_EACH_VEC_ELT (cand_vec, i, c)
3855     {
3856       slsr_cand_t first_dep;
3857 
3858       if (c->basis != 0 || c->dependent == 0)
3859 	continue;
3860 
3861       if (dump_file && (dump_flags & TDF_DETAILS))
3862 	fprintf (dump_file, "\nProcessing dependency tree rooted at %d.\n",
3863 		 c->cand_num);
3864 
3865       first_dep = lookup_cand (c->dependent);
3866 
3867       /* If this is a chain of CAND_REFs, unconditionally replace
3868 	 each of them with a strength-reduced data reference.  */
3869       if (c->kind == CAND_REF)
3870 	replace_refs (c);
3871 
3872       /* If the common stride of all related candidates is a known
3873 	 constant, each candidate without a phi-dependence can be
3874 	 profitably replaced.  Each replaces a multiply by a single
3875 	 add, with the possibility that a feeding add also goes dead.
3876 	 A candidate with a phi-dependence is replaced only if the
3877 	 compensation code it requires is offset by the strength
3878 	 reduction savings.  */
3879       else if (TREE_CODE (c->stride) == INTEGER_CST)
3880 	replace_uncond_cands_and_profitable_phis (first_dep);
3881 
3882       /* When the stride is an SSA name, it may still be profitable
3883 	 to replace some or all of the dependent candidates, depending
3884 	 on whether the introduced increments can be reused, or are
3885 	 less expensive to calculate than the replaced statements.  */
3886       else
3887 	{
3888 	  machine_mode mode;
3889 	  bool speed;
3890 
3891 	  /* Determine whether we'll be generating pointer arithmetic
3892 	     when replacing candidates.  */
3893 	  address_arithmetic_p = (c->kind == CAND_ADD
3894 				  && POINTER_TYPE_P (c->cand_type));
3895 
3896 	  /* If all candidates have already been replaced under other
3897 	     interpretations, nothing remains to be done.  */
3898 	  if (!count_candidates (c))
3899 	    continue;
3900 
3901 	  /* Construct an array of increments for this candidate chain.  */
3902 	  incr_vec = XNEWVEC (incr_info, MAX_INCR_VEC_LEN);
3903 	  incr_vec_len = 0;
3904 	  record_increments (c);
3905 
3906 	  /* Determine which increments are profitable to replace.  */
3907 	  mode = TYPE_MODE (TREE_TYPE (gimple_assign_lhs (c->cand_stmt)));
3908 	  speed = optimize_cands_for_speed_p (c);
3909 	  analyze_increments (first_dep, mode, speed);
3910 
3911 	  /* Insert initializers of the form T_0 = stride * increment
3912 	     for use in profitable replacements.  */
3913 	  insert_initializers (first_dep);
3914 	  dump_incr_vec ();
3915 
3916 	  /* Perform the replacements.  */
3917 	  replace_profitable_candidates (first_dep);
3918 	  free (incr_vec);
3919 	}
3920     }
3921 
3922   /* For conditional candidates, we may have uncommitted insertions
3923      on edges to clean up.  */
3924   gsi_commit_edge_inserts ();
3925 }
3926 
3927 namespace {
3928 
3929 const pass_data pass_data_strength_reduction =
3930 {
3931   GIMPLE_PASS, /* type */
3932   "slsr", /* name */
3933   OPTGROUP_NONE, /* optinfo_flags */
3934   TV_GIMPLE_SLSR, /* tv_id */
3935   ( PROP_cfg | PROP_ssa ), /* properties_required */
3936   0, /* properties_provided */
3937   0, /* properties_destroyed */
3938   0, /* todo_flags_start */
3939   0, /* todo_flags_finish */
3940 };
3941 
3942 class pass_strength_reduction : public gimple_opt_pass
3943 {
3944 public:
3945   pass_strength_reduction (gcc::context *ctxt)
3946     : gimple_opt_pass (pass_data_strength_reduction, ctxt)
3947   {}
3948 
3949   /* opt_pass methods: */
3950   virtual bool gate (function *) { return flag_tree_slsr; }
3951   virtual unsigned int execute (function *);
3952 
3953 }; // class pass_strength_reduction
3954 
3955 unsigned
3956 pass_strength_reduction::execute (function *fun)
3957 {
3958   /* Create the obstack where candidates will reside.  */
3959   gcc_obstack_init (&cand_obstack);
3960 
3961   /* Allocate the candidate vector.  */
3962   cand_vec.create (128);
3963 
3964   /* Allocate the mapping from statements to candidate indices.  */
3965   stmt_cand_map = new hash_map<gimple *, slsr_cand_t>;
3966 
3967   /* Create the obstack where candidate chains will reside.  */
3968   gcc_obstack_init (&chain_obstack);
3969 
3970   /* Allocate the mapping from base expressions to candidate chains.  */
3971   base_cand_map = new hash_table<cand_chain_hasher> (500);
3972 
3973   /* Allocate the mapping from bases to alternative bases.  */
3974   alt_base_map = new hash_map<tree, tree>;
3975 
3976   /* Initialize the loop optimizer.  We need to detect flow across
3977      back edges, and this gives us dominator information as well.  */
3978   loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
3979 
3980   /* Walk the CFG in predominator order looking for strength reduction
3981      candidates.  */
3982   find_candidates_dom_walker (CDI_DOMINATORS)
3983     .walk (fun->cfg->x_entry_block_ptr);
3984 
3985   if (dump_file && (dump_flags & TDF_DETAILS))
3986     {
3987       dump_cand_vec ();
3988       dump_cand_chains ();
3989     }
3990 
3991   delete alt_base_map;
3992   free_affine_expand_cache (&name_expansions);
3993 
3994   /* Analyze costs and make appropriate replacements.  */
3995   analyze_candidates_and_replace ();
3996 
3997   loop_optimizer_finalize ();
3998   delete base_cand_map;
3999   base_cand_map = NULL;
4000   obstack_free (&chain_obstack, NULL);
4001   delete stmt_cand_map;
4002   cand_vec.release ();
4003   obstack_free (&cand_obstack, NULL);
4004 
4005   return 0;
4006 }
4007 
4008 } // anon namespace
4009 
4010 gimple_opt_pass *
4011 make_pass_strength_reduction (gcc::context *ctxt)
4012 {
4013   return new pass_strength_reduction (ctxt);
4014 }
4015