OSDN Git Service

2010-07-29 Tobias Burnus <burnus@net-b.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 "diagnostic-core.h"
36 #include "toplev.h"
37 #include "gimple.h"
38 #include "hashtab.h"
39 #include "function.h"
40 #include "cgraph.h"
41 #include "tree-pass.h"
42 #include "timevar.h"
43 #include "alloc-pool.h"
44 #include "splay-tree.h"
45 #include "params.h"
46 #include "cgraph.h"
47 #include "alias.h"
48 #include "pointer-set.h"
49
50 /* The idea behind this analyzer is to generate set constraints from the
51    program, then solve the resulting constraints in order to generate the
52    points-to sets.
53
54    Set constraints are a way of modeling program analysis problems that
55    involve sets.  They consist of an inclusion constraint language,
56    describing the variables (each variable is a set) and operations that
57    are involved on the variables, and a set of rules that derive facts
58    from these operations.  To solve a system of set constraints, you derive
59    all possible facts under the rules, which gives you the correct sets
60    as a consequence.
61
62    See  "Efficient Field-sensitive pointer analysis for C" by "David
63    J. Pearce and Paul H. J. Kelly and Chris Hankin, at
64    http://citeseer.ist.psu.edu/pearce04efficient.html
65
66    Also see "Ultra-fast Aliasing Analysis using CLA: A Million Lines
67    of C Code in a Second" by ""Nevin Heintze and Olivier Tardieu" at
68    http://citeseer.ist.psu.edu/heintze01ultrafast.html
69
70    There are three types of real constraint expressions, DEREF,
71    ADDRESSOF, and SCALAR.  Each constraint expression consists
72    of a constraint type, a variable, and an offset.
73
74    SCALAR is a constraint expression type used to represent x, whether
75    it appears on the LHS or the RHS of a statement.
76    DEREF is a constraint expression type used to represent *x, whether
77    it appears on the LHS or the RHS of a statement.
78    ADDRESSOF is a constraint expression used to represent &x, whether
79    it appears on the LHS or the RHS of a statement.
80
81    Each pointer variable in the program is assigned an integer id, and
82    each field of a structure variable is assigned an integer id as well.
83
84    Structure variables are linked to their list of fields through a "next
85    field" in each variable that points to the next field in offset
86    order.
87    Each variable for a structure field has
88
89    1. "size", that tells the size in bits of that field.
90    2. "fullsize, that tells the size in bits of the entire structure.
91    3. "offset", that tells the offset in bits from the beginning of the
92    structure to this field.
93
94    Thus,
95    struct f
96    {
97      int a;
98      int b;
99    } foo;
100    int *bar;
101
102    looks like
103
104    foo.a -> id 1, size 32, offset 0, fullsize 64, next foo.b
105    foo.b -> id 2, size 32, offset 32, fullsize 64, next NULL
106    bar -> id 3, size 32, offset 0, fullsize 32, next NULL
107
108
109   In order to solve the system of set constraints, the following is
110   done:
111
112   1. Each constraint variable x has a solution set associated with it,
113   Sol(x).
114
115   2. Constraints are separated into direct, copy, and complex.
116   Direct constraints are ADDRESSOF constraints that require no extra
117   processing, such as P = &Q
118   Copy constraints are those of the form P = Q.
119   Complex constraints are all the constraints involving dereferences
120   and offsets (including offsetted copies).
121
122   3. All direct constraints of the form P = &Q are processed, such
123   that Q is added to Sol(P)
124
125   4. All complex constraints for a given constraint variable are stored in a
126   linked list attached to that variable's node.
127
128   5. A directed graph is built out of the copy constraints. Each
129   constraint variable is a node in the graph, and an edge from
130   Q to P is added for each copy constraint of the form P = Q
131
132   6. The graph is then walked, and solution sets are
133   propagated along the copy edges, such that an edge from Q to P
134   causes Sol(P) <- Sol(P) union Sol(Q).
135
136   7.  As we visit each node, all complex constraints associated with
137   that node are processed by adding appropriate copy edges to the graph, or the
138   appropriate variables to the solution set.
139
140   8. The process of walking the graph is iterated until no solution
141   sets change.
142
143   Prior to walking the graph in steps 6 and 7, We perform static
144   cycle elimination on the constraint graph, as well
145   as off-line variable substitution.
146
147   TODO: Adding offsets to pointer-to-structures can be handled (IE not punted
148   on and turned into anything), but isn't.  You can just see what offset
149   inside the pointed-to struct it's going to access.
150
151   TODO: Constant bounded arrays can be handled as if they were structs of the
152   same number of elements.
153
154   TODO: Modeling heap and incoming pointers becomes much better if we
155   add fields to them as we discover them, which we could do.
156
157   TODO: We could handle unions, but to be honest, it's probably not
158   worth the pain or slowdown.  */
159
160 /* IPA-PTA optimizations possible.
161
162    When the indirect function called is ANYTHING we can add disambiguation
163    based on the function signatures (or simply the parameter count which
164    is the varinfo size).  We also do not need to consider functions that
165    do not have their address taken.
166
167    The is_global_var bit which marks escape points is overly conservative
168    in IPA mode.  Split it to is_escape_point and is_global_var - only
169    externally visible globals are escape points in IPA mode.  This is
170    also needed to fix the pt_solution_includes_global predicate
171    (and thus ptr_deref_may_alias_global_p).
172
173    The way we introduce DECL_PT_UID to avoid fixing up all points-to
174    sets in the translation unit when we copy a DECL during inlining
175    pessimizes precision.  The advantage is that the DECL_PT_UID keeps
176    compile-time and memory usage overhead low - the points-to sets
177    do not grow or get unshared as they would during a fixup phase.
178    An alternative solution is to delay IPA PTA until after all
179    inlining transformations have been applied.
180
181    The way we propagate clobber/use information isn't optimized.
182    It should use a new complex constraint that properly filters
183    out local variables of the callee (though that would make
184    the sets invalid after inlining).  OTOH we might as well
185    admit defeat to WHOPR and simply do all the clobber/use analysis
186    and propagation after PTA finished but before we threw away
187    points-to information for memory variables.  WHOPR and PTA
188    do not play along well anyway - the whole constraint solving
189    would need to be done in WPA phase and it will be very interesting
190    to apply the results to local SSA names during LTRANS phase.
191
192    We probably should compute a per-function unit-ESCAPE solution
193    propagating it simply like the clobber / uses solutions.  The
194    solution can go alongside the non-IPA espaced solution and be
195    used to query which vars escape the unit through a function.
196
197    We never put function decls in points-to sets so we do not
198    keep the set of called functions for indirect calls.
199
200    And probably more.  */
201 static GTY ((if_marked ("tree_map_marked_p"), param_is (struct heapvar_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_alloc_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           || TREE_CODE (SSA_NAME_VAR (t)) == RESULT_DECL)
2842       && SSA_NAME_IS_DEFAULT_DEF (t))
2843     {
2844       get_constraint_for_ssa_var (SSA_NAME_VAR (t), results, address_p);
2845       return;
2846     }
2847
2848   vi = get_vi_for_tree (t);
2849   cexpr.var = vi->id;
2850   cexpr.type = SCALAR;
2851   cexpr.offset = 0;
2852   /* If we determine the result is "anything", and we know this is readonly,
2853      say it points to readonly memory instead.  */
2854   if (cexpr.var == anything_id && TREE_READONLY (t))
2855     {
2856       gcc_unreachable ();
2857       cexpr.type = ADDRESSOF;
2858       cexpr.var = readonly_id;
2859     }
2860
2861   /* If we are not taking the address of the constraint expr, add all
2862      sub-fiels of the variable as well.  */
2863   if (!address_p
2864       && !vi->is_full_var)
2865     {
2866       for (; vi; vi = vi->next)
2867         {
2868           cexpr.var = vi->id;
2869           VEC_safe_push (ce_s, heap, *results, &cexpr);
2870         }
2871       return;
2872     }
2873
2874   VEC_safe_push (ce_s, heap, *results, &cexpr);
2875 }
2876
2877 /* Process constraint T, performing various simplifications and then
2878    adding it to our list of overall constraints.  */
2879
2880 static void
2881 process_constraint (constraint_t t)
2882 {
2883   struct constraint_expr rhs = t->rhs;
2884   struct constraint_expr lhs = t->lhs;
2885
2886   gcc_assert (rhs.var < VEC_length (varinfo_t, varmap));
2887   gcc_assert (lhs.var < VEC_length (varinfo_t, varmap));
2888
2889   /* If we didn't get any useful constraint from the lhs we get
2890      &ANYTHING as fallback from get_constraint_for.  Deal with
2891      it here by turning it into *ANYTHING.  */
2892   if (lhs.type == ADDRESSOF
2893       && lhs.var == anything_id)
2894     lhs.type = DEREF;
2895
2896   /* ADDRESSOF on the lhs is invalid.  */
2897   gcc_assert (lhs.type != ADDRESSOF);
2898
2899   /* We shouldn't add constraints from things that cannot have pointers.
2900      It's not completely trivial to avoid in the callers, so do it here.  */
2901   if (rhs.type != ADDRESSOF
2902       && !get_varinfo (rhs.var)->may_have_pointers)
2903     return;
2904
2905   /* Likewise adding to the solution of a non-pointer var isn't useful.  */
2906   if (!get_varinfo (lhs.var)->may_have_pointers)
2907     return;
2908
2909   /* This can happen in our IR with things like n->a = *p */
2910   if (rhs.type == DEREF && lhs.type == DEREF && rhs.var != anything_id)
2911     {
2912       /* Split into tmp = *rhs, *lhs = tmp */
2913       struct constraint_expr tmplhs;
2914       tmplhs = new_scalar_tmp_constraint_exp ("doubledereftmp");
2915       process_constraint (new_constraint (tmplhs, rhs));
2916       process_constraint (new_constraint (lhs, tmplhs));
2917     }
2918   else if (rhs.type == ADDRESSOF && lhs.type == DEREF)
2919     {
2920       /* Split into tmp = &rhs, *lhs = tmp */
2921       struct constraint_expr tmplhs;
2922       tmplhs = new_scalar_tmp_constraint_exp ("derefaddrtmp");
2923       process_constraint (new_constraint (tmplhs, rhs));
2924       process_constraint (new_constraint (lhs, tmplhs));
2925     }
2926   else
2927     {
2928       gcc_assert (rhs.type != ADDRESSOF || rhs.offset == 0);
2929       VEC_safe_push (constraint_t, heap, constraints, t);
2930     }
2931 }
2932
2933 /* Return true if T is a type that could contain pointers.  */
2934
2935 static bool
2936 type_could_have_pointers (tree type)
2937 {
2938   if (POINTER_TYPE_P (type))
2939     return true;
2940
2941   if (TREE_CODE (type) == ARRAY_TYPE)
2942     return type_could_have_pointers (TREE_TYPE (type));
2943
2944   /* A function or method can consume pointers.
2945      ???  We could be more precise here.  */
2946   if (TREE_CODE (type) == FUNCTION_TYPE
2947       || TREE_CODE (type) == METHOD_TYPE)
2948     return true;
2949
2950   return AGGREGATE_TYPE_P (type);
2951 }
2952
2953 /* Return true if T is a variable of a type that could contain
2954    pointers.  */
2955
2956 static bool
2957 could_have_pointers (tree t)
2958 {
2959   return (((TREE_CODE (t) == VAR_DECL
2960             || TREE_CODE (t) == PARM_DECL
2961             || TREE_CODE (t) == RESULT_DECL)
2962            && (TREE_PUBLIC (t) || DECL_EXTERNAL (t) || TREE_ADDRESSABLE (t)))
2963           || type_could_have_pointers (TREE_TYPE (t)));
2964 }
2965
2966 /* Return the position, in bits, of FIELD_DECL from the beginning of its
2967    structure.  */
2968
2969 static HOST_WIDE_INT
2970 bitpos_of_field (const tree fdecl)
2971 {
2972
2973   if (!host_integerp (DECL_FIELD_OFFSET (fdecl), 0)
2974       || !host_integerp (DECL_FIELD_BIT_OFFSET (fdecl), 0))
2975     return -1;
2976
2977   return (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (fdecl)) * 8
2978           + TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (fdecl)));
2979 }
2980
2981
2982 /* Get constraint expressions for offsetting PTR by OFFSET.  Stores the
2983    resulting constraint expressions in *RESULTS.  */
2984
2985 static void
2986 get_constraint_for_ptr_offset (tree ptr, tree offset,
2987                                VEC (ce_s, heap) **results)
2988 {
2989   struct constraint_expr c;
2990   unsigned int j, n;
2991   HOST_WIDE_INT rhsunitoffset, rhsoffset;
2992
2993   /* If we do not do field-sensitive PTA adding offsets to pointers
2994      does not change the points-to solution.  */
2995   if (!use_field_sensitive)
2996     {
2997       get_constraint_for (ptr, results);
2998       return;
2999     }
3000
3001   /* If the offset is not a non-negative integer constant that fits
3002      in a HOST_WIDE_INT, we have to fall back to a conservative
3003      solution which includes all sub-fields of all pointed-to
3004      variables of ptr.  */
3005   if (offset == NULL_TREE
3006       || !host_integerp (offset, 0))
3007     rhsoffset = UNKNOWN_OFFSET;
3008   else
3009     {
3010       /* Make sure the bit-offset also fits.  */
3011       rhsunitoffset = TREE_INT_CST_LOW (offset);
3012       rhsoffset = rhsunitoffset * BITS_PER_UNIT;
3013       if (rhsunitoffset != rhsoffset / BITS_PER_UNIT)
3014         rhsoffset = UNKNOWN_OFFSET;
3015     }
3016
3017   get_constraint_for (ptr, results);
3018   if (rhsoffset == 0)
3019     return;
3020
3021   /* As we are eventually appending to the solution do not use
3022      VEC_iterate here.  */
3023   n = VEC_length (ce_s, *results);
3024   for (j = 0; j < n; j++)
3025     {
3026       varinfo_t curr;
3027       c = *VEC_index (ce_s, *results, j);
3028       curr = get_varinfo (c.var);
3029
3030       if (c.type == ADDRESSOF
3031           /* If this varinfo represents a full variable just use it.  */
3032           && curr->is_full_var)
3033         c.offset = 0;
3034       else if (c.type == ADDRESSOF
3035                /* If we do not know the offset add all subfields.  */
3036                && rhsoffset == UNKNOWN_OFFSET)
3037         {
3038           varinfo_t temp = lookup_vi_for_tree (curr->decl);
3039           do
3040             {
3041               struct constraint_expr c2;
3042               c2.var = temp->id;
3043               c2.type = ADDRESSOF;
3044               c2.offset = 0;
3045               if (c2.var != c.var)
3046                 VEC_safe_push (ce_s, heap, *results, &c2);
3047               temp = temp->next;
3048             }
3049           while (temp);
3050         }
3051       else if (c.type == ADDRESSOF)
3052         {
3053           varinfo_t temp;
3054           unsigned HOST_WIDE_INT offset = curr->offset + rhsoffset;
3055
3056           /* Search the sub-field which overlaps with the
3057              pointed-to offset.  If the result is outside of the variable
3058              we have to provide a conservative result, as the variable is
3059              still reachable from the resulting pointer (even though it
3060              technically cannot point to anything).  The last and first
3061              sub-fields are such conservative results.
3062              ???  If we always had a sub-field for &object + 1 then
3063              we could represent this in a more precise way.  */
3064           if (rhsoffset < 0
3065               && curr->offset < offset)
3066             offset = 0;
3067           temp = first_or_preceding_vi_for_offset (curr, offset);
3068
3069           /* If the found variable is not exactly at the pointed to
3070              result, we have to include the next variable in the
3071              solution as well.  Otherwise two increments by offset / 2
3072              do not result in the same or a conservative superset
3073              solution.  */
3074           if (temp->offset != offset
3075               && temp->next != NULL)
3076             {
3077               struct constraint_expr c2;
3078               c2.var = temp->next->id;
3079               c2.type = ADDRESSOF;
3080               c2.offset = 0;
3081               VEC_safe_push (ce_s, heap, *results, &c2);
3082             }
3083           c.var = temp->id;
3084           c.offset = 0;
3085         }
3086       else
3087         c.offset = rhsoffset;
3088
3089       VEC_replace (ce_s, *results, j, &c);
3090     }
3091 }
3092
3093
3094 /* Given a COMPONENT_REF T, return the constraint_expr vector for it.
3095    If address_p is true the result will be taken its address of.  */
3096
3097 static void
3098 get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results,
3099                                   bool address_p)
3100 {
3101   tree orig_t = t;
3102   HOST_WIDE_INT bitsize = -1;
3103   HOST_WIDE_INT bitmaxsize = -1;
3104   HOST_WIDE_INT bitpos;
3105   tree forzero;
3106   struct constraint_expr *result;
3107
3108   /* Some people like to do cute things like take the address of
3109      &0->a.b */
3110   forzero = t;
3111   while (handled_component_p (forzero)
3112          || INDIRECT_REF_P (forzero)
3113          || TREE_CODE (forzero) == MEM_REF)
3114     forzero = TREE_OPERAND (forzero, 0);
3115
3116   if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero))
3117     {
3118       struct constraint_expr temp;
3119
3120       temp.offset = 0;
3121       temp.var = integer_id;
3122       temp.type = SCALAR;
3123       VEC_safe_push (ce_s, heap, *results, &temp);
3124       return;
3125     }
3126
3127   t = get_ref_base_and_extent (t, &bitpos, &bitsize, &bitmaxsize);
3128
3129   /* Pretend to take the address of the base, we'll take care of
3130      adding the required subset of sub-fields below.  */
3131   get_constraint_for_1 (t, results, true);
3132   gcc_assert (VEC_length (ce_s, *results) == 1);
3133   result = VEC_last (ce_s, *results);
3134
3135   if (result->type == SCALAR
3136       && get_varinfo (result->var)->is_full_var)
3137     /* For single-field vars do not bother about the offset.  */
3138     result->offset = 0;
3139   else if (result->type == SCALAR)
3140     {
3141       /* In languages like C, you can access one past the end of an
3142          array.  You aren't allowed to dereference it, so we can
3143          ignore this constraint. When we handle pointer subtraction,
3144          we may have to do something cute here.  */
3145
3146       if ((unsigned HOST_WIDE_INT)bitpos < get_varinfo (result->var)->fullsize
3147           && bitmaxsize != 0)
3148         {
3149           /* It's also not true that the constraint will actually start at the
3150              right offset, it may start in some padding.  We only care about
3151              setting the constraint to the first actual field it touches, so
3152              walk to find it.  */
3153           struct constraint_expr cexpr = *result;
3154           varinfo_t curr;
3155           VEC_pop (ce_s, *results);
3156           cexpr.offset = 0;
3157           for (curr = get_varinfo (cexpr.var); curr; curr = curr->next)
3158             {
3159               if (ranges_overlap_p (curr->offset, curr->size,
3160                                     bitpos, bitmaxsize))
3161                 {
3162                   cexpr.var = curr->id;
3163                   VEC_safe_push (ce_s, heap, *results, &cexpr);
3164                   if (address_p)
3165                     break;
3166                 }
3167             }
3168           /* If we are going to take the address of this field then
3169              to be able to compute reachability correctly add at least
3170              the last field of the variable.  */
3171           if (address_p
3172               && VEC_length (ce_s, *results) == 0)
3173             {
3174               curr = get_varinfo (cexpr.var);
3175               while (curr->next != NULL)
3176                 curr = curr->next;
3177               cexpr.var = curr->id;
3178               VEC_safe_push (ce_s, heap, *results, &cexpr);
3179             }
3180           else if (VEC_length (ce_s, *results) == 0)
3181             /* Assert that we found *some* field there. The user couldn't be
3182                accessing *only* padding.  */
3183             /* Still the user could access one past the end of an array
3184                embedded in a struct resulting in accessing *only* padding.  */
3185             /* Or accessing only padding via type-punning to a type
3186                that has a filed just in padding space.  */
3187             {
3188               cexpr.type = SCALAR;
3189               cexpr.var = anything_id;
3190               cexpr.offset = 0;
3191               VEC_safe_push (ce_s, heap, *results, &cexpr);
3192             }
3193         }
3194       else if (bitmaxsize == 0)
3195         {
3196           if (dump_file && (dump_flags & TDF_DETAILS))
3197             fprintf (dump_file, "Access to zero-sized part of variable,"
3198                      "ignoring\n");
3199         }
3200       else
3201         if (dump_file && (dump_flags & TDF_DETAILS))
3202           fprintf (dump_file, "Access to past the end of variable, ignoring\n");
3203     }
3204   else if (result->type == DEREF)
3205     {
3206       /* If we do not know exactly where the access goes say so.  Note
3207          that only for non-structure accesses we know that we access
3208          at most one subfiled of any variable.  */
3209       if (bitpos == -1
3210           || bitsize != bitmaxsize
3211           || AGGREGATE_TYPE_P (TREE_TYPE (orig_t))
3212           || result->offset == UNKNOWN_OFFSET)
3213         result->offset = UNKNOWN_OFFSET;
3214       else
3215         result->offset += bitpos;
3216     }
3217   else if (result->type == ADDRESSOF)
3218     {
3219       /* We can end up here for component references on a
3220          VIEW_CONVERT_EXPR <>(&foobar).  */
3221       result->type = SCALAR;
3222       result->var = anything_id;
3223       result->offset = 0;
3224     }
3225   else
3226     gcc_unreachable ();
3227 }
3228
3229
3230 /* Dereference the constraint expression CONS, and return the result.
3231    DEREF (ADDRESSOF) = SCALAR
3232    DEREF (SCALAR) = DEREF
3233    DEREF (DEREF) = (temp = DEREF1; result = DEREF(temp))
3234    This is needed so that we can handle dereferencing DEREF constraints.  */
3235
3236 static void
3237 do_deref (VEC (ce_s, heap) **constraints)
3238 {
3239   struct constraint_expr *c;
3240   unsigned int i = 0;
3241
3242   for (i = 0; VEC_iterate (ce_s, *constraints, i, c); i++)
3243     {
3244       if (c->type == SCALAR)
3245         c->type = DEREF;
3246       else if (c->type == ADDRESSOF)
3247         c->type = SCALAR;
3248       else if (c->type == DEREF)
3249         {
3250           struct constraint_expr tmplhs;
3251           tmplhs = new_scalar_tmp_constraint_exp ("dereftmp");
3252           process_constraint (new_constraint (tmplhs, *c));
3253           c->var = tmplhs.var;
3254         }
3255       else
3256         gcc_unreachable ();
3257     }
3258 }
3259
3260 static void get_constraint_for_1 (tree, VEC (ce_s, heap) **, bool);
3261
3262 /* Given a tree T, return the constraint expression for taking the
3263    address of it.  */
3264
3265 static void
3266 get_constraint_for_address_of (tree t, VEC (ce_s, heap) **results)
3267 {
3268   struct constraint_expr *c;
3269   unsigned int i;
3270
3271   get_constraint_for_1 (t, results, true);
3272
3273   for (i = 0; VEC_iterate (ce_s, *results, i, c); i++)
3274     {
3275       if (c->type == DEREF)
3276         c->type = SCALAR;
3277       else
3278         c->type = ADDRESSOF;
3279     }
3280 }
3281
3282 /* Given a tree T, return the constraint expression for it.  */
3283
3284 static void
3285 get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p)
3286 {
3287   struct constraint_expr temp;
3288
3289   /* x = integer is all glommed to a single variable, which doesn't
3290      point to anything by itself.  That is, of course, unless it is an
3291      integer constant being treated as a pointer, in which case, we
3292      will return that this is really the addressof anything.  This
3293      happens below, since it will fall into the default case. The only
3294      case we know something about an integer treated like a pointer is
3295      when it is the NULL pointer, and then we just say it points to
3296      NULL.
3297
3298      Do not do that if -fno-delete-null-pointer-checks though, because
3299      in that case *NULL does not fail, so it _should_ alias *anything.
3300      It is not worth adding a new option or renaming the existing one,
3301      since this case is relatively obscure.  */
3302   if ((TREE_CODE (t) == INTEGER_CST
3303        && integer_zerop (t))
3304       /* The only valid CONSTRUCTORs in gimple with pointer typed
3305          elements are zero-initializer.  But in IPA mode we also
3306          process global initializers, so verify at least.  */
3307       || (TREE_CODE (t) == CONSTRUCTOR
3308           && CONSTRUCTOR_NELTS (t) == 0))
3309     {
3310       if (flag_delete_null_pointer_checks)
3311         temp.var = nothing_id;
3312       else
3313         temp.var = anything_id;
3314       temp.type = ADDRESSOF;
3315       temp.offset = 0;
3316       VEC_safe_push (ce_s, heap, *results, &temp);
3317       return;
3318     }
3319
3320   /* String constants are read-only.  */
3321   if (TREE_CODE (t) == STRING_CST)
3322     {
3323       temp.var = readonly_id;
3324       temp.type = SCALAR;
3325       temp.offset = 0;
3326       VEC_safe_push (ce_s, heap, *results, &temp);
3327       return;
3328     }
3329
3330   switch (TREE_CODE_CLASS (TREE_CODE (t)))
3331     {
3332     case tcc_expression:
3333       {
3334         switch (TREE_CODE (t))
3335           {
3336           case ADDR_EXPR:
3337             get_constraint_for_address_of (TREE_OPERAND (t, 0), results);
3338             return;
3339           default:;
3340           }
3341         break;
3342       }
3343     case tcc_reference:
3344       {
3345         switch (TREE_CODE (t))
3346           {
3347           case MEM_REF:
3348             {
3349               tree off = double_int_to_tree (sizetype, mem_ref_offset (t));
3350               get_constraint_for_ptr_offset (TREE_OPERAND (t, 0), off, results);
3351               do_deref (results);
3352               return;
3353             }
3354           case ARRAY_REF:
3355           case ARRAY_RANGE_REF:
3356           case COMPONENT_REF:
3357             get_constraint_for_component_ref (t, results, address_p);
3358             return;
3359           case VIEW_CONVERT_EXPR:
3360             get_constraint_for_1 (TREE_OPERAND (t, 0), results, address_p);
3361             return;
3362           /* We are missing handling for TARGET_MEM_REF here.  */
3363           default:;
3364           }
3365         break;
3366       }
3367     case tcc_exceptional:
3368       {
3369         switch (TREE_CODE (t))
3370           {
3371           case SSA_NAME:
3372             {
3373               get_constraint_for_ssa_var (t, results, address_p);
3374               return;
3375             }
3376           case CONSTRUCTOR:
3377             {
3378               unsigned int i;
3379               tree val;
3380               VEC (ce_s, heap) *tmp = NULL;
3381               FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), i, val)
3382                 {
3383                   struct constraint_expr *rhsp;
3384                   unsigned j;
3385                   get_constraint_for_1 (val, &tmp, address_p);
3386                   for (j = 0; VEC_iterate (ce_s, tmp, j, rhsp); ++j)
3387                     VEC_safe_push (ce_s, heap, *results, rhsp);
3388                   VEC_truncate (ce_s, tmp, 0);
3389                 }
3390               VEC_free (ce_s, heap, tmp);
3391               /* We do not know whether the constructor was complete,
3392                  so technically we have to add &NOTHING or &ANYTHING
3393                  like we do for an empty constructor as well.  */
3394               return;
3395             }
3396           default:;
3397           }
3398         break;
3399       }
3400     case tcc_declaration:
3401       {
3402         get_constraint_for_ssa_var (t, results, address_p);
3403         return;
3404       }
3405     default:;
3406     }
3407
3408   /* The default fallback is a constraint from anything.  */
3409   temp.type = ADDRESSOF;
3410   temp.var = anything_id;
3411   temp.offset = 0;
3412   VEC_safe_push (ce_s, heap, *results, &temp);
3413 }
3414
3415 /* Given a gimple tree T, return the constraint expression vector for it.  */
3416
3417 static void
3418 get_constraint_for (tree t, VEC (ce_s, heap) **results)
3419 {
3420   gcc_assert (VEC_length (ce_s, *results) == 0);
3421
3422   get_constraint_for_1 (t, results, false);
3423 }
3424
3425
3426 /* Efficiently generates constraints from all entries in *RHSC to all
3427    entries in *LHSC.  */
3428
3429 static void
3430 process_all_all_constraints (VEC (ce_s, heap) *lhsc, VEC (ce_s, heap) *rhsc)
3431 {
3432   struct constraint_expr *lhsp, *rhsp;
3433   unsigned i, j;
3434
3435   if (VEC_length (ce_s, lhsc) <= 1
3436       || VEC_length (ce_s, rhsc) <= 1)
3437     {
3438       for (i = 0; VEC_iterate (ce_s, lhsc, i, lhsp); ++i)
3439         for (j = 0; VEC_iterate (ce_s, rhsc, j, rhsp); ++j)
3440           process_constraint (new_constraint (*lhsp, *rhsp));
3441     }
3442   else
3443     {
3444       struct constraint_expr tmp;
3445       tmp = new_scalar_tmp_constraint_exp ("allalltmp");
3446       for (i = 0; VEC_iterate (ce_s, rhsc, i, rhsp); ++i)
3447         process_constraint (new_constraint (tmp, *rhsp));
3448       for (i = 0; VEC_iterate (ce_s, lhsc, i, lhsp); ++i)
3449         process_constraint (new_constraint (*lhsp, tmp));
3450     }
3451 }
3452
3453 /* Handle aggregate copies by expanding into copies of the respective
3454    fields of the structures.  */
3455
3456 static void
3457 do_structure_copy (tree lhsop, tree rhsop)
3458 {
3459   struct constraint_expr *lhsp, *rhsp;
3460   VEC (ce_s, heap) *lhsc = NULL, *rhsc = NULL;
3461   unsigned j;
3462
3463   get_constraint_for (lhsop, &lhsc);
3464   get_constraint_for (rhsop, &rhsc);
3465   lhsp = VEC_index (ce_s, lhsc, 0);
3466   rhsp = VEC_index (ce_s, rhsc, 0);
3467   if (lhsp->type == DEREF
3468       || (lhsp->type == ADDRESSOF && lhsp->var == anything_id)
3469       || rhsp->type == DEREF)
3470     {
3471       if (lhsp->type == DEREF)
3472         {
3473           gcc_assert (VEC_length (ce_s, lhsc) == 1);
3474           lhsp->offset = UNKNOWN_OFFSET;
3475         }
3476       if (rhsp->type == DEREF)
3477         {
3478           gcc_assert (VEC_length (ce_s, rhsc) == 1);
3479           rhsp->offset = UNKNOWN_OFFSET;
3480         }
3481       process_all_all_constraints (lhsc, rhsc);
3482     }
3483   else if (lhsp->type == SCALAR
3484            && (rhsp->type == SCALAR
3485                || rhsp->type == ADDRESSOF))
3486     {
3487       HOST_WIDE_INT lhssize, lhsmaxsize, lhsoffset;
3488       HOST_WIDE_INT rhssize, rhsmaxsize, rhsoffset;
3489       unsigned k = 0;
3490       get_ref_base_and_extent (lhsop, &lhsoffset, &lhssize, &lhsmaxsize);
3491       get_ref_base_and_extent (rhsop, &rhsoffset, &rhssize, &rhsmaxsize);
3492       for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp);)
3493         {
3494           varinfo_t lhsv, rhsv;
3495           rhsp = VEC_index (ce_s, rhsc, k);
3496           lhsv = get_varinfo (lhsp->var);
3497           rhsv = get_varinfo (rhsp->var);
3498           if (lhsv->may_have_pointers
3499               && ranges_overlap_p (lhsv->offset + rhsoffset, lhsv->size,
3500                                    rhsv->offset + lhsoffset, rhsv->size))
3501             process_constraint (new_constraint (*lhsp, *rhsp));
3502           if (lhsv->offset + rhsoffset + lhsv->size
3503               > rhsv->offset + lhsoffset + rhsv->size)
3504             {
3505               ++k;
3506               if (k >= VEC_length (ce_s, rhsc))
3507                 break;
3508             }
3509           else
3510             ++j;
3511         }
3512     }
3513   else
3514     gcc_unreachable ();
3515
3516   VEC_free (ce_s, heap, lhsc);
3517   VEC_free (ce_s, heap, rhsc);
3518 }
3519
3520 /* Create a constraint ID = OP.  */
3521
3522 static void
3523 make_constraint_to (unsigned id, tree op)
3524 {
3525   VEC(ce_s, heap) *rhsc = NULL;
3526   struct constraint_expr *c;
3527   struct constraint_expr includes;
3528   unsigned int j;
3529
3530   includes.var = id;
3531   includes.offset = 0;
3532   includes.type = SCALAR;
3533
3534   get_constraint_for (op, &rhsc);
3535   for (j = 0; VEC_iterate (ce_s, rhsc, j, c); j++)
3536     process_constraint (new_constraint (includes, *c));
3537   VEC_free (ce_s, heap, rhsc);
3538 }
3539
3540 /* Create a constraint ID = &FROM.  */
3541
3542 static void
3543 make_constraint_from (varinfo_t vi, int from)
3544 {
3545   struct constraint_expr lhs, rhs;
3546
3547   lhs.var = vi->id;
3548   lhs.offset = 0;
3549   lhs.type = SCALAR;
3550
3551   rhs.var = from;
3552   rhs.offset = 0;
3553   rhs.type = ADDRESSOF;
3554   process_constraint (new_constraint (lhs, rhs));
3555 }
3556
3557 /* Create a constraint ID = FROM.  */
3558
3559 static void
3560 make_copy_constraint (varinfo_t vi, int from)
3561 {
3562   struct constraint_expr lhs, rhs;
3563
3564   lhs.var = vi->id;
3565   lhs.offset = 0;
3566   lhs.type = SCALAR;
3567
3568   rhs.var = from;
3569   rhs.offset = 0;
3570   rhs.type = SCALAR;
3571   process_constraint (new_constraint (lhs, rhs));
3572 }
3573
3574 /* Make constraints necessary to make OP escape.  */
3575
3576 static void
3577 make_escape_constraint (tree op)
3578 {
3579   make_constraint_to (escaped_id, op);
3580 }
3581
3582 /* Add constraints to that the solution of VI is transitively closed.  */
3583
3584 static void
3585 make_transitive_closure_constraints (varinfo_t vi)
3586 {
3587   struct constraint_expr lhs, rhs;
3588
3589   /* VAR = *VAR;  */
3590   lhs.type = SCALAR;
3591   lhs.var = vi->id;
3592   lhs.offset = 0;
3593   rhs.type = DEREF;
3594   rhs.var = vi->id;
3595   rhs.offset = 0;
3596   process_constraint (new_constraint (lhs, rhs));
3597
3598   /* VAR = VAR + UNKNOWN;  */
3599   lhs.type = SCALAR;
3600   lhs.var = vi->id;
3601   lhs.offset = 0;
3602   rhs.type = SCALAR;
3603   rhs.var = vi->id;
3604   rhs.offset = UNKNOWN_OFFSET;
3605   process_constraint (new_constraint (lhs, rhs));
3606 }
3607
3608 /* Create a new artificial heap variable with NAME.
3609    Return the created variable.  */
3610
3611 static varinfo_t
3612 make_heapvar_for (varinfo_t lhs, const char *name)
3613 {
3614   varinfo_t vi;
3615   tree heapvar = heapvar_lookup (lhs->decl, lhs->offset);
3616
3617   if (heapvar == NULL_TREE)
3618     {
3619       var_ann_t ann;
3620       heapvar = create_tmp_var_raw (ptr_type_node, name);
3621       DECL_EXTERNAL (heapvar) = 1;
3622
3623       heapvar_insert (lhs->decl, lhs->offset, heapvar);
3624
3625       ann = get_var_ann (heapvar);
3626       ann->is_heapvar = 1;
3627     }
3628
3629   /* For global vars we need to add a heapvar to the list of referenced
3630      vars of a different function than it was created for originally.  */
3631   if (cfun && gimple_referenced_vars (cfun))
3632     add_referenced_var (heapvar);
3633
3634   vi = new_var_info (heapvar, name);
3635   vi->is_artificial_var = true;
3636   vi->is_heap_var = true;
3637   vi->is_unknown_size_var = true;
3638   vi->offset = 0;
3639   vi->fullsize = ~0;
3640   vi->size = ~0;
3641   vi->is_full_var = true;
3642   insert_vi_for_tree (heapvar, vi);
3643
3644   return vi;
3645 }
3646
3647 /* Create a new artificial heap variable with NAME and make a
3648    constraint from it to LHS.  Return the created variable.  */
3649
3650 static varinfo_t
3651 make_constraint_from_heapvar (varinfo_t lhs, const char *name)
3652 {
3653   varinfo_t vi = make_heapvar_for (lhs, name);
3654   make_constraint_from (lhs, vi->id);
3655
3656   return vi;
3657 }
3658
3659 /* Create a new artificial heap variable with NAME and make a
3660    constraint from it to LHS.  Set flags according to a tag used
3661    for tracking restrict pointers.  */
3662
3663 static void
3664 make_constraint_from_restrict (varinfo_t lhs, const char *name)
3665 {
3666   varinfo_t vi;
3667   vi = make_constraint_from_heapvar (lhs, name);
3668   vi->is_restrict_var = 1;
3669   vi->is_global_var = 0;
3670   vi->is_special_var = 1;
3671   vi->may_have_pointers = 0;
3672 }
3673
3674 /* In IPA mode there are varinfos for different aspects of reach
3675    function designator.  One for the points-to set of the return
3676    value, one for the variables that are clobbered by the function,
3677    one for its uses and one for each parameter (including a single
3678    glob for remaining variadic arguments).  */
3679
3680 enum { fi_clobbers = 1, fi_uses = 2,
3681        fi_static_chain = 3, fi_result = 4, fi_parm_base = 5 };
3682
3683 /* Get a constraint for the requested part of a function designator FI
3684    when operating in IPA mode.  */
3685
3686 static struct constraint_expr
3687 get_function_part_constraint (varinfo_t fi, unsigned part)
3688 {
3689   struct constraint_expr c;
3690
3691   gcc_assert (in_ipa_mode);
3692
3693   if (fi->id == anything_id)
3694     {
3695       /* ???  We probably should have a ANYFN special variable.  */
3696       c.var = anything_id;
3697       c.offset = 0;
3698       c.type = SCALAR;
3699     }
3700   else if (TREE_CODE (fi->decl) == FUNCTION_DECL)
3701     {
3702       varinfo_t ai = first_vi_for_offset (fi, part);
3703       if (ai)
3704         c.var = ai->id;
3705       else
3706         c.var = anything_id;
3707       c.offset = 0;
3708       c.type = SCALAR;
3709     }
3710   else
3711     {
3712       c.var = fi->id;
3713       c.offset = part;
3714       c.type = DEREF;
3715     }
3716
3717   return c;
3718 }
3719
3720 /* For non-IPA mode, generate constraints necessary for a call on the
3721    RHS.  */
3722
3723 static void
3724 handle_rhs_call (gimple stmt, VEC(ce_s, heap) **results)
3725 {
3726   struct constraint_expr rhsc;
3727   unsigned i;
3728   bool returns_uses = false;
3729
3730   for (i = 0; i < gimple_call_num_args (stmt); ++i)
3731     {
3732       tree arg = gimple_call_arg (stmt, i);
3733       int flags = gimple_call_arg_flags (stmt, i);
3734
3735       /* If the argument is not used or it does not contain pointers
3736          we can ignore it.  */
3737       if ((flags & EAF_UNUSED)
3738           || !could_have_pointers (arg))
3739         continue;
3740
3741       /* As we compute ESCAPED context-insensitive we do not gain
3742          any precision with just EAF_NOCLOBBER but not EAF_NOESCAPE
3743          set.  The argument would still get clobbered through the
3744          escape solution.
3745          ???  We might get away with less (and more precise) constraints
3746          if using a temporary for transitively closing things.  */
3747       if ((flags & EAF_NOCLOBBER)
3748            && (flags & EAF_NOESCAPE))
3749         {
3750           varinfo_t uses = get_call_use_vi (stmt);
3751           if (!(flags & EAF_DIRECT))
3752             make_transitive_closure_constraints (uses);
3753           make_constraint_to (uses->id, arg);
3754           returns_uses = true;
3755         }
3756       else if (flags & EAF_NOESCAPE)
3757         {
3758           varinfo_t uses = get_call_use_vi (stmt);
3759           varinfo_t clobbers = get_call_clobber_vi (stmt);
3760           if (!(flags & EAF_DIRECT))
3761             {
3762               make_transitive_closure_constraints (uses);
3763               make_transitive_closure_constraints (clobbers);
3764             }
3765           make_constraint_to (uses->id, arg);
3766           make_constraint_to (clobbers->id, arg);
3767           returns_uses = true;
3768         }
3769       else
3770         make_escape_constraint (arg);
3771     }
3772
3773   /* If we added to the calls uses solution make sure we account for
3774      pointers to it to be returned.  */
3775   if (returns_uses)
3776     {
3777       rhsc.var = get_call_use_vi (stmt)->id;
3778       rhsc.offset = 0;
3779       rhsc.type = SCALAR;
3780       VEC_safe_push (ce_s, heap, *results, &rhsc);
3781     }
3782
3783   /* The static chain escapes as well.  */
3784   if (gimple_call_chain (stmt))
3785     make_escape_constraint (gimple_call_chain (stmt));
3786
3787   /* And if we applied NRV the address of the return slot escapes as well.  */
3788   if (gimple_call_return_slot_opt_p (stmt)
3789       && gimple_call_lhs (stmt) != NULL_TREE
3790       && TREE_ADDRESSABLE (TREE_TYPE (gimple_call_lhs (stmt))))
3791     {
3792       VEC(ce_s, heap) *tmpc = NULL;
3793       struct constraint_expr lhsc, *c;
3794       get_constraint_for_address_of (gimple_call_lhs (stmt), &tmpc);
3795       lhsc.var = escaped_id;
3796       lhsc.offset = 0;
3797       lhsc.type = SCALAR;
3798       for (i = 0; VEC_iterate (ce_s, tmpc, i, c); ++i)
3799         process_constraint (new_constraint (lhsc, *c));
3800       VEC_free(ce_s, heap, tmpc);
3801     }
3802
3803   /* Regular functions return nonlocal memory.  */
3804   rhsc.var = nonlocal_id;
3805   rhsc.offset = 0;
3806   rhsc.type = SCALAR;
3807   VEC_safe_push (ce_s, heap, *results, &rhsc);
3808 }
3809
3810 /* For non-IPA mode, generate constraints necessary for a call
3811    that returns a pointer and assigns it to LHS.  This simply makes
3812    the LHS point to global and escaped variables.  */
3813
3814 static void
3815 handle_lhs_call (gimple stmt, tree lhs, int flags, VEC(ce_s, heap) *rhsc,
3816                  tree fndecl)
3817 {
3818   VEC(ce_s, heap) *lhsc = NULL;
3819
3820   get_constraint_for (lhs, &lhsc);
3821   /* If the store is to a global decl make sure to
3822      add proper escape constraints.  */
3823   lhs = get_base_address (lhs);
3824   if (lhs
3825       && DECL_P (lhs)
3826       && is_global_var (lhs))
3827     {
3828       struct constraint_expr tmpc;
3829       tmpc.var = escaped_id;
3830       tmpc.offset = 0;
3831       tmpc.type = SCALAR;
3832       VEC_safe_push (ce_s, heap, lhsc, &tmpc);
3833     }
3834
3835   /* If the call returns an argument unmodified override the rhs
3836      constraints.  */
3837   flags = gimple_call_return_flags (stmt);
3838   if (flags & ERF_RETURNS_ARG
3839       && (flags & ERF_RETURN_ARG_MASK) < gimple_call_num_args (stmt))
3840     {
3841       tree arg;
3842       rhsc = NULL;
3843       arg = gimple_call_arg (stmt, flags & ERF_RETURN_ARG_MASK);
3844       get_constraint_for (arg, &rhsc);
3845       process_all_all_constraints (lhsc, rhsc);
3846       VEC_free (ce_s, heap, rhsc);
3847     }
3848   else if (flags & ERF_NOALIAS)
3849     {
3850       varinfo_t vi;
3851       struct constraint_expr tmpc;
3852       rhsc = NULL;
3853       vi = make_heapvar_for (get_vi_for_tree (lhs), "HEAP");
3854       /* We delay marking allocated storage global until we know if
3855          it escapes.  */
3856       DECL_EXTERNAL (vi->decl) = 0;
3857       vi->is_global_var = 0;
3858       /* If this is not a real malloc call assume the memory was
3859          initialized and thus may point to global memory.  All
3860          builtin functions with the malloc attribute behave in a sane way.  */
3861       if (!fndecl
3862           || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
3863         make_constraint_from (vi, nonlocal_id);
3864       tmpc.var = vi->id;
3865       tmpc.offset = 0;
3866       tmpc.type = ADDRESSOF;
3867       VEC_safe_push (ce_s, heap, rhsc, &tmpc);
3868     }
3869
3870   process_all_all_constraints (lhsc, rhsc);
3871
3872   VEC_free (ce_s, heap, lhsc);
3873 }
3874
3875 /* For non-IPA mode, generate constraints necessary for a call of a
3876    const function that returns a pointer in the statement STMT.  */
3877
3878 static void
3879 handle_const_call (gimple stmt, VEC(ce_s, heap) **results)
3880 {
3881   struct constraint_expr rhsc;
3882   unsigned int k;
3883
3884   /* Treat nested const functions the same as pure functions as far
3885      as the static chain is concerned.  */
3886   if (gimple_call_chain (stmt))
3887     {
3888       varinfo_t uses = get_call_use_vi (stmt);
3889       make_transitive_closure_constraints (uses);
3890       make_constraint_to (uses->id, gimple_call_chain (stmt));
3891       rhsc.var = uses->id;
3892       rhsc.offset = 0;
3893       rhsc.type = SCALAR;
3894       VEC_safe_push (ce_s, heap, *results, &rhsc);
3895     }
3896
3897   /* May return arguments.  */
3898   for (k = 0; k < gimple_call_num_args (stmt); ++k)
3899     {
3900       tree arg = gimple_call_arg (stmt, k);
3901
3902       if (could_have_pointers (arg))
3903         {
3904           VEC(ce_s, heap) *argc = NULL;
3905           unsigned i;
3906           struct constraint_expr *argp;
3907           get_constraint_for (arg, &argc);
3908           for (i = 0; VEC_iterate (ce_s, argc, i, argp); ++i)
3909             VEC_safe_push (ce_s, heap, *results, argp);
3910           VEC_free(ce_s, heap, argc);
3911         }
3912     }
3913
3914   /* May return addresses of globals.  */
3915   rhsc.var = nonlocal_id;
3916   rhsc.offset = 0;
3917   rhsc.type = ADDRESSOF;
3918   VEC_safe_push (ce_s, heap, *results, &rhsc);
3919 }
3920
3921 /* For non-IPA mode, generate constraints necessary for a call to a
3922    pure function in statement STMT.  */
3923
3924 static void
3925 handle_pure_call (gimple stmt, VEC(ce_s, heap) **results)
3926 {
3927   struct constraint_expr rhsc;
3928   unsigned i;
3929   varinfo_t uses = NULL;
3930
3931   /* Memory reached from pointer arguments is call-used.  */
3932   for (i = 0; i < gimple_call_num_args (stmt); ++i)
3933     {
3934       tree arg = gimple_call_arg (stmt, i);
3935
3936       if (could_have_pointers (arg))
3937         {
3938           if (!uses)
3939             {
3940               uses = get_call_use_vi (stmt);
3941               make_transitive_closure_constraints (uses);
3942             }
3943           make_constraint_to (uses->id, arg);
3944         }
3945     }
3946
3947   /* The static chain is used as well.  */
3948   if (gimple_call_chain (stmt))
3949     {
3950       if (!uses)
3951         {
3952           uses = get_call_use_vi (stmt);
3953           make_transitive_closure_constraints (uses);
3954         }
3955       make_constraint_to (uses->id, gimple_call_chain (stmt));
3956     }
3957
3958   /* Pure functions may return call-used and nonlocal memory.  */
3959   if (uses)
3960     {
3961       rhsc.var = uses->id;
3962       rhsc.offset = 0;
3963       rhsc.type = SCALAR;
3964       VEC_safe_push (ce_s, heap, *results, &rhsc);
3965     }
3966   rhsc.var = nonlocal_id;
3967   rhsc.offset = 0;
3968   rhsc.type = SCALAR;
3969   VEC_safe_push (ce_s, heap, *results, &rhsc);
3970 }
3971
3972
3973 /* Return the varinfo for the callee of CALL.  */
3974
3975 static varinfo_t
3976 get_fi_for_callee (gimple call)
3977 {
3978   tree decl;
3979
3980   /* If we can directly resolve the function being called, do so.
3981      Otherwise, it must be some sort of indirect expression that
3982      we should still be able to handle.  */
3983   decl = gimple_call_fndecl (call);
3984   if (decl)
3985     return get_vi_for_tree (decl);
3986
3987   decl = gimple_call_fn (call);
3988   /* The function can be either an SSA name pointer or,
3989      worse, an OBJ_TYPE_REF.  In this case we have no
3990      clue and should be getting ANYFN (well, ANYTHING for now).  */
3991   if (TREE_CODE (decl) == SSA_NAME)
3992     {
3993       if (TREE_CODE (decl) == SSA_NAME
3994           && (TREE_CODE (SSA_NAME_VAR (decl)) == PARM_DECL
3995               || TREE_CODE (SSA_NAME_VAR (decl)) == RESULT_DECL)
3996           && SSA_NAME_IS_DEFAULT_DEF (decl))
3997         decl = SSA_NAME_VAR (decl);
3998       return get_vi_for_tree (decl);
3999     }
4000   else if (TREE_CODE (decl) == INTEGER_CST
4001            || TREE_CODE (decl) == OBJ_TYPE_REF)
4002     return get_varinfo (anything_id);
4003   else
4004     gcc_unreachable ();
4005 }
4006
4007 /* Walk statement T setting up aliasing constraints according to the
4008    references found in T.  This function is the main part of the
4009    constraint builder.  AI points to auxiliary alias information used
4010    when building alias sets and computing alias grouping heuristics.  */
4011
4012 static void
4013 find_func_aliases (gimple origt)
4014 {
4015   gimple t = origt;
4016   VEC(ce_s, heap) *lhsc = NULL;
4017   VEC(ce_s, heap) *rhsc = NULL;
4018   struct constraint_expr *c;
4019   varinfo_t fi;
4020
4021   /* Now build constraints expressions.  */
4022   if (gimple_code (t) == GIMPLE_PHI)
4023     {
4024       gcc_assert (!AGGREGATE_TYPE_P (TREE_TYPE (gimple_phi_result (t))));
4025
4026       /* Only care about pointers and structures containing
4027          pointers.  */
4028       if (could_have_pointers (gimple_phi_result (t)))
4029         {
4030           size_t i;
4031           unsigned int j;
4032
4033           /* For a phi node, assign all the arguments to
4034              the result.  */
4035           get_constraint_for (gimple_phi_result (t), &lhsc);
4036           for (i = 0; i < gimple_phi_num_args (t); i++)
4037             {
4038               tree strippedrhs = PHI_ARG_DEF (t, i);
4039
4040               STRIP_NOPS (strippedrhs);
4041               get_constraint_for (gimple_phi_arg_def (t, i), &rhsc);
4042
4043               for (j = 0; VEC_iterate (ce_s, lhsc, j, c); j++)
4044                 {
4045                   struct constraint_expr *c2;
4046                   while (VEC_length (ce_s, rhsc) > 0)
4047                     {
4048                       c2 = VEC_last (ce_s, rhsc);
4049                       process_constraint (new_constraint (*c, *c2));
4050                       VEC_pop (ce_s, rhsc);
4051                     }
4052                 }
4053             }
4054         }
4055     }
4056   /* In IPA mode, we need to generate constraints to pass call
4057      arguments through their calls.   There are two cases,
4058      either a GIMPLE_CALL returning a value, or just a plain
4059      GIMPLE_CALL when we are not.
4060
4061      In non-ipa mode, we need to generate constraints for each
4062      pointer passed by address.  */
4063   else if (is_gimple_call (t))
4064     {
4065       tree fndecl = gimple_call_fndecl (t);
4066       if (fndecl != NULL_TREE
4067           && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
4068         /* ???  All builtins that are handled here need to be handled
4069            in the alias-oracle query functions explicitly!  */
4070         switch (DECL_FUNCTION_CODE (fndecl))
4071           {
4072           /* All the following functions return a pointer to the same object
4073              as their first argument points to.  The functions do not add
4074              to the ESCAPED solution.  The functions make the first argument
4075              pointed to memory point to what the second argument pointed to
4076              memory points to.  */
4077           case BUILT_IN_STRCPY:
4078           case BUILT_IN_STRNCPY:
4079           case BUILT_IN_BCOPY:
4080           case BUILT_IN_MEMCPY:
4081           case BUILT_IN_MEMMOVE:
4082           case BUILT_IN_MEMPCPY:
4083           case BUILT_IN_STPCPY:
4084           case BUILT_IN_STPNCPY:
4085           case BUILT_IN_STRCAT:
4086           case BUILT_IN_STRNCAT:
4087             {
4088               tree res = gimple_call_lhs (t);
4089               tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (fndecl)
4090                                                == BUILT_IN_BCOPY ? 1 : 0));
4091               tree src = gimple_call_arg (t, (DECL_FUNCTION_CODE (fndecl)
4092                                               == BUILT_IN_BCOPY ? 0 : 1));
4093               if (res != NULL_TREE)
4094                 {
4095                   get_constraint_for (res, &lhsc);
4096                   if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMPCPY
4097                       || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STPCPY
4098                       || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STPNCPY)
4099                     get_constraint_for_ptr_offset (dest, NULL_TREE, &rhsc);
4100                   else
4101                     get_constraint_for (dest, &rhsc);
4102                   process_all_all_constraints (lhsc, rhsc);
4103                   VEC_free (ce_s, heap, lhsc);
4104                   VEC_free (ce_s, heap, rhsc);
4105                 }
4106               get_constraint_for_ptr_offset (dest, NULL_TREE, &lhsc);
4107               get_constraint_for_ptr_offset (src, NULL_TREE, &rhsc);
4108               do_deref (&lhsc);
4109               do_deref (&rhsc);
4110               process_all_all_constraints (lhsc, rhsc);
4111               VEC_free (ce_s, heap, lhsc);
4112               VEC_free (ce_s, heap, rhsc);
4113               return;
4114             }
4115           case BUILT_IN_MEMSET:
4116             {
4117               tree res = gimple_call_lhs (t);
4118               tree dest = gimple_call_arg (t, 0);
4119               unsigned i;
4120               ce_s *lhsp;
4121               struct constraint_expr ac;
4122               if (res != NULL_TREE)
4123                 {
4124                   get_constraint_for (res, &lhsc);
4125                   get_constraint_for (dest, &rhsc);
4126                   process_all_all_constraints (lhsc, rhsc);
4127                   VEC_free (ce_s, heap, lhsc);
4128                   VEC_free (ce_s, heap, rhsc);
4129                 }
4130               get_constraint_for_ptr_offset (dest, NULL_TREE, &lhsc);
4131               do_deref (&lhsc);
4132               if (flag_delete_null_pointer_checks
4133                   && integer_zerop (gimple_call_arg (t, 1)))
4134                 {
4135                   ac.type = ADDRESSOF;
4136                   ac.var = nothing_id;
4137                 }
4138               else
4139                 {
4140                   ac.type = SCALAR;
4141                   ac.var = integer_id;
4142                 }
4143               ac.offset = 0;
4144               for (i = 0; VEC_iterate (ce_s, lhsc, i, lhsp); ++i)
4145                 process_constraint (new_constraint (*lhsp, ac));
4146               VEC_free (ce_s, heap, lhsc);
4147               return;
4148             }
4149           /* All the following functions do not return pointers, do not
4150              modify the points-to sets of memory reachable from their
4151              arguments and do not add to the ESCAPED solution.  */
4152           case BUILT_IN_SINCOS:
4153           case BUILT_IN_SINCOSF:
4154           case BUILT_IN_SINCOSL:
4155           case BUILT_IN_FREXP:
4156           case BUILT_IN_FREXPF:
4157           case BUILT_IN_FREXPL:
4158           case BUILT_IN_GAMMA_R:
4159           case BUILT_IN_GAMMAF_R:
4160           case BUILT_IN_GAMMAL_R:
4161           case BUILT_IN_LGAMMA_R:
4162           case BUILT_IN_LGAMMAF_R:
4163           case BUILT_IN_LGAMMAL_R:
4164           case BUILT_IN_MODF:
4165           case BUILT_IN_MODFF:
4166           case BUILT_IN_MODFL:
4167           case BUILT_IN_REMQUO:
4168           case BUILT_IN_REMQUOF:
4169           case BUILT_IN_REMQUOL:
4170           case BUILT_IN_FREE:
4171             return;
4172           /* Trampolines are special - they set up passing the static
4173              frame.  */
4174           case BUILT_IN_INIT_TRAMPOLINE:
4175             {
4176               tree tramp = gimple_call_arg (t, 0);
4177               tree nfunc = gimple_call_arg (t, 1);
4178               tree frame = gimple_call_arg (t, 2);
4179               unsigned i;
4180               struct constraint_expr lhs, *rhsp;
4181               if (in_ipa_mode)
4182                 {
4183                   varinfo_t nfi = NULL;
4184                   gcc_assert (TREE_CODE (nfunc) == ADDR_EXPR);
4185                   nfi = lookup_vi_for_tree (TREE_OPERAND (nfunc, 0));
4186                   if (nfi)
4187                     {
4188                       lhs = get_function_part_constraint (nfi, fi_static_chain);
4189                       get_constraint_for (frame, &rhsc);
4190                       for (i = 0; VEC_iterate (ce_s, rhsc, i, rhsp); ++i)
4191                         process_constraint (new_constraint (lhs, *rhsp));
4192                       VEC_free (ce_s, heap, rhsc);
4193
4194                       /* Make the frame point to the function for
4195                          the trampoline adjustment call.  */
4196                       get_constraint_for (tramp, &lhsc);
4197                       do_deref (&lhsc);
4198                       get_constraint_for (nfunc, &rhsc);
4199                       process_all_all_constraints (lhsc, rhsc);
4200                       VEC_free (ce_s, heap, rhsc);
4201                       VEC_free (ce_s, heap, lhsc);
4202
4203                       return;
4204                     }
4205                 }
4206               /* Else fallthru to generic handling which will let
4207                  the frame escape.  */
4208               break;
4209             }
4210           case BUILT_IN_ADJUST_TRAMPOLINE:
4211             {
4212               tree tramp = gimple_call_arg (t, 0);
4213               tree res = gimple_call_lhs (t);
4214               if (in_ipa_mode && res)
4215                 {
4216                   get_constraint_for (res, &lhsc);
4217                   get_constraint_for (tramp, &rhsc);
4218                   do_deref (&rhsc);
4219                   process_all_all_constraints (lhsc, rhsc);
4220                   VEC_free (ce_s, heap, rhsc);
4221                   VEC_free (ce_s, heap, lhsc);
4222                 }
4223               return;
4224             }
4225           /* Variadic argument handling needs to be handled in IPA
4226              mode as well.  */
4227           case BUILT_IN_VA_START:
4228             {
4229               if (in_ipa_mode)
4230                 {
4231                   tree valist = gimple_call_arg (t, 0);
4232                   struct constraint_expr rhs, *lhsp;
4233                   unsigned i;
4234                   /* The va_list gets access to pointers in variadic
4235                      arguments.  */
4236                   fi = lookup_vi_for_tree (cfun->decl);
4237                   gcc_assert (fi != NULL);
4238                   get_constraint_for (valist, &lhsc);
4239                   do_deref (&lhsc);
4240                   rhs = get_function_part_constraint (fi, ~0);
4241                   rhs.type = ADDRESSOF;
4242                   for (i = 0; VEC_iterate (ce_s, lhsc, i, lhsp); ++i)
4243                     process_constraint (new_constraint (*lhsp, rhs));
4244                   VEC_free (ce_s, heap, lhsc);
4245                   /* va_list is clobbered.  */
4246                   make_constraint_to (get_call_clobber_vi (t)->id, valist);
4247                   return;
4248                 }
4249               break;
4250             }
4251           /* va_end doesn't have any effect that matters.  */
4252           case BUILT_IN_VA_END:
4253             return;
4254           /* Alternate return.  Simply give up for now.  */
4255           case BUILT_IN_RETURN:
4256             {
4257               fi = NULL;
4258               if (!in_ipa_mode
4259                   || !(fi = get_vi_for_tree (cfun->decl)))
4260                 make_constraint_from (get_varinfo (escaped_id), anything_id);
4261               else if (in_ipa_mode
4262                        && fi != NULL)
4263                 {
4264                   struct constraint_expr lhs, rhs;
4265                   lhs = get_function_part_constraint (fi, fi_result);
4266                   rhs.var = anything_id;
4267                   rhs.offset = 0;
4268                   rhs.type = SCALAR;
4269                   process_constraint (new_constraint (lhs, rhs));
4270                 }
4271               return;
4272             }
4273           /* printf-style functions may have hooks to set pointers to
4274              point to somewhere into the generated string.  Leave them
4275              for a later excercise...  */
4276           default:
4277             /* Fallthru to general call handling.  */;
4278           }
4279       if (!in_ipa_mode
4280           || (fndecl
4281               && (!(fi = lookup_vi_for_tree (fndecl))
4282                   || !fi->is_fn_info)))
4283         {
4284           VEC(ce_s, heap) *rhsc = NULL;
4285           int flags = gimple_call_flags (t);
4286
4287           /* Const functions can return their arguments and addresses
4288              of global memory but not of escaped memory.  */
4289           if (flags & (ECF_CONST|ECF_NOVOPS))
4290             {
4291               if (gimple_call_lhs (t)
4292                   && could_have_pointers (gimple_call_lhs (t)))
4293                 handle_const_call (t, &rhsc);
4294             }
4295           /* Pure functions can return addresses in and of memory
4296              reachable from their arguments, but they are not an escape
4297              point for reachable memory of their arguments.  */
4298           else if (flags & (ECF_PURE|ECF_LOOPING_CONST_OR_PURE))
4299             handle_pure_call (t, &rhsc);
4300           else
4301             handle_rhs_call (t, &rhsc);
4302           if (gimple_call_lhs (t)
4303               && could_have_pointers (gimple_call_lhs (t)))
4304             handle_lhs_call (t, gimple_call_lhs (t), flags, rhsc, fndecl);
4305           VEC_free (ce_s, heap, rhsc);
4306         }
4307       else
4308         {
4309           tree lhsop;
4310           unsigned j;
4311
4312           fi = get_fi_for_callee (t);
4313
4314           /* Assign all the passed arguments to the appropriate incoming
4315              parameters of the function.  */
4316           for (j = 0; j < gimple_call_num_args (t); j++)
4317             {
4318               struct constraint_expr lhs ;
4319               struct constraint_expr *rhsp;
4320               tree arg = gimple_call_arg (t, j);
4321
4322               if (!could_have_pointers (arg))
4323                 continue;
4324
4325               get_constraint_for (arg, &rhsc);
4326               lhs = get_function_part_constraint (fi, fi_parm_base + j);
4327               while (VEC_length (ce_s, rhsc) != 0)
4328                 {
4329                   rhsp = VEC_last (ce_s, rhsc);
4330                   process_constraint (new_constraint (lhs, *rhsp));
4331                   VEC_pop (ce_s, rhsc);
4332                 }
4333             }
4334
4335           /* If we are returning a value, assign it to the result.  */
4336           lhsop = gimple_call_lhs (t);
4337           if (lhsop
4338               && type_could_have_pointers (TREE_TYPE (lhsop)))
4339             {
4340               struct constraint_expr rhs;
4341               struct constraint_expr *lhsp;
4342
4343               get_constraint_for (lhsop, &lhsc);
4344               rhs = get_function_part_constraint (fi, fi_result);
4345               if (fndecl
4346                   && DECL_RESULT (fndecl)
4347                   && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
4348                 {
4349                   VEC(ce_s, heap) *tem = NULL;
4350                   VEC_safe_push (ce_s, heap, tem, &rhs);
4351                   do_deref (&tem);
4352                   rhs = *VEC_index (ce_s, tem, 0);
4353                   VEC_free(ce_s, heap, tem);
4354                 }
4355               for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp); j++)
4356                 process_constraint (new_constraint (*lhsp, rhs));
4357             }
4358
4359           /* If we pass the result decl by reference, honor that.  */
4360           if (lhsop
4361               && fndecl
4362               && DECL_RESULT (fndecl)
4363               && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
4364             {
4365               struct constraint_expr lhs;
4366               struct constraint_expr *rhsp;
4367
4368               get_constraint_for_address_of (lhsop, &rhsc);
4369               lhs = get_function_part_constraint (fi, fi_result);
4370               for (j = 0; VEC_iterate (ce_s, rhsc, j, rhsp); j++)
4371                 process_constraint (new_constraint (lhs, *rhsp));
4372               VEC_free (ce_s, heap, rhsc);
4373             }
4374
4375           /* If we use a static chain, pass it along.  */
4376           if (gimple_call_chain (t))
4377             {
4378               struct constraint_expr lhs;
4379               struct constraint_expr *rhsp;
4380
4381               get_constraint_for (gimple_call_chain (t), &rhsc);
4382               lhs = get_function_part_constraint (fi, fi_static_chain);
4383               for (j = 0; VEC_iterate (ce_s, rhsc, j, rhsp); j++)
4384                 process_constraint (new_constraint (lhs, *rhsp));
4385             }
4386         }
4387     }
4388   /* Otherwise, just a regular assignment statement.  Only care about
4389      operations with pointer result, others are dealt with as escape
4390      points if they have pointer operands.  */
4391   else if (is_gimple_assign (t)
4392            && type_could_have_pointers (TREE_TYPE (gimple_assign_lhs (t))))
4393     {
4394       /* Otherwise, just a regular assignment statement.  */
4395       tree lhsop = gimple_assign_lhs (t);
4396       tree rhsop = (gimple_num_ops (t) == 2) ? gimple_assign_rhs1 (t) : NULL;
4397
4398       if (rhsop && AGGREGATE_TYPE_P (TREE_TYPE (lhsop)))
4399         do_structure_copy (lhsop, rhsop);
4400       else
4401         {
4402           struct constraint_expr temp;
4403           get_constraint_for (lhsop, &lhsc);
4404
4405           if (gimple_assign_rhs_code (t) == POINTER_PLUS_EXPR)
4406             get_constraint_for_ptr_offset (gimple_assign_rhs1 (t),
4407                                            gimple_assign_rhs2 (t), &rhsc);
4408           else if (gimple_assign_rhs_code (t) == BIT_AND_EXPR
4409                    && TREE_CODE (gimple_assign_rhs2 (t)) == INTEGER_CST)
4410             {
4411               /* Aligning a pointer via a BIT_AND_EXPR is offsetting
4412                  the pointer.  Handle it by offsetting it by UNKNOWN.  */
4413               get_constraint_for_ptr_offset (gimple_assign_rhs1 (t),
4414                                              NULL_TREE, &rhsc);
4415             }
4416           else if ((CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (t))
4417                     && !(POINTER_TYPE_P (gimple_expr_type (t))
4418                          && !POINTER_TYPE_P (TREE_TYPE (rhsop))))
4419                    || gimple_assign_single_p (t))
4420             get_constraint_for (rhsop, &rhsc);
4421           else
4422             {
4423               temp.type = ADDRESSOF;
4424               temp.var = anything_id;
4425               temp.offset = 0;
4426               VEC_safe_push (ce_s, heap, rhsc, &temp);
4427             }
4428           process_all_all_constraints (lhsc, rhsc);
4429         }
4430       /* If there is a store to a global variable the rhs escapes.  */
4431       if ((lhsop = get_base_address (lhsop)) != NULL_TREE
4432           && DECL_P (lhsop)
4433           && is_global_var (lhsop)
4434           && (!in_ipa_mode
4435               || DECL_EXTERNAL (lhsop) || TREE_PUBLIC (lhsop)))
4436         make_escape_constraint (rhsop);
4437       /* If this is a conversion of a non-restrict pointer to a
4438          restrict pointer track it with a new heapvar.  */
4439       else if (gimple_assign_cast_p (t)
4440                && POINTER_TYPE_P (TREE_TYPE (rhsop))
4441                && POINTER_TYPE_P (TREE_TYPE (lhsop))
4442                && !TYPE_RESTRICT (TREE_TYPE (rhsop))
4443                && TYPE_RESTRICT (TREE_TYPE (lhsop)))
4444         make_constraint_from_restrict (get_vi_for_tree (lhsop),
4445                                        "CAST_RESTRICT");
4446     }
4447   /* For conversions of pointers to non-pointers the pointer escapes.  */
4448   else if (gimple_assign_cast_p (t)
4449            && POINTER_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (t)))
4450            && !POINTER_TYPE_P (TREE_TYPE (gimple_assign_lhs (t))))
4451     {
4452       make_escape_constraint (gimple_assign_rhs1 (t));
4453     }
4454   /* Handle escapes through return.  */
4455   else if (gimple_code (t) == GIMPLE_RETURN
4456            && gimple_return_retval (t) != NULL_TREE
4457            && could_have_pointers (gimple_return_retval (t)))
4458     {
4459       fi = NULL;
4460       if (!in_ipa_mode
4461           || !(fi = get_vi_for_tree (cfun->decl)))
4462         make_escape_constraint (gimple_return_retval (t));
4463       else if (in_ipa_mode
4464                && fi != NULL)
4465         {
4466           struct constraint_expr lhs ;
4467           struct constraint_expr *rhsp;
4468           unsigned i;
4469
4470           lhs = get_function_part_constraint (fi, fi_result);
4471           get_constraint_for (gimple_return_retval (t), &rhsc);
4472           for (i = 0; VEC_iterate (ce_s, rhsc, i, rhsp); i++)
4473             process_constraint (new_constraint (lhs, *rhsp));
4474         }
4475     }
4476   /* Handle asms conservatively by adding escape constraints to everything.  */
4477   else if (gimple_code (t) == GIMPLE_ASM)
4478     {
4479       unsigned i, noutputs;
4480       const char **oconstraints;
4481       const char *constraint;
4482       bool allows_mem, allows_reg, is_inout;
4483
4484       noutputs = gimple_asm_noutputs (t);
4485       oconstraints = XALLOCAVEC (const char *, noutputs);
4486
4487       for (i = 0; i < noutputs; ++i)
4488         {
4489           tree link = gimple_asm_output_op (t, i);
4490           tree op = TREE_VALUE (link);
4491
4492           constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4493           oconstraints[i] = constraint;
4494           parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
4495                                    &allows_reg, &is_inout);
4496
4497           /* A memory constraint makes the address of the operand escape.  */
4498           if (!allows_reg && allows_mem)
4499             make_escape_constraint (build_fold_addr_expr (op));
4500
4501           /* The asm may read global memory, so outputs may point to
4502              any global memory.  */
4503           if (op && could_have_pointers (op))
4504             {
4505               VEC(ce_s, heap) *lhsc = NULL;
4506               struct constraint_expr rhsc, *lhsp;
4507               unsigned j;
4508               get_constraint_for (op, &lhsc);
4509               rhsc.var = nonlocal_id;
4510               rhsc.offset = 0;
4511               rhsc.type = SCALAR;
4512               for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp); j++)
4513                 process_constraint (new_constraint (*lhsp, rhsc));
4514               VEC_free (ce_s, heap, lhsc);
4515             }
4516         }
4517       for (i = 0; i < gimple_asm_ninputs (t); ++i)
4518         {
4519           tree link = gimple_asm_input_op (t, i);
4520           tree op = TREE_VALUE (link);
4521
4522           constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4523
4524           parse_input_constraint (&constraint, 0, 0, noutputs, 0, oconstraints,
4525                                   &allows_mem, &allows_reg);
4526
4527           /* A memory constraint makes the address of the operand escape.  */
4528           if (!allows_reg && allows_mem)
4529             make_escape_constraint (build_fold_addr_expr (op));
4530           /* Strictly we'd only need the constraint to ESCAPED if
4531              the asm clobbers memory, otherwise using something
4532              along the lines of per-call clobbers/uses would be enough.  */
4533           else if (op && could_have_pointers (op))
4534             make_escape_constraint (op);
4535         }
4536     }
4537
4538   VEC_free (ce_s, heap, rhsc);
4539   VEC_free (ce_s, heap, lhsc);
4540 }
4541
4542
4543 /* Create a constraint adding to the clobber set of FI the memory
4544    pointed to by PTR.  */
4545
4546 static void
4547 process_ipa_clobber (varinfo_t fi, tree ptr)
4548 {
4549   VEC(ce_s, heap) *ptrc = NULL;
4550   struct constraint_expr *c, lhs;
4551   unsigned i;
4552   get_constraint_for (ptr, &ptrc);
4553   lhs = get_function_part_constraint (fi, fi_clobbers);
4554   for (i = 0; VEC_iterate (ce_s, ptrc, i, c); i++)
4555     process_constraint (new_constraint (lhs, *c));
4556   VEC_free (ce_s, heap, ptrc);
4557 }
4558
4559 /* Walk statement T setting up clobber and use constraints according to the
4560    references found in T.  This function is a main part of the
4561    IPA constraint builder.  */
4562
4563 static void
4564 find_func_clobbers (gimple origt)
4565 {
4566   gimple t = origt;
4567   VEC(ce_s, heap) *lhsc = NULL;
4568   VEC(ce_s, heap) *rhsc = NULL;
4569   varinfo_t fi;
4570
4571   /* Add constraints for clobbered/used in IPA mode.
4572      We are not interested in what automatic variables are clobbered
4573      or used as we only use the information in the caller to which
4574      they do not escape.  */
4575   gcc_assert (in_ipa_mode);
4576
4577   /* If the stmt refers to memory in any way it better had a VUSE.  */
4578   if (gimple_vuse (t) == NULL_TREE)
4579     return;
4580
4581   /* We'd better have function information for the current function.  */
4582   fi = lookup_vi_for_tree (cfun->decl);
4583   gcc_assert (fi != NULL);
4584
4585   /* Account for stores in assignments and calls.  */
4586   if (gimple_vdef (t) != NULL_TREE
4587       && gimple_has_lhs (t))
4588     {
4589       tree lhs = gimple_get_lhs (t);
4590       tree tem = lhs;
4591       while (handled_component_p (tem))
4592         tem = TREE_OPERAND (tem, 0);
4593       if ((DECL_P (tem)
4594            && !auto_var_in_fn_p (tem, cfun->decl))
4595           || INDIRECT_REF_P (tem)
4596           || (TREE_CODE (tem) == MEM_REF
4597               && !(TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR
4598                    && auto_var_in_fn_p
4599                         (TREE_OPERAND (TREE_OPERAND (tem, 0), 0), cfun->decl))))
4600         {
4601           struct constraint_expr lhsc, *rhsp;
4602           unsigned i;
4603           lhsc = get_function_part_constraint (fi, fi_clobbers);
4604           get_constraint_for_address_of (lhs, &rhsc);
4605           for (i = 0; VEC_iterate (ce_s, rhsc, i, rhsp); i++)
4606             process_constraint (new_constraint (lhsc, *rhsp));
4607           VEC_free (ce_s, heap, rhsc);
4608         }
4609     }
4610
4611   /* Account for uses in assigments and returns.  */
4612   if (gimple_assign_single_p (t)
4613       || (gimple_code (t) == GIMPLE_RETURN
4614           && gimple_return_retval (t) != NULL_TREE))
4615     {
4616       tree rhs = (gimple_assign_single_p (t)
4617                   ? gimple_assign_rhs1 (t) : gimple_return_retval (t));
4618       tree tem = rhs;
4619       while (handled_component_p (tem))
4620         tem = TREE_OPERAND (tem, 0);
4621       if ((DECL_P (tem)
4622            && !auto_var_in_fn_p (tem, cfun->decl))
4623           || INDIRECT_REF_P (tem)
4624           || (TREE_CODE (tem) == MEM_REF
4625               && !(TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR
4626                    && auto_var_in_fn_p
4627                         (TREE_OPERAND (TREE_OPERAND (tem, 0), 0), cfun->decl))))
4628         {
4629           struct constraint_expr lhs, *rhsp;
4630           unsigned i;
4631           lhs = get_function_part_constraint (fi, fi_uses);
4632           get_constraint_for_address_of (rhs, &rhsc);
4633           for (i = 0; VEC_iterate (ce_s, rhsc, i, rhsp); i++)
4634             process_constraint (new_constraint (lhs, *rhsp));
4635           VEC_free (ce_s, heap, rhsc);
4636         }
4637     }
4638
4639   if (is_gimple_call (t))
4640     {
4641       varinfo_t cfi = NULL;
4642       tree decl = gimple_call_fndecl (t);
4643       struct constraint_expr lhs, rhs;
4644       unsigned i, j;
4645
4646       /* For builtins we do not have separate function info.  For those
4647          we do not generate escapes for we have to generate clobbers/uses.  */
4648       if (decl
4649           && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
4650         switch (DECL_FUNCTION_CODE (decl))
4651           {
4652           /* The following functions use and clobber memory pointed to
4653              by their arguments.  */
4654           case BUILT_IN_STRCPY:
4655           case BUILT_IN_STRNCPY:
4656           case BUILT_IN_BCOPY:
4657           case BUILT_IN_MEMCPY:
4658           case BUILT_IN_MEMMOVE:
4659           case BUILT_IN_MEMPCPY:
4660           case BUILT_IN_STPCPY:
4661           case BUILT_IN_STPNCPY:
4662           case BUILT_IN_STRCAT:
4663           case BUILT_IN_STRNCAT:
4664             {
4665               tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (decl)
4666                                                == BUILT_IN_BCOPY ? 1 : 0));
4667               tree src = gimple_call_arg (t, (DECL_FUNCTION_CODE (decl)
4668                                               == BUILT_IN_BCOPY ? 0 : 1));
4669               unsigned i;
4670               struct constraint_expr *rhsp, *lhsp;
4671               get_constraint_for_ptr_offset (dest, NULL_TREE, &lhsc);
4672               lhs = get_function_part_constraint (fi, fi_clobbers);
4673               for (i = 0; VEC_iterate (ce_s, lhsc, i, lhsp); i++)
4674                 process_constraint (new_constraint (lhs, *lhsp));
4675               VEC_free (ce_s, heap, lhsc);
4676               get_constraint_for_ptr_offset (src, NULL_TREE, &rhsc);
4677               lhs = get_function_part_constraint (fi, fi_uses);
4678               for (i = 0; VEC_iterate (ce_s, rhsc, i, rhsp); i++)
4679                 process_constraint (new_constraint (lhs, *rhsp));
4680               VEC_free (ce_s, heap, rhsc);
4681               return;
4682             }
4683           /* The following function clobbers memory pointed to by
4684              its argument.  */
4685           case BUILT_IN_MEMSET:
4686             {
4687               tree dest = gimple_call_arg (t, 0);
4688               unsigned i;
4689               ce_s *lhsp;
4690               get_constraint_for_ptr_offset (dest, NULL_TREE, &lhsc);
4691               lhs = get_function_part_constraint (fi, fi_clobbers);
4692               for (i = 0; VEC_iterate (ce_s, lhsc, i, lhsp); i++)
4693                 process_constraint (new_constraint (lhs, *lhsp));
4694               VEC_free (ce_s, heap, lhsc);
4695               return;
4696             }
4697           /* The following functions clobber their second and third
4698              arguments.  */
4699           case BUILT_IN_SINCOS:
4700           case BUILT_IN_SINCOSF:
4701           case BUILT_IN_SINCOSL:
4702             {
4703               process_ipa_clobber (fi, gimple_call_arg (t, 1));
4704               process_ipa_clobber (fi, gimple_call_arg (t, 2));
4705               return;
4706             }
4707           /* The following functions clobber their second argument.  */
4708           case BUILT_IN_FREXP:
4709           case BUILT_IN_FREXPF:
4710           case BUILT_IN_FREXPL:
4711           case BUILT_IN_LGAMMA_R:
4712           case BUILT_IN_LGAMMAF_R:
4713           case BUILT_IN_LGAMMAL_R:
4714           case BUILT_IN_GAMMA_R:
4715           case BUILT_IN_GAMMAF_R:
4716           case BUILT_IN_GAMMAL_R:
4717           case BUILT_IN_MODF:
4718           case BUILT_IN_MODFF:
4719           case BUILT_IN_MODFL:
4720             {
4721               process_ipa_clobber (fi, gimple_call_arg (t, 1));
4722               return;
4723             }
4724           /* The following functions clobber their third argument.  */
4725           case BUILT_IN_REMQUO:
4726           case BUILT_IN_REMQUOF:
4727           case BUILT_IN_REMQUOL:
4728             {
4729               process_ipa_clobber (fi, gimple_call_arg (t, 2));
4730               return;
4731             }
4732           /* The following functions neither read nor clobber memory.  */
4733           case BUILT_IN_FREE:
4734             return;
4735           /* Trampolines are of no interest to us.  */
4736           case BUILT_IN_INIT_TRAMPOLINE:
4737           case BUILT_IN_ADJUST_TRAMPOLINE:
4738             return;
4739           case BUILT_IN_VA_START:
4740           case BUILT_IN_VA_END:
4741             return;
4742           /* printf-style functions may have hooks to set pointers to
4743              point to somewhere into the generated string.  Leave them
4744              for a later excercise...  */
4745           default:
4746             /* Fallthru to general call handling.  */;
4747           }
4748
4749       /* Parameters passed by value are used.  */
4750       lhs = get_function_part_constraint (fi, fi_uses);
4751       for (i = 0; i < gimple_call_num_args (t); i++)
4752         {
4753           struct constraint_expr *rhsp;
4754           tree arg = gimple_call_arg (t, i);
4755
4756           if (TREE_CODE (arg) == SSA_NAME
4757               || is_gimple_min_invariant (arg))
4758             continue;
4759
4760           get_constraint_for_address_of (arg, &rhsc);
4761           for (j = 0; VEC_iterate (ce_s, rhsc, j, rhsp); j++)
4762             process_constraint (new_constraint (lhs, *rhsp));
4763           VEC_free (ce_s, heap, rhsc);
4764         }
4765
4766       /* Build constraints for propagating clobbers/uses along the
4767          callgraph edges.  */
4768       cfi = get_fi_for_callee (t);
4769       if (cfi->id == anything_id)
4770         {
4771           if (gimple_vdef (t))
4772             make_constraint_from (first_vi_for_offset (fi, fi_clobbers),
4773                                   anything_id);
4774           make_constraint_from (first_vi_for_offset (fi, fi_uses),
4775                                 anything_id);
4776           return;
4777         }
4778
4779       /* For callees without function info (that's external functions),
4780          ESCAPED is clobbered and used.  */
4781       if (gimple_call_fndecl (t)
4782           && !cfi->is_fn_info)
4783         {
4784           varinfo_t vi;
4785
4786           if (gimple_vdef (t))
4787             make_copy_constraint (first_vi_for_offset (fi, fi_clobbers),
4788                                   escaped_id);
4789           make_copy_constraint (first_vi_for_offset (fi, fi_uses), escaped_id);
4790
4791           /* Also honor the call statement use/clobber info.  */
4792           if ((vi = lookup_call_clobber_vi (t)) != NULL)
4793             make_copy_constraint (first_vi_for_offset (fi, fi_clobbers),
4794                                   vi->id);
4795           if ((vi = lookup_call_use_vi (t)) != NULL)
4796             make_copy_constraint (first_vi_for_offset (fi, fi_uses),
4797                                   vi->id);
4798           return;
4799         }
4800
4801       /* Otherwise the caller clobbers and uses what the callee does.
4802          ???  This should use a new complex constraint that filters
4803          local variables of the callee.  */
4804       if (gimple_vdef (t))
4805         {
4806           lhs = get_function_part_constraint (fi, fi_clobbers);
4807           rhs = get_function_part_constraint (cfi, fi_clobbers);
4808           process_constraint (new_constraint (lhs, rhs));
4809         }
4810       lhs = get_function_part_constraint (fi, fi_uses);
4811       rhs = get_function_part_constraint (cfi, fi_uses);
4812       process_constraint (new_constraint (lhs, rhs));
4813     }
4814   else if (gimple_code (t) == GIMPLE_ASM)
4815     {
4816       /* ???  Ick.  We can do better.  */
4817       if (gimple_vdef (t))
4818         make_constraint_from (first_vi_for_offset (fi, fi_clobbers),
4819                               anything_id);
4820       make_constraint_from (first_vi_for_offset (fi, fi_uses),
4821                             anything_id);
4822     }
4823
4824   VEC_free (ce_s, heap, rhsc);
4825 }
4826
4827
4828 /* Find the first varinfo in the same variable as START that overlaps with
4829    OFFSET.  Return NULL if we can't find one.  */
4830
4831 static varinfo_t
4832 first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset)
4833 {
4834   /* If the offset is outside of the variable, bail out.  */
4835   if (offset >= start->fullsize)
4836     return NULL;
4837
4838   /* If we cannot reach offset from start, lookup the first field
4839      and start from there.  */
4840   if (start->offset > offset)
4841     start = lookup_vi_for_tree (start->decl);
4842
4843   while (start)
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 (offset >= start->offset
4850           && (offset - start->offset) < start->size)
4851         return start;
4852
4853       start= start->next;
4854     }
4855
4856   return NULL;
4857 }
4858
4859 /* Find the first varinfo in the same variable as START that overlaps with
4860    OFFSET.  If there is no such varinfo the varinfo directly preceding
4861    OFFSET is returned.  */
4862
4863 static varinfo_t
4864 first_or_preceding_vi_for_offset (varinfo_t start,
4865                                   unsigned HOST_WIDE_INT offset)
4866 {
4867   /* If we cannot reach offset from start, lookup the first field
4868      and start from there.  */
4869   if (start->offset > offset)
4870     start = lookup_vi_for_tree (start->decl);
4871
4872   /* We may not find a variable in the field list with the actual
4873      offset when when we have glommed a structure to a variable.
4874      In that case, however, offset should still be within the size
4875      of the variable.
4876      If we got beyond the offset we look for return the field
4877      directly preceding offset which may be the last field.  */
4878   while (start->next
4879          && offset >= start->offset
4880          && !((offset - start->offset) < start->size))
4881     start = start->next;
4882
4883   return start;
4884 }
4885
4886
4887 /* This structure is used during pushing fields onto the fieldstack
4888    to track the offset of the field, since bitpos_of_field gives it
4889    relative to its immediate containing type, and we want it relative
4890    to the ultimate containing object.  */
4891
4892 struct fieldoff
4893 {
4894   /* Offset from the base of the base containing object to this field.  */
4895   HOST_WIDE_INT offset;
4896
4897   /* Size, in bits, of the field.  */
4898   unsigned HOST_WIDE_INT size;
4899
4900   unsigned has_unknown_size : 1;
4901
4902   unsigned may_have_pointers : 1;
4903
4904   unsigned only_restrict_pointers : 1;
4905 };
4906 typedef struct fieldoff fieldoff_s;
4907
4908 DEF_VEC_O(fieldoff_s);
4909 DEF_VEC_ALLOC_O(fieldoff_s,heap);
4910
4911 /* qsort comparison function for two fieldoff's PA and PB */
4912
4913 static int
4914 fieldoff_compare (const void *pa, const void *pb)
4915 {
4916   const fieldoff_s *foa = (const fieldoff_s *)pa;
4917   const fieldoff_s *fob = (const fieldoff_s *)pb;
4918   unsigned HOST_WIDE_INT foasize, fobsize;
4919
4920   if (foa->offset < fob->offset)
4921     return -1;
4922   else if (foa->offset > fob->offset)
4923     return 1;
4924
4925   foasize = foa->size;
4926   fobsize = fob->size;
4927   if (foasize < fobsize)
4928     return -1;
4929   else if (foasize > fobsize)
4930     return 1;
4931   return 0;
4932 }
4933
4934 /* Sort a fieldstack according to the field offset and sizes.  */
4935 static void
4936 sort_fieldstack (VEC(fieldoff_s,heap) *fieldstack)
4937 {
4938   qsort (VEC_address (fieldoff_s, fieldstack),
4939          VEC_length (fieldoff_s, fieldstack),
4940          sizeof (fieldoff_s),
4941          fieldoff_compare);
4942 }
4943
4944 /* Return true if V is a tree that we can have subvars for.
4945    Normally, this is any aggregate type.  Also complex
4946    types which are not gimple registers can have subvars.  */
4947
4948 static inline bool
4949 var_can_have_subvars (const_tree v)
4950 {
4951   /* Volatile variables should never have subvars.  */
4952   if (TREE_THIS_VOLATILE (v))
4953     return false;
4954
4955   /* Non decls or memory tags can never have subvars.  */
4956   if (!DECL_P (v))
4957     return false;
4958
4959   /* Aggregates without overlapping fields can have subvars.  */
4960   if (TREE_CODE (TREE_TYPE (v)) == RECORD_TYPE)
4961     return true;
4962
4963   return false;
4964 }
4965
4966 /* Given a TYPE, and a vector of field offsets FIELDSTACK, push all
4967    the fields of TYPE onto fieldstack, recording their offsets along
4968    the way.
4969
4970    OFFSET is used to keep track of the offset in this entire
4971    structure, rather than just the immediately containing structure.
4972    Returns false if the caller is supposed to handle the field we
4973    recursed for.  */
4974
4975 static bool
4976 push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
4977                              HOST_WIDE_INT offset, bool must_have_pointers_p)
4978 {
4979   tree field;
4980   bool empty_p = true;
4981
4982   if (TREE_CODE (type) != RECORD_TYPE)
4983     return false;
4984
4985   /* If the vector of fields is growing too big, bail out early.
4986      Callers check for VEC_length <= MAX_FIELDS_FOR_FIELD_SENSITIVE, make
4987      sure this fails.  */
4988   if (VEC_length (fieldoff_s, *fieldstack) > MAX_FIELDS_FOR_FIELD_SENSITIVE)
4989     return false;
4990
4991   for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
4992     if (TREE_CODE (field) == FIELD_DECL)
4993       {
4994         bool push = false;
4995         HOST_WIDE_INT foff = bitpos_of_field (field);
4996
4997         if (!var_can_have_subvars (field)
4998             || TREE_CODE (TREE_TYPE (field)) == QUAL_UNION_TYPE
4999             || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
5000           push = true;
5001         else if (!push_fields_onto_fieldstack
5002                     (TREE_TYPE (field), fieldstack, offset + foff,
5003                      must_have_pointers_p)
5004                  && (DECL_SIZE (field)
5005                      && !integer_zerop (DECL_SIZE (field))))
5006           /* Empty structures may have actual size, like in C++.  So
5007              see if we didn't push any subfields and the size is
5008              nonzero, push the field onto the stack.  */
5009           push = true;
5010
5011         if (push)
5012           {
5013             fieldoff_s *pair = NULL;
5014             bool has_unknown_size = false;
5015
5016             if (!VEC_empty (fieldoff_s, *fieldstack))
5017               pair = VEC_last (fieldoff_s, *fieldstack);
5018
5019             if (!DECL_SIZE (field)
5020                 || !host_integerp (DECL_SIZE (field), 1))
5021               has_unknown_size = true;
5022
5023             /* If adjacent fields do not contain pointers merge them.  */
5024             if (pair
5025                 && !pair->may_have_pointers
5026                 && !pair->has_unknown_size
5027                 && !has_unknown_size
5028                 && pair->offset + (HOST_WIDE_INT)pair->size == offset + foff
5029                 && !must_have_pointers_p
5030                 && !could_have_pointers (field))
5031               {
5032                 pair->size += TREE_INT_CST_LOW (DECL_SIZE (field));
5033               }
5034             else
5035               {
5036                 pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
5037                 pair->offset = offset + foff;
5038                 pair->has_unknown_size = has_unknown_size;
5039                 if (!has_unknown_size)
5040                   pair->size = TREE_INT_CST_LOW (DECL_SIZE (field));
5041                 else
5042                   pair->size = -1;
5043                 pair->may_have_pointers
5044                   = must_have_pointers_p || could_have_pointers (field);
5045                 pair->only_restrict_pointers
5046                   = (!has_unknown_size
5047                      && POINTER_TYPE_P (TREE_TYPE (field))
5048                      && TYPE_RESTRICT (TREE_TYPE (field)));
5049               }
5050           }
5051
5052         empty_p = false;
5053       }
5054
5055   return !empty_p;
5056 }
5057
5058 /* Count the number of arguments DECL has, and set IS_VARARGS to true
5059    if it is a varargs function.  */
5060
5061 static unsigned int
5062 count_num_arguments (tree decl, bool *is_varargs)
5063 {
5064   unsigned int num = 0;
5065   tree t;
5066
5067   /* Capture named arguments for K&R functions.  They do not
5068      have a prototype and thus no TYPE_ARG_TYPES.  */
5069   for (t = DECL_ARGUMENTS (decl); t; t = DECL_CHAIN (t))
5070     ++num;
5071
5072   /* Check if the function has variadic arguments.  */
5073   for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); t; t = TREE_CHAIN (t))
5074     if (TREE_VALUE (t) == void_type_node)
5075       break;
5076   if (!t)
5077     *is_varargs = true;
5078
5079   return num;
5080 }
5081
5082 /* Creation function node for DECL, using NAME, and return the index
5083    of the variable we've created for the function.  */
5084
5085 static varinfo_t
5086 create_function_info_for (tree decl, const char *name)
5087 {
5088   struct function *fn = DECL_STRUCT_FUNCTION (decl);
5089   varinfo_t vi, prev_vi;
5090   tree arg;
5091   unsigned int i;
5092   bool is_varargs = false;
5093   unsigned int num_args = count_num_arguments (decl, &is_varargs);
5094
5095   /* Create the variable info.  */
5096
5097   vi = new_var_info (decl, name);
5098   vi->offset = 0;
5099   vi->size = 1;
5100   vi->fullsize = fi_parm_base + num_args;
5101   vi->is_fn_info = 1;
5102   vi->may_have_pointers = false;
5103   if (is_varargs)
5104     vi->fullsize = ~0;
5105   insert_vi_for_tree (vi->decl, vi);
5106
5107   prev_vi = vi;
5108
5109   /* Create a variable for things the function clobbers and one for
5110      things the function uses.  */
5111     {
5112       varinfo_t clobbervi, usevi;
5113       const char *newname;
5114       char *tempname;
5115
5116       asprintf (&tempname, "%s.clobber", name);
5117       newname = ggc_strdup (tempname);
5118       free (tempname);
5119
5120       clobbervi = new_var_info (NULL, newname);
5121       clobbervi->offset = fi_clobbers;
5122       clobbervi->size = 1;
5123       clobbervi->fullsize = vi->fullsize;
5124       clobbervi->is_full_var = true;
5125       clobbervi->is_global_var = false;
5126       gcc_assert (prev_vi->offset < clobbervi->offset);
5127       prev_vi->next = clobbervi;
5128       prev_vi = clobbervi;
5129
5130       asprintf (&tempname, "%s.use", name);
5131       newname = ggc_strdup (tempname);
5132       free (tempname);
5133
5134       usevi = new_var_info (NULL, newname);
5135       usevi->offset = fi_uses;
5136       usevi->size = 1;
5137       usevi->fullsize = vi->fullsize;
5138       usevi->is_full_var = true;
5139       usevi->is_global_var = false;
5140       gcc_assert (prev_vi->offset < usevi->offset);
5141       prev_vi->next = usevi;
5142       prev_vi = usevi;
5143     }
5144
5145   /* And one for the static chain.  */
5146   if (fn->static_chain_decl != NULL_TREE)
5147     {
5148       varinfo_t chainvi;
5149       const char *newname;
5150       char *tempname;
5151
5152       asprintf (&tempname, "%s.chain", name);
5153       newname = ggc_strdup (tempname);
5154       free (tempname);
5155
5156       chainvi = new_var_info (fn->static_chain_decl, newname);
5157       chainvi->offset = fi_static_chain;
5158       chainvi->size = 1;
5159       chainvi->fullsize = vi->fullsize;
5160       chainvi->is_full_var = true;
5161       chainvi->is_global_var = false;
5162       gcc_assert (prev_vi->offset < chainvi->offset);
5163       prev_vi->next = chainvi;
5164       prev_vi = chainvi;
5165       insert_vi_for_tree (fn->static_chain_decl, chainvi);
5166     }
5167
5168   /* Create a variable for the return var.  */
5169   if (DECL_RESULT (decl) != NULL
5170       || !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
5171     {
5172       varinfo_t resultvi;
5173       const char *newname;
5174       char *tempname;
5175       tree resultdecl = decl;
5176
5177       if (DECL_RESULT (decl))
5178         resultdecl = DECL_RESULT (decl);
5179
5180       asprintf (&tempname, "%s.result", name);
5181       newname = ggc_strdup (tempname);
5182       free (tempname);
5183
5184       resultvi = new_var_info (resultdecl, newname);
5185       resultvi->offset = fi_result;
5186       resultvi->size = 1;
5187       resultvi->fullsize = vi->fullsize;
5188       resultvi->is_full_var = true;
5189       if (DECL_RESULT (decl))
5190         resultvi->may_have_pointers = could_have_pointers (DECL_RESULT (decl));
5191       gcc_assert (prev_vi->offset < resultvi->offset);
5192       prev_vi->next = resultvi;
5193       prev_vi = resultvi;
5194       if (DECL_RESULT (decl))
5195         insert_vi_for_tree (DECL_RESULT (decl), resultvi);
5196     }
5197
5198   /* Set up variables for each argument.  */
5199   arg = DECL_ARGUMENTS (decl);
5200   for (i = 0; i < num_args; i++)
5201     {
5202       varinfo_t argvi;
5203       const char *newname;
5204       char *tempname;
5205       tree argdecl = decl;
5206
5207       if (arg)
5208         argdecl = arg;
5209
5210       asprintf (&tempname, "%s.arg%d", name, i);
5211       newname = ggc_strdup (tempname);
5212       free (tempname);
5213
5214       argvi = new_var_info (argdecl, newname);
5215       argvi->offset = fi_parm_base + i;
5216       argvi->size = 1;
5217       argvi->is_full_var = true;
5218       argvi->fullsize = vi->fullsize;
5219       if (arg)
5220         argvi->may_have_pointers = could_have_pointers (arg);
5221       gcc_assert (prev_vi->offset < argvi->offset);
5222       prev_vi->next = argvi;
5223       prev_vi = argvi;
5224       if (arg)
5225         {
5226           insert_vi_for_tree (arg, argvi);
5227           arg = DECL_CHAIN (arg);
5228         }
5229     }
5230
5231   /* Add one representative for all further args.  */
5232   if (is_varargs)
5233     {
5234       varinfo_t argvi;
5235       const char *newname;
5236       char *tempname;
5237       tree decl;
5238
5239       asprintf (&tempname, "%s.varargs", name);
5240       newname = ggc_strdup (tempname);
5241       free (tempname);
5242
5243       /* We need sth that can be pointed to for va_start.  */
5244       decl = create_tmp_var_raw (ptr_type_node, name);
5245       get_var_ann (decl);
5246
5247       argvi = new_var_info (decl, newname);
5248       argvi->offset = fi_parm_base + num_args;
5249       argvi->size = ~0;
5250       argvi->is_full_var = true;
5251       argvi->is_heap_var = true;
5252       argvi->fullsize = vi->fullsize;
5253       gcc_assert (prev_vi->offset < argvi->offset);
5254       prev_vi->next = argvi;
5255       prev_vi = argvi;
5256     }
5257
5258   return vi;
5259 }
5260
5261
5262 /* Return true if FIELDSTACK contains fields that overlap.
5263    FIELDSTACK is assumed to be sorted by offset.  */
5264
5265 static bool
5266 check_for_overlaps (VEC (fieldoff_s,heap) *fieldstack)
5267 {
5268   fieldoff_s *fo = NULL;
5269   unsigned int i;
5270   HOST_WIDE_INT lastoffset = -1;
5271
5272   for (i = 0; VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
5273     {
5274       if (fo->offset == lastoffset)
5275         return true;
5276       lastoffset = fo->offset;
5277     }
5278   return false;
5279 }
5280
5281 /* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
5282    This will also create any varinfo structures necessary for fields
5283    of DECL.  */
5284
5285 static varinfo_t
5286 create_variable_info_for_1 (tree decl, const char *name)
5287 {
5288   varinfo_t vi, newvi;
5289   tree decl_type = TREE_TYPE (decl);
5290   tree declsize = DECL_P (decl) ? DECL_SIZE (decl) : TYPE_SIZE (decl_type);
5291   VEC (fieldoff_s,heap) *fieldstack = NULL;
5292   fieldoff_s *fo;
5293   unsigned int i;
5294
5295   if (!declsize
5296       || !host_integerp (declsize, 1))
5297     {
5298       vi = new_var_info (decl, name);
5299       vi->offset = 0;
5300       vi->size = ~0;
5301       vi->fullsize = ~0;
5302       vi->is_unknown_size_var = true;
5303       vi->is_full_var = true;
5304       vi->may_have_pointers = could_have_pointers (decl);
5305       return vi;
5306     }
5307
5308   /* Collect field information.  */
5309   if (use_field_sensitive
5310       && var_can_have_subvars (decl)
5311       /* ???  Force us to not use subfields for global initializers
5312          in IPA mode.  Else we'd have to parse arbitrary initializers.  */
5313       && !(in_ipa_mode
5314            && is_global_var (decl)
5315            && DECL_INITIAL (decl)))
5316     {
5317       fieldoff_s *fo = NULL;
5318       bool notokay = false;
5319       unsigned int i;
5320
5321       push_fields_onto_fieldstack (decl_type, &fieldstack, 0,
5322                                    TREE_PUBLIC (decl)
5323                                    || DECL_EXTERNAL (decl)
5324                                    || TREE_ADDRESSABLE (decl));
5325
5326       for (i = 0; !notokay && VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
5327         if (fo->has_unknown_size
5328             || fo->offset < 0)
5329           {
5330             notokay = true;
5331             break;
5332           }
5333
5334       /* We can't sort them if we have a field with a variable sized type,
5335          which will make notokay = true.  In that case, we are going to return
5336          without creating varinfos for the fields anyway, so sorting them is a
5337          waste to boot.  */
5338       if (!notokay)
5339         {
5340           sort_fieldstack (fieldstack);
5341           /* Due to some C++ FE issues, like PR 22488, we might end up
5342              what appear to be overlapping fields even though they,
5343              in reality, do not overlap.  Until the C++ FE is fixed,
5344              we will simply disable field-sensitivity for these cases.  */
5345           notokay = check_for_overlaps (fieldstack);
5346         }
5347
5348       if (notokay)
5349         VEC_free (fieldoff_s, heap, fieldstack);
5350     }
5351
5352   /* If we didn't end up collecting sub-variables create a full
5353      variable for the decl.  */
5354   if (VEC_length (fieldoff_s, fieldstack) <= 1
5355       || VEC_length (fieldoff_s, fieldstack) > MAX_FIELDS_FOR_FIELD_SENSITIVE)
5356     {
5357       vi = new_var_info (decl, name);
5358       vi->offset = 0;
5359       vi->may_have_pointers = could_have_pointers (decl);
5360       vi->fullsize = TREE_INT_CST_LOW (declsize);
5361       vi->size = vi->fullsize;
5362       vi->is_full_var = true;
5363       VEC_free (fieldoff_s, heap, fieldstack);
5364       return vi;
5365     }
5366
5367   vi = new_var_info (decl, name);
5368   vi->fullsize = TREE_INT_CST_LOW (declsize);
5369   for (i = 0, newvi = vi;
5370        VEC_iterate (fieldoff_s, fieldstack, i, fo);
5371        ++i, newvi = newvi->next)
5372     {
5373       const char *newname = "NULL";
5374       char *tempname;
5375
5376       if (dump_file)
5377         {
5378           asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC
5379                     "+" HOST_WIDE_INT_PRINT_DEC, name, fo->offset, fo->size);
5380           newname = ggc_strdup (tempname);
5381           free (tempname);
5382         }
5383       newvi->name = newname;
5384       newvi->offset = fo->offset;
5385       newvi->size = fo->size;
5386       newvi->fullsize = vi->fullsize;
5387       newvi->may_have_pointers = fo->may_have_pointers;
5388       newvi->only_restrict_pointers = fo->only_restrict_pointers;
5389       if (i + 1 < VEC_length (fieldoff_s, fieldstack))
5390         newvi->next = new_var_info (decl, name);
5391     }
5392
5393   VEC_free (fieldoff_s, heap, fieldstack);
5394
5395   return vi;
5396 }
5397
5398 static unsigned int
5399 create_variable_info_for (tree decl, const char *name)
5400 {
5401   varinfo_t vi = create_variable_info_for_1 (decl, name);
5402   unsigned int id = vi->id;
5403
5404   insert_vi_for_tree (decl, vi);
5405
5406   /* Create initial constraints for globals.  */
5407   for (; vi; vi = vi->next)
5408     {
5409       if (!vi->may_have_pointers
5410           || !vi->is_global_var)
5411         continue;
5412
5413       /* Mark global restrict qualified pointers.  */
5414       if ((POINTER_TYPE_P (TREE_TYPE (decl))
5415            && TYPE_RESTRICT (TREE_TYPE (decl)))
5416           || vi->only_restrict_pointers)
5417         make_constraint_from_restrict (vi, "GLOBAL_RESTRICT");
5418
5419       /* For escaped variables initialize them from nonlocal.  */
5420       if (!in_ipa_mode
5421           || DECL_EXTERNAL (decl) || TREE_PUBLIC (decl))
5422         make_copy_constraint (vi, nonlocal_id);
5423
5424       /* If this is a global variable with an initializer and we are in
5425          IPA mode generate constraints for it.  In non-IPA mode
5426          the initializer from nonlocal is all we need.  */
5427       if (in_ipa_mode
5428           && DECL_INITIAL (decl))
5429         {
5430           VEC (ce_s, heap) *rhsc = NULL;
5431           struct constraint_expr lhs, *rhsp;
5432           unsigned i;
5433           get_constraint_for (DECL_INITIAL (decl), &rhsc);
5434           lhs.var = vi->id;
5435           lhs.offset = 0;
5436           lhs.type = SCALAR;
5437           for (i = 0; VEC_iterate (ce_s, rhsc, i, rhsp); ++i)
5438             process_constraint (new_constraint (lhs, *rhsp));
5439           /* If this is a variable that escapes from the unit
5440              the initializer escapes as well.  */
5441           if (DECL_EXTERNAL (decl) || TREE_PUBLIC (decl))
5442             {
5443               lhs.var = escaped_id;
5444               lhs.offset = 0;
5445               lhs.type = SCALAR;
5446               for (i = 0; VEC_iterate (ce_s, rhsc, i, rhsp); ++i)
5447                 process_constraint (new_constraint (lhs, *rhsp));
5448             }
5449           VEC_free (ce_s, heap, rhsc);
5450         }
5451     }
5452
5453   return id;
5454 }
5455
5456 /* Print out the points-to solution for VAR to FILE.  */
5457
5458 static void
5459 dump_solution_for_var (FILE *file, unsigned int var)
5460 {
5461   varinfo_t vi = get_varinfo (var);
5462   unsigned int i;
5463   bitmap_iterator bi;
5464
5465   /* Dump the solution for unified vars anyway, this avoids difficulties
5466      in scanning dumps in the testsuite.  */
5467   fprintf (file, "%s = { ", vi->name);
5468   vi = get_varinfo (find (var));
5469   EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
5470     fprintf (file, "%s ", get_varinfo (i)->name);
5471   fprintf (file, "}");
5472
5473   /* But note when the variable was unified.  */
5474   if (vi->id != var)
5475     fprintf (file, " same as %s", vi->name);
5476
5477   fprintf (file, "\n");
5478 }
5479
5480 /* Print the points-to solution for VAR to stdout.  */
5481
5482 DEBUG_FUNCTION void
5483 debug_solution_for_var (unsigned int var)
5484 {
5485   dump_solution_for_var (stdout, var);
5486 }
5487
5488 /* Create varinfo structures for all of the variables in the
5489    function for intraprocedural mode.  */
5490
5491 static void
5492 intra_create_variable_infos (void)
5493 {
5494   tree t;
5495
5496   /* For each incoming pointer argument arg, create the constraint ARG
5497      = NONLOCAL or a dummy variable if it is a restrict qualified
5498      passed-by-reference argument.  */
5499   for (t = DECL_ARGUMENTS (current_function_decl); t; t = DECL_CHAIN (t))
5500     {
5501       varinfo_t p;
5502
5503       if (!could_have_pointers (t))
5504         continue;
5505
5506       /* For restrict qualified pointers to objects passed by
5507          reference build a real representative for the pointed-to object.  */
5508       if (DECL_BY_REFERENCE (t)
5509           && POINTER_TYPE_P (TREE_TYPE (t))
5510           && TYPE_RESTRICT (TREE_TYPE (t)))
5511         {
5512           struct constraint_expr lhsc, rhsc;
5513           varinfo_t vi;
5514           tree heapvar = heapvar_lookup (t, 0);
5515           if (heapvar == NULL_TREE)
5516             {
5517               var_ann_t ann;
5518               heapvar = create_tmp_var_raw (TREE_TYPE (TREE_TYPE (t)),
5519                                             "PARM_NOALIAS");
5520               DECL_EXTERNAL (heapvar) = 1;
5521               heapvar_insert (t, 0, heapvar);
5522               ann = get_var_ann (heapvar);
5523               ann->is_heapvar = 1;
5524             }
5525           if (gimple_referenced_vars (cfun))
5526             add_referenced_var (heapvar);
5527           lhsc.var = get_vi_for_tree (t)->id;
5528           lhsc.type = SCALAR;
5529           lhsc.offset = 0;
5530           rhsc.var = (vi = get_vi_for_tree (heapvar))->id;
5531           rhsc.type = ADDRESSOF;
5532           rhsc.offset = 0;
5533           process_constraint (new_constraint (lhsc, rhsc));
5534           vi->is_restrict_var = 1;
5535           continue;
5536         }
5537
5538       for (p = get_vi_for_tree (t); p; p = p->next)
5539         {
5540           if (p->may_have_pointers)
5541             make_constraint_from (p, nonlocal_id);
5542           if (p->only_restrict_pointers)
5543             make_constraint_from_restrict (p, "PARM_RESTRICT");
5544         }
5545       if (POINTER_TYPE_P (TREE_TYPE (t))
5546           && TYPE_RESTRICT (TREE_TYPE (t)))
5547         make_constraint_from_restrict (get_vi_for_tree (t), "PARM_RESTRICT");
5548     }
5549
5550   /* Add a constraint for a result decl that is passed by reference.  */
5551   if (DECL_RESULT (cfun->decl)
5552       && DECL_BY_REFERENCE (DECL_RESULT (cfun->decl)))
5553     {
5554       varinfo_t p, result_vi = get_vi_for_tree (DECL_RESULT (cfun->decl));
5555
5556       for (p = result_vi; p; p = p->next)
5557         make_constraint_from (p, nonlocal_id);
5558     }
5559
5560   /* Add a constraint for the incoming static chain parameter.  */
5561   if (cfun->static_chain_decl != NULL_TREE)
5562     {
5563       varinfo_t p, chain_vi = get_vi_for_tree (cfun->static_chain_decl);
5564
5565       for (p = chain_vi; p; p = p->next)
5566         make_constraint_from (p, nonlocal_id);
5567     }
5568 }
5569
5570 /* Structure used to put solution bitmaps in a hashtable so they can
5571    be shared among variables with the same points-to set.  */
5572
5573 typedef struct shared_bitmap_info
5574 {
5575   bitmap pt_vars;
5576   hashval_t hashcode;
5577 } *shared_bitmap_info_t;
5578 typedef const struct shared_bitmap_info *const_shared_bitmap_info_t;
5579
5580 static htab_t shared_bitmap_table;
5581
5582 /* Hash function for a shared_bitmap_info_t */
5583
5584 static hashval_t
5585 shared_bitmap_hash (const void *p)
5586 {
5587   const_shared_bitmap_info_t const bi = (const_shared_bitmap_info_t) p;
5588   return bi->hashcode;
5589 }
5590
5591 /* Equality function for two shared_bitmap_info_t's. */
5592
5593 static int
5594 shared_bitmap_eq (const void *p1, const void *p2)
5595 {
5596   const_shared_bitmap_info_t const sbi1 = (const_shared_bitmap_info_t) p1;
5597   const_shared_bitmap_info_t const sbi2 = (const_shared_bitmap_info_t) p2;
5598   return bitmap_equal_p (sbi1->pt_vars, sbi2->pt_vars);
5599 }
5600
5601 /* Lookup a bitmap in the shared bitmap hashtable, and return an already
5602    existing instance if there is one, NULL otherwise.  */
5603
5604 static bitmap
5605 shared_bitmap_lookup (bitmap pt_vars)
5606 {
5607   void **slot;
5608   struct shared_bitmap_info sbi;
5609
5610   sbi.pt_vars = pt_vars;
5611   sbi.hashcode = bitmap_hash (pt_vars);
5612
5613   slot = htab_find_slot_with_hash (shared_bitmap_table, &sbi,
5614                                    sbi.hashcode, NO_INSERT);
5615   if (!slot)
5616     return NULL;
5617   else
5618     return ((shared_bitmap_info_t) *slot)->pt_vars;
5619 }
5620
5621
5622 /* Add a bitmap to the shared bitmap hashtable.  */
5623
5624 static void
5625 shared_bitmap_add (bitmap pt_vars)
5626 {
5627   void **slot;
5628   shared_bitmap_info_t sbi = XNEW (struct shared_bitmap_info);
5629
5630   sbi->pt_vars = pt_vars;
5631   sbi->hashcode = bitmap_hash (pt_vars);
5632
5633   slot = htab_find_slot_with_hash (shared_bitmap_table, sbi,
5634                                    sbi->hashcode, INSERT);
5635   gcc_assert (!*slot);
5636   *slot = (void *) sbi;
5637 }
5638
5639
5640 /* Set bits in INTO corresponding to the variable uids in solution set FROM.  */
5641
5642 static void
5643 set_uids_in_ptset (bitmap into, bitmap from, struct pt_solution *pt)
5644 {
5645   unsigned int i;
5646   bitmap_iterator bi;
5647
5648   EXECUTE_IF_SET_IN_BITMAP (from, 0, i, bi)
5649     {
5650       varinfo_t vi = get_varinfo (i);
5651
5652       /* The only artificial variables that are allowed in a may-alias
5653          set are heap variables.  */
5654       if (vi->is_artificial_var && !vi->is_heap_var)
5655         continue;
5656
5657       if (TREE_CODE (vi->decl) == VAR_DECL
5658           || TREE_CODE (vi->decl) == PARM_DECL
5659           || TREE_CODE (vi->decl) == RESULT_DECL)
5660         {
5661           /* If we are in IPA mode we will not recompute points-to
5662              sets after inlining so make sure they stay valid.  */
5663           if (in_ipa_mode
5664               && !DECL_PT_UID_SET_P (vi->decl))
5665             SET_DECL_PT_UID (vi->decl, DECL_UID (vi->decl));
5666
5667           /* Add the decl to the points-to set.  Note that the points-to
5668              set contains global variables.  */
5669           bitmap_set_bit (into, DECL_PT_UID (vi->decl));
5670           if (vi->is_global_var)
5671             pt->vars_contains_global = true;
5672         }
5673     }
5674 }
5675
5676
5677 /* Compute the points-to solution *PT for the variable VI.  */
5678
5679 static void
5680 find_what_var_points_to (varinfo_t orig_vi, struct pt_solution *pt)
5681 {
5682   unsigned int i;
5683   bitmap_iterator bi;
5684   bitmap finished_solution;
5685   bitmap result;
5686   varinfo_t vi;
5687
5688   memset (pt, 0, sizeof (struct pt_solution));
5689
5690   /* This variable may have been collapsed, let's get the real
5691      variable.  */
5692   vi = get_varinfo (find (orig_vi->id));
5693
5694   /* Translate artificial variables into SSA_NAME_PTR_INFO
5695      attributes.  */
5696   EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
5697     {
5698       varinfo_t vi = get_varinfo (i);
5699
5700       if (vi->is_artificial_var)
5701         {
5702           if (vi->id == nothing_id)
5703             pt->null = 1;
5704           else if (vi->id == escaped_id)
5705             {
5706               if (in_ipa_mode)
5707                 pt->ipa_escaped = 1;
5708               else
5709                 pt->escaped = 1;
5710             }
5711           else if (vi->id == nonlocal_id)
5712             pt->nonlocal = 1;
5713           else if (vi->is_heap_var)
5714             /* We represent heapvars in the points-to set properly.  */
5715             ;
5716           else if (vi->id == readonly_id)
5717             /* Nobody cares.  */
5718             ;
5719           else if (vi->id == anything_id
5720                    || vi->id == integer_id)
5721             pt->anything = 1;
5722         }
5723       if (vi->is_restrict_var)
5724         pt->vars_contains_restrict = true;
5725     }
5726
5727   /* Instead of doing extra work, simply do not create
5728      elaborate points-to information for pt_anything pointers.  */
5729   if (pt->anything
5730       && (orig_vi->is_artificial_var
5731           || !pt->vars_contains_restrict))
5732     return;
5733
5734   /* Share the final set of variables when possible.  */
5735   finished_solution = BITMAP_GGC_ALLOC ();
5736   stats.points_to_sets_created++;
5737
5738   set_uids_in_ptset (finished_solution, vi->solution, pt);
5739   result = shared_bitmap_lookup (finished_solution);
5740   if (!result)
5741     {
5742       shared_bitmap_add (finished_solution);
5743       pt->vars = finished_solution;
5744     }
5745   else
5746     {
5747       pt->vars = result;
5748       bitmap_clear (finished_solution);
5749     }
5750 }
5751
5752 /* Given a pointer variable P, fill in its points-to set.  */
5753
5754 static void
5755 find_what_p_points_to (tree p)
5756 {
5757   struct ptr_info_def *pi;
5758   tree lookup_p = p;
5759   varinfo_t vi;
5760
5761   /* For parameters, get at the points-to set for the actual parm
5762      decl.  */
5763   if (TREE_CODE (p) == SSA_NAME
5764       && (TREE_CODE (SSA_NAME_VAR (p)) == PARM_DECL
5765           || TREE_CODE (SSA_NAME_VAR (p)) == RESULT_DECL)
5766       && SSA_NAME_IS_DEFAULT_DEF (p))
5767     lookup_p = SSA_NAME_VAR (p);
5768
5769   vi = lookup_vi_for_tree (lookup_p);
5770   if (!vi)
5771     return;
5772
5773   pi = get_ptr_info (p);
5774   find_what_var_points_to (vi, &pi->pt);
5775 }
5776
5777
5778 /* Query statistics for points-to solutions.  */
5779
5780 static struct {
5781   unsigned HOST_WIDE_INT pt_solution_includes_may_alias;
5782   unsigned HOST_WIDE_INT pt_solution_includes_no_alias;
5783   unsigned HOST_WIDE_INT pt_solutions_intersect_may_alias;
5784   unsigned HOST_WIDE_INT pt_solutions_intersect_no_alias;
5785 } pta_stats;
5786
5787 void
5788 dump_pta_stats (FILE *s)
5789 {
5790   fprintf (s, "\nPTA query stats:\n");
5791   fprintf (s, "  pt_solution_includes: "
5792            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
5793            HOST_WIDE_INT_PRINT_DEC" queries\n",
5794            pta_stats.pt_solution_includes_no_alias,
5795            pta_stats.pt_solution_includes_no_alias
5796            + pta_stats.pt_solution_includes_may_alias);
5797   fprintf (s, "  pt_solutions_intersect: "
5798            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
5799            HOST_WIDE_INT_PRINT_DEC" queries\n",
5800            pta_stats.pt_solutions_intersect_no_alias,
5801            pta_stats.pt_solutions_intersect_no_alias
5802            + pta_stats.pt_solutions_intersect_may_alias);
5803 }
5804
5805
5806 /* Reset the points-to solution *PT to a conservative default
5807    (point to anything).  */
5808
5809 void
5810 pt_solution_reset (struct pt_solution *pt)
5811 {
5812   memset (pt, 0, sizeof (struct pt_solution));
5813   pt->anything = true;
5814 }
5815
5816 /* Set the points-to solution *PT to point only to the variables
5817    in VARS.  VARS_CONTAINS_GLOBAL specifies whether that contains
5818    global variables and VARS_CONTAINS_RESTRICT specifies whether
5819    it contains restrict tag variables.  */
5820
5821 void
5822 pt_solution_set (struct pt_solution *pt, bitmap vars,
5823                  bool vars_contains_global, bool vars_contains_restrict)
5824 {
5825   memset (pt, 0, sizeof (struct pt_solution));
5826   pt->vars = vars;
5827   pt->vars_contains_global = vars_contains_global;
5828   pt->vars_contains_restrict = vars_contains_restrict;
5829 }
5830
5831 /* Set the points-to solution *PT to point only to the variable VAR.  */
5832
5833 void
5834 pt_solution_set_var (struct pt_solution *pt, tree var)
5835 {
5836   memset (pt, 0, sizeof (struct pt_solution));
5837   pt->vars = BITMAP_GGC_ALLOC ();
5838   bitmap_set_bit (pt->vars, DECL_UID (var));
5839   pt->vars_contains_global = is_global_var (var);
5840 }
5841
5842 /* Computes the union of the points-to solutions *DEST and *SRC and
5843    stores the result in *DEST.  This changes the points-to bitmap
5844    of *DEST and thus may not be used if that might be shared.
5845    The points-to bitmap of *SRC and *DEST will not be shared after
5846    this function if they were not before.  */
5847
5848 static void
5849 pt_solution_ior_into (struct pt_solution *dest, struct pt_solution *src)
5850 {
5851   dest->anything |= src->anything;
5852   if (dest->anything)
5853     {
5854       pt_solution_reset (dest);
5855       return;
5856     }
5857
5858   dest->nonlocal |= src->nonlocal;
5859   dest->escaped |= src->escaped;
5860   dest->ipa_escaped |= src->ipa_escaped;
5861   dest->null |= src->null;
5862   dest->vars_contains_global |= src->vars_contains_global;
5863   dest->vars_contains_restrict |= src->vars_contains_restrict;
5864   if (!src->vars)
5865     return;
5866
5867   if (!dest->vars)
5868     dest->vars = BITMAP_GGC_ALLOC ();
5869   bitmap_ior_into (dest->vars, src->vars);
5870 }
5871
5872 /* Return true if the points-to solution *PT is empty.  */
5873
5874 bool
5875 pt_solution_empty_p (struct pt_solution *pt)
5876 {
5877   if (pt->anything
5878       || pt->nonlocal)
5879     return false;
5880
5881   if (pt->vars
5882       && !bitmap_empty_p (pt->vars))
5883     return false;
5884
5885   /* If the solution includes ESCAPED, check if that is empty.  */
5886   if (pt->escaped
5887       && !pt_solution_empty_p (&cfun->gimple_df->escaped))
5888     return false;
5889
5890   /* If the solution includes ESCAPED, check if that is empty.  */
5891   if (pt->ipa_escaped
5892       && !pt_solution_empty_p (&ipa_escaped_pt))
5893     return false;
5894
5895   return true;
5896 }
5897
5898 /* Return true if the points-to solution *PT includes global memory.  */
5899
5900 bool
5901 pt_solution_includes_global (struct pt_solution *pt)
5902 {
5903   if (pt->anything
5904       || pt->nonlocal
5905       || pt->vars_contains_global)
5906     return true;
5907
5908   if (pt->escaped)
5909     return pt_solution_includes_global (&cfun->gimple_df->escaped);
5910
5911   if (pt->ipa_escaped)
5912     return pt_solution_includes_global (&ipa_escaped_pt);
5913
5914   /* ???  This predicate is not correct for the IPA-PTA solution
5915      as we do not properly distinguish between unit escape points
5916      and global variables.  */
5917   if (cfun->gimple_df->ipa_pta)
5918     return true;
5919
5920   return false;
5921 }
5922
5923 /* Return true if the points-to solution *PT includes the variable
5924    declaration DECL.  */
5925
5926 static bool
5927 pt_solution_includes_1 (struct pt_solution *pt, const_tree decl)
5928 {
5929   if (pt->anything)
5930     return true;
5931
5932   if (pt->nonlocal
5933       && is_global_var (decl))
5934     return true;
5935
5936   if (pt->vars
5937       && bitmap_bit_p (pt->vars, DECL_PT_UID (decl)))
5938     return true;
5939
5940   /* If the solution includes ESCAPED, check it.  */
5941   if (pt->escaped
5942       && pt_solution_includes_1 (&cfun->gimple_df->escaped, decl))
5943     return true;
5944
5945   /* If the solution includes ESCAPED, check it.  */
5946   if (pt->ipa_escaped
5947       && pt_solution_includes_1 (&ipa_escaped_pt, decl))
5948     return true;
5949
5950   return false;
5951 }
5952
5953 bool
5954 pt_solution_includes (struct pt_solution *pt, const_tree decl)
5955 {
5956   bool res = pt_solution_includes_1 (pt, decl);
5957   if (res)
5958     ++pta_stats.pt_solution_includes_may_alias;
5959   else
5960     ++pta_stats.pt_solution_includes_no_alias;
5961   return res;
5962 }
5963
5964 /* Return true if both points-to solutions PT1 and PT2 have a non-empty
5965    intersection.  */
5966
5967 static bool
5968 pt_solutions_intersect_1 (struct pt_solution *pt1, struct pt_solution *pt2)
5969 {
5970   if (pt1->anything || pt2->anything)
5971     return true;
5972
5973   /* If either points to unknown global memory and the other points to
5974      any global memory they alias.  */
5975   if ((pt1->nonlocal
5976        && (pt2->nonlocal
5977            || pt2->vars_contains_global))
5978       || (pt2->nonlocal
5979           && pt1->vars_contains_global))
5980     return true;
5981
5982   /* Check the escaped solution if required.  */
5983   if ((pt1->escaped || pt2->escaped)
5984       && !pt_solution_empty_p (&cfun->gimple_df->escaped))
5985     {
5986       /* If both point to escaped memory and that solution
5987          is not empty they alias.  */
5988       if (pt1->escaped && pt2->escaped)
5989         return true;
5990
5991       /* If either points to escaped memory see if the escaped solution
5992          intersects with the other.  */
5993       if ((pt1->escaped
5994            && pt_solutions_intersect_1 (&cfun->gimple_df->escaped, pt2))
5995           || (pt2->escaped
5996               && pt_solutions_intersect_1 (&cfun->gimple_df->escaped, pt1)))
5997         return true;
5998     }
5999
6000   /* Check the escaped solution if required.
6001      ???  Do we need to check the local against the IPA escaped sets?  */
6002   if ((pt1->ipa_escaped || pt2->ipa_escaped)
6003       && !pt_solution_empty_p (&ipa_escaped_pt))
6004     {
6005       /* If both point to escaped memory and that solution
6006          is not empty they alias.  */
6007       if (pt1->ipa_escaped && pt2->ipa_escaped)
6008         return true;
6009
6010       /* If either points to escaped memory see if the escaped solution
6011          intersects with the other.  */
6012       if ((pt1->ipa_escaped
6013            && pt_solutions_intersect_1 (&ipa_escaped_pt, pt2))
6014           || (pt2->ipa_escaped
6015               && pt_solutions_intersect_1 (&ipa_escaped_pt, pt1)))
6016         return true;
6017     }
6018
6019   /* Now both pointers alias if their points-to solution intersects.  */
6020   return (pt1->vars
6021           && pt2->vars
6022           && bitmap_intersect_p (pt1->vars, pt2->vars));
6023 }
6024
6025 bool
6026 pt_solutions_intersect (struct pt_solution *pt1, struct pt_solution *pt2)
6027 {
6028   bool res = pt_solutions_intersect_1 (pt1, pt2);
6029   if (res)
6030     ++pta_stats.pt_solutions_intersect_may_alias;
6031   else
6032     ++pta_stats.pt_solutions_intersect_no_alias;
6033   return res;
6034 }
6035
6036 /* Return true if both points-to solutions PT1 and PT2 for two restrict
6037    qualified pointers are possibly based on the same pointer.  */
6038
6039 bool
6040 pt_solutions_same_restrict_base (struct pt_solution *pt1,
6041                                  struct pt_solution *pt2)
6042 {
6043   /* If we deal with points-to solutions of two restrict qualified
6044      pointers solely rely on the pointed-to variable bitmap intersection.
6045      For two pointers that are based on each other the bitmaps will
6046      intersect.  */
6047   if (pt1->vars_contains_restrict
6048       && pt2->vars_contains_restrict)
6049     {
6050       gcc_assert (pt1->vars && pt2->vars);
6051       return bitmap_intersect_p (pt1->vars, pt2->vars);
6052     }
6053
6054   return true;
6055 }
6056
6057
6058 /* Dump points-to information to OUTFILE.  */
6059
6060 static void
6061 dump_sa_points_to_info (FILE *outfile)
6062 {
6063   unsigned int i;
6064
6065   fprintf (outfile, "\nPoints-to sets\n\n");
6066
6067   if (dump_flags & TDF_STATS)
6068     {
6069       fprintf (outfile, "Stats:\n");
6070       fprintf (outfile, "Total vars:               %d\n", stats.total_vars);
6071       fprintf (outfile, "Non-pointer vars:          %d\n",
6072                stats.nonpointer_vars);
6073       fprintf (outfile, "Statically unified vars:  %d\n",
6074                stats.unified_vars_static);
6075       fprintf (outfile, "Dynamically unified vars: %d\n",
6076                stats.unified_vars_dynamic);
6077       fprintf (outfile, "Iterations:               %d\n", stats.iterations);
6078       fprintf (outfile, "Number of edges:          %d\n", stats.num_edges);
6079       fprintf (outfile, "Number of implicit edges: %d\n",
6080                stats.num_implicit_edges);
6081     }
6082
6083   for (i = 0; i < VEC_length (varinfo_t, varmap); i++)
6084     {
6085       varinfo_t vi = get_varinfo (i);
6086       if (!vi->may_have_pointers)
6087         continue;
6088       dump_solution_for_var (outfile, i);
6089     }
6090 }
6091
6092
6093 /* Debug points-to information to stderr.  */
6094
6095 DEBUG_FUNCTION void
6096 debug_sa_points_to_info (void)
6097 {
6098   dump_sa_points_to_info (stderr);
6099 }
6100
6101
6102 /* Initialize the always-existing constraint variables for NULL
6103    ANYTHING, READONLY, and INTEGER */
6104
6105 static void
6106 init_base_vars (void)
6107 {
6108   struct constraint_expr lhs, rhs;
6109   varinfo_t var_anything;
6110   varinfo_t var_nothing;
6111   varinfo_t var_readonly;
6112   varinfo_t var_escaped;
6113   varinfo_t var_nonlocal;
6114   varinfo_t var_storedanything;
6115   varinfo_t var_integer;
6116
6117   /* Create the NULL variable, used to represent that a variable points
6118      to NULL.  */
6119   var_nothing = new_var_info (NULL_TREE, "NULL");
6120   gcc_assert (var_nothing->id == nothing_id);
6121   var_nothing->is_artificial_var = 1;
6122   var_nothing->offset = 0;
6123   var_nothing->size = ~0;
6124   var_nothing->fullsize = ~0;
6125   var_nothing->is_special_var = 1;
6126   var_nothing->may_have_pointers = 0;
6127   var_nothing->is_global_var = 0;
6128
6129   /* Create the ANYTHING variable, used to represent that a variable
6130      points to some unknown piece of memory.  */
6131   var_anything = new_var_info (NULL_TREE, "ANYTHING");
6132   gcc_assert (var_anything->id == anything_id);
6133   var_anything->is_artificial_var = 1;
6134   var_anything->size = ~0;
6135   var_anything->offset = 0;
6136   var_anything->next = NULL;
6137   var_anything->fullsize = ~0;
6138   var_anything->is_special_var = 1;
6139
6140   /* Anything points to anything.  This makes deref constraints just
6141      work in the presence of linked list and other p = *p type loops,
6142      by saying that *ANYTHING = ANYTHING. */
6143   lhs.type = SCALAR;
6144   lhs.var = anything_id;
6145   lhs.offset = 0;
6146   rhs.type = ADDRESSOF;
6147   rhs.var = anything_id;
6148   rhs.offset = 0;
6149
6150   /* This specifically does not use process_constraint because
6151      process_constraint ignores all anything = anything constraints, since all
6152      but this one are redundant.  */
6153   VEC_safe_push (constraint_t, heap, constraints, new_constraint (lhs, rhs));
6154
6155   /* Create the READONLY variable, used to represent that a variable
6156      points to readonly memory.  */
6157   var_readonly = new_var_info (NULL_TREE, "READONLY");
6158   gcc_assert (var_readonly->id == readonly_id);
6159   var_readonly->is_artificial_var = 1;
6160   var_readonly->offset = 0;
6161   var_readonly->size = ~0;
6162   var_readonly->fullsize = ~0;
6163   var_readonly->next = NULL;
6164   var_readonly->is_special_var = 1;
6165
6166   /* readonly memory points to anything, in order to make deref
6167      easier.  In reality, it points to anything the particular
6168      readonly variable can point to, but we don't track this
6169      separately. */
6170   lhs.type = SCALAR;
6171   lhs.var = readonly_id;
6172   lhs.offset = 0;
6173   rhs.type = ADDRESSOF;
6174   rhs.var = readonly_id;  /* FIXME */
6175   rhs.offset = 0;
6176   process_constraint (new_constraint (lhs, rhs));
6177
6178   /* Create the ESCAPED variable, used to represent the set of escaped
6179      memory.  */
6180   var_escaped = new_var_info (NULL_TREE, "ESCAPED");
6181   gcc_assert (var_escaped->id == escaped_id);
6182   var_escaped->is_artificial_var = 1;
6183   var_escaped->offset = 0;
6184   var_escaped->size = ~0;
6185   var_escaped->fullsize = ~0;
6186   var_escaped->is_special_var = 0;
6187
6188   /* Create the NONLOCAL variable, used to represent the set of nonlocal
6189      memory.  */
6190   var_nonlocal = new_var_info (NULL_TREE, "NONLOCAL");
6191   gcc_assert (var_nonlocal->id == nonlocal_id);
6192   var_nonlocal->is_artificial_var = 1;
6193   var_nonlocal->offset = 0;
6194   var_nonlocal->size = ~0;
6195   var_nonlocal->fullsize = ~0;
6196   var_nonlocal->is_special_var = 1;
6197
6198   /* ESCAPED = *ESCAPED, because escaped is may-deref'd at calls, etc.  */
6199   lhs.type = SCALAR;
6200   lhs.var = escaped_id;
6201   lhs.offset = 0;
6202   rhs.type = DEREF;
6203   rhs.var = escaped_id;
6204   rhs.offset = 0;
6205   process_constraint (new_constraint (lhs, rhs));
6206
6207   /* ESCAPED = ESCAPED + UNKNOWN_OFFSET, because if a sub-field escapes the
6208      whole variable escapes.  */
6209   lhs.type = SCALAR;
6210   lhs.var = escaped_id;
6211   lhs.offset = 0;
6212   rhs.type = SCALAR;
6213   rhs.var = escaped_id;
6214   rhs.offset = UNKNOWN_OFFSET;
6215   process_constraint (new_constraint (lhs, rhs));
6216
6217   /* *ESCAPED = NONLOCAL.  This is true because we have to assume
6218      everything pointed to by escaped points to what global memory can
6219      point to.  */
6220   lhs.type = DEREF;
6221   lhs.var = escaped_id;
6222   lhs.offset = 0;
6223   rhs.type = SCALAR;
6224   rhs.var = nonlocal_id;
6225   rhs.offset = 0;
6226   process_constraint (new_constraint (lhs, rhs));
6227
6228   /* NONLOCAL = &NONLOCAL, NONLOCAL = &ESCAPED.  This is true because
6229      global memory may point to global memory and escaped memory.  */
6230   lhs.type = SCALAR;
6231   lhs.var = nonlocal_id;
6232   lhs.offset = 0;
6233   rhs.type = ADDRESSOF;
6234   rhs.var = nonlocal_id;
6235   rhs.offset = 0;
6236   process_constraint (new_constraint (lhs, rhs));
6237   rhs.type = ADDRESSOF;
6238   rhs.var = escaped_id;
6239   rhs.offset = 0;
6240   process_constraint (new_constraint (lhs, rhs));
6241
6242   /* Create the STOREDANYTHING variable, used to represent the set of
6243      variables stored to *ANYTHING.  */
6244   var_storedanything = new_var_info (NULL_TREE, "STOREDANYTHING");
6245   gcc_assert (var_storedanything->id == storedanything_id);
6246   var_storedanything->is_artificial_var = 1;
6247   var_storedanything->offset = 0;
6248   var_storedanything->size = ~0;
6249   var_storedanything->fullsize = ~0;
6250   var_storedanything->is_special_var = 0;
6251
6252   /* Create the INTEGER variable, used to represent that a variable points
6253      to what an INTEGER "points to".  */
6254   var_integer = new_var_info (NULL_TREE, "INTEGER");
6255   gcc_assert (var_integer->id == integer_id);
6256   var_integer->is_artificial_var = 1;
6257   var_integer->size = ~0;
6258   var_integer->fullsize = ~0;
6259   var_integer->offset = 0;
6260   var_integer->next = NULL;
6261   var_integer->is_special_var = 1;
6262
6263   /* INTEGER = ANYTHING, because we don't know where a dereference of
6264      a random integer will point to.  */
6265   lhs.type = SCALAR;
6266   lhs.var = integer_id;
6267   lhs.offset = 0;
6268   rhs.type = ADDRESSOF;
6269   rhs.var = anything_id;
6270   rhs.offset = 0;
6271   process_constraint (new_constraint (lhs, rhs));
6272 }
6273
6274 /* Initialize things necessary to perform PTA */
6275
6276 static void
6277 init_alias_vars (void)
6278 {
6279   use_field_sensitive = (MAX_FIELDS_FOR_FIELD_SENSITIVE > 1);
6280
6281   bitmap_obstack_initialize (&pta_obstack);
6282   bitmap_obstack_initialize (&oldpta_obstack);
6283   bitmap_obstack_initialize (&predbitmap_obstack);
6284
6285   constraint_pool = create_alloc_pool ("Constraint pool",
6286                                        sizeof (struct constraint), 30);
6287   variable_info_pool = create_alloc_pool ("Variable info pool",
6288                                           sizeof (struct variable_info), 30);
6289   constraints = VEC_alloc (constraint_t, heap, 8);
6290   varmap = VEC_alloc (varinfo_t, heap, 8);
6291   vi_for_tree = pointer_map_create ();
6292   call_stmt_vars = pointer_map_create ();
6293
6294   memset (&stats, 0, sizeof (stats));
6295   shared_bitmap_table = htab_create (511, shared_bitmap_hash,
6296                                      shared_bitmap_eq, free);
6297   init_base_vars ();
6298 }
6299
6300 /* Remove the REF and ADDRESS edges from GRAPH, as well as all the
6301    predecessor edges.  */
6302
6303 static void
6304 remove_preds_and_fake_succs (constraint_graph_t graph)
6305 {
6306   unsigned int i;
6307
6308   /* Clear the implicit ref and address nodes from the successor
6309      lists.  */
6310   for (i = 0; i < FIRST_REF_NODE; i++)
6311     {
6312       if (graph->succs[i])
6313         bitmap_clear_range (graph->succs[i], FIRST_REF_NODE,
6314                             FIRST_REF_NODE * 2);
6315     }
6316
6317   /* Free the successor list for the non-ref nodes.  */
6318   for (i = FIRST_REF_NODE; i < graph->size; i++)
6319     {
6320       if (graph->succs[i])
6321         BITMAP_FREE (graph->succs[i]);
6322     }
6323
6324   /* Now reallocate the size of the successor list as, and blow away
6325      the predecessor bitmaps.  */
6326   graph->size = VEC_length (varinfo_t, varmap);
6327   graph->succs = XRESIZEVEC (bitmap, graph->succs, graph->size);
6328
6329   free (graph->implicit_preds);
6330   graph->implicit_preds = NULL;
6331   free (graph->preds);
6332   graph->preds = NULL;
6333   bitmap_obstack_release (&predbitmap_obstack);
6334 }
6335
6336 /* Initialize the heapvar for statement mapping.  */
6337
6338 static void
6339 init_alias_heapvars (void)
6340 {
6341   if (!heapvar_for_stmt)
6342     heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, heapvar_map_eq,
6343                                         NULL);
6344 }
6345
6346 /* Delete the heapvar for statement mapping.  */
6347
6348 void
6349 delete_alias_heapvars (void)
6350 {
6351   if (heapvar_for_stmt)
6352     htab_delete (heapvar_for_stmt);
6353   heapvar_for_stmt = NULL;
6354 }
6355
6356 /* Solve the constraint set.  */
6357
6358 static void
6359 solve_constraints (void)
6360 {
6361   struct scc_info *si;
6362
6363   if (dump_file)
6364     fprintf (dump_file,
6365              "\nCollapsing static cycles and doing variable "
6366              "substitution\n");
6367
6368   init_graph (VEC_length (varinfo_t, varmap) * 2);
6369
6370   if (dump_file)
6371     fprintf (dump_file, "Building predecessor graph\n");
6372   build_pred_graph ();
6373
6374   if (dump_file)
6375     fprintf (dump_file, "Detecting pointer and location "
6376              "equivalences\n");
6377   si = perform_var_substitution (graph);
6378
6379   if (dump_file)
6380     fprintf (dump_file, "Rewriting constraints and unifying "
6381              "variables\n");
6382   rewrite_constraints (graph, si);
6383
6384   build_succ_graph ();
6385   free_var_substitution_info (si);
6386
6387   if (dump_file && (dump_flags & TDF_GRAPH))
6388     dump_constraint_graph (dump_file);
6389
6390   move_complex_constraints (graph);
6391
6392   if (dump_file)
6393     fprintf (dump_file, "Uniting pointer but not location equivalent "
6394              "variables\n");
6395   unite_pointer_equivalences (graph);
6396
6397   if (dump_file)
6398     fprintf (dump_file, "Finding indirect cycles\n");
6399   find_indirect_cycles (graph);
6400
6401   /* Implicit nodes and predecessors are no longer necessary at this
6402      point. */
6403   remove_preds_and_fake_succs (graph);
6404
6405   if (dump_file)
6406     fprintf (dump_file, "Solving graph\n");
6407
6408   solve_graph (graph);
6409
6410   if (dump_file)
6411     dump_sa_points_to_info (dump_file);
6412 }
6413
6414 /* Create points-to sets for the current function.  See the comments
6415    at the start of the file for an algorithmic overview.  */
6416
6417 static void
6418 compute_points_to_sets (void)
6419 {
6420   basic_block bb;
6421   unsigned i;
6422   varinfo_t vi;
6423
6424   timevar_push (TV_TREE_PTA);
6425
6426   init_alias_vars ();
6427   init_alias_heapvars ();
6428
6429   intra_create_variable_infos ();
6430
6431   /* Now walk all statements and build the constraint set.  */
6432   FOR_EACH_BB (bb)
6433     {
6434       gimple_stmt_iterator gsi;
6435
6436       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6437         {
6438           gimple phi = gsi_stmt (gsi);
6439
6440           if (is_gimple_reg (gimple_phi_result (phi)))
6441             find_func_aliases (phi);
6442         }
6443
6444       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6445         {
6446           gimple stmt = gsi_stmt (gsi);
6447
6448           find_func_aliases (stmt);
6449         }
6450     }
6451
6452   if (dump_file)
6453     {
6454       fprintf (dump_file, "Points-to analysis\n\nConstraints:\n\n");
6455       dump_constraints (dump_file, 0);
6456     }
6457
6458   /* From the constraints compute the points-to sets.  */
6459   solve_constraints ();
6460
6461   /* Compute the points-to set for ESCAPED used for call-clobber analysis.  */
6462   find_what_var_points_to (get_varinfo (escaped_id),
6463                            &cfun->gimple_df->escaped);
6464
6465   /* Make sure the ESCAPED solution (which is used as placeholder in
6466      other solutions) does not reference itself.  This simplifies
6467      points-to solution queries.  */
6468   cfun->gimple_df->escaped.escaped = 0;
6469
6470   /* Mark escaped HEAP variables as global.  */
6471   for (i = 0; VEC_iterate (varinfo_t, varmap, i, vi); ++i)
6472     if (vi->is_heap_var
6473         && !vi->is_restrict_var
6474         && !vi->is_global_var)
6475       DECL_EXTERNAL (vi->decl) = vi->is_global_var
6476         = pt_solution_includes (&cfun->gimple_df->escaped, vi->decl);
6477
6478   /* Compute the points-to sets for pointer SSA_NAMEs.  */
6479   for (i = 0; i < num_ssa_names; ++i)
6480     {
6481       tree ptr = ssa_name (i);
6482       if (ptr
6483           && POINTER_TYPE_P (TREE_TYPE (ptr)))
6484         find_what_p_points_to (ptr);
6485     }
6486
6487   /* Compute the call-used/clobbered sets.  */
6488   FOR_EACH_BB (bb)
6489     {
6490       gimple_stmt_iterator gsi;
6491
6492       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6493         {
6494           gimple stmt = gsi_stmt (gsi);
6495           struct pt_solution *pt;
6496           if (!is_gimple_call (stmt))
6497             continue;
6498
6499           pt = gimple_call_use_set (stmt);
6500           if (gimple_call_flags (stmt) & ECF_CONST)
6501             memset (pt, 0, sizeof (struct pt_solution));
6502           else if ((vi = lookup_call_use_vi (stmt)) != NULL)
6503             {
6504               find_what_var_points_to (vi, pt);
6505               /* Escaped (and thus nonlocal) variables are always
6506                  implicitly used by calls.  */
6507               /* ???  ESCAPED can be empty even though NONLOCAL
6508                  always escaped.  */
6509               pt->nonlocal = 1;
6510               pt->escaped = 1;
6511             }
6512           else
6513             {
6514               /* If there is nothing special about this call then
6515                  we have made everything that is used also escape.  */
6516               *pt = cfun->gimple_df->escaped;
6517               pt->nonlocal = 1;
6518             }
6519
6520           pt = gimple_call_clobber_set (stmt);
6521           if (gimple_call_flags (stmt) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
6522             memset (pt, 0, sizeof (struct pt_solution));
6523           else if ((vi = lookup_call_clobber_vi (stmt)) != NULL)
6524             {
6525               find_what_var_points_to (vi, pt);
6526               /* Escaped (and thus nonlocal) variables are always
6527                  implicitly clobbered by calls.  */
6528               /* ???  ESCAPED can be empty even though NONLOCAL
6529                  always escaped.  */
6530               pt->nonlocal = 1;
6531               pt->escaped = 1;
6532             }
6533           else
6534             {
6535               /* If there is nothing special about this call then
6536                  we have made everything that is used also escape.  */
6537               *pt = cfun->gimple_df->escaped;
6538               pt->nonlocal = 1;
6539             }
6540         }
6541     }
6542
6543   timevar_pop (TV_TREE_PTA);
6544 }
6545
6546
6547 /* Delete created points-to sets.  */
6548
6549 static void
6550 delete_points_to_sets (void)
6551 {
6552   unsigned int i;
6553
6554   htab_delete (shared_bitmap_table);
6555   if (dump_file && (dump_flags & TDF_STATS))
6556     fprintf (dump_file, "Points to sets created:%d\n",
6557              stats.points_to_sets_created);
6558
6559   pointer_map_destroy (vi_for_tree);
6560   pointer_map_destroy (call_stmt_vars);
6561   bitmap_obstack_release (&pta_obstack);
6562   VEC_free (constraint_t, heap, constraints);
6563
6564   for (i = 0; i < graph->size; i++)
6565     VEC_free (constraint_t, heap, graph->complex[i]);
6566   free (graph->complex);
6567
6568   free (graph->rep);
6569   free (graph->succs);
6570   free (graph->pe);
6571   free (graph->pe_rep);
6572   free (graph->indirect_cycles);
6573   free (graph);
6574
6575   VEC_free (varinfo_t, heap, varmap);
6576   free_alloc_pool (variable_info_pool);
6577   free_alloc_pool (constraint_pool);
6578 }
6579
6580
6581 /* Compute points-to information for every SSA_NAME pointer in the
6582    current function and compute the transitive closure of escaped
6583    variables to re-initialize the call-clobber states of local variables.  */
6584
6585 unsigned int
6586 compute_may_aliases (void)
6587 {
6588   if (cfun->gimple_df->ipa_pta)
6589     {
6590       if (dump_file)
6591         {
6592           fprintf (dump_file, "\nNot re-computing points-to information "
6593                    "because IPA points-to information is available.\n\n");
6594
6595           /* But still dump what we have remaining it.  */
6596           dump_alias_info (dump_file);
6597
6598           if (dump_flags & TDF_DETAILS)
6599             dump_referenced_vars (dump_file);
6600         }
6601
6602       return 0;
6603     }
6604
6605   /* For each pointer P_i, determine the sets of variables that P_i may
6606      point-to.  Compute the reachability set of escaped and call-used
6607      variables.  */
6608   compute_points_to_sets ();
6609
6610   /* Debugging dumps.  */
6611   if (dump_file)
6612     {
6613       dump_alias_info (dump_file);
6614
6615       if (dump_flags & TDF_DETAILS)
6616         dump_referenced_vars (dump_file);
6617     }
6618
6619   /* Deallocate memory used by aliasing data structures and the internal
6620      points-to solution.  */
6621   delete_points_to_sets ();
6622
6623   gcc_assert (!need_ssa_update_p (cfun));
6624
6625   return 0;
6626 }
6627
6628 static bool
6629 gate_tree_pta (void)
6630 {
6631   return flag_tree_pta;
6632 }
6633
6634 /* A dummy pass to cause points-to information to be computed via
6635    TODO_rebuild_alias.  */
6636
6637 struct gimple_opt_pass pass_build_alias =
6638 {
6639  {
6640   GIMPLE_PASS,
6641   "alias",                  /* name */
6642   gate_tree_pta,            /* gate */
6643   NULL,                     /* execute */
6644   NULL,                     /* sub */
6645   NULL,                     /* next */
6646   0,                        /* static_pass_number */
6647   TV_NONE,                  /* tv_id */
6648   PROP_cfg | PROP_ssa,      /* properties_required */
6649   0,                        /* properties_provided */
6650   0,                        /* properties_destroyed */
6651   0,                        /* todo_flags_start */
6652   TODO_rebuild_alias | TODO_dump_func  /* todo_flags_finish */
6653  }
6654 };
6655
6656 /* A dummy pass to cause points-to information to be computed via
6657    TODO_rebuild_alias.  */
6658
6659 struct gimple_opt_pass pass_build_ealias =
6660 {
6661  {
6662   GIMPLE_PASS,
6663   "ealias",                 /* name */
6664   gate_tree_pta,            /* gate */
6665   NULL,                     /* execute */
6666   NULL,                     /* sub */
6667   NULL,                     /* next */
6668   0,                        /* static_pass_number */
6669   TV_NONE,                  /* tv_id */
6670   PROP_cfg | PROP_ssa,      /* properties_required */
6671   0,                        /* properties_provided */
6672   0,                        /* properties_destroyed */
6673   0,                        /* todo_flags_start */
6674   TODO_rebuild_alias | TODO_dump_func  /* todo_flags_finish */
6675  }
6676 };
6677
6678
6679 /* Return true if we should execute IPA PTA.  */
6680 static bool
6681 gate_ipa_pta (void)
6682 {
6683   return (optimize
6684           && flag_ipa_pta
6685           /* Don't bother doing anything if the program has errors.  */
6686           && !seen_error ());
6687 }
6688
6689 /* IPA PTA solutions for ESCAPED.  */
6690 struct pt_solution ipa_escaped_pt
6691   = { true, false, false, false, false, false, false, NULL };
6692
6693 /* Execute the driver for IPA PTA.  */
6694 static unsigned int
6695 ipa_pta_execute (void)
6696 {
6697   struct cgraph_node *node;
6698   struct varpool_node *var;
6699   int from;
6700
6701   in_ipa_mode = 1;
6702
6703   init_alias_heapvars ();
6704   init_alias_vars ();
6705
6706   /* Build the constraints.  */
6707   for (node = cgraph_nodes; node; node = node->next)
6708     {
6709       struct cgraph_node *alias;
6710       varinfo_t vi;
6711
6712       /* Nodes without a body are not interesting.  Especially do not
6713          visit clones at this point for now - we get duplicate decls
6714          there for inline clones at least.  */
6715       if (!gimple_has_body_p (node->decl)
6716           || node->clone_of)
6717         continue;
6718
6719       vi = create_function_info_for (node->decl,
6720                                      alias_get_name (node->decl));
6721
6722       /* Associate the varinfo node with all aliases.  */
6723       for (alias = node->same_body; alias; alias = alias->next)
6724         insert_vi_for_tree (alias->decl, vi);
6725     }
6726
6727   /* Create constraints for global variables and their initializers.  */
6728   for (var = varpool_nodes; var; var = var->next)
6729     {
6730       struct varpool_node *alias;
6731       varinfo_t vi;
6732
6733       vi = get_vi_for_tree (var->decl);
6734
6735       /* Associate the varinfo node with all aliases.  */
6736       for (alias = var->extra_name; alias; alias = alias->next)
6737         insert_vi_for_tree (alias->decl, vi);
6738     }
6739
6740   if (dump_file)
6741     {
6742       fprintf (dump_file,
6743                "Generating constraints for global initializers\n\n");
6744       dump_constraints (dump_file, 0);
6745       fprintf (dump_file, "\n");
6746     }
6747   from = VEC_length (constraint_t, constraints);
6748
6749   for (node = cgraph_nodes; node; node = node->next)
6750     {
6751       struct function *func;
6752       basic_block bb;
6753       tree old_func_decl;
6754
6755       /* Nodes without a body are not interesting.  */
6756       if (!gimple_has_body_p (node->decl)
6757           || node->clone_of)
6758         continue;
6759
6760       if (dump_file)
6761         {
6762           fprintf (dump_file,
6763                    "Generating constraints for %s", cgraph_node_name (node));
6764           if (DECL_ASSEMBLER_NAME_SET_P (node->decl))
6765             fprintf (dump_file, " (%s)",
6766                      IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl)));
6767           fprintf (dump_file, "\n");
6768         }
6769
6770       func = DECL_STRUCT_FUNCTION (node->decl);
6771       old_func_decl = current_function_decl;
6772       push_cfun (func);
6773       current_function_decl = node->decl;
6774
6775       /* For externally visible functions use local constraints for
6776          their arguments.  For local functions we see all callers
6777          and thus do not need initial constraints for parameters.  */
6778       if (node->local.externally_visible)
6779         intra_create_variable_infos ();
6780
6781       /* Build constriants for the function body.  */
6782       FOR_EACH_BB_FN (bb, func)
6783         {
6784           gimple_stmt_iterator gsi;
6785
6786           for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
6787                gsi_next (&gsi))
6788             {
6789               gimple phi = gsi_stmt (gsi);
6790
6791               if (is_gimple_reg (gimple_phi_result (phi)))
6792                 find_func_aliases (phi);
6793             }
6794
6795           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6796             {
6797               gimple stmt = gsi_stmt (gsi);
6798
6799               find_func_aliases (stmt);
6800               find_func_clobbers (stmt);
6801             }
6802         }
6803
6804       current_function_decl = old_func_decl;
6805       pop_cfun ();
6806
6807       if (dump_file)
6808         {
6809           fprintf (dump_file, "\n");
6810           dump_constraints (dump_file, from);
6811           fprintf (dump_file, "\n");
6812         }
6813       from = VEC_length (constraint_t, constraints);
6814     }
6815
6816   /* From the constraints compute the points-to sets.  */
6817   solve_constraints ();
6818
6819   /* Compute the global points-to sets for ESCAPED.
6820      ???  Note that the computed escape set is not correct
6821      for the whole unit as we fail to consider graph edges to
6822      externally visible functions.  */
6823   find_what_var_points_to (get_varinfo (escaped_id), &ipa_escaped_pt);
6824
6825   /* Make sure the ESCAPED solution (which is used as placeholder in
6826      other solutions) does not reference itself.  This simplifies
6827      points-to solution queries.  */
6828   ipa_escaped_pt.ipa_escaped = 0;
6829
6830   /* Assign the points-to sets to the SSA names in the unit.  */
6831   for (node = cgraph_nodes; node; node = node->next)
6832     {
6833       tree ptr;
6834       struct function *fn;
6835       unsigned i;
6836       varinfo_t fi;
6837       basic_block bb;
6838       struct pt_solution uses, clobbers;
6839       struct cgraph_edge *e;
6840
6841       /* Nodes without a body are not interesting.  */
6842       if (!gimple_has_body_p (node->decl)
6843           || node->clone_of)
6844         continue;
6845
6846       fn = DECL_STRUCT_FUNCTION (node->decl);
6847
6848       /* Compute the points-to sets for pointer SSA_NAMEs.  */
6849       for (i = 0; VEC_iterate (tree, fn->gimple_df->ssa_names, i, ptr); ++i)
6850         {
6851           if (ptr
6852               && POINTER_TYPE_P (TREE_TYPE (ptr)))
6853             find_what_p_points_to (ptr);
6854         }
6855
6856       /* Compute the call-use and call-clobber sets for all direct calls.  */
6857       fi = lookup_vi_for_tree (node->decl);
6858       gcc_assert (fi->is_fn_info);
6859       find_what_var_points_to (first_vi_for_offset (fi, fi_clobbers),
6860                                &clobbers);
6861       find_what_var_points_to (first_vi_for_offset (fi, fi_uses), &uses);
6862       for (e = node->callers; e; e = e->next_caller)
6863         {
6864           if (!e->call_stmt)
6865             continue;
6866
6867           *gimple_call_clobber_set (e->call_stmt) = clobbers;
6868           *gimple_call_use_set (e->call_stmt) = uses;
6869         }
6870
6871       /* Compute the call-use and call-clobber sets for indirect calls
6872          and calls to external functions.  */
6873       FOR_EACH_BB_FN (bb, fn)
6874         {
6875           gimple_stmt_iterator gsi;
6876
6877           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6878             {
6879               gimple stmt = gsi_stmt (gsi);
6880               struct pt_solution *pt;
6881               varinfo_t vi;
6882               tree decl;
6883
6884               if (!is_gimple_call (stmt))
6885                 continue;
6886
6887               /* Handle direct calls to external functions.  */
6888               decl = gimple_call_fndecl (stmt);
6889               if (decl
6890                   && (!(fi = lookup_vi_for_tree (decl))
6891                       || !fi->is_fn_info))
6892                 {
6893                   pt = gimple_call_use_set (stmt);
6894                   if (gimple_call_flags (stmt) & ECF_CONST)
6895                     memset (pt, 0, sizeof (struct pt_solution));
6896                   else if ((vi = lookup_call_use_vi (stmt)) != NULL)
6897                     {
6898                       find_what_var_points_to (vi, pt);
6899                       /* Escaped (and thus nonlocal) variables are always
6900                          implicitly used by calls.  */
6901                       /* ???  ESCAPED can be empty even though NONLOCAL
6902                          always escaped.  */
6903                       pt->nonlocal = 1;
6904                       pt->ipa_escaped = 1;
6905                     }
6906                   else
6907                     {
6908                       /* If there is nothing special about this call then
6909                          we have made everything that is used also escape.  */
6910                       *pt = ipa_escaped_pt;
6911                       pt->nonlocal = 1;
6912                     }
6913
6914                   pt = gimple_call_clobber_set (stmt);
6915                   if (gimple_call_flags (stmt) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
6916                     memset (pt, 0, sizeof (struct pt_solution));
6917                   else if ((vi = lookup_call_clobber_vi (stmt)) != NULL)
6918                     {
6919                       find_what_var_points_to (vi, pt);
6920                       /* Escaped (and thus nonlocal) variables are always
6921                          implicitly clobbered by calls.  */
6922                       /* ???  ESCAPED can be empty even though NONLOCAL
6923                          always escaped.  */
6924                       pt->nonlocal = 1;
6925                       pt->ipa_escaped = 1;
6926                     }
6927                   else
6928                     {
6929                       /* If there is nothing special about this call then
6930                          we have made everything that is used also escape.  */
6931                       *pt = ipa_escaped_pt;
6932                       pt->nonlocal = 1;
6933                     }
6934                 }
6935
6936               /* Handle indirect calls.  */
6937               if (!decl
6938                   && (fi = get_fi_for_callee (stmt)))
6939                 {
6940                   /* We need to accumulate all clobbers/uses of all possible
6941                      callees.  */
6942                   fi = get_varinfo (find (fi->id));
6943                   /* If we cannot constrain the set of functions we'll end up
6944                      calling we end up using/clobbering everything.  */
6945                   if (bitmap_bit_p (fi->solution, anything_id)
6946                       || bitmap_bit_p (fi->solution, nonlocal_id)
6947                       || bitmap_bit_p (fi->solution, escaped_id))
6948                     {
6949                       pt_solution_reset (gimple_call_clobber_set (stmt));
6950                       pt_solution_reset (gimple_call_use_set (stmt));
6951                     }
6952                   else
6953                     {
6954                       bitmap_iterator bi;
6955                       unsigned i;
6956                       struct pt_solution *uses, *clobbers;
6957
6958                       uses = gimple_call_use_set (stmt);
6959                       clobbers = gimple_call_clobber_set (stmt);
6960                       memset (uses, 0, sizeof (struct pt_solution));
6961                       memset (clobbers, 0, sizeof (struct pt_solution));
6962                       EXECUTE_IF_SET_IN_BITMAP (fi->solution, 0, i, bi)
6963                         {
6964                           struct pt_solution sol;
6965
6966                           vi = get_varinfo (i);
6967                           if (!vi->is_fn_info)
6968                             {
6969                               /* ???  We could be more precise here?  */
6970                               uses->nonlocal = 1;
6971                               uses->ipa_escaped = 1;
6972                               clobbers->nonlocal = 1;
6973                               clobbers->ipa_escaped = 1;
6974                               continue;
6975                             }
6976
6977                           if (!uses->anything)
6978                             {
6979                               find_what_var_points_to
6980                                   (first_vi_for_offset (vi, fi_uses), &sol);
6981                               pt_solution_ior_into (uses, &sol);
6982                             }
6983                           if (!clobbers->anything)
6984                             {
6985                               find_what_var_points_to
6986                                   (first_vi_for_offset (vi, fi_clobbers), &sol);
6987                               pt_solution_ior_into (clobbers, &sol);
6988                             }
6989                         }
6990                     }
6991                 }
6992             }
6993         }
6994
6995       fn->gimple_df->ipa_pta = true;
6996     }
6997
6998   delete_points_to_sets ();
6999
7000   in_ipa_mode = 0;
7001
7002   return 0;
7003 }
7004
7005 struct simple_ipa_opt_pass pass_ipa_pta =
7006 {
7007  {
7008   SIMPLE_IPA_PASS,
7009   "pta",                                /* name */
7010   gate_ipa_pta,                 /* gate */
7011   ipa_pta_execute,                      /* execute */
7012   NULL,                                 /* sub */
7013   NULL,                                 /* next */
7014   0,                                    /* static_pass_number */
7015   TV_IPA_PTA,                   /* tv_id */
7016   0,                                    /* properties_required */
7017   0,                                    /* properties_provided */
7018   0,                                    /* properties_destroyed */
7019   0,                                    /* todo_flags_start */
7020   TODO_update_ssa                       /* todo_flags_finish */
7021  }
7022 };
7023
7024
7025 #include "gt-tree-ssa-structalias.h"