OSDN Git Service

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