OSDN Git Service

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