OSDN Git Service

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