OSDN Git Service

2008-12-17 Sebastian Pop <sebastian.pop@amd.com>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-loop-ivopts.c
1 /* Induction variable optimizations.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software
3    Foundation, Inc.
4    
5 This file is part of GCC.
6    
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3, or (at your option) any
10 later version.
11    
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY 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 /* This pass tries to find the optimal set of induction variables for the loop.
22    It optimizes just the basic linear induction variables (although adding
23    support for other types should not be too hard).  It includes the
24    optimizations commonly known as strength reduction, induction variable
25    coalescing and induction variable elimination.  It does it in the
26    following steps:
27
28    1) The interesting uses of induction variables are found.  This includes
29
30       -- uses of induction variables in non-linear expressions
31       -- addresses of arrays
32       -- comparisons of induction variables
33
34    2) Candidates for the induction variables are found.  This includes
35
36       -- old induction variables
37       -- the variables defined by expressions derived from the "interesting
38          uses" above
39
40    3) The optimal (w.r. to a cost function) set of variables is chosen.  The
41       cost function assigns a cost to sets of induction variables and consists
42       of three parts:
43
44       -- The use costs.  Each of the interesting uses chooses the best induction
45          variable in the set and adds its cost to the sum.  The cost reflects
46          the time spent on modifying the induction variables value to be usable
47          for the given purpose (adding base and offset for arrays, etc.).
48       -- The variable costs.  Each of the variables has a cost assigned that
49          reflects the costs associated with incrementing the value of the
50          variable.  The original variables are somewhat preferred.
51       -- The set cost.  Depending on the size of the set, extra cost may be
52          added to reflect register pressure.
53
54       All the costs are defined in a machine-specific way, using the target
55       hooks and machine descriptions to determine them.
56
57    4) The trees are transformed to use the new variables, the dead code is
58       removed.
59    
60    All of this is done loop by loop.  Doing it globally is theoretically
61    possible, it might give a better performance and it might enable us
62    to decide costs more precisely, but getting all the interactions right
63    would be complicated.  */
64
65 #include "config.h"
66 #include "system.h"
67 #include "coretypes.h"
68 #include "tm.h"
69 #include "tree.h"
70 #include "rtl.h"
71 #include "tm_p.h"
72 #include "hard-reg-set.h"
73 #include "basic-block.h"
74 #include "output.h"
75 #include "diagnostic.h"
76 #include "tree-flow.h"
77 #include "tree-dump.h"
78 #include "timevar.h"
79 #include "cfgloop.h"
80 #include "varray.h"
81 #include "expr.h"
82 #include "tree-pass.h"
83 #include "ggc.h"
84 #include "insn-config.h"
85 #include "recog.h"
86 #include "pointer-set.h"
87 #include "hashtab.h"
88 #include "tree-chrec.h"
89 #include "tree-scalar-evolution.h"
90 #include "cfgloop.h"
91 #include "params.h"
92 #include "langhooks.h"
93 #include "tree-affine.h"
94 #include "target.h"
95
96 /* The infinite cost.  */
97 #define INFTY 10000000
98
99 /* The expected number of loop iterations.  TODO -- use profiling instead of
100    this.  */
101 #define AVG_LOOP_NITER(LOOP) 5
102
103
104 /* Representation of the induction variable.  */
105 struct iv
106 {
107   tree base;            /* Initial value of the iv.  */
108   tree base_object;     /* A memory object to that the induction variable points.  */
109   tree step;            /* Step of the iv (constant only).  */
110   tree ssa_name;        /* The ssa name with the value.  */
111   bool biv_p;           /* Is it a biv?  */
112   bool have_use_for;    /* Do we already have a use for it?  */
113   unsigned use_id;      /* The identifier in the use if it is the case.  */
114 };
115
116 /* Per-ssa version information (induction variable descriptions, etc.).  */
117 struct version_info
118 {
119   tree name;            /* The ssa name.  */
120   struct iv *iv;        /* Induction variable description.  */
121   bool has_nonlin_use;  /* For a loop-level invariant, whether it is used in
122                            an expression that is not an induction variable.  */
123   unsigned inv_id;      /* Id of an invariant.  */
124   bool preserve_biv;    /* For the original biv, whether to preserve it.  */
125 };
126
127 /* Types of uses.  */
128 enum use_type
129 {
130   USE_NONLINEAR_EXPR,   /* Use in a nonlinear expression.  */
131   USE_ADDRESS,          /* Use in an address.  */
132   USE_COMPARE           /* Use is a compare.  */
133 };
134
135 /* Cost of a computation.  */
136 typedef struct
137 {
138   unsigned cost;        /* The runtime cost.  */
139   unsigned complexity;  /* The estimate of the complexity of the code for
140                            the computation (in no concrete units --
141                            complexity field should be larger for more
142                            complex expressions and addressing modes).  */
143 } comp_cost;
144
145 static const comp_cost zero_cost = {0, 0};
146 static const comp_cost infinite_cost = {INFTY, INFTY};
147
148 /* The candidate - cost pair.  */
149 struct cost_pair
150 {
151   struct iv_cand *cand; /* The candidate.  */
152   comp_cost cost;       /* The cost.  */
153   bitmap depends_on;    /* The list of invariants that have to be
154                            preserved.  */
155   tree value;           /* For final value elimination, the expression for
156                            the final value of the iv.  For iv elimination,
157                            the new bound to compare with.  */
158 };
159
160 /* Use.  */
161 struct iv_use
162 {
163   unsigned id;          /* The id of the use.  */
164   enum use_type type;   /* Type of the use.  */
165   struct iv *iv;        /* The induction variable it is based on.  */
166   gimple stmt;          /* Statement in that it occurs.  */
167   tree *op_p;           /* The place where it occurs.  */
168   bitmap related_cands; /* The set of "related" iv candidates, plus the common
169                            important ones.  */
170
171   unsigned n_map_members; /* Number of candidates in the cost_map list.  */
172   struct cost_pair *cost_map;
173                         /* The costs wrto the iv candidates.  */
174
175   struct iv_cand *selected;
176                         /* The selected candidate.  */
177 };
178
179 /* The position where the iv is computed.  */
180 enum iv_position
181 {
182   IP_NORMAL,            /* At the end, just before the exit condition.  */
183   IP_END,               /* At the end of the latch block.  */
184   IP_ORIGINAL           /* The original biv.  */
185 };
186
187 /* The induction variable candidate.  */
188 struct iv_cand
189 {
190   unsigned id;          /* The number of the candidate.  */
191   bool important;       /* Whether this is an "important" candidate, i.e. such
192                            that it should be considered by all uses.  */
193   enum iv_position pos; /* Where it is computed.  */
194   gimple incremented_at;/* For original biv, the statement where it is
195                            incremented.  */
196   tree var_before;      /* The variable used for it before increment.  */
197   tree var_after;       /* The variable used for it after increment.  */
198   struct iv *iv;        /* The value of the candidate.  NULL for
199                            "pseudocandidate" used to indicate the possibility
200                            to replace the final value of an iv by direct
201                            computation of the value.  */
202   unsigned cost;        /* Cost of the candidate.  */
203   bitmap depends_on;    /* The list of invariants that are used in step of the
204                            biv.  */
205 };
206
207 /* The data used by the induction variable optimizations.  */
208
209 typedef struct iv_use *iv_use_p;
210 DEF_VEC_P(iv_use_p);
211 DEF_VEC_ALLOC_P(iv_use_p,heap);
212
213 typedef struct iv_cand *iv_cand_p;
214 DEF_VEC_P(iv_cand_p);
215 DEF_VEC_ALLOC_P(iv_cand_p,heap);
216
217 struct ivopts_data
218 {
219   /* The currently optimized loop.  */
220   struct loop *current_loop;
221
222   /* Are we optimizing for speed?  */
223   bool speed;
224
225   /* Number of registers used in it.  */
226   unsigned regs_used;
227
228   /* Numbers of iterations for all exits of the current loop.  */
229   struct pointer_map_t *niters;
230
231   /* The size of version_info array allocated.  */
232   unsigned version_info_size;
233
234   /* The array of information for the ssa names.  */
235   struct version_info *version_info;
236
237   /* The bitmap of indices in version_info whose value was changed.  */
238   bitmap relevant;
239
240   /* The maximum invariant id.  */
241   unsigned max_inv_id;
242
243   /* The uses of induction variables.  */
244   VEC(iv_use_p,heap) *iv_uses;
245
246   /* The candidates.  */
247   VEC(iv_cand_p,heap) *iv_candidates;
248
249   /* A bitmap of important candidates.  */
250   bitmap important_candidates;
251
252   /* Whether to consider just related and important candidates when replacing a
253      use.  */
254   bool consider_all_candidates;
255 };
256
257 /* An assignment of iv candidates to uses.  */
258
259 struct iv_ca
260 {
261   /* The number of uses covered by the assignment.  */
262   unsigned upto;
263
264   /* Number of uses that cannot be expressed by the candidates in the set.  */
265   unsigned bad_uses;
266
267   /* Candidate assigned to a use, together with the related costs.  */
268   struct cost_pair **cand_for_use;
269
270   /* Number of times each candidate is used.  */
271   unsigned *n_cand_uses;
272
273   /* The candidates used.  */
274   bitmap cands;
275
276   /* The number of candidates in the set.  */
277   unsigned n_cands;
278
279   /* Total number of registers needed.  */
280   unsigned n_regs;
281
282   /* Total cost of expressing uses.  */
283   comp_cost cand_use_cost;
284
285   /* Total cost of candidates.  */
286   unsigned cand_cost;
287
288   /* Number of times each invariant is used.  */
289   unsigned *n_invariant_uses;
290
291   /* Total cost of the assignment.  */
292   comp_cost cost;
293 };
294
295 /* Difference of two iv candidate assignments.  */
296
297 struct iv_ca_delta
298 {
299   /* Changed use.  */
300   struct iv_use *use;
301
302   /* An old assignment (for rollback purposes).  */
303   struct cost_pair *old_cp;
304
305   /* A new assignment.  */
306   struct cost_pair *new_cp;
307
308   /* Next change in the list.  */
309   struct iv_ca_delta *next_change;
310 };
311
312 /* Bound on number of candidates below that all candidates are considered.  */
313
314 #define CONSIDER_ALL_CANDIDATES_BOUND \
315   ((unsigned) PARAM_VALUE (PARAM_IV_CONSIDER_ALL_CANDIDATES_BOUND))
316
317 /* If there are more iv occurrences, we just give up (it is quite unlikely that
318    optimizing such a loop would help, and it would take ages).  */
319
320 #define MAX_CONSIDERED_USES \
321   ((unsigned) PARAM_VALUE (PARAM_IV_MAX_CONSIDERED_USES))
322
323 /* If there are at most this number of ivs in the set, try removing unnecessary
324    ivs from the set always.  */
325
326 #define ALWAYS_PRUNE_CAND_SET_BOUND \
327   ((unsigned) PARAM_VALUE (PARAM_IV_ALWAYS_PRUNE_CAND_SET_BOUND))
328
329 /* The list of trees for that the decl_rtl field must be reset is stored
330    here.  */
331
332 static VEC(tree,heap) *decl_rtl_to_reset;
333
334 /* Number of uses recorded in DATA.  */
335
336 static inline unsigned
337 n_iv_uses (struct ivopts_data *data)
338 {
339   return VEC_length (iv_use_p, data->iv_uses);
340 }
341
342 /* Ith use recorded in DATA.  */
343
344 static inline struct iv_use *
345 iv_use (struct ivopts_data *data, unsigned i)
346 {
347   return VEC_index (iv_use_p, data->iv_uses, i);
348 }
349
350 /* Number of candidates recorded in DATA.  */
351
352 static inline unsigned
353 n_iv_cands (struct ivopts_data *data)
354 {
355   return VEC_length (iv_cand_p, data->iv_candidates);
356 }
357
358 /* Ith candidate recorded in DATA.  */
359
360 static inline struct iv_cand *
361 iv_cand (struct ivopts_data *data, unsigned i)
362 {
363   return VEC_index (iv_cand_p, data->iv_candidates, i);
364 }
365
366 /* The single loop exit if it dominates the latch, NULL otherwise.  */
367
368 edge
369 single_dom_exit (struct loop *loop)
370 {
371   edge exit = single_exit (loop);
372
373   if (!exit)
374     return NULL;
375
376   if (!just_once_each_iteration_p (loop, exit->src))
377     return NULL;
378
379   return exit;
380 }
381
382 /* Dumps information about the induction variable IV to FILE.  */
383
384 extern void dump_iv (FILE *, struct iv *);
385 void
386 dump_iv (FILE *file, struct iv *iv)
387 {
388   if (iv->ssa_name)
389     {
390       fprintf (file, "ssa name ");
391       print_generic_expr (file, iv->ssa_name, TDF_SLIM);
392       fprintf (file, "\n");
393     }
394
395   fprintf (file, "  type ");
396   print_generic_expr (file, TREE_TYPE (iv->base), TDF_SLIM);
397   fprintf (file, "\n");
398
399   if (iv->step)
400     {
401       fprintf (file, "  base ");
402       print_generic_expr (file, iv->base, TDF_SLIM);
403       fprintf (file, "\n");
404
405       fprintf (file, "  step ");
406       print_generic_expr (file, iv->step, TDF_SLIM);
407       fprintf (file, "\n");
408     }
409   else
410     {
411       fprintf (file, "  invariant ");
412       print_generic_expr (file, iv->base, TDF_SLIM);
413       fprintf (file, "\n");
414     }
415
416   if (iv->base_object)
417     {
418       fprintf (file, "  base object ");
419       print_generic_expr (file, iv->base_object, TDF_SLIM);
420       fprintf (file, "\n");
421     }
422
423   if (iv->biv_p)
424     fprintf (file, "  is a biv\n");
425 }
426
427 /* Dumps information about the USE to FILE.  */
428
429 extern void dump_use (FILE *, struct iv_use *);
430 void
431 dump_use (FILE *file, struct iv_use *use)
432 {
433   fprintf (file, "use %d\n", use->id);
434
435   switch (use->type)
436     {
437     case USE_NONLINEAR_EXPR:
438       fprintf (file, "  generic\n");
439       break;
440
441     case USE_ADDRESS:
442       fprintf (file, "  address\n");
443       break;
444
445     case USE_COMPARE:
446       fprintf (file, "  compare\n");
447       break;
448
449     default:
450       gcc_unreachable ();
451     }
452
453   fprintf (file, "  in statement ");
454   print_gimple_stmt (file, use->stmt, 0, 0);
455   fprintf (file, "\n");
456
457   fprintf (file, "  at position ");
458   if (use->op_p)
459     print_generic_expr (file, *use->op_p, TDF_SLIM);
460   fprintf (file, "\n");
461
462   dump_iv (file, use->iv);
463
464   if (use->related_cands)
465     {
466       fprintf (file, "  related candidates ");
467       dump_bitmap (file, use->related_cands);
468     }
469 }
470
471 /* Dumps information about the uses to FILE.  */
472
473 extern void dump_uses (FILE *, struct ivopts_data *);
474 void
475 dump_uses (FILE *file, struct ivopts_data *data)
476 {
477   unsigned i;
478   struct iv_use *use;
479
480   for (i = 0; i < n_iv_uses (data); i++)
481     {
482       use = iv_use (data, i);
483
484       dump_use (file, use);
485       fprintf (file, "\n");
486     }
487 }
488
489 /* Dumps information about induction variable candidate CAND to FILE.  */
490
491 extern void dump_cand (FILE *, struct iv_cand *);
492 void
493 dump_cand (FILE *file, struct iv_cand *cand)
494 {
495   struct iv *iv = cand->iv;
496
497   fprintf (file, "candidate %d%s\n",
498            cand->id, cand->important ? " (important)" : "");
499
500   if (cand->depends_on)
501     {
502       fprintf (file, "  depends on ");
503       dump_bitmap (file, cand->depends_on);
504     }
505
506   if (!iv)
507     {
508       fprintf (file, "  final value replacement\n");
509       return;
510     }
511
512   switch (cand->pos)
513     {
514     case IP_NORMAL:
515       fprintf (file, "  incremented before exit test\n");
516       break;
517
518     case IP_END:
519       fprintf (file, "  incremented at end\n");
520       break;
521
522     case IP_ORIGINAL:
523       fprintf (file, "  original biv\n");
524       break;
525     }
526
527   dump_iv (file, iv);
528 }
529
530 /* Returns the info for ssa version VER.  */
531
532 static inline struct version_info *
533 ver_info (struct ivopts_data *data, unsigned ver)
534 {
535   return data->version_info + ver;
536 }
537
538 /* Returns the info for ssa name NAME.  */
539
540 static inline struct version_info *
541 name_info (struct ivopts_data *data, tree name)
542 {
543   return ver_info (data, SSA_NAME_VERSION (name));
544 }
545
546 /* Returns true if STMT is after the place where the IP_NORMAL ivs will be
547    emitted in LOOP.  */
548
549 static bool
550 stmt_after_ip_normal_pos (struct loop *loop, gimple stmt)
551 {
552   basic_block bb = ip_normal_pos (loop), sbb = gimple_bb (stmt);
553
554   gcc_assert (bb);
555
556   if (sbb == loop->latch)
557     return true;
558
559   if (sbb != bb)
560     return false;
561
562   return stmt == last_stmt (bb);
563 }
564
565 /* Returns true if STMT if after the place where the original induction
566    variable CAND is incremented.  */
567
568 static bool
569 stmt_after_ip_original_pos (struct iv_cand *cand, gimple stmt)
570 {
571   basic_block cand_bb = gimple_bb (cand->incremented_at);
572   basic_block stmt_bb = gimple_bb (stmt);
573   gimple_stmt_iterator bsi;
574
575   if (!dominated_by_p (CDI_DOMINATORS, stmt_bb, cand_bb))
576     return false;
577
578   if (stmt_bb != cand_bb)
579     return true;
580
581   /* Scan the block from the end, since the original ivs are usually
582      incremented at the end of the loop body.  */
583   for (bsi = gsi_last_bb (stmt_bb); ; gsi_prev (&bsi))
584     {
585       if (gsi_stmt (bsi) == cand->incremented_at)
586         return false;
587       if (gsi_stmt (bsi) == stmt)
588         return true;
589     }
590 }
591
592 /* Returns true if STMT if after the place where the induction variable
593    CAND is incremented in LOOP.  */
594
595 static bool
596 stmt_after_increment (struct loop *loop, struct iv_cand *cand, gimple stmt)
597 {
598   switch (cand->pos)
599     {
600     case IP_END:
601       return false;
602
603     case IP_NORMAL:
604       return stmt_after_ip_normal_pos (loop, stmt);
605
606     case IP_ORIGINAL:
607       return stmt_after_ip_original_pos (cand, stmt);
608
609     default:
610       gcc_unreachable ();
611     }
612 }
613
614 /* Returns true if EXP is a ssa name that occurs in an abnormal phi node.  */
615
616 static bool
617 abnormal_ssa_name_p (tree exp)
618 {
619   if (!exp)
620     return false;
621
622   if (TREE_CODE (exp) != SSA_NAME)
623     return false;
624
625   return SSA_NAME_OCCURS_IN_ABNORMAL_PHI (exp) != 0;
626 }
627
628 /* Returns false if BASE or INDEX contains a ssa name that occurs in an
629    abnormal phi node.  Callback for for_each_index.  */
630
631 static bool
632 idx_contains_abnormal_ssa_name_p (tree base, tree *index,
633                                   void *data ATTRIBUTE_UNUSED)
634 {
635   if (TREE_CODE (base) == ARRAY_REF || TREE_CODE (base) == ARRAY_RANGE_REF)
636     {
637       if (abnormal_ssa_name_p (TREE_OPERAND (base, 2)))
638         return false;
639       if (abnormal_ssa_name_p (TREE_OPERAND (base, 3)))
640         return false;
641     }
642
643   return !abnormal_ssa_name_p (*index);
644 }
645
646 /* Returns true if EXPR contains a ssa name that occurs in an
647    abnormal phi node.  */
648
649 bool
650 contains_abnormal_ssa_name_p (tree expr)
651 {
652   enum tree_code code;
653   enum tree_code_class codeclass;
654
655   if (!expr)
656     return false;
657
658   code = TREE_CODE (expr);
659   codeclass = TREE_CODE_CLASS (code);
660
661   if (code == SSA_NAME)
662     return SSA_NAME_OCCURS_IN_ABNORMAL_PHI (expr) != 0;
663
664   if (code == INTEGER_CST
665       || is_gimple_min_invariant (expr))
666     return false;
667
668   if (code == ADDR_EXPR)
669     return !for_each_index (&TREE_OPERAND (expr, 0),
670                             idx_contains_abnormal_ssa_name_p,
671                             NULL);
672
673   switch (codeclass)
674     {
675     case tcc_binary:
676     case tcc_comparison:
677       if (contains_abnormal_ssa_name_p (TREE_OPERAND (expr, 1)))
678         return true;
679
680       /* Fallthru.  */
681     case tcc_unary:
682       if (contains_abnormal_ssa_name_p (TREE_OPERAND (expr, 0)))
683         return true;
684
685       break;
686
687     default:
688       gcc_unreachable ();
689     }
690
691   return false;
692 }
693
694 /*  Returns tree describing number of iterations determined from
695     EXIT of DATA->current_loop, or NULL if something goes wrong.  */
696
697 static tree
698 niter_for_exit (struct ivopts_data *data, edge exit)
699 {
700   struct tree_niter_desc desc;
701   tree niter;
702   void **slot;
703
704   if (!data->niters)
705     {
706       data->niters = pointer_map_create ();
707       slot = NULL;
708     }
709   else
710     slot = pointer_map_contains (data->niters, exit);
711
712   if (!slot)
713     {
714       /* Try to determine number of iterations.  We must know it
715          unconditionally (i.e., without possibility of # of iterations
716          being zero).  Also, we cannot safely work with ssa names that
717          appear in phi nodes on abnormal edges, so that we do not create
718          overlapping life ranges for them (PR 27283).  */
719       if (number_of_iterations_exit (data->current_loop,
720                                      exit, &desc, true)
721           && integer_zerop (desc.may_be_zero)
722           && !contains_abnormal_ssa_name_p (desc.niter))
723         niter = desc.niter;
724       else
725         niter = NULL_TREE;
726
727       *pointer_map_insert (data->niters, exit) = niter;
728     }
729   else
730     niter = (tree) *slot;
731
732   return niter;
733 }
734
735 /* Returns tree describing number of iterations determined from
736    single dominating exit of DATA->current_loop, or NULL if something
737    goes wrong.  */
738
739 static tree
740 niter_for_single_dom_exit (struct ivopts_data *data)
741 {
742   edge exit = single_dom_exit (data->current_loop);
743
744   if (!exit)
745     return NULL;
746
747   return niter_for_exit (data, exit);
748 }
749
750 /* Initializes data structures used by the iv optimization pass, stored
751    in DATA.  */
752
753 static void
754 tree_ssa_iv_optimize_init (struct ivopts_data *data)
755 {
756   data->version_info_size = 2 * num_ssa_names;
757   data->version_info = XCNEWVEC (struct version_info, data->version_info_size);
758   data->relevant = BITMAP_ALLOC (NULL);
759   data->important_candidates = BITMAP_ALLOC (NULL);
760   data->max_inv_id = 0;
761   data->niters = NULL;
762   data->iv_uses = VEC_alloc (iv_use_p, heap, 20);
763   data->iv_candidates = VEC_alloc (iv_cand_p, heap, 20);
764   decl_rtl_to_reset = VEC_alloc (tree, heap, 20);
765 }
766
767 /* Returns a memory object to that EXPR points.  In case we are able to
768    determine that it does not point to any such object, NULL is returned.  */
769
770 static tree
771 determine_base_object (tree expr)
772 {
773   enum tree_code code = TREE_CODE (expr);
774   tree base, obj;
775
776   /* If this is a pointer casted to any type, we need to determine
777      the base object for the pointer; so handle conversions before
778      throwing away non-pointer expressions.  */
779   if (CONVERT_EXPR_P (expr))
780     return determine_base_object (TREE_OPERAND (expr, 0));
781
782   if (!POINTER_TYPE_P (TREE_TYPE (expr)))
783     return NULL_TREE;
784
785   switch (code)
786     {
787     case INTEGER_CST:
788       return NULL_TREE;
789
790     case ADDR_EXPR:
791       obj = TREE_OPERAND (expr, 0);
792       base = get_base_address (obj);
793
794       if (!base)
795         return expr;
796
797       if (TREE_CODE (base) == INDIRECT_REF)
798         return determine_base_object (TREE_OPERAND (base, 0));
799
800       return fold_convert (ptr_type_node,
801                            build_fold_addr_expr (base));
802
803     case POINTER_PLUS_EXPR:
804       return determine_base_object (TREE_OPERAND (expr, 0));
805
806     case PLUS_EXPR:
807     case MINUS_EXPR:
808       /* Pointer addition is done solely using POINTER_PLUS_EXPR.  */
809       gcc_unreachable ();
810
811     default:
812       return fold_convert (ptr_type_node, expr);
813     }
814 }
815
816 /* Allocates an induction variable with given initial value BASE and step STEP
817    for loop LOOP.  */
818
819 static struct iv *
820 alloc_iv (tree base, tree step)
821 {
822   struct iv *iv = XCNEW (struct iv);
823   gcc_assert (step != NULL_TREE);
824
825   iv->base = base;
826   iv->base_object = determine_base_object (base);
827   iv->step = step;
828   iv->biv_p = false;
829   iv->have_use_for = false;
830   iv->use_id = 0;
831   iv->ssa_name = NULL_TREE;
832
833   return iv;
834 }
835
836 /* Sets STEP and BASE for induction variable IV.  */
837
838 static void
839 set_iv (struct ivopts_data *data, tree iv, tree base, tree step)
840 {
841   struct version_info *info = name_info (data, iv);
842
843   gcc_assert (!info->iv);
844
845   bitmap_set_bit (data->relevant, SSA_NAME_VERSION (iv));
846   info->iv = alloc_iv (base, step);
847   info->iv->ssa_name = iv;
848 }
849
850 /* Finds induction variable declaration for VAR.  */
851
852 static struct iv *
853 get_iv (struct ivopts_data *data, tree var)
854 {
855   basic_block bb;
856   tree type = TREE_TYPE (var);
857
858   if (!POINTER_TYPE_P (type)
859       && !INTEGRAL_TYPE_P (type))
860     return NULL;
861
862   if (!name_info (data, var)->iv)
863     {
864       bb = gimple_bb (SSA_NAME_DEF_STMT (var));
865
866       if (!bb
867           || !flow_bb_inside_loop_p (data->current_loop, bb))
868         set_iv (data, var, var, build_int_cst (type, 0));
869     }
870
871   return name_info (data, var)->iv;
872 }
873
874 /* Determines the step of a biv defined in PHI.  Returns NULL if PHI does
875    not define a simple affine biv with nonzero step.  */
876
877 static tree
878 determine_biv_step (gimple phi)
879 {
880   struct loop *loop = gimple_bb (phi)->loop_father;
881   tree name = PHI_RESULT (phi);
882   affine_iv iv;
883
884   if (!is_gimple_reg (name))
885     return NULL_TREE;
886
887   if (!simple_iv (loop, phi, name, &iv, true))
888     return NULL_TREE;
889
890   return integer_zerop (iv.step) ? NULL_TREE : iv.step;
891 }
892
893 /* Finds basic ivs.  */
894
895 static bool
896 find_bivs (struct ivopts_data *data)
897 {
898   gimple phi;
899   tree step, type, base;
900   bool found = false;
901   struct loop *loop = data->current_loop;
902   gimple_stmt_iterator psi;
903
904   for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
905     {
906       phi = gsi_stmt (psi);
907
908       if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (PHI_RESULT (phi)))
909         continue;
910
911       step = determine_biv_step (phi);
912       if (!step)
913         continue;
914
915       base = PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop));
916       base = expand_simple_operations (base);
917       if (contains_abnormal_ssa_name_p (base)
918           || contains_abnormal_ssa_name_p (step))
919         continue;
920
921       type = TREE_TYPE (PHI_RESULT (phi));
922       base = fold_convert (type, base);
923       if (step)
924         {
925           if (POINTER_TYPE_P (type))
926             step = fold_convert (sizetype, step);
927           else
928             step = fold_convert (type, step);
929         }
930
931       set_iv (data, PHI_RESULT (phi), base, step);
932       found = true;
933     }
934
935   return found;
936 }
937
938 /* Marks basic ivs.  */
939
940 static void
941 mark_bivs (struct ivopts_data *data)
942 {
943   gimple phi;
944   tree var;
945   struct iv *iv, *incr_iv;
946   struct loop *loop = data->current_loop;
947   basic_block incr_bb;
948   gimple_stmt_iterator psi;
949
950   for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
951     {
952       phi = gsi_stmt (psi);
953
954       iv = get_iv (data, PHI_RESULT (phi));
955       if (!iv)
956         continue;
957
958       var = PHI_ARG_DEF_FROM_EDGE (phi, loop_latch_edge (loop));
959       incr_iv = get_iv (data, var);
960       if (!incr_iv)
961         continue;
962
963       /* If the increment is in the subloop, ignore it.  */
964       incr_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
965       if (incr_bb->loop_father != data->current_loop
966           || (incr_bb->flags & BB_IRREDUCIBLE_LOOP))
967         continue;
968
969       iv->biv_p = true;
970       incr_iv->biv_p = true;
971     }
972 }
973
974 /* Checks whether STMT defines a linear induction variable and stores its
975    parameters to IV.  */
976
977 static bool
978 find_givs_in_stmt_scev (struct ivopts_data *data, gimple stmt, affine_iv *iv)
979 {
980   tree lhs;
981   struct loop *loop = data->current_loop;
982
983   iv->base = NULL_TREE;
984   iv->step = NULL_TREE;
985
986   if (gimple_code (stmt) != GIMPLE_ASSIGN)
987     return false;
988
989   lhs = gimple_assign_lhs (stmt);
990   if (TREE_CODE (lhs) != SSA_NAME)
991     return false;
992
993   if (!simple_iv (loop, stmt, lhs, iv, true))
994     return false;
995   iv->base = expand_simple_operations (iv->base);
996
997   if (contains_abnormal_ssa_name_p (iv->base)
998       || contains_abnormal_ssa_name_p (iv->step))
999     return false;
1000
1001   return true;
1002 }
1003
1004 /* Finds general ivs in statement STMT.  */
1005
1006 static void
1007 find_givs_in_stmt (struct ivopts_data *data, gimple stmt)
1008 {
1009   affine_iv iv;
1010
1011   if (!find_givs_in_stmt_scev (data, stmt, &iv))
1012     return;
1013
1014   set_iv (data, gimple_assign_lhs (stmt), iv.base, iv.step);
1015 }
1016
1017 /* Finds general ivs in basic block BB.  */
1018
1019 static void
1020 find_givs_in_bb (struct ivopts_data *data, basic_block bb)
1021 {
1022   gimple_stmt_iterator bsi;
1023
1024   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1025     find_givs_in_stmt (data, gsi_stmt (bsi));
1026 }
1027
1028 /* Finds general ivs.  */
1029
1030 static void
1031 find_givs (struct ivopts_data *data)
1032 {
1033   struct loop *loop = data->current_loop;
1034   basic_block *body = get_loop_body_in_dom_order (loop);
1035   unsigned i;
1036
1037   for (i = 0; i < loop->num_nodes; i++)
1038     find_givs_in_bb (data, body[i]);
1039   free (body);
1040 }
1041
1042 /* For each ssa name defined in LOOP determines whether it is an induction
1043    variable and if so, its initial value and step.  */
1044
1045 static bool
1046 find_induction_variables (struct ivopts_data *data)
1047 {
1048   unsigned i;
1049   bitmap_iterator bi;
1050
1051   if (!find_bivs (data))
1052     return false;
1053
1054   find_givs (data);
1055   mark_bivs (data);
1056
1057   if (dump_file && (dump_flags & TDF_DETAILS))
1058     {
1059       tree niter = niter_for_single_dom_exit (data);
1060
1061       if (niter)
1062         {
1063           fprintf (dump_file, "  number of iterations ");
1064           print_generic_expr (dump_file, niter, TDF_SLIM);
1065           fprintf (dump_file, "\n\n");
1066         };
1067  
1068       fprintf (dump_file, "Induction variables:\n\n");
1069
1070       EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, i, bi)
1071         {
1072           if (ver_info (data, i)->iv)
1073             dump_iv (dump_file, ver_info (data, i)->iv);
1074         }
1075     }
1076
1077   return true;
1078 }
1079
1080 /* Records a use of type USE_TYPE at *USE_P in STMT whose value is IV.  */
1081
1082 static struct iv_use *
1083 record_use (struct ivopts_data *data, tree *use_p, struct iv *iv,
1084             gimple stmt, enum use_type use_type)
1085 {
1086   struct iv_use *use = XCNEW (struct iv_use);
1087
1088   use->id = n_iv_uses (data);
1089   use->type = use_type;
1090   use->iv = iv;
1091   use->stmt = stmt;
1092   use->op_p = use_p;
1093   use->related_cands = BITMAP_ALLOC (NULL);
1094
1095   /* To avoid showing ssa name in the dumps, if it was not reset by the
1096      caller.  */
1097   iv->ssa_name = NULL_TREE;
1098
1099   if (dump_file && (dump_flags & TDF_DETAILS))
1100     dump_use (dump_file, use);
1101
1102   VEC_safe_push (iv_use_p, heap, data->iv_uses, use);
1103
1104   return use;
1105 }
1106
1107 /* Checks whether OP is a loop-level invariant and if so, records it.
1108    NONLINEAR_USE is true if the invariant is used in a way we do not
1109    handle specially.  */
1110
1111 static void
1112 record_invariant (struct ivopts_data *data, tree op, bool nonlinear_use)
1113 {
1114   basic_block bb;
1115   struct version_info *info;
1116
1117   if (TREE_CODE (op) != SSA_NAME
1118       || !is_gimple_reg (op))
1119     return;
1120
1121   bb = gimple_bb (SSA_NAME_DEF_STMT (op));
1122   if (bb
1123       && flow_bb_inside_loop_p (data->current_loop, bb))
1124     return;
1125
1126   info = name_info (data, op);
1127   info->name = op;
1128   info->has_nonlin_use |= nonlinear_use;
1129   if (!info->inv_id)
1130     info->inv_id = ++data->max_inv_id;
1131   bitmap_set_bit (data->relevant, SSA_NAME_VERSION (op));
1132 }
1133
1134 /* Checks whether the use OP is interesting and if so, records it.  */
1135
1136 static struct iv_use *
1137 find_interesting_uses_op (struct ivopts_data *data, tree op)
1138 {
1139   struct iv *iv;
1140   struct iv *civ;
1141   gimple stmt;
1142   struct iv_use *use;
1143
1144   if (TREE_CODE (op) != SSA_NAME)
1145     return NULL;
1146
1147   iv = get_iv (data, op);
1148   if (!iv)
1149     return NULL;
1150   
1151   if (iv->have_use_for)
1152     {
1153       use = iv_use (data, iv->use_id);
1154
1155       gcc_assert (use->type == USE_NONLINEAR_EXPR);
1156       return use;
1157     }
1158
1159   if (integer_zerop (iv->step))
1160     {
1161       record_invariant (data, op, true);
1162       return NULL;
1163     }
1164   iv->have_use_for = true;
1165
1166   civ = XNEW (struct iv);
1167   *civ = *iv;
1168
1169   stmt = SSA_NAME_DEF_STMT (op);
1170   gcc_assert (gimple_code (stmt) == GIMPLE_PHI
1171               || is_gimple_assign (stmt));
1172
1173   use = record_use (data, NULL, civ, stmt, USE_NONLINEAR_EXPR);
1174   iv->use_id = use->id;
1175
1176   return use;
1177 }
1178
1179 /* Given a condition in statement STMT, checks whether it is a compare
1180    of an induction variable and an invariant.  If this is the case,
1181    CONTROL_VAR is set to location of the iv, BOUND to the location of
1182    the invariant, IV_VAR and IV_BOUND are set to the corresponding
1183    induction variable descriptions, and true is returned.  If this is not
1184    the case, CONTROL_VAR and BOUND are set to the arguments of the
1185    condition and false is returned.  */
1186
1187 static bool
1188 extract_cond_operands (struct ivopts_data *data, gimple stmt,
1189                        tree **control_var, tree **bound,
1190                        struct iv **iv_var, struct iv **iv_bound)
1191 {
1192   /* The objects returned when COND has constant operands.  */
1193   static struct iv const_iv;
1194   static tree zero;
1195   tree *op0 = &zero, *op1 = &zero, *tmp_op;
1196   struct iv *iv0 = &const_iv, *iv1 = &const_iv, *tmp_iv;
1197   bool ret = false;
1198
1199   if (gimple_code (stmt) == GIMPLE_COND)
1200     {
1201       op0 = gimple_cond_lhs_ptr (stmt);
1202       op1 = gimple_cond_rhs_ptr (stmt);
1203     }
1204   else
1205     {
1206       op0 = gimple_assign_rhs1_ptr (stmt);
1207       op1 = gimple_assign_rhs2_ptr (stmt);
1208     }
1209
1210   zero = integer_zero_node;
1211   const_iv.step = integer_zero_node;
1212
1213   if (TREE_CODE (*op0) == SSA_NAME)
1214     iv0 = get_iv (data, *op0);
1215   if (TREE_CODE (*op1) == SSA_NAME)
1216     iv1 = get_iv (data, *op1);
1217
1218   /* Exactly one of the compared values must be an iv, and the other one must
1219      be an invariant.  */
1220   if (!iv0 || !iv1)
1221     goto end;
1222
1223   if (integer_zerop (iv0->step))
1224     {
1225       /* Control variable may be on the other side.  */
1226       tmp_op = op0; op0 = op1; op1 = tmp_op;
1227       tmp_iv = iv0; iv0 = iv1; iv1 = tmp_iv;
1228     }
1229   ret = !integer_zerop (iv0->step) && integer_zerop (iv1->step);
1230
1231 end:
1232   if (control_var)
1233     *control_var = op0;;
1234   if (iv_var)
1235     *iv_var = iv0;;
1236   if (bound)
1237     *bound = op1;
1238   if (iv_bound)
1239     *iv_bound = iv1;
1240
1241   return ret;
1242 }
1243
1244 /* Checks whether the condition in STMT is interesting and if so,
1245    records it.  */
1246
1247 static void
1248 find_interesting_uses_cond (struct ivopts_data *data, gimple stmt)
1249 {
1250   tree *var_p, *bound_p;
1251   struct iv *var_iv, *civ;
1252
1253   if (!extract_cond_operands (data, stmt, &var_p, &bound_p, &var_iv, NULL))
1254     {
1255       find_interesting_uses_op (data, *var_p);
1256       find_interesting_uses_op (data, *bound_p);
1257       return;
1258     }
1259
1260   civ = XNEW (struct iv);
1261   *civ = *var_iv;
1262   record_use (data, NULL, civ, stmt, USE_COMPARE);
1263 }
1264
1265 /* Returns true if expression EXPR is obviously invariant in LOOP,
1266    i.e. if all its operands are defined outside of the LOOP.  LOOP
1267    should not be the function body.  */
1268
1269 bool
1270 expr_invariant_in_loop_p (struct loop *loop, tree expr)
1271 {
1272   basic_block def_bb;
1273   unsigned i, len;
1274
1275   gcc_assert (loop_depth (loop) > 0);
1276
1277   if (is_gimple_min_invariant (expr))
1278     return true;
1279
1280   if (TREE_CODE (expr) == SSA_NAME)
1281     {
1282       def_bb = gimple_bb (SSA_NAME_DEF_STMT (expr));
1283       if (def_bb
1284           && flow_bb_inside_loop_p (loop, def_bb))
1285         return false;
1286
1287       return true;
1288     }
1289
1290   if (!EXPR_P (expr))
1291     return false;
1292
1293   len = TREE_OPERAND_LENGTH (expr);
1294   for (i = 0; i < len; i++)
1295     if (!expr_invariant_in_loop_p (loop, TREE_OPERAND (expr, i)))
1296       return false;
1297
1298   return true;
1299 }
1300
1301 /* Returns true if statement STMT is obviously invariant in LOOP,
1302    i.e. if all its operands on the RHS are defined outside of the LOOP.
1303    LOOP should not be the function body.  */
1304
1305 bool
1306 stmt_invariant_in_loop_p (struct loop *loop, gimple stmt)
1307 {
1308   unsigned i;
1309   tree lhs;
1310
1311   gcc_assert (loop_depth (loop) > 0);
1312
1313   lhs = gimple_get_lhs (stmt);
1314   for (i = 0; i < gimple_num_ops (stmt); i++)
1315     {
1316       tree op = gimple_op (stmt, i);
1317       if (op != lhs && !expr_invariant_in_loop_p (loop, op))
1318         return false;
1319     }
1320
1321   return true;
1322 }
1323
1324 /* Cumulates the steps of indices into DATA and replaces their values with the
1325    initial ones.  Returns false when the value of the index cannot be determined.
1326    Callback for for_each_index.  */
1327
1328 struct ifs_ivopts_data
1329 {
1330   struct ivopts_data *ivopts_data;
1331   gimple stmt;
1332   tree step;
1333 };
1334
1335 static bool
1336 idx_find_step (tree base, tree *idx, void *data)
1337 {
1338   struct ifs_ivopts_data *dta = (struct ifs_ivopts_data *) data;
1339   struct iv *iv;
1340   tree step, iv_base, iv_step, lbound, off;
1341   struct loop *loop = dta->ivopts_data->current_loop;
1342
1343   if (TREE_CODE (base) == MISALIGNED_INDIRECT_REF
1344       || TREE_CODE (base) == ALIGN_INDIRECT_REF)
1345     return false;
1346
1347   /* If base is a component ref, require that the offset of the reference
1348      be invariant.  */
1349   if (TREE_CODE (base) == COMPONENT_REF)
1350     {
1351       off = component_ref_field_offset (base);
1352       return expr_invariant_in_loop_p (loop, off);
1353     }
1354
1355   /* If base is array, first check whether we will be able to move the
1356      reference out of the loop (in order to take its address in strength
1357      reduction).  In order for this to work we need both lower bound
1358      and step to be loop invariants.  */
1359   if (TREE_CODE (base) == ARRAY_REF || TREE_CODE (base) == ARRAY_RANGE_REF)
1360     {
1361       /* Moreover, for a range, the size needs to be invariant as well.  */
1362       if (TREE_CODE (base) == ARRAY_RANGE_REF
1363           && !expr_invariant_in_loop_p (loop, TYPE_SIZE (TREE_TYPE (base))))
1364         return false;
1365
1366       step = array_ref_element_size (base);
1367       lbound = array_ref_low_bound (base);
1368
1369       if (!expr_invariant_in_loop_p (loop, step)
1370           || !expr_invariant_in_loop_p (loop, lbound))
1371         return false;
1372     }
1373
1374   if (TREE_CODE (*idx) != SSA_NAME)
1375     return true;
1376
1377   iv = get_iv (dta->ivopts_data, *idx);
1378   if (!iv)
1379     return false;
1380
1381   /* XXX  We produce for a base of *D42 with iv->base being &x[0]
1382           *&x[0], which is not folded and does not trigger the
1383           ARRAY_REF path below.  */
1384   *idx = iv->base;
1385
1386   if (integer_zerop (iv->step))
1387     return true;
1388
1389   if (TREE_CODE (base) == ARRAY_REF || TREE_CODE (base) == ARRAY_RANGE_REF)
1390     {
1391       step = array_ref_element_size (base);
1392
1393       /* We only handle addresses whose step is an integer constant.  */
1394       if (TREE_CODE (step) != INTEGER_CST)
1395         return false;
1396     }
1397   else
1398     /* The step for pointer arithmetics already is 1 byte.  */
1399     step = build_int_cst (sizetype, 1);
1400
1401   iv_base = iv->base;
1402   iv_step = iv->step;
1403   if (!convert_affine_scev (dta->ivopts_data->current_loop,
1404                             sizetype, &iv_base, &iv_step, dta->stmt,
1405                             false))
1406     {
1407       /* The index might wrap.  */
1408       return false;
1409     }
1410
1411   step = fold_build2 (MULT_EXPR, sizetype, step, iv_step);
1412   dta->step = fold_build2 (PLUS_EXPR, sizetype, dta->step, step);
1413
1414   return true;
1415 }
1416
1417 /* Records use in index IDX.  Callback for for_each_index.  Ivopts data
1418    object is passed to it in DATA.  */
1419
1420 static bool
1421 idx_record_use (tree base, tree *idx,
1422                 void *vdata)
1423 {
1424   struct ivopts_data *data = (struct ivopts_data *) vdata;
1425   find_interesting_uses_op (data, *idx);
1426   if (TREE_CODE (base) == ARRAY_REF || TREE_CODE (base) == ARRAY_RANGE_REF)
1427     {
1428       find_interesting_uses_op (data, array_ref_element_size (base));
1429       find_interesting_uses_op (data, array_ref_low_bound (base));
1430     }
1431   return true;
1432 }
1433
1434 /* If we can prove that TOP = cst * BOT for some constant cst,
1435    store cst to MUL and return true.  Otherwise return false.
1436    The returned value is always sign-extended, regardless of the
1437    signedness of TOP and BOT.  */
1438
1439 static bool
1440 constant_multiple_of (tree top, tree bot, double_int *mul)
1441 {
1442   tree mby;
1443   enum tree_code code;
1444   double_int res, p0, p1;
1445   unsigned precision = TYPE_PRECISION (TREE_TYPE (top));
1446
1447   STRIP_NOPS (top);
1448   STRIP_NOPS (bot);
1449
1450   if (operand_equal_p (top, bot, 0))
1451     {
1452       *mul = double_int_one;
1453       return true;
1454     }
1455
1456   code = TREE_CODE (top);
1457   switch (code)
1458     {
1459     case MULT_EXPR:
1460       mby = TREE_OPERAND (top, 1);
1461       if (TREE_CODE (mby) != INTEGER_CST)
1462         return false;
1463
1464       if (!constant_multiple_of (TREE_OPERAND (top, 0), bot, &res))
1465         return false;
1466
1467       *mul = double_int_sext (double_int_mul (res, tree_to_double_int (mby)),
1468                               precision);
1469       return true;
1470
1471     case PLUS_EXPR:
1472     case MINUS_EXPR:
1473       if (!constant_multiple_of (TREE_OPERAND (top, 0), bot, &p0)
1474           || !constant_multiple_of (TREE_OPERAND (top, 1), bot, &p1))
1475         return false;
1476
1477       if (code == MINUS_EXPR)
1478         p1 = double_int_neg (p1);
1479       *mul = double_int_sext (double_int_add (p0, p1), precision);
1480       return true;
1481
1482     case INTEGER_CST:
1483       if (TREE_CODE (bot) != INTEGER_CST)
1484         return false;
1485
1486       p0 = double_int_sext (tree_to_double_int (top), precision);
1487       p1 = double_int_sext (tree_to_double_int (bot), precision);
1488       if (double_int_zero_p (p1))
1489         return false;
1490       *mul = double_int_sext (double_int_sdivmod (p0, p1, FLOOR_DIV_EXPR, &res),
1491                               precision);
1492       return double_int_zero_p (res);
1493
1494     default:
1495       return false;
1496     }
1497 }
1498
1499 /* Returns true if memory reference REF with step STEP may be unaligned.  */
1500
1501 static bool
1502 may_be_unaligned_p (tree ref, tree step)
1503 {
1504   tree base;
1505   tree base_type;
1506   HOST_WIDE_INT bitsize;
1507   HOST_WIDE_INT bitpos;
1508   tree toffset;
1509   enum machine_mode mode;
1510   int unsignedp, volatilep;
1511   unsigned base_align;
1512
1513   /* TARGET_MEM_REFs are translated directly to valid MEMs on the target,
1514      thus they are not misaligned.  */
1515   if (TREE_CODE (ref) == TARGET_MEM_REF)
1516     return false;
1517
1518   /* The test below is basically copy of what expr.c:normal_inner_ref
1519      does to check whether the object must be loaded by parts when
1520      STRICT_ALIGNMENT is true.  */
1521   base = get_inner_reference (ref, &bitsize, &bitpos, &toffset, &mode,
1522                               &unsignedp, &volatilep, true);
1523   base_type = TREE_TYPE (base);
1524   base_align = TYPE_ALIGN (base_type);
1525
1526   if (mode != BLKmode)
1527     {
1528       double_int mul;
1529       tree al = build_int_cst (TREE_TYPE (step),
1530                                GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT);
1531
1532       if (base_align < GET_MODE_ALIGNMENT (mode)
1533           || bitpos % GET_MODE_ALIGNMENT (mode) != 0
1534           || bitpos % BITS_PER_UNIT != 0)
1535         return true;
1536     
1537       if (!constant_multiple_of (step, al, &mul))
1538         return true;
1539     }
1540
1541   return false;
1542 }
1543
1544 /* Return true if EXPR may be non-addressable.   */
1545
1546 static bool
1547 may_be_nonaddressable_p (tree expr)
1548 {
1549   switch (TREE_CODE (expr))
1550     {
1551     case TARGET_MEM_REF:
1552       /* TARGET_MEM_REFs are translated directly to valid MEMs on the
1553          target, thus they are always addressable.  */
1554       return false;
1555
1556     case COMPONENT_REF:
1557       return DECL_NONADDRESSABLE_P (TREE_OPERAND (expr, 1))
1558              || may_be_nonaddressable_p (TREE_OPERAND (expr, 0));
1559
1560     case VIEW_CONVERT_EXPR:
1561       /* This kind of view-conversions may wrap non-addressable objects
1562          and make them look addressable.  After some processing the
1563          non-addressability may be uncovered again, causing ADDR_EXPRs
1564          of inappropriate objects to be built.  */
1565       if (is_gimple_reg (TREE_OPERAND (expr, 0))
1566           || !is_gimple_addressable (TREE_OPERAND (expr, 0)))
1567         return true;
1568
1569       /* ... fall through ... */
1570
1571     case ARRAY_REF:
1572     case ARRAY_RANGE_REF:
1573       return may_be_nonaddressable_p (TREE_OPERAND (expr, 0));
1574
1575     CASE_CONVERT:
1576       return true;
1577
1578     default:
1579       break;
1580     }
1581
1582   return false;
1583 }
1584
1585 /* Finds addresses in *OP_P inside STMT.  */
1586
1587 static void
1588 find_interesting_uses_address (struct ivopts_data *data, gimple stmt, tree *op_p)
1589 {
1590   tree base = *op_p, step = build_int_cst (sizetype, 0);
1591   struct iv *civ;
1592   struct ifs_ivopts_data ifs_ivopts_data;
1593
1594   /* Do not play with volatile memory references.  A bit too conservative,
1595      perhaps, but safe.  */
1596   if (gimple_has_volatile_ops (stmt))
1597     goto fail;
1598
1599   /* Ignore bitfields for now.  Not really something terribly complicated
1600      to handle.  TODO.  */
1601   if (TREE_CODE (base) == BIT_FIELD_REF)
1602     goto fail;
1603
1604   base = unshare_expr (base);
1605
1606   if (TREE_CODE (base) == TARGET_MEM_REF)
1607     {
1608       tree type = build_pointer_type (TREE_TYPE (base));
1609       tree astep;
1610
1611       if (TMR_BASE (base)
1612           && TREE_CODE (TMR_BASE (base)) == SSA_NAME)
1613         {
1614           civ = get_iv (data, TMR_BASE (base));
1615           if (!civ)
1616             goto fail;
1617
1618           TMR_BASE (base) = civ->base;
1619           step = civ->step;
1620         }
1621       if (TMR_INDEX (base)
1622           && TREE_CODE (TMR_INDEX (base)) == SSA_NAME)
1623         {
1624           civ = get_iv (data, TMR_INDEX (base));
1625           if (!civ)
1626             goto fail;
1627
1628           TMR_INDEX (base) = civ->base;
1629           astep = civ->step;
1630
1631           if (astep)
1632             {
1633               if (TMR_STEP (base))
1634                 astep = fold_build2 (MULT_EXPR, type, TMR_STEP (base), astep);
1635
1636               step = fold_build2 (PLUS_EXPR, type, step, astep);
1637             }
1638         }
1639
1640       if (integer_zerop (step))
1641         goto fail;
1642       base = tree_mem_ref_addr (type, base);
1643     }
1644   else
1645     {
1646       ifs_ivopts_data.ivopts_data = data;
1647       ifs_ivopts_data.stmt = stmt;
1648       ifs_ivopts_data.step = build_int_cst (sizetype, 0);
1649       if (!for_each_index (&base, idx_find_step, &ifs_ivopts_data)
1650           || integer_zerop (ifs_ivopts_data.step))
1651         goto fail;
1652       step = ifs_ivopts_data.step;
1653
1654       gcc_assert (TREE_CODE (base) != ALIGN_INDIRECT_REF);
1655       gcc_assert (TREE_CODE (base) != MISALIGNED_INDIRECT_REF);
1656
1657       /* Check that the base expression is addressable.  This needs
1658          to be done after substituting bases of IVs into it.  */
1659       if (may_be_nonaddressable_p (base))
1660         goto fail;
1661
1662       /* Moreover, on strict alignment platforms, check that it is
1663          sufficiently aligned.  */
1664       if (STRICT_ALIGNMENT && may_be_unaligned_p (base, step))
1665         goto fail;
1666
1667       base = build_fold_addr_expr (base);
1668
1669       /* Substituting bases of IVs into the base expression might
1670          have caused folding opportunities.  */
1671       if (TREE_CODE (base) == ADDR_EXPR)
1672         {
1673           tree *ref = &TREE_OPERAND (base, 0);
1674           while (handled_component_p (*ref))
1675             ref = &TREE_OPERAND (*ref, 0);
1676           if (TREE_CODE (*ref) == INDIRECT_REF)
1677             *ref = fold_indirect_ref (*ref);
1678         }
1679     }
1680
1681   civ = alloc_iv (base, step);
1682   record_use (data, op_p, civ, stmt, USE_ADDRESS);
1683   return;
1684
1685 fail:
1686   for_each_index (op_p, idx_record_use, data);
1687 }
1688
1689 /* Finds and records invariants used in STMT.  */
1690
1691 static void
1692 find_invariants_stmt (struct ivopts_data *data, gimple stmt)
1693 {
1694   ssa_op_iter iter;
1695   use_operand_p use_p;
1696   tree op;
1697
1698   FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_USE)
1699     {
1700       op = USE_FROM_PTR (use_p);
1701       record_invariant (data, op, false);
1702     }
1703 }
1704
1705 /* Finds interesting uses of induction variables in the statement STMT.  */
1706
1707 static void
1708 find_interesting_uses_stmt (struct ivopts_data *data, gimple stmt)
1709 {
1710   struct iv *iv;
1711   tree op, *lhs, *rhs;
1712   ssa_op_iter iter;
1713   use_operand_p use_p;
1714   enum tree_code code;
1715
1716   find_invariants_stmt (data, stmt);
1717
1718   if (gimple_code (stmt) == GIMPLE_COND)
1719     {
1720       find_interesting_uses_cond (data, stmt);
1721       return;
1722     }
1723
1724   if (is_gimple_assign (stmt))
1725     {
1726       lhs = gimple_assign_lhs_ptr (stmt);
1727       rhs = gimple_assign_rhs1_ptr (stmt);
1728
1729       if (TREE_CODE (*lhs) == SSA_NAME)
1730         {
1731           /* If the statement defines an induction variable, the uses are not
1732              interesting by themselves.  */
1733
1734           iv = get_iv (data, *lhs);
1735
1736           if (iv && !integer_zerop (iv->step))
1737             return;
1738         }
1739
1740       code = gimple_assign_rhs_code (stmt);
1741       if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS
1742           && (REFERENCE_CLASS_P (*rhs)
1743               || is_gimple_val (*rhs)))
1744         {
1745           if (REFERENCE_CLASS_P (*rhs))
1746             find_interesting_uses_address (data, stmt, rhs);
1747           else
1748             find_interesting_uses_op (data, *rhs);
1749
1750           if (REFERENCE_CLASS_P (*lhs))
1751             find_interesting_uses_address (data, stmt, lhs);
1752           return;
1753         }
1754       else if (TREE_CODE_CLASS (code) == tcc_comparison)
1755         {
1756           find_interesting_uses_cond (data, stmt);
1757           return;
1758         }
1759
1760       /* TODO -- we should also handle address uses of type
1761
1762          memory = call (whatever);
1763
1764          and
1765
1766          call (memory).  */
1767     }
1768
1769   if (gimple_code (stmt) == GIMPLE_PHI
1770       && gimple_bb (stmt) == data->current_loop->header)
1771     {
1772       iv = get_iv (data, PHI_RESULT (stmt));
1773
1774       if (iv && !integer_zerop (iv->step))
1775         return;
1776     }
1777
1778   FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_USE)
1779     {
1780       op = USE_FROM_PTR (use_p);
1781
1782       if (TREE_CODE (op) != SSA_NAME)
1783         continue;
1784
1785       iv = get_iv (data, op);
1786       if (!iv)
1787         continue;
1788
1789       find_interesting_uses_op (data, op);
1790     }
1791 }
1792
1793 /* Finds interesting uses of induction variables outside of loops
1794    on loop exit edge EXIT.  */
1795
1796 static void
1797 find_interesting_uses_outside (struct ivopts_data *data, edge exit)
1798 {
1799   gimple phi;
1800   gimple_stmt_iterator psi;
1801   tree def;
1802
1803   for (psi = gsi_start_phis (exit->dest); !gsi_end_p (psi); gsi_next (&psi))
1804     {
1805       phi = gsi_stmt (psi);
1806       def = PHI_ARG_DEF_FROM_EDGE (phi, exit);
1807       if (is_gimple_reg (def))
1808         find_interesting_uses_op (data, def);
1809     }
1810 }
1811
1812 /* Finds uses of the induction variables that are interesting.  */
1813
1814 static void
1815 find_interesting_uses (struct ivopts_data *data)
1816 {
1817   basic_block bb;
1818   gimple_stmt_iterator bsi;
1819   basic_block *body = get_loop_body (data->current_loop);
1820   unsigned i;
1821   struct version_info *info;
1822   edge e;
1823
1824   if (dump_file && (dump_flags & TDF_DETAILS))
1825     fprintf (dump_file, "Uses:\n\n");
1826
1827   for (i = 0; i < data->current_loop->num_nodes; i++)
1828     {
1829       edge_iterator ei;
1830       bb = body[i];
1831
1832       FOR_EACH_EDGE (e, ei, bb->succs)
1833         if (e->dest != EXIT_BLOCK_PTR
1834             && !flow_bb_inside_loop_p (data->current_loop, e->dest))
1835           find_interesting_uses_outside (data, e);
1836
1837       for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1838         find_interesting_uses_stmt (data, gsi_stmt (bsi));
1839       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1840         find_interesting_uses_stmt (data, gsi_stmt (bsi));
1841     }
1842
1843   if (dump_file && (dump_flags & TDF_DETAILS))
1844     {
1845       bitmap_iterator bi;
1846
1847       fprintf (dump_file, "\n");
1848
1849       EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, i, bi)
1850         {
1851           info = ver_info (data, i);
1852           if (info->inv_id)
1853             {
1854               fprintf (dump_file, "  ");
1855               print_generic_expr (dump_file, info->name, TDF_SLIM);
1856               fprintf (dump_file, " is invariant (%d)%s\n",
1857                        info->inv_id, info->has_nonlin_use ? "" : ", eliminable");
1858             }
1859         }
1860
1861       fprintf (dump_file, "\n");
1862     }
1863
1864   free (body);
1865 }
1866
1867 /* Strips constant offsets from EXPR and stores them to OFFSET.  If INSIDE_ADDR
1868    is true, assume we are inside an address.  If TOP_COMPREF is true, assume
1869    we are at the top-level of the processed address.  */
1870
1871 static tree
1872 strip_offset_1 (tree expr, bool inside_addr, bool top_compref,
1873                 unsigned HOST_WIDE_INT *offset)
1874 {
1875   tree op0 = NULL_TREE, op1 = NULL_TREE, tmp, step;
1876   enum tree_code code;
1877   tree type, orig_type = TREE_TYPE (expr);
1878   unsigned HOST_WIDE_INT off0, off1, st;
1879   tree orig_expr = expr;
1880
1881   STRIP_NOPS (expr);
1882
1883   type = TREE_TYPE (expr);
1884   code = TREE_CODE (expr);
1885   *offset = 0;
1886
1887   switch (code)
1888     {
1889     case INTEGER_CST:
1890       if (!cst_and_fits_in_hwi (expr)
1891           || integer_zerop (expr))
1892         return orig_expr;
1893
1894       *offset = int_cst_value (expr);
1895       return build_int_cst (orig_type, 0);
1896
1897     case POINTER_PLUS_EXPR:
1898     case PLUS_EXPR:
1899     case MINUS_EXPR:
1900       op0 = TREE_OPERAND (expr, 0);
1901       op1 = TREE_OPERAND (expr, 1);
1902
1903       op0 = strip_offset_1 (op0, false, false, &off0);
1904       op1 = strip_offset_1 (op1, false, false, &off1);
1905
1906       *offset = (code == MINUS_EXPR ? off0 - off1 : off0 + off1);
1907       if (op0 == TREE_OPERAND (expr, 0)
1908           && op1 == TREE_OPERAND (expr, 1))
1909         return orig_expr;
1910
1911       if (integer_zerop (op1))
1912         expr = op0;
1913       else if (integer_zerop (op0))
1914         {
1915           if (code == MINUS_EXPR)
1916             expr = fold_build1 (NEGATE_EXPR, type, op1);
1917           else
1918             expr = op1;
1919         }
1920       else
1921         expr = fold_build2 (code, type, op0, op1);
1922
1923       return fold_convert (orig_type, expr);
1924
1925     case ARRAY_REF:
1926     case ARRAY_RANGE_REF:
1927       if (!inside_addr)
1928         return orig_expr;
1929
1930       step = array_ref_element_size (expr);
1931       if (!cst_and_fits_in_hwi (step))
1932         break;
1933
1934       st = int_cst_value (step);
1935       op1 = TREE_OPERAND (expr, 1);
1936       op1 = strip_offset_1 (op1, false, false, &off1);
1937       *offset = off1 * st;
1938
1939       if (top_compref
1940           && integer_zerop (op1))
1941         {
1942           /* Strip the component reference completely.  */
1943           op0 = TREE_OPERAND (expr, 0);
1944           op0 = strip_offset_1 (op0, inside_addr, top_compref, &off0);
1945           *offset += off0;
1946           return op0;
1947         }
1948       break;
1949
1950     case COMPONENT_REF:
1951       if (!inside_addr)
1952         return orig_expr;
1953
1954       tmp = component_ref_field_offset (expr);
1955       if (top_compref
1956           && cst_and_fits_in_hwi (tmp))
1957         {
1958           /* Strip the component reference completely.  */
1959           op0 = TREE_OPERAND (expr, 0);
1960           op0 = strip_offset_1 (op0, inside_addr, top_compref, &off0);
1961           *offset = off0 + int_cst_value (tmp);
1962           return op0;
1963         }
1964       break;
1965
1966     case ADDR_EXPR:
1967       op0 = TREE_OPERAND (expr, 0);
1968       op0 = strip_offset_1 (op0, true, true, &off0);
1969       *offset += off0;
1970
1971       if (op0 == TREE_OPERAND (expr, 0))
1972         return orig_expr;
1973
1974       expr = build_fold_addr_expr (op0);
1975       return fold_convert (orig_type, expr);
1976
1977     case INDIRECT_REF:
1978       inside_addr = false;
1979       break;
1980
1981     default:
1982       return orig_expr;
1983     }
1984
1985   /* Default handling of expressions for that we want to recurse into
1986      the first operand.  */
1987   op0 = TREE_OPERAND (expr, 0);
1988   op0 = strip_offset_1 (op0, inside_addr, false, &off0);
1989   *offset += off0;
1990
1991   if (op0 == TREE_OPERAND (expr, 0)
1992       && (!op1 || op1 == TREE_OPERAND (expr, 1)))
1993     return orig_expr;
1994
1995   expr = copy_node (expr);
1996   TREE_OPERAND (expr, 0) = op0;
1997   if (op1)
1998     TREE_OPERAND (expr, 1) = op1;
1999
2000   /* Inside address, we might strip the top level component references,
2001      thus changing type of the expression.  Handling of ADDR_EXPR
2002      will fix that.  */
2003   expr = fold_convert (orig_type, expr);
2004
2005   return expr;
2006 }
2007
2008 /* Strips constant offsets from EXPR and stores them to OFFSET.  */
2009
2010 static tree
2011 strip_offset (tree expr, unsigned HOST_WIDE_INT *offset)
2012 {
2013   return strip_offset_1 (expr, false, false, offset);
2014 }
2015
2016 /* Returns variant of TYPE that can be used as base for different uses.
2017    We return unsigned type with the same precision, which avoids problems
2018    with overflows.  */
2019
2020 static tree
2021 generic_type_for (tree type)
2022 {
2023   if (POINTER_TYPE_P (type))
2024     return unsigned_type_for (type);
2025
2026   if (TYPE_UNSIGNED (type))
2027     return type;
2028
2029   return unsigned_type_for (type);
2030 }
2031
2032 /* Records invariants in *EXPR_P.  Callback for walk_tree.  DATA contains
2033    the bitmap to that we should store it.  */
2034
2035 static struct ivopts_data *fd_ivopts_data;
2036 static tree
2037 find_depends (tree *expr_p, int *ws ATTRIBUTE_UNUSED, void *data)
2038 {
2039   bitmap *depends_on = (bitmap *) data;
2040   struct version_info *info;
2041
2042   if (TREE_CODE (*expr_p) != SSA_NAME)
2043     return NULL_TREE;
2044   info = name_info (fd_ivopts_data, *expr_p);
2045
2046   if (!info->inv_id || info->has_nonlin_use)
2047     return NULL_TREE;
2048
2049   if (!*depends_on)
2050     *depends_on = BITMAP_ALLOC (NULL);
2051   bitmap_set_bit (*depends_on, info->inv_id);
2052
2053   return NULL_TREE;
2054 }
2055
2056 /* Adds a candidate BASE + STEP * i.  Important field is set to IMPORTANT and
2057    position to POS.  If USE is not NULL, the candidate is set as related to
2058    it.  If both BASE and STEP are NULL, we add a pseudocandidate for the
2059    replacement of the final value of the iv by a direct computation.  */
2060
2061 static struct iv_cand *
2062 add_candidate_1 (struct ivopts_data *data,
2063                  tree base, tree step, bool important, enum iv_position pos,
2064                  struct iv_use *use, gimple incremented_at)
2065 {
2066   unsigned i;
2067   struct iv_cand *cand = NULL;
2068   tree type, orig_type;
2069   
2070   if (base)
2071     {
2072       orig_type = TREE_TYPE (base);
2073       type = generic_type_for (orig_type);
2074       /* Don't convert the base to the generic type for pointers as the generic
2075          type is an integer type with the same size as the pointer type.  */
2076       if (type != orig_type && !POINTER_TYPE_P (orig_type))
2077         {
2078           base = fold_convert (type, base);
2079           step = fold_convert (type, step);
2080         }
2081     }
2082
2083   for (i = 0; i < n_iv_cands (data); i++)
2084     {
2085       cand = iv_cand (data, i);
2086
2087       if (cand->pos != pos)
2088         continue;
2089
2090       if (cand->incremented_at != incremented_at)
2091         continue;
2092
2093       if (!cand->iv)
2094         {
2095           if (!base && !step)
2096             break;
2097
2098           continue;
2099         }
2100
2101       if (!base && !step)
2102         continue;
2103
2104       if (operand_equal_p (base, cand->iv->base, 0)
2105           && operand_equal_p (step, cand->iv->step, 0))
2106         break;
2107     }
2108
2109   if (i == n_iv_cands (data))
2110     {
2111       cand = XCNEW (struct iv_cand);
2112       cand->id = i;
2113
2114       if (!base && !step)
2115         cand->iv = NULL;
2116       else
2117         cand->iv = alloc_iv (base, step);
2118
2119       cand->pos = pos;
2120       if (pos != IP_ORIGINAL && cand->iv)
2121         {
2122           cand->var_before = create_tmp_var_raw (TREE_TYPE (base), "ivtmp");
2123           cand->var_after = cand->var_before;
2124         }
2125       cand->important = important;
2126       cand->incremented_at = incremented_at;
2127       VEC_safe_push (iv_cand_p, heap, data->iv_candidates, cand);
2128
2129       if (step
2130           && TREE_CODE (step) != INTEGER_CST)
2131         {
2132           fd_ivopts_data = data;
2133           walk_tree (&step, find_depends, &cand->depends_on, NULL);
2134         }
2135
2136       if (dump_file && (dump_flags & TDF_DETAILS))
2137         dump_cand (dump_file, cand);
2138     }
2139
2140   if (important && !cand->important)
2141     {
2142       cand->important = true;
2143       if (dump_file && (dump_flags & TDF_DETAILS))
2144         fprintf (dump_file, "Candidate %d is important\n", cand->id);
2145     }
2146
2147   if (use)
2148     {
2149       bitmap_set_bit (use->related_cands, i);
2150       if (dump_file && (dump_flags & TDF_DETAILS))
2151         fprintf (dump_file, "Candidate %d is related to use %d\n",
2152                  cand->id, use->id);
2153     }
2154
2155   return cand;
2156 }
2157
2158 /* Returns true if incrementing the induction variable at the end of the LOOP
2159    is allowed.
2160
2161    The purpose is to avoid splitting latch edge with a biv increment, thus
2162    creating a jump, possibly confusing other optimization passes and leaving
2163    less freedom to scheduler.  So we allow IP_END_POS only if IP_NORMAL_POS
2164    is not available (so we do not have a better alternative), or if the latch
2165    edge is already nonempty.  */
2166
2167 static bool
2168 allow_ip_end_pos_p (struct loop *loop)
2169 {
2170   if (!ip_normal_pos (loop))
2171     return true;
2172
2173   if (!empty_block_p (ip_end_pos (loop)))
2174     return true;
2175
2176   return false;
2177 }
2178
2179 /* Adds a candidate BASE + STEP * i.  Important field is set to IMPORTANT and
2180    position to POS.  If USE is not NULL, the candidate is set as related to
2181    it.  The candidate computation is scheduled on all available positions.  */
2182
2183 static void
2184 add_candidate (struct ivopts_data *data, 
2185                tree base, tree step, bool important, struct iv_use *use)
2186 {
2187   if (ip_normal_pos (data->current_loop))
2188     add_candidate_1 (data, base, step, important, IP_NORMAL, use, NULL);
2189   if (ip_end_pos (data->current_loop)
2190       && allow_ip_end_pos_p (data->current_loop))
2191     add_candidate_1 (data, base, step, important, IP_END, use, NULL);
2192 }
2193
2194 /* Add a standard "0 + 1 * iteration" iv candidate for a
2195    type with SIZE bits.  */
2196
2197 static void
2198 add_standard_iv_candidates_for_size (struct ivopts_data *data,
2199                                      unsigned int size)
2200 {
2201   tree type = lang_hooks.types.type_for_size (size, true);
2202   add_candidate (data, build_int_cst (type, 0), build_int_cst (type, 1),
2203                  true, NULL);
2204 }
2205
2206 /* Adds standard iv candidates.  */
2207
2208 static void
2209 add_standard_iv_candidates (struct ivopts_data *data)
2210 {
2211   add_standard_iv_candidates_for_size (data, INT_TYPE_SIZE);
2212
2213   /* The same for a double-integer type if it is still fast enough.  */
2214   if (BITS_PER_WORD >= INT_TYPE_SIZE * 2)
2215     add_standard_iv_candidates_for_size (data, INT_TYPE_SIZE * 2);
2216 }
2217
2218
2219 /* Adds candidates bases on the old induction variable IV.  */
2220
2221 static void
2222 add_old_iv_candidates (struct ivopts_data *data, struct iv *iv)
2223 {
2224   gimple phi;
2225   tree def;
2226   struct iv_cand *cand;
2227
2228   add_candidate (data, iv->base, iv->step, true, NULL);
2229
2230   /* The same, but with initial value zero.  */
2231   if (POINTER_TYPE_P (TREE_TYPE (iv->base)))
2232     add_candidate (data, size_int (0), iv->step, true, NULL);
2233   else
2234     add_candidate (data, build_int_cst (TREE_TYPE (iv->base), 0),
2235                    iv->step, true, NULL);
2236
2237   phi = SSA_NAME_DEF_STMT (iv->ssa_name);
2238   if (gimple_code (phi) == GIMPLE_PHI)
2239     {
2240       /* Additionally record the possibility of leaving the original iv
2241          untouched.  */
2242       def = PHI_ARG_DEF_FROM_EDGE (phi, loop_latch_edge (data->current_loop));
2243       cand = add_candidate_1 (data,
2244                               iv->base, iv->step, true, IP_ORIGINAL, NULL,
2245                               SSA_NAME_DEF_STMT (def));
2246       cand->var_before = iv->ssa_name;
2247       cand->var_after = def;
2248     }
2249 }
2250
2251 /* Adds candidates based on the old induction variables.  */
2252
2253 static void
2254 add_old_ivs_candidates (struct ivopts_data *data)
2255 {
2256   unsigned i;
2257   struct iv *iv;
2258   bitmap_iterator bi;
2259
2260   EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, i, bi)
2261     {
2262       iv = ver_info (data, i)->iv;
2263       if (iv && iv->biv_p && !integer_zerop (iv->step))
2264         add_old_iv_candidates (data, iv);
2265     }
2266 }
2267
2268 /* Adds candidates based on the value of the induction variable IV and USE.  */
2269
2270 static void
2271 add_iv_value_candidates (struct ivopts_data *data,
2272                          struct iv *iv, struct iv_use *use)
2273 {
2274   unsigned HOST_WIDE_INT offset;
2275   tree base;
2276   tree basetype;
2277
2278   add_candidate (data, iv->base, iv->step, false, use);
2279
2280   /* The same, but with initial value zero.  Make such variable important,
2281      since it is generic enough so that possibly many uses may be based
2282      on it.  */
2283   basetype = TREE_TYPE (iv->base);
2284   if (POINTER_TYPE_P (basetype))
2285     basetype = sizetype;
2286   add_candidate (data, build_int_cst (basetype, 0),
2287                  iv->step, true, use);
2288
2289   /* Third, try removing the constant offset.  Make sure to even
2290      add a candidate for &a[0] vs. (T *)&a.  */
2291   base = strip_offset (iv->base, &offset);
2292   if (offset
2293       || base != iv->base)
2294     add_candidate (data, base, iv->step, false, use);
2295 }
2296
2297 /* Adds candidates based on the uses.  */
2298
2299 static void
2300 add_derived_ivs_candidates (struct ivopts_data *data)
2301 {
2302   unsigned i;
2303
2304   for (i = 0; i < n_iv_uses (data); i++)
2305     {
2306       struct iv_use *use = iv_use (data, i);
2307
2308       if (!use)
2309         continue;
2310
2311       switch (use->type)
2312         {
2313         case USE_NONLINEAR_EXPR:
2314         case USE_COMPARE:
2315         case USE_ADDRESS:
2316           /* Just add the ivs based on the value of the iv used here.  */
2317           add_iv_value_candidates (data, use->iv, use);
2318           break;
2319
2320         default:
2321           gcc_unreachable ();
2322         }
2323     }
2324 }
2325
2326 /* Record important candidates and add them to related_cands bitmaps
2327    if needed.  */
2328
2329 static void
2330 record_important_candidates (struct ivopts_data *data)
2331 {
2332   unsigned i;
2333   struct iv_use *use;
2334
2335   for (i = 0; i < n_iv_cands (data); i++)
2336     {
2337       struct iv_cand *cand = iv_cand (data, i);
2338
2339       if (cand->important)
2340         bitmap_set_bit (data->important_candidates, i);
2341     }
2342
2343   data->consider_all_candidates = (n_iv_cands (data)
2344                                    <= CONSIDER_ALL_CANDIDATES_BOUND);
2345
2346   if (data->consider_all_candidates)
2347     {
2348       /* We will not need "related_cands" bitmaps in this case,
2349          so release them to decrease peak memory consumption.  */
2350       for (i = 0; i < n_iv_uses (data); i++)
2351         {
2352           use = iv_use (data, i);
2353           BITMAP_FREE (use->related_cands);
2354         }
2355     }
2356   else
2357     {
2358       /* Add important candidates to the related_cands bitmaps.  */
2359       for (i = 0; i < n_iv_uses (data); i++)
2360         bitmap_ior_into (iv_use (data, i)->related_cands,
2361                          data->important_candidates);
2362     }
2363 }
2364
2365 /* Finds the candidates for the induction variables.  */
2366
2367 static void
2368 find_iv_candidates (struct ivopts_data *data)
2369 {
2370   /* Add commonly used ivs.  */
2371   add_standard_iv_candidates (data);
2372
2373   /* Add old induction variables.  */
2374   add_old_ivs_candidates (data);
2375
2376   /* Add induction variables derived from uses.  */
2377   add_derived_ivs_candidates (data);
2378
2379   /* Record the important candidates.  */
2380   record_important_candidates (data);
2381 }
2382
2383 /* Allocates the data structure mapping the (use, candidate) pairs to costs.
2384    If consider_all_candidates is true, we use a two-dimensional array, otherwise
2385    we allocate a simple list to every use.  */
2386
2387 static void
2388 alloc_use_cost_map (struct ivopts_data *data)
2389 {
2390   unsigned i, size, s, j;
2391
2392   for (i = 0; i < n_iv_uses (data); i++)
2393     {
2394       struct iv_use *use = iv_use (data, i);
2395       bitmap_iterator bi;
2396
2397       if (data->consider_all_candidates)
2398         size = n_iv_cands (data);
2399       else
2400         {
2401           s = 0;
2402           EXECUTE_IF_SET_IN_BITMAP (use->related_cands, 0, j, bi)
2403             {
2404               s++;
2405             }
2406
2407           /* Round up to the power of two, so that moduling by it is fast.  */
2408           for (size = 1; size < s; size <<= 1)
2409             continue;
2410         }
2411
2412       use->n_map_members = size;
2413       use->cost_map = XCNEWVEC (struct cost_pair, size);
2414     }
2415 }
2416
2417 /* Returns description of computation cost of expression whose runtime
2418    cost is RUNTIME and complexity corresponds to COMPLEXITY.  */
2419
2420 static comp_cost
2421 new_cost (unsigned runtime, unsigned complexity)
2422 {
2423   comp_cost cost;
2424
2425   cost.cost = runtime;
2426   cost.complexity = complexity;
2427
2428   return cost;
2429 }
2430
2431 /* Adds costs COST1 and COST2.  */
2432
2433 static comp_cost
2434 add_costs (comp_cost cost1, comp_cost cost2)
2435 {
2436   cost1.cost += cost2.cost;
2437   cost1.complexity += cost2.complexity;
2438
2439   return cost1;
2440 }
2441 /* Subtracts costs COST1 and COST2.  */
2442
2443 static comp_cost
2444 sub_costs (comp_cost cost1, comp_cost cost2)
2445 {
2446   cost1.cost -= cost2.cost;
2447   cost1.complexity -= cost2.complexity;
2448
2449   return cost1;
2450 }
2451
2452 /* Returns a negative number if COST1 < COST2, a positive number if
2453    COST1 > COST2, and 0 if COST1 = COST2.  */
2454
2455 static int
2456 compare_costs (comp_cost cost1, comp_cost cost2)
2457 {
2458   if (cost1.cost == cost2.cost)
2459     return cost1.complexity - cost2.complexity;
2460
2461   return cost1.cost - cost2.cost;
2462 }
2463
2464 /* Returns true if COST is infinite.  */
2465
2466 static bool
2467 infinite_cost_p (comp_cost cost)
2468 {
2469   return cost.cost == INFTY;
2470 }
2471
2472 /* Sets cost of (USE, CANDIDATE) pair to COST and record that it depends
2473    on invariants DEPENDS_ON and that the value used in expressing it
2474    is VALUE.*/
2475
2476 static void
2477 set_use_iv_cost (struct ivopts_data *data,
2478                  struct iv_use *use, struct iv_cand *cand,
2479                  comp_cost cost, bitmap depends_on, tree value)
2480 {
2481   unsigned i, s;
2482
2483   if (infinite_cost_p (cost))
2484     {
2485       BITMAP_FREE (depends_on);
2486       return;
2487     }
2488
2489   if (data->consider_all_candidates)
2490     {
2491       use->cost_map[cand->id].cand = cand;
2492       use->cost_map[cand->id].cost = cost;
2493       use->cost_map[cand->id].depends_on = depends_on;
2494       use->cost_map[cand->id].value = value;
2495       return;
2496     }
2497
2498   /* n_map_members is a power of two, so this computes modulo.  */
2499   s = cand->id & (use->n_map_members - 1);
2500   for (i = s; i < use->n_map_members; i++)
2501     if (!use->cost_map[i].cand)
2502       goto found;
2503   for (i = 0; i < s; i++)
2504     if (!use->cost_map[i].cand)
2505       goto found;
2506
2507   gcc_unreachable ();
2508
2509 found:
2510   use->cost_map[i].cand = cand;
2511   use->cost_map[i].cost = cost;
2512   use->cost_map[i].depends_on = depends_on;
2513   use->cost_map[i].value = value;
2514 }
2515
2516 /* Gets cost of (USE, CANDIDATE) pair.  */
2517
2518 static struct cost_pair *
2519 get_use_iv_cost (struct ivopts_data *data, struct iv_use *use,
2520                  struct iv_cand *cand)
2521 {
2522   unsigned i, s;
2523   struct cost_pair *ret;
2524
2525   if (!cand)
2526     return NULL;
2527
2528   if (data->consider_all_candidates)
2529     {
2530       ret = use->cost_map + cand->id;
2531       if (!ret->cand)
2532         return NULL;
2533
2534       return ret;
2535     }
2536       
2537   /* n_map_members is a power of two, so this computes modulo.  */
2538   s = cand->id & (use->n_map_members - 1);
2539   for (i = s; i < use->n_map_members; i++)
2540     if (use->cost_map[i].cand == cand)
2541       return use->cost_map + i;
2542
2543   for (i = 0; i < s; i++)
2544     if (use->cost_map[i].cand == cand)
2545       return use->cost_map + i;
2546
2547   return NULL;
2548 }
2549
2550 /* Returns estimate on cost of computing SEQ.  */
2551
2552 static unsigned
2553 seq_cost (rtx seq, bool speed)
2554 {
2555   unsigned cost = 0;
2556   rtx set;
2557
2558   for (; seq; seq = NEXT_INSN (seq))
2559     {
2560       set = single_set (seq);
2561       if (set)
2562         cost += rtx_cost (set, SET,speed);
2563       else
2564         cost++;
2565     }
2566
2567   return cost;
2568 }
2569
2570 /* Produce DECL_RTL for object obj so it looks like it is stored in memory.  */
2571 static rtx
2572 produce_memory_decl_rtl (tree obj, int *regno)
2573 {
2574   rtx x;
2575   
2576   gcc_assert (obj);
2577   if (TREE_STATIC (obj) || DECL_EXTERNAL (obj))
2578     {
2579       const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (obj));
2580       x = gen_rtx_SYMBOL_REF (Pmode, name);
2581       SET_SYMBOL_REF_DECL (x, obj);
2582       x = gen_rtx_MEM (DECL_MODE (obj), x);
2583       targetm.encode_section_info (obj, x, true);
2584     }
2585   else
2586     {
2587       x = gen_raw_REG (Pmode, (*regno)++);
2588       x = gen_rtx_MEM (DECL_MODE (obj), x);
2589     }
2590
2591   return x;
2592 }
2593
2594 /* Prepares decl_rtl for variables referred in *EXPR_P.  Callback for
2595    walk_tree.  DATA contains the actual fake register number.  */
2596
2597 static tree
2598 prepare_decl_rtl (tree *expr_p, int *ws, void *data)
2599 {
2600   tree obj = NULL_TREE;
2601   rtx x = NULL_RTX;
2602   int *regno = (int *) data;
2603
2604   switch (TREE_CODE (*expr_p))
2605     {
2606     case ADDR_EXPR:
2607       for (expr_p = &TREE_OPERAND (*expr_p, 0);
2608            handled_component_p (*expr_p);
2609            expr_p = &TREE_OPERAND (*expr_p, 0))
2610         continue;
2611       obj = *expr_p;
2612       if (DECL_P (obj) && !DECL_RTL_SET_P (obj))
2613         x = produce_memory_decl_rtl (obj, regno);
2614       break;
2615
2616     case SSA_NAME:
2617       *ws = 0;
2618       obj = SSA_NAME_VAR (*expr_p);
2619       if (!DECL_RTL_SET_P (obj))
2620         x = gen_raw_REG (DECL_MODE (obj), (*regno)++);
2621       break;
2622
2623     case VAR_DECL:
2624     case PARM_DECL:
2625     case RESULT_DECL:
2626       *ws = 0;
2627       obj = *expr_p;
2628
2629       if (DECL_RTL_SET_P (obj))
2630         break;
2631
2632       if (DECL_MODE (obj) == BLKmode)
2633         x = produce_memory_decl_rtl (obj, regno);
2634       else
2635         x = gen_raw_REG (DECL_MODE (obj), (*regno)++);
2636
2637       break;
2638
2639     default:
2640       break;
2641     }
2642
2643   if (x)
2644     {
2645       VEC_safe_push (tree, heap, decl_rtl_to_reset, obj);
2646       SET_DECL_RTL (obj, x);
2647     }
2648
2649   return NULL_TREE;
2650 }
2651
2652 /* Determines cost of the computation of EXPR.  */
2653
2654 static unsigned
2655 computation_cost (tree expr, bool speed)
2656 {
2657   rtx seq, rslt;
2658   tree type = TREE_TYPE (expr);
2659   unsigned cost;
2660   /* Avoid using hard regs in ways which may be unsupported.  */
2661   int regno = LAST_VIRTUAL_REGISTER + 1;
2662   enum function_frequency real_frequency = cfun->function_frequency;
2663
2664   cfun->function_frequency = FUNCTION_FREQUENCY_NORMAL;
2665   crtl->maybe_hot_insn_p = speed;
2666   walk_tree (&expr, prepare_decl_rtl, &regno, NULL);
2667   start_sequence ();
2668   rslt = expand_expr (expr, NULL_RTX, TYPE_MODE (type), EXPAND_NORMAL);
2669   seq = get_insns ();
2670   end_sequence ();
2671   default_rtl_profile ();
2672   cfun->function_frequency = real_frequency;
2673
2674   cost = seq_cost (seq, speed);
2675   if (MEM_P (rslt))
2676     cost += address_cost (XEXP (rslt, 0), TYPE_MODE (type), speed);
2677
2678   return cost;
2679 }
2680
2681 /* Returns variable containing the value of candidate CAND at statement AT.  */
2682
2683 static tree
2684 var_at_stmt (struct loop *loop, struct iv_cand *cand, gimple stmt)
2685 {
2686   if (stmt_after_increment (loop, cand, stmt))
2687     return cand->var_after;
2688   else
2689     return cand->var_before;
2690 }
2691
2692 /* Return the most significant (sign) bit of T.  Similar to tree_int_cst_msb,
2693    but the bit is determined from TYPE_PRECISION, not MODE_BITSIZE.  */
2694
2695 int
2696 tree_int_cst_sign_bit (const_tree t)
2697 {
2698   unsigned bitno = TYPE_PRECISION (TREE_TYPE (t)) - 1;
2699   unsigned HOST_WIDE_INT w;
2700
2701   if (bitno < HOST_BITS_PER_WIDE_INT)
2702     w = TREE_INT_CST_LOW (t);
2703   else
2704     {
2705       w = TREE_INT_CST_HIGH (t);
2706       bitno -= HOST_BITS_PER_WIDE_INT;
2707     }
2708
2709   return (w >> bitno) & 1;
2710 }
2711
2712 /* If A is (TYPE) BA and B is (TYPE) BB, and the types of BA and BB have the
2713    same precision that is at least as wide as the precision of TYPE, stores
2714    BA to A and BB to B, and returns the type of BA.  Otherwise, returns the
2715    type of A and B.  */
2716
2717 static tree
2718 determine_common_wider_type (tree *a, tree *b)
2719 {
2720   tree wider_type = NULL;
2721   tree suba, subb;
2722   tree atype = TREE_TYPE (*a);
2723
2724   if (CONVERT_EXPR_P (*a))
2725     {
2726       suba = TREE_OPERAND (*a, 0);
2727       wider_type = TREE_TYPE (suba);
2728       if (TYPE_PRECISION (wider_type) < TYPE_PRECISION (atype))
2729         return atype;
2730     }
2731   else
2732     return atype;
2733
2734   if (CONVERT_EXPR_P (*b))
2735     {
2736       subb = TREE_OPERAND (*b, 0);
2737       if (TYPE_PRECISION (wider_type) != TYPE_PRECISION (TREE_TYPE (subb)))
2738         return atype;
2739     }
2740   else
2741     return atype;
2742
2743   *a = suba;
2744   *b = subb;
2745   return wider_type;
2746 }
2747
2748 /* Determines the expression by that USE is expressed from induction variable
2749    CAND at statement AT in LOOP.  The expression is stored in a decomposed
2750    form into AFF.  Returns false if USE cannot be expressed using CAND.  */
2751
2752 static bool
2753 get_computation_aff (struct loop *loop,
2754                      struct iv_use *use, struct iv_cand *cand, gimple at,
2755                      struct affine_tree_combination *aff)
2756 {
2757   tree ubase = use->iv->base;
2758   tree ustep = use->iv->step;
2759   tree cbase = cand->iv->base;
2760   tree cstep = cand->iv->step, cstep_common;
2761   tree utype = TREE_TYPE (ubase), ctype = TREE_TYPE (cbase);
2762   tree common_type, var;
2763   tree uutype;
2764   aff_tree cbase_aff, var_aff;
2765   double_int rat;
2766
2767   if (TYPE_PRECISION (utype) > TYPE_PRECISION (ctype))
2768     {
2769       /* We do not have a precision to express the values of use.  */
2770       return false;
2771     }
2772
2773   var = var_at_stmt (loop, cand, at);
2774   uutype = unsigned_type_for (utype);
2775
2776   /* If the conversion is not noop, perform it.  */
2777   if (TYPE_PRECISION (utype) < TYPE_PRECISION (ctype))
2778     {
2779       cstep = fold_convert (uutype, cstep);
2780       cbase = fold_convert (uutype, cbase);
2781       var = fold_convert (uutype, var);
2782     }
2783
2784   if (!constant_multiple_of (ustep, cstep, &rat))
2785     return false;
2786
2787   /* In case both UBASE and CBASE are shortened to UUTYPE from some common
2788      type, we achieve better folding by computing their difference in this
2789      wider type, and cast the result to UUTYPE.  We do not need to worry about
2790      overflows, as all the arithmetics will in the end be performed in UUTYPE
2791      anyway.  */
2792   common_type = determine_common_wider_type (&ubase, &cbase);
2793
2794   /* use = ubase - ratio * cbase + ratio * var.  */
2795   tree_to_aff_combination (ubase, common_type, aff);
2796   tree_to_aff_combination (cbase, common_type, &cbase_aff);
2797   tree_to_aff_combination (var, uutype, &var_aff);
2798
2799   /* We need to shift the value if we are after the increment.  */
2800   if (stmt_after_increment (loop, cand, at))
2801     {
2802       aff_tree cstep_aff;
2803   
2804       if (common_type != uutype)
2805         cstep_common = fold_convert (common_type, cstep);
2806       else
2807         cstep_common = cstep;
2808
2809       tree_to_aff_combination (cstep_common, common_type, &cstep_aff);
2810       aff_combination_add (&cbase_aff, &cstep_aff);
2811     }
2812
2813   aff_combination_scale (&cbase_aff, double_int_neg (rat));
2814   aff_combination_add (aff, &cbase_aff);
2815   if (common_type != uutype)
2816     aff_combination_convert (aff, uutype);
2817
2818   aff_combination_scale (&var_aff, rat);
2819   aff_combination_add (aff, &var_aff);
2820
2821   return true;
2822 }
2823
2824 /* Determines the expression by that USE is expressed from induction variable
2825    CAND at statement AT in LOOP.  The computation is unshared.  */
2826
2827 static tree
2828 get_computation_at (struct loop *loop,
2829                     struct iv_use *use, struct iv_cand *cand, gimple at)
2830 {
2831   aff_tree aff;
2832   tree type = TREE_TYPE (use->iv->base);
2833
2834   if (!get_computation_aff (loop, use, cand, at, &aff))
2835     return NULL_TREE;
2836   unshare_aff_combination (&aff);
2837   return fold_convert (type, aff_combination_to_tree (&aff));
2838 }
2839
2840 /* Determines the expression by that USE is expressed from induction variable
2841    CAND in LOOP.  The computation is unshared.  */
2842
2843 static tree
2844 get_computation (struct loop *loop, struct iv_use *use, struct iv_cand *cand)
2845 {
2846   return get_computation_at (loop, use, cand, use->stmt);
2847 }
2848
2849 /* Returns cost of addition in MODE.  */
2850
2851 static unsigned
2852 add_cost (enum machine_mode mode, bool speed)
2853 {
2854   static unsigned costs[NUM_MACHINE_MODES];
2855   rtx seq;
2856   unsigned cost;
2857
2858   if (costs[mode])
2859     return costs[mode];
2860
2861   start_sequence ();
2862   force_operand (gen_rtx_fmt_ee (PLUS, mode,
2863                                  gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 1),
2864                                  gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 2)),
2865                  NULL_RTX);
2866   seq = get_insns ();
2867   end_sequence ();
2868
2869   cost = seq_cost (seq, speed);
2870   if (!cost)
2871     cost = 1;
2872
2873   costs[mode] = cost;
2874       
2875   if (dump_file && (dump_flags & TDF_DETAILS))
2876     fprintf (dump_file, "Addition in %s costs %d\n",
2877              GET_MODE_NAME (mode), cost);
2878   return cost;
2879 }
2880
2881 /* Entry in a hashtable of already known costs for multiplication.  */
2882 struct mbc_entry
2883 {
2884   HOST_WIDE_INT cst;            /* The constant to multiply by.  */
2885   enum machine_mode mode;       /* In mode.  */
2886   unsigned cost;                /* The cost.  */
2887 };
2888
2889 /* Counts hash value for the ENTRY.  */
2890
2891 static hashval_t
2892 mbc_entry_hash (const void *entry)
2893 {
2894   const struct mbc_entry *e = (const struct mbc_entry *) entry;
2895
2896   return 57 * (hashval_t) e->mode + (hashval_t) (e->cst % 877);
2897 }
2898
2899 /* Compares the hash table entries ENTRY1 and ENTRY2.  */
2900
2901 static int
2902 mbc_entry_eq (const void *entry1, const void *entry2)
2903 {
2904   const struct mbc_entry *e1 = (const struct mbc_entry *) entry1;
2905   const struct mbc_entry *e2 = (const struct mbc_entry *) entry2;
2906
2907   return (e1->mode == e2->mode
2908           && e1->cst == e2->cst);
2909 }
2910
2911 /* Returns cost of multiplication by constant CST in MODE.  */
2912
2913 unsigned
2914 multiply_by_cost (HOST_WIDE_INT cst, enum machine_mode mode, bool speed)
2915 {
2916   static htab_t costs;
2917   struct mbc_entry **cached, act;
2918   rtx seq;
2919   unsigned cost;
2920
2921   if (!costs)
2922     costs = htab_create (100, mbc_entry_hash, mbc_entry_eq, free);
2923
2924   act.mode = mode;
2925   act.cst = cst;
2926   cached = (struct mbc_entry **) htab_find_slot (costs, &act, INSERT);
2927   if (*cached)
2928     return (*cached)->cost;
2929
2930   *cached = XNEW (struct mbc_entry);
2931   (*cached)->mode = mode;
2932   (*cached)->cst = cst;
2933
2934   start_sequence ();
2935   expand_mult (mode, gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 1),
2936                gen_int_mode (cst, mode), NULL_RTX, 0);
2937   seq = get_insns ();
2938   end_sequence ();
2939   
2940   cost = seq_cost (seq, speed);
2941
2942   if (dump_file && (dump_flags & TDF_DETAILS))
2943     fprintf (dump_file, "Multiplication by %d in %s costs %d\n",
2944              (int) cst, GET_MODE_NAME (mode), cost);
2945
2946   (*cached)->cost = cost;
2947
2948   return cost;
2949 }
2950
2951 /* Returns true if multiplying by RATIO is allowed in an address.  Test the
2952    validity for a memory reference accessing memory of mode MODE.  */
2953
2954 bool
2955 multiplier_allowed_in_address_p (HOST_WIDE_INT ratio, enum machine_mode mode)
2956 {
2957 #define MAX_RATIO 128
2958   static sbitmap valid_mult[MAX_MACHINE_MODE];
2959   
2960   if (!valid_mult[mode])
2961     {
2962       rtx reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1);
2963       rtx addr;
2964       HOST_WIDE_INT i;
2965
2966       valid_mult[mode] = sbitmap_alloc (2 * MAX_RATIO + 1);
2967       sbitmap_zero (valid_mult[mode]);
2968       addr = gen_rtx_fmt_ee (MULT, Pmode, reg1, NULL_RTX);
2969       for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
2970         {
2971           XEXP (addr, 1) = gen_int_mode (i, Pmode);
2972           if (memory_address_p (mode, addr))
2973             SET_BIT (valid_mult[mode], i + MAX_RATIO);
2974         }
2975
2976       if (dump_file && (dump_flags & TDF_DETAILS))
2977         {
2978           fprintf (dump_file, "  allowed multipliers:");
2979           for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
2980             if (TEST_BIT (valid_mult[mode], i + MAX_RATIO))
2981               fprintf (dump_file, " %d", (int) i);
2982           fprintf (dump_file, "\n");
2983           fprintf (dump_file, "\n");
2984         }
2985     }
2986
2987   if (ratio > MAX_RATIO || ratio < -MAX_RATIO)
2988     return false;
2989
2990   return TEST_BIT (valid_mult[mode], ratio + MAX_RATIO);
2991 }
2992
2993 /* Returns cost of address in shape symbol + var + OFFSET + RATIO * index.
2994    If SYMBOL_PRESENT is false, symbol is omitted.  If VAR_PRESENT is false,
2995    variable is omitted.  Compute the cost for a memory reference that accesses
2996    a memory location of mode MEM_MODE.
2997
2998    TODO -- there must be some better way.  This all is quite crude.  */
2999
3000 static comp_cost
3001 get_address_cost (bool symbol_present, bool var_present,
3002                   unsigned HOST_WIDE_INT offset, HOST_WIDE_INT ratio,
3003                   enum machine_mode mem_mode,
3004                   bool speed)
3005 {
3006   static bool initialized[MAX_MACHINE_MODE];
3007   static HOST_WIDE_INT rat[MAX_MACHINE_MODE], off[MAX_MACHINE_MODE];
3008   static HOST_WIDE_INT min_offset[MAX_MACHINE_MODE], max_offset[MAX_MACHINE_MODE];
3009   static unsigned costs[MAX_MACHINE_MODE][2][2][2][2];
3010   unsigned cost, acost, complexity;
3011   bool offset_p, ratio_p;
3012   HOST_WIDE_INT s_offset;
3013   unsigned HOST_WIDE_INT mask;
3014   unsigned bits;
3015
3016   if (!initialized[mem_mode])
3017     {
3018       HOST_WIDE_INT i;
3019       HOST_WIDE_INT start = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
3020       int old_cse_not_expected;
3021       unsigned sym_p, var_p, off_p, rat_p, add_c;
3022       rtx seq, addr, base;
3023       rtx reg0, reg1;
3024
3025       initialized[mem_mode] = true;
3026
3027       reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1);
3028
3029       addr = gen_rtx_fmt_ee (PLUS, Pmode, reg1, NULL_RTX);
3030       for (i = start; i <= 1 << 20; i <<= 1)
3031         {
3032           XEXP (addr, 1) = gen_int_mode (i, Pmode);
3033           if (!memory_address_p (mem_mode, addr))
3034             break;
3035         }
3036       max_offset[mem_mode] = i == start ? 0 : i >> 1;
3037       off[mem_mode] = max_offset[mem_mode];
3038
3039       for (i = start; i <= 1 << 20; i <<= 1)
3040         {
3041           XEXP (addr, 1) = gen_int_mode (-i, Pmode);
3042           if (!memory_address_p (mem_mode, addr))
3043             break;
3044         }
3045       min_offset[mem_mode] = i == start ? 0 : -(i >> 1);
3046
3047       if (dump_file && (dump_flags & TDF_DETAILS))
3048         {
3049           fprintf (dump_file, "get_address_cost:\n");
3050           fprintf (dump_file, "  min offset %s %d\n",
3051                    GET_MODE_NAME (mem_mode),
3052                    (int) min_offset[mem_mode]);
3053           fprintf (dump_file, "  max offset %s %d\n",
3054                    GET_MODE_NAME (mem_mode),
3055                    (int) max_offset[mem_mode]);
3056         }
3057
3058       rat[mem_mode] = 1;
3059       for (i = 2; i <= MAX_RATIO; i++)
3060         if (multiplier_allowed_in_address_p (i, mem_mode))
3061           {
3062             rat[mem_mode] = i;
3063             break;
3064           }
3065
3066       /* Compute the cost of various addressing modes.  */
3067       acost = 0;
3068       reg0 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1);
3069       reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 2);
3070
3071       for (i = 0; i < 16; i++)
3072         {
3073           sym_p = i & 1;
3074           var_p = (i >> 1) & 1;
3075           off_p = (i >> 2) & 1;
3076           rat_p = (i >> 3) & 1;
3077
3078           addr = reg0;
3079           if (rat_p)
3080             addr = gen_rtx_fmt_ee (MULT, Pmode, addr,
3081                                    gen_int_mode (rat[mem_mode], Pmode));
3082
3083           if (var_p)
3084             addr = gen_rtx_fmt_ee (PLUS, Pmode, addr, reg1);
3085
3086           if (sym_p)
3087             {
3088               base = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (""));
3089               /* ??? We can run into trouble with some backends by presenting
3090                  it with symbols which haven't been properly passed through
3091                  targetm.encode_section_info.  By setting the local bit, we
3092                  enhance the probability of things working.  */
3093               SYMBOL_REF_FLAGS (base) = SYMBOL_FLAG_LOCAL;
3094
3095               if (off_p)
3096                 base = gen_rtx_fmt_e (CONST, Pmode,
3097                                       gen_rtx_fmt_ee (PLUS, Pmode,
3098                                                       base,
3099                                                       gen_int_mode (off[mem_mode],
3100                                                                     Pmode)));
3101             }
3102           else if (off_p)
3103             base = gen_int_mode (off[mem_mode], Pmode);
3104           else
3105             base = NULL_RTX;
3106     
3107           if (base)
3108             addr = gen_rtx_fmt_ee (PLUS, Pmode, addr, base);
3109   
3110           start_sequence ();
3111           /* To avoid splitting addressing modes, pretend that no cse will
3112              follow.  */
3113           old_cse_not_expected = cse_not_expected;
3114           cse_not_expected = true;
3115           addr = memory_address (mem_mode, addr);
3116           cse_not_expected = old_cse_not_expected;
3117           seq = get_insns ();
3118           end_sequence ();
3119
3120           acost = seq_cost (seq, speed);
3121           acost += address_cost (addr, mem_mode, speed);
3122
3123           if (!acost)
3124             acost = 1;
3125           costs[mem_mode][sym_p][var_p][off_p][rat_p] = acost;
3126         }
3127
3128       /* On some targets, it is quite expensive to load symbol to a register,
3129          which makes addresses that contain symbols look much more expensive.
3130          However, the symbol will have to be loaded in any case before the
3131          loop (and quite likely we have it in register already), so it does not
3132          make much sense to penalize them too heavily.  So make some final
3133          tweaks for the SYMBOL_PRESENT modes:
3134
3135          If VAR_PRESENT is false, and the mode obtained by changing symbol to
3136          var is cheaper, use this mode with small penalty.
3137          If VAR_PRESENT is true, try whether the mode with
3138          SYMBOL_PRESENT = false is cheaper even with cost of addition, and
3139          if this is the case, use it.  */
3140       add_c = add_cost (Pmode, speed);
3141       for (i = 0; i < 8; i++)
3142         {
3143           var_p = i & 1;
3144           off_p = (i >> 1) & 1;
3145           rat_p = (i >> 2) & 1;
3146
3147           acost = costs[mem_mode][0][1][off_p][rat_p] + 1;
3148           if (var_p)
3149             acost += add_c;
3150
3151           if (acost < costs[mem_mode][1][var_p][off_p][rat_p])
3152             costs[mem_mode][1][var_p][off_p][rat_p] = acost;
3153         }
3154   
3155       if (dump_file && (dump_flags & TDF_DETAILS))
3156         {
3157           fprintf (dump_file, "Address costs:\n");
3158       
3159           for (i = 0; i < 16; i++)
3160             {
3161               sym_p = i & 1;
3162               var_p = (i >> 1) & 1;
3163               off_p = (i >> 2) & 1;
3164               rat_p = (i >> 3) & 1;
3165
3166               fprintf (dump_file, "  ");
3167               if (sym_p)
3168                 fprintf (dump_file, "sym + ");
3169               if (var_p)
3170                 fprintf (dump_file, "var + ");
3171               if (off_p)
3172                 fprintf (dump_file, "cst + ");
3173               if (rat_p)
3174                 fprintf (dump_file, "rat * ");
3175
3176               acost = costs[mem_mode][sym_p][var_p][off_p][rat_p];
3177               fprintf (dump_file, "index costs %d\n", acost);
3178             }
3179           fprintf (dump_file, "\n");
3180         }
3181     }
3182
3183   bits = GET_MODE_BITSIZE (Pmode);
3184   mask = ~(~(unsigned HOST_WIDE_INT) 0 << (bits - 1) << 1);
3185   offset &= mask;
3186   if ((offset >> (bits - 1) & 1))
3187     offset |= ~mask;
3188   s_offset = offset;
3189
3190   cost = 0;
3191   offset_p = (s_offset != 0
3192               && min_offset[mem_mode] <= s_offset
3193               && s_offset <= max_offset[mem_mode]);
3194   ratio_p = (ratio != 1
3195              && multiplier_allowed_in_address_p (ratio, mem_mode));
3196
3197   if (ratio != 1 && !ratio_p)
3198     cost += multiply_by_cost (ratio, Pmode, speed);
3199
3200   if (s_offset && !offset_p && !symbol_present)
3201     cost += add_cost (Pmode, speed);
3202
3203   acost = costs[mem_mode][symbol_present][var_present][offset_p][ratio_p];
3204   complexity = (symbol_present != 0) + (var_present != 0) + offset_p + ratio_p;
3205   return new_cost (cost + acost, complexity);
3206 }
3207
3208 /* Estimates cost of forcing expression EXPR into a variable.  */
3209
3210 static comp_cost
3211 force_expr_to_var_cost (tree expr, bool speed)
3212 {
3213   static bool costs_initialized = false;
3214   static unsigned integer_cost [2];
3215   static unsigned symbol_cost [2];
3216   static unsigned address_cost [2];
3217   tree op0, op1;
3218   comp_cost cost0, cost1, cost;
3219   enum machine_mode mode;
3220
3221   if (!costs_initialized)
3222     {
3223       tree type = build_pointer_type (integer_type_node);
3224       tree var, addr;
3225       rtx x;
3226       int i;
3227
3228       var = create_tmp_var_raw (integer_type_node, "test_var");
3229       TREE_STATIC (var) = 1;
3230       x = produce_memory_decl_rtl (var, NULL);
3231       SET_DECL_RTL (var, x);
3232
3233       addr = build1 (ADDR_EXPR, type, var);
3234
3235
3236       for (i = 0; i < 2; i++)
3237         {
3238           integer_cost[i] = computation_cost (build_int_cst (integer_type_node,
3239                                                              2000), i);
3240
3241           symbol_cost[i] = computation_cost (addr, i) + 1;
3242
3243           address_cost[i]
3244             = computation_cost (build2 (POINTER_PLUS_EXPR, type,
3245                                         addr,
3246                                         build_int_cst (sizetype, 2000)), i) + 1;
3247           if (dump_file && (dump_flags & TDF_DETAILS))
3248             {
3249               fprintf (dump_file, "force_expr_to_var_cost %s costs:\n", i ? "speed" : "size");
3250               fprintf (dump_file, "  integer %d\n", (int) integer_cost[i]);
3251               fprintf (dump_file, "  symbol %d\n", (int) symbol_cost[i]);
3252               fprintf (dump_file, "  address %d\n", (int) address_cost[i]);
3253               fprintf (dump_file, "  other %d\n", (int) target_spill_cost[i]);
3254               fprintf (dump_file, "\n");
3255             }
3256         }
3257
3258       costs_initialized = true;
3259     }
3260
3261   STRIP_NOPS (expr);
3262
3263   if (SSA_VAR_P (expr))
3264     return zero_cost;
3265
3266   if (is_gimple_min_invariant (expr))
3267     {
3268       if (TREE_CODE (expr) == INTEGER_CST)
3269         return new_cost (integer_cost [speed], 0);
3270
3271       if (TREE_CODE (expr) == ADDR_EXPR)
3272         {
3273           tree obj = TREE_OPERAND (expr, 0);
3274
3275           if (TREE_CODE (obj) == VAR_DECL
3276               || TREE_CODE (obj) == PARM_DECL
3277               || TREE_CODE (obj) == RESULT_DECL)
3278             return new_cost (symbol_cost [speed], 0);
3279         }
3280
3281       return new_cost (address_cost [speed], 0);
3282     }
3283
3284   switch (TREE_CODE (expr))
3285     {
3286     case POINTER_PLUS_EXPR:
3287     case PLUS_EXPR:
3288     case MINUS_EXPR:
3289     case MULT_EXPR:
3290       op0 = TREE_OPERAND (expr, 0);
3291       op1 = TREE_OPERAND (expr, 1);
3292       STRIP_NOPS (op0);
3293       STRIP_NOPS (op1);
3294
3295       if (is_gimple_val (op0))
3296         cost0 = zero_cost;
3297       else
3298         cost0 = force_expr_to_var_cost (op0, speed);
3299
3300       if (is_gimple_val (op1))
3301         cost1 = zero_cost;
3302       else
3303         cost1 = force_expr_to_var_cost (op1, speed);
3304
3305       break;
3306
3307     default:
3308       /* Just an arbitrary value, FIXME.  */
3309       return new_cost (target_spill_cost[speed], 0);
3310     }
3311
3312   mode = TYPE_MODE (TREE_TYPE (expr));
3313   switch (TREE_CODE (expr))
3314     {
3315     case POINTER_PLUS_EXPR:
3316     case PLUS_EXPR:
3317     case MINUS_EXPR:
3318       cost = new_cost (add_cost (mode, speed), 0);
3319       break;
3320
3321     case MULT_EXPR:
3322       if (cst_and_fits_in_hwi (op0))
3323         cost = new_cost (multiply_by_cost (int_cst_value (op0), mode, speed), 0);
3324       else if (cst_and_fits_in_hwi (op1))                                  
3325         cost = new_cost (multiply_by_cost (int_cst_value (op1), mode, speed), 0);
3326       else
3327         return new_cost (target_spill_cost [speed], 0);
3328       break;
3329
3330     default:
3331       gcc_unreachable ();
3332     }
3333
3334   cost = add_costs (cost, cost0);
3335   cost = add_costs (cost, cost1);
3336
3337   /* Bound the cost by target_spill_cost.  The parts of complicated
3338      computations often are either loop invariant or at least can
3339      be shared between several iv uses, so letting this grow without
3340      limits would not give reasonable results.  */
3341   if (cost.cost > target_spill_cost [speed])
3342     cost.cost = target_spill_cost [speed];
3343
3344   return cost;
3345 }
3346
3347 /* Estimates cost of forcing EXPR into a variable.  DEPENDS_ON is a set of the
3348    invariants the computation depends on.  */
3349
3350 static comp_cost
3351 force_var_cost (struct ivopts_data *data,
3352                 tree expr, bitmap *depends_on)
3353 {
3354   if (depends_on)
3355     {
3356       fd_ivopts_data = data;
3357       walk_tree (&expr, find_depends, depends_on, NULL);
3358     }
3359
3360   return force_expr_to_var_cost (expr, data->speed);
3361 }
3362
3363 /* Estimates cost of expressing address ADDR  as var + symbol + offset.  The
3364    value of offset is added to OFFSET, SYMBOL_PRESENT and VAR_PRESENT are set
3365    to false if the corresponding part is missing.  DEPENDS_ON is a set of the
3366    invariants the computation depends on.  */
3367
3368 static comp_cost
3369 split_address_cost (struct ivopts_data *data,
3370                     tree addr, bool *symbol_present, bool *var_present,
3371                     unsigned HOST_WIDE_INT *offset, bitmap *depends_on)
3372 {
3373   tree core;
3374   HOST_WIDE_INT bitsize;
3375   HOST_WIDE_INT bitpos;
3376   tree toffset;
3377   enum machine_mode mode;
3378   int unsignedp, volatilep;
3379   
3380   core = get_inner_reference (addr, &bitsize, &bitpos, &toffset, &mode,
3381                               &unsignedp, &volatilep, false);
3382
3383   if (toffset != 0
3384       || bitpos % BITS_PER_UNIT != 0
3385       || TREE_CODE (core) != VAR_DECL)
3386     {
3387       *symbol_present = false;
3388       *var_present = true;
3389       fd_ivopts_data = data;
3390       walk_tree (&addr, find_depends, depends_on, NULL);
3391       return new_cost (target_spill_cost[data->speed], 0);
3392     }
3393
3394   *offset += bitpos / BITS_PER_UNIT;
3395   if (TREE_STATIC (core)
3396       || DECL_EXTERNAL (core))
3397     {
3398       *symbol_present = true;
3399       *var_present = false;
3400       return zero_cost;
3401     }
3402       
3403   *symbol_present = false;
3404   *var_present = true;
3405   return zero_cost;
3406 }
3407
3408 /* Estimates cost of expressing difference of addresses E1 - E2 as
3409    var + symbol + offset.  The value of offset is added to OFFSET,
3410    SYMBOL_PRESENT and VAR_PRESENT are set to false if the corresponding
3411    part is missing.  DEPENDS_ON is a set of the invariants the computation
3412    depends on.  */
3413
3414 static comp_cost
3415 ptr_difference_cost (struct ivopts_data *data,
3416                      tree e1, tree e2, bool *symbol_present, bool *var_present,
3417                      unsigned HOST_WIDE_INT *offset, bitmap *depends_on)
3418 {
3419   HOST_WIDE_INT diff = 0;
3420   comp_cost cost;
3421   bool speed = optimize_loop_for_speed_p (data->current_loop);
3422
3423   gcc_assert (TREE_CODE (e1) == ADDR_EXPR);
3424
3425   if (ptr_difference_const (e1, e2, &diff))
3426     {
3427       *offset += diff;
3428       *symbol_present = false;
3429       *var_present = false;
3430       return zero_cost;
3431     }
3432
3433   if (integer_zerop (e2))
3434     return split_address_cost (data, TREE_OPERAND (e1, 0),
3435                                symbol_present, var_present, offset, depends_on);
3436
3437   *symbol_present = false;
3438   *var_present = true;
3439   
3440   cost = force_var_cost (data, e1, depends_on);
3441   cost = add_costs (cost, force_var_cost (data, e2, depends_on));
3442   cost.cost += add_cost (Pmode, speed);
3443
3444   return cost;
3445 }
3446
3447 /* Estimates cost of expressing difference E1 - E2 as
3448    var + symbol + offset.  The value of offset is added to OFFSET,
3449    SYMBOL_PRESENT and VAR_PRESENT are set to false if the corresponding
3450    part is missing.  DEPENDS_ON is a set of the invariants the computation
3451    depends on.  */
3452
3453 static comp_cost
3454 difference_cost (struct ivopts_data *data,
3455                  tree e1, tree e2, bool *symbol_present, bool *var_present,
3456                  unsigned HOST_WIDE_INT *offset, bitmap *depends_on)
3457 {
3458   comp_cost cost;
3459   enum machine_mode mode = TYPE_MODE (TREE_TYPE (e1));
3460   unsigned HOST_WIDE_INT off1, off2;
3461
3462   e1 = strip_offset (e1, &off1);
3463   e2 = strip_offset (e2, &off2);
3464   *offset += off1 - off2;
3465
3466   STRIP_NOPS (e1);
3467   STRIP_NOPS (e2);
3468
3469   if (TREE_CODE (e1) == ADDR_EXPR)
3470     return ptr_difference_cost (data, e1, e2, symbol_present, var_present, offset,
3471                                 depends_on);
3472   *symbol_present = false;
3473
3474   if (operand_equal_p (e1, e2, 0))
3475     {
3476       *var_present = false;
3477       return zero_cost;
3478     }
3479   *var_present = true;
3480   if (integer_zerop (e2))
3481     return force_var_cost (data, e1, depends_on);
3482
3483   if (integer_zerop (e1))
3484     {
3485       cost = force_var_cost (data, e2, depends_on);
3486       cost.cost += multiply_by_cost (-1, mode, data->speed);
3487
3488       return cost;
3489     }
3490
3491   cost = force_var_cost (data, e1, depends_on);
3492   cost = add_costs (cost, force_var_cost (data, e2, depends_on));
3493   cost.cost += add_cost (mode, data->speed);
3494
3495   return cost;
3496 }
3497
3498 /* Determines the cost of the computation by that USE is expressed
3499    from induction variable CAND.  If ADDRESS_P is true, we just need
3500    to create an address from it, otherwise we want to get it into
3501    register.  A set of invariants we depend on is stored in
3502    DEPENDS_ON.  AT is the statement at that the value is computed.  */
3503
3504 static comp_cost
3505 get_computation_cost_at (struct ivopts_data *data,
3506                          struct iv_use *use, struct iv_cand *cand,
3507                          bool address_p, bitmap *depends_on, gimple at)
3508 {
3509   tree ubase = use->iv->base, ustep = use->iv->step;
3510   tree cbase, cstep;
3511   tree utype = TREE_TYPE (ubase), ctype;
3512   unsigned HOST_WIDE_INT cstepi, offset = 0;
3513   HOST_WIDE_INT ratio, aratio;
3514   bool var_present, symbol_present;
3515   comp_cost cost;
3516   unsigned n_sums;
3517   double_int rat;
3518   bool speed = optimize_bb_for_speed_p (gimple_bb (at));
3519
3520   *depends_on = NULL;
3521
3522   /* Only consider real candidates.  */
3523   if (!cand->iv)
3524     return infinite_cost;
3525
3526   cbase = cand->iv->base;
3527   cstep = cand->iv->step;
3528   ctype = TREE_TYPE (cbase);
3529
3530   if (TYPE_PRECISION (utype) > TYPE_PRECISION (ctype))
3531     {
3532       /* We do not have a precision to express the values of use.  */
3533       return infinite_cost;
3534     }
3535
3536   if (address_p)
3537     {
3538       /* Do not try to express address of an object with computation based
3539          on address of a different object.  This may cause problems in rtl
3540          level alias analysis (that does not expect this to be happening,
3541          as this is illegal in C), and would be unlikely to be useful
3542          anyway.  */
3543       if (use->iv->base_object
3544           && cand->iv->base_object
3545           && !operand_equal_p (use->iv->base_object, cand->iv->base_object, 0))
3546         return infinite_cost;
3547     }
3548
3549   if (TYPE_PRECISION (utype) != TYPE_PRECISION (ctype))
3550     {
3551       /* TODO -- add direct handling of this case.  */
3552       goto fallback;
3553     }
3554
3555   /* CSTEPI is removed from the offset in case statement is after the
3556      increment.  If the step is not constant, we use zero instead.
3557      This is a bit imprecise (there is the extra addition), but
3558      redundancy elimination is likely to transform the code so that
3559      it uses value of the variable before increment anyway,
3560      so it is not that much unrealistic.  */
3561   if (cst_and_fits_in_hwi (cstep))
3562     cstepi = int_cst_value (cstep);
3563   else
3564     cstepi = 0;
3565
3566   if (!constant_multiple_of (ustep, cstep, &rat))
3567     return infinite_cost;
3568     
3569   if (double_int_fits_in_shwi_p (rat))
3570     ratio = double_int_to_shwi (rat);
3571   else
3572     return infinite_cost;
3573
3574   /* use = ubase + ratio * (var - cbase).  If either cbase is a constant
3575      or ratio == 1, it is better to handle this like
3576      
3577      ubase - ratio * cbase + ratio * var
3578      
3579      (also holds in the case ratio == -1, TODO.  */
3580
3581   if (cst_and_fits_in_hwi (cbase))
3582     {
3583       offset = - ratio * int_cst_value (cbase); 
3584       cost = difference_cost (data,
3585                               ubase, build_int_cst (utype, 0),
3586                               &symbol_present, &var_present, &offset,
3587                               depends_on);
3588     }
3589   else if (ratio == 1)
3590     {
3591       cost = difference_cost (data,
3592                               ubase, cbase,
3593                               &symbol_present, &var_present, &offset,
3594                               depends_on);
3595     }
3596   else
3597     {
3598       cost = force_var_cost (data, cbase, depends_on);
3599       cost.cost += add_cost (TYPE_MODE (ctype), data->speed);
3600       cost = add_costs (cost,
3601                         difference_cost (data,
3602                                          ubase, build_int_cst (utype, 0),
3603                                          &symbol_present, &var_present,
3604                                          &offset, depends_on));
3605     }
3606
3607   /* If we are after the increment, the value of the candidate is higher by
3608      one iteration.  */
3609   if (stmt_after_increment (data->current_loop, cand, at))
3610     offset -= ratio * cstepi;
3611
3612   /* Now the computation is in shape symbol + var1 + const + ratio * var2.
3613      (symbol/var/const parts may be omitted).  If we are looking for an address,
3614      find the cost of addressing this.  */
3615   if (address_p)
3616     return add_costs (cost, get_address_cost (symbol_present, var_present,
3617                                 offset, ratio,
3618                                 TYPE_MODE (TREE_TYPE (*use->op_p)), speed));
3619
3620   /* Otherwise estimate the costs for computing the expression.  */
3621   aratio = ratio > 0 ? ratio : -ratio;
3622   if (!symbol_present && !var_present && !offset)
3623     {
3624       if (ratio != 1)
3625         cost.cost += multiply_by_cost (ratio, TYPE_MODE (ctype), speed);
3626
3627       return cost;
3628     }
3629
3630   if (aratio != 1)
3631     cost.cost += multiply_by_cost (aratio, TYPE_MODE (ctype), speed);
3632
3633   n_sums = 1;
3634   if (var_present
3635       /* Symbol + offset should be compile-time computable.  */
3636       && (symbol_present || offset))
3637     n_sums++;
3638
3639   /* Having offset does not affect runtime cost in case it is added to
3640      symbol, but it increases complexity.  */
3641   if (offset)
3642     cost.complexity++;
3643
3644   cost.cost += n_sums * add_cost (TYPE_MODE (ctype), speed);
3645   return cost;
3646
3647 fallback:
3648   {
3649     /* Just get the expression, expand it and measure the cost.  */
3650     tree comp = get_computation_at (data->current_loop, use, cand, at);
3651
3652     if (!comp)
3653       return infinite_cost;
3654
3655     if (address_p)
3656       comp = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (comp)), comp);
3657
3658     return new_cost (computation_cost (comp, speed), 0);
3659   }
3660 }
3661
3662 /* Determines the cost of the computation by that USE is expressed
3663    from induction variable CAND.  If ADDRESS_P is true, we just need
3664    to create an address from it, otherwise we want to get it into
3665    register.  A set of invariants we depend on is stored in
3666    DEPENDS_ON.  */
3667
3668 static comp_cost
3669 get_computation_cost (struct ivopts_data *data,
3670                       struct iv_use *use, struct iv_cand *cand,
3671                       bool address_p, bitmap *depends_on)
3672 {
3673   return get_computation_cost_at (data,
3674                                   use, cand, address_p, depends_on, use->stmt);
3675 }
3676
3677 /* Determines cost of basing replacement of USE on CAND in a generic
3678    expression.  */
3679
3680 static bool
3681 determine_use_iv_cost_generic (struct ivopts_data *data,
3682                                struct iv_use *use, struct iv_cand *cand)
3683 {
3684   bitmap depends_on;
3685   comp_cost cost;
3686
3687   /* The simple case first -- if we need to express value of the preserved
3688      original biv, the cost is 0.  This also prevents us from counting the
3689      cost of increment twice -- once at this use and once in the cost of
3690      the candidate.  */
3691   if (cand->pos == IP_ORIGINAL
3692       && cand->incremented_at == use->stmt)
3693     {
3694       set_use_iv_cost (data, use, cand, zero_cost, NULL, NULL_TREE);
3695       return true;
3696     }
3697
3698   cost = get_computation_cost (data, use, cand, false, &depends_on);
3699   set_use_iv_cost (data, use, cand, cost, depends_on, NULL_TREE);
3700
3701   return !infinite_cost_p (cost);
3702 }
3703
3704 /* Determines cost of basing replacement of USE on CAND in an address.  */
3705
3706 static bool
3707 determine_use_iv_cost_address (struct ivopts_data *data,
3708                                struct iv_use *use, struct iv_cand *cand)
3709 {
3710   bitmap depends_on;
3711   comp_cost cost = get_computation_cost (data, use, cand, true, &depends_on);
3712
3713   set_use_iv_cost (data, use, cand, cost, depends_on, NULL_TREE);
3714
3715   return !infinite_cost_p (cost);
3716 }
3717
3718 /* Computes value of candidate CAND at position AT in iteration NITER, and
3719    stores it to VAL.  */
3720
3721 static void
3722 cand_value_at (struct loop *loop, struct iv_cand *cand, gimple at, tree niter,
3723                aff_tree *val)
3724 {
3725   aff_tree step, delta, nit;
3726   struct iv *iv = cand->iv;
3727   tree type = TREE_TYPE (iv->base);
3728   tree steptype = type;
3729   if (POINTER_TYPE_P (type))
3730     steptype = sizetype;
3731
3732   tree_to_aff_combination (iv->step, steptype, &step);
3733   tree_to_aff_combination (niter, TREE_TYPE (niter), &nit);
3734   aff_combination_convert (&nit, steptype);
3735   aff_combination_mult (&nit, &step, &delta);
3736   if (stmt_after_increment (loop, cand, at))
3737     aff_combination_add (&delta, &step);
3738
3739   tree_to_aff_combination (iv->base, type, val);
3740   aff_combination_add (val, &delta);
3741 }
3742
3743 /* Returns period of induction variable iv.  */
3744
3745 static tree
3746 iv_period (struct iv *iv)
3747 {
3748   tree step = iv->step, period, type;
3749   tree pow2div;
3750
3751   gcc_assert (step && TREE_CODE (step) == INTEGER_CST);
3752
3753   /* Period of the iv is gcd (step, type range).  Since type range is power
3754      of two, it suffices to determine the maximum power of two that divides
3755      step.  */
3756   pow2div = num_ending_zeros (step);
3757   type = unsigned_type_for (TREE_TYPE (step));
3758
3759   period = build_low_bits_mask (type,
3760                                 (TYPE_PRECISION (type)
3761                                  - tree_low_cst (pow2div, 1)));
3762
3763   return period;
3764 }
3765
3766 /* Returns the comparison operator used when eliminating the iv USE.  */
3767
3768 static enum tree_code
3769 iv_elimination_compare (struct ivopts_data *data, struct iv_use *use)
3770 {
3771   struct loop *loop = data->current_loop;
3772   basic_block ex_bb;
3773   edge exit;
3774
3775   ex_bb = gimple_bb (use->stmt);
3776   exit = EDGE_SUCC (ex_bb, 0);
3777   if (flow_bb_inside_loop_p (loop, exit->dest))
3778     exit = EDGE_SUCC (ex_bb, 1);
3779
3780   return (exit->flags & EDGE_TRUE_VALUE ? EQ_EXPR : NE_EXPR);
3781 }
3782
3783 /* Check whether it is possible to express the condition in USE by comparison
3784    of candidate CAND.  If so, store the value compared with to BOUND.  */
3785
3786 static bool
3787 may_eliminate_iv (struct ivopts_data *data,
3788                   struct iv_use *use, struct iv_cand *cand, tree *bound)
3789 {
3790   basic_block ex_bb;
3791   edge exit;
3792   tree nit, period;
3793   struct loop *loop = data->current_loop;
3794   aff_tree bnd;
3795
3796   if (TREE_CODE (cand->iv->step) != INTEGER_CST)
3797     return false;
3798
3799   /* For now works only for exits that dominate the loop latch.
3800      TODO: extend to other conditions inside loop body.  */
3801   ex_bb = gimple_bb (use->stmt);
3802   if (use->stmt != last_stmt (ex_bb)
3803       || gimple_code (use->stmt) != GIMPLE_COND
3804       || !dominated_by_p (CDI_DOMINATORS, loop->latch, ex_bb))
3805     return false;
3806
3807   exit = EDGE_SUCC (ex_bb, 0);
3808   if (flow_bb_inside_loop_p (loop, exit->dest))
3809     exit = EDGE_SUCC (ex_bb, 1);
3810   if (flow_bb_inside_loop_p (loop, exit->dest))
3811     return false;
3812
3813   nit = niter_for_exit (data, exit);
3814   if (!nit)
3815     return false;
3816
3817   /* Determine whether we can use the variable to test the exit condition.
3818      This is the case iff the period of the induction variable is greater
3819      than the number of iterations for which the exit condition is true.  */
3820   period = iv_period (cand->iv);
3821
3822   /* If the number of iterations is constant, compare against it directly.  */
3823   if (TREE_CODE (nit) == INTEGER_CST)
3824     {
3825       if (!tree_int_cst_lt (nit, period))
3826         return false;
3827     }
3828
3829   /* If not, and if this is the only possible exit of the loop, see whether
3830      we can get a conservative estimate on the number of iterations of the
3831      entire loop and compare against that instead.  */
3832   else if (loop_only_exit_p (loop, exit))
3833     {
3834       double_int period_value, max_niter;
3835       if (!estimated_loop_iterations (loop, true, &max_niter))
3836         return false;
3837       period_value = tree_to_double_int (period);
3838       if (double_int_ucmp (max_niter, period_value) >= 0)
3839         return false;
3840     }
3841
3842   /* Otherwise, punt.  */
3843   else
3844     return false;
3845
3846   cand_value_at (loop, cand, use->stmt, nit, &bnd);
3847
3848   *bound = aff_combination_to_tree (&bnd);
3849   /* It is unlikely that computing the number of iterations using division
3850      would be more profitable than keeping the original induction variable.  */
3851   if (expression_expensive_p (*bound))
3852     return false;
3853   return true;
3854 }
3855
3856 /* Determines cost of basing replacement of USE on CAND in a condition.  */
3857
3858 static bool
3859 determine_use_iv_cost_condition (struct ivopts_data *data,
3860                                  struct iv_use *use, struct iv_cand *cand)
3861 {
3862   tree bound = NULL_TREE;
3863   struct iv *cmp_iv;
3864   bitmap depends_on_elim = NULL, depends_on_express = NULL, depends_on;
3865   comp_cost elim_cost, express_cost, cost;
3866   bool ok;
3867
3868   /* Only consider real candidates.  */
3869   if (!cand->iv)
3870     {
3871       set_use_iv_cost (data, use, cand, infinite_cost, NULL, NULL_TREE);
3872       return false;
3873     }
3874
3875   /* Try iv elimination.  */
3876   if (may_eliminate_iv (data, use, cand, &bound))
3877     {
3878       elim_cost = force_var_cost (data, bound, &depends_on_elim);
3879       /* The bound is a loop invariant, so it will be only computed
3880          once.  */
3881       elim_cost.cost /= AVG_LOOP_NITER (data->current_loop);
3882     }
3883   else
3884     elim_cost = infinite_cost;
3885
3886   /* Try expressing the original giv.  If it is compared with an invariant,
3887      note that we cannot get rid of it.  */
3888   ok = extract_cond_operands (data, use->stmt, NULL, NULL, NULL, &cmp_iv);
3889   gcc_assert (ok);
3890
3891   express_cost = get_computation_cost (data, use, cand, false,
3892                                        &depends_on_express);
3893   fd_ivopts_data = data;
3894   walk_tree (&cmp_iv->base, find_depends, &depends_on_express, NULL);
3895
3896   /* Choose the better approach, preferring the eliminated IV. */
3897   if (compare_costs (elim_cost, express_cost) <= 0)
3898     {
3899       cost = elim_cost;
3900       depends_on = depends_on_elim;
3901       depends_on_elim = NULL;
3902     }
3903   else
3904     {
3905       cost = express_cost;
3906       depends_on = depends_on_express;
3907       depends_on_express = NULL;
3908       bound = NULL_TREE;
3909     }
3910
3911   set_use_iv_cost (data, use, cand, cost, depends_on, bound);
3912
3913   if (depends_on_elim)
3914     BITMAP_FREE (depends_on_elim);
3915   if (depends_on_express)
3916     BITMAP_FREE (depends_on_express);
3917
3918   return !infinite_cost_p (cost);
3919 }
3920
3921 /* Determines cost of basing replacement of USE on CAND.  Returns false
3922    if USE cannot be based on CAND.  */
3923
3924 static bool
3925 determine_use_iv_cost (struct ivopts_data *data,
3926                        struct iv_use *use, struct iv_cand *cand)
3927 {
3928   switch (use->type)
3929     {
3930     case USE_NONLINEAR_EXPR:
3931       return determine_use_iv_cost_generic (data, use, cand);
3932
3933     case USE_ADDRESS:
3934       return determine_use_iv_cost_address (data, use, cand);
3935
3936     case USE_COMPARE:
3937       return determine_use_iv_cost_condition (data, use, cand);
3938
3939     default:
3940       gcc_unreachable ();
3941     }
3942 }
3943
3944 /* Determines costs of basing the use of the iv on an iv candidate.  */
3945
3946 static void
3947 determine_use_iv_costs (struct ivopts_data *data)
3948 {
3949   unsigned i, j;
3950   struct iv_use *use;
3951   struct iv_cand *cand;
3952   bitmap to_clear = BITMAP_ALLOC (NULL);
3953
3954   alloc_use_cost_map (data);
3955
3956   for (i = 0; i < n_iv_uses (data); i++)
3957     {
3958       use = iv_use (data, i);
3959
3960       if (data->consider_all_candidates)
3961         {
3962           for (j = 0; j < n_iv_cands (data); j++)
3963             {
3964               cand = iv_cand (data, j);
3965               determine_use_iv_cost (data, use, cand);
3966             }
3967         }
3968       else
3969         {
3970           bitmap_iterator bi;
3971
3972           EXECUTE_IF_SET_IN_BITMAP (use->related_cands, 0, j, bi)
3973             {
3974               cand = iv_cand (data, j);
3975               if (!determine_use_iv_cost (data, use, cand))
3976                 bitmap_set_bit (to_clear, j);
3977             }
3978
3979           /* Remove the candidates for that the cost is infinite from
3980              the list of related candidates.  */
3981           bitmap_and_compl_into (use->related_cands, to_clear);
3982           bitmap_clear (to_clear);
3983         }
3984     }
3985
3986   BITMAP_FREE (to_clear);
3987
3988   if (dump_file && (dump_flags & TDF_DETAILS))
3989     {
3990       fprintf (dump_file, "Use-candidate costs:\n");
3991
3992       for (i = 0; i < n_iv_uses (data); i++)
3993         {
3994           use = iv_use (data, i);
3995
3996           fprintf (dump_file, "Use %d:\n", i);
3997           fprintf (dump_file, "  cand\tcost\tcompl.\tdepends on\n");
3998           for (j = 0; j < use->n_map_members; j++)
3999             {
4000               if (!use->cost_map[j].cand
4001                   || infinite_cost_p (use->cost_map[j].cost))
4002                 continue;
4003
4004               fprintf (dump_file, "  %d\t%d\t%d\t",
4005                        use->cost_map[j].cand->id,
4006                        use->cost_map[j].cost.cost,
4007                        use->cost_map[j].cost.complexity);
4008               if (use->cost_map[j].depends_on)
4009                 bitmap_print (dump_file,
4010                               use->cost_map[j].depends_on, "","");
4011               fprintf (dump_file, "\n");
4012             }
4013
4014           fprintf (dump_file, "\n");
4015         }
4016       fprintf (dump_file, "\n");
4017     }
4018 }
4019
4020 /* Determines cost of the candidate CAND.  */
4021
4022 static void
4023 determine_iv_cost (struct ivopts_data *data, struct iv_cand *cand)
4024 {
4025   comp_cost cost_base;
4026   unsigned cost, cost_step;
4027   tree base;
4028
4029   if (!cand->iv)
4030     {
4031       cand->cost = 0;
4032       return;
4033     }
4034
4035   /* There are two costs associated with the candidate -- its increment
4036      and its initialization.  The second is almost negligible for any loop
4037      that rolls enough, so we take it just very little into account.  */
4038
4039   base = cand->iv->base;
4040   cost_base = force_var_cost (data, base, NULL);
4041   cost_step = add_cost (TYPE_MODE (TREE_TYPE (base)), data->speed);
4042
4043   cost = cost_step + cost_base.cost / AVG_LOOP_NITER (current_loop);
4044
4045   /* Prefer the original ivs unless we may gain something by replacing it.
4046      The reason is to make debugging simpler; so this is not relevant for
4047      artificial ivs created by other optimization passes.  */
4048   if (cand->pos != IP_ORIGINAL
4049       || DECL_ARTIFICIAL (SSA_NAME_VAR (cand->var_before)))
4050     cost++;
4051   
4052   /* Prefer not to insert statements into latch unless there are some
4053      already (so that we do not create unnecessary jumps).  */
4054   if (cand->pos == IP_END
4055       && empty_block_p (ip_end_pos (data->current_loop)))
4056     cost++;
4057
4058   cand->cost = cost;
4059 }
4060
4061 /* Determines costs of computation of the candidates.  */
4062
4063 static void
4064 determine_iv_costs (struct ivopts_data *data)
4065 {
4066   unsigned i;
4067
4068   if (dump_file && (dump_flags & TDF_DETAILS))
4069     {
4070       fprintf (dump_file, "Candidate costs:\n");
4071       fprintf (dump_file, "  cand\tcost\n");
4072     }
4073
4074   for (i = 0; i < n_iv_cands (data); i++)
4075     {
4076       struct iv_cand *cand = iv_cand (data, i);
4077
4078       determine_iv_cost (data, cand);
4079
4080       if (dump_file && (dump_flags & TDF_DETAILS))
4081         fprintf (dump_file, "  %d\t%d\n", i, cand->cost);
4082     }
4083   
4084   if (dump_file && (dump_flags & TDF_DETAILS))
4085     fprintf (dump_file, "\n");
4086 }
4087
4088 /* Calculates cost for having SIZE induction variables.  */
4089
4090 static unsigned
4091 ivopts_global_cost_for_size (struct ivopts_data *data, unsigned size)
4092 {
4093   /* We add size to the cost, so that we prefer eliminating ivs
4094      if possible.  */
4095   return size + estimate_reg_pressure_cost (size, data->regs_used, data->speed);
4096 }
4097
4098 /* For each size of the induction variable set determine the penalty.  */
4099
4100 static void
4101 determine_set_costs (struct ivopts_data *data)
4102 {
4103   unsigned j, n;
4104   gimple phi;
4105   gimple_stmt_iterator psi;
4106   tree op;
4107   struct loop *loop = data->current_loop;
4108   bitmap_iterator bi;
4109
4110   /* We use the following model (definitely improvable, especially the
4111      cost function -- TODO):
4112
4113      We estimate the number of registers available (using MD data), name it A.
4114
4115      We estimate the number of registers used by the loop, name it U.  This
4116      number is obtained as the number of loop phi nodes (not counting virtual
4117      registers and bivs) + the number of variables from outside of the loop.
4118
4119      We set a reserve R (free regs that are used for temporary computations,
4120      etc.).  For now the reserve is a constant 3.
4121
4122      Let I be the number of induction variables.
4123      
4124      -- if U + I + R <= A, the cost is I * SMALL_COST (just not to encourage
4125         make a lot of ivs without a reason).
4126      -- if A - R < U + I <= A, the cost is I * PRES_COST
4127      -- if U + I > A, the cost is I * PRES_COST and
4128         number of uses * SPILL_COST * (U + I - A) / (U + I) is added.  */
4129
4130   if (dump_file && (dump_flags & TDF_DETAILS))
4131     {
4132       fprintf (dump_file, "Global costs:\n");
4133       fprintf (dump_file, "  target_avail_regs %d\n", target_avail_regs);
4134       fprintf (dump_file, "  target_reg_cost %d\n", target_reg_cost[data->speed]);
4135       fprintf (dump_file, "  target_spill_cost %d\n", target_spill_cost[data->speed]);
4136     }
4137
4138   n = 0;
4139   for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
4140     {
4141       phi = gsi_stmt (psi);
4142       op = PHI_RESULT (phi);
4143
4144       if (!is_gimple_reg (op))
4145         continue;
4146
4147       if (get_iv (data, op))
4148         continue;
4149
4150       n++;
4151     }
4152
4153   EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, j, bi)
4154     {
4155       struct version_info *info = ver_info (data, j);
4156
4157       if (info->inv_id && info->has_nonlin_use)
4158         n++;
4159     }
4160
4161   data->regs_used = n;
4162   if (dump_file && (dump_flags & TDF_DETAILS))
4163     fprintf (dump_file, "  regs_used %d\n", n);
4164
4165   if (dump_file && (dump_flags & TDF_DETAILS))
4166     {
4167       fprintf (dump_file, "  cost for size:\n");
4168       fprintf (dump_file, "  ivs\tcost\n");
4169       for (j = 0; j <= 2 * target_avail_regs; j++)
4170         fprintf (dump_file, "  %d\t%d\n", j,
4171                  ivopts_global_cost_for_size (data, j));
4172       fprintf (dump_file, "\n");
4173     }
4174 }
4175
4176 /* Returns true if A is a cheaper cost pair than B.  */
4177
4178 static bool
4179 cheaper_cost_pair (struct cost_pair *a, struct cost_pair *b)
4180 {
4181   int cmp;
4182
4183   if (!a)
4184     return false;
4185
4186   if (!b)
4187     return true;
4188
4189   cmp = compare_costs (a->cost, b->cost);
4190   if (cmp < 0)
4191     return true;
4192
4193   if (cmp > 0)
4194     return false;
4195
4196   /* In case the costs are the same, prefer the cheaper candidate.  */
4197   if (a->cand->cost < b->cand->cost)
4198     return true;
4199
4200   return false;
4201 }
4202
4203 /* Computes the cost field of IVS structure.  */
4204
4205 static void
4206 iv_ca_recount_cost (struct ivopts_data *data, struct iv_ca *ivs)
4207 {
4208   comp_cost cost = ivs->cand_use_cost;
4209   cost.cost += ivs->cand_cost;
4210   cost.cost += ivopts_global_cost_for_size (data, ivs->n_regs);
4211
4212   ivs->cost = cost;
4213 }
4214
4215 /* Remove invariants in set INVS to set IVS.  */
4216
4217 static void
4218 iv_ca_set_remove_invariants (struct iv_ca *ivs, bitmap invs)
4219 {
4220   bitmap_iterator bi;
4221   unsigned iid;
4222
4223   if (!invs)
4224     return;
4225
4226   EXECUTE_IF_SET_IN_BITMAP (invs, 0, iid, bi)
4227     {
4228       ivs->n_invariant_uses[iid]--;
4229       if (ivs->n_invariant_uses[iid] == 0)
4230         ivs->n_regs--;
4231     }
4232 }
4233
4234 /* Set USE not to be expressed by any candidate in IVS.  */
4235
4236 static void
4237 iv_ca_set_no_cp (struct ivopts_data *data, struct iv_ca *ivs,
4238                  struct iv_use *use)
4239 {
4240   unsigned uid = use->id, cid;
4241   struct cost_pair *cp;
4242
4243   cp = ivs->cand_for_use[uid];
4244   if (!cp)
4245     return;
4246   cid = cp->cand->id;
4247
4248   ivs->bad_uses++;
4249   ivs->cand_for_use[uid] = NULL;
4250   ivs->n_cand_uses[cid]--;
4251
4252   if (ivs->n_cand_uses[cid] == 0)
4253     {
4254       bitmap_clear_bit (ivs->cands, cid);
4255       /* Do not count the pseudocandidates.  */
4256       if (cp->cand->iv)
4257         ivs->n_regs--;
4258       ivs->n_cands--;
4259       ivs->cand_cost -= cp->cand->cost;
4260
4261       iv_ca_set_remove_invariants (ivs, cp->cand->depends_on);
4262     }
4263
4264   ivs->cand_use_cost = sub_costs (ivs->cand_use_cost, cp->cost);
4265
4266   iv_ca_set_remove_invariants (ivs, cp->depends_on);
4267   iv_ca_recount_cost (data, ivs);
4268 }
4269
4270 /* Add invariants in set INVS to set IVS.  */
4271
4272 static void
4273 iv_ca_set_add_invariants (struct iv_ca *ivs, bitmap invs)
4274 {
4275   bitmap_iterator bi;
4276   unsigned iid;
4277
4278   if (!invs)
4279     return;
4280
4281   EXECUTE_IF_SET_IN_BITMAP (invs, 0, iid, bi)
4282     {
4283       ivs->n_invariant_uses[iid]++;
4284       if (ivs->n_invariant_uses[iid] == 1)
4285         ivs->n_regs++;
4286     }
4287 }
4288
4289 /* Set cost pair for USE in set IVS to CP.  */
4290
4291 static void
4292 iv_ca_set_cp (struct ivopts_data *data, struct iv_ca *ivs,
4293               struct iv_use *use, struct cost_pair *cp)
4294 {
4295   unsigned uid = use->id, cid;
4296
4297   if (ivs->cand_for_use[uid] == cp)
4298     return;
4299
4300   if (ivs->cand_for_use[uid])
4301     iv_ca_set_no_cp (data, ivs, use);
4302
4303   if (cp)
4304     {
4305       cid = cp->cand->id;
4306
4307       ivs->bad_uses--;
4308       ivs->cand_for_use[uid] = cp;
4309       ivs->n_cand_uses[cid]++;
4310       if (ivs->n_cand_uses[cid] == 1)
4311         {
4312           bitmap_set_bit (ivs->cands, cid);
4313           /* Do not count the pseudocandidates.  */
4314           if (cp->cand->iv)
4315             ivs->n_regs++;
4316           ivs->n_cands++;
4317           ivs->cand_cost += cp->cand->cost;
4318
4319           iv_ca_set_add_invariants (ivs, cp->cand->depends_on);
4320         }
4321
4322       ivs->cand_use_cost = add_costs (ivs->cand_use_cost, cp->cost);
4323       iv_ca_set_add_invariants (ivs, cp->depends_on);
4324       iv_ca_recount_cost (data, ivs);
4325     }
4326 }
4327
4328 /* Extend set IVS by expressing USE by some of the candidates in it
4329    if possible.  */
4330
4331 static void
4332 iv_ca_add_use (struct ivopts_data *data, struct iv_ca *ivs,
4333                struct iv_use *use)
4334 {
4335   struct cost_pair *best_cp = NULL, *cp;
4336   bitmap_iterator bi;
4337   unsigned i;
4338
4339   gcc_assert (ivs->upto >= use->id);
4340
4341   if (ivs->upto == use->id)
4342     {
4343       ivs->upto++;
4344       ivs->bad_uses++;
4345     }
4346
4347   EXECUTE_IF_SET_IN_BITMAP (ivs->cands, 0, i, bi)
4348     {
4349       cp = get_use_iv_cost (data, use, iv_cand (data, i));
4350
4351       if (cheaper_cost_pair (cp, best_cp))
4352         best_cp = cp;
4353     }
4354
4355   iv_ca_set_cp (data, ivs, use, best_cp);
4356 }
4357
4358 /* Get cost for assignment IVS.  */
4359
4360 static comp_cost
4361 iv_ca_cost (struct iv_ca *ivs)
4362 {
4363   /* This was a conditional expression but it triggered a bug in the
4364      Solaris 8 compiler.  */
4365   if (ivs->bad_uses)
4366     return infinite_cost;
4367   else
4368     return ivs->cost;
4369 }
4370
4371 /* Returns true if all dependences of CP are among invariants in IVS.  */
4372
4373 static bool
4374 iv_ca_has_deps (struct iv_ca *ivs, struct cost_pair *cp)
4375 {
4376   unsigned i;
4377   bitmap_iterator bi;
4378
4379   if (!cp->depends_on)
4380     return true;
4381
4382   EXECUTE_IF_SET_IN_BITMAP (cp->depends_on, 0, i, bi)
4383     {
4384       if (ivs->n_invariant_uses[i] == 0)
4385         return false;
4386     }
4387
4388   return true;
4389 }
4390
4391 /* Creates change of expressing USE by NEW_CP instead of OLD_CP and chains
4392    it before NEXT_CHANGE.  */
4393
4394 static struct iv_ca_delta *
4395 iv_ca_delta_add (struct iv_use *use, struct cost_pair *old_cp,
4396                  struct cost_pair *new_cp, struct iv_ca_delta *next_change)
4397 {
4398   struct iv_ca_delta *change = XNEW (struct iv_ca_delta);
4399
4400   change->use = use;
4401   change->old_cp = old_cp;
4402   change->new_cp = new_cp;
4403   change->next_change = next_change;
4404
4405   return change;
4406 }
4407
4408 /* Joins two lists of changes L1 and L2.  Destructive -- old lists
4409    are rewritten.  */
4410
4411 static struct iv_ca_delta *
4412 iv_ca_delta_join (struct iv_ca_delta *l1, struct iv_ca_delta *l2)
4413 {
4414   struct iv_ca_delta *last;
4415
4416   if (!l2)
4417     return l1;
4418
4419   if (!l1)
4420     return l2;
4421
4422   for (last = l1; last->next_change; last = last->next_change)
4423     continue;
4424   last->next_change = l2;
4425
4426   return l1;
4427 }
4428
4429 /* Returns candidate by that USE is expressed in IVS.  */
4430
4431 static struct cost_pair *
4432 iv_ca_cand_for_use (struct iv_ca *ivs, struct iv_use *use)
4433 {
4434   return ivs->cand_for_use[use->id];
4435 }
4436
4437 /* Reverse the list of changes DELTA, forming the inverse to it.  */
4438
4439 static struct iv_ca_delta *
4440 iv_ca_delta_reverse (struct iv_ca_delta *delta)
4441 {
4442   struct iv_ca_delta *act, *next, *prev = NULL;
4443   struct cost_pair *tmp;
4444
4445   for (act = delta; act; act = next)
4446     {
4447       next = act->next_change;
4448       act->next_change = prev;
4449       prev = act;
4450
4451       tmp = act->old_cp;
4452       act->old_cp = act->new_cp;
4453       act->new_cp = tmp;
4454     }
4455
4456   return prev;
4457 }
4458
4459 /* Commit changes in DELTA to IVS.  If FORWARD is false, the changes are
4460    reverted instead.  */
4461
4462 static void
4463 iv_ca_delta_commit (struct ivopts_data *data, struct iv_ca *ivs,
4464                     struct iv_ca_delta *delta, bool forward)
4465 {
4466   struct cost_pair *from, *to;
4467   struct iv_ca_delta *act;
4468
4469   if (!forward)
4470     delta = iv_ca_delta_reverse (delta);
4471
4472   for (act = delta; act; act = act->next_change)
4473     {
4474       from = act->old_cp;
4475       to = act->new_cp;
4476       gcc_assert (iv_ca_cand_for_use (ivs, act->use) == from);
4477       iv_ca_set_cp (data, ivs, act->use, to);
4478     }
4479
4480   if (!forward)
4481     iv_ca_delta_reverse (delta);
4482 }
4483
4484 /* Returns true if CAND is used in IVS.  */
4485
4486 static bool
4487 iv_ca_cand_used_p (struct iv_ca *ivs, struct iv_cand *cand)
4488 {
4489   return ivs->n_cand_uses[cand->id] > 0;
4490 }
4491
4492 /* Returns number of induction variable candidates in the set IVS.  */
4493
4494 static unsigned
4495 iv_ca_n_cands (struct iv_ca *ivs)
4496 {
4497   return ivs->n_cands;
4498 }
4499
4500 /* Free the list of changes DELTA.  */
4501
4502 static void
4503 iv_ca_delta_free (struct iv_ca_delta **delta)
4504 {
4505   struct iv_ca_delta *act, *next;
4506
4507   for (act = *delta; act; act = next)
4508     {
4509       next = act->next_change;
4510       free (act);
4511     }
4512
4513   *delta = NULL;
4514 }
4515
4516 /* Allocates new iv candidates assignment.  */
4517
4518 static struct iv_ca *
4519 iv_ca_new (struct ivopts_data *data)
4520 {
4521   struct iv_ca *nw = XNEW (struct iv_ca);
4522
4523   nw->upto = 0;
4524   nw->bad_uses = 0;
4525   nw->cand_for_use = XCNEWVEC (struct cost_pair *, n_iv_uses (data));
4526   nw->n_cand_uses = XCNEWVEC (unsigned, n_iv_cands (data));
4527   nw->cands = BITMAP_ALLOC (NULL);
4528   nw->n_cands = 0;
4529   nw->n_regs = 0;
4530   nw->cand_use_cost = zero_cost;
4531   nw->cand_cost = 0;
4532   nw->n_invariant_uses = XCNEWVEC (unsigned, data->max_inv_id + 1);
4533   nw->cost = zero_cost;
4534
4535   return nw;
4536 }
4537
4538 /* Free memory occupied by the set IVS.  */
4539
4540 static void
4541 iv_ca_free (struct iv_ca **ivs)
4542 {
4543   free ((*ivs)->cand_for_use);
4544   free ((*ivs)->n_cand_uses);
4545   BITMAP_FREE ((*ivs)->cands);
4546   free ((*ivs)->n_invariant_uses);
4547   free (*ivs);
4548   *ivs = NULL;
4549 }
4550
4551 /* Dumps IVS to FILE.  */
4552
4553 static void
4554 iv_ca_dump (struct ivopts_data *data, FILE *file, struct iv_ca *ivs)
4555 {
4556   const char *pref = "  invariants ";
4557   unsigned i;
4558   comp_cost cost = iv_ca_cost (ivs);
4559
4560   fprintf (file, "  cost %d (complexity %d)\n", cost.cost, cost.complexity);
4561   bitmap_print (file, ivs->cands, "  candidates ","\n");
4562
4563   for (i = 1; i <= data->max_inv_id; i++)
4564     if (ivs->n_invariant_uses[i])
4565       {
4566         fprintf (file, "%s%d", pref, i);
4567         pref = ", ";
4568       }
4569   fprintf (file, "\n");
4570 }
4571
4572 /* Try changing candidate in IVS to CAND for each use.  Return cost of the
4573    new set, and store differences in DELTA.  Number of induction variables
4574    in the new set is stored to N_IVS.  */
4575
4576 static comp_cost
4577 iv_ca_extend (struct ivopts_data *data, struct iv_ca *ivs,
4578               struct iv_cand *cand, struct iv_ca_delta **delta,
4579               unsigned *n_ivs)
4580 {
4581   unsigned i;
4582   comp_cost cost;
4583   struct iv_use *use;
4584   struct cost_pair *old_cp, *new_cp;
4585
4586   *delta = NULL;
4587   for (i = 0; i < ivs->upto; i++)
4588     {
4589       use = iv_use (data, i);
4590       old_cp = iv_ca_cand_for_use (ivs, use);
4591
4592       if (old_cp
4593           && old_cp->cand == cand)
4594         continue;
4595
4596       new_cp = get_use_iv_cost (data, use, cand);
4597       if (!new_cp)
4598         continue;
4599
4600       if (!iv_ca_has_deps (ivs, new_cp))
4601         continue;
4602       
4603       if (!cheaper_cost_pair (new_cp, old_cp))
4604         continue;
4605
4606       *delta = iv_ca_delta_add (use, old_cp, new_cp, *delta);
4607     }
4608
4609   iv_ca_delta_commit (data, ivs, *delta, true);
4610   cost = iv_ca_cost (ivs);
4611   if (n_ivs)
4612     *n_ivs = iv_ca_n_cands (ivs);
4613   iv_ca_delta_commit (data, ivs, *delta, false);
4614
4615   return cost;
4616 }
4617
4618 /* Try narrowing set IVS by removing CAND.  Return the cost of
4619    the new set and store the differences in DELTA.  */
4620
4621 static comp_cost
4622 iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs,
4623               struct iv_cand *cand, struct iv_ca_delta **delta)
4624 {
4625   unsigned i, ci;
4626   struct iv_use *use;
4627   struct cost_pair *old_cp, *new_cp, *cp;
4628   bitmap_iterator bi;
4629   struct iv_cand *cnd;
4630   comp_cost cost;
4631
4632   *delta = NULL;
4633   for (i = 0; i < n_iv_uses (data); i++)
4634     {
4635       use = iv_use (data, i);
4636
4637       old_cp = iv_ca_cand_for_use (ivs, use);
4638       if (old_cp->cand != cand)
4639         continue;
4640
4641       new_cp = NULL;
4642
4643       if (data->consider_all_candidates)
4644         {
4645           EXECUTE_IF_SET_IN_BITMAP (ivs->cands, 0, ci, bi)
4646             {
4647               if (ci == cand->id)
4648                 continue;
4649
4650               cnd = iv_cand (data, ci);
4651
4652               cp = get_use_iv_cost (data, use, cnd);
4653               if (!cp)
4654                 continue;
4655               if (!iv_ca_has_deps (ivs, cp))
4656                 continue;
4657       
4658               if (!cheaper_cost_pair (cp, new_cp))
4659                 continue;
4660
4661               new_cp = cp;
4662             }
4663         }
4664       else
4665         {
4666           EXECUTE_IF_AND_IN_BITMAP (use->related_cands, ivs->cands, 0, ci, bi)
4667             {
4668               if (ci == cand->id)
4669                 continue;
4670
4671               cnd = iv_cand (data, ci);
4672
4673               cp = get_use_iv_cost (data, use, cnd);
4674               if (!cp)
4675                 continue;
4676               if (!iv_ca_has_deps (ivs, cp))
4677                 continue;
4678       
4679               if (!cheaper_cost_pair (cp, new_cp))
4680                 continue;
4681
4682               new_cp = cp;
4683             }
4684         }
4685
4686       if (!new_cp)
4687         {
4688           iv_ca_delta_free (delta);
4689           return infinite_cost;
4690         }
4691
4692       *delta = iv_ca_delta_add (use, old_cp, new_cp, *delta);
4693     }
4694
4695   iv_ca_delta_commit (data, ivs, *delta, true);
4696   cost = iv_ca_cost (ivs);
4697   iv_ca_delta_commit (data, ivs, *delta, false);
4698
4699   return cost;
4700 }
4701
4702 /* Try optimizing the set of candidates IVS by removing candidates different
4703    from to EXCEPT_CAND from it.  Return cost of the new set, and store
4704    differences in DELTA.  */
4705
4706 static comp_cost
4707 iv_ca_prune (struct ivopts_data *data, struct iv_ca *ivs,
4708              struct iv_cand *except_cand, struct iv_ca_delta **delta)
4709 {
4710   bitmap_iterator bi;
4711   struct iv_ca_delta *act_delta, *best_delta;
4712   unsigned i;
4713   comp_cost best_cost, acost;
4714   struct iv_cand *cand;
4715
4716   best_delta = NULL;
4717   best_cost = iv_ca_cost (ivs);
4718
4719   EXECUTE_IF_SET_IN_BITMAP (ivs->cands, 0, i, bi)
4720     {
4721       cand = iv_cand (data, i);
4722
4723       if (cand == except_cand)
4724         continue;
4725
4726       acost = iv_ca_narrow (data, ivs, cand, &act_delta);
4727
4728       if (compare_costs (acost, best_cost) < 0)
4729         {
4730           best_cost = acost;
4731           iv_ca_delta_free (&best_delta);
4732           best_delta = act_delta;
4733         }
4734       else
4735         iv_ca_delta_free (&act_delta);
4736     }
4737
4738   if (!best_delta)
4739     {
4740       *delta = NULL;
4741       return best_cost;
4742     }
4743
4744   /* Recurse to possibly remove other unnecessary ivs.  */
4745   iv_ca_delta_commit (data, ivs, best_delta, true);
4746   best_cost = iv_ca_prune (data, ivs, except_cand, delta);
4747   iv_ca_delta_commit (data, ivs, best_delta, false);
4748   *delta = iv_ca_delta_join (best_delta, *delta);
4749   return best_cost;
4750 }
4751
4752 /* Tries to extend the sets IVS in the best possible way in order
4753    to express the USE.  */
4754
4755 static bool
4756 try_add_cand_for (struct ivopts_data *data, struct iv_ca *ivs,
4757                   struct iv_use *use)
4758 {
4759   comp_cost best_cost, act_cost;
4760   unsigned i;
4761   bitmap_iterator bi;
4762   struct iv_cand *cand;
4763   struct iv_ca_delta *best_delta = NULL, *act_delta;
4764   struct cost_pair *cp;
4765
4766   iv_ca_add_use (data, ivs, use);
4767   best_cost = iv_ca_cost (ivs);
4768
4769   cp = iv_ca_cand_for_use (ivs, use);
4770   if (cp)
4771     {
4772       best_delta = iv_ca_delta_add (use, NULL, cp, NULL);
4773       iv_ca_set_no_cp (data, ivs, use);
4774     }
4775
4776   /* First try important candidates not based on any memory object.  Only if
4777      this fails, try the specific ones.  Rationale -- in loops with many
4778      variables the best choice often is to use just one generic biv.  If we
4779      added here many ivs specific to the uses, the optimization algorithm later
4780      would be likely to get stuck in a local minimum, thus causing us to create
4781      too many ivs.  The approach from few ivs to more seems more likely to be
4782      successful -- starting from few ivs, replacing an expensive use by a
4783      specific iv should always be a win.  */
4784   EXECUTE_IF_SET_IN_BITMAP (data->important_candidates, 0, i, bi)
4785     {
4786       cand = iv_cand (data, i);
4787
4788       if (cand->iv->base_object != NULL_TREE)
4789         continue;
4790
4791       if (iv_ca_cand_used_p (ivs, cand))
4792         continue;
4793
4794       cp = get_use_iv_cost (data, use, cand);
4795       if (!cp)
4796         continue;
4797
4798       iv_ca_set_cp (data, ivs, use, cp);
4799       act_cost = iv_ca_extend (data, ivs, cand, &act_delta, NULL);
4800       iv_ca_set_no_cp (data, ivs, use);
4801       act_delta = iv_ca_delta_add (use, NULL, cp, act_delta);
4802
4803       if (compare_costs (act_cost, best_cost) < 0)
4804         {
4805           best_cost = act_cost;
4806
4807           iv_ca_delta_free (&best_delta);
4808           best_delta = act_delta;
4809         }
4810       else
4811         iv_ca_delta_free (&act_delta);
4812     }
4813
4814   if (infinite_cost_p (best_cost))
4815     {
4816       for (i = 0; i < use->n_map_members; i++)
4817         {
4818           cp = use->cost_map + i;
4819           cand = cp->cand;
4820           if (!cand)
4821             continue;
4822
4823           /* Already tried this.  */
4824           if (cand->important && cand->iv->base_object == NULL_TREE)
4825             continue;
4826       
4827           if (iv_ca_cand_used_p (ivs, cand))
4828             continue;
4829
4830           act_delta = NULL;
4831           iv_ca_set_cp (data, ivs, use, cp);
4832           act_cost = iv_ca_extend (data, ivs, cand, &act_delta, NULL);
4833           iv_ca_set_no_cp (data, ivs, use);
4834           act_delta = iv_ca_delta_add (use, iv_ca_cand_for_use (ivs, use),
4835                                        cp, act_delta);
4836
4837           if (compare_costs (act_cost, best_cost) < 0)
4838             {
4839               best_cost = act_cost;
4840
4841               if (best_delta)
4842                 iv_ca_delta_free (&best_delta);
4843               best_delta = act_delta;
4844             }
4845           else
4846             iv_ca_delta_free (&act_delta);
4847         }
4848     }
4849
4850   iv_ca_delta_commit (data, ivs, best_delta, true);
4851   iv_ca_delta_free (&best_delta);
4852
4853   return !infinite_cost_p (best_cost);
4854 }
4855
4856 /* Finds an initial assignment of candidates to uses.  */
4857
4858 static struct iv_ca *
4859 get_initial_solution (struct ivopts_data *data)
4860 {
4861   struct iv_ca *ivs = iv_ca_new (data);
4862   unsigned i;
4863
4864   for (i = 0; i < n_iv_uses (data); i++)
4865     if (!try_add_cand_for (data, ivs, iv_use (data, i)))
4866       {
4867         iv_ca_free (&ivs);
4868         return NULL;
4869       }
4870
4871   return ivs;
4872 }
4873
4874 /* Tries to improve set of induction variables IVS.  */
4875
4876 static bool
4877 try_improve_iv_set (struct ivopts_data *data, struct iv_ca *ivs)
4878 {
4879   unsigned i, n_ivs;
4880   comp_cost acost, best_cost = iv_ca_cost (ivs);
4881   struct iv_ca_delta *best_delta = NULL, *act_delta, *tmp_delta;
4882   struct iv_cand *cand;
4883
4884   /* Try extending the set of induction variables by one.  */
4885   for (i = 0; i < n_iv_cands (data); i++)
4886     {
4887       cand = iv_cand (data, i);
4888       
4889       if (iv_ca_cand_used_p (ivs, cand))
4890         continue;
4891
4892       acost = iv_ca_extend (data, ivs, cand, &act_delta, &n_ivs);
4893       if (!act_delta)
4894         continue;
4895
4896       /* If we successfully added the candidate and the set is small enough,
4897          try optimizing it by removing other candidates.  */
4898       if (n_ivs <= ALWAYS_PRUNE_CAND_SET_BOUND)
4899         {
4900           iv_ca_delta_commit (data, ivs, act_delta, true);
4901           acost = iv_ca_prune (data, ivs, cand, &tmp_delta);
4902           iv_ca_delta_commit (data, ivs, act_delta, false);
4903           act_delta = iv_ca_delta_join (act_delta, tmp_delta);
4904         }
4905
4906       if (compare_costs (acost, best_cost) < 0)
4907         {
4908           best_cost = acost;
4909           iv_ca_delta_free (&best_delta);
4910           best_delta = act_delta;
4911         }
4912       else
4913         iv_ca_delta_free (&act_delta);
4914     }
4915
4916   if (!best_delta)
4917     {
4918       /* Try removing the candidates from the set instead.  */
4919       best_cost = iv_ca_prune (data, ivs, NULL, &best_delta);
4920
4921       /* Nothing more we can do.  */
4922       if (!best_delta)
4923         return false;
4924     }
4925
4926   iv_ca_delta_commit (data, ivs, best_delta, true);
4927   gcc_assert (compare_costs (best_cost, iv_ca_cost (ivs)) == 0);
4928   iv_ca_delta_free (&best_delta);
4929   return true;
4930 }
4931
4932 /* Attempts to find the optimal set of induction variables.  We do simple
4933    greedy heuristic -- we try to replace at most one candidate in the selected
4934    solution and remove the unused ivs while this improves the cost.  */
4935
4936 static struct iv_ca *
4937 find_optimal_iv_set (struct ivopts_data *data)
4938 {
4939   unsigned i;
4940   struct iv_ca *set;
4941   struct iv_use *use;
4942
4943   /* Get the initial solution.  */
4944   set = get_initial_solution (data);
4945   if (!set)
4946     {
4947       if (dump_file && (dump_flags & TDF_DETAILS))
4948         fprintf (dump_file, "Unable to substitute for ivs, failed.\n");
4949       return NULL;
4950     }
4951
4952   if (dump_file && (dump_flags & TDF_DETAILS))
4953     {
4954       fprintf (dump_file, "Initial set of candidates:\n");
4955       iv_ca_dump (data, dump_file, set);
4956     }
4957
4958   while (try_improve_iv_set (data, set))
4959     {
4960       if (dump_file && (dump_flags & TDF_DETAILS))
4961         {
4962           fprintf (dump_file, "Improved to:\n");
4963           iv_ca_dump (data, dump_file, set);
4964         }
4965     }
4966
4967   if (dump_file && (dump_flags & TDF_DETAILS))
4968     {
4969       comp_cost cost = iv_ca_cost (set);
4970       fprintf (dump_file, "Final cost %d (complexity %d)\n\n", cost.cost, cost.complexity);
4971     }
4972
4973   for (i = 0; i < n_iv_uses (data); i++)
4974     {
4975       use = iv_use (data, i);
4976       use->selected = iv_ca_cand_for_use (set, use)->cand;
4977     }
4978
4979   return set;
4980 }
4981
4982 /* Creates a new induction variable corresponding to CAND.  */
4983
4984 static void
4985 create_new_iv (struct ivopts_data *data, struct iv_cand *cand)
4986 {
4987   gimple_stmt_iterator incr_pos;
4988   tree base;
4989   bool after = false;
4990
4991   if (!cand->iv)
4992     return;
4993
4994   switch (cand->pos)
4995     {
4996     case IP_NORMAL:
4997       incr_pos = gsi_last_bb (ip_normal_pos (data->current_loop));
4998       break;
4999
5000     case IP_END:
5001       incr_pos = gsi_last_bb (ip_end_pos (data->current_loop));
5002       after = true;
5003       break;
5004
5005     case IP_ORIGINAL:
5006       /* Mark that the iv is preserved.  */
5007       name_info (data, cand->var_before)->preserve_biv = true;
5008       name_info (data, cand->var_after)->preserve_biv = true;
5009
5010       /* Rewrite the increment so that it uses var_before directly.  */
5011       find_interesting_uses_op (data, cand->var_after)->selected = cand;
5012       
5013       return;
5014     }
5015  
5016   gimple_add_tmp_var (cand->var_before);
5017   add_referenced_var (cand->var_before);
5018
5019   base = unshare_expr (cand->iv->base);
5020
5021   create_iv (base, unshare_expr (cand->iv->step),
5022              cand->var_before, data->current_loop,
5023              &incr_pos, after, &cand->var_before, &cand->var_after);
5024 }
5025
5026 /* Creates new induction variables described in SET.  */
5027
5028 static void
5029 create_new_ivs (struct ivopts_data *data, struct iv_ca *set)
5030 {
5031   unsigned i;
5032   struct iv_cand *cand;
5033   bitmap_iterator bi;
5034
5035   EXECUTE_IF_SET_IN_BITMAP (set->cands, 0, i, bi)
5036     {
5037       cand = iv_cand (data, i);
5038       create_new_iv (data, cand);
5039     }
5040 }
5041
5042 /* Returns the phi-node in BB with result RESULT.  */
5043
5044 static gimple
5045 get_phi_with_result (basic_block bb, tree result)
5046 {
5047   gimple_stmt_iterator i = gsi_start_phis (bb);
5048
5049   for (; !gsi_end_p (i); gsi_next (&i))
5050     if (gimple_phi_result (gsi_stmt (i)) == result)
5051       return gsi_stmt (i);
5052
5053   gcc_unreachable ();
5054   return NULL;
5055 }
5056
5057
5058 /* Removes statement STMT (real or a phi node).  If INCLUDING_DEFINED_NAME
5059    is true, remove also the ssa name defined by the statement.  */
5060
5061 static void
5062 remove_statement (gimple stmt, bool including_defined_name)
5063 {
5064   if (gimple_code (stmt) == GIMPLE_PHI)
5065     {
5066       gimple bb_phi = get_phi_with_result (gimple_bb (stmt), 
5067                                          gimple_phi_result (stmt));
5068       gimple_stmt_iterator bsi = gsi_for_stmt (bb_phi);
5069       remove_phi_node (&bsi, including_defined_name);
5070     }
5071   else
5072     {
5073       gimple_stmt_iterator bsi = gsi_for_stmt (stmt);
5074       gsi_remove (&bsi, true);
5075       release_defs (stmt); 
5076     }
5077 }
5078
5079 /* Rewrites USE (definition of iv used in a nonlinear expression)
5080    using candidate CAND.  */
5081
5082 static void
5083 rewrite_use_nonlinear_expr (struct ivopts_data *data,
5084                             struct iv_use *use, struct iv_cand *cand)
5085 {
5086   tree comp;
5087   tree op, tgt;
5088   gimple ass;
5089   gimple_stmt_iterator bsi;
5090
5091   /* An important special case -- if we are asked to express value of
5092      the original iv by itself, just exit; there is no need to
5093      introduce a new computation (that might also need casting the
5094      variable to unsigned and back).  */
5095   if (cand->pos == IP_ORIGINAL
5096       && cand->incremented_at == use->stmt)
5097     {
5098       tree step, ctype, utype;
5099       enum tree_code incr_code = PLUS_EXPR, old_code;
5100
5101       gcc_assert (is_gimple_assign (use->stmt));
5102       gcc_assert (gimple_assign_lhs (use->stmt) == cand->var_after);
5103
5104       step = cand->iv->step;
5105       ctype = TREE_TYPE (step);
5106       utype = TREE_TYPE (cand->var_after);
5107       if (TREE_CODE (step) == NEGATE_EXPR)
5108         {
5109           incr_code = MINUS_EXPR;
5110           step = TREE_OPERAND (step, 0);
5111         }
5112
5113       /* Check whether we may leave the computation unchanged.
5114          This is the case only if it does not rely on other
5115          computations in the loop -- otherwise, the computation
5116          we rely upon may be removed in remove_unused_ivs,
5117          thus leading to ICE.  */
5118       old_code = gimple_assign_rhs_code (use->stmt);
5119       if (old_code == PLUS_EXPR
5120           || old_code == MINUS_EXPR
5121           || old_code == POINTER_PLUS_EXPR)
5122         {
5123           if (gimple_assign_rhs1 (use->stmt) == cand->var_before)
5124             op = gimple_assign_rhs2 (use->stmt);
5125           else if (old_code != MINUS_EXPR
5126                    && gimple_assign_rhs2 (use->stmt) == cand->var_before)
5127             op = gimple_assign_rhs1 (use->stmt);
5128           else
5129             op = NULL_TREE;
5130         }
5131       else
5132         op = NULL_TREE;
5133
5134       if (op
5135           && (TREE_CODE (op) == INTEGER_CST
5136               || operand_equal_p (op, step, 0)))
5137         return;
5138
5139       /* Otherwise, add the necessary computations to express
5140          the iv.  */
5141       op = fold_convert (ctype, cand->var_before);
5142       comp = fold_convert (utype,
5143                            build2 (incr_code, ctype, op,
5144                                    unshare_expr (step)));
5145     }
5146   else
5147     {
5148       comp = get_computation (data->current_loop, use, cand);
5149       gcc_assert (comp != NULL_TREE);
5150     }
5151
5152   switch (gimple_code (use->stmt))
5153     {
5154     case GIMPLE_PHI:
5155       tgt = PHI_RESULT (use->stmt);
5156
5157       /* If we should keep the biv, do not replace it.  */
5158       if (name_info (data, tgt)->preserve_biv)
5159         return;
5160
5161       bsi = gsi_after_labels (gimple_bb (use->stmt));
5162       break;
5163
5164     case GIMPLE_ASSIGN:
5165       tgt = gimple_assign_lhs (use->stmt);
5166       bsi = gsi_for_stmt (use->stmt);
5167       break;
5168
5169     default:
5170       gcc_unreachable ();
5171     }
5172
5173   op = force_gimple_operand_gsi (&bsi, comp, false, SSA_NAME_VAR (tgt),
5174                                  true, GSI_SAME_STMT);
5175
5176   if (gimple_code (use->stmt) == GIMPLE_PHI)
5177     {
5178       ass = gimple_build_assign (tgt, op);
5179       gsi_insert_before (&bsi, ass, GSI_SAME_STMT);
5180       remove_statement (use->stmt, false);
5181     }
5182   else
5183     {
5184       gimple_assign_set_rhs_from_tree (&bsi, op);
5185       use->stmt = gsi_stmt (bsi);
5186     }
5187 }
5188
5189 /* Replaces ssa name in index IDX by its basic variable.  Callback for
5190    for_each_index.  */
5191
5192 static bool
5193 idx_remove_ssa_names (tree base, tree *idx,
5194                       void *data ATTRIBUTE_UNUSED)
5195 {
5196   tree *op;
5197
5198   if (TREE_CODE (*idx) == SSA_NAME)
5199     *idx = SSA_NAME_VAR (*idx);
5200
5201   if (TREE_CODE (base) == ARRAY_REF || TREE_CODE (base) == ARRAY_RANGE_REF)
5202     {
5203       op = &TREE_OPERAND (base, 2);
5204       if (*op
5205           && TREE_CODE (*op) == SSA_NAME)
5206         *op = SSA_NAME_VAR (*op);
5207       op = &TREE_OPERAND (base, 3);
5208       if (*op
5209           && TREE_CODE (*op) == SSA_NAME)
5210         *op = SSA_NAME_VAR (*op);
5211     }
5212
5213   return true;
5214 }
5215
5216 /* Unshares REF and replaces ssa names inside it by their basic variables.  */
5217
5218 static tree
5219 unshare_and_remove_ssa_names (tree ref)
5220 {
5221   ref = unshare_expr (ref);
5222   for_each_index (&ref, idx_remove_ssa_names, NULL);
5223
5224   return ref;
5225 }
5226
5227 /* Extract the alias analysis info for the memory reference REF.  There are
5228    several ways how this information may be stored and what precisely is
5229    its semantics depending on the type of the reference, but there always is
5230    somewhere hidden one _DECL node that is used to determine the set of
5231    virtual operands for the reference.  The code below deciphers this jungle
5232    and extracts this single useful piece of information.  */
5233
5234 static tree
5235 get_ref_tag (tree ref, tree orig)
5236 {
5237   tree var = get_base_address (ref);
5238   tree aref = NULL_TREE, tag, sv;
5239   HOST_WIDE_INT offset, size, maxsize;
5240
5241   for (sv = orig; handled_component_p (sv); sv = TREE_OPERAND (sv, 0))
5242     {
5243       aref = get_ref_base_and_extent (sv, &offset, &size, &maxsize);
5244       if (ref)
5245         break;
5246     }
5247
5248   if (!var)
5249     return NULL_TREE;
5250
5251   if (TREE_CODE (var) == INDIRECT_REF)
5252     {
5253       /* If the base is a dereference of a pointer, first check its name memory
5254          tag.  If it does not have one, use its symbol memory tag.  */
5255       var = TREE_OPERAND (var, 0);
5256       if (TREE_CODE (var) != SSA_NAME)
5257         return NULL_TREE;
5258
5259       if (SSA_NAME_PTR_INFO (var))
5260         {
5261           tag = SSA_NAME_PTR_INFO (var)->name_mem_tag;
5262           if (tag)
5263             return tag;
5264         }
5265  
5266       var = SSA_NAME_VAR (var);
5267       tag = symbol_mem_tag (var);
5268       gcc_assert (tag != NULL_TREE);
5269       return tag;
5270     }
5271   else
5272     { 
5273       if (!DECL_P (var))
5274         return NULL_TREE;
5275
5276       tag = symbol_mem_tag (var);
5277       if (tag)
5278         return tag;
5279
5280       return var;
5281     }
5282 }
5283
5284 /* Copies the reference information from OLD_REF to NEW_REF.  */
5285
5286 static void
5287 copy_ref_info (tree new_ref, tree old_ref)
5288 {
5289   if (TREE_CODE (old_ref) == TARGET_MEM_REF)
5290     copy_mem_ref_info (new_ref, old_ref);
5291   else
5292     {
5293       TMR_ORIGINAL (new_ref) = unshare_and_remove_ssa_names (old_ref);
5294       TMR_TAG (new_ref) = get_ref_tag (old_ref, TMR_ORIGINAL (new_ref));
5295     }
5296 }
5297
5298 /* Rewrites USE (address that is an iv) using candidate CAND.  */
5299
5300 static void
5301 rewrite_use_address (struct ivopts_data *data,
5302                      struct iv_use *use, struct iv_cand *cand)
5303 {
5304   aff_tree aff;
5305   gimple_stmt_iterator bsi = gsi_for_stmt (use->stmt);
5306   tree ref;
5307   bool ok;
5308
5309   ok = get_computation_aff (data->current_loop, use, cand, use->stmt, &aff);
5310   gcc_assert (ok);
5311   unshare_aff_combination (&aff);
5312
5313   ref = create_mem_ref (&bsi, TREE_TYPE (*use->op_p), &aff, data->speed);
5314   copy_ref_info (ref, *use->op_p);
5315   *use->op_p = ref;
5316 }
5317
5318 /* Rewrites USE (the condition such that one of the arguments is an iv) using
5319    candidate CAND.  */
5320
5321 static void
5322 rewrite_use_compare (struct ivopts_data *data,
5323                      struct iv_use *use, struct iv_cand *cand)
5324 {
5325   tree comp, *var_p, op, bound;
5326   gimple_stmt_iterator bsi = gsi_for_stmt (use->stmt);
5327   enum tree_code compare;
5328   struct cost_pair *cp = get_use_iv_cost (data, use, cand);
5329   bool ok;
5330
5331   bound = cp->value;
5332   if (bound)
5333     {
5334       tree var = var_at_stmt (data->current_loop, cand, use->stmt);
5335       tree var_type = TREE_TYPE (var);
5336       gimple_seq stmts;
5337
5338       compare = iv_elimination_compare (data, use);
5339       bound = unshare_expr (fold_convert (var_type, bound));
5340       op = force_gimple_operand (bound, &stmts, true, NULL_TREE);
5341       if (stmts)
5342         gsi_insert_seq_on_edge_immediate (
5343                 loop_preheader_edge (data->current_loop),
5344                 stmts);
5345
5346       gimple_cond_set_lhs (use->stmt, var);
5347       gimple_cond_set_code (use->stmt, compare);
5348       gimple_cond_set_rhs (use->stmt, op);
5349       return;
5350     }
5351
5352   /* The induction variable elimination failed; just express the original
5353      giv.  */
5354   comp = get_computation (data->current_loop, use, cand);
5355   gcc_assert (comp != NULL_TREE);
5356
5357   ok = extract_cond_operands (data, use->stmt, &var_p, NULL, NULL, NULL);
5358   gcc_assert (ok);
5359
5360   *var_p = force_gimple_operand_gsi (&bsi, comp, true, SSA_NAME_VAR (*var_p),
5361                                      true, GSI_SAME_STMT);
5362 }
5363
5364 /* Rewrites USE using candidate CAND.  */
5365
5366 static void
5367 rewrite_use (struct ivopts_data *data, struct iv_use *use, struct iv_cand *cand)
5368 {
5369   push_stmt_changes (&use->stmt);
5370
5371   switch (use->type)
5372     {
5373       case USE_NONLINEAR_EXPR:
5374         rewrite_use_nonlinear_expr (data, use, cand);
5375         break;
5376
5377       case USE_ADDRESS:
5378         rewrite_use_address (data, use, cand);
5379         break;
5380
5381       case USE_COMPARE:
5382         rewrite_use_compare (data, use, cand);
5383         break;
5384
5385       default:
5386         gcc_unreachable ();
5387     }
5388
5389   pop_stmt_changes (&use->stmt);
5390 }
5391
5392 /* Rewrite the uses using the selected induction variables.  */
5393
5394 static void
5395 rewrite_uses (struct ivopts_data *data)
5396 {
5397   unsigned i;
5398   struct iv_cand *cand;
5399   struct iv_use *use;
5400
5401   for (i = 0; i < n_iv_uses (data); i++)
5402     {
5403       use = iv_use (data, i);
5404       cand = use->selected;
5405       gcc_assert (cand);
5406
5407       rewrite_use (data, use, cand);
5408     }
5409 }
5410
5411 /* Removes the ivs that are not used after rewriting.  */
5412
5413 static void
5414 remove_unused_ivs (struct ivopts_data *data)
5415 {
5416   unsigned j;
5417   bitmap_iterator bi;
5418
5419   EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, j, bi)
5420     {
5421       struct version_info *info;
5422
5423       info = ver_info (data, j);
5424       if (info->iv
5425           && !integer_zerop (info->iv->step)
5426           && !info->inv_id
5427           && !info->iv->have_use_for
5428           && !info->preserve_biv)
5429         remove_statement (SSA_NAME_DEF_STMT (info->iv->ssa_name), true);
5430     }
5431 }
5432
5433 /* Frees data allocated by the optimization of a single loop.  */
5434
5435 static void
5436 free_loop_data (struct ivopts_data *data)
5437 {
5438   unsigned i, j;
5439   bitmap_iterator bi;
5440   tree obj;
5441
5442   if (data->niters)
5443     {
5444       pointer_map_destroy (data->niters);
5445       data->niters = NULL;
5446     }
5447
5448   EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, i, bi)
5449     {
5450       struct version_info *info;
5451
5452       info = ver_info (data, i);
5453       if (info->iv)
5454         free (info->iv);
5455       info->iv = NULL;
5456       info->has_nonlin_use = false;
5457       info->preserve_biv = false;
5458       info->inv_id = 0;
5459     }
5460   bitmap_clear (data->relevant);
5461   bitmap_clear (data->important_candidates);
5462
5463   for (i = 0; i < n_iv_uses (data); i++)
5464     {
5465       struct iv_use *use = iv_use (data, i);
5466
5467       free (use->iv);
5468       BITMAP_FREE (use->related_cands);
5469       for (j = 0; j < use->n_map_members; j++)
5470         if (use->cost_map[j].depends_on)
5471           BITMAP_FREE (use->cost_map[j].depends_on);
5472       free (use->cost_map);
5473       free (use);
5474     }
5475   VEC_truncate (iv_use_p, data->iv_uses, 0);
5476
5477   for (i = 0; i < n_iv_cands (data); i++)
5478     {
5479       struct iv_cand *cand = iv_cand (data, i);
5480
5481       if (cand->iv)
5482         free (cand->iv);
5483       if (cand->depends_on)
5484         BITMAP_FREE (cand->depends_on);
5485       free (cand);
5486     }
5487   VEC_truncate (iv_cand_p, data->iv_candidates, 0);
5488
5489   if (data->version_info_size < num_ssa_names)
5490     {
5491       data->version_info_size = 2 * num_ssa_names;
5492       free (data->version_info);
5493       data->version_info = XCNEWVEC (struct version_info, data->version_info_size);
5494     }
5495
5496   data->max_inv_id = 0;
5497
5498   for (i = 0; VEC_iterate (tree, decl_rtl_to_reset, i, obj); i++)
5499     SET_DECL_RTL (obj, NULL_RTX);
5500
5501   VEC_truncate (tree, decl_rtl_to_reset, 0);
5502 }
5503
5504 /* Finalizes data structures used by the iv optimization pass.  LOOPS is the
5505    loop tree.  */
5506
5507 static void
5508 tree_ssa_iv_optimize_finalize (struct ivopts_data *data)
5509 {
5510   free_loop_data (data);
5511   free (data->version_info);
5512   BITMAP_FREE (data->relevant);
5513   BITMAP_FREE (data->important_candidates);
5514
5515   VEC_free (tree, heap, decl_rtl_to_reset);
5516   VEC_free (iv_use_p, heap, data->iv_uses);
5517   VEC_free (iv_cand_p, heap, data->iv_candidates);
5518 }
5519
5520 /* Optimizes the LOOP.  Returns true if anything changed.  */
5521
5522 static bool
5523 tree_ssa_iv_optimize_loop (struct ivopts_data *data, struct loop *loop)
5524 {
5525   bool changed = false;
5526   struct iv_ca *iv_ca;
5527   edge exit;
5528
5529   gcc_assert (!data->niters);
5530   data->current_loop = loop;
5531   data->speed = optimize_loop_for_speed_p (loop);
5532
5533   if (dump_file && (dump_flags & TDF_DETAILS))
5534     {
5535       fprintf (dump_file, "Processing loop %d\n", loop->num);
5536       
5537       exit = single_dom_exit (loop);
5538       if (exit)
5539         {
5540           fprintf (dump_file, "  single exit %d -> %d, exit condition ",
5541                    exit->src->index, exit->dest->index);
5542           print_gimple_stmt (dump_file, last_stmt (exit->src), 0, TDF_SLIM);
5543           fprintf (dump_file, "\n");
5544         }
5545
5546       fprintf (dump_file, "\n");
5547     }
5548
5549   /* For each ssa name determines whether it behaves as an induction variable
5550      in some loop.  */
5551   if (!find_induction_variables (data))
5552     goto finish;
5553
5554   /* Finds interesting uses (item 1).  */
5555   find_interesting_uses (data);
5556   if (n_iv_uses (data) > MAX_CONSIDERED_USES)
5557     goto finish;
5558
5559   /* Finds candidates for the induction variables (item 2).  */
5560   find_iv_candidates (data);
5561
5562   /* Calculates the costs (item 3, part 1).  */
5563   determine_use_iv_costs (data);
5564   determine_iv_costs (data);
5565   determine_set_costs (data);
5566
5567   /* Find the optimal set of induction variables (item 3, part 2).  */
5568   iv_ca = find_optimal_iv_set (data);
5569   if (!iv_ca)
5570     goto finish;
5571   changed = true;
5572
5573   /* Create the new induction variables (item 4, part 1).  */
5574   create_new_ivs (data, iv_ca);
5575   iv_ca_free (&iv_ca);
5576   
5577   /* Rewrite the uses (item 4, part 2).  */
5578   rewrite_uses (data);
5579
5580   /* Remove the ivs that are unused after rewriting.  */
5581   remove_unused_ivs (data);
5582
5583   /* We have changed the structure of induction variables; it might happen
5584      that definitions in the scev database refer to some of them that were
5585      eliminated.  */
5586   scev_reset ();
5587
5588 finish:
5589   free_loop_data (data);
5590
5591   return changed;
5592 }
5593
5594 /* Main entry point.  Optimizes induction variables in loops.  */
5595
5596 void
5597 tree_ssa_iv_optimize (void)
5598 {
5599   struct loop *loop;
5600   struct ivopts_data data;
5601   loop_iterator li;
5602
5603   tree_ssa_iv_optimize_init (&data);
5604
5605   /* Optimize the loops starting with the innermost ones.  */
5606   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
5607     {
5608       if (dump_file && (dump_flags & TDF_DETAILS))
5609         flow_loop_dump (loop, dump_file, NULL, 1);
5610
5611       tree_ssa_iv_optimize_loop (&data, loop);
5612     }
5613
5614   tree_ssa_iv_optimize_finalize (&data);
5615 }