OSDN Git Service

2008-12-08 Andrew Haley <aph@redhat.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   *bound = aff_combination_to_tree (&bnd);
3848   return true;
3849 }
3850
3851 /* Determines cost of basing replacement of USE on CAND in a condition.  */
3852
3853 static bool
3854 determine_use_iv_cost_condition (struct ivopts_data *data,
3855                                  struct iv_use *use, struct iv_cand *cand)
3856 {
3857   tree bound = NULL_TREE;
3858   struct iv *cmp_iv;
3859   bitmap depends_on_elim = NULL, depends_on_express = NULL, depends_on;
3860   comp_cost elim_cost, express_cost, cost;
3861   bool ok;
3862
3863   /* Only consider real candidates.  */
3864   if (!cand->iv)
3865     {
3866       set_use_iv_cost (data, use, cand, infinite_cost, NULL, NULL_TREE);
3867       return false;
3868     }
3869
3870   /* Try iv elimination.  */
3871   if (may_eliminate_iv (data, use, cand, &bound))
3872     {
3873       elim_cost = force_var_cost (data, bound, &depends_on_elim);
3874       /* The bound is a loop invariant, so it will be only computed
3875          once.  */
3876       elim_cost.cost /= AVG_LOOP_NITER (data->current_loop);
3877     }
3878   else
3879     elim_cost = infinite_cost;
3880
3881   /* Try expressing the original giv.  If it is compared with an invariant,
3882      note that we cannot get rid of it.  */
3883   ok = extract_cond_operands (data, use->stmt, NULL, NULL, NULL, &cmp_iv);
3884   gcc_assert (ok);
3885
3886   express_cost = get_computation_cost (data, use, cand, false,
3887                                        &depends_on_express);
3888   fd_ivopts_data = data;
3889   walk_tree (&cmp_iv->base, find_depends, &depends_on_express, NULL);
3890
3891   /* Choose the better approach, preferring the eliminated IV. */
3892   if (compare_costs (elim_cost, express_cost) <= 0)
3893     {
3894       cost = elim_cost;
3895       depends_on = depends_on_elim;
3896       depends_on_elim = NULL;
3897     }
3898   else
3899     {
3900       cost = express_cost;
3901       depends_on = depends_on_express;
3902       depends_on_express = NULL;
3903       bound = NULL_TREE;
3904     }
3905
3906   set_use_iv_cost (data, use, cand, cost, depends_on, bound);
3907
3908   if (depends_on_elim)
3909     BITMAP_FREE (depends_on_elim);
3910   if (depends_on_express)
3911     BITMAP_FREE (depends_on_express);
3912
3913   return !infinite_cost_p (cost);
3914 }
3915
3916 /* Determines cost of basing replacement of USE on CAND.  Returns false
3917    if USE cannot be based on CAND.  */
3918
3919 static bool
3920 determine_use_iv_cost (struct ivopts_data *data,
3921                        struct iv_use *use, struct iv_cand *cand)
3922 {
3923   switch (use->type)
3924     {
3925     case USE_NONLINEAR_EXPR:
3926       return determine_use_iv_cost_generic (data, use, cand);
3927
3928     case USE_ADDRESS:
3929       return determine_use_iv_cost_address (data, use, cand);
3930
3931     case USE_COMPARE:
3932       return determine_use_iv_cost_condition (data, use, cand);
3933
3934     default:
3935       gcc_unreachable ();
3936     }
3937 }
3938
3939 /* Determines costs of basing the use of the iv on an iv candidate.  */
3940
3941 static void
3942 determine_use_iv_costs (struct ivopts_data *data)
3943 {
3944   unsigned i, j;
3945   struct iv_use *use;
3946   struct iv_cand *cand;
3947   bitmap to_clear = BITMAP_ALLOC (NULL);
3948
3949   alloc_use_cost_map (data);
3950
3951   for (i = 0; i < n_iv_uses (data); i++)
3952     {
3953       use = iv_use (data, i);
3954
3955       if (data->consider_all_candidates)
3956         {
3957           for (j = 0; j < n_iv_cands (data); j++)
3958             {
3959               cand = iv_cand (data, j);
3960               determine_use_iv_cost (data, use, cand);
3961             }
3962         }
3963       else
3964         {
3965           bitmap_iterator bi;
3966
3967           EXECUTE_IF_SET_IN_BITMAP (use->related_cands, 0, j, bi)
3968             {
3969               cand = iv_cand (data, j);
3970               if (!determine_use_iv_cost (data, use, cand))
3971                 bitmap_set_bit (to_clear, j);
3972             }
3973
3974           /* Remove the candidates for that the cost is infinite from
3975              the list of related candidates.  */
3976           bitmap_and_compl_into (use->related_cands, to_clear);
3977           bitmap_clear (to_clear);
3978         }
3979     }
3980
3981   BITMAP_FREE (to_clear);
3982
3983   if (dump_file && (dump_flags & TDF_DETAILS))
3984     {
3985       fprintf (dump_file, "Use-candidate costs:\n");
3986
3987       for (i = 0; i < n_iv_uses (data); i++)
3988         {
3989           use = iv_use (data, i);
3990
3991           fprintf (dump_file, "Use %d:\n", i);
3992           fprintf (dump_file, "  cand\tcost\tcompl.\tdepends on\n");
3993           for (j = 0; j < use->n_map_members; j++)
3994             {
3995               if (!use->cost_map[j].cand
3996                   || infinite_cost_p (use->cost_map[j].cost))
3997                 continue;
3998
3999               fprintf (dump_file, "  %d\t%d\t%d\t",
4000                        use->cost_map[j].cand->id,
4001                        use->cost_map[j].cost.cost,
4002                        use->cost_map[j].cost.complexity);
4003               if (use->cost_map[j].depends_on)
4004                 bitmap_print (dump_file,
4005                               use->cost_map[j].depends_on, "","");
4006               fprintf (dump_file, "\n");
4007             }
4008
4009           fprintf (dump_file, "\n");
4010         }
4011       fprintf (dump_file, "\n");
4012     }
4013 }
4014
4015 /* Determines cost of the candidate CAND.  */
4016
4017 static void
4018 determine_iv_cost (struct ivopts_data *data, struct iv_cand *cand)
4019 {
4020   comp_cost cost_base;
4021   unsigned cost, cost_step;
4022   tree base;
4023
4024   if (!cand->iv)
4025     {
4026       cand->cost = 0;
4027       return;
4028     }
4029
4030   /* There are two costs associated with the candidate -- its increment
4031      and its initialization.  The second is almost negligible for any loop
4032      that rolls enough, so we take it just very little into account.  */
4033
4034   base = cand->iv->base;
4035   cost_base = force_var_cost (data, base, NULL);
4036   cost_step = add_cost (TYPE_MODE (TREE_TYPE (base)), data->speed);
4037
4038   cost = cost_step + cost_base.cost / AVG_LOOP_NITER (current_loop);
4039
4040   /* Prefer the original ivs unless we may gain something by replacing it.
4041      The reason is to make debugging simpler; so this is not relevant for
4042      artificial ivs created by other optimization passes.  */
4043   if (cand->pos != IP_ORIGINAL
4044       || DECL_ARTIFICIAL (SSA_NAME_VAR (cand->var_before)))
4045     cost++;
4046   
4047   /* Prefer not to insert statements into latch unless there are some
4048      already (so that we do not create unnecessary jumps).  */
4049   if (cand->pos == IP_END
4050       && empty_block_p (ip_end_pos (data->current_loop)))
4051     cost++;
4052
4053   cand->cost = cost;
4054 }
4055
4056 /* Determines costs of computation of the candidates.  */
4057
4058 static void
4059 determine_iv_costs (struct ivopts_data *data)
4060 {
4061   unsigned i;
4062
4063   if (dump_file && (dump_flags & TDF_DETAILS))
4064     {
4065       fprintf (dump_file, "Candidate costs:\n");
4066       fprintf (dump_file, "  cand\tcost\n");
4067     }
4068
4069   for (i = 0; i < n_iv_cands (data); i++)
4070     {
4071       struct iv_cand *cand = iv_cand (data, i);
4072
4073       determine_iv_cost (data, cand);
4074
4075       if (dump_file && (dump_flags & TDF_DETAILS))
4076         fprintf (dump_file, "  %d\t%d\n", i, cand->cost);
4077     }
4078   
4079   if (dump_file && (dump_flags & TDF_DETAILS))
4080     fprintf (dump_file, "\n");
4081 }
4082
4083 /* Calculates cost for having SIZE induction variables.  */
4084
4085 static unsigned
4086 ivopts_global_cost_for_size (struct ivopts_data *data, unsigned size)
4087 {
4088   /* We add size to the cost, so that we prefer eliminating ivs
4089      if possible.  */
4090   return size + estimate_reg_pressure_cost (size, data->regs_used, data->speed);
4091 }
4092
4093 /* For each size of the induction variable set determine the penalty.  */
4094
4095 static void
4096 determine_set_costs (struct ivopts_data *data)
4097 {
4098   unsigned j, n;
4099   gimple phi;
4100   gimple_stmt_iterator psi;
4101   tree op;
4102   struct loop *loop = data->current_loop;
4103   bitmap_iterator bi;
4104
4105   /* We use the following model (definitely improvable, especially the
4106      cost function -- TODO):
4107
4108      We estimate the number of registers available (using MD data), name it A.
4109
4110      We estimate the number of registers used by the loop, name it U.  This
4111      number is obtained as the number of loop phi nodes (not counting virtual
4112      registers and bivs) + the number of variables from outside of the loop.
4113
4114      We set a reserve R (free regs that are used for temporary computations,
4115      etc.).  For now the reserve is a constant 3.
4116
4117      Let I be the number of induction variables.
4118      
4119      -- if U + I + R <= A, the cost is I * SMALL_COST (just not to encourage
4120         make a lot of ivs without a reason).
4121      -- if A - R < U + I <= A, the cost is I * PRES_COST
4122      -- if U + I > A, the cost is I * PRES_COST and
4123         number of uses * SPILL_COST * (U + I - A) / (U + I) is added.  */
4124
4125   if (dump_file && (dump_flags & TDF_DETAILS))
4126     {
4127       fprintf (dump_file, "Global costs:\n");
4128       fprintf (dump_file, "  target_avail_regs %d\n", target_avail_regs);
4129       fprintf (dump_file, "  target_reg_cost %d\n", target_reg_cost[data->speed]);
4130       fprintf (dump_file, "  target_spill_cost %d\n", target_spill_cost[data->speed]);
4131     }
4132
4133   n = 0;
4134   for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
4135     {
4136       phi = gsi_stmt (psi);
4137       op = PHI_RESULT (phi);
4138
4139       if (!is_gimple_reg (op))
4140         continue;
4141
4142       if (get_iv (data, op))
4143         continue;
4144
4145       n++;
4146     }
4147
4148   EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, j, bi)
4149     {
4150       struct version_info *info = ver_info (data, j);
4151
4152       if (info->inv_id && info->has_nonlin_use)
4153         n++;
4154     }
4155
4156   data->regs_used = n;
4157   if (dump_file && (dump_flags & TDF_DETAILS))
4158     fprintf (dump_file, "  regs_used %d\n", n);
4159
4160   if (dump_file && (dump_flags & TDF_DETAILS))
4161     {
4162       fprintf (dump_file, "  cost for size:\n");
4163       fprintf (dump_file, "  ivs\tcost\n");
4164       for (j = 0; j <= 2 * target_avail_regs; j++)
4165         fprintf (dump_file, "  %d\t%d\n", j,
4166                  ivopts_global_cost_for_size (data, j));
4167       fprintf (dump_file, "\n");
4168     }
4169 }
4170
4171 /* Returns true if A is a cheaper cost pair than B.  */
4172
4173 static bool
4174 cheaper_cost_pair (struct cost_pair *a, struct cost_pair *b)
4175 {
4176   int cmp;
4177
4178   if (!a)
4179     return false;
4180
4181   if (!b)
4182     return true;
4183
4184   cmp = compare_costs (a->cost, b->cost);
4185   if (cmp < 0)
4186     return true;
4187
4188   if (cmp > 0)
4189     return false;
4190
4191   /* In case the costs are the same, prefer the cheaper candidate.  */
4192   if (a->cand->cost < b->cand->cost)
4193     return true;
4194
4195   return false;
4196 }
4197
4198 /* Computes the cost field of IVS structure.  */
4199
4200 static void
4201 iv_ca_recount_cost (struct ivopts_data *data, struct iv_ca *ivs)
4202 {
4203   comp_cost cost = ivs->cand_use_cost;
4204   cost.cost += ivs->cand_cost;
4205   cost.cost += ivopts_global_cost_for_size (data, ivs->n_regs);
4206
4207   ivs->cost = cost;
4208 }
4209
4210 /* Remove invariants in set INVS to set IVS.  */
4211
4212 static void
4213 iv_ca_set_remove_invariants (struct iv_ca *ivs, bitmap invs)
4214 {
4215   bitmap_iterator bi;
4216   unsigned iid;
4217
4218   if (!invs)
4219     return;
4220
4221   EXECUTE_IF_SET_IN_BITMAP (invs, 0, iid, bi)
4222     {
4223       ivs->n_invariant_uses[iid]--;
4224       if (ivs->n_invariant_uses[iid] == 0)
4225         ivs->n_regs--;
4226     }
4227 }
4228
4229 /* Set USE not to be expressed by any candidate in IVS.  */
4230
4231 static void
4232 iv_ca_set_no_cp (struct ivopts_data *data, struct iv_ca *ivs,
4233                  struct iv_use *use)
4234 {
4235   unsigned uid = use->id, cid;
4236   struct cost_pair *cp;
4237
4238   cp = ivs->cand_for_use[uid];
4239   if (!cp)
4240     return;
4241   cid = cp->cand->id;
4242
4243   ivs->bad_uses++;
4244   ivs->cand_for_use[uid] = NULL;
4245   ivs->n_cand_uses[cid]--;
4246
4247   if (ivs->n_cand_uses[cid] == 0)
4248     {
4249       bitmap_clear_bit (ivs->cands, cid);
4250       /* Do not count the pseudocandidates.  */
4251       if (cp->cand->iv)
4252         ivs->n_regs--;
4253       ivs->n_cands--;
4254       ivs->cand_cost -= cp->cand->cost;
4255
4256       iv_ca_set_remove_invariants (ivs, cp->cand->depends_on);
4257     }
4258
4259   ivs->cand_use_cost = sub_costs (ivs->cand_use_cost, cp->cost);
4260
4261   iv_ca_set_remove_invariants (ivs, cp->depends_on);
4262   iv_ca_recount_cost (data, ivs);
4263 }
4264
4265 /* Add invariants in set INVS to set IVS.  */
4266
4267 static void
4268 iv_ca_set_add_invariants (struct iv_ca *ivs, bitmap invs)
4269 {
4270   bitmap_iterator bi;
4271   unsigned iid;
4272
4273   if (!invs)
4274     return;
4275
4276   EXECUTE_IF_SET_IN_BITMAP (invs, 0, iid, bi)
4277     {
4278       ivs->n_invariant_uses[iid]++;
4279       if (ivs->n_invariant_uses[iid] == 1)
4280         ivs->n_regs++;
4281     }
4282 }
4283
4284 /* Set cost pair for USE in set IVS to CP.  */
4285
4286 static void
4287 iv_ca_set_cp (struct ivopts_data *data, struct iv_ca *ivs,
4288               struct iv_use *use, struct cost_pair *cp)
4289 {
4290   unsigned uid = use->id, cid;
4291
4292   if (ivs->cand_for_use[uid] == cp)
4293     return;
4294
4295   if (ivs->cand_for_use[uid])
4296     iv_ca_set_no_cp (data, ivs, use);
4297
4298   if (cp)
4299     {
4300       cid = cp->cand->id;
4301
4302       ivs->bad_uses--;
4303       ivs->cand_for_use[uid] = cp;
4304       ivs->n_cand_uses[cid]++;
4305       if (ivs->n_cand_uses[cid] == 1)
4306         {
4307           bitmap_set_bit (ivs->cands, cid);
4308           /* Do not count the pseudocandidates.  */
4309           if (cp->cand->iv)
4310             ivs->n_regs++;
4311           ivs->n_cands++;
4312           ivs->cand_cost += cp->cand->cost;
4313
4314           iv_ca_set_add_invariants (ivs, cp->cand->depends_on);
4315         }
4316
4317       ivs->cand_use_cost = add_costs (ivs->cand_use_cost, cp->cost);
4318       iv_ca_set_add_invariants (ivs, cp->depends_on);
4319       iv_ca_recount_cost (data, ivs);
4320     }
4321 }
4322
4323 /* Extend set IVS by expressing USE by some of the candidates in it
4324    if possible.  */
4325
4326 static void
4327 iv_ca_add_use (struct ivopts_data *data, struct iv_ca *ivs,
4328                struct iv_use *use)
4329 {
4330   struct cost_pair *best_cp = NULL, *cp;
4331   bitmap_iterator bi;
4332   unsigned i;
4333
4334   gcc_assert (ivs->upto >= use->id);
4335
4336   if (ivs->upto == use->id)
4337     {
4338       ivs->upto++;
4339       ivs->bad_uses++;
4340     }
4341
4342   EXECUTE_IF_SET_IN_BITMAP (ivs->cands, 0, i, bi)
4343     {
4344       cp = get_use_iv_cost (data, use, iv_cand (data, i));
4345
4346       if (cheaper_cost_pair (cp, best_cp))
4347         best_cp = cp;
4348     }
4349
4350   iv_ca_set_cp (data, ivs, use, best_cp);
4351 }
4352
4353 /* Get cost for assignment IVS.  */
4354
4355 static comp_cost
4356 iv_ca_cost (struct iv_ca *ivs)
4357 {
4358   if (ivs->bad_uses)
4359     return infinite_cost;
4360   else
4361     return ivs->cost;
4362 }
4363
4364 /* Returns true if all dependences of CP are among invariants in IVS.  */
4365
4366 static bool
4367 iv_ca_has_deps (struct iv_ca *ivs, struct cost_pair *cp)
4368 {
4369   unsigned i;
4370   bitmap_iterator bi;
4371
4372   if (!cp->depends_on)
4373     return true;
4374
4375   EXECUTE_IF_SET_IN_BITMAP (cp->depends_on, 0, i, bi)
4376     {
4377       if (ivs->n_invariant_uses[i] == 0)
4378         return false;
4379     }
4380
4381   return true;
4382 }
4383
4384 /* Creates change of expressing USE by NEW_CP instead of OLD_CP and chains
4385    it before NEXT_CHANGE.  */
4386
4387 static struct iv_ca_delta *
4388 iv_ca_delta_add (struct iv_use *use, struct cost_pair *old_cp,
4389                  struct cost_pair *new_cp, struct iv_ca_delta *next_change)
4390 {
4391   struct iv_ca_delta *change = XNEW (struct iv_ca_delta);
4392
4393   change->use = use;
4394   change->old_cp = old_cp;
4395   change->new_cp = new_cp;
4396   change->next_change = next_change;
4397
4398   return change;
4399 }
4400
4401 /* Joins two lists of changes L1 and L2.  Destructive -- old lists
4402    are rewritten.  */
4403
4404 static struct iv_ca_delta *
4405 iv_ca_delta_join (struct iv_ca_delta *l1, struct iv_ca_delta *l2)
4406 {
4407   struct iv_ca_delta *last;
4408
4409   if (!l2)
4410     return l1;
4411
4412   if (!l1)
4413     return l2;
4414
4415   for (last = l1; last->next_change; last = last->next_change)
4416     continue;
4417   last->next_change = l2;
4418
4419   return l1;
4420 }
4421
4422 /* Returns candidate by that USE is expressed in IVS.  */
4423
4424 static struct cost_pair *
4425 iv_ca_cand_for_use (struct iv_ca *ivs, struct iv_use *use)
4426 {
4427   return ivs->cand_for_use[use->id];
4428 }
4429
4430 /* Reverse the list of changes DELTA, forming the inverse to it.  */
4431
4432 static struct iv_ca_delta *
4433 iv_ca_delta_reverse (struct iv_ca_delta *delta)
4434 {
4435   struct iv_ca_delta *act, *next, *prev = NULL;
4436   struct cost_pair *tmp;
4437
4438   for (act = delta; act; act = next)
4439     {
4440       next = act->next_change;
4441       act->next_change = prev;
4442       prev = act;
4443
4444       tmp = act->old_cp;
4445       act->old_cp = act->new_cp;
4446       act->new_cp = tmp;
4447     }
4448
4449   return prev;
4450 }
4451
4452 /* Commit changes in DELTA to IVS.  If FORWARD is false, the changes are
4453    reverted instead.  */
4454
4455 static void
4456 iv_ca_delta_commit (struct ivopts_data *data, struct iv_ca *ivs,
4457                     struct iv_ca_delta *delta, bool forward)
4458 {
4459   struct cost_pair *from, *to;
4460   struct iv_ca_delta *act;
4461
4462   if (!forward)
4463     delta = iv_ca_delta_reverse (delta);
4464
4465   for (act = delta; act; act = act->next_change)
4466     {
4467       from = act->old_cp;
4468       to = act->new_cp;
4469       gcc_assert (iv_ca_cand_for_use (ivs, act->use) == from);
4470       iv_ca_set_cp (data, ivs, act->use, to);
4471     }
4472
4473   if (!forward)
4474     iv_ca_delta_reverse (delta);
4475 }
4476
4477 /* Returns true if CAND is used in IVS.  */
4478
4479 static bool
4480 iv_ca_cand_used_p (struct iv_ca *ivs, struct iv_cand *cand)
4481 {
4482   return ivs->n_cand_uses[cand->id] > 0;
4483 }
4484
4485 /* Returns number of induction variable candidates in the set IVS.  */
4486
4487 static unsigned
4488 iv_ca_n_cands (struct iv_ca *ivs)
4489 {
4490   return ivs->n_cands;
4491 }
4492
4493 /* Free the list of changes DELTA.  */
4494
4495 static void
4496 iv_ca_delta_free (struct iv_ca_delta **delta)
4497 {
4498   struct iv_ca_delta *act, *next;
4499
4500   for (act = *delta; act; act = next)
4501     {
4502       next = act->next_change;
4503       free (act);
4504     }
4505
4506   *delta = NULL;
4507 }
4508
4509 /* Allocates new iv candidates assignment.  */
4510
4511 static struct iv_ca *
4512 iv_ca_new (struct ivopts_data *data)
4513 {
4514   struct iv_ca *nw = XNEW (struct iv_ca);
4515
4516   nw->upto = 0;
4517   nw->bad_uses = 0;
4518   nw->cand_for_use = XCNEWVEC (struct cost_pair *, n_iv_uses (data));
4519   nw->n_cand_uses = XCNEWVEC (unsigned, n_iv_cands (data));
4520   nw->cands = BITMAP_ALLOC (NULL);
4521   nw->n_cands = 0;
4522   nw->n_regs = 0;
4523   nw->cand_use_cost = zero_cost;
4524   nw->cand_cost = 0;
4525   nw->n_invariant_uses = XCNEWVEC (unsigned, data->max_inv_id + 1);
4526   nw->cost = zero_cost;
4527
4528   return nw;
4529 }
4530
4531 /* Free memory occupied by the set IVS.  */
4532
4533 static void
4534 iv_ca_free (struct iv_ca **ivs)
4535 {
4536   free ((*ivs)->cand_for_use);
4537   free ((*ivs)->n_cand_uses);
4538   BITMAP_FREE ((*ivs)->cands);
4539   free ((*ivs)->n_invariant_uses);
4540   free (*ivs);
4541   *ivs = NULL;
4542 }
4543
4544 /* Dumps IVS to FILE.  */
4545
4546 static void
4547 iv_ca_dump (struct ivopts_data *data, FILE *file, struct iv_ca *ivs)
4548 {
4549   const char *pref = "  invariants ";
4550   unsigned i;
4551   comp_cost cost = iv_ca_cost (ivs);
4552
4553   fprintf (file, "  cost %d (complexity %d)\n", cost.cost, cost.complexity);
4554   bitmap_print (file, ivs->cands, "  candidates ","\n");
4555
4556   for (i = 1; i <= data->max_inv_id; i++)
4557     if (ivs->n_invariant_uses[i])
4558       {
4559         fprintf (file, "%s%d", pref, i);
4560         pref = ", ";
4561       }
4562   fprintf (file, "\n");
4563 }
4564
4565 /* Try changing candidate in IVS to CAND for each use.  Return cost of the
4566    new set, and store differences in DELTA.  Number of induction variables
4567    in the new set is stored to N_IVS.  */
4568
4569 static comp_cost
4570 iv_ca_extend (struct ivopts_data *data, struct iv_ca *ivs,
4571               struct iv_cand *cand, struct iv_ca_delta **delta,
4572               unsigned *n_ivs)
4573 {
4574   unsigned i;
4575   comp_cost cost;
4576   struct iv_use *use;
4577   struct cost_pair *old_cp, *new_cp;
4578
4579   *delta = NULL;
4580   for (i = 0; i < ivs->upto; i++)
4581     {
4582       use = iv_use (data, i);
4583       old_cp = iv_ca_cand_for_use (ivs, use);
4584
4585       if (old_cp
4586           && old_cp->cand == cand)
4587         continue;
4588
4589       new_cp = get_use_iv_cost (data, use, cand);
4590       if (!new_cp)
4591         continue;
4592
4593       if (!iv_ca_has_deps (ivs, new_cp))
4594         continue;
4595       
4596       if (!cheaper_cost_pair (new_cp, old_cp))
4597         continue;
4598
4599       *delta = iv_ca_delta_add (use, old_cp, new_cp, *delta);
4600     }
4601
4602   iv_ca_delta_commit (data, ivs, *delta, true);
4603   cost = iv_ca_cost (ivs);
4604   if (n_ivs)
4605     *n_ivs = iv_ca_n_cands (ivs);
4606   iv_ca_delta_commit (data, ivs, *delta, false);
4607
4608   return cost;
4609 }
4610
4611 /* Try narrowing set IVS by removing CAND.  Return the cost of
4612    the new set and store the differences in DELTA.  */
4613
4614 static comp_cost
4615 iv_ca_narrow (struct ivopts_data *data, struct iv_ca *ivs,
4616               struct iv_cand *cand, struct iv_ca_delta **delta)
4617 {
4618   unsigned i, ci;
4619   struct iv_use *use;
4620   struct cost_pair *old_cp, *new_cp, *cp;
4621   bitmap_iterator bi;
4622   struct iv_cand *cnd;
4623   comp_cost cost;
4624
4625   *delta = NULL;
4626   for (i = 0; i < n_iv_uses (data); i++)
4627     {
4628       use = iv_use (data, i);
4629
4630       old_cp = iv_ca_cand_for_use (ivs, use);
4631       if (old_cp->cand != cand)
4632         continue;
4633
4634       new_cp = NULL;
4635
4636       if (data->consider_all_candidates)
4637         {
4638           EXECUTE_IF_SET_IN_BITMAP (ivs->cands, 0, ci, bi)
4639             {
4640               if (ci == cand->id)
4641                 continue;
4642
4643               cnd = iv_cand (data, ci);
4644
4645               cp = get_use_iv_cost (data, use, cnd);
4646               if (!cp)
4647                 continue;
4648               if (!iv_ca_has_deps (ivs, cp))
4649                 continue;
4650       
4651               if (!cheaper_cost_pair (cp, new_cp))
4652                 continue;
4653
4654               new_cp = cp;
4655             }
4656         }
4657       else
4658         {
4659           EXECUTE_IF_AND_IN_BITMAP (use->related_cands, ivs->cands, 0, ci, bi)
4660             {
4661               if (ci == cand->id)
4662                 continue;
4663
4664               cnd = iv_cand (data, ci);
4665
4666               cp = get_use_iv_cost (data, use, cnd);
4667               if (!cp)
4668                 continue;
4669               if (!iv_ca_has_deps (ivs, cp))
4670                 continue;
4671       
4672               if (!cheaper_cost_pair (cp, new_cp))
4673                 continue;
4674
4675               new_cp = cp;
4676             }
4677         }
4678
4679       if (!new_cp)
4680         {
4681           iv_ca_delta_free (delta);
4682           return infinite_cost;
4683         }
4684
4685       *delta = iv_ca_delta_add (use, old_cp, new_cp, *delta);
4686     }
4687
4688   iv_ca_delta_commit (data, ivs, *delta, true);
4689   cost = iv_ca_cost (ivs);
4690   iv_ca_delta_commit (data, ivs, *delta, false);
4691
4692   return cost;
4693 }
4694
4695 /* Try optimizing the set of candidates IVS by removing candidates different
4696    from to EXCEPT_CAND from it.  Return cost of the new set, and store
4697    differences in DELTA.  */
4698
4699 static comp_cost
4700 iv_ca_prune (struct ivopts_data *data, struct iv_ca *ivs,
4701              struct iv_cand *except_cand, struct iv_ca_delta **delta)
4702 {
4703   bitmap_iterator bi;
4704   struct iv_ca_delta *act_delta, *best_delta;
4705   unsigned i;
4706   comp_cost best_cost, acost;
4707   struct iv_cand *cand;
4708
4709   best_delta = NULL;
4710   best_cost = iv_ca_cost (ivs);
4711
4712   EXECUTE_IF_SET_IN_BITMAP (ivs->cands, 0, i, bi)
4713     {
4714       cand = iv_cand (data, i);
4715
4716       if (cand == except_cand)
4717         continue;
4718
4719       acost = iv_ca_narrow (data, ivs, cand, &act_delta);
4720
4721       if (compare_costs (acost, best_cost) < 0)
4722         {
4723           best_cost = acost;
4724           iv_ca_delta_free (&best_delta);
4725           best_delta = act_delta;
4726         }
4727       else
4728         iv_ca_delta_free (&act_delta);
4729     }
4730
4731   if (!best_delta)
4732     {
4733       *delta = NULL;
4734       return best_cost;
4735     }
4736
4737   /* Recurse to possibly remove other unnecessary ivs.  */
4738   iv_ca_delta_commit (data, ivs, best_delta, true);
4739   best_cost = iv_ca_prune (data, ivs, except_cand, delta);
4740   iv_ca_delta_commit (data, ivs, best_delta, false);
4741   *delta = iv_ca_delta_join (best_delta, *delta);
4742   return best_cost;
4743 }
4744
4745 /* Tries to extend the sets IVS in the best possible way in order
4746    to express the USE.  */
4747
4748 static bool
4749 try_add_cand_for (struct ivopts_data *data, struct iv_ca *ivs,
4750                   struct iv_use *use)
4751 {
4752   comp_cost best_cost, act_cost;
4753   unsigned i;
4754   bitmap_iterator bi;
4755   struct iv_cand *cand;
4756   struct iv_ca_delta *best_delta = NULL, *act_delta;
4757   struct cost_pair *cp;
4758
4759   iv_ca_add_use (data, ivs, use);
4760   best_cost = iv_ca_cost (ivs);
4761
4762   cp = iv_ca_cand_for_use (ivs, use);
4763   if (cp)
4764     {
4765       best_delta = iv_ca_delta_add (use, NULL, cp, NULL);
4766       iv_ca_set_no_cp (data, ivs, use);
4767     }
4768
4769   /* First try important candidates not based on any memory object.  Only if
4770      this fails, try the specific ones.  Rationale -- in loops with many
4771      variables the best choice often is to use just one generic biv.  If we
4772      added here many ivs specific to the uses, the optimization algorithm later
4773      would be likely to get stuck in a local minimum, thus causing us to create
4774      too many ivs.  The approach from few ivs to more seems more likely to be
4775      successful -- starting from few ivs, replacing an expensive use by a
4776      specific iv should always be a win.  */
4777   EXECUTE_IF_SET_IN_BITMAP (data->important_candidates, 0, i, bi)
4778     {
4779       cand = iv_cand (data, i);
4780
4781       if (cand->iv->base_object != NULL_TREE)
4782         continue;
4783
4784       if (iv_ca_cand_used_p (ivs, cand))
4785         continue;
4786
4787       cp = get_use_iv_cost (data, use, cand);
4788       if (!cp)
4789         continue;
4790
4791       iv_ca_set_cp (data, ivs, use, cp);
4792       act_cost = iv_ca_extend (data, ivs, cand, &act_delta, NULL);
4793       iv_ca_set_no_cp (data, ivs, use);
4794       act_delta = iv_ca_delta_add (use, NULL, cp, act_delta);
4795
4796       if (compare_costs (act_cost, best_cost) < 0)
4797         {
4798           best_cost = act_cost;
4799
4800           iv_ca_delta_free (&best_delta);
4801           best_delta = act_delta;
4802         }
4803       else
4804         iv_ca_delta_free (&act_delta);
4805     }
4806
4807   if (infinite_cost_p (best_cost))
4808     {
4809       for (i = 0; i < use->n_map_members; i++)
4810         {
4811           cp = use->cost_map + i;
4812           cand = cp->cand;
4813           if (!cand)
4814             continue;
4815
4816           /* Already tried this.  */
4817           if (cand->important && cand->iv->base_object == NULL_TREE)
4818             continue;
4819       
4820           if (iv_ca_cand_used_p (ivs, cand))
4821             continue;
4822
4823           act_delta = NULL;
4824           iv_ca_set_cp (data, ivs, use, cp);
4825           act_cost = iv_ca_extend (data, ivs, cand, &act_delta, NULL);
4826           iv_ca_set_no_cp (data, ivs, use);
4827           act_delta = iv_ca_delta_add (use, iv_ca_cand_for_use (ivs, use),
4828                                        cp, act_delta);
4829
4830           if (compare_costs (act_cost, best_cost) < 0)
4831             {
4832               best_cost = act_cost;
4833
4834               if (best_delta)
4835                 iv_ca_delta_free (&best_delta);
4836               best_delta = act_delta;
4837             }
4838           else
4839             iv_ca_delta_free (&act_delta);
4840         }
4841     }
4842
4843   iv_ca_delta_commit (data, ivs, best_delta, true);
4844   iv_ca_delta_free (&best_delta);
4845
4846   return !infinite_cost_p (best_cost);
4847 }
4848
4849 /* Finds an initial assignment of candidates to uses.  */
4850
4851 static struct iv_ca *
4852 get_initial_solution (struct ivopts_data *data)
4853 {
4854   struct iv_ca *ivs = iv_ca_new (data);
4855   unsigned i;
4856
4857   for (i = 0; i < n_iv_uses (data); i++)
4858     if (!try_add_cand_for (data, ivs, iv_use (data, i)))
4859       {
4860         iv_ca_free (&ivs);
4861         return NULL;
4862       }
4863
4864   return ivs;
4865 }
4866
4867 /* Tries to improve set of induction variables IVS.  */
4868
4869 static bool
4870 try_improve_iv_set (struct ivopts_data *data, struct iv_ca *ivs)
4871 {
4872   unsigned i, n_ivs;
4873   comp_cost acost, best_cost = iv_ca_cost (ivs);
4874   struct iv_ca_delta *best_delta = NULL, *act_delta, *tmp_delta;
4875   struct iv_cand *cand;
4876
4877   /* Try extending the set of induction variables by one.  */
4878   for (i = 0; i < n_iv_cands (data); i++)
4879     {
4880       cand = iv_cand (data, i);
4881       
4882       if (iv_ca_cand_used_p (ivs, cand))
4883         continue;
4884
4885       acost = iv_ca_extend (data, ivs, cand, &act_delta, &n_ivs);
4886       if (!act_delta)
4887         continue;
4888
4889       /* If we successfully added the candidate and the set is small enough,
4890          try optimizing it by removing other candidates.  */
4891       if (n_ivs <= ALWAYS_PRUNE_CAND_SET_BOUND)
4892         {
4893           iv_ca_delta_commit (data, ivs, act_delta, true);
4894           acost = iv_ca_prune (data, ivs, cand, &tmp_delta);
4895           iv_ca_delta_commit (data, ivs, act_delta, false);
4896           act_delta = iv_ca_delta_join (act_delta, tmp_delta);
4897         }
4898
4899       if (compare_costs (acost, best_cost) < 0)
4900         {
4901           best_cost = acost;
4902           iv_ca_delta_free (&best_delta);
4903           best_delta = act_delta;
4904         }
4905       else
4906         iv_ca_delta_free (&act_delta);
4907     }
4908
4909   if (!best_delta)
4910     {
4911       /* Try removing the candidates from the set instead.  */
4912       best_cost = iv_ca_prune (data, ivs, NULL, &best_delta);
4913
4914       /* Nothing more we can do.  */
4915       if (!best_delta)
4916         return false;
4917     }
4918
4919   iv_ca_delta_commit (data, ivs, best_delta, true);
4920   gcc_assert (compare_costs (best_cost, iv_ca_cost (ivs)) == 0);
4921   iv_ca_delta_free (&best_delta);
4922   return true;
4923 }
4924
4925 /* Attempts to find the optimal set of induction variables.  We do simple
4926    greedy heuristic -- we try to replace at most one candidate in the selected
4927    solution and remove the unused ivs while this improves the cost.  */
4928
4929 static struct iv_ca *
4930 find_optimal_iv_set (struct ivopts_data *data)
4931 {
4932   unsigned i;
4933   struct iv_ca *set;
4934   struct iv_use *use;
4935
4936   /* Get the initial solution.  */
4937   set = get_initial_solution (data);
4938   if (!set)
4939     {
4940       if (dump_file && (dump_flags & TDF_DETAILS))
4941         fprintf (dump_file, "Unable to substitute for ivs, failed.\n");
4942       return NULL;
4943     }
4944
4945   if (dump_file && (dump_flags & TDF_DETAILS))
4946     {
4947       fprintf (dump_file, "Initial set of candidates:\n");
4948       iv_ca_dump (data, dump_file, set);
4949     }
4950
4951   while (try_improve_iv_set (data, set))
4952     {
4953       if (dump_file && (dump_flags & TDF_DETAILS))
4954         {
4955           fprintf (dump_file, "Improved to:\n");
4956           iv_ca_dump (data, dump_file, set);
4957         }
4958     }
4959
4960   if (dump_file && (dump_flags & TDF_DETAILS))
4961     {
4962       comp_cost cost = iv_ca_cost (set);
4963       fprintf (dump_file, "Final cost %d (complexity %d)\n\n", cost.cost, cost.complexity);
4964     }
4965
4966   for (i = 0; i < n_iv_uses (data); i++)
4967     {
4968       use = iv_use (data, i);
4969       use->selected = iv_ca_cand_for_use (set, use)->cand;
4970     }
4971
4972   return set;
4973 }
4974
4975 /* Creates a new induction variable corresponding to CAND.  */
4976
4977 static void
4978 create_new_iv (struct ivopts_data *data, struct iv_cand *cand)
4979 {
4980   gimple_stmt_iterator incr_pos;
4981   tree base;
4982   bool after = false;
4983
4984   if (!cand->iv)
4985     return;
4986
4987   switch (cand->pos)
4988     {
4989     case IP_NORMAL:
4990       incr_pos = gsi_last_bb (ip_normal_pos (data->current_loop));
4991       break;
4992
4993     case IP_END:
4994       incr_pos = gsi_last_bb (ip_end_pos (data->current_loop));
4995       after = true;
4996       break;
4997
4998     case IP_ORIGINAL:
4999       /* Mark that the iv is preserved.  */
5000       name_info (data, cand->var_before)->preserve_biv = true;
5001       name_info (data, cand->var_after)->preserve_biv = true;
5002
5003       /* Rewrite the increment so that it uses var_before directly.  */
5004       find_interesting_uses_op (data, cand->var_after)->selected = cand;
5005       
5006       return;
5007     }
5008  
5009   gimple_add_tmp_var (cand->var_before);
5010   add_referenced_var (cand->var_before);
5011
5012   base = unshare_expr (cand->iv->base);
5013
5014   create_iv (base, unshare_expr (cand->iv->step),
5015              cand->var_before, data->current_loop,
5016              &incr_pos, after, &cand->var_before, &cand->var_after);
5017 }
5018
5019 /* Creates new induction variables described in SET.  */
5020
5021 static void
5022 create_new_ivs (struct ivopts_data *data, struct iv_ca *set)
5023 {
5024   unsigned i;
5025   struct iv_cand *cand;
5026   bitmap_iterator bi;
5027
5028   EXECUTE_IF_SET_IN_BITMAP (set->cands, 0, i, bi)
5029     {
5030       cand = iv_cand (data, i);
5031       create_new_iv (data, cand);
5032     }
5033 }
5034
5035 /* Returns the phi-node in BB with result RESULT.  */
5036
5037 static gimple
5038 get_phi_with_result (basic_block bb, tree result)
5039 {
5040   gimple_stmt_iterator i = gsi_start_phis (bb);
5041
5042   for (; !gsi_end_p (i); gsi_next (&i))
5043     if (gimple_phi_result (gsi_stmt (i)) == result)
5044       return gsi_stmt (i);
5045
5046   gcc_unreachable ();
5047   return NULL;
5048 }
5049
5050
5051 /* Removes statement STMT (real or a phi node).  If INCLUDING_DEFINED_NAME
5052    is true, remove also the ssa name defined by the statement.  */
5053
5054 static void
5055 remove_statement (gimple stmt, bool including_defined_name)
5056 {
5057   if (gimple_code (stmt) == GIMPLE_PHI)
5058     {
5059       gimple bb_phi = get_phi_with_result (gimple_bb (stmt), 
5060                                          gimple_phi_result (stmt));
5061       gimple_stmt_iterator bsi = gsi_for_stmt (bb_phi);
5062       remove_phi_node (&bsi, including_defined_name);
5063     }
5064   else
5065     {
5066       gimple_stmt_iterator bsi = gsi_for_stmt (stmt);
5067       gsi_remove (&bsi, true);
5068       release_defs (stmt); 
5069     }
5070 }
5071
5072 /* Rewrites USE (definition of iv used in a nonlinear expression)
5073    using candidate CAND.  */
5074
5075 static void
5076 rewrite_use_nonlinear_expr (struct ivopts_data *data,
5077                             struct iv_use *use, struct iv_cand *cand)
5078 {
5079   tree comp;
5080   tree op, tgt;
5081   gimple ass;
5082   gimple_stmt_iterator bsi;
5083
5084   /* An important special case -- if we are asked to express value of
5085      the original iv by itself, just exit; there is no need to
5086      introduce a new computation (that might also need casting the
5087      variable to unsigned and back).  */
5088   if (cand->pos == IP_ORIGINAL
5089       && cand->incremented_at == use->stmt)
5090     {
5091       tree step, ctype, utype;
5092       enum tree_code incr_code = PLUS_EXPR, old_code;
5093
5094       gcc_assert (is_gimple_assign (use->stmt));
5095       gcc_assert (gimple_assign_lhs (use->stmt) == cand->var_after);
5096
5097       step = cand->iv->step;
5098       ctype = TREE_TYPE (step);
5099       utype = TREE_TYPE (cand->var_after);
5100       if (TREE_CODE (step) == NEGATE_EXPR)
5101         {
5102           incr_code = MINUS_EXPR;
5103           step = TREE_OPERAND (step, 0);
5104         }
5105
5106       /* Check whether we may leave the computation unchanged.
5107          This is the case only if it does not rely on other
5108          computations in the loop -- otherwise, the computation
5109          we rely upon may be removed in remove_unused_ivs,
5110          thus leading to ICE.  */
5111       old_code = gimple_assign_rhs_code (use->stmt);
5112       if (old_code == PLUS_EXPR
5113           || old_code == MINUS_EXPR
5114           || old_code == POINTER_PLUS_EXPR)
5115         {
5116           if (gimple_assign_rhs1 (use->stmt) == cand->var_before)
5117             op = gimple_assign_rhs2 (use->stmt);
5118           else if (old_code != MINUS_EXPR
5119                    && gimple_assign_rhs2 (use->stmt) == cand->var_before)
5120             op = gimple_assign_rhs1 (use->stmt);
5121           else
5122             op = NULL_TREE;
5123         }
5124       else
5125         op = NULL_TREE;
5126
5127       if (op
5128           && (TREE_CODE (op) == INTEGER_CST
5129               || operand_equal_p (op, step, 0)))
5130         return;
5131
5132       /* Otherwise, add the necessary computations to express
5133          the iv.  */
5134       op = fold_convert (ctype, cand->var_before);
5135       comp = fold_convert (utype,
5136                            build2 (incr_code, ctype, op,
5137                                    unshare_expr (step)));
5138     }
5139   else
5140     {
5141       comp = get_computation (data->current_loop, use, cand);
5142       gcc_assert (comp != NULL_TREE);
5143     }
5144
5145   switch (gimple_code (use->stmt))
5146     {
5147     case GIMPLE_PHI:
5148       tgt = PHI_RESULT (use->stmt);
5149
5150       /* If we should keep the biv, do not replace it.  */
5151       if (name_info (data, tgt)->preserve_biv)
5152         return;
5153
5154       bsi = gsi_after_labels (gimple_bb (use->stmt));
5155       break;
5156
5157     case GIMPLE_ASSIGN:
5158       tgt = gimple_assign_lhs (use->stmt);
5159       bsi = gsi_for_stmt (use->stmt);
5160       break;
5161
5162     default:
5163       gcc_unreachable ();
5164     }
5165
5166   op = force_gimple_operand_gsi (&bsi, comp, false, SSA_NAME_VAR (tgt),
5167                                  true, GSI_SAME_STMT);
5168
5169   if (gimple_code (use->stmt) == GIMPLE_PHI)
5170     {
5171       ass = gimple_build_assign (tgt, op);
5172       gsi_insert_before (&bsi, ass, GSI_SAME_STMT);
5173       remove_statement (use->stmt, false);
5174     }
5175   else
5176     {
5177       gimple_assign_set_rhs_from_tree (&bsi, op);
5178       use->stmt = gsi_stmt (bsi);
5179     }
5180 }
5181
5182 /* Replaces ssa name in index IDX by its basic variable.  Callback for
5183    for_each_index.  */
5184
5185 static bool
5186 idx_remove_ssa_names (tree base, tree *idx,
5187                       void *data ATTRIBUTE_UNUSED)
5188 {
5189   tree *op;
5190
5191   if (TREE_CODE (*idx) == SSA_NAME)
5192     *idx = SSA_NAME_VAR (*idx);
5193
5194   if (TREE_CODE (base) == ARRAY_REF || TREE_CODE (base) == ARRAY_RANGE_REF)
5195     {
5196       op = &TREE_OPERAND (base, 2);
5197       if (*op
5198           && TREE_CODE (*op) == SSA_NAME)
5199         *op = SSA_NAME_VAR (*op);
5200       op = &TREE_OPERAND (base, 3);
5201       if (*op
5202           && TREE_CODE (*op) == SSA_NAME)
5203         *op = SSA_NAME_VAR (*op);
5204     }
5205
5206   return true;
5207 }
5208
5209 /* Unshares REF and replaces ssa names inside it by their basic variables.  */
5210
5211 static tree
5212 unshare_and_remove_ssa_names (tree ref)
5213 {
5214   ref = unshare_expr (ref);
5215   for_each_index (&ref, idx_remove_ssa_names, NULL);
5216
5217   return ref;
5218 }
5219
5220 /* Extract the alias analysis info for the memory reference REF.  There are
5221    several ways how this information may be stored and what precisely is
5222    its semantics depending on the type of the reference, but there always is
5223    somewhere hidden one _DECL node that is used to determine the set of
5224    virtual operands for the reference.  The code below deciphers this jungle
5225    and extracts this single useful piece of information.  */
5226
5227 static tree
5228 get_ref_tag (tree ref, tree orig)
5229 {
5230   tree var = get_base_address (ref);
5231   tree aref = NULL_TREE, tag, sv;
5232   HOST_WIDE_INT offset, size, maxsize;
5233
5234   for (sv = orig; handled_component_p (sv); sv = TREE_OPERAND (sv, 0))
5235     {
5236       aref = get_ref_base_and_extent (sv, &offset, &size, &maxsize);
5237       if (ref)
5238         break;
5239     }
5240
5241   if (!var)
5242     return NULL_TREE;
5243
5244   if (TREE_CODE (var) == INDIRECT_REF)
5245     {
5246       /* If the base is a dereference of a pointer, first check its name memory
5247          tag.  If it does not have one, use its symbol memory tag.  */
5248       var = TREE_OPERAND (var, 0);
5249       if (TREE_CODE (var) != SSA_NAME)
5250         return NULL_TREE;
5251
5252       if (SSA_NAME_PTR_INFO (var))
5253         {
5254           tag = SSA_NAME_PTR_INFO (var)->name_mem_tag;
5255           if (tag)
5256             return tag;
5257         }
5258  
5259       var = SSA_NAME_VAR (var);
5260       tag = symbol_mem_tag (var);
5261       gcc_assert (tag != NULL_TREE);
5262       return tag;
5263     }
5264   else
5265     { 
5266       if (!DECL_P (var))
5267         return NULL_TREE;
5268
5269       tag = symbol_mem_tag (var);
5270       if (tag)
5271         return tag;
5272
5273       return var;
5274     }
5275 }
5276
5277 /* Copies the reference information from OLD_REF to NEW_REF.  */
5278
5279 static void
5280 copy_ref_info (tree new_ref, tree old_ref)
5281 {
5282   if (TREE_CODE (old_ref) == TARGET_MEM_REF)
5283     copy_mem_ref_info (new_ref, old_ref);
5284   else
5285     {
5286       TMR_ORIGINAL (new_ref) = unshare_and_remove_ssa_names (old_ref);
5287       TMR_TAG (new_ref) = get_ref_tag (old_ref, TMR_ORIGINAL (new_ref));
5288     }
5289 }
5290
5291 /* Rewrites USE (address that is an iv) using candidate CAND.  */
5292
5293 static void
5294 rewrite_use_address (struct ivopts_data *data,
5295                      struct iv_use *use, struct iv_cand *cand)
5296 {
5297   aff_tree aff;
5298   gimple_stmt_iterator bsi = gsi_for_stmt (use->stmt);
5299   tree ref;
5300   bool ok;
5301
5302   ok = get_computation_aff (data->current_loop, use, cand, use->stmt, &aff);
5303   gcc_assert (ok);
5304   unshare_aff_combination (&aff);
5305
5306   ref = create_mem_ref (&bsi, TREE_TYPE (*use->op_p), &aff, data->speed);
5307   copy_ref_info (ref, *use->op_p);
5308   *use->op_p = ref;
5309 }
5310
5311 /* Rewrites USE (the condition such that one of the arguments is an iv) using
5312    candidate CAND.  */
5313
5314 static void
5315 rewrite_use_compare (struct ivopts_data *data,
5316                      struct iv_use *use, struct iv_cand *cand)
5317 {
5318   tree comp, *var_p, op, bound;
5319   gimple_stmt_iterator bsi = gsi_for_stmt (use->stmt);
5320   enum tree_code compare;
5321   struct cost_pair *cp = get_use_iv_cost (data, use, cand);
5322   bool ok;
5323
5324   bound = cp->value;
5325   if (bound)
5326     {
5327       tree var = var_at_stmt (data->current_loop, cand, use->stmt);
5328       tree var_type = TREE_TYPE (var);
5329       gimple_seq stmts;
5330
5331       compare = iv_elimination_compare (data, use);
5332       bound = unshare_expr (fold_convert (var_type, bound));
5333       op = force_gimple_operand (bound, &stmts, true, NULL_TREE);
5334       if (stmts)
5335         gsi_insert_seq_on_edge_immediate (
5336                 loop_preheader_edge (data->current_loop),
5337                 stmts);
5338
5339       gimple_cond_set_lhs (use->stmt, var);
5340       gimple_cond_set_code (use->stmt, compare);
5341       gimple_cond_set_rhs (use->stmt, op);
5342       return;
5343     }
5344
5345   /* The induction variable elimination failed; just express the original
5346      giv.  */
5347   comp = get_computation (data->current_loop, use, cand);
5348   gcc_assert (comp != NULL_TREE);
5349
5350   ok = extract_cond_operands (data, use->stmt, &var_p, NULL, NULL, NULL);
5351   gcc_assert (ok);
5352
5353   *var_p = force_gimple_operand_gsi (&bsi, comp, true, SSA_NAME_VAR (*var_p),
5354                                      true, GSI_SAME_STMT);
5355 }
5356
5357 /* Rewrites USE using candidate CAND.  */
5358
5359 static void
5360 rewrite_use (struct ivopts_data *data, struct iv_use *use, struct iv_cand *cand)
5361 {
5362   push_stmt_changes (&use->stmt);
5363
5364   switch (use->type)
5365     {
5366       case USE_NONLINEAR_EXPR:
5367         rewrite_use_nonlinear_expr (data, use, cand);
5368         break;
5369
5370       case USE_ADDRESS:
5371         rewrite_use_address (data, use, cand);
5372         break;
5373
5374       case USE_COMPARE:
5375         rewrite_use_compare (data, use, cand);
5376         break;
5377
5378       default:
5379         gcc_unreachable ();
5380     }
5381
5382   pop_stmt_changes (&use->stmt);
5383 }
5384
5385 /* Rewrite the uses using the selected induction variables.  */
5386
5387 static void
5388 rewrite_uses (struct ivopts_data *data)
5389 {
5390   unsigned i;
5391   struct iv_cand *cand;
5392   struct iv_use *use;
5393
5394   for (i = 0; i < n_iv_uses (data); i++)
5395     {
5396       use = iv_use (data, i);
5397       cand = use->selected;
5398       gcc_assert (cand);
5399
5400       rewrite_use (data, use, cand);
5401     }
5402 }
5403
5404 /* Removes the ivs that are not used after rewriting.  */
5405
5406 static void
5407 remove_unused_ivs (struct ivopts_data *data)
5408 {
5409   unsigned j;
5410   bitmap_iterator bi;
5411
5412   EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, j, bi)
5413     {
5414       struct version_info *info;
5415
5416       info = ver_info (data, j);
5417       if (info->iv
5418           && !integer_zerop (info->iv->step)
5419           && !info->inv_id
5420           && !info->iv->have_use_for
5421           && !info->preserve_biv)
5422         remove_statement (SSA_NAME_DEF_STMT (info->iv->ssa_name), true);
5423     }
5424 }
5425
5426 /* Frees data allocated by the optimization of a single loop.  */
5427
5428 static void
5429 free_loop_data (struct ivopts_data *data)
5430 {
5431   unsigned i, j;
5432   bitmap_iterator bi;
5433   tree obj;
5434
5435   if (data->niters)
5436     {
5437       pointer_map_destroy (data->niters);
5438       data->niters = NULL;
5439     }
5440
5441   EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, i, bi)
5442     {
5443       struct version_info *info;
5444
5445       info = ver_info (data, i);
5446       if (info->iv)
5447         free (info->iv);
5448       info->iv = NULL;
5449       info->has_nonlin_use = false;
5450       info->preserve_biv = false;
5451       info->inv_id = 0;
5452     }
5453   bitmap_clear (data->relevant);
5454   bitmap_clear (data->important_candidates);
5455
5456   for (i = 0; i < n_iv_uses (data); i++)
5457     {
5458       struct iv_use *use = iv_use (data, i);
5459
5460       free (use->iv);
5461       BITMAP_FREE (use->related_cands);
5462       for (j = 0; j < use->n_map_members; j++)
5463         if (use->cost_map[j].depends_on)
5464           BITMAP_FREE (use->cost_map[j].depends_on);
5465       free (use->cost_map);
5466       free (use);
5467     }
5468   VEC_truncate (iv_use_p, data->iv_uses, 0);
5469
5470   for (i = 0; i < n_iv_cands (data); i++)
5471     {
5472       struct iv_cand *cand = iv_cand (data, i);
5473
5474       if (cand->iv)
5475         free (cand->iv);
5476       if (cand->depends_on)
5477         BITMAP_FREE (cand->depends_on);
5478       free (cand);
5479     }
5480   VEC_truncate (iv_cand_p, data->iv_candidates, 0);
5481
5482   if (data->version_info_size < num_ssa_names)
5483     {
5484       data->version_info_size = 2 * num_ssa_names;
5485       free (data->version_info);
5486       data->version_info = XCNEWVEC (struct version_info, data->version_info_size);
5487     }
5488
5489   data->max_inv_id = 0;
5490
5491   for (i = 0; VEC_iterate (tree, decl_rtl_to_reset, i, obj); i++)
5492     SET_DECL_RTL (obj, NULL_RTX);
5493
5494   VEC_truncate (tree, decl_rtl_to_reset, 0);
5495 }
5496
5497 /* Finalizes data structures used by the iv optimization pass.  LOOPS is the
5498    loop tree.  */
5499
5500 static void
5501 tree_ssa_iv_optimize_finalize (struct ivopts_data *data)
5502 {
5503   free_loop_data (data);
5504   free (data->version_info);
5505   BITMAP_FREE (data->relevant);
5506   BITMAP_FREE (data->important_candidates);
5507
5508   VEC_free (tree, heap, decl_rtl_to_reset);
5509   VEC_free (iv_use_p, heap, data->iv_uses);
5510   VEC_free (iv_cand_p, heap, data->iv_candidates);
5511 }
5512
5513 /* Optimizes the LOOP.  Returns true if anything changed.  */
5514
5515 static bool
5516 tree_ssa_iv_optimize_loop (struct ivopts_data *data, struct loop *loop)
5517 {
5518   bool changed = false;
5519   struct iv_ca *iv_ca;
5520   edge exit;
5521
5522   gcc_assert (!data->niters);
5523   data->current_loop = loop;
5524   data->speed = optimize_loop_for_speed_p (loop);
5525
5526   if (dump_file && (dump_flags & TDF_DETAILS))
5527     {
5528       fprintf (dump_file, "Processing loop %d\n", loop->num);
5529       
5530       exit = single_dom_exit (loop);
5531       if (exit)
5532         {
5533           fprintf (dump_file, "  single exit %d -> %d, exit condition ",
5534                    exit->src->index, exit->dest->index);
5535           print_gimple_stmt (dump_file, last_stmt (exit->src), 0, TDF_SLIM);
5536           fprintf (dump_file, "\n");
5537         }
5538
5539       fprintf (dump_file, "\n");
5540     }
5541
5542   /* For each ssa name determines whether it behaves as an induction variable
5543      in some loop.  */
5544   if (!find_induction_variables (data))
5545     goto finish;
5546
5547   /* Finds interesting uses (item 1).  */
5548   find_interesting_uses (data);
5549   if (n_iv_uses (data) > MAX_CONSIDERED_USES)
5550     goto finish;
5551
5552   /* Finds candidates for the induction variables (item 2).  */
5553   find_iv_candidates (data);
5554
5555   /* Calculates the costs (item 3, part 1).  */
5556   determine_use_iv_costs (data);
5557   determine_iv_costs (data);
5558   determine_set_costs (data);
5559
5560   /* Find the optimal set of induction variables (item 3, part 2).  */
5561   iv_ca = find_optimal_iv_set (data);
5562   if (!iv_ca)
5563     goto finish;
5564   changed = true;
5565
5566   /* Create the new induction variables (item 4, part 1).  */
5567   create_new_ivs (data, iv_ca);
5568   iv_ca_free (&iv_ca);
5569   
5570   /* Rewrite the uses (item 4, part 2).  */
5571   rewrite_uses (data);
5572
5573   /* Remove the ivs that are unused after rewriting.  */
5574   remove_unused_ivs (data);
5575
5576   /* We have changed the structure of induction variables; it might happen
5577      that definitions in the scev database refer to some of them that were
5578      eliminated.  */
5579   scev_reset ();
5580
5581 finish:
5582   free_loop_data (data);
5583
5584   return changed;
5585 }
5586
5587 /* Main entry point.  Optimizes induction variables in loops.  */
5588
5589 void
5590 tree_ssa_iv_optimize (void)
5591 {
5592   struct loop *loop;
5593   struct ivopts_data data;
5594   loop_iterator li;
5595
5596   tree_ssa_iv_optimize_init (&data);
5597
5598   /* Optimize the loops starting with the innermost ones.  */
5599   FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
5600     {
5601       if (dump_file && (dump_flags & TDF_DETAILS))
5602         flow_loop_dump (loop, dump_file, NULL, 1);
5603
5604       tree_ssa_iv_optimize_loop (&data, loop);
5605     }
5606
5607   tree_ssa_iv_optimize_finalize (&data);
5608 }