OSDN Git Service

e0a681db2f2bceeb51190f9618911a4ce9b3f035
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-structalias.c
1 /* Tree based points-to analysis
2    Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
3    Contributed by Daniel Berlin <dberlin@dberlin.org>
4
5    This file is part of GCC.
6
7    GCC is free software; you can redistribute it and/or modify
8    under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    GCC is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License 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 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "ggc.h"
26 #include "obstack.h"
27 #include "bitmap.h"
28 #include "flags.h"
29 #include "rtl.h"
30 #include "tm_p.h"
31 #include "hard-reg-set.h"
32 #include "basic-block.h"
33 #include "output.h"
34 #include "tree.h"
35 #include "tree-flow.h"
36 #include "tree-inline.h"
37 #include "varray.h"
38 #include "diagnostic.h"
39 #include "toplev.h"
40 #include "gimple.h"
41 #include "hashtab.h"
42 #include "function.h"
43 #include "cgraph.h"
44 #include "tree-pass.h"
45 #include "timevar.h"
46 #include "alloc-pool.h"
47 #include "splay-tree.h"
48 #include "params.h"
49 #include "cgraph.h"
50 #include "alias.h"
51 #include "pointer-set.h"
52
53 /* The idea behind this analyzer is to generate set constraints from the
54    program, then solve the resulting constraints in order to generate the
55    points-to sets.
56
57    Set constraints are a way of modeling program analysis problems that
58    involve sets.  They consist of an inclusion constraint language,
59    describing the variables (each variable is a set) and operations that
60    are involved on the variables, and a set of rules that derive facts
61    from these operations.  To solve a system of set constraints, you derive
62    all possible facts under the rules, which gives you the correct sets
63    as a consequence.
64
65    See  "Efficient Field-sensitive pointer analysis for C" by "David
66    J. Pearce and Paul H. J. Kelly and Chris Hankin, at
67    http://citeseer.ist.psu.edu/pearce04efficient.html
68
69    Also see "Ultra-fast Aliasing Analysis using CLA: A Million Lines
70    of C Code in a Second" by ""Nevin Heintze and Olivier Tardieu" at
71    http://citeseer.ist.psu.edu/heintze01ultrafast.html
72
73    There are three types of real constraint expressions, DEREF,
74    ADDRESSOF, and SCALAR.  Each constraint expression consists
75    of a constraint type, a variable, and an offset.
76
77    SCALAR is a constraint expression type used to represent x, whether
78    it appears on the LHS or the RHS of a statement.
79    DEREF is a constraint expression type used to represent *x, whether
80    it appears on the LHS or the RHS of a statement.
81    ADDRESSOF is a constraint expression used to represent &x, whether
82    it appears on the LHS or the RHS of a statement.
83
84    Each pointer variable in the program is assigned an integer id, and
85    each field of a structure variable is assigned an integer id as well.
86
87    Structure variables are linked to their list of fields through a "next
88    field" in each variable that points to the next field in offset
89    order.
90    Each variable for a structure field has
91
92    1. "size", that tells the size in bits of that field.
93    2. "fullsize, that tells the size in bits of the entire structure.
94    3. "offset", that tells the offset in bits from the beginning of the
95    structure to this field.
96
97    Thus,
98    struct f
99    {
100      int a;
101      int b;
102    } foo;
103    int *bar;
104
105    looks like
106
107    foo.a -> id 1, size 32, offset 0, fullsize 64, next foo.b
108    foo.b -> id 2, size 32, offset 32, fullsize 64, next NULL
109    bar -> id 3, size 32, offset 0, fullsize 32, next NULL
110
111
112   In order to solve the system of set constraints, the following is
113   done:
114
115   1. Each constraint variable x has a solution set associated with it,
116   Sol(x).
117
118   2. Constraints are separated into direct, copy, and complex.
119   Direct constraints are ADDRESSOF constraints that require no extra
120   processing, such as P = &Q
121   Copy constraints are those of the form P = Q.
122   Complex constraints are all the constraints involving dereferences
123   and offsets (including offsetted copies).
124
125   3. All direct constraints of the form P = &Q are processed, such
126   that Q is added to Sol(P)
127
128   4. All complex constraints for a given constraint variable are stored in a
129   linked list attached to that variable's node.
130
131   5. A directed graph is built out of the copy constraints. Each
132   constraint variable is a node in the graph, and an edge from
133   Q to P is added for each copy constraint of the form P = Q
134
135   6. The graph is then walked, and solution sets are
136   propagated along the copy edges, such that an edge from Q to P
137   causes Sol(P) <- Sol(P) union Sol(Q).
138
139   7.  As we visit each node, all complex constraints associated with
140   that node are processed by adding appropriate copy edges to the graph, or the
141   appropriate variables to the solution set.
142
143   8. The process of walking the graph is iterated until no solution
144   sets change.
145
146   Prior to walking the graph in steps 6 and 7, We perform static
147   cycle elimination on the constraint graph, as well
148   as off-line variable substitution.
149
150   TODO: Adding offsets to pointer-to-structures can be handled (IE not punted
151   on and turned into anything), but isn't.  You can just see what offset
152   inside the pointed-to struct it's going to access.
153
154   TODO: Constant bounded arrays can be handled as if they were structs of the
155   same number of elements.
156
157   TODO: Modeling heap and incoming pointers becomes much better if we
158   add fields to them as we discover them, which we could do.
159
160   TODO: We could handle unions, but to be honest, it's probably not
161   worth the pain or slowdown.  */
162
163 static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
164 htab_t heapvar_for_stmt;
165
166 static bool use_field_sensitive = true;
167 static int in_ipa_mode = 0;
168
169 /* Used for predecessor bitmaps. */
170 static bitmap_obstack predbitmap_obstack;
171
172 /* Used for points-to sets.  */
173 static bitmap_obstack pta_obstack;
174
175 /* Used for oldsolution members of variables. */
176 static bitmap_obstack oldpta_obstack;
177
178 /* Used for per-solver-iteration bitmaps.  */
179 static bitmap_obstack iteration_obstack;
180
181 static unsigned int create_variable_info_for (tree, const char *);
182 typedef struct constraint_graph *constraint_graph_t;
183 static void unify_nodes (constraint_graph_t, unsigned int, unsigned int, bool);
184
185 struct constraint;
186 typedef struct constraint *constraint_t;
187
188 DEF_VEC_P(constraint_t);
189 DEF_VEC_ALLOC_P(constraint_t,heap);
190
191 #define EXECUTE_IF_IN_NONNULL_BITMAP(a, b, c, d)        \
192   if (a)                                                \
193     EXECUTE_IF_SET_IN_BITMAP (a, b, c, d)
194
195 static struct constraint_stats
196 {
197   unsigned int total_vars;
198   unsigned int nonpointer_vars;
199   unsigned int unified_vars_static;
200   unsigned int unified_vars_dynamic;
201   unsigned int iterations;
202   unsigned int num_edges;
203   unsigned int num_implicit_edges;
204   unsigned int points_to_sets_created;
205 } stats;
206
207 struct variable_info
208 {
209   /* ID of this variable  */
210   unsigned int id;
211
212   /* True if this is a variable created by the constraint analysis, such as
213      heap variables and constraints we had to break up.  */
214   unsigned int is_artificial_var : 1;
215
216   /* True if this is a special variable whose solution set should not be
217      changed.  */
218   unsigned int is_special_var : 1;
219
220   /* True for variables whose size is not known or variable.  */
221   unsigned int is_unknown_size_var : 1;
222
223   /* True for (sub-)fields that represent a whole variable.  */
224   unsigned int is_full_var : 1;
225
226   /* True if this is a heap variable.  */
227   unsigned int is_heap_var : 1;
228
229   /* True if this is a variable tracking a restrict pointer source.  */
230   unsigned int is_restrict_var : 1;
231
232   /* True if this field may contain pointers.  */
233   unsigned int may_have_pointers : 1;
234
235   /* True if this represents a global variable.  */
236   unsigned int is_global_var : 1;
237
238   /* A link to the variable for the next field in this structure.  */
239   struct variable_info *next;
240
241   /* Offset of this variable, in bits, from the base variable  */
242   unsigned HOST_WIDE_INT offset;
243
244   /* Size of the variable, in bits.  */
245   unsigned HOST_WIDE_INT size;
246
247   /* Full size of the base variable, in bits.  */
248   unsigned HOST_WIDE_INT fullsize;
249
250   /* Name of this variable */
251   const char *name;
252
253   /* Tree that this variable is associated with.  */
254   tree decl;
255
256   /* Points-to set for this variable.  */
257   bitmap solution;
258
259   /* Old points-to set for this variable.  */
260   bitmap oldsolution;
261 };
262 typedef struct variable_info *varinfo_t;
263
264 static varinfo_t first_vi_for_offset (varinfo_t, unsigned HOST_WIDE_INT);
265 static varinfo_t first_or_preceding_vi_for_offset (varinfo_t,
266                                                    unsigned HOST_WIDE_INT);
267 static varinfo_t lookup_vi_for_tree (tree);
268
269 /* Pool of variable info structures.  */
270 static alloc_pool variable_info_pool;
271
272 DEF_VEC_P(varinfo_t);
273
274 DEF_VEC_ALLOC_P(varinfo_t, heap);
275
276 /* Table of variable info structures for constraint variables.
277    Indexed directly by variable info id.  */
278 static VEC(varinfo_t,heap) *varmap;
279
280 /* Return the varmap element N */
281
282 static inline varinfo_t
283 get_varinfo (unsigned int n)
284 {
285   return VEC_index (varinfo_t, varmap, n);
286 }
287
288 /* Static IDs for the special variables.  */
289 enum { nothing_id = 0, anything_id = 1, readonly_id = 2,
290        escaped_id = 3, nonlocal_id = 4, callused_id = 5,
291        storedanything_id = 6, integer_id = 7 };
292
293 struct GTY(()) heapvar_map {
294   struct tree_map map;
295   unsigned HOST_WIDE_INT offset;
296 };
297
298 static int
299 heapvar_map_eq (const void *p1, const void *p2)
300 {
301   const struct heapvar_map *h1 = (const struct heapvar_map *)p1;
302   const struct heapvar_map *h2 = (const struct heapvar_map *)p2;
303   return (h1->map.base.from == h2->map.base.from
304           && h1->offset == h2->offset);
305 }
306
307 static unsigned int
308 heapvar_map_hash (struct heapvar_map *h)
309 {
310   return iterative_hash_host_wide_int (h->offset,
311                                        htab_hash_pointer (h->map.base.from));
312 }
313
314 /* Lookup a heap var for FROM, and return it if we find one.  */
315
316 static tree
317 heapvar_lookup (tree from, unsigned HOST_WIDE_INT offset)
318 {
319   struct heapvar_map *h, in;
320   in.map.base.from = from;
321   in.offset = offset;
322   h = (struct heapvar_map *) htab_find_with_hash (heapvar_for_stmt, &in,
323                                                   heapvar_map_hash (&in));
324   if (h)
325     return h->map.to;
326   return NULL_TREE;
327 }
328
329 /* Insert a mapping FROM->TO in the heap var for statement
330    hashtable.  */
331
332 static void
333 heapvar_insert (tree from, unsigned HOST_WIDE_INT offset, tree to)
334 {
335   struct heapvar_map *h;
336   void **loc;
337
338   h = GGC_NEW (struct heapvar_map);
339   h->map.base.from = from;
340   h->offset = offset;
341   h->map.hash = heapvar_map_hash (h);
342   h->map.to = to;
343   loc = htab_find_slot_with_hash (heapvar_for_stmt, h, h->map.hash, INSERT);
344   gcc_assert (*loc == NULL);
345   *(struct heapvar_map **) loc = h;
346 }
347
348 /* Return a new variable info structure consisting for a variable
349    named NAME, and using constraint graph node NODE.  Append it
350    to the vector of variable info structures.  */
351
352 static varinfo_t
353 new_var_info (tree t, const char *name)
354 {
355   unsigned index = VEC_length (varinfo_t, varmap);
356   varinfo_t ret = (varinfo_t) pool_alloc (variable_info_pool);
357
358   ret->id = index;
359   ret->name = name;
360   ret->decl = t;
361   /* Vars without decl are artificial and do not have sub-variables.  */
362   ret->is_artificial_var = (t == NULL_TREE);
363   ret->is_special_var = false;
364   ret->is_unknown_size_var = false;
365   ret->is_full_var = (t == NULL_TREE);
366   ret->is_heap_var = false;
367   ret->is_restrict_var = false;
368   ret->may_have_pointers = true;
369   ret->is_global_var = (t == NULL_TREE);
370   if (t && DECL_P (t))
371     ret->is_global_var = is_global_var (t);
372   ret->solution = BITMAP_ALLOC (&pta_obstack);
373   ret->oldsolution = BITMAP_ALLOC (&oldpta_obstack);
374   ret->next = NULL;
375
376   VEC_safe_push (varinfo_t, heap, varmap, ret);
377
378   return ret;
379 }
380
381 typedef enum {SCALAR, DEREF, ADDRESSOF} constraint_expr_type;
382
383 /* An expression that appears in a constraint.  */
384
385 struct constraint_expr
386 {
387   /* Constraint type.  */
388   constraint_expr_type type;
389
390   /* Variable we are referring to in the constraint.  */
391   unsigned int var;
392
393   /* Offset, in bits, of this constraint from the beginning of
394      variables it ends up referring to.
395
396      IOW, in a deref constraint, we would deref, get the result set,
397      then add OFFSET to each member.   */
398   HOST_WIDE_INT offset;
399 };
400
401 /* Use 0x8000... as special unknown offset.  */
402 #define UNKNOWN_OFFSET ((HOST_WIDE_INT)-1 << (HOST_BITS_PER_WIDE_INT-1))
403
404 typedef struct constraint_expr ce_s;
405 DEF_VEC_O(ce_s);
406 DEF_VEC_ALLOC_O(ce_s, heap);
407 static void get_constraint_for_1 (tree, VEC(ce_s, heap) **, bool);
408 static void get_constraint_for (tree, VEC(ce_s, heap) **);
409 static void do_deref (VEC (ce_s, heap) **);
410
411 /* Our set constraints are made up of two constraint expressions, one
412    LHS, and one RHS.
413
414    As described in the introduction, our set constraints each represent an
415    operation between set valued variables.
416 */
417 struct constraint
418 {
419   struct constraint_expr lhs;
420   struct constraint_expr rhs;
421 };
422
423 /* List of constraints that we use to build the constraint graph from.  */
424
425 static VEC(constraint_t,heap) *constraints;
426 static alloc_pool constraint_pool;
427
428 /* The constraint graph is represented as an array of bitmaps
429    containing successor nodes.  */
430
431 struct constraint_graph
432 {
433   /* Size of this graph, which may be different than the number of
434      nodes in the variable map.  */
435   unsigned int size;
436
437   /* Explicit successors of each node. */
438   bitmap *succs;
439
440   /* Implicit predecessors of each node (Used for variable
441      substitution). */
442   bitmap *implicit_preds;
443
444   /* Explicit predecessors of each node (Used for variable substitution).  */
445   bitmap *preds;
446
447   /* Indirect cycle representatives, or -1 if the node has no indirect
448      cycles.  */
449   int *indirect_cycles;
450
451   /* Representative node for a node.  rep[a] == a unless the node has
452      been unified. */
453   unsigned int *rep;
454
455   /* Equivalence class representative for a label.  This is used for
456      variable substitution.  */
457   int *eq_rep;
458
459   /* Pointer equivalence label for a node.  All nodes with the same
460      pointer equivalence label can be unified together at some point
461      (either during constraint optimization or after the constraint
462      graph is built).  */
463   unsigned int *pe;
464
465   /* Pointer equivalence representative for a label.  This is used to
466      handle nodes that are pointer equivalent but not location
467      equivalent.  We can unite these once the addressof constraints
468      are transformed into initial points-to sets.  */
469   int *pe_rep;
470
471   /* Pointer equivalence label for each node, used during variable
472      substitution.  */
473   unsigned int *pointer_label;
474
475   /* Location equivalence label for each node, used during location
476      equivalence finding.  */
477   unsigned int *loc_label;
478
479   /* Pointed-by set for each node, used during location equivalence
480      finding.  This is pointed-by rather than pointed-to, because it
481      is constructed using the predecessor graph.  */
482   bitmap *pointed_by;
483
484   /* Points to sets for pointer equivalence.  This is *not* the actual
485      points-to sets for nodes.  */
486   bitmap *points_to;
487
488   /* Bitmap of nodes where the bit is set if the node is a direct
489      node.  Used for variable substitution.  */
490   sbitmap direct_nodes;
491
492   /* Bitmap of nodes where the bit is set if the node is address
493      taken.  Used for variable substitution.  */
494   bitmap address_taken;
495
496   /* Vector of complex constraints for each graph node.  Complex
497      constraints are those involving dereferences or offsets that are
498      not 0.  */
499   VEC(constraint_t,heap) **complex;
500 };
501
502 static constraint_graph_t graph;
503
504 /* During variable substitution and the offline version of indirect
505    cycle finding, we create nodes to represent dereferences and
506    address taken constraints.  These represent where these start and
507    end.  */
508 #define FIRST_REF_NODE (VEC_length (varinfo_t, varmap))
509 #define LAST_REF_NODE (FIRST_REF_NODE + (FIRST_REF_NODE - 1))
510
511 /* Return the representative node for NODE, if NODE has been unioned
512    with another NODE.
513    This function performs path compression along the way to finding
514    the representative.  */
515
516 static unsigned int
517 find (unsigned int node)
518 {
519   gcc_assert (node < graph->size);
520   if (graph->rep[node] != node)
521     return graph->rep[node] = find (graph->rep[node]);
522   return node;
523 }
524
525 /* Union the TO and FROM nodes to the TO nodes.
526    Note that at some point in the future, we may want to do
527    union-by-rank, in which case we are going to have to return the
528    node we unified to.  */
529
530 static bool
531 unite (unsigned int to, unsigned int from)
532 {
533   gcc_assert (to < graph->size && from < graph->size);
534   if (to != from && graph->rep[from] != to)
535     {
536       graph->rep[from] = to;
537       return true;
538     }
539   return false;
540 }
541
542 /* Create a new constraint consisting of LHS and RHS expressions.  */
543
544 static constraint_t
545 new_constraint (const struct constraint_expr lhs,
546                 const struct constraint_expr rhs)
547 {
548   constraint_t ret = (constraint_t) pool_alloc (constraint_pool);
549   ret->lhs = lhs;
550   ret->rhs = rhs;
551   return ret;
552 }
553
554 /* Print out constraint C to FILE.  */
555
556 static void
557 dump_constraint (FILE *file, constraint_t c)
558 {
559   if (c->lhs.type == ADDRESSOF)
560     fprintf (file, "&");
561   else if (c->lhs.type == DEREF)
562     fprintf (file, "*");
563   fprintf (file, "%s", get_varinfo (c->lhs.var)->name);
564   if (c->lhs.offset == UNKNOWN_OFFSET)
565     fprintf (file, " + UNKNOWN");
566   else if (c->lhs.offset != 0)
567     fprintf (file, " + " HOST_WIDE_INT_PRINT_DEC, c->lhs.offset);
568   fprintf (file, " = ");
569   if (c->rhs.type == ADDRESSOF)
570     fprintf (file, "&");
571   else if (c->rhs.type == DEREF)
572     fprintf (file, "*");
573   fprintf (file, "%s", get_varinfo (c->rhs.var)->name);
574   if (c->rhs.offset == UNKNOWN_OFFSET)
575     fprintf (file, " + UNKNOWN");
576   else if (c->rhs.offset != 0)
577     fprintf (file, " + " HOST_WIDE_INT_PRINT_DEC, c->rhs.offset);
578   fprintf (file, "\n");
579 }
580
581
582 void debug_constraint (constraint_t);
583 void debug_constraints (void);
584 void debug_constraint_graph (void);
585 void debug_solution_for_var (unsigned int);
586 void debug_sa_points_to_info (void);
587
588 /* Print out constraint C to stderr.  */
589
590 void
591 debug_constraint (constraint_t c)
592 {
593   dump_constraint (stderr, c);
594 }
595
596 /* Print out all constraints to FILE */
597
598 static void
599 dump_constraints (FILE *file)
600 {
601   int i;
602   constraint_t c;
603   for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
604     dump_constraint (file, c);
605 }
606
607 /* Print out all constraints to stderr.  */
608
609 void
610 debug_constraints (void)
611 {
612   dump_constraints (stderr);
613 }
614
615 /* Print out to FILE the edge in the constraint graph that is created by
616    constraint c. The edge may have a label, depending on the type of
617    constraint that it represents. If complex1, e.g: a = *b, then the label
618    is "=*", if complex2, e.g: *a = b, then the label is "*=", if
619    complex with an offset, e.g: a = b + 8, then the label is "+".
620    Otherwise the edge has no label.  */
621
622 static void
623 dump_constraint_edge (FILE *file, constraint_t c)
624 {
625   if (c->rhs.type != ADDRESSOF)
626     {
627       const char *src = get_varinfo (c->rhs.var)->name;
628       const char *dst = get_varinfo (c->lhs.var)->name;
629       fprintf (file, "  \"%s\" -> \"%s\" ", src, dst);
630       /* Due to preprocessing of constraints, instructions like *a = *b are
631          illegal; thus, we do not have to handle such cases.  */
632       if (c->lhs.type == DEREF)
633         fprintf (file, " [ label=\"*=\" ] ;\n");
634       else if (c->rhs.type == DEREF)
635         fprintf (file, " [ label=\"=*\" ] ;\n");
636       else
637         {
638           /* We must check the case where the constraint is an offset.
639              In this case, it is treated as a complex constraint.  */
640           if (c->rhs.offset != c->lhs.offset)
641             fprintf (file, " [ label=\"+\" ] ;\n");
642           else
643             fprintf (file, " ;\n");
644         }
645     }
646 }
647
648 /* Print the constraint graph in dot format.  */
649
650 static void
651 dump_constraint_graph (FILE *file)
652 {
653   unsigned int i=0, size;
654   constraint_t c;
655
656   /* Only print the graph if it has already been initialized:  */
657   if (!graph)
658     return;
659
660   /* Print the constraints used to produce the constraint graph. The
661      constraints will be printed as comments in the dot file:  */
662   fprintf (file, "\n\n/* Constraints used in the constraint graph:\n");
663   dump_constraints (file);
664   fprintf (file, "*/\n");
665
666   /* Prints the header of the dot file:  */
667   fprintf (file, "\n\n// The constraint graph in dot format:\n");
668   fprintf (file, "strict digraph {\n");
669   fprintf (file, "  node [\n    shape = box\n  ]\n");
670   fprintf (file, "  edge [\n    fontsize = \"12\"\n  ]\n");
671   fprintf (file, "\n  // List of nodes in the constraint graph:\n");
672
673   /* The next lines print the nodes in the graph. In order to get the
674      number of nodes in the graph, we must choose the minimum between the
675      vector VEC (varinfo_t, varmap) and graph->size. If the graph has not
676      yet been initialized, then graph->size == 0, otherwise we must only
677      read nodes that have an entry in VEC (varinfo_t, varmap).  */
678   size = VEC_length (varinfo_t, varmap);
679   size = size < graph->size ? size : graph->size;
680   for (i = 0; i < size; i++)
681     {
682       const char *name = get_varinfo (graph->rep[i])->name;
683       fprintf (file, "  \"%s\" ;\n", name);
684     }
685
686   /* Go over the list of constraints printing the edges in the constraint
687      graph.  */
688   fprintf (file, "\n  // The constraint edges:\n");
689   for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
690     if (c)
691       dump_constraint_edge (file, c);
692
693   /* Prints the tail of the dot file. By now, only the closing bracket.  */
694   fprintf (file, "}\n\n\n");
695 }
696
697 /* Print out the constraint graph to stderr.  */
698
699 void
700 debug_constraint_graph (void)
701 {
702   dump_constraint_graph (stderr);
703 }
704
705 /* SOLVER FUNCTIONS
706
707    The solver is a simple worklist solver, that works on the following
708    algorithm:
709
710    sbitmap changed_nodes = all zeroes;
711    changed_count = 0;
712    For each node that is not already collapsed:
713        changed_count++;
714        set bit in changed nodes
715
716    while (changed_count > 0)
717    {
718      compute topological ordering for constraint graph
719
720      find and collapse cycles in the constraint graph (updating
721      changed if necessary)
722
723      for each node (n) in the graph in topological order:
724        changed_count--;
725
726        Process each complex constraint associated with the node,
727        updating changed if necessary.
728
729        For each outgoing edge from n, propagate the solution from n to
730        the destination of the edge, updating changed as necessary.
731
732    }  */
733
734 /* Return true if two constraint expressions A and B are equal.  */
735
736 static bool
737 constraint_expr_equal (struct constraint_expr a, struct constraint_expr b)
738 {
739   return a.type == b.type && a.var == b.var && a.offset == b.offset;
740 }
741
742 /* Return true if constraint expression A is less than constraint expression
743    B.  This is just arbitrary, but consistent, in order to give them an
744    ordering.  */
745
746 static bool
747 constraint_expr_less (struct constraint_expr a, struct constraint_expr b)
748 {
749   if (a.type == b.type)
750     {
751       if (a.var == b.var)
752         return a.offset < b.offset;
753       else
754         return a.var < b.var;
755     }
756   else
757     return a.type < b.type;
758 }
759
760 /* Return true if constraint A is less than constraint B.  This is just
761    arbitrary, but consistent, in order to give them an ordering.  */
762
763 static bool
764 constraint_less (const constraint_t a, const constraint_t b)
765 {
766   if (constraint_expr_less (a->lhs, b->lhs))
767     return true;
768   else if (constraint_expr_less (b->lhs, a->lhs))
769     return false;
770   else
771     return constraint_expr_less (a->rhs, b->rhs);
772 }
773
774 /* Return true if two constraints A and B are equal.  */
775
776 static bool
777 constraint_equal (struct constraint a, struct constraint b)
778 {
779   return constraint_expr_equal (a.lhs, b.lhs)
780     && constraint_expr_equal (a.rhs, b.rhs);
781 }
782
783
784 /* Find a constraint LOOKFOR in the sorted constraint vector VEC */
785
786 static constraint_t
787 constraint_vec_find (VEC(constraint_t,heap) *vec,
788                      struct constraint lookfor)
789 {
790   unsigned int place;
791   constraint_t found;
792
793   if (vec == NULL)
794     return NULL;
795
796   place = VEC_lower_bound (constraint_t, vec, &lookfor, constraint_less);
797   if (place >= VEC_length (constraint_t, vec))
798     return NULL;
799   found = VEC_index (constraint_t, vec, place);
800   if (!constraint_equal (*found, lookfor))
801     return NULL;
802   return found;
803 }
804
805 /* Union two constraint vectors, TO and FROM.  Put the result in TO.  */
806
807 static void
808 constraint_set_union (VEC(constraint_t,heap) **to,
809                       VEC(constraint_t,heap) **from)
810 {
811   int i;
812   constraint_t c;
813
814   for (i = 0; VEC_iterate (constraint_t, *from, i, c); i++)
815     {
816       if (constraint_vec_find (*to, *c) == NULL)
817         {
818           unsigned int place = VEC_lower_bound (constraint_t, *to, c,
819                                                 constraint_less);
820           VEC_safe_insert (constraint_t, heap, *to, place, c);
821         }
822     }
823 }
824
825 /* Expands the solution in SET to all sub-fields of variables included.
826    Union the expanded result into RESULT.  */
827
828 static void
829 solution_set_expand (bitmap result, bitmap set)
830 {
831   bitmap_iterator bi;
832   bitmap vars = NULL;
833   unsigned j;
834
835   /* In a first pass record all variables we need to add all
836      sub-fields off.  This avoids quadratic behavior.  */
837   EXECUTE_IF_SET_IN_BITMAP (set, 0, j, bi)
838     {
839       varinfo_t v = get_varinfo (j);
840       if (v->is_artificial_var
841           || v->is_full_var)
842         continue;
843       v = lookup_vi_for_tree (v->decl);
844       if (vars == NULL)
845         vars = BITMAP_ALLOC (NULL);
846       bitmap_set_bit (vars, v->id);
847     }
848
849   /* In the second pass now do the addition to the solution and
850      to speed up solving add it to the delta as well.  */
851   if (vars != NULL)
852     {
853       EXECUTE_IF_SET_IN_BITMAP (vars, 0, j, bi)
854         {
855           varinfo_t v = get_varinfo (j);
856           for (; v != NULL; v = v->next)
857             bitmap_set_bit (result, v->id);
858         }
859       BITMAP_FREE (vars);
860     }
861 }
862
863 /* Take a solution set SET, add OFFSET to each member of the set, and
864    overwrite SET with the result when done.  */
865
866 static void
867 solution_set_add (bitmap set, HOST_WIDE_INT offset)
868 {
869   bitmap result = BITMAP_ALLOC (&iteration_obstack);
870   unsigned int i;
871   bitmap_iterator bi;
872
873   /* If the offset is unknown we have to expand the solution to
874      all subfields.  */
875   if (offset == UNKNOWN_OFFSET)
876     {
877       solution_set_expand (set, set);
878       return;
879     }
880
881   EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
882     {
883       varinfo_t vi = get_varinfo (i);
884
885       /* If this is a variable with just one field just set its bit
886          in the result.  */
887       if (vi->is_artificial_var
888           || vi->is_unknown_size_var
889           || vi->is_full_var)
890         bitmap_set_bit (result, i);
891       else
892         {
893           unsigned HOST_WIDE_INT fieldoffset = vi->offset + offset;
894
895           /* If the offset makes the pointer point to before the
896              variable use offset zero for the field lookup.  */
897           if (offset < 0
898               && fieldoffset > vi->offset)
899             fieldoffset = 0;
900
901           if (offset != 0)
902             vi = first_or_preceding_vi_for_offset (vi, fieldoffset);
903
904           bitmap_set_bit (result, vi->id);
905           /* If the result is not exactly at fieldoffset include the next
906              field as well.  See get_constraint_for_ptr_offset for more
907              rationale.  */
908           if (vi->offset != fieldoffset
909               && vi->next != NULL)
910             bitmap_set_bit (result, vi->next->id);
911         }
912     }
913
914   bitmap_copy (set, result);
915   BITMAP_FREE (result);
916 }
917
918 /* Union solution sets TO and FROM, and add INC to each member of FROM in the
919    process.  */
920
921 static bool
922 set_union_with_increment  (bitmap to, bitmap from, HOST_WIDE_INT inc)
923 {
924   if (inc == 0)
925     return bitmap_ior_into (to, from);
926   else
927     {
928       bitmap tmp;
929       bool res;
930
931       tmp = BITMAP_ALLOC (&iteration_obstack);
932       bitmap_copy (tmp, from);
933       solution_set_add (tmp, inc);
934       res = bitmap_ior_into (to, tmp);
935       BITMAP_FREE (tmp);
936       return res;
937     }
938 }
939
940 /* Insert constraint C into the list of complex constraints for graph
941    node VAR.  */
942
943 static void
944 insert_into_complex (constraint_graph_t graph,
945                      unsigned int var, constraint_t c)
946 {
947   VEC (constraint_t, heap) *complex = graph->complex[var];
948   unsigned int place = VEC_lower_bound (constraint_t, complex, c,
949                                         constraint_less);
950
951   /* Only insert constraints that do not already exist.  */
952   if (place >= VEC_length (constraint_t, complex)
953       || !constraint_equal (*c, *VEC_index (constraint_t, complex, place)))
954     VEC_safe_insert (constraint_t, heap, graph->complex[var], place, c);
955 }
956
957
958 /* Condense two variable nodes into a single variable node, by moving
959    all associated info from SRC to TO.  */
960
961 static void
962 merge_node_constraints (constraint_graph_t graph, unsigned int to,
963                         unsigned int from)
964 {
965   unsigned int i;
966   constraint_t c;
967
968   gcc_assert (find (from) == to);
969
970   /* Move all complex constraints from src node into to node  */
971   for (i = 0; VEC_iterate (constraint_t, graph->complex[from], i, c); i++)
972     {
973       /* In complex constraints for node src, we may have either
974          a = *src, and *src = a, or an offseted constraint which are
975          always added to the rhs node's constraints.  */
976
977       if (c->rhs.type == DEREF)
978         c->rhs.var = to;
979       else if (c->lhs.type == DEREF)
980         c->lhs.var = to;
981       else
982         c->rhs.var = to;
983     }
984   constraint_set_union (&graph->complex[to], &graph->complex[from]);
985   VEC_free (constraint_t, heap, graph->complex[from]);
986   graph->complex[from] = NULL;
987 }
988
989
990 /* Remove edges involving NODE from GRAPH.  */
991
992 static void
993 clear_edges_for_node (constraint_graph_t graph, unsigned int node)
994 {
995   if (graph->succs[node])
996     BITMAP_FREE (graph->succs[node]);
997 }
998
999 /* Merge GRAPH nodes FROM and TO into node TO.  */
1000
1001 static void
1002 merge_graph_nodes (constraint_graph_t graph, unsigned int to,
1003                    unsigned int from)
1004 {
1005   if (graph->indirect_cycles[from] != -1)
1006     {
1007       /* If we have indirect cycles with the from node, and we have
1008          none on the to node, the to node has indirect cycles from the
1009          from node now that they are unified.
1010          If indirect cycles exist on both, unify the nodes that they
1011          are in a cycle with, since we know they are in a cycle with
1012          each other.  */
1013       if (graph->indirect_cycles[to] == -1)
1014         graph->indirect_cycles[to] = graph->indirect_cycles[from];
1015     }
1016
1017   /* Merge all the successor edges.  */
1018   if (graph->succs[from])
1019     {
1020       if (!graph->succs[to])
1021         graph->succs[to] = BITMAP_ALLOC (&pta_obstack);
1022       bitmap_ior_into (graph->succs[to],
1023                        graph->succs[from]);
1024     }
1025
1026   clear_edges_for_node (graph, from);
1027 }
1028
1029
1030 /* Add an indirect graph edge to GRAPH, going from TO to FROM if
1031    it doesn't exist in the graph already.  */
1032
1033 static void
1034 add_implicit_graph_edge (constraint_graph_t graph, unsigned int to,
1035                          unsigned int from)
1036 {
1037   if (to == from)
1038     return;
1039
1040   if (!graph->implicit_preds[to])
1041     graph->implicit_preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
1042
1043   if (bitmap_set_bit (graph->implicit_preds[to], from))
1044     stats.num_implicit_edges++;
1045 }
1046
1047 /* Add a predecessor graph edge to GRAPH, going from TO to FROM if
1048    it doesn't exist in the graph already.
1049    Return false if the edge already existed, true otherwise.  */
1050
1051 static void
1052 add_pred_graph_edge (constraint_graph_t graph, unsigned int to,
1053                      unsigned int from)
1054 {
1055   if (!graph->preds[to])
1056     graph->preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
1057   bitmap_set_bit (graph->preds[to], from);
1058 }
1059
1060 /* Add a graph edge to GRAPH, going from FROM to TO if
1061    it doesn't exist in the graph already.
1062    Return false if the edge already existed, true otherwise.  */
1063
1064 static bool
1065 add_graph_edge (constraint_graph_t graph, unsigned int to,
1066                 unsigned int from)
1067 {
1068   if (to == from)
1069     {
1070       return false;
1071     }
1072   else
1073     {
1074       bool r = false;
1075
1076       if (!graph->succs[from])
1077         graph->succs[from] = BITMAP_ALLOC (&pta_obstack);
1078       if (bitmap_set_bit (graph->succs[from], to))
1079         {
1080           r = true;
1081           if (to < FIRST_REF_NODE && from < FIRST_REF_NODE)
1082             stats.num_edges++;
1083         }
1084       return r;
1085     }
1086 }
1087
1088
1089 /* Return true if {DEST.SRC} is an existing graph edge in GRAPH.  */
1090
1091 static bool
1092 valid_graph_edge (constraint_graph_t graph, unsigned int src,
1093                   unsigned int dest)
1094 {
1095   return (graph->succs[dest]
1096           && bitmap_bit_p (graph->succs[dest], src));
1097 }
1098
1099 /* Initialize the constraint graph structure to contain SIZE nodes.  */
1100
1101 static void
1102 init_graph (unsigned int size)
1103 {
1104   unsigned int j;
1105
1106   graph = XCNEW (struct constraint_graph);
1107   graph->size = size;
1108   graph->succs = XCNEWVEC (bitmap, graph->size);
1109   graph->indirect_cycles = XNEWVEC (int, graph->size);
1110   graph->rep = XNEWVEC (unsigned int, graph->size);
1111   graph->complex = XCNEWVEC (VEC(constraint_t, heap) *, size);
1112   graph->pe = XCNEWVEC (unsigned int, graph->size);
1113   graph->pe_rep = XNEWVEC (int, graph->size);
1114
1115   for (j = 0; j < graph->size; j++)
1116     {
1117       graph->rep[j] = j;
1118       graph->pe_rep[j] = -1;
1119       graph->indirect_cycles[j] = -1;
1120     }
1121 }
1122
1123 /* Build the constraint graph, adding only predecessor edges right now.  */
1124
1125 static void
1126 build_pred_graph (void)
1127 {
1128   int i;
1129   constraint_t c;
1130   unsigned int j;
1131
1132   graph->implicit_preds = XCNEWVEC (bitmap, graph->size);
1133   graph->preds = XCNEWVEC (bitmap, graph->size);
1134   graph->pointer_label = XCNEWVEC (unsigned int, graph->size);
1135   graph->loc_label = XCNEWVEC (unsigned int, graph->size);
1136   graph->pointed_by = XCNEWVEC (bitmap, graph->size);
1137   graph->points_to = XCNEWVEC (bitmap, graph->size);
1138   graph->eq_rep = XNEWVEC (int, graph->size);
1139   graph->direct_nodes = sbitmap_alloc (graph->size);
1140   graph->address_taken = BITMAP_ALLOC (&predbitmap_obstack);
1141   sbitmap_zero (graph->direct_nodes);
1142
1143   for (j = 0; j < FIRST_REF_NODE; j++)
1144     {
1145       if (!get_varinfo (j)->is_special_var)
1146         SET_BIT (graph->direct_nodes, j);
1147     }
1148
1149   for (j = 0; j < graph->size; j++)
1150     graph->eq_rep[j] = -1;
1151
1152   for (j = 0; j < VEC_length (varinfo_t, varmap); j++)
1153     graph->indirect_cycles[j] = -1;
1154
1155   for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
1156     {
1157       struct constraint_expr lhs = c->lhs;
1158       struct constraint_expr rhs = c->rhs;
1159       unsigned int lhsvar = lhs.var;
1160       unsigned int rhsvar = rhs.var;
1161
1162       if (lhs.type == DEREF)
1163         {
1164           /* *x = y.  */
1165           if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR)
1166             add_pred_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
1167         }
1168       else if (rhs.type == DEREF)
1169         {
1170           /* x = *y */
1171           if (rhs.offset == 0 && lhs.offset == 0 && lhs.type == SCALAR)
1172             add_pred_graph_edge (graph, lhsvar, FIRST_REF_NODE + rhsvar);
1173           else
1174             RESET_BIT (graph->direct_nodes, lhsvar);
1175         }
1176       else if (rhs.type == ADDRESSOF)
1177         {
1178           varinfo_t v;
1179
1180           /* x = &y */
1181           if (graph->points_to[lhsvar] == NULL)
1182             graph->points_to[lhsvar] = BITMAP_ALLOC (&predbitmap_obstack);
1183           bitmap_set_bit (graph->points_to[lhsvar], rhsvar);
1184
1185           if (graph->pointed_by[rhsvar] == NULL)
1186             graph->pointed_by[rhsvar] = BITMAP_ALLOC (&predbitmap_obstack);
1187           bitmap_set_bit (graph->pointed_by[rhsvar], lhsvar);
1188
1189           /* Implicitly, *x = y */
1190           add_implicit_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
1191
1192           /* All related variables are no longer direct nodes.  */
1193           RESET_BIT (graph->direct_nodes, rhsvar);
1194           v = get_varinfo (rhsvar);
1195           if (!v->is_full_var)
1196             {
1197               v = lookup_vi_for_tree (v->decl);
1198               do
1199                 {
1200                   RESET_BIT (graph->direct_nodes, v->id);
1201                   v = v->next;
1202                 }
1203               while (v != NULL);
1204             }
1205           bitmap_set_bit (graph->address_taken, rhsvar);
1206         }
1207       else if (lhsvar > anything_id
1208                && lhsvar != rhsvar && lhs.offset == 0 && rhs.offset == 0)
1209         {
1210           /* x = y */
1211           add_pred_graph_edge (graph, lhsvar, rhsvar);
1212           /* Implicitly, *x = *y */
1213           add_implicit_graph_edge (graph, FIRST_REF_NODE + lhsvar,
1214                                    FIRST_REF_NODE + rhsvar);
1215         }
1216       else if (lhs.offset != 0 || rhs.offset != 0)
1217         {
1218           if (rhs.offset != 0)
1219             RESET_BIT (graph->direct_nodes, lhs.var);
1220           else if (lhs.offset != 0)
1221             RESET_BIT (graph->direct_nodes, rhs.var);
1222         }
1223     }
1224 }
1225
1226 /* Build the constraint graph, adding successor edges.  */
1227
1228 static void
1229 build_succ_graph (void)
1230 {
1231   unsigned i, t;
1232   constraint_t c;
1233
1234   for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
1235     {
1236       struct constraint_expr lhs;
1237       struct constraint_expr rhs;
1238       unsigned int lhsvar;
1239       unsigned int rhsvar;
1240
1241       if (!c)
1242         continue;
1243
1244       lhs = c->lhs;
1245       rhs = c->rhs;
1246       lhsvar = find (lhs.var);
1247       rhsvar = find (rhs.var);
1248
1249       if (lhs.type == DEREF)
1250         {
1251           if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR)
1252             add_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
1253         }
1254       else if (rhs.type == DEREF)
1255         {
1256           if (rhs.offset == 0 && lhs.offset == 0 && lhs.type == SCALAR)
1257             add_graph_edge (graph, lhsvar, FIRST_REF_NODE + rhsvar);
1258         }
1259       else if (rhs.type == ADDRESSOF)
1260         {
1261           /* x = &y */
1262           gcc_assert (find (rhs.var) == rhs.var);
1263           bitmap_set_bit (get_varinfo (lhsvar)->solution, rhsvar);
1264         }
1265       else if (lhsvar > anything_id
1266                && lhsvar != rhsvar && lhs.offset == 0 && rhs.offset == 0)
1267         {
1268           add_graph_edge (graph, lhsvar, rhsvar);
1269         }
1270     }
1271
1272   /* Add edges from STOREDANYTHING to all non-direct nodes that can
1273      receive pointers.  */
1274   t = find (storedanything_id);
1275   for (i = integer_id + 1; i < FIRST_REF_NODE; ++i)
1276     {
1277       if (!TEST_BIT (graph->direct_nodes, i)
1278           && get_varinfo (i)->may_have_pointers)
1279         add_graph_edge (graph, find (i), t);
1280     }
1281
1282   /* Everything stored to ANYTHING also potentially escapes.  */
1283   add_graph_edge (graph, find (escaped_id), t);
1284 }
1285
1286
1287 /* Changed variables on the last iteration.  */
1288 static unsigned int changed_count;
1289 static sbitmap changed;
1290
1291 /* Strongly Connected Component visitation info.  */
1292
1293 struct scc_info
1294 {
1295   sbitmap visited;
1296   sbitmap deleted;
1297   unsigned int *dfs;
1298   unsigned int *node_mapping;
1299   int current_index;
1300   VEC(unsigned,heap) *scc_stack;
1301 };
1302
1303
1304 /* Recursive routine to find strongly connected components in GRAPH.
1305    SI is the SCC info to store the information in, and N is the id of current
1306    graph node we are processing.
1307
1308    This is Tarjan's strongly connected component finding algorithm, as
1309    modified by Nuutila to keep only non-root nodes on the stack.
1310    The algorithm can be found in "On finding the strongly connected
1311    connected components in a directed graph" by Esko Nuutila and Eljas
1312    Soisalon-Soininen, in Information Processing Letters volume 49,
1313    number 1, pages 9-14.  */
1314
1315 static void
1316 scc_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
1317 {
1318   unsigned int i;
1319   bitmap_iterator bi;
1320   unsigned int my_dfs;
1321
1322   SET_BIT (si->visited, n);
1323   si->dfs[n] = si->current_index ++;
1324   my_dfs = si->dfs[n];
1325
1326   /* Visit all the successors.  */
1327   EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[n], 0, i, bi)
1328     {
1329       unsigned int w;
1330
1331       if (i > LAST_REF_NODE)
1332         break;
1333
1334       w = find (i);
1335       if (TEST_BIT (si->deleted, w))
1336         continue;
1337
1338       if (!TEST_BIT (si->visited, w))
1339         scc_visit (graph, si, w);
1340       {
1341         unsigned int t = find (w);
1342         unsigned int nnode = find (n);
1343         gcc_assert (nnode == n);
1344
1345         if (si->dfs[t] < si->dfs[nnode])
1346           si->dfs[n] = si->dfs[t];
1347       }
1348     }
1349
1350   /* See if any components have been identified.  */
1351   if (si->dfs[n] == my_dfs)
1352     {
1353       if (VEC_length (unsigned, si->scc_stack) > 0
1354           && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs)
1355         {
1356           bitmap scc = BITMAP_ALLOC (NULL);
1357           bool have_ref_node = n >= FIRST_REF_NODE;
1358           unsigned int lowest_node;
1359           bitmap_iterator bi;
1360
1361           bitmap_set_bit (scc, n);
1362
1363           while (VEC_length (unsigned, si->scc_stack) != 0
1364                  && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs)
1365             {
1366               unsigned int w = VEC_pop (unsigned, si->scc_stack);
1367
1368               bitmap_set_bit (scc, w);
1369               if (w >= FIRST_REF_NODE)
1370                 have_ref_node = true;
1371             }
1372
1373           lowest_node = bitmap_first_set_bit (scc);
1374           gcc_assert (lowest_node < FIRST_REF_NODE);
1375
1376           /* Collapse the SCC nodes into a single node, and mark the
1377              indirect cycles.  */
1378           EXECUTE_IF_SET_IN_BITMAP (scc, 0, i, bi)
1379             {
1380               if (i < FIRST_REF_NODE)
1381                 {
1382                   if (unite (lowest_node, i))
1383                     unify_nodes (graph, lowest_node, i, false);
1384                 }
1385               else
1386                 {
1387                   unite (lowest_node, i);
1388                   graph->indirect_cycles[i - FIRST_REF_NODE] = lowest_node;
1389                 }
1390             }
1391         }
1392       SET_BIT (si->deleted, n);
1393     }
1394   else
1395     VEC_safe_push (unsigned, heap, si->scc_stack, n);
1396 }
1397
1398 /* Unify node FROM into node TO, updating the changed count if
1399    necessary when UPDATE_CHANGED is true.  */
1400
1401 static void
1402 unify_nodes (constraint_graph_t graph, unsigned int to, unsigned int from,
1403              bool update_changed)
1404 {
1405
1406   gcc_assert (to != from && find (to) == to);
1407   if (dump_file && (dump_flags & TDF_DETAILS))
1408     fprintf (dump_file, "Unifying %s to %s\n",
1409              get_varinfo (from)->name,
1410              get_varinfo (to)->name);
1411
1412   if (update_changed)
1413     stats.unified_vars_dynamic++;
1414   else
1415     stats.unified_vars_static++;
1416
1417   merge_graph_nodes (graph, to, from);
1418   merge_node_constraints (graph, to, from);
1419
1420   /* Mark TO as changed if FROM was changed. If TO was already marked
1421      as changed, decrease the changed count.  */
1422
1423   if (update_changed && TEST_BIT (changed, from))
1424     {
1425       RESET_BIT (changed, from);
1426       if (!TEST_BIT (changed, to))
1427         SET_BIT (changed, to);
1428       else
1429         {
1430           gcc_assert (changed_count > 0);
1431           changed_count--;
1432         }
1433     }
1434   if (get_varinfo (from)->solution)
1435     {
1436       /* If the solution changes because of the merging, we need to mark
1437          the variable as changed.  */
1438       if (bitmap_ior_into (get_varinfo (to)->solution,
1439                            get_varinfo (from)->solution))
1440         {
1441           if (update_changed && !TEST_BIT (changed, to))
1442             {
1443               SET_BIT (changed, to);
1444               changed_count++;
1445             }
1446         }
1447       
1448       BITMAP_FREE (get_varinfo (from)->solution);
1449       BITMAP_FREE (get_varinfo (from)->oldsolution);
1450       
1451       if (stats.iterations > 0)
1452         {
1453           BITMAP_FREE (get_varinfo (to)->oldsolution);
1454           get_varinfo (to)->oldsolution = BITMAP_ALLOC (&oldpta_obstack);
1455         }
1456     }
1457   if (valid_graph_edge (graph, to, to))
1458     {
1459       if (graph->succs[to])
1460         bitmap_clear_bit (graph->succs[to], to);
1461     }
1462 }
1463
1464 /* Information needed to compute the topological ordering of a graph.  */
1465
1466 struct topo_info
1467 {
1468   /* sbitmap of visited nodes.  */
1469   sbitmap visited;
1470   /* Array that stores the topological order of the graph, *in
1471      reverse*.  */
1472   VEC(unsigned,heap) *topo_order;
1473 };
1474
1475
1476 /* Initialize and return a topological info structure.  */
1477
1478 static struct topo_info *
1479 init_topo_info (void)
1480 {
1481   size_t size = graph->size;
1482   struct topo_info *ti = XNEW (struct topo_info);
1483   ti->visited = sbitmap_alloc (size);
1484   sbitmap_zero (ti->visited);
1485   ti->topo_order = VEC_alloc (unsigned, heap, 1);
1486   return ti;
1487 }
1488
1489
1490 /* Free the topological sort info pointed to by TI.  */
1491
1492 static void
1493 free_topo_info (struct topo_info *ti)
1494 {
1495   sbitmap_free (ti->visited);
1496   VEC_free (unsigned, heap, ti->topo_order);
1497   free (ti);
1498 }
1499
1500 /* Visit the graph in topological order, and store the order in the
1501    topo_info structure.  */
1502
1503 static void
1504 topo_visit (constraint_graph_t graph, struct topo_info *ti,
1505             unsigned int n)
1506 {
1507   bitmap_iterator bi;
1508   unsigned int j;
1509
1510   SET_BIT (ti->visited, n);
1511
1512   if (graph->succs[n])
1513     EXECUTE_IF_SET_IN_BITMAP (graph->succs[n], 0, j, bi)
1514       {
1515         if (!TEST_BIT (ti->visited, j))
1516           topo_visit (graph, ti, j);
1517       }
1518
1519   VEC_safe_push (unsigned, heap, ti->topo_order, n);
1520 }
1521
1522 /* Process a constraint C that represents x = *(y + off), using DELTA as the
1523    starting solution for y.  */
1524
1525 static void
1526 do_sd_constraint (constraint_graph_t graph, constraint_t c,
1527                   bitmap delta)
1528 {
1529   unsigned int lhs = c->lhs.var;
1530   bool flag = false;
1531   bitmap sol = get_varinfo (lhs)->solution;
1532   unsigned int j;
1533   bitmap_iterator bi;
1534   HOST_WIDE_INT roffset = c->rhs.offset;
1535
1536   /* Our IL does not allow this.  */
1537   gcc_assert (c->lhs.offset == 0);
1538
1539   /* If the solution of Y contains anything it is good enough to transfer
1540      this to the LHS.  */
1541   if (bitmap_bit_p (delta, anything_id))
1542     {
1543       flag |= bitmap_set_bit (sol, anything_id);
1544       goto done;
1545     }
1546
1547   /* If we do not know at with offset the rhs is dereferenced compute
1548      the reachability set of DELTA, conservatively assuming it is
1549      dereferenced at all valid offsets.  */
1550   if (roffset == UNKNOWN_OFFSET)
1551     {
1552       solution_set_expand (delta, delta);
1553       /* No further offset processing is necessary.  */
1554       roffset = 0;
1555     }
1556
1557   /* For each variable j in delta (Sol(y)), add
1558      an edge in the graph from j to x, and union Sol(j) into Sol(x).  */
1559   EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
1560     {
1561       varinfo_t v = get_varinfo (j);
1562       HOST_WIDE_INT fieldoffset = v->offset + roffset;
1563       unsigned int t;
1564
1565       if (v->is_full_var)
1566         fieldoffset = v->offset;
1567       else if (roffset != 0)
1568         v = first_vi_for_offset (v, fieldoffset);
1569       /* If the access is outside of the variable we can ignore it.  */
1570       if (!v)
1571         continue;
1572
1573       do
1574         {
1575           t = find (v->id);
1576
1577           /* Adding edges from the special vars is pointless.
1578              They don't have sets that can change.  */
1579           if (get_varinfo (t)->is_special_var)
1580             flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
1581           /* Merging the solution from ESCAPED needlessly increases
1582              the set.  Use ESCAPED as representative instead.  */
1583           else if (v->id == escaped_id)
1584             flag |= bitmap_set_bit (sol, escaped_id);
1585           else if (add_graph_edge (graph, lhs, t))
1586             flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
1587
1588           /* If the variable is not exactly at the requested offset
1589              we have to include the next one.  */
1590           if (v->offset == (unsigned HOST_WIDE_INT)fieldoffset
1591               || v->next == NULL)
1592             break;
1593
1594           v = v->next;
1595           fieldoffset = v->offset;
1596         }
1597       while (1);
1598     }
1599
1600 done:
1601   /* If the LHS solution changed, mark the var as changed.  */
1602   if (flag)
1603     {
1604       get_varinfo (lhs)->solution = sol;
1605       if (!TEST_BIT (changed, lhs))
1606         {
1607           SET_BIT (changed, lhs);
1608           changed_count++;
1609         }
1610     }
1611 }
1612
1613 /* Process a constraint C that represents *(x + off) = y using DELTA
1614    as the starting solution for x.  */
1615
1616 static void
1617 do_ds_constraint (constraint_t c, bitmap delta)
1618 {
1619   unsigned int rhs = c->rhs.var;
1620   bitmap sol = get_varinfo (rhs)->solution;
1621   unsigned int j;
1622   bitmap_iterator bi;
1623   HOST_WIDE_INT loff = c->lhs.offset;
1624
1625   /* Our IL does not allow this.  */
1626   gcc_assert (c->rhs.offset == 0);
1627
1628   /* If the solution of y contains ANYTHING simply use the ANYTHING
1629      solution.  This avoids needlessly increasing the points-to sets.  */
1630   if (bitmap_bit_p (sol, anything_id))
1631     sol = get_varinfo (find (anything_id))->solution;
1632
1633   /* If the solution for x contains ANYTHING we have to merge the
1634      solution of y into all pointer variables which we do via
1635      STOREDANYTHING.  */
1636   if (bitmap_bit_p (delta, anything_id))
1637     {
1638       unsigned t = find (storedanything_id);
1639       if (add_graph_edge (graph, t, rhs))
1640         {
1641           if (bitmap_ior_into (get_varinfo (t)->solution, sol))
1642             {
1643               if (!TEST_BIT (changed, t))
1644                 {
1645                   SET_BIT (changed, t);
1646                   changed_count++;
1647                 }
1648             }
1649         }
1650       return;
1651     }
1652
1653   /* If we do not know at with offset the rhs is dereferenced compute
1654      the reachability set of DELTA, conservatively assuming it is
1655      dereferenced at all valid offsets.  */
1656   if (loff == UNKNOWN_OFFSET)
1657     {
1658       solution_set_expand (delta, delta);
1659       loff = 0;
1660     }
1661
1662   /* For each member j of delta (Sol(x)), add an edge from y to j and
1663      union Sol(y) into Sol(j) */
1664   EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
1665     {
1666       varinfo_t v = get_varinfo (j);
1667       unsigned int t;
1668       HOST_WIDE_INT fieldoffset = v->offset + loff;
1669
1670       /* If v is a global variable then this is an escape point.  */
1671       if (v->is_global_var)
1672         {
1673           t = find (escaped_id);
1674           if (add_graph_edge (graph, t, rhs)
1675               && bitmap_ior_into (get_varinfo (t)->solution, sol)
1676               && !TEST_BIT (changed, t))
1677             {
1678               SET_BIT (changed, t);
1679               changed_count++;
1680             }
1681         }
1682
1683       if (v->is_special_var)
1684         continue;
1685
1686       if (v->is_full_var)
1687         fieldoffset = v->offset;
1688       else if (loff != 0)
1689         v = first_vi_for_offset (v, fieldoffset);
1690       /* If the access is outside of the variable we can ignore it.  */
1691       if (!v)
1692         continue;
1693
1694       do
1695         {
1696           if (v->may_have_pointers)
1697             {
1698               t = find (v->id);
1699               if (add_graph_edge (graph, t, rhs)
1700                   && bitmap_ior_into (get_varinfo (t)->solution, sol)
1701                   && !TEST_BIT (changed, t))
1702                 {
1703                   SET_BIT (changed, t);
1704                   changed_count++;
1705                 }
1706             }
1707
1708           /* If the variable is not exactly at the requested offset
1709              we have to include the next one.  */
1710           if (v->offset == (unsigned HOST_WIDE_INT)fieldoffset
1711               || v->next == NULL)
1712             break;
1713
1714           v = v->next;
1715           fieldoffset = v->offset;
1716         }
1717       while (1);
1718     }
1719 }
1720
1721 /* Handle a non-simple (simple meaning requires no iteration),
1722    constraint (IE *x = &y, x = *y, *x = y, and x = y with offsets involved).  */
1723
1724 static void
1725 do_complex_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
1726 {
1727   if (c->lhs.type == DEREF)
1728     {
1729       if (c->rhs.type == ADDRESSOF)
1730         {
1731           gcc_unreachable();
1732         }
1733       else
1734         {
1735           /* *x = y */
1736           do_ds_constraint (c, delta);
1737         }
1738     }
1739   else if (c->rhs.type == DEREF)
1740     {
1741       /* x = *y */
1742       if (!(get_varinfo (c->lhs.var)->is_special_var))
1743         do_sd_constraint (graph, c, delta);
1744     }
1745   else
1746     {
1747       bitmap tmp;
1748       bitmap solution;
1749       bool flag = false;
1750
1751       gcc_assert (c->rhs.type == SCALAR && c->lhs.type == SCALAR);
1752       solution = get_varinfo (c->rhs.var)->solution;
1753       tmp = get_varinfo (c->lhs.var)->solution;
1754
1755       flag = set_union_with_increment (tmp, solution, c->rhs.offset);
1756
1757       if (flag)
1758         {
1759           get_varinfo (c->lhs.var)->solution = tmp;
1760           if (!TEST_BIT (changed, c->lhs.var))
1761             {
1762               SET_BIT (changed, c->lhs.var);
1763               changed_count++;
1764             }
1765         }
1766     }
1767 }
1768
1769 /* Initialize and return a new SCC info structure.  */
1770
1771 static struct scc_info *
1772 init_scc_info (size_t size)
1773 {
1774   struct scc_info *si = XNEW (struct scc_info);
1775   size_t i;
1776
1777   si->current_index = 0;
1778   si->visited = sbitmap_alloc (size);
1779   sbitmap_zero (si->visited);
1780   si->deleted = sbitmap_alloc (size);
1781   sbitmap_zero (si->deleted);
1782   si->node_mapping = XNEWVEC (unsigned int, size);
1783   si->dfs = XCNEWVEC (unsigned int, size);
1784
1785   for (i = 0; i < size; i++)
1786     si->node_mapping[i] = i;
1787
1788   si->scc_stack = VEC_alloc (unsigned, heap, 1);
1789   return si;
1790 }
1791
1792 /* Free an SCC info structure pointed to by SI */
1793
1794 static void
1795 free_scc_info (struct scc_info *si)
1796 {
1797   sbitmap_free (si->visited);
1798   sbitmap_free (si->deleted);
1799   free (si->node_mapping);
1800   free (si->dfs);
1801   VEC_free (unsigned, heap, si->scc_stack);
1802   free (si);
1803 }
1804
1805
1806 /* Find indirect cycles in GRAPH that occur, using strongly connected
1807    components, and note them in the indirect cycles map.
1808
1809    This technique comes from Ben Hardekopf and Calvin Lin,
1810    "It Pays to be Lazy: Fast and Accurate Pointer Analysis for Millions of
1811    Lines of Code", submitted to PLDI 2007.  */
1812
1813 static void
1814 find_indirect_cycles (constraint_graph_t graph)
1815 {
1816   unsigned int i;
1817   unsigned int size = graph->size;
1818   struct scc_info *si = init_scc_info (size);
1819
1820   for (i = 0; i < MIN (LAST_REF_NODE, size); i ++ )
1821     if (!TEST_BIT (si->visited, i) && find (i) == i)
1822       scc_visit (graph, si, i);
1823
1824   free_scc_info (si);
1825 }
1826
1827 /* Compute a topological ordering for GRAPH, and store the result in the
1828    topo_info structure TI.  */
1829
1830 static void
1831 compute_topo_order (constraint_graph_t graph,
1832                     struct topo_info *ti)
1833 {
1834   unsigned int i;
1835   unsigned int size = graph->size;
1836
1837   for (i = 0; i != size; ++i)
1838     if (!TEST_BIT (ti->visited, i) && find (i) == i)
1839       topo_visit (graph, ti, i);
1840 }
1841
1842 /* Structure used to for hash value numbering of pointer equivalence
1843    classes.  */
1844
1845 typedef struct equiv_class_label
1846 {
1847   hashval_t hashcode;
1848   unsigned int equivalence_class;
1849   bitmap labels;
1850 } *equiv_class_label_t;
1851 typedef const struct equiv_class_label *const_equiv_class_label_t;
1852
1853 /* A hashtable for mapping a bitmap of labels->pointer equivalence
1854    classes.  */
1855 static htab_t pointer_equiv_class_table;
1856
1857 /* A hashtable for mapping a bitmap of labels->location equivalence
1858    classes.  */
1859 static htab_t location_equiv_class_table;
1860
1861 /* Hash function for a equiv_class_label_t */
1862
1863 static hashval_t
1864 equiv_class_label_hash (const void *p)
1865 {
1866   const_equiv_class_label_t const ecl = (const_equiv_class_label_t) p;
1867   return ecl->hashcode;
1868 }
1869
1870 /* Equality function for two equiv_class_label_t's.  */
1871
1872 static int
1873 equiv_class_label_eq (const void *p1, const void *p2)
1874 {
1875   const_equiv_class_label_t const eql1 = (const_equiv_class_label_t) p1;
1876   const_equiv_class_label_t const eql2 = (const_equiv_class_label_t) p2;
1877   return (eql1->hashcode == eql2->hashcode
1878           && bitmap_equal_p (eql1->labels, eql2->labels));
1879 }
1880
1881 /* Lookup a equivalence class in TABLE by the bitmap of LABELS it
1882    contains.  */
1883
1884 static unsigned int
1885 equiv_class_lookup (htab_t table, bitmap labels)
1886 {
1887   void **slot;
1888   struct equiv_class_label ecl;
1889
1890   ecl.labels = labels;
1891   ecl.hashcode = bitmap_hash (labels);
1892
1893   slot = htab_find_slot_with_hash (table, &ecl,
1894                                    ecl.hashcode, NO_INSERT);
1895   if (!slot)
1896     return 0;
1897   else
1898     return ((equiv_class_label_t) *slot)->equivalence_class;
1899 }
1900
1901
1902 /* Add an equivalence class named EQUIVALENCE_CLASS with labels LABELS
1903    to TABLE.  */
1904
1905 static void
1906 equiv_class_add (htab_t table, unsigned int equivalence_class,
1907                  bitmap labels)
1908 {
1909   void **slot;
1910   equiv_class_label_t ecl = XNEW (struct equiv_class_label);
1911
1912   ecl->labels = labels;
1913   ecl->equivalence_class = equivalence_class;
1914   ecl->hashcode = bitmap_hash (labels);
1915
1916   slot = htab_find_slot_with_hash (table, ecl,
1917                                    ecl->hashcode, INSERT);
1918   gcc_assert (!*slot);
1919   *slot = (void *) ecl;
1920 }
1921
1922 /* Perform offline variable substitution.
1923
1924    This is a worst case quadratic time way of identifying variables
1925    that must have equivalent points-to sets, including those caused by
1926    static cycles, and single entry subgraphs, in the constraint graph.
1927
1928    The technique is described in "Exploiting Pointer and Location
1929    Equivalence to Optimize Pointer Analysis. In the 14th International
1930    Static Analysis Symposium (SAS), August 2007."  It is known as the
1931    "HU" algorithm, and is equivalent to value numbering the collapsed
1932    constraint graph including evaluating unions.
1933
1934    The general method of finding equivalence classes is as follows:
1935    Add fake nodes (REF nodes) and edges for *a = b and a = *b constraints.
1936    Initialize all non-REF nodes to be direct nodes.
1937    For each constraint a = a U {b}, we set pts(a) = pts(a) u {fresh
1938    variable}
1939    For each constraint containing the dereference, we also do the same
1940    thing.
1941
1942    We then compute SCC's in the graph and unify nodes in the same SCC,
1943    including pts sets.
1944
1945    For each non-collapsed node x:
1946     Visit all unvisited explicit incoming edges.
1947     Ignoring all non-pointers, set pts(x) = Union of pts(a) for y
1948     where y->x.
1949     Lookup the equivalence class for pts(x).
1950      If we found one, equivalence_class(x) = found class.
1951      Otherwise, equivalence_class(x) = new class, and new_class is
1952     added to the lookup table.
1953
1954    All direct nodes with the same equivalence class can be replaced
1955    with a single representative node.
1956    All unlabeled nodes (label == 0) are not pointers and all edges
1957    involving them can be eliminated.
1958    We perform these optimizations during rewrite_constraints
1959
1960    In addition to pointer equivalence class finding, we also perform
1961    location equivalence class finding.  This is the set of variables
1962    that always appear together in points-to sets.  We use this to
1963    compress the size of the points-to sets.  */
1964
1965 /* Current maximum pointer equivalence class id.  */
1966 static int pointer_equiv_class;
1967
1968 /* Current maximum location equivalence class id.  */
1969 static int location_equiv_class;
1970
1971 /* Recursive routine to find strongly connected components in GRAPH,
1972    and label it's nodes with DFS numbers.  */
1973
1974 static void
1975 condense_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
1976 {
1977   unsigned int i;
1978   bitmap_iterator bi;
1979   unsigned int my_dfs;
1980
1981   gcc_assert (si->node_mapping[n] == n);
1982   SET_BIT (si->visited, n);
1983   si->dfs[n] = si->current_index ++;
1984   my_dfs = si->dfs[n];
1985
1986   /* Visit all the successors.  */
1987   EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi)
1988     {
1989       unsigned int w = si->node_mapping[i];
1990
1991       if (TEST_BIT (si->deleted, w))
1992         continue;
1993
1994       if (!TEST_BIT (si->visited, w))
1995         condense_visit (graph, si, w);
1996       {
1997         unsigned int t = si->node_mapping[w];
1998         unsigned int nnode = si->node_mapping[n];
1999         gcc_assert (nnode == n);
2000
2001         if (si->dfs[t] < si->dfs[nnode])
2002           si->dfs[n] = si->dfs[t];
2003       }
2004     }
2005
2006   /* Visit all the implicit predecessors.  */
2007   EXECUTE_IF_IN_NONNULL_BITMAP (graph->implicit_preds[n], 0, i, bi)
2008     {
2009       unsigned int w = si->node_mapping[i];
2010
2011       if (TEST_BIT (si->deleted, w))
2012         continue;
2013
2014       if (!TEST_BIT (si->visited, w))
2015         condense_visit (graph, si, w);
2016       {
2017         unsigned int t = si->node_mapping[w];
2018         unsigned int nnode = si->node_mapping[n];
2019         gcc_assert (nnode == n);
2020
2021         if (si->dfs[t] < si->dfs[nnode])
2022           si->dfs[n] = si->dfs[t];
2023       }
2024     }
2025
2026   /* See if any components have been identified.  */
2027   if (si->dfs[n] == my_dfs)
2028     {
2029       while (VEC_length (unsigned, si->scc_stack) != 0
2030              && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs)
2031         {
2032           unsigned int w = VEC_pop (unsigned, si->scc_stack);
2033           si->node_mapping[w] = n;
2034
2035           if (!TEST_BIT (graph->direct_nodes, w))
2036             RESET_BIT (graph->direct_nodes, n);
2037
2038           /* Unify our nodes.  */
2039           if (graph->preds[w])
2040             {
2041               if (!graph->preds[n])
2042                 graph->preds[n] = BITMAP_ALLOC (&predbitmap_obstack);
2043               bitmap_ior_into (graph->preds[n], graph->preds[w]);
2044             }
2045           if (graph->implicit_preds[w])
2046             {
2047               if (!graph->implicit_preds[n])
2048                 graph->implicit_preds[n] = BITMAP_ALLOC (&predbitmap_obstack);
2049               bitmap_ior_into (graph->implicit_preds[n],
2050                                graph->implicit_preds[w]);
2051             }
2052           if (graph->points_to[w])
2053             {
2054               if (!graph->points_to[n])
2055                 graph->points_to[n] = BITMAP_ALLOC (&predbitmap_obstack);
2056               bitmap_ior_into (graph->points_to[n],
2057                                graph->points_to[w]);
2058             }
2059         }
2060       SET_BIT (si->deleted, n);
2061     }
2062   else
2063     VEC_safe_push (unsigned, heap, si->scc_stack, n);
2064 }
2065
2066 /* Label pointer equivalences.  */
2067
2068 static void
2069 label_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
2070 {
2071   unsigned int i;
2072   bitmap_iterator bi;
2073   SET_BIT (si->visited, n);
2074
2075   if (!graph->points_to[n])
2076     graph->points_to[n] = BITMAP_ALLOC (&predbitmap_obstack);
2077
2078   /* Label and union our incoming edges's points to sets.  */
2079   EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi)
2080     {
2081       unsigned int w = si->node_mapping[i];
2082       if (!TEST_BIT (si->visited, w))
2083         label_visit (graph, si, w);
2084
2085       /* Skip unused edges  */
2086       if (w == n || graph->pointer_label[w] == 0)
2087         continue;
2088
2089       if (graph->points_to[w])
2090         bitmap_ior_into(graph->points_to[n], graph->points_to[w]);
2091     }
2092   /* Indirect nodes get fresh variables.  */
2093   if (!TEST_BIT (graph->direct_nodes, n))
2094     bitmap_set_bit (graph->points_to[n], FIRST_REF_NODE + n);
2095
2096   if (!bitmap_empty_p (graph->points_to[n]))
2097     {
2098       unsigned int label = equiv_class_lookup (pointer_equiv_class_table,
2099                                                graph->points_to[n]);
2100       if (!label)
2101         {
2102           label = pointer_equiv_class++;
2103           equiv_class_add (pointer_equiv_class_table,
2104                            label, graph->points_to[n]);
2105         }
2106       graph->pointer_label[n] = label;
2107     }
2108 }
2109
2110 /* Perform offline variable substitution, discovering equivalence
2111    classes, and eliminating non-pointer variables.  */
2112
2113 static struct scc_info *
2114 perform_var_substitution (constraint_graph_t graph)
2115 {
2116   unsigned int i;
2117   unsigned int size = graph->size;
2118   struct scc_info *si = init_scc_info (size);
2119
2120   bitmap_obstack_initialize (&iteration_obstack);
2121   pointer_equiv_class_table = htab_create (511, equiv_class_label_hash,
2122                                            equiv_class_label_eq, free);
2123   location_equiv_class_table = htab_create (511, equiv_class_label_hash,
2124                                             equiv_class_label_eq, free);
2125   pointer_equiv_class = 1;
2126   location_equiv_class = 1;
2127
2128   /* Condense the nodes, which means to find SCC's, count incoming
2129      predecessors, and unite nodes in SCC's.  */
2130   for (i = 0; i < FIRST_REF_NODE; i++)
2131     if (!TEST_BIT (si->visited, si->node_mapping[i]))
2132       condense_visit (graph, si, si->node_mapping[i]);
2133
2134   sbitmap_zero (si->visited);
2135   /* Actually the label the nodes for pointer equivalences  */
2136   for (i = 0; i < FIRST_REF_NODE; i++)
2137     if (!TEST_BIT (si->visited, si->node_mapping[i]))
2138       label_visit (graph, si, si->node_mapping[i]);
2139
2140   /* Calculate location equivalence labels.  */
2141   for (i = 0; i < FIRST_REF_NODE; i++)
2142     {
2143       bitmap pointed_by;
2144       bitmap_iterator bi;
2145       unsigned int j;
2146       unsigned int label;
2147
2148       if (!graph->pointed_by[i])
2149         continue;
2150       pointed_by = BITMAP_ALLOC (&iteration_obstack);
2151
2152       /* Translate the pointed-by mapping for pointer equivalence
2153          labels.  */
2154       EXECUTE_IF_SET_IN_BITMAP (graph->pointed_by[i], 0, j, bi)
2155         {
2156           bitmap_set_bit (pointed_by,
2157                           graph->pointer_label[si->node_mapping[j]]);
2158         }
2159       /* The original pointed_by is now dead.  */
2160       BITMAP_FREE (graph->pointed_by[i]);
2161
2162       /* Look up the location equivalence label if one exists, or make
2163          one otherwise.  */
2164       label = equiv_class_lookup (location_equiv_class_table,
2165                                   pointed_by);
2166       if (label == 0)
2167         {
2168           label = location_equiv_class++;
2169           equiv_class_add (location_equiv_class_table,
2170                            label, pointed_by);
2171         }
2172       else
2173         {
2174           if (dump_file && (dump_flags & TDF_DETAILS))
2175             fprintf (dump_file, "Found location equivalence for node %s\n",
2176                      get_varinfo (i)->name);
2177           BITMAP_FREE (pointed_by);
2178         }
2179       graph->loc_label[i] = label;
2180
2181     }
2182
2183   if (dump_file && (dump_flags & TDF_DETAILS))
2184     for (i = 0; i < FIRST_REF_NODE; i++)
2185       {
2186         bool direct_node = TEST_BIT (graph->direct_nodes, i);
2187         fprintf (dump_file,
2188                  "Equivalence classes for %s node id %d:%s are pointer: %d"
2189                  ", location:%d\n",
2190                  direct_node ? "Direct node" : "Indirect node", i,
2191                  get_varinfo (i)->name,
2192                  graph->pointer_label[si->node_mapping[i]],
2193                  graph->loc_label[si->node_mapping[i]]);
2194       }
2195
2196   /* Quickly eliminate our non-pointer variables.  */
2197
2198   for (i = 0; i < FIRST_REF_NODE; i++)
2199     {
2200       unsigned int node = si->node_mapping[i];
2201
2202       if (graph->pointer_label[node] == 0)
2203         {
2204           if (dump_file && (dump_flags & TDF_DETAILS))
2205             fprintf (dump_file,
2206                      "%s is a non-pointer variable, eliminating edges.\n",
2207                      get_varinfo (node)->name);
2208           stats.nonpointer_vars++;
2209           clear_edges_for_node (graph, node);
2210         }
2211     }
2212
2213   return si;
2214 }
2215
2216 /* Free information that was only necessary for variable
2217    substitution.  */
2218
2219 static void
2220 free_var_substitution_info (struct scc_info *si)
2221 {
2222   free_scc_info (si);
2223   free (graph->pointer_label);
2224   free (graph->loc_label);
2225   free (graph->pointed_by);
2226   free (graph->points_to);
2227   free (graph->eq_rep);
2228   sbitmap_free (graph->direct_nodes);
2229   htab_delete (pointer_equiv_class_table);
2230   htab_delete (location_equiv_class_table);
2231   bitmap_obstack_release (&iteration_obstack);
2232 }
2233
2234 /* Return an existing node that is equivalent to NODE, which has
2235    equivalence class LABEL, if one exists.  Return NODE otherwise.  */
2236
2237 static unsigned int
2238 find_equivalent_node (constraint_graph_t graph,
2239                       unsigned int node, unsigned int label)
2240 {
2241   /* If the address version of this variable is unused, we can
2242      substitute it for anything else with the same label.
2243      Otherwise, we know the pointers are equivalent, but not the
2244      locations, and we can unite them later.  */
2245
2246   if (!bitmap_bit_p (graph->address_taken, node))
2247     {
2248       gcc_assert (label < graph->size);
2249
2250       if (graph->eq_rep[label] != -1)
2251         {
2252           /* Unify the two variables since we know they are equivalent.  */
2253           if (unite (graph->eq_rep[label], node))
2254             unify_nodes (graph, graph->eq_rep[label], node, false);
2255           return graph->eq_rep[label];
2256         }
2257       else
2258         {
2259           graph->eq_rep[label] = node;
2260           graph->pe_rep[label] = node;
2261         }
2262     }
2263   else
2264     {
2265       gcc_assert (label < graph->size);
2266       graph->pe[node] = label;
2267       if (graph->pe_rep[label] == -1)
2268         graph->pe_rep[label] = node;
2269     }
2270
2271   return node;
2272 }
2273
2274 /* Unite pointer equivalent but not location equivalent nodes in
2275    GRAPH.  This may only be performed once variable substitution is
2276    finished.  */
2277
2278 static void
2279 unite_pointer_equivalences (constraint_graph_t graph)
2280 {
2281   unsigned int i;
2282
2283   /* Go through the pointer equivalences and unite them to their
2284      representative, if they aren't already.  */
2285   for (i = 0; i < FIRST_REF_NODE; i++)
2286     {
2287       unsigned int label = graph->pe[i];
2288       if (label)
2289         {
2290           int label_rep = graph->pe_rep[label];
2291           
2292           if (label_rep == -1)
2293             continue;
2294           
2295           label_rep = find (label_rep);
2296           if (label_rep >= 0 && unite (label_rep, find (i)))
2297             unify_nodes (graph, label_rep, i, false);
2298         }
2299     }
2300 }
2301
2302 /* Move complex constraints to the GRAPH nodes they belong to.  */
2303
2304 static void
2305 move_complex_constraints (constraint_graph_t graph)
2306 {
2307   int i;
2308   constraint_t c;
2309
2310   for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
2311     {
2312       if (c)
2313         {
2314           struct constraint_expr lhs = c->lhs;
2315           struct constraint_expr rhs = c->rhs;
2316
2317           if (lhs.type == DEREF)
2318             {
2319               insert_into_complex (graph, lhs.var, c);
2320             }
2321           else if (rhs.type == DEREF)
2322             {
2323               if (!(get_varinfo (lhs.var)->is_special_var))
2324                 insert_into_complex (graph, rhs.var, c);
2325             }
2326           else if (rhs.type != ADDRESSOF && lhs.var > anything_id
2327                    && (lhs.offset != 0 || rhs.offset != 0))
2328             {
2329               insert_into_complex (graph, rhs.var, c);
2330             }
2331         }
2332     }
2333 }
2334
2335
2336 /* Optimize and rewrite complex constraints while performing
2337    collapsing of equivalent nodes.  SI is the SCC_INFO that is the
2338    result of perform_variable_substitution.  */
2339
2340 static void
2341 rewrite_constraints (constraint_graph_t graph,
2342                      struct scc_info *si)
2343 {
2344   int i;
2345   unsigned int j;
2346   constraint_t c;
2347
2348   for (j = 0; j < graph->size; j++)
2349     gcc_assert (find (j) == j);
2350
2351   for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
2352     {
2353       struct constraint_expr lhs = c->lhs;
2354       struct constraint_expr rhs = c->rhs;
2355       unsigned int lhsvar = find (lhs.var);
2356       unsigned int rhsvar = find (rhs.var);
2357       unsigned int lhsnode, rhsnode;
2358       unsigned int lhslabel, rhslabel;
2359
2360       lhsnode = si->node_mapping[lhsvar];
2361       rhsnode = si->node_mapping[rhsvar];
2362       lhslabel = graph->pointer_label[lhsnode];
2363       rhslabel = graph->pointer_label[rhsnode];
2364
2365       /* See if it is really a non-pointer variable, and if so, ignore
2366          the constraint.  */
2367       if (lhslabel == 0)
2368         {
2369           if (dump_file && (dump_flags & TDF_DETAILS))
2370             {
2371               
2372               fprintf (dump_file, "%s is a non-pointer variable,"
2373                        "ignoring constraint:",
2374                        get_varinfo (lhs.var)->name);
2375               dump_constraint (dump_file, c);
2376             }
2377           VEC_replace (constraint_t, constraints, i, NULL);
2378           continue;
2379         }
2380
2381       if (rhslabel == 0)
2382         {
2383           if (dump_file && (dump_flags & TDF_DETAILS))
2384             {
2385               
2386               fprintf (dump_file, "%s is a non-pointer variable,"
2387                        "ignoring constraint:",
2388                        get_varinfo (rhs.var)->name);
2389               dump_constraint (dump_file, c);
2390             }
2391           VEC_replace (constraint_t, constraints, i, NULL);
2392           continue;
2393         }
2394
2395       lhsvar = find_equivalent_node (graph, lhsvar, lhslabel);
2396       rhsvar = find_equivalent_node (graph, rhsvar, rhslabel);
2397       c->lhs.var = lhsvar;
2398       c->rhs.var = rhsvar;
2399
2400     }
2401 }
2402
2403 /* Eliminate indirect cycles involving NODE.  Return true if NODE was
2404    part of an SCC, false otherwise.  */
2405
2406 static bool
2407 eliminate_indirect_cycles (unsigned int node)
2408 {
2409   if (graph->indirect_cycles[node] != -1
2410       && !bitmap_empty_p (get_varinfo (node)->solution))
2411     {
2412       unsigned int i;
2413       VEC(unsigned,heap) *queue = NULL;
2414       int queuepos;
2415       unsigned int to = find (graph->indirect_cycles[node]);
2416       bitmap_iterator bi;
2417
2418       /* We can't touch the solution set and call unify_nodes
2419          at the same time, because unify_nodes is going to do
2420          bitmap unions into it. */
2421
2422       EXECUTE_IF_SET_IN_BITMAP (get_varinfo (node)->solution, 0, i, bi)
2423         {
2424           if (find (i) == i && i != to)
2425             {
2426               if (unite (to, i))
2427                 VEC_safe_push (unsigned, heap, queue, i);
2428             }
2429         }
2430
2431       for (queuepos = 0;
2432            VEC_iterate (unsigned, queue, queuepos, i);
2433            queuepos++)
2434         {
2435           unify_nodes (graph, to, i, true);
2436         }
2437       VEC_free (unsigned, heap, queue);
2438       return true;
2439     }
2440   return false;
2441 }
2442
2443 /* Solve the constraint graph GRAPH using our worklist solver.
2444    This is based on the PW* family of solvers from the "Efficient Field
2445    Sensitive Pointer Analysis for C" paper.
2446    It works by iterating over all the graph nodes, processing the complex
2447    constraints and propagating the copy constraints, until everything stops
2448    changed.  This corresponds to steps 6-8 in the solving list given above.  */
2449
2450 static void
2451 solve_graph (constraint_graph_t graph)
2452 {
2453   unsigned int size = graph->size;
2454   unsigned int i;
2455   bitmap pts;
2456
2457   changed_count = 0;
2458   changed = sbitmap_alloc (size);
2459   sbitmap_zero (changed);
2460
2461   /* Mark all initial non-collapsed nodes as changed.  */
2462   for (i = 0; i < size; i++)
2463     {
2464       varinfo_t ivi = get_varinfo (i);
2465       if (find (i) == i && !bitmap_empty_p (ivi->solution)
2466           && ((graph->succs[i] && !bitmap_empty_p (graph->succs[i]))
2467               || VEC_length (constraint_t, graph->complex[i]) > 0))
2468         {
2469           SET_BIT (changed, i);
2470           changed_count++;
2471         }
2472     }
2473
2474   /* Allocate a bitmap to be used to store the changed bits.  */
2475   pts = BITMAP_ALLOC (&pta_obstack);
2476
2477   while (changed_count > 0)
2478     {
2479       unsigned int i;
2480       struct topo_info *ti = init_topo_info ();
2481       stats.iterations++;
2482
2483       bitmap_obstack_initialize (&iteration_obstack);
2484
2485       compute_topo_order (graph, ti);
2486
2487       while (VEC_length (unsigned, ti->topo_order) != 0)
2488         {
2489
2490           i = VEC_pop (unsigned, ti->topo_order);
2491
2492           /* If this variable is not a representative, skip it.  */
2493           if (find (i) != i)
2494             continue;
2495
2496           /* In certain indirect cycle cases, we may merge this
2497              variable to another.  */
2498           if (eliminate_indirect_cycles (i) && find (i) != i)
2499             continue;
2500
2501           /* If the node has changed, we need to process the
2502              complex constraints and outgoing edges again.  */
2503           if (TEST_BIT (changed, i))
2504             {
2505               unsigned int j;
2506               constraint_t c;
2507               bitmap solution;
2508               VEC(constraint_t,heap) *complex = graph->complex[i];
2509               bool solution_empty;
2510
2511               RESET_BIT (changed, i);
2512               changed_count--;
2513
2514               /* Compute the changed set of solution bits.  */
2515               bitmap_and_compl (pts, get_varinfo (i)->solution,
2516                                 get_varinfo (i)->oldsolution);
2517
2518               if (bitmap_empty_p (pts))
2519                 continue;
2520
2521               bitmap_ior_into (get_varinfo (i)->oldsolution, pts);
2522
2523               solution = get_varinfo (i)->solution;
2524               solution_empty = bitmap_empty_p (solution);
2525
2526               /* Process the complex constraints */
2527               for (j = 0; VEC_iterate (constraint_t, complex, j, c); j++)
2528                 {
2529                   /* XXX: This is going to unsort the constraints in
2530                      some cases, which will occasionally add duplicate
2531                      constraints during unification.  This does not
2532                      affect correctness.  */
2533                   c->lhs.var = find (c->lhs.var);
2534                   c->rhs.var = find (c->rhs.var);
2535
2536                   /* The only complex constraint that can change our
2537                      solution to non-empty, given an empty solution,
2538                      is a constraint where the lhs side is receiving
2539                      some set from elsewhere.  */
2540                   if (!solution_empty || c->lhs.type != DEREF)
2541                     do_complex_constraint (graph, c, pts);
2542                 }
2543
2544               solution_empty = bitmap_empty_p (solution);
2545
2546               if (!solution_empty)
2547                 {
2548                   bitmap_iterator bi;
2549                   unsigned eff_escaped_id = find (escaped_id);
2550
2551                   /* Propagate solution to all successors.  */
2552                   EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[i],
2553                                                 0, j, bi)
2554                     {
2555                       bitmap tmp;
2556                       bool flag;
2557
2558                       unsigned int to = find (j);
2559                       tmp = get_varinfo (to)->solution;
2560                       flag = false;
2561
2562                       /* Don't try to propagate to ourselves.  */
2563                       if (to == i)
2564                         continue;
2565
2566                       /* If we propagate from ESCAPED use ESCAPED as
2567                          placeholder.  */
2568                       if (i == eff_escaped_id)
2569                         flag = bitmap_set_bit (tmp, escaped_id);
2570                       else
2571                         flag = set_union_with_increment (tmp, pts, 0);
2572
2573                       if (flag)
2574                         {
2575                           get_varinfo (to)->solution = tmp;
2576                           if (!TEST_BIT (changed, to))
2577                             {
2578                               SET_BIT (changed, to);
2579                               changed_count++;
2580                             }
2581                         }
2582                     }
2583                 }
2584             }
2585         }
2586       free_topo_info (ti);
2587       bitmap_obstack_release (&iteration_obstack);
2588     }
2589
2590   BITMAP_FREE (pts);
2591   sbitmap_free (changed);
2592   bitmap_obstack_release (&oldpta_obstack);
2593 }
2594
2595 /* Map from trees to variable infos.  */
2596 static struct pointer_map_t *vi_for_tree;
2597
2598
2599 /* Insert ID as the variable id for tree T in the vi_for_tree map.  */
2600
2601 static void
2602 insert_vi_for_tree (tree t, varinfo_t vi)
2603 {
2604   void **slot = pointer_map_insert (vi_for_tree, t);
2605   gcc_assert (vi);
2606   gcc_assert (*slot == NULL);
2607   *slot = vi;
2608 }
2609
2610 /* Find the variable info for tree T in VI_FOR_TREE.  If T does not
2611    exist in the map, return NULL, otherwise, return the varinfo we found.  */
2612
2613 static varinfo_t
2614 lookup_vi_for_tree (tree t)
2615 {
2616   void **slot = pointer_map_contains (vi_for_tree, t);
2617   if (slot == NULL)
2618     return NULL;
2619
2620   return (varinfo_t) *slot;
2621 }
2622
2623 /* Return a printable name for DECL  */
2624
2625 static const char *
2626 alias_get_name (tree decl)
2627 {
2628   const char *res = get_name (decl);
2629   char *temp;
2630   int num_printed = 0;
2631
2632   if (res != NULL)
2633     return res;
2634
2635   res = "NULL";
2636   if (!dump_file)
2637     return res;
2638
2639   if (TREE_CODE (decl) == SSA_NAME)
2640     {
2641       num_printed = asprintf (&temp, "%s_%u",
2642                               alias_get_name (SSA_NAME_VAR (decl)),
2643                               SSA_NAME_VERSION (decl));
2644     }
2645   else if (DECL_P (decl))
2646     {
2647       num_printed = asprintf (&temp, "D.%u", DECL_UID (decl));
2648     }
2649   if (num_printed > 0)
2650     {
2651       res = ggc_strdup (temp);
2652       free (temp);
2653     }
2654   return res;
2655 }
2656
2657 /* Find the variable id for tree T in the map.
2658    If T doesn't exist in the map, create an entry for it and return it.  */
2659
2660 static varinfo_t
2661 get_vi_for_tree (tree t)
2662 {
2663   void **slot = pointer_map_contains (vi_for_tree, t);
2664   if (slot == NULL)
2665     return get_varinfo (create_variable_info_for (t, alias_get_name (t)));
2666
2667   return (varinfo_t) *slot;
2668 }
2669
2670 /* Get a scalar constraint expression for a new temporary variable.  */
2671
2672 static struct constraint_expr
2673 new_scalar_tmp_constraint_exp (const char *name)
2674 {
2675   struct constraint_expr tmp;
2676   varinfo_t vi;
2677
2678   vi = new_var_info (NULL_TREE, name);
2679   vi->offset = 0;
2680   vi->size = -1;
2681   vi->fullsize = -1;
2682   vi->is_full_var = 1;
2683
2684   tmp.var = vi->id;
2685   tmp.type = SCALAR;
2686   tmp.offset = 0;
2687
2688   return tmp;
2689 }
2690
2691 /* Get a constraint expression vector from an SSA_VAR_P node.
2692    If address_p is true, the result will be taken its address of.  */
2693
2694 static void
2695 get_constraint_for_ssa_var (tree t, VEC(ce_s, heap) **results, bool address_p)
2696 {
2697   struct constraint_expr cexpr;
2698   varinfo_t vi;
2699
2700   /* We allow FUNCTION_DECLs here even though it doesn't make much sense.  */
2701   gcc_assert (SSA_VAR_P (t) || DECL_P (t));
2702
2703   /* For parameters, get at the points-to set for the actual parm
2704      decl.  */
2705   if (TREE_CODE (t) == SSA_NAME
2706       && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL
2707       && SSA_NAME_IS_DEFAULT_DEF (t))
2708     {
2709       get_constraint_for_ssa_var (SSA_NAME_VAR (t), results, address_p);
2710       return;
2711     }
2712
2713   vi = get_vi_for_tree (t);
2714   cexpr.var = vi->id;
2715   cexpr.type = SCALAR;
2716   cexpr.offset = 0;
2717   /* If we determine the result is "anything", and we know this is readonly,
2718      say it points to readonly memory instead.  */
2719   if (cexpr.var == anything_id && TREE_READONLY (t))
2720     {
2721       gcc_unreachable ();
2722       cexpr.type = ADDRESSOF;
2723       cexpr.var = readonly_id;
2724     }
2725
2726   /* If we are not taking the address of the constraint expr, add all
2727      sub-fiels of the variable as well.  */
2728   if (!address_p
2729       && !vi->is_full_var)
2730     {
2731       for (; vi; vi = vi->next)
2732         {
2733           cexpr.var = vi->id;
2734           VEC_safe_push (ce_s, heap, *results, &cexpr);
2735         }
2736       return;
2737     }
2738
2739   VEC_safe_push (ce_s, heap, *results, &cexpr);
2740 }
2741
2742 /* Process constraint T, performing various simplifications and then
2743    adding it to our list of overall constraints.  */
2744
2745 static void
2746 process_constraint (constraint_t t)
2747 {
2748   struct constraint_expr rhs = t->rhs;
2749   struct constraint_expr lhs = t->lhs;
2750
2751   gcc_assert (rhs.var < VEC_length (varinfo_t, varmap));
2752   gcc_assert (lhs.var < VEC_length (varinfo_t, varmap));
2753
2754   /* If we didn't get any useful constraint from the lhs we get
2755      &ANYTHING as fallback from get_constraint_for.  Deal with
2756      it here by turning it into *ANYTHING.  */
2757   if (lhs.type == ADDRESSOF
2758       && lhs.var == anything_id)
2759     lhs.type = DEREF;
2760
2761   /* ADDRESSOF on the lhs is invalid.  */
2762   gcc_assert (lhs.type != ADDRESSOF);
2763
2764   /* This can happen in our IR with things like n->a = *p */
2765   if (rhs.type == DEREF && lhs.type == DEREF && rhs.var != anything_id)
2766     {
2767       /* Split into tmp = *rhs, *lhs = tmp */
2768       struct constraint_expr tmplhs;
2769       tmplhs = new_scalar_tmp_constraint_exp ("doubledereftmp");
2770       process_constraint (new_constraint (tmplhs, rhs));
2771       process_constraint (new_constraint (lhs, tmplhs));
2772     }
2773   else if (rhs.type == ADDRESSOF && lhs.type == DEREF)
2774     {
2775       /* Split into tmp = &rhs, *lhs = tmp */
2776       struct constraint_expr tmplhs;
2777       tmplhs = new_scalar_tmp_constraint_exp ("derefaddrtmp");
2778       process_constraint (new_constraint (tmplhs, rhs));
2779       process_constraint (new_constraint (lhs, tmplhs));
2780     }
2781   else
2782     {
2783       gcc_assert (rhs.type != ADDRESSOF || rhs.offset == 0);
2784       VEC_safe_push (constraint_t, heap, constraints, t);
2785     }
2786 }
2787
2788 /* Return true if T is a type that could contain pointers.  */
2789
2790 static bool
2791 type_could_have_pointers (tree type)
2792 {
2793   if (POINTER_TYPE_P (type))
2794     return true;
2795
2796   if (TREE_CODE (type) == ARRAY_TYPE)
2797     return type_could_have_pointers (TREE_TYPE (type));
2798
2799   return AGGREGATE_TYPE_P (type);
2800 }
2801
2802 /* Return true if T is a variable of a type that could contain
2803    pointers.  */
2804
2805 static bool
2806 could_have_pointers (tree t)
2807 {
2808   return type_could_have_pointers (TREE_TYPE (t));
2809 }
2810
2811 /* Return the position, in bits, of FIELD_DECL from the beginning of its
2812    structure.  */
2813
2814 static HOST_WIDE_INT
2815 bitpos_of_field (const tree fdecl)
2816 {
2817
2818   if (!host_integerp (DECL_FIELD_OFFSET (fdecl), 0)
2819       || !host_integerp (DECL_FIELD_BIT_OFFSET (fdecl), 0))
2820     return -1;
2821
2822   return (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (fdecl)) * 8
2823           + TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (fdecl)));
2824 }
2825
2826
2827 /* Get constraint expressions for offsetting PTR by OFFSET.  Stores the
2828    resulting constraint expressions in *RESULTS.  */
2829
2830 static void
2831 get_constraint_for_ptr_offset (tree ptr, tree offset,
2832                                VEC (ce_s, heap) **results)
2833 {
2834   struct constraint_expr c;
2835   unsigned int j, n;
2836   HOST_WIDE_INT rhsunitoffset, rhsoffset;
2837
2838   /* If we do not do field-sensitive PTA adding offsets to pointers
2839      does not change the points-to solution.  */
2840   if (!use_field_sensitive)
2841     {
2842       get_constraint_for (ptr, results);
2843       return;
2844     }
2845
2846   /* If the offset is not a non-negative integer constant that fits
2847      in a HOST_WIDE_INT, we have to fall back to a conservative
2848      solution which includes all sub-fields of all pointed-to
2849      variables of ptr.  */
2850   if (offset == NULL_TREE
2851       || !host_integerp (offset, 0))
2852     rhsoffset = UNKNOWN_OFFSET;
2853   else
2854     {
2855       /* Make sure the bit-offset also fits.  */
2856       rhsunitoffset = TREE_INT_CST_LOW (offset);
2857       rhsoffset = rhsunitoffset * BITS_PER_UNIT;
2858       if (rhsunitoffset != rhsoffset / BITS_PER_UNIT)
2859         rhsoffset = UNKNOWN_OFFSET;
2860     }
2861
2862   get_constraint_for (ptr, results);
2863   if (rhsoffset == 0)
2864     return;
2865
2866   /* As we are eventually appending to the solution do not use
2867      VEC_iterate here.  */
2868   n = VEC_length (ce_s, *results);
2869   for (j = 0; j < n; j++)
2870     {
2871       varinfo_t curr;
2872       c = *VEC_index (ce_s, *results, j);
2873       curr = get_varinfo (c.var);
2874
2875       if (c.type == ADDRESSOF
2876           /* If this varinfo represents a full variable just use it.  */
2877           && curr->is_full_var)
2878         c.offset = 0;
2879       else if (c.type == ADDRESSOF
2880                /* If we do not know the offset add all subfields.  */
2881                && rhsoffset == UNKNOWN_OFFSET)
2882         {
2883           varinfo_t temp = lookup_vi_for_tree (curr->decl);
2884           do
2885             {
2886               struct constraint_expr c2;
2887               c2.var = temp->id;
2888               c2.type = ADDRESSOF;
2889               c2.offset = 0;
2890               if (c2.var != c.var)
2891                 VEC_safe_push (ce_s, heap, *results, &c2);
2892               temp = temp->next;
2893             }
2894           while (temp);
2895         }
2896       else if (c.type == ADDRESSOF)
2897         {
2898           varinfo_t temp;
2899           unsigned HOST_WIDE_INT offset = curr->offset + rhsoffset;
2900
2901           /* Search the sub-field which overlaps with the
2902              pointed-to offset.  If the result is outside of the variable
2903              we have to provide a conservative result, as the variable is
2904              still reachable from the resulting pointer (even though it
2905              technically cannot point to anything).  The last and first
2906              sub-fields are such conservative results.
2907              ???  If we always had a sub-field for &object + 1 then
2908              we could represent this in a more precise way.  */
2909           if (rhsoffset < 0
2910               && curr->offset < offset)
2911             offset = 0;
2912           temp = first_or_preceding_vi_for_offset (curr, offset);
2913
2914           /* If the found variable is not exactly at the pointed to
2915              result, we have to include the next variable in the
2916              solution as well.  Otherwise two increments by offset / 2
2917              do not result in the same or a conservative superset
2918              solution.  */
2919           if (temp->offset != offset
2920               && temp->next != NULL)
2921             {
2922               struct constraint_expr c2;
2923               c2.var = temp->next->id;
2924               c2.type = ADDRESSOF;
2925               c2.offset = 0;
2926               VEC_safe_push (ce_s, heap, *results, &c2);
2927             }
2928           c.var = temp->id;
2929           c.offset = 0;
2930         }
2931       else
2932         c.offset = rhsoffset;
2933
2934       VEC_replace (ce_s, *results, j, &c);
2935     }
2936 }
2937
2938
2939 /* Given a COMPONENT_REF T, return the constraint_expr vector for it.
2940    If address_p is true the result will be taken its address of.  */
2941
2942 static void
2943 get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results,
2944                                   bool address_p)
2945 {
2946   tree orig_t = t;
2947   HOST_WIDE_INT bitsize = -1;
2948   HOST_WIDE_INT bitmaxsize = -1;
2949   HOST_WIDE_INT bitpos;
2950   tree forzero;
2951   struct constraint_expr *result;
2952
2953   /* Some people like to do cute things like take the address of
2954      &0->a.b */
2955   forzero = t;
2956   while (!SSA_VAR_P (forzero) && !CONSTANT_CLASS_P (forzero))
2957     forzero = TREE_OPERAND (forzero, 0);
2958
2959   if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero))
2960     {
2961       struct constraint_expr temp;
2962
2963       temp.offset = 0;
2964       temp.var = integer_id;
2965       temp.type = SCALAR;
2966       VEC_safe_push (ce_s, heap, *results, &temp);
2967       return;
2968     }
2969
2970   t = get_ref_base_and_extent (t, &bitpos, &bitsize, &bitmaxsize);
2971
2972   /* Pretend to take the address of the base, we'll take care of
2973      adding the required subset of sub-fields below.  */
2974   get_constraint_for_1 (t, results, true);
2975   gcc_assert (VEC_length (ce_s, *results) == 1);
2976   result = VEC_last (ce_s, *results);
2977
2978   if (result->type == SCALAR
2979       && get_varinfo (result->var)->is_full_var)
2980     /* For single-field vars do not bother about the offset.  */
2981     result->offset = 0;
2982   else if (result->type == SCALAR)
2983     {
2984       /* In languages like C, you can access one past the end of an
2985          array.  You aren't allowed to dereference it, so we can
2986          ignore this constraint. When we handle pointer subtraction,
2987          we may have to do something cute here.  */
2988
2989       if ((unsigned HOST_WIDE_INT)bitpos < get_varinfo (result->var)->fullsize
2990           && bitmaxsize != 0)
2991         {
2992           /* It's also not true that the constraint will actually start at the
2993              right offset, it may start in some padding.  We only care about
2994              setting the constraint to the first actual field it touches, so
2995              walk to find it.  */
2996           struct constraint_expr cexpr = *result;
2997           varinfo_t curr;
2998           VEC_pop (ce_s, *results);
2999           cexpr.offset = 0;
3000           for (curr = get_varinfo (cexpr.var); curr; curr = curr->next)
3001             {
3002               if (ranges_overlap_p (curr->offset, curr->size,
3003                                     bitpos, bitmaxsize))
3004                 {
3005                   cexpr.var = curr->id;
3006                   VEC_safe_push (ce_s, heap, *results, &cexpr);
3007                   if (address_p)
3008                     break;
3009                 }
3010             }
3011           /* If we are going to take the address of this field then
3012              to be able to compute reachability correctly add at least
3013              the last field of the variable.  */
3014           if (address_p
3015               && VEC_length (ce_s, *results) == 0)
3016             {
3017               curr = get_varinfo (cexpr.var);
3018               while (curr->next != NULL)
3019                 curr = curr->next;
3020               cexpr.var = curr->id;
3021               VEC_safe_push (ce_s, heap, *results, &cexpr);
3022             }
3023           else
3024             /* Assert that we found *some* field there. The user couldn't be
3025                accessing *only* padding.  */
3026             /* Still the user could access one past the end of an array
3027                embedded in a struct resulting in accessing *only* padding.  */
3028             gcc_assert (VEC_length (ce_s, *results) >= 1
3029                         || ref_contains_array_ref (orig_t));
3030         }
3031       else if (bitmaxsize == 0)
3032         {
3033           if (dump_file && (dump_flags & TDF_DETAILS))
3034             fprintf (dump_file, "Access to zero-sized part of variable,"
3035                      "ignoring\n");
3036         }
3037       else
3038         if (dump_file && (dump_flags & TDF_DETAILS))
3039           fprintf (dump_file, "Access to past the end of variable, ignoring\n");
3040     }
3041   else if (result->type == DEREF)
3042     {
3043       /* If we do not know exactly where the access goes say so.  Note
3044          that only for non-structure accesses we know that we access
3045          at most one subfiled of any variable.  */
3046       if (bitpos == -1
3047           || bitsize != bitmaxsize
3048           || AGGREGATE_TYPE_P (TREE_TYPE (orig_t)))
3049         result->offset = UNKNOWN_OFFSET;
3050       else
3051         result->offset = bitpos;
3052     }
3053   else if (result->type == ADDRESSOF)
3054     {
3055       /* We can end up here for component references on a
3056          VIEW_CONVERT_EXPR <>(&foobar).  */
3057       result->type = SCALAR;
3058       result->var = anything_id;
3059       result->offset = 0;
3060     }
3061   else
3062     gcc_unreachable ();
3063 }
3064
3065
3066 /* Dereference the constraint expression CONS, and return the result.
3067    DEREF (ADDRESSOF) = SCALAR
3068    DEREF (SCALAR) = DEREF
3069    DEREF (DEREF) = (temp = DEREF1; result = DEREF(temp))
3070    This is needed so that we can handle dereferencing DEREF constraints.  */
3071
3072 static void
3073 do_deref (VEC (ce_s, heap) **constraints)
3074 {
3075   struct constraint_expr *c;
3076   unsigned int i = 0;
3077
3078   for (i = 0; VEC_iterate (ce_s, *constraints, i, c); i++)
3079     {
3080       if (c->type == SCALAR)
3081         c->type = DEREF;
3082       else if (c->type == ADDRESSOF)
3083         c->type = SCALAR;
3084       else if (c->type == DEREF)
3085         {
3086           struct constraint_expr tmplhs;
3087           tmplhs = new_scalar_tmp_constraint_exp ("dereftmp");
3088           process_constraint (new_constraint (tmplhs, *c));
3089           c->var = tmplhs.var;
3090         }
3091       else
3092         gcc_unreachable ();
3093     }
3094 }
3095
3096 static void get_constraint_for_1 (tree, VEC (ce_s, heap) **, bool);
3097
3098 /* Given a tree T, return the constraint expression for taking the
3099    address of it.  */
3100
3101 static void
3102 get_constraint_for_address_of (tree t, VEC (ce_s, heap) **results)
3103 {
3104   struct constraint_expr *c;
3105   unsigned int i;
3106
3107   get_constraint_for_1 (t, results, true);
3108
3109   for (i = 0; VEC_iterate (ce_s, *results, i, c); i++)
3110     {
3111       if (c->type == DEREF)
3112         c->type = SCALAR;
3113       else
3114         c->type = ADDRESSOF;
3115     }
3116 }
3117
3118 /* Given a tree T, return the constraint expression for it.  */
3119
3120 static void
3121 get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p)
3122 {
3123   struct constraint_expr temp;
3124
3125   /* x = integer is all glommed to a single variable, which doesn't
3126      point to anything by itself.  That is, of course, unless it is an
3127      integer constant being treated as a pointer, in which case, we
3128      will return that this is really the addressof anything.  This
3129      happens below, since it will fall into the default case. The only
3130      case we know something about an integer treated like a pointer is
3131      when it is the NULL pointer, and then we just say it points to
3132      NULL.
3133
3134      Do not do that if -fno-delete-null-pointer-checks though, because
3135      in that case *NULL does not fail, so it _should_ alias *anything.
3136      It is not worth adding a new option or renaming the existing one,
3137      since this case is relatively obscure.  */
3138   if (flag_delete_null_pointer_checks
3139       && ((TREE_CODE (t) == INTEGER_CST
3140            && integer_zerop (t))
3141           /* The only valid CONSTRUCTORs in gimple with pointer typed
3142              elements are zero-initializer.  */
3143           || TREE_CODE (t) == CONSTRUCTOR))
3144     {
3145       temp.var = nothing_id;
3146       temp.type = ADDRESSOF;
3147       temp.offset = 0;
3148       VEC_safe_push (ce_s, heap, *results, &temp);
3149       return;
3150     }
3151
3152   /* String constants are read-only.  */
3153   if (TREE_CODE (t) == STRING_CST)
3154     {
3155       temp.var = readonly_id;
3156       temp.type = SCALAR;
3157       temp.offset = 0;
3158       VEC_safe_push (ce_s, heap, *results, &temp);
3159       return;
3160     }
3161
3162   switch (TREE_CODE_CLASS (TREE_CODE (t)))
3163     {
3164     case tcc_expression:
3165       {
3166         switch (TREE_CODE (t))
3167           {
3168           case ADDR_EXPR:
3169             get_constraint_for_address_of (TREE_OPERAND (t, 0), results);
3170             return;
3171           default:;
3172           }
3173         break;
3174       }
3175     case tcc_reference:
3176       {
3177         switch (TREE_CODE (t))
3178           {
3179           case INDIRECT_REF:
3180             {
3181               get_constraint_for_1 (TREE_OPERAND (t, 0), results, address_p);
3182               do_deref (results);
3183               return;
3184             }
3185           case ARRAY_REF:
3186           case ARRAY_RANGE_REF:
3187           case COMPONENT_REF:
3188             get_constraint_for_component_ref (t, results, address_p);
3189             return;
3190           case VIEW_CONVERT_EXPR:
3191             get_constraint_for_1 (TREE_OPERAND (t, 0), results, address_p);
3192             return;
3193           /* We are missing handling for TARGET_MEM_REF here.  */
3194           default:;
3195           }
3196         break;
3197       }
3198     case tcc_exceptional:
3199       {
3200         switch (TREE_CODE (t))
3201           {
3202           case SSA_NAME:
3203             {
3204               get_constraint_for_ssa_var (t, results, address_p);
3205               return;
3206             }
3207           default:;
3208           }
3209         break;
3210       }
3211     case tcc_declaration:
3212       {
3213         get_constraint_for_ssa_var (t, results, address_p);
3214         return;
3215       }
3216     default:;
3217     }
3218
3219   /* The default fallback is a constraint from anything.  */
3220   temp.type = ADDRESSOF;
3221   temp.var = anything_id;
3222   temp.offset = 0;
3223   VEC_safe_push (ce_s, heap, *results, &temp);
3224 }
3225
3226 /* Given a gimple tree T, return the constraint expression vector for it.  */
3227
3228 static void
3229 get_constraint_for (tree t, VEC (ce_s, heap) **results)
3230 {
3231   gcc_assert (VEC_length (ce_s, *results) == 0);
3232
3233   get_constraint_for_1 (t, results, false);
3234 }
3235
3236
3237 /* Efficiently generates constraints from all entries in *RHSC to all
3238    entries in *LHSC.  */
3239
3240 static void
3241 process_all_all_constraints (VEC (ce_s, heap) *lhsc, VEC (ce_s, heap) *rhsc)
3242 {
3243   struct constraint_expr *lhsp, *rhsp;
3244   unsigned i, j;
3245
3246   if (VEC_length (ce_s, lhsc) <= 1
3247       || VEC_length (ce_s, rhsc) <= 1)
3248     {
3249       for (i = 0; VEC_iterate (ce_s, lhsc, i, lhsp); ++i)
3250         for (j = 0; VEC_iterate (ce_s, rhsc, j, rhsp); ++j)
3251           process_constraint (new_constraint (*lhsp, *rhsp));
3252     }
3253   else
3254     {
3255       struct constraint_expr tmp;
3256       tmp = new_scalar_tmp_constraint_exp ("allalltmp");
3257       for (i = 0; VEC_iterate (ce_s, rhsc, i, rhsp); ++i)
3258         process_constraint (new_constraint (tmp, *rhsp));
3259       for (i = 0; VEC_iterate (ce_s, lhsc, i, lhsp); ++i)
3260         process_constraint (new_constraint (*lhsp, tmp));
3261     }
3262 }
3263
3264 /* Handle aggregate copies by expanding into copies of the respective
3265    fields of the structures.  */
3266
3267 static void
3268 do_structure_copy (tree lhsop, tree rhsop)
3269 {
3270   struct constraint_expr *lhsp, *rhsp;
3271   VEC (ce_s, heap) *lhsc = NULL, *rhsc = NULL;
3272   unsigned j;
3273
3274   get_constraint_for (lhsop, &lhsc);
3275   get_constraint_for (rhsop, &rhsc);
3276   lhsp = VEC_index (ce_s, lhsc, 0);
3277   rhsp = VEC_index (ce_s, rhsc, 0);
3278   if (lhsp->type == DEREF
3279       || (lhsp->type == ADDRESSOF && lhsp->var == anything_id)
3280       || rhsp->type == DEREF)
3281     process_all_all_constraints (lhsc, rhsc);
3282   else if (lhsp->type == SCALAR
3283            && (rhsp->type == SCALAR
3284                || rhsp->type == ADDRESSOF))
3285     {
3286       tree lhsbase, rhsbase;
3287       HOST_WIDE_INT lhssize, lhsmaxsize, lhsoffset;
3288       HOST_WIDE_INT rhssize, rhsmaxsize, rhsoffset;
3289       unsigned k = 0;
3290       lhsbase = get_ref_base_and_extent (lhsop, &lhsoffset,
3291                                          &lhssize, &lhsmaxsize);
3292       rhsbase = get_ref_base_and_extent (rhsop, &rhsoffset,
3293                                          &rhssize, &rhsmaxsize);
3294       for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp);)
3295         {
3296           varinfo_t lhsv, rhsv;
3297           rhsp = VEC_index (ce_s, rhsc, k);
3298           lhsv = get_varinfo (lhsp->var);
3299           rhsv = get_varinfo (rhsp->var);
3300           if (lhsv->may_have_pointers
3301               && ranges_overlap_p (lhsv->offset + rhsoffset, lhsv->size,
3302                                    rhsv->offset + lhsoffset, rhsv->size))
3303             process_constraint (new_constraint (*lhsp, *rhsp));
3304           if (lhsv->offset + rhsoffset + lhsv->size
3305               > rhsv->offset + lhsoffset + rhsv->size)
3306             {
3307               ++k;
3308               if (k >= VEC_length (ce_s, rhsc))
3309                 break;
3310             }
3311           else
3312             ++j;
3313         }
3314     }
3315   else
3316     gcc_unreachable ();
3317
3318   VEC_free (ce_s, heap, lhsc);
3319   VEC_free (ce_s, heap, rhsc);
3320 }
3321
3322 /* Create a constraint ID = OP.  */
3323
3324 static void
3325 make_constraint_to (unsigned id, tree op)
3326 {
3327   VEC(ce_s, heap) *rhsc = NULL;
3328   struct constraint_expr *c;
3329   struct constraint_expr includes;
3330   unsigned int j;
3331
3332   includes.var = id;
3333   includes.offset = 0;
3334   includes.type = SCALAR;
3335
3336   get_constraint_for (op, &rhsc);
3337   for (j = 0; VEC_iterate (ce_s, rhsc, j, c); j++)
3338     process_constraint (new_constraint (includes, *c));
3339   VEC_free (ce_s, heap, rhsc);
3340 }
3341
3342 /* Create a constraint ID = &FROM.  */
3343
3344 static void
3345 make_constraint_from (varinfo_t vi, int from)
3346 {
3347   struct constraint_expr lhs, rhs;
3348
3349   lhs.var = vi->id;
3350   lhs.offset = 0;
3351   lhs.type = SCALAR;
3352
3353   rhs.var = from;
3354   rhs.offset = 0;
3355   rhs.type = ADDRESSOF;
3356   process_constraint (new_constraint (lhs, rhs));
3357 }
3358
3359 /* Create a constraint ID = FROM.  */
3360
3361 static void
3362 make_copy_constraint (varinfo_t vi, int from)
3363 {
3364   struct constraint_expr lhs, rhs;
3365
3366   lhs.var = vi->id;
3367   lhs.offset = 0;
3368   lhs.type = SCALAR;
3369
3370   rhs.var = from;
3371   rhs.offset = 0;
3372   rhs.type = SCALAR;
3373   process_constraint (new_constraint (lhs, rhs));
3374 }
3375
3376 /* Make constraints necessary to make OP escape.  */
3377
3378 static void
3379 make_escape_constraint (tree op)
3380 {
3381   make_constraint_to (escaped_id, op);
3382 }
3383
3384 /* Create a new artificial heap variable with NAME and make a
3385    constraint from it to LHS.  Return the created variable.  */
3386
3387 static varinfo_t
3388 make_constraint_from_heapvar (varinfo_t lhs, const char *name)
3389 {
3390   varinfo_t vi;
3391   tree heapvar = heapvar_lookup (lhs->decl, lhs->offset);
3392
3393   if (heapvar == NULL_TREE)
3394     {
3395       var_ann_t ann;
3396       heapvar = create_tmp_var_raw (ptr_type_node, name);
3397       DECL_EXTERNAL (heapvar) = 1;
3398
3399       heapvar_insert (lhs->decl, lhs->offset, heapvar);
3400
3401       ann = get_var_ann (heapvar);
3402       ann->is_heapvar = 1;
3403     }
3404
3405   /* For global vars we need to add a heapvar to the list of referenced
3406      vars of a different function than it was created for originally.  */
3407   if (gimple_referenced_vars (cfun))
3408     add_referenced_var (heapvar);
3409
3410   vi = new_var_info (heapvar, name);
3411   vi->is_artificial_var = true;
3412   vi->is_heap_var = true;
3413   vi->is_unknown_size_var = true;
3414   vi->offset = 0;
3415   vi->fullsize = ~0;
3416   vi->size = ~0;
3417   vi->is_full_var = true;
3418   insert_vi_for_tree (heapvar, vi);
3419
3420   make_constraint_from (lhs, vi->id);
3421
3422   return vi;
3423 }
3424
3425 /* Create a new artificial heap variable with NAME and make a
3426    constraint from it to LHS.  Set flags according to a tag used
3427    for tracking restrict pointers.  */
3428
3429 static void
3430 make_constraint_from_restrict (varinfo_t lhs, const char *name)
3431 {
3432   varinfo_t vi;
3433   vi = make_constraint_from_heapvar (lhs, name);
3434   vi->is_restrict_var = 1;
3435   vi->is_global_var = 0;
3436   vi->is_special_var = 1;
3437   vi->may_have_pointers = 0;
3438 }
3439
3440 /* For non-IPA mode, generate constraints necessary for a call on the
3441    RHS.  */
3442
3443 static void
3444 handle_rhs_call (gimple stmt, VEC(ce_s, heap) **results)
3445 {
3446   struct constraint_expr rhsc;
3447   unsigned i;
3448
3449   for (i = 0; i < gimple_call_num_args (stmt); ++i)
3450     {
3451       tree arg = gimple_call_arg (stmt, i);
3452
3453       /* Find those pointers being passed, and make sure they end up
3454          pointing to anything.  */
3455       if (could_have_pointers (arg))
3456         make_escape_constraint (arg);
3457     }
3458
3459   /* The static chain escapes as well.  */
3460   if (gimple_call_chain (stmt))
3461     make_escape_constraint (gimple_call_chain (stmt));
3462
3463   /* And if we applied NRV the address of the return slot escapes as well.  */
3464   if (gimple_call_return_slot_opt_p (stmt)
3465       && gimple_call_lhs (stmt) != NULL_TREE
3466       && TREE_ADDRESSABLE (TREE_TYPE (gimple_call_lhs (stmt))))
3467     {
3468       VEC(ce_s, heap) *tmpc = NULL;
3469       struct constraint_expr lhsc, *c;
3470       get_constraint_for_address_of (gimple_call_lhs (stmt), &tmpc);
3471       lhsc.var = escaped_id;
3472       lhsc.offset = 0;
3473       lhsc.type = SCALAR;
3474       for (i = 0; VEC_iterate (ce_s, tmpc, i, c); ++i)
3475         process_constraint (new_constraint (lhsc, *c));
3476       VEC_free(ce_s, heap, tmpc);
3477     }
3478
3479   /* Regular functions return nonlocal memory.  */
3480   rhsc.var = nonlocal_id;
3481   rhsc.offset = 0;
3482   rhsc.type = SCALAR;
3483   VEC_safe_push (ce_s, heap, *results, &rhsc);
3484 }
3485
3486 /* For non-IPA mode, generate constraints necessary for a call
3487    that returns a pointer and assigns it to LHS.  This simply makes
3488    the LHS point to global and escaped variables.  */
3489
3490 static void
3491 handle_lhs_call (tree lhs, int flags, VEC(ce_s, heap) *rhsc)
3492 {
3493   VEC(ce_s, heap) *lhsc = NULL;
3494
3495   get_constraint_for (lhs, &lhsc);
3496
3497   if (flags & ECF_MALLOC)
3498     {
3499       varinfo_t vi;
3500       vi = make_constraint_from_heapvar (get_vi_for_tree (lhs), "HEAP");
3501       /* We delay marking allocated storage global until we know if
3502          it escapes.  */
3503       DECL_EXTERNAL (vi->decl) = 0;
3504       vi->is_global_var = 0;
3505     }
3506   else if (VEC_length (ce_s, rhsc) > 0)
3507     {
3508       /* If the store is to a global decl make sure to
3509          add proper escape constraints.  */
3510       lhs = get_base_address (lhs);
3511       if (lhs
3512           && DECL_P (lhs)
3513           && is_global_var (lhs))
3514         {
3515           struct constraint_expr tmpc;
3516           tmpc.var = escaped_id;
3517           tmpc.offset = 0;
3518           tmpc.type = SCALAR;
3519           VEC_safe_push (ce_s, heap, lhsc, &tmpc);
3520         }
3521       process_all_all_constraints (lhsc, rhsc);
3522     }
3523   VEC_free (ce_s, heap, lhsc);
3524 }
3525
3526 /* For non-IPA mode, generate constraints necessary for a call of a
3527    const function that returns a pointer in the statement STMT.  */
3528
3529 static void
3530 handle_const_call (gimple stmt, VEC(ce_s, heap) **results)
3531 {
3532   struct constraint_expr rhsc;
3533   unsigned int k;
3534
3535   /* Treat nested const functions the same as pure functions as far
3536      as the static chain is concerned.  */
3537   if (gimple_call_chain (stmt))
3538     {
3539       make_constraint_to (callused_id, gimple_call_chain (stmt));
3540       rhsc.var = callused_id;
3541       rhsc.offset = 0;
3542       rhsc.type = SCALAR;
3543       VEC_safe_push (ce_s, heap, *results, &rhsc);
3544     }
3545
3546   /* May return arguments.  */
3547   for (k = 0; k < gimple_call_num_args (stmt); ++k)
3548     {
3549       tree arg = gimple_call_arg (stmt, k);
3550
3551       if (could_have_pointers (arg))
3552         {
3553           VEC(ce_s, heap) *argc = NULL;
3554           unsigned i;
3555           struct constraint_expr *argp;
3556           get_constraint_for (arg, &argc);
3557           for (i = 0; VEC_iterate (ce_s, argc, i, argp); ++i)
3558             VEC_safe_push (ce_s, heap, *results, argp);
3559           VEC_free(ce_s, heap, argc);
3560         }
3561     }
3562
3563   /* May return addresses of globals.  */
3564   rhsc.var = nonlocal_id;
3565   rhsc.offset = 0;
3566   rhsc.type = ADDRESSOF;
3567   VEC_safe_push (ce_s, heap, *results, &rhsc);
3568 }
3569
3570 /* For non-IPA mode, generate constraints necessary for a call to a
3571    pure function in statement STMT.  */
3572
3573 static void
3574 handle_pure_call (gimple stmt, VEC(ce_s, heap) **results)
3575 {
3576   struct constraint_expr rhsc;
3577   unsigned i;
3578   bool need_callused = false;
3579
3580   /* Memory reached from pointer arguments is call-used.  */
3581   for (i = 0; i < gimple_call_num_args (stmt); ++i)
3582     {
3583       tree arg = gimple_call_arg (stmt, i);
3584
3585       if (could_have_pointers (arg))
3586         {
3587           make_constraint_to (callused_id, arg);
3588           need_callused = true;
3589         }
3590     }
3591
3592   /* The static chain is used as well.  */
3593   if (gimple_call_chain (stmt))
3594     {
3595       make_constraint_to (callused_id, gimple_call_chain (stmt));
3596       need_callused = true;
3597     }
3598
3599   /* Pure functions may return callused and nonlocal memory.  */
3600   if (need_callused)
3601     {
3602       rhsc.var = callused_id;
3603       rhsc.offset = 0;
3604       rhsc.type = SCALAR;
3605       VEC_safe_push (ce_s, heap, *results, &rhsc);
3606     }
3607   rhsc.var = nonlocal_id;
3608   rhsc.offset = 0;
3609   rhsc.type = SCALAR;
3610   VEC_safe_push (ce_s, heap, *results, &rhsc);
3611 }
3612
3613 /* Walk statement T setting up aliasing constraints according to the
3614    references found in T.  This function is the main part of the
3615    constraint builder.  AI points to auxiliary alias information used
3616    when building alias sets and computing alias grouping heuristics.  */
3617
3618 static void
3619 find_func_aliases (gimple origt)
3620 {
3621   gimple t = origt;
3622   VEC(ce_s, heap) *lhsc = NULL;
3623   VEC(ce_s, heap) *rhsc = NULL;
3624   struct constraint_expr *c;
3625
3626   /* Now build constraints expressions.  */
3627   if (gimple_code (t) == GIMPLE_PHI)
3628     {
3629       gcc_assert (!AGGREGATE_TYPE_P (TREE_TYPE (gimple_phi_result (t))));
3630
3631       /* Only care about pointers and structures containing
3632          pointers.  */
3633       if (could_have_pointers (gimple_phi_result (t)))
3634         {
3635           size_t i;
3636           unsigned int j;
3637
3638           /* For a phi node, assign all the arguments to
3639              the result.  */
3640           get_constraint_for (gimple_phi_result (t), &lhsc);
3641           for (i = 0; i < gimple_phi_num_args (t); i++)
3642             {
3643               tree rhstype;
3644               tree strippedrhs = PHI_ARG_DEF (t, i);
3645
3646               STRIP_NOPS (strippedrhs);
3647               rhstype = TREE_TYPE (strippedrhs);
3648               get_constraint_for (gimple_phi_arg_def (t, i), &rhsc);
3649
3650               for (j = 0; VEC_iterate (ce_s, lhsc, j, c); j++)
3651                 {
3652                   struct constraint_expr *c2;
3653                   while (VEC_length (ce_s, rhsc) > 0)
3654                     {
3655                       c2 = VEC_last (ce_s, rhsc);
3656                       process_constraint (new_constraint (*c, *c2));
3657                       VEC_pop (ce_s, rhsc);
3658                     }
3659                 }
3660             }
3661         }
3662     }
3663   /* In IPA mode, we need to generate constraints to pass call
3664      arguments through their calls.   There are two cases,
3665      either a GIMPLE_CALL returning a value, or just a plain
3666      GIMPLE_CALL when we are not.
3667
3668      In non-ipa mode, we need to generate constraints for each
3669      pointer passed by address.  */
3670   else if (is_gimple_call (t))
3671     {
3672       tree fndecl = gimple_call_fndecl (t);
3673       if (fndecl != NULL_TREE
3674           && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
3675         /* ???  All builtins that are handled here need to be handled
3676            in the alias-oracle query functions explicitly!  */
3677         switch (DECL_FUNCTION_CODE (fndecl))
3678           {
3679           /* All the following functions return a pointer to the same object
3680              as their first argument points to.  The functions do not add
3681              to the ESCAPED solution.  The functions make the first argument
3682              pointed to memory point to what the second argument pointed to
3683              memory points to.  */
3684           case BUILT_IN_STRCPY:
3685           case BUILT_IN_STRNCPY:
3686           case BUILT_IN_BCOPY:
3687           case BUILT_IN_MEMCPY:
3688           case BUILT_IN_MEMMOVE:
3689           case BUILT_IN_MEMPCPY:
3690           case BUILT_IN_STPCPY:
3691           case BUILT_IN_STPNCPY:
3692           case BUILT_IN_STRCAT:
3693           case BUILT_IN_STRNCAT:
3694             {
3695               tree res = gimple_call_lhs (t);
3696               tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (fndecl)
3697                                                == BUILT_IN_BCOPY ? 1 : 0));
3698               tree src = gimple_call_arg (t, (DECL_FUNCTION_CODE (fndecl)
3699                                               == BUILT_IN_BCOPY ? 0 : 1));
3700               if (res != NULL_TREE)
3701                 {
3702                   get_constraint_for (res, &lhsc);
3703                   if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMPCPY
3704                       || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STPCPY
3705                       || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STPNCPY)
3706                     get_constraint_for_ptr_offset (dest, NULL_TREE, &rhsc);
3707                   else
3708                     get_constraint_for (dest, &rhsc);
3709                   process_all_all_constraints (lhsc, rhsc);
3710                   VEC_free (ce_s, heap, lhsc);
3711                   VEC_free (ce_s, heap, rhsc);
3712                 }
3713               get_constraint_for_ptr_offset (dest, NULL_TREE, &lhsc);
3714               get_constraint_for_ptr_offset (src, NULL_TREE, &rhsc);
3715               do_deref (&lhsc);
3716               do_deref (&rhsc);
3717               process_all_all_constraints (lhsc, rhsc);
3718               VEC_free (ce_s, heap, lhsc);
3719               VEC_free (ce_s, heap, rhsc);
3720               return;
3721             }
3722           case BUILT_IN_MEMSET:
3723             {
3724               tree res = gimple_call_lhs (t);
3725               tree dest = gimple_call_arg (t, 0);
3726               unsigned i;
3727               ce_s *lhsp;
3728               struct constraint_expr ac;
3729               if (res != NULL_TREE)
3730                 {
3731                   get_constraint_for (res, &lhsc);
3732                   get_constraint_for (dest, &rhsc);
3733                   process_all_all_constraints (lhsc, rhsc);
3734                   VEC_free (ce_s, heap, lhsc);
3735                   VEC_free (ce_s, heap, rhsc);
3736                 }
3737               get_constraint_for_ptr_offset (dest, NULL_TREE, &lhsc);
3738               do_deref (&lhsc);
3739               if (flag_delete_null_pointer_checks
3740                   && integer_zerop (gimple_call_arg (t, 1)))
3741                 {
3742                   ac.type = ADDRESSOF;
3743                   ac.var = nothing_id;
3744                 }
3745               else
3746                 {
3747                   ac.type = SCALAR;
3748                   ac.var = integer_id;
3749                 }
3750               ac.offset = 0;
3751               for (i = 0; VEC_iterate (ce_s, lhsc, i, lhsp); ++i)
3752                 process_constraint (new_constraint (*lhsp, ac));
3753               VEC_free (ce_s, heap, lhsc);
3754               return;
3755             }
3756           /* All the following functions do not return pointers, do not
3757              modify the points-to sets of memory reachable from their
3758              arguments and do not add to the ESCAPED solution.  */
3759           case BUILT_IN_SINCOS:
3760           case BUILT_IN_SINCOSF:
3761           case BUILT_IN_SINCOSL:
3762           case BUILT_IN_FREXP:
3763           case BUILT_IN_FREXPF:
3764           case BUILT_IN_FREXPL:
3765           case BUILT_IN_GAMMA_R:
3766           case BUILT_IN_GAMMAF_R:
3767           case BUILT_IN_GAMMAL_R:
3768           case BUILT_IN_LGAMMA_R:
3769           case BUILT_IN_LGAMMAF_R:
3770           case BUILT_IN_LGAMMAL_R:
3771           case BUILT_IN_MODF:
3772           case BUILT_IN_MODFF:
3773           case BUILT_IN_MODFL:
3774           case BUILT_IN_REMQUO:
3775           case BUILT_IN_REMQUOF:
3776           case BUILT_IN_REMQUOL:
3777           case BUILT_IN_FREE:
3778             return;
3779           /* printf-style functions may have hooks to set pointers to
3780              point to somewhere into the generated string.  Leave them
3781              for a later excercise...  */
3782           default:
3783             /* Fallthru to general call handling.  */;
3784           }
3785       if (!in_ipa_mode
3786           || (fndecl
3787               && !lookup_vi_for_tree (fndecl)))
3788         {
3789           VEC(ce_s, heap) *rhsc = NULL;
3790           int flags = gimple_call_flags (t);
3791
3792           /* Const functions can return their arguments and addresses
3793              of global memory but not of escaped memory.  */
3794           if (flags & (ECF_CONST|ECF_NOVOPS))
3795             {
3796               if (gimple_call_lhs (t)
3797                   && could_have_pointers (gimple_call_lhs (t)))
3798                 handle_const_call (t, &rhsc);
3799             }
3800           /* Pure functions can return addresses in and of memory
3801              reachable from their arguments, but they are not an escape
3802              point for reachable memory of their arguments.  */
3803           else if (flags & (ECF_PURE|ECF_LOOPING_CONST_OR_PURE))
3804             handle_pure_call (t, &rhsc);
3805           else
3806             handle_rhs_call (t, &rhsc);
3807           if (gimple_call_lhs (t)
3808               && could_have_pointers (gimple_call_lhs (t)))
3809             handle_lhs_call (gimple_call_lhs (t), flags, rhsc);
3810           VEC_free (ce_s, heap, rhsc);
3811         }
3812       else
3813         {
3814           tree lhsop;
3815           varinfo_t fi;
3816           int i = 1;
3817           size_t j;
3818           tree decl;
3819
3820           lhsop = gimple_call_lhs (t);
3821           decl = gimple_call_fndecl (t);
3822
3823           /* If we can directly resolve the function being called, do so.
3824              Otherwise, it must be some sort of indirect expression that
3825              we should still be able to handle.  */
3826           if (decl)
3827             fi = get_vi_for_tree (decl);
3828           else
3829             {
3830               decl = gimple_call_fn (t);
3831               fi = get_vi_for_tree (decl);
3832             }
3833
3834           /* Assign all the passed arguments to the appropriate incoming
3835              parameters of the function.  */
3836           for (j = 0; j < gimple_call_num_args (t); j++)
3837             {
3838               struct constraint_expr lhs ;
3839               struct constraint_expr *rhsp;
3840               tree arg = gimple_call_arg (t, j);
3841
3842               get_constraint_for (arg, &rhsc);
3843               if (TREE_CODE (decl) != FUNCTION_DECL)
3844                 {
3845                   lhs.type = DEREF;
3846                   lhs.var = fi->id;
3847                   lhs.offset = i;
3848                 }
3849               else
3850                 {
3851                   lhs.type = SCALAR;
3852                   lhs.var = first_vi_for_offset (fi, i)->id;
3853                   lhs.offset = 0;
3854                 }
3855               while (VEC_length (ce_s, rhsc) != 0)
3856                 {
3857                   rhsp = VEC_last (ce_s, rhsc);
3858                   process_constraint (new_constraint (lhs, *rhsp));
3859                   VEC_pop (ce_s, rhsc);
3860                 }
3861               i++;
3862             }
3863
3864           /* If we are returning a value, assign it to the result.  */
3865           if (lhsop)
3866             {
3867               struct constraint_expr rhs;
3868               struct constraint_expr *lhsp;
3869               unsigned int j = 0;
3870
3871               get_constraint_for (lhsop, &lhsc);
3872               if (TREE_CODE (decl) != FUNCTION_DECL)
3873                 {
3874                   rhs.type = DEREF;
3875                   rhs.var = fi->id;
3876                   rhs.offset = i;
3877                 }
3878               else
3879                 {
3880                   rhs.type = SCALAR;
3881                   rhs.var = first_vi_for_offset (fi, i)->id;
3882                   rhs.offset = 0;
3883                 }
3884               for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp); j++)
3885                 process_constraint (new_constraint (*lhsp, rhs));
3886             }
3887         }
3888     }
3889   /* Otherwise, just a regular assignment statement.  Only care about
3890      operations with pointer result, others are dealt with as escape
3891      points if they have pointer operands.  */
3892   else if (is_gimple_assign (t)
3893            && could_have_pointers (gimple_assign_lhs (t)))
3894     {
3895       /* Otherwise, just a regular assignment statement.  */
3896       tree lhsop = gimple_assign_lhs (t);
3897       tree rhsop = (gimple_num_ops (t) == 2) ? gimple_assign_rhs1 (t) : NULL;
3898
3899       if (rhsop && AGGREGATE_TYPE_P (TREE_TYPE (lhsop)))
3900         do_structure_copy (lhsop, rhsop);
3901       else
3902         {
3903           struct constraint_expr temp;
3904           get_constraint_for (lhsop, &lhsc);
3905
3906           if (gimple_assign_rhs_code (t) == POINTER_PLUS_EXPR)
3907             get_constraint_for_ptr_offset (gimple_assign_rhs1 (t),
3908                                            gimple_assign_rhs2 (t), &rhsc);
3909           else if ((CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (t))
3910                     && !(POINTER_TYPE_P (gimple_expr_type (t))
3911                          && !POINTER_TYPE_P (TREE_TYPE (rhsop))))
3912                    || gimple_assign_single_p (t))
3913             get_constraint_for (rhsop, &rhsc);
3914           else
3915             {
3916               temp.type = ADDRESSOF;
3917               temp.var = anything_id;
3918               temp.offset = 0;
3919               VEC_safe_push (ce_s, heap, rhsc, &temp);
3920             }
3921           process_all_all_constraints (lhsc, rhsc);
3922         }
3923       /* If there is a store to a global variable the rhs escapes.  */
3924       if ((lhsop = get_base_address (lhsop)) != NULL_TREE
3925           && DECL_P (lhsop)
3926           && is_global_var (lhsop))
3927         make_escape_constraint (rhsop);
3928       /* If this is a conversion of a non-restrict pointer to a
3929          restrict pointer track it with a new heapvar.  */
3930       else if (gimple_assign_cast_p (t)
3931                && POINTER_TYPE_P (TREE_TYPE (rhsop))
3932                && POINTER_TYPE_P (TREE_TYPE (lhsop))
3933                && !TYPE_RESTRICT (TREE_TYPE (rhsop))
3934                && TYPE_RESTRICT (TREE_TYPE (lhsop)))
3935         make_constraint_from_restrict (get_vi_for_tree (lhsop),
3936                                        "CAST_RESTRICT");
3937     }
3938   /* For conversions of pointers to non-pointers the pointer escapes.  */
3939   else if (gimple_assign_cast_p (t)
3940            && POINTER_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (t)))
3941            && !POINTER_TYPE_P (TREE_TYPE (gimple_assign_lhs (t))))
3942     {
3943       make_escape_constraint (gimple_assign_rhs1 (t));
3944     }
3945   /* Handle escapes through return.  */
3946   else if (gimple_code (t) == GIMPLE_RETURN
3947            && gimple_return_retval (t) != NULL_TREE
3948            && could_have_pointers (gimple_return_retval (t)))
3949     {
3950       make_escape_constraint (gimple_return_retval (t));
3951     }
3952   /* Handle asms conservatively by adding escape constraints to everything.  */
3953   else if (gimple_code (t) == GIMPLE_ASM)
3954     {
3955       unsigned i, noutputs;
3956       const char **oconstraints;
3957       const char *constraint;
3958       bool allows_mem, allows_reg, is_inout;
3959
3960       noutputs = gimple_asm_noutputs (t);
3961       oconstraints = XALLOCAVEC (const char *, noutputs);
3962
3963       for (i = 0; i < noutputs; ++i)
3964         {
3965           tree link = gimple_asm_output_op (t, i);
3966           tree op = TREE_VALUE (link);
3967
3968           constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3969           oconstraints[i] = constraint;
3970           parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
3971                                    &allows_reg, &is_inout);
3972
3973           /* A memory constraint makes the address of the operand escape.  */
3974           if (!allows_reg && allows_mem)
3975             make_escape_constraint (build_fold_addr_expr (op));
3976
3977           /* The asm may read global memory, so outputs may point to
3978              any global memory.  */
3979           if (op && could_have_pointers (op))
3980             {
3981               VEC(ce_s, heap) *lhsc = NULL;
3982               struct constraint_expr rhsc, *lhsp;
3983               unsigned j;
3984               get_constraint_for (op, &lhsc);
3985               rhsc.var = nonlocal_id;
3986               rhsc.offset = 0;
3987               rhsc.type = SCALAR;
3988               for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp); j++)
3989                 process_constraint (new_constraint (*lhsp, rhsc));
3990               VEC_free (ce_s, heap, lhsc);
3991             }
3992         }
3993       for (i = 0; i < gimple_asm_ninputs (t); ++i)
3994         {
3995           tree link = gimple_asm_input_op (t, i);
3996           tree op = TREE_VALUE (link);
3997
3998           constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3999
4000           parse_input_constraint (&constraint, 0, 0, noutputs, 0, oconstraints,
4001                                   &allows_mem, &allows_reg);
4002
4003           /* A memory constraint makes the address of the operand escape.  */
4004           if (!allows_reg && allows_mem)
4005             make_escape_constraint (build_fold_addr_expr (op));
4006           /* Strictly we'd only need the constraint to ESCAPED if
4007              the asm clobbers memory, otherwise using CALLUSED
4008              would be enough.  */
4009           else if (op && could_have_pointers (op))
4010             make_escape_constraint (op);
4011         }
4012     }
4013
4014   VEC_free (ce_s, heap, rhsc);
4015   VEC_free (ce_s, heap, lhsc);
4016 }
4017
4018
4019 /* Find the first varinfo in the same variable as START that overlaps with
4020    OFFSET.  Return NULL if we can't find one.  */
4021
4022 static varinfo_t
4023 first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset)
4024 {
4025   /* If the offset is outside of the variable, bail out.  */
4026   if (offset >= start->fullsize)
4027     return NULL;
4028
4029   /* If we cannot reach offset from start, lookup the first field
4030      and start from there.  */
4031   if (start->offset > offset)
4032     start = lookup_vi_for_tree (start->decl);
4033
4034   while (start)
4035     {
4036       /* We may not find a variable in the field list with the actual
4037          offset when when we have glommed a structure to a variable.
4038          In that case, however, offset should still be within the size
4039          of the variable. */
4040       if (offset >= start->offset
4041           && (offset - start->offset) < start->size)
4042         return start;
4043
4044       start= start->next;
4045     }
4046
4047   return NULL;
4048 }
4049
4050 /* Find the first varinfo in the same variable as START that overlaps with
4051    OFFSET.  If there is no such varinfo the varinfo directly preceding
4052    OFFSET is returned.  */
4053
4054 static varinfo_t
4055 first_or_preceding_vi_for_offset (varinfo_t start,
4056                                   unsigned HOST_WIDE_INT offset)
4057 {
4058   /* If we cannot reach offset from start, lookup the first field
4059      and start from there.  */
4060   if (start->offset > offset)
4061     start = lookup_vi_for_tree (start->decl);
4062
4063   /* We may not find a variable in the field list with the actual
4064      offset when when we have glommed a structure to a variable.
4065      In that case, however, offset should still be within the size
4066      of the variable.
4067      If we got beyond the offset we look for return the field
4068      directly preceding offset which may be the last field.  */
4069   while (start->next
4070          && offset >= start->offset
4071          && !((offset - start->offset) < start->size))
4072     start = start->next;
4073
4074   return start;
4075 }
4076
4077
4078 /* Insert the varinfo FIELD into the field list for BASE, at the front
4079    of the list.  */
4080
4081 static void
4082 insert_into_field_list (varinfo_t base, varinfo_t field)
4083 {
4084   varinfo_t prev = base;
4085   varinfo_t curr = base->next;
4086
4087   field->next = curr;
4088   prev->next = field;
4089 }
4090
4091 /* Insert the varinfo FIELD into the field list for BASE, ordered by
4092    offset.  */
4093
4094 static void
4095 insert_into_field_list_sorted (varinfo_t base, varinfo_t field)
4096 {
4097   varinfo_t prev = base;
4098   varinfo_t curr = base->next;
4099
4100   if (curr == NULL)
4101     {
4102       prev->next = field;
4103       field->next = NULL;
4104     }
4105   else
4106     {
4107       while (curr)
4108         {
4109           if (field->offset <= curr->offset)
4110             break;
4111           prev = curr;
4112           curr = curr->next;
4113         }
4114       field->next = prev->next;
4115       prev->next = field;
4116     }
4117 }
4118
4119 /* This structure is used during pushing fields onto the fieldstack
4120    to track the offset of the field, since bitpos_of_field gives it
4121    relative to its immediate containing type, and we want it relative
4122    to the ultimate containing object.  */
4123
4124 struct fieldoff
4125 {
4126   /* Offset from the base of the base containing object to this field.  */
4127   HOST_WIDE_INT offset;
4128
4129   /* Size, in bits, of the field.  */
4130   unsigned HOST_WIDE_INT size;
4131
4132   unsigned has_unknown_size : 1;
4133
4134   unsigned may_have_pointers : 1;
4135
4136   unsigned only_restrict_pointers : 1;
4137 };
4138 typedef struct fieldoff fieldoff_s;
4139
4140 DEF_VEC_O(fieldoff_s);
4141 DEF_VEC_ALLOC_O(fieldoff_s,heap);
4142
4143 /* qsort comparison function for two fieldoff's PA and PB */
4144
4145 static int
4146 fieldoff_compare (const void *pa, const void *pb)
4147 {
4148   const fieldoff_s *foa = (const fieldoff_s *)pa;
4149   const fieldoff_s *fob = (const fieldoff_s *)pb;
4150   unsigned HOST_WIDE_INT foasize, fobsize;
4151
4152   if (foa->offset < fob->offset)
4153     return -1;
4154   else if (foa->offset > fob->offset)
4155     return 1;
4156
4157   foasize = foa->size;
4158   fobsize = fob->size;
4159   if (foasize < fobsize)
4160     return -1;
4161   else if (foasize > fobsize)
4162     return 1;
4163   return 0;
4164 }
4165
4166 /* Sort a fieldstack according to the field offset and sizes.  */
4167 static void
4168 sort_fieldstack (VEC(fieldoff_s,heap) *fieldstack)
4169 {
4170   qsort (VEC_address (fieldoff_s, fieldstack),
4171          VEC_length (fieldoff_s, fieldstack),
4172          sizeof (fieldoff_s),
4173          fieldoff_compare);
4174 }
4175
4176 /* Return true if V is a tree that we can have subvars for.
4177    Normally, this is any aggregate type.  Also complex
4178    types which are not gimple registers can have subvars.  */
4179
4180 static inline bool
4181 var_can_have_subvars (const_tree v)
4182 {
4183   /* Volatile variables should never have subvars.  */
4184   if (TREE_THIS_VOLATILE (v))
4185     return false;
4186
4187   /* Non decls or memory tags can never have subvars.  */
4188   if (!DECL_P (v))
4189     return false;
4190
4191   /* Aggregates without overlapping fields can have subvars.  */
4192   if (TREE_CODE (TREE_TYPE (v)) == RECORD_TYPE)
4193     return true;
4194
4195   return false;
4196 }
4197
4198 /* Given a TYPE, and a vector of field offsets FIELDSTACK, push all
4199    the fields of TYPE onto fieldstack, recording their offsets along
4200    the way.
4201
4202    OFFSET is used to keep track of the offset in this entire
4203    structure, rather than just the immediately containing structure.
4204    Returns the number of fields pushed.  */
4205
4206 static int
4207 push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
4208                              HOST_WIDE_INT offset)
4209 {
4210   tree field;
4211   int count = 0;
4212
4213   if (TREE_CODE (type) != RECORD_TYPE)
4214     return 0;
4215
4216   /* If the vector of fields is growing too big, bail out early.
4217      Callers check for VEC_length <= MAX_FIELDS_FOR_FIELD_SENSITIVE, make
4218      sure this fails.  */
4219   if (VEC_length (fieldoff_s, *fieldstack) > MAX_FIELDS_FOR_FIELD_SENSITIVE)
4220     return 0;
4221
4222   for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4223     if (TREE_CODE (field) == FIELD_DECL)
4224       {
4225         bool push = false;
4226         int pushed = 0;
4227         HOST_WIDE_INT foff = bitpos_of_field (field);
4228
4229         if (!var_can_have_subvars (field)
4230             || TREE_CODE (TREE_TYPE (field)) == QUAL_UNION_TYPE
4231             || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
4232           push = true;
4233         else if (!(pushed = push_fields_onto_fieldstack
4234                    (TREE_TYPE (field), fieldstack, offset + foff))
4235                  && (DECL_SIZE (field)
4236                      && !integer_zerop (DECL_SIZE (field))))
4237           /* Empty structures may have actual size, like in C++.  So
4238              see if we didn't push any subfields and the size is
4239              nonzero, push the field onto the stack.  */
4240           push = true;
4241
4242         if (push)
4243           {
4244             fieldoff_s *pair = NULL;
4245             bool has_unknown_size = false;
4246
4247             if (!VEC_empty (fieldoff_s, *fieldstack))
4248               pair = VEC_last (fieldoff_s, *fieldstack);
4249
4250             if (!DECL_SIZE (field)
4251                 || !host_integerp (DECL_SIZE (field), 1))
4252               has_unknown_size = true;
4253
4254             /* If adjacent fields do not contain pointers merge them.  */
4255             if (pair
4256                 && !pair->may_have_pointers
4257                 && !could_have_pointers (field)
4258                 && !pair->has_unknown_size
4259                 && !has_unknown_size
4260                 && pair->offset + (HOST_WIDE_INT)pair->size == offset + foff)
4261               {
4262                 pair = VEC_last (fieldoff_s, *fieldstack);
4263                 pair->size += TREE_INT_CST_LOW (DECL_SIZE (field));
4264               }
4265             else
4266               {
4267                 pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
4268                 pair->offset = offset + foff;
4269                 pair->has_unknown_size = has_unknown_size;
4270                 if (!has_unknown_size)
4271                   pair->size = TREE_INT_CST_LOW (DECL_SIZE (field));
4272                 else
4273                   pair->size = -1;
4274                 pair->may_have_pointers = could_have_pointers (field);
4275                 pair->only_restrict_pointers
4276                   = (!has_unknown_size
4277                      && POINTER_TYPE_P (TREE_TYPE (field))
4278                      && TYPE_RESTRICT (TREE_TYPE (field)));
4279                 count++;
4280               }
4281           }
4282         else
4283           count += pushed;
4284       }
4285
4286   return count;
4287 }
4288
4289 /* Count the number of arguments DECL has, and set IS_VARARGS to true
4290    if it is a varargs function.  */
4291
4292 static unsigned int
4293 count_num_arguments (tree decl, bool *is_varargs)
4294 {
4295   unsigned int num = 0;
4296   tree t;
4297
4298   /* Capture named arguments for K&R functions.  They do not
4299      have a prototype and thus no TYPE_ARG_TYPES.  */
4300   for (t = DECL_ARGUMENTS (decl); t; t = TREE_CHAIN (t))
4301     ++num;
4302
4303   /* Check if the function has variadic arguments.  */
4304   for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); t; t = TREE_CHAIN (t))
4305     if (TREE_VALUE (t) == void_type_node)
4306       break;
4307   if (!t)
4308     *is_varargs = true;
4309
4310   return num;
4311 }
4312
4313 /* Creation function node for DECL, using NAME, and return the index
4314    of the variable we've created for the function.  */
4315
4316 static unsigned int
4317 create_function_info_for (tree decl, const char *name)
4318 {
4319   varinfo_t vi;
4320   tree arg;
4321   unsigned int i;
4322   bool is_varargs = false;
4323
4324   /* Create the variable info.  */
4325
4326   vi = new_var_info (decl, name);
4327   vi->offset = 0;
4328   vi->size = 1;
4329   vi->fullsize = count_num_arguments (decl, &is_varargs) + 1;
4330   insert_vi_for_tree (vi->decl, vi);
4331
4332   stats.total_vars++;
4333
4334   /* If it's varargs, we don't know how many arguments it has, so we
4335      can't do much.  */
4336   if (is_varargs)
4337     {
4338       vi->fullsize = ~0;
4339       vi->size = ~0;
4340       vi->is_unknown_size_var = true;
4341       return vi->id;
4342     }
4343
4344   arg = DECL_ARGUMENTS (decl);
4345
4346   /* Set up variables for each argument.  */
4347   for (i = 1; i < vi->fullsize; i++)
4348     {
4349       varinfo_t argvi;
4350       const char *newname;
4351       char *tempname;
4352       tree argdecl = decl;
4353
4354       if (arg)
4355         argdecl = arg;
4356
4357       asprintf (&tempname, "%s.arg%d", name, i-1);
4358       newname = ggc_strdup (tempname);
4359       free (tempname);
4360
4361       argvi = new_var_info (argdecl, newname);
4362       argvi->offset = i;
4363       argvi->size = 1;
4364       argvi->is_full_var = true;
4365       argvi->fullsize = vi->fullsize;
4366       insert_into_field_list_sorted (vi, argvi);
4367       stats.total_vars ++;
4368       if (arg)
4369         {
4370           insert_vi_for_tree (arg, argvi);
4371           arg = TREE_CHAIN (arg);
4372         }
4373     }
4374
4375   /* Create a variable for the return var.  */
4376   if (DECL_RESULT (decl) != NULL
4377       || !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
4378     {
4379       varinfo_t resultvi;
4380       const char *newname;
4381       char *tempname;
4382       tree resultdecl = decl;
4383
4384       vi->fullsize ++;
4385
4386       if (DECL_RESULT (decl))
4387         resultdecl = DECL_RESULT (decl);
4388
4389       asprintf (&tempname, "%s.result", name);
4390       newname = ggc_strdup (tempname);
4391       free (tempname);
4392
4393       resultvi = new_var_info (resultdecl, newname);
4394       resultvi->offset = i;
4395       resultvi->size = 1;
4396       resultvi->fullsize = vi->fullsize;
4397       resultvi->is_full_var = true;
4398       insert_into_field_list_sorted (vi, resultvi);
4399       stats.total_vars ++;
4400       if (DECL_RESULT (decl))
4401         insert_vi_for_tree (DECL_RESULT (decl), resultvi);
4402     }
4403
4404   return vi->id;
4405 }
4406
4407
4408 /* Return true if FIELDSTACK contains fields that overlap.
4409    FIELDSTACK is assumed to be sorted by offset.  */
4410
4411 static bool
4412 check_for_overlaps (VEC (fieldoff_s,heap) *fieldstack)
4413 {
4414   fieldoff_s *fo = NULL;
4415   unsigned int i;
4416   HOST_WIDE_INT lastoffset = -1;
4417
4418   for (i = 0; VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
4419     {
4420       if (fo->offset == lastoffset)
4421         return true;
4422       lastoffset = fo->offset;
4423     }
4424   return false;
4425 }
4426
4427 /* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
4428    This will also create any varinfo structures necessary for fields
4429    of DECL.  */
4430
4431 static unsigned int
4432 create_variable_info_for (tree decl, const char *name)
4433 {
4434   varinfo_t vi;
4435   tree decl_type = TREE_TYPE (decl);
4436   tree declsize = DECL_P (decl) ? DECL_SIZE (decl) : TYPE_SIZE (decl_type);
4437   VEC (fieldoff_s,heap) *fieldstack = NULL;
4438
4439   if (var_can_have_subvars (decl) && use_field_sensitive)
4440     push_fields_onto_fieldstack (decl_type, &fieldstack, 0);
4441
4442   /* If the variable doesn't have subvars, we may end up needing to
4443      sort the field list and create fake variables for all the
4444      fields.  */
4445   vi = new_var_info (decl, name);
4446   vi->offset = 0;
4447   vi->may_have_pointers = could_have_pointers (decl);
4448   if (!declsize
4449       || !host_integerp (declsize, 1))
4450     {
4451       vi->is_unknown_size_var = true;
4452       vi->fullsize = ~0;
4453       vi->size = ~0;
4454     }
4455   else
4456     {
4457       vi->fullsize = TREE_INT_CST_LOW (declsize);
4458       vi->size = vi->fullsize;
4459     }
4460
4461   insert_vi_for_tree (vi->decl, vi);
4462   if (vi->is_global_var
4463       && (!flag_whole_program || !in_ipa_mode)
4464       && vi->may_have_pointers)
4465     {
4466       if (POINTER_TYPE_P (TREE_TYPE (decl))
4467           && TYPE_RESTRICT (TREE_TYPE (decl)))
4468         make_constraint_from_restrict (vi, "GLOBAL_RESTRICT");
4469       make_copy_constraint (vi, nonlocal_id);
4470     }
4471
4472   stats.total_vars++;
4473   if (use_field_sensitive
4474       && !vi->is_unknown_size_var
4475       && var_can_have_subvars (decl)
4476       && VEC_length (fieldoff_s, fieldstack) > 1
4477       && VEC_length (fieldoff_s, fieldstack) <= MAX_FIELDS_FOR_FIELD_SENSITIVE)
4478     {
4479       fieldoff_s *fo = NULL;
4480       bool notokay = false;
4481       unsigned int i;
4482
4483       for (i = 0; !notokay && VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
4484         {
4485           if (fo->has_unknown_size
4486               || fo->offset < 0)
4487             {
4488               notokay = true;
4489               break;
4490             }
4491         }
4492
4493       /* We can't sort them if we have a field with a variable sized type,
4494          which will make notokay = true.  In that case, we are going to return
4495          without creating varinfos for the fields anyway, so sorting them is a
4496          waste to boot.  */
4497       if (!notokay)
4498         {
4499           sort_fieldstack (fieldstack);
4500           /* Due to some C++ FE issues, like PR 22488, we might end up
4501              what appear to be overlapping fields even though they,
4502              in reality, do not overlap.  Until the C++ FE is fixed,
4503              we will simply disable field-sensitivity for these cases.  */
4504           notokay = check_for_overlaps (fieldstack);
4505         }
4506
4507
4508       if (VEC_length (fieldoff_s, fieldstack) != 0)
4509         fo = VEC_index (fieldoff_s, fieldstack, 0);
4510
4511       if (fo == NULL || notokay)
4512         {
4513           vi->is_unknown_size_var = 1;
4514           vi->fullsize = ~0;
4515           vi->size = ~0;
4516           vi->is_full_var = true;
4517           VEC_free (fieldoff_s, heap, fieldstack);
4518           return vi->id;
4519         }
4520
4521       vi->size = fo->size;
4522       vi->offset = fo->offset;
4523       vi->may_have_pointers = fo->may_have_pointers;
4524       if (vi->is_global_var
4525           && (!flag_whole_program || !in_ipa_mode)
4526           && vi->may_have_pointers)
4527         {
4528           if (fo->only_restrict_pointers)
4529             make_constraint_from_restrict (vi, "GLOBAL_RESTRICT");
4530         }
4531       for (i = VEC_length (fieldoff_s, fieldstack) - 1;
4532            i >= 1 && VEC_iterate (fieldoff_s, fieldstack, i, fo);
4533            i--)
4534         {
4535           varinfo_t newvi;
4536           const char *newname = "NULL";
4537           char *tempname;
4538
4539           if (dump_file)
4540             {
4541               asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC
4542                         "+" HOST_WIDE_INT_PRINT_DEC,
4543                         vi->name, fo->offset, fo->size);
4544               newname = ggc_strdup (tempname);
4545               free (tempname);
4546             }
4547           newvi = new_var_info (decl, newname);
4548           newvi->offset = fo->offset;
4549           newvi->size = fo->size;
4550           newvi->fullsize = vi->fullsize;
4551           newvi->may_have_pointers = fo->may_have_pointers;
4552           insert_into_field_list (vi, newvi);
4553           if ((newvi->is_global_var || TREE_CODE (decl) == PARM_DECL)
4554               && newvi->may_have_pointers)
4555             {
4556                if (fo->only_restrict_pointers)
4557                  make_constraint_from_restrict (newvi, "GLOBAL_RESTRICT");
4558                if (newvi->is_global_var && !in_ipa_mode)
4559                  make_copy_constraint (newvi, nonlocal_id);
4560             }
4561
4562           stats.total_vars++;
4563         }
4564     }
4565   else
4566     vi->is_full_var = true;
4567
4568   VEC_free (fieldoff_s, heap, fieldstack);
4569
4570   return vi->id;
4571 }
4572
4573 /* Print out the points-to solution for VAR to FILE.  */
4574
4575 static void
4576 dump_solution_for_var (FILE *file, unsigned int var)
4577 {
4578   varinfo_t vi = get_varinfo (var);
4579   unsigned int i;
4580   bitmap_iterator bi;
4581
4582   if (find (var) != var)
4583     {
4584       varinfo_t vipt = get_varinfo (find (var));
4585       fprintf (file, "%s = same as %s\n", vi->name, vipt->name);
4586     }
4587   else
4588     {
4589       fprintf (file, "%s = { ", vi->name);
4590       EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
4591         {
4592           fprintf (file, "%s ", get_varinfo (i)->name);
4593         }
4594       fprintf (file, "}\n");
4595     }
4596 }
4597
4598 /* Print the points-to solution for VAR to stdout.  */
4599
4600 void
4601 debug_solution_for_var (unsigned int var)
4602 {
4603   dump_solution_for_var (stdout, var);
4604 }
4605
4606 /* Create varinfo structures for all of the variables in the
4607    function for intraprocedural mode.  */
4608
4609 static void
4610 intra_create_variable_infos (void)
4611 {
4612   tree t;
4613
4614   /* For each incoming pointer argument arg, create the constraint ARG
4615      = NONLOCAL or a dummy variable if flag_argument_noalias is set.  */
4616   for (t = DECL_ARGUMENTS (current_function_decl); t; t = TREE_CHAIN (t))
4617     {
4618       varinfo_t p;
4619
4620       if (!could_have_pointers (t))
4621         continue;
4622
4623       /* For restrict qualified pointers to objects passed by
4624          reference build a real representative for the pointed-to object.  */
4625       if (DECL_BY_REFERENCE (t)
4626           && POINTER_TYPE_P (TREE_TYPE (t))
4627           && TYPE_RESTRICT (TREE_TYPE (t)))
4628         {
4629           struct constraint_expr lhsc, rhsc;
4630           varinfo_t vi;
4631           tree heapvar = heapvar_lookup (t, 0);
4632           if (heapvar == NULL_TREE)
4633             {
4634               var_ann_t ann;
4635               heapvar = create_tmp_var_raw (TREE_TYPE (TREE_TYPE (t)),
4636                                             "PARM_NOALIAS");
4637               DECL_EXTERNAL (heapvar) = 1;
4638               heapvar_insert (t, 0, heapvar);
4639               ann = get_var_ann (heapvar);
4640               ann->is_heapvar = 1;
4641             }
4642           if (gimple_referenced_vars (cfun))
4643             add_referenced_var (heapvar);
4644           lhsc.var = get_vi_for_tree (t)->id;
4645           lhsc.type = SCALAR;
4646           lhsc.offset = 0;
4647           rhsc.var = (vi = get_vi_for_tree (heapvar))->id;
4648           rhsc.type = ADDRESSOF;
4649           rhsc.offset = 0;
4650           process_constraint (new_constraint (lhsc, rhsc));
4651           vi->is_restrict_var = 1;
4652           continue;
4653         }
4654
4655       for (p = get_vi_for_tree (t); p; p = p->next)
4656         if (p->may_have_pointers)
4657           make_constraint_from (p, nonlocal_id);
4658       if (POINTER_TYPE_P (TREE_TYPE (t))
4659           && TYPE_RESTRICT (TREE_TYPE (t)))
4660         make_constraint_from_restrict (get_vi_for_tree (t), "PARM_RESTRICT");
4661     }
4662
4663   /* Add a constraint for a result decl that is passed by reference.  */
4664   if (DECL_RESULT (cfun->decl)
4665       && DECL_BY_REFERENCE (DECL_RESULT (cfun->decl)))
4666     {
4667       varinfo_t p, result_vi = get_vi_for_tree (DECL_RESULT (cfun->decl));
4668
4669       for (p = result_vi; p; p = p->next)
4670         make_constraint_from (p, nonlocal_id);
4671     }
4672
4673   /* Add a constraint for the incoming static chain parameter.  */
4674   if (cfun->static_chain_decl != NULL_TREE)
4675     {
4676       varinfo_t p, chain_vi = get_vi_for_tree (cfun->static_chain_decl);
4677
4678       for (p = chain_vi; p; p = p->next)
4679         make_constraint_from (p, nonlocal_id);
4680     }
4681 }
4682
4683 /* Structure used to put solution bitmaps in a hashtable so they can
4684    be shared among variables with the same points-to set.  */
4685
4686 typedef struct shared_bitmap_info
4687 {
4688   bitmap pt_vars;
4689   hashval_t hashcode;
4690 } *shared_bitmap_info_t;
4691 typedef const struct shared_bitmap_info *const_shared_bitmap_info_t;
4692
4693 static htab_t shared_bitmap_table;
4694
4695 /* Hash function for a shared_bitmap_info_t */
4696
4697 static hashval_t
4698 shared_bitmap_hash (const void *p)
4699 {
4700   const_shared_bitmap_info_t const bi = (const_shared_bitmap_info_t) p;
4701   return bi->hashcode;
4702 }
4703
4704 /* Equality function for two shared_bitmap_info_t's. */
4705
4706 static int
4707 shared_bitmap_eq (const void *p1, const void *p2)
4708 {
4709   const_shared_bitmap_info_t const sbi1 = (const_shared_bitmap_info_t) p1;
4710   const_shared_bitmap_info_t const sbi2 = (const_shared_bitmap_info_t) p2;
4711   return bitmap_equal_p (sbi1->pt_vars, sbi2->pt_vars);
4712 }
4713
4714 /* Lookup a bitmap in the shared bitmap hashtable, and return an already
4715    existing instance if there is one, NULL otherwise.  */
4716
4717 static bitmap
4718 shared_bitmap_lookup (bitmap pt_vars)
4719 {
4720   void **slot;
4721   struct shared_bitmap_info sbi;
4722
4723   sbi.pt_vars = pt_vars;
4724   sbi.hashcode = bitmap_hash (pt_vars);
4725
4726   slot = htab_find_slot_with_hash (shared_bitmap_table, &sbi,
4727                                    sbi.hashcode, NO_INSERT);
4728   if (!slot)
4729     return NULL;
4730   else
4731     return ((shared_bitmap_info_t) *slot)->pt_vars;
4732 }
4733
4734
4735 /* Add a bitmap to the shared bitmap hashtable.  */
4736
4737 static void
4738 shared_bitmap_add (bitmap pt_vars)
4739 {
4740   void **slot;
4741   shared_bitmap_info_t sbi = XNEW (struct shared_bitmap_info);
4742
4743   sbi->pt_vars = pt_vars;
4744   sbi->hashcode = bitmap_hash (pt_vars);
4745
4746   slot = htab_find_slot_with_hash (shared_bitmap_table, sbi,
4747                                    sbi->hashcode, INSERT);
4748   gcc_assert (!*slot);
4749   *slot = (void *) sbi;
4750 }
4751
4752
4753 /* Set bits in INTO corresponding to the variable uids in solution set FROM.  */
4754
4755 static void 
4756 set_uids_in_ptset (bitmap into, bitmap from, struct pt_solution *pt)
4757 {
4758   unsigned int i;
4759   bitmap_iterator bi;
4760
4761   EXECUTE_IF_SET_IN_BITMAP (from, 0, i, bi)
4762     {
4763       varinfo_t vi = get_varinfo (i);
4764
4765       /* The only artificial variables that are allowed in a may-alias
4766          set are heap variables.  */
4767       if (vi->is_artificial_var && !vi->is_heap_var)
4768         continue;
4769
4770       if (TREE_CODE (vi->decl) == VAR_DECL
4771           || TREE_CODE (vi->decl) == PARM_DECL
4772           || TREE_CODE (vi->decl) == RESULT_DECL)
4773         {
4774           /* Add the decl to the points-to set.  Note that the points-to
4775              set contains global variables.  */
4776           bitmap_set_bit (into, DECL_UID (vi->decl));
4777           if (vi->is_global_var)
4778             pt->vars_contains_global = true;
4779         }
4780     }
4781 }
4782
4783
4784 /* Compute the points-to solution *PT for the variable VI.  */
4785
4786 static void
4787 find_what_var_points_to (varinfo_t vi, struct pt_solution *pt)
4788 {
4789   unsigned int i;
4790   bitmap_iterator bi;
4791   bitmap finished_solution;
4792   bitmap result;
4793
4794   memset (pt, 0, sizeof (struct pt_solution));
4795
4796   /* This variable may have been collapsed, let's get the real
4797      variable.  */
4798   vi = get_varinfo (find (vi->id));
4799
4800   /* Translate artificial variables into SSA_NAME_PTR_INFO
4801      attributes.  */
4802   EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
4803     {
4804       varinfo_t vi = get_varinfo (i);
4805
4806       if (vi->is_artificial_var)
4807         {
4808           if (vi->id == nothing_id)
4809             pt->null = 1;
4810           else if (vi->id == escaped_id)
4811             pt->escaped = 1;
4812           else if (vi->id == callused_id)
4813             gcc_unreachable ();
4814           else if (vi->id == nonlocal_id)
4815             pt->nonlocal = 1;
4816           else if (vi->is_heap_var)
4817             /* We represent heapvars in the points-to set properly.  */
4818             ;
4819           else if (vi->id == readonly_id)
4820             /* Nobody cares.  */
4821             ;
4822           else if (vi->id == anything_id
4823                    || vi->id == integer_id)
4824             pt->anything = 1;
4825         }
4826       if (vi->is_restrict_var)
4827         pt->vars_contains_restrict = true;
4828     }
4829
4830   /* Instead of doing extra work, simply do not create
4831      elaborate points-to information for pt_anything pointers.  */
4832   if (pt->anything
4833       && (vi->is_artificial_var
4834           || !pt->vars_contains_restrict))
4835     return;
4836
4837   /* Share the final set of variables when possible.  */
4838   finished_solution = BITMAP_GGC_ALLOC ();
4839   stats.points_to_sets_created++;
4840
4841   set_uids_in_ptset (finished_solution, vi->solution, pt);
4842   result = shared_bitmap_lookup (finished_solution);
4843   if (!result)
4844     {
4845       shared_bitmap_add (finished_solution);
4846       pt->vars = finished_solution;
4847     }
4848   else
4849     {
4850       pt->vars = result;
4851       bitmap_clear (finished_solution);
4852     }
4853 }
4854
4855 /* Given a pointer variable P, fill in its points-to set.  */
4856
4857 static void
4858 find_what_p_points_to (tree p)
4859 {
4860   struct ptr_info_def *pi;
4861   tree lookup_p = p;
4862   varinfo_t vi;
4863
4864   /* For parameters, get at the points-to set for the actual parm
4865      decl.  */
4866   if (TREE_CODE (p) == SSA_NAME
4867       && TREE_CODE (SSA_NAME_VAR (p)) == PARM_DECL
4868       && SSA_NAME_IS_DEFAULT_DEF (p))
4869     lookup_p = SSA_NAME_VAR (p);
4870
4871   vi = lookup_vi_for_tree (lookup_p);
4872   if (!vi)
4873     return;
4874
4875   pi = get_ptr_info (p);
4876   find_what_var_points_to (vi, &pi->pt);
4877 }
4878
4879
4880 /* Query statistics for points-to solutions.  */
4881
4882 static struct {
4883   unsigned HOST_WIDE_INT pt_solution_includes_may_alias;
4884   unsigned HOST_WIDE_INT pt_solution_includes_no_alias;
4885   unsigned HOST_WIDE_INT pt_solutions_intersect_may_alias;
4886   unsigned HOST_WIDE_INT pt_solutions_intersect_no_alias;
4887 } pta_stats;
4888
4889 void
4890 dump_pta_stats (FILE *s)
4891 {
4892   fprintf (s, "\nPTA query stats:\n");
4893   fprintf (s, "  pt_solution_includes: "
4894            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
4895            HOST_WIDE_INT_PRINT_DEC" queries\n",
4896            pta_stats.pt_solution_includes_no_alias,
4897            pta_stats.pt_solution_includes_no_alias
4898            + pta_stats.pt_solution_includes_may_alias);
4899   fprintf (s, "  pt_solutions_intersect: "
4900            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
4901            HOST_WIDE_INT_PRINT_DEC" queries\n",
4902            pta_stats.pt_solutions_intersect_no_alias,
4903            pta_stats.pt_solutions_intersect_no_alias
4904            + pta_stats.pt_solutions_intersect_may_alias);
4905 }
4906
4907
4908 /* Reset the points-to solution *PT to a conservative default
4909    (point to anything).  */
4910
4911 void
4912 pt_solution_reset (struct pt_solution *pt)
4913 {
4914   memset (pt, 0, sizeof (struct pt_solution));
4915   pt->anything = true;
4916 }
4917
4918 /* Set the points-to solution *PT to point only to the variables
4919    in VARS.  */
4920
4921 void
4922 pt_solution_set (struct pt_solution *pt, bitmap vars)
4923 {
4924   bitmap_iterator bi;
4925   unsigned i;
4926
4927   memset (pt, 0, sizeof (struct pt_solution));
4928   pt->vars = vars;
4929   EXECUTE_IF_SET_IN_BITMAP (vars, 0, i, bi)
4930     {
4931       tree var = referenced_var_lookup (i);
4932       if (is_global_var (var))
4933         {
4934           pt->vars_contains_global = true;
4935           break;
4936         }
4937     }
4938 }
4939
4940 /* Return true if the points-to solution *PT is empty.  */
4941
4942 static bool
4943 pt_solution_empty_p (struct pt_solution *pt)
4944 {
4945   if (pt->anything
4946       || pt->nonlocal)
4947     return false;
4948
4949   if (pt->vars
4950       && !bitmap_empty_p (pt->vars))
4951     return false;
4952
4953   /* If the solution includes ESCAPED, check if that is empty.  */
4954   if (pt->escaped
4955       && !pt_solution_empty_p (&cfun->gimple_df->escaped))
4956     return false;
4957
4958   return true;
4959 }
4960
4961 /* Return true if the points-to solution *PT includes global memory.  */
4962
4963 bool
4964 pt_solution_includes_global (struct pt_solution *pt)
4965 {
4966   if (pt->anything
4967       || pt->nonlocal
4968       || pt->vars_contains_global)
4969     return true;
4970
4971   if (pt->escaped)
4972     return pt_solution_includes_global (&cfun->gimple_df->escaped);
4973
4974   return false;
4975 }
4976
4977 /* Return true if the points-to solution *PT includes the variable
4978    declaration DECL.  */
4979
4980 static bool
4981 pt_solution_includes_1 (struct pt_solution *pt, const_tree decl)
4982 {
4983   if (pt->anything)
4984     return true;
4985
4986   if (pt->nonlocal
4987       && is_global_var (decl))
4988     return true;
4989
4990   if (pt->vars
4991       && bitmap_bit_p (pt->vars, DECL_UID (decl)))
4992     return true;
4993
4994   /* If the solution includes ESCAPED, check it.  */
4995   if (pt->escaped
4996       && pt_solution_includes_1 (&cfun->gimple_df->escaped, decl))
4997     return true;
4998
4999   return false;
5000 }
5001
5002 bool
5003 pt_solution_includes (struct pt_solution *pt, const_tree decl)
5004 {
5005   bool res = pt_solution_includes_1 (pt, decl);
5006   if (res)
5007     ++pta_stats.pt_solution_includes_may_alias;
5008   else
5009     ++pta_stats.pt_solution_includes_no_alias;
5010   return res;
5011 }
5012
5013 /* Return true if both points-to solutions PT1 and PT2 have a non-empty
5014    intersection.  */
5015
5016 static bool
5017 pt_solutions_intersect_1 (struct pt_solution *pt1, struct pt_solution *pt2)
5018 {
5019   if (pt1->anything || pt2->anything)
5020     return true;
5021
5022   /* If either points to unknown global memory and the other points to
5023      any global memory they alias.  */
5024   if ((pt1->nonlocal
5025        && (pt2->nonlocal
5026            || pt2->vars_contains_global))
5027       || (pt2->nonlocal
5028           && pt1->vars_contains_global))
5029     return true;
5030
5031   /* Check the escaped solution if required.  */
5032   if ((pt1->escaped || pt2->escaped)
5033       && !pt_solution_empty_p (&cfun->gimple_df->escaped))
5034     {
5035       /* If both point to escaped memory and that solution
5036          is not empty they alias.  */
5037       if (pt1->escaped && pt2->escaped)
5038         return true;
5039
5040       /* If either points to escaped memory see if the escaped solution
5041          intersects with the other.  */
5042       if ((pt1->escaped
5043            && pt_solutions_intersect_1 (&cfun->gimple_df->escaped, pt2))
5044           || (pt2->escaped
5045               && pt_solutions_intersect_1 (&cfun->gimple_df->escaped, pt1)))
5046         return true;
5047     }
5048
5049   /* Now both pointers alias if their points-to solution intersects.  */
5050   return (pt1->vars
5051           && pt2->vars
5052           && bitmap_intersect_p (pt1->vars, pt2->vars));
5053 }
5054
5055 bool
5056 pt_solutions_intersect (struct pt_solution *pt1, struct pt_solution *pt2)
5057 {
5058   bool res = pt_solutions_intersect_1 (pt1, pt2);
5059   if (res)
5060     ++pta_stats.pt_solutions_intersect_may_alias;
5061   else
5062     ++pta_stats.pt_solutions_intersect_no_alias;
5063   return res;
5064 }
5065
5066 /* Return true if both points-to solutions PT1 and PT2 for two restrict
5067    qualified pointers are possibly based on the same pointer.  */
5068
5069 bool
5070 pt_solutions_same_restrict_base (struct pt_solution *pt1,
5071                                  struct pt_solution *pt2)
5072 {
5073   /* If we deal with points-to solutions of two restrict qualified
5074      pointers solely rely on the pointed-to variable bitmap intersection.
5075      For two pointers that are based on each other the bitmaps will
5076      intersect.  */
5077   if (pt1->vars_contains_restrict
5078       && pt2->vars_contains_restrict)
5079     {
5080       gcc_assert (pt1->vars && pt2->vars);
5081       return bitmap_intersect_p (pt1->vars, pt2->vars);
5082     }
5083
5084   return true;
5085 }
5086
5087
5088 /* Dump points-to information to OUTFILE.  */
5089
5090 static void
5091 dump_sa_points_to_info (FILE *outfile)
5092 {
5093   unsigned int i;
5094
5095   fprintf (outfile, "\nPoints-to sets\n\n");
5096
5097   if (dump_flags & TDF_STATS)
5098     {
5099       fprintf (outfile, "Stats:\n");
5100       fprintf (outfile, "Total vars:               %d\n", stats.total_vars);
5101       fprintf (outfile, "Non-pointer vars:          %d\n",
5102                stats.nonpointer_vars);
5103       fprintf (outfile, "Statically unified vars:  %d\n",
5104                stats.unified_vars_static);
5105       fprintf (outfile, "Dynamically unified vars: %d\n",
5106                stats.unified_vars_dynamic);
5107       fprintf (outfile, "Iterations:               %d\n", stats.iterations);
5108       fprintf (outfile, "Number of edges:          %d\n", stats.num_edges);
5109       fprintf (outfile, "Number of implicit edges: %d\n",
5110                stats.num_implicit_edges);
5111     }
5112
5113   for (i = 0; i < VEC_length (varinfo_t, varmap); i++)
5114     dump_solution_for_var (outfile, i);
5115 }
5116
5117
5118 /* Debug points-to information to stderr.  */
5119
5120 void
5121 debug_sa_points_to_info (void)
5122 {
5123   dump_sa_points_to_info (stderr);
5124 }
5125
5126
5127 /* Initialize the always-existing constraint variables for NULL
5128    ANYTHING, READONLY, and INTEGER */
5129
5130 static void
5131 init_base_vars (void)
5132 {
5133   struct constraint_expr lhs, rhs;
5134   varinfo_t var_anything;
5135   varinfo_t var_nothing;
5136   varinfo_t var_readonly;
5137   varinfo_t var_escaped;
5138   varinfo_t var_nonlocal;
5139   varinfo_t var_callused;
5140   varinfo_t var_storedanything;
5141   varinfo_t var_integer;
5142
5143   /* Create the NULL variable, used to represent that a variable points
5144      to NULL.  */
5145   var_nothing = new_var_info (NULL_TREE, "NULL");
5146   gcc_assert (var_nothing->id == nothing_id);
5147   var_nothing->is_artificial_var = 1;
5148   var_nothing->offset = 0;
5149   var_nothing->size = ~0;
5150   var_nothing->fullsize = ~0;
5151   var_nothing->is_special_var = 1;
5152
5153   /* Create the ANYTHING variable, used to represent that a variable
5154      points to some unknown piece of memory.  */
5155   var_anything = new_var_info (NULL_TREE, "ANYTHING");
5156   gcc_assert (var_anything->id == anything_id);
5157   var_anything->is_artificial_var = 1;
5158   var_anything->size = ~0;
5159   var_anything->offset = 0;
5160   var_anything->next = NULL;
5161   var_anything->fullsize = ~0;
5162   var_anything->is_special_var = 1;
5163
5164   /* Anything points to anything.  This makes deref constraints just
5165      work in the presence of linked list and other p = *p type loops,
5166      by saying that *ANYTHING = ANYTHING. */
5167   lhs.type = SCALAR;
5168   lhs.var = anything_id;
5169   lhs.offset = 0;
5170   rhs.type = ADDRESSOF;
5171   rhs.var = anything_id;
5172   rhs.offset = 0;
5173
5174   /* This specifically does not use process_constraint because
5175      process_constraint ignores all anything = anything constraints, since all
5176      but this one are redundant.  */
5177   VEC_safe_push (constraint_t, heap, constraints, new_constraint (lhs, rhs));
5178
5179   /* Create the READONLY variable, used to represent that a variable
5180      points to readonly memory.  */
5181   var_readonly = new_var_info (NULL_TREE, "READONLY");
5182   gcc_assert (var_readonly->id == readonly_id);
5183   var_readonly->is_artificial_var = 1;
5184   var_readonly->offset = 0;
5185   var_readonly->size = ~0;
5186   var_readonly->fullsize = ~0;
5187   var_readonly->next = NULL;
5188   var_readonly->is_special_var = 1;
5189
5190   /* readonly memory points to anything, in order to make deref
5191      easier.  In reality, it points to anything the particular
5192      readonly variable can point to, but we don't track this
5193      separately. */
5194   lhs.type = SCALAR;
5195   lhs.var = readonly_id;
5196   lhs.offset = 0;
5197   rhs.type = ADDRESSOF;
5198   rhs.var = readonly_id;  /* FIXME */
5199   rhs.offset = 0;
5200   process_constraint (new_constraint (lhs, rhs));
5201
5202   /* Create the ESCAPED variable, used to represent the set of escaped
5203      memory.  */
5204   var_escaped = new_var_info (NULL_TREE, "ESCAPED");
5205   gcc_assert (var_escaped->id == escaped_id);
5206   var_escaped->is_artificial_var = 1;
5207   var_escaped->offset = 0;
5208   var_escaped->size = ~0;
5209   var_escaped->fullsize = ~0;
5210   var_escaped->is_special_var = 0;
5211
5212   /* Create the NONLOCAL variable, used to represent the set of nonlocal
5213      memory.  */
5214   var_nonlocal = new_var_info (NULL_TREE, "NONLOCAL");
5215   gcc_assert (var_nonlocal->id == nonlocal_id);
5216   var_nonlocal->is_artificial_var = 1;
5217   var_nonlocal->offset = 0;
5218   var_nonlocal->size = ~0;
5219   var_nonlocal->fullsize = ~0;
5220   var_nonlocal->is_special_var = 1;
5221
5222   /* ESCAPED = *ESCAPED, because escaped is may-deref'd at calls, etc.  */
5223   lhs.type = SCALAR;
5224   lhs.var = escaped_id;
5225   lhs.offset = 0;
5226   rhs.type = DEREF;
5227   rhs.var = escaped_id;
5228   rhs.offset = 0;
5229   process_constraint (new_constraint (lhs, rhs));
5230
5231   /* ESCAPED = ESCAPED + UNKNOWN_OFFSET, because if a sub-field escapes the
5232      whole variable escapes.  */
5233   lhs.type = SCALAR;
5234   lhs.var = escaped_id;
5235   lhs.offset = 0;
5236   rhs.type = SCALAR;
5237   rhs.var = escaped_id;
5238   rhs.offset = UNKNOWN_OFFSET;
5239   process_constraint (new_constraint (lhs, rhs));
5240
5241   /* *ESCAPED = NONLOCAL.  This is true because we have to assume
5242      everything pointed to by escaped points to what global memory can
5243      point to.  */
5244   lhs.type = DEREF;
5245   lhs.var = escaped_id;
5246   lhs.offset = 0;
5247   rhs.type = SCALAR;
5248   rhs.var = nonlocal_id;
5249   rhs.offset = 0;
5250   process_constraint (new_constraint (lhs, rhs));
5251
5252   /* NONLOCAL = &NONLOCAL, NONLOCAL = &ESCAPED.  This is true because
5253      global memory may point to global memory and escaped memory.  */
5254   lhs.type = SCALAR;
5255   lhs.var = nonlocal_id;
5256   lhs.offset = 0;
5257   rhs.type = ADDRESSOF;
5258   rhs.var = nonlocal_id;
5259   rhs.offset = 0;
5260   process_constraint (new_constraint (lhs, rhs));
5261   rhs.type = ADDRESSOF;
5262   rhs.var = escaped_id;
5263   rhs.offset = 0;
5264   process_constraint (new_constraint (lhs, rhs));
5265
5266   /* Create the CALLUSED variable, used to represent the set of call-used
5267      memory.  */
5268   var_callused = new_var_info (NULL_TREE, "CALLUSED");
5269   gcc_assert (var_callused->id == callused_id);
5270   var_callused->is_artificial_var = 1;
5271   var_callused->offset = 0;
5272   var_callused->size = ~0;
5273   var_callused->fullsize = ~0;
5274   var_callused->is_special_var = 0;
5275
5276   /* CALLUSED = *CALLUSED, because call-used is may-deref'd at calls, etc.  */
5277   lhs.type = SCALAR;
5278   lhs.var = callused_id;
5279   lhs.offset = 0;
5280   rhs.type = DEREF;
5281   rhs.var = callused_id;
5282   rhs.offset = 0;
5283   process_constraint (new_constraint (lhs, rhs));
5284
5285   /* CALLUSED = CALLUSED + UNKNOWN, because if a sub-field is call-used the
5286      whole variable is call-used.  */
5287   lhs.type = SCALAR;
5288   lhs.var = callused_id;
5289   lhs.offset = 0;
5290   rhs.type = SCALAR;
5291   rhs.var = callused_id;
5292   rhs.offset = UNKNOWN_OFFSET;
5293   process_constraint (new_constraint (lhs, rhs));
5294
5295   /* Create the STOREDANYTHING variable, used to represent the set of
5296      variables stored to *ANYTHING.  */
5297   var_storedanything = new_var_info (NULL_TREE, "STOREDANYTHING");
5298   gcc_assert (var_storedanything->id == storedanything_id);
5299   var_storedanything->is_artificial_var = 1;
5300   var_storedanything->offset = 0;
5301   var_storedanything->size = ~0;
5302   var_storedanything->fullsize = ~0;
5303   var_storedanything->is_special_var = 0;
5304
5305   /* Create the INTEGER variable, used to represent that a variable points
5306      to what an INTEGER "points to".  */
5307   var_integer = new_var_info (NULL_TREE, "INTEGER");
5308   gcc_assert (var_integer->id == integer_id);
5309   var_integer->is_artificial_var = 1;
5310   var_integer->size = ~0;
5311   var_integer->fullsize = ~0;
5312   var_integer->offset = 0;
5313   var_integer->next = NULL;
5314   var_integer->is_special_var = 1;
5315
5316   /* INTEGER = ANYTHING, because we don't know where a dereference of
5317      a random integer will point to.  */
5318   lhs.type = SCALAR;
5319   lhs.var = integer_id;
5320   lhs.offset = 0;
5321   rhs.type = ADDRESSOF;
5322   rhs.var = anything_id;
5323   rhs.offset = 0;
5324   process_constraint (new_constraint (lhs, rhs));
5325 }
5326
5327 /* Initialize things necessary to perform PTA */
5328
5329 static void
5330 init_alias_vars (void)
5331 {
5332   use_field_sensitive = (MAX_FIELDS_FOR_FIELD_SENSITIVE > 1);
5333
5334   bitmap_obstack_initialize (&pta_obstack);
5335   bitmap_obstack_initialize (&oldpta_obstack);
5336   bitmap_obstack_initialize (&predbitmap_obstack);
5337
5338   constraint_pool = create_alloc_pool ("Constraint pool",
5339                                        sizeof (struct constraint), 30);
5340   variable_info_pool = create_alloc_pool ("Variable info pool",
5341                                           sizeof (struct variable_info), 30);
5342   constraints = VEC_alloc (constraint_t, heap, 8);
5343   varmap = VEC_alloc (varinfo_t, heap, 8);
5344   vi_for_tree = pointer_map_create ();
5345
5346   memset (&stats, 0, sizeof (stats));
5347   shared_bitmap_table = htab_create (511, shared_bitmap_hash,
5348                                      shared_bitmap_eq, free);
5349   init_base_vars ();
5350 }
5351
5352 /* Remove the REF and ADDRESS edges from GRAPH, as well as all the
5353    predecessor edges.  */
5354
5355 static void
5356 remove_preds_and_fake_succs (constraint_graph_t graph)
5357 {
5358   unsigned int i;
5359
5360   /* Clear the implicit ref and address nodes from the successor
5361      lists.  */
5362   for (i = 0; i < FIRST_REF_NODE; i++)
5363     {
5364       if (graph->succs[i])
5365         bitmap_clear_range (graph->succs[i], FIRST_REF_NODE,
5366                             FIRST_REF_NODE * 2);
5367     }
5368
5369   /* Free the successor list for the non-ref nodes.  */
5370   for (i = FIRST_REF_NODE; i < graph->size; i++)
5371     {
5372       if (graph->succs[i])
5373         BITMAP_FREE (graph->succs[i]);
5374     }
5375
5376   /* Now reallocate the size of the successor list as, and blow away
5377      the predecessor bitmaps.  */
5378   graph->size = VEC_length (varinfo_t, varmap);
5379   graph->succs = XRESIZEVEC (bitmap, graph->succs, graph->size);
5380
5381   free (graph->implicit_preds);
5382   graph->implicit_preds = NULL;
5383   free (graph->preds);
5384   graph->preds = NULL;
5385   bitmap_obstack_release (&predbitmap_obstack);
5386 }
5387
5388 /* Initialize the heapvar for statement mapping.  */
5389
5390 static void
5391 init_alias_heapvars (void)
5392 {
5393   if (!heapvar_for_stmt)
5394     heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, heapvar_map_eq,
5395                                         NULL);
5396 }
5397
5398 /* Delete the heapvar for statement mapping.  */
5399
5400 void
5401 delete_alias_heapvars (void)
5402 {
5403   if (heapvar_for_stmt)
5404     htab_delete (heapvar_for_stmt);
5405   heapvar_for_stmt = NULL;
5406 }
5407
5408 /* Solve the constraint set.  */
5409
5410 static void
5411 solve_constraints (void)
5412 {
5413   struct scc_info *si;
5414
5415   if (dump_file)
5416     {
5417       fprintf (dump_file, "Points-to analysis\n\nConstraints:\n\n");
5418       dump_constraints (dump_file);
5419     }
5420
5421   if (dump_file)
5422     fprintf (dump_file,
5423              "\nCollapsing static cycles and doing variable "
5424              "substitution\n");
5425
5426   init_graph (VEC_length (varinfo_t, varmap) * 2);
5427   
5428   if (dump_file)
5429     fprintf (dump_file, "Building predecessor graph\n");
5430   build_pred_graph ();
5431   
5432   if (dump_file)
5433     fprintf (dump_file, "Detecting pointer and location "
5434              "equivalences\n");
5435   si = perform_var_substitution (graph);
5436   
5437   if (dump_file)
5438     fprintf (dump_file, "Rewriting constraints and unifying "
5439              "variables\n");
5440   rewrite_constraints (graph, si);
5441
5442   build_succ_graph ();
5443   free_var_substitution_info (si);
5444
5445   if (dump_file && (dump_flags & TDF_GRAPH))
5446     dump_constraint_graph (dump_file);
5447
5448   move_complex_constraints (graph);
5449
5450   if (dump_file)
5451     fprintf (dump_file, "Uniting pointer but not location equivalent "
5452              "variables\n");
5453   unite_pointer_equivalences (graph);
5454
5455   if (dump_file)
5456     fprintf (dump_file, "Finding indirect cycles\n");
5457   find_indirect_cycles (graph);
5458
5459   /* Implicit nodes and predecessors are no longer necessary at this
5460      point. */
5461   remove_preds_and_fake_succs (graph);
5462
5463   if (dump_file)
5464     fprintf (dump_file, "Solving graph\n");
5465
5466   solve_graph (graph);
5467
5468   if (dump_file)
5469     dump_sa_points_to_info (dump_file);
5470 }
5471
5472 /* Create points-to sets for the current function.  See the comments
5473    at the start of the file for an algorithmic overview.  */
5474
5475 static void
5476 compute_points_to_sets (void)
5477 {
5478   basic_block bb;
5479   unsigned i;
5480   varinfo_t vi;
5481
5482   timevar_push (TV_TREE_PTA);
5483
5484   init_alias_vars ();
5485   init_alias_heapvars ();
5486
5487   intra_create_variable_infos ();
5488
5489   /* Now walk all statements and derive aliases.  */
5490   FOR_EACH_BB (bb)
5491     {
5492       gimple_stmt_iterator gsi;
5493
5494       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5495         {
5496           gimple phi = gsi_stmt (gsi);
5497
5498           if (is_gimple_reg (gimple_phi_result (phi)))
5499             find_func_aliases (phi);
5500         }
5501
5502       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5503         {
5504           gimple stmt = gsi_stmt (gsi);
5505
5506           find_func_aliases (stmt);
5507         }
5508     }
5509
5510   /* From the constraints compute the points-to sets.  */
5511   solve_constraints ();
5512
5513   /* Compute the points-to sets for ESCAPED and CALLUSED used for
5514      call-clobber analysis.  */
5515   find_what_var_points_to (get_varinfo (escaped_id),
5516                            &cfun->gimple_df->escaped);
5517   find_what_var_points_to (get_varinfo (callused_id),
5518                            &cfun->gimple_df->callused);
5519
5520   /* Make sure the ESCAPED solution (which is used as placeholder in
5521      other solutions) does not reference itself.  This simplifies
5522      points-to solution queries.  */
5523   cfun->gimple_df->escaped.escaped = 0;
5524
5525   /* Mark escaped HEAP variables as global.  */
5526   for (i = 0; VEC_iterate (varinfo_t, varmap, i, vi); ++i)
5527     if (vi->is_heap_var
5528         && !vi->is_restrict_var
5529         && !vi->is_global_var)
5530       DECL_EXTERNAL (vi->decl) = vi->is_global_var
5531         = pt_solution_includes (&cfun->gimple_df->escaped, vi->decl);
5532
5533   /* Compute the points-to sets for pointer SSA_NAMEs.  */
5534   for (i = 0; i < num_ssa_names; ++i)
5535     {
5536       tree ptr = ssa_name (i);
5537       if (ptr
5538           && POINTER_TYPE_P (TREE_TYPE (ptr)))
5539         find_what_p_points_to (ptr);
5540     }
5541
5542   timevar_pop (TV_TREE_PTA);
5543 }
5544
5545
5546 /* Delete created points-to sets.  */
5547
5548 static void
5549 delete_points_to_sets (void)
5550 {
5551   unsigned int i;
5552
5553   htab_delete (shared_bitmap_table);
5554   if (dump_file && (dump_flags & TDF_STATS))
5555     fprintf (dump_file, "Points to sets created:%d\n",
5556              stats.points_to_sets_created);
5557
5558   pointer_map_destroy (vi_for_tree);
5559   bitmap_obstack_release (&pta_obstack);
5560   VEC_free (constraint_t, heap, constraints);
5561
5562   for (i = 0; i < graph->size; i++)
5563     VEC_free (constraint_t, heap, graph->complex[i]);
5564   free (graph->complex);
5565
5566   free (graph->rep);
5567   free (graph->succs);
5568   free (graph->pe);
5569   free (graph->pe_rep);
5570   free (graph->indirect_cycles);
5571   free (graph);
5572
5573   VEC_free (varinfo_t, heap, varmap);
5574   free_alloc_pool (variable_info_pool);
5575   free_alloc_pool (constraint_pool);
5576 }
5577
5578
5579 /* Compute points-to information for every SSA_NAME pointer in the
5580    current function and compute the transitive closure of escaped
5581    variables to re-initialize the call-clobber states of local variables.  */
5582
5583 unsigned int
5584 compute_may_aliases (void)
5585 {
5586   /* For each pointer P_i, determine the sets of variables that P_i may
5587      point-to.  Compute the reachability set of escaped and call-used
5588      variables.  */
5589   compute_points_to_sets ();
5590
5591   /* Debugging dumps.  */
5592   if (dump_file)
5593     {
5594       dump_alias_info (dump_file);
5595
5596       if (dump_flags & TDF_DETAILS)
5597         dump_referenced_vars (dump_file);
5598     }
5599
5600   /* Deallocate memory used by aliasing data structures and the internal
5601      points-to solution.  */
5602   delete_points_to_sets ();
5603
5604   gcc_assert (!need_ssa_update_p (cfun));
5605
5606   return 0;
5607 }
5608
5609 static bool
5610 gate_tree_pta (void)
5611 {
5612   return flag_tree_pta;
5613 }
5614
5615 /* A dummy pass to cause points-to information to be computed via
5616    TODO_rebuild_alias.  */
5617
5618 struct gimple_opt_pass pass_build_alias =
5619 {
5620  {
5621   GIMPLE_PASS,
5622   "alias",                  /* name */
5623   gate_tree_pta,            /* gate */
5624   NULL,                     /* execute */
5625   NULL,                     /* sub */
5626   NULL,                     /* next */
5627   0,                        /* static_pass_number */
5628   TV_NONE,                  /* tv_id */
5629   PROP_cfg | PROP_ssa,      /* properties_required */
5630   0,                        /* properties_provided */
5631   0,                        /* properties_destroyed */
5632   0,                        /* todo_flags_start */
5633   TODO_rebuild_alias | TODO_dump_func  /* todo_flags_finish */
5634  }
5635 };
5636
5637 /* A dummy pass to cause points-to information to be computed via
5638    TODO_rebuild_alias.  */
5639
5640 struct gimple_opt_pass pass_build_ealias =
5641 {
5642  {
5643   GIMPLE_PASS,
5644   "ealias",                 /* name */
5645   gate_tree_pta,            /* gate */
5646   NULL,                     /* execute */
5647   NULL,                     /* sub */
5648   NULL,                     /* next */
5649   0,                        /* static_pass_number */
5650   TV_NONE,                  /* tv_id */
5651   PROP_cfg | PROP_ssa,      /* properties_required */
5652   0,                        /* properties_provided */
5653   0,                        /* properties_destroyed */
5654   0,                        /* todo_flags_start */
5655   TODO_rebuild_alias | TODO_dump_func  /* todo_flags_finish */
5656  }
5657 };
5658
5659
5660 /* Return true if we should execute IPA PTA.  */
5661 static bool
5662 gate_ipa_pta (void)
5663 {
5664   return (optimize
5665           && flag_ipa_pta
5666           /* Don't bother doing anything if the program has errors.  */
5667           && !(errorcount || sorrycount));
5668 }
5669
5670 /* Execute the driver for IPA PTA.  */
5671 static unsigned int
5672 ipa_pta_execute (void)
5673 {
5674   struct cgraph_node *node;
5675
5676   in_ipa_mode = 1;
5677
5678   init_alias_heapvars ();
5679   init_alias_vars ();
5680
5681   /* Build the constraints.  */
5682   for (node = cgraph_nodes; node; node = node->next)
5683     {
5684       unsigned int varid;
5685
5686       /* Nodes without a body are not interesting.  Especially do not
5687          visit clones at this point for now - we get duplicate decls
5688          there for inline clones at least.  */
5689       if (!gimple_has_body_p (node->decl)
5690           || node->clone_of)
5691         continue;
5692
5693       /* It does not make sense to have graph edges into or out of
5694          externally visible functions.  There is no extra information
5695          we can gather from them.  */
5696       if (node->local.externally_visible)
5697         continue;
5698
5699       varid = create_function_info_for (node->decl,
5700                                         cgraph_node_name (node));
5701     }
5702
5703   for (node = cgraph_nodes; node; node = node->next)
5704     {
5705       struct function *func;
5706       basic_block bb;
5707       tree old_func_decl;
5708
5709       /* Nodes without a body are not interesting.  */
5710       if (!gimple_has_body_p (node->decl)
5711           || node->clone_of)
5712         continue;
5713
5714       if (dump_file)
5715         fprintf (dump_file,
5716                  "Generating constraints for %s\n",
5717                  cgraph_node_name (node));
5718
5719       func = DECL_STRUCT_FUNCTION (node->decl);
5720       old_func_decl = current_function_decl;
5721       push_cfun (func);
5722       current_function_decl = node->decl;
5723
5724       /* For externally visible functions use local constraints for
5725          their arguments.  For local functions we see all callers
5726          and thus do not need initial constraints for parameters.  */
5727       if (node->local.externally_visible)
5728         intra_create_variable_infos ();
5729
5730       /* Build constriants for the function body.  */
5731       FOR_EACH_BB_FN (bb, func)
5732         {
5733           gimple_stmt_iterator gsi;
5734
5735           for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
5736                gsi_next (&gsi))
5737             {
5738               gimple phi = gsi_stmt (gsi);
5739
5740               if (is_gimple_reg (gimple_phi_result (phi)))
5741                 find_func_aliases (phi);
5742             }
5743
5744           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5745             {
5746               gimple stmt = gsi_stmt (gsi);
5747
5748               find_func_aliases (stmt);
5749             }
5750         }
5751
5752       current_function_decl = old_func_decl;
5753       pop_cfun ();
5754     }
5755
5756   /* From the constraints compute the points-to sets.  */
5757   solve_constraints ();
5758
5759   delete_points_to_sets ();
5760
5761   in_ipa_mode = 0;
5762
5763   return 0;
5764 }
5765
5766 struct simple_ipa_opt_pass pass_ipa_pta =
5767 {
5768  {
5769   SIMPLE_IPA_PASS,
5770   "pta",                                /* name */
5771   gate_ipa_pta,                 /* gate */
5772   ipa_pta_execute,                      /* execute */
5773   NULL,                                 /* sub */
5774   NULL,                                 /* next */
5775   0,                                    /* static_pass_number */
5776   TV_IPA_PTA,                   /* tv_id */
5777   0,                                    /* properties_required */
5778   0,                                    /* properties_provided */
5779   0,                                    /* properties_destroyed */
5780   0,                                    /* todo_flags_start */
5781   TODO_update_ssa                       /* todo_flags_finish */
5782  }
5783 };
5784
5785
5786 #include "gt-tree-ssa-structalias.h"