OSDN Git Service

83cc95352f33e517addd7d31c95ca0ae5698da69
[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   VEC_qsort (fieldoff_s, fieldstack, fieldoff_compare);
4976 }
4977
4978 /* Return true if V is a tree that we can have subvars for.
4979    Normally, this is any aggregate type.  Also complex
4980    types which are not gimple registers can have subvars.  */
4981
4982 static inline bool
4983 var_can_have_subvars (const_tree v)
4984 {
4985   /* Volatile variables should never have subvars.  */
4986   if (TREE_THIS_VOLATILE (v))
4987     return false;
4988
4989   /* Non decls or memory tags can never have subvars.  */
4990   if (!DECL_P (v))
4991     return false;
4992
4993   /* Aggregates without overlapping fields can have subvars.  */
4994   if (TREE_CODE (TREE_TYPE (v)) == RECORD_TYPE)
4995     return true;
4996
4997   return false;
4998 }
4999
5000 /* Given a TYPE, and a vector of field offsets FIELDSTACK, push all
5001    the fields of TYPE onto fieldstack, recording their offsets along
5002    the way.
5003
5004    OFFSET is used to keep track of the offset in this entire
5005    structure, rather than just the immediately containing structure.
5006    Returns false if the caller is supposed to handle the field we
5007    recursed for.  */
5008
5009 static bool
5010 push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
5011                              HOST_WIDE_INT offset, bool must_have_pointers_p)
5012 {
5013   tree field;
5014   bool empty_p = true;
5015
5016   if (TREE_CODE (type) != RECORD_TYPE)
5017     return false;
5018
5019   /* If the vector of fields is growing too big, bail out early.
5020      Callers check for VEC_length <= MAX_FIELDS_FOR_FIELD_SENSITIVE, make
5021      sure this fails.  */
5022   if (VEC_length (fieldoff_s, *fieldstack) > MAX_FIELDS_FOR_FIELD_SENSITIVE)
5023     return false;
5024
5025   for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5026     if (TREE_CODE (field) == FIELD_DECL)
5027       {
5028         bool push = false;
5029         HOST_WIDE_INT foff = bitpos_of_field (field);
5030
5031         if (!var_can_have_subvars (field)
5032             || TREE_CODE (TREE_TYPE (field)) == QUAL_UNION_TYPE
5033             || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
5034           push = true;
5035         else if (!push_fields_onto_fieldstack
5036                     (TREE_TYPE (field), fieldstack, offset + foff,
5037                      must_have_pointers_p)
5038                  && (DECL_SIZE (field)
5039                      && !integer_zerop (DECL_SIZE (field))))
5040           /* Empty structures may have actual size, like in C++.  So
5041              see if we didn't push any subfields and the size is
5042              nonzero, push the field onto the stack.  */
5043           push = true;
5044
5045         if (push)
5046           {
5047             fieldoff_s *pair = NULL;
5048             bool has_unknown_size = false;
5049
5050             if (!VEC_empty (fieldoff_s, *fieldstack))
5051               pair = VEC_last (fieldoff_s, *fieldstack);
5052
5053             if (!DECL_SIZE (field)
5054                 || !host_integerp (DECL_SIZE (field), 1))
5055               has_unknown_size = true;
5056
5057             /* If adjacent fields do not contain pointers merge them.  */
5058             if (pair
5059                 && !pair->may_have_pointers
5060                 && !pair->has_unknown_size
5061                 && !has_unknown_size
5062                 && pair->offset + (HOST_WIDE_INT)pair->size == offset + foff
5063                 && !must_have_pointers_p
5064                 && !could_have_pointers (field))
5065               {
5066                 pair->size += TREE_INT_CST_LOW (DECL_SIZE (field));
5067               }
5068             else
5069               {
5070                 pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
5071                 pair->offset = offset + foff;
5072                 pair->has_unknown_size = has_unknown_size;
5073                 if (!has_unknown_size)
5074                   pair->size = TREE_INT_CST_LOW (DECL_SIZE (field));
5075                 else
5076                   pair->size = -1;
5077                 pair->may_have_pointers
5078                   = must_have_pointers_p || could_have_pointers (field);
5079                 pair->only_restrict_pointers
5080                   = (!has_unknown_size
5081                      && POINTER_TYPE_P (TREE_TYPE (field))
5082                      && TYPE_RESTRICT (TREE_TYPE (field)));
5083               }
5084           }
5085
5086         empty_p = false;
5087       }
5088
5089   return !empty_p;
5090 }
5091
5092 /* Count the number of arguments DECL has, and set IS_VARARGS to true
5093    if it is a varargs function.  */
5094
5095 static unsigned int
5096 count_num_arguments (tree decl, bool *is_varargs)
5097 {
5098   unsigned int num = 0;
5099   tree t;
5100
5101   /* Capture named arguments for K&R functions.  They do not
5102      have a prototype and thus no TYPE_ARG_TYPES.  */
5103   for (t = DECL_ARGUMENTS (decl); t; t = DECL_CHAIN (t))
5104     ++num;
5105
5106   /* Check if the function has variadic arguments.  */
5107   for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); t; t = TREE_CHAIN (t))
5108     if (TREE_VALUE (t) == void_type_node)
5109       break;
5110   if (!t)
5111     *is_varargs = true;
5112
5113   return num;
5114 }
5115
5116 /* Creation function node for DECL, using NAME, and return the index
5117    of the variable we've created for the function.  */
5118
5119 static varinfo_t
5120 create_function_info_for (tree decl, const char *name)
5121 {
5122   struct function *fn = DECL_STRUCT_FUNCTION (decl);
5123   varinfo_t vi, prev_vi;
5124   tree arg;
5125   unsigned int i;
5126   bool is_varargs = false;
5127   unsigned int num_args = count_num_arguments (decl, &is_varargs);
5128
5129   /* Create the variable info.  */
5130
5131   vi = new_var_info (decl, name);
5132   vi->offset = 0;
5133   vi->size = 1;
5134   vi->fullsize = fi_parm_base + num_args;
5135   vi->is_fn_info = 1;
5136   vi->may_have_pointers = false;
5137   if (is_varargs)
5138     vi->fullsize = ~0;
5139   insert_vi_for_tree (vi->decl, vi);
5140
5141   prev_vi = vi;
5142
5143   /* Create a variable for things the function clobbers and one for
5144      things the function uses.  */
5145     {
5146       varinfo_t clobbervi, usevi;
5147       const char *newname;
5148       char *tempname;
5149
5150       asprintf (&tempname, "%s.clobber", name);
5151       newname = ggc_strdup (tempname);
5152       free (tempname);
5153
5154       clobbervi = new_var_info (NULL, newname);
5155       clobbervi->offset = fi_clobbers;
5156       clobbervi->size = 1;
5157       clobbervi->fullsize = vi->fullsize;
5158       clobbervi->is_full_var = true;
5159       clobbervi->is_global_var = false;
5160       gcc_assert (prev_vi->offset < clobbervi->offset);
5161       prev_vi->next = clobbervi;
5162       prev_vi = clobbervi;
5163
5164       asprintf (&tempname, "%s.use", name);
5165       newname = ggc_strdup (tempname);
5166       free (tempname);
5167
5168       usevi = new_var_info (NULL, newname);
5169       usevi->offset = fi_uses;
5170       usevi->size = 1;
5171       usevi->fullsize = vi->fullsize;
5172       usevi->is_full_var = true;
5173       usevi->is_global_var = false;
5174       gcc_assert (prev_vi->offset < usevi->offset);
5175       prev_vi->next = usevi;
5176       prev_vi = usevi;
5177     }
5178
5179   /* And one for the static chain.  */
5180   if (fn->static_chain_decl != NULL_TREE)
5181     {
5182       varinfo_t chainvi;
5183       const char *newname;
5184       char *tempname;
5185
5186       asprintf (&tempname, "%s.chain", name);
5187       newname = ggc_strdup (tempname);
5188       free (tempname);
5189
5190       chainvi = new_var_info (fn->static_chain_decl, newname);
5191       chainvi->offset = fi_static_chain;
5192       chainvi->size = 1;
5193       chainvi->fullsize = vi->fullsize;
5194       chainvi->is_full_var = true;
5195       chainvi->is_global_var = false;
5196       gcc_assert (prev_vi->offset < chainvi->offset);
5197       prev_vi->next = chainvi;
5198       prev_vi = chainvi;
5199       insert_vi_for_tree (fn->static_chain_decl, chainvi);
5200     }
5201
5202   /* Create a variable for the return var.  */
5203   if (DECL_RESULT (decl) != NULL
5204       || !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
5205     {
5206       varinfo_t resultvi;
5207       const char *newname;
5208       char *tempname;
5209       tree resultdecl = decl;
5210
5211       if (DECL_RESULT (decl))
5212         resultdecl = DECL_RESULT (decl);
5213
5214       asprintf (&tempname, "%s.result", name);
5215       newname = ggc_strdup (tempname);
5216       free (tempname);
5217
5218       resultvi = new_var_info (resultdecl, newname);
5219       resultvi->offset = fi_result;
5220       resultvi->size = 1;
5221       resultvi->fullsize = vi->fullsize;
5222       resultvi->is_full_var = true;
5223       if (DECL_RESULT (decl))
5224         resultvi->may_have_pointers = could_have_pointers (DECL_RESULT (decl));
5225       gcc_assert (prev_vi->offset < resultvi->offset);
5226       prev_vi->next = resultvi;
5227       prev_vi = resultvi;
5228       if (DECL_RESULT (decl))
5229         insert_vi_for_tree (DECL_RESULT (decl), resultvi);
5230     }
5231
5232   /* Set up variables for each argument.  */
5233   arg = DECL_ARGUMENTS (decl);
5234   for (i = 0; i < num_args; i++)
5235     {
5236       varinfo_t argvi;
5237       const char *newname;
5238       char *tempname;
5239       tree argdecl = decl;
5240
5241       if (arg)
5242         argdecl = arg;
5243
5244       asprintf (&tempname, "%s.arg%d", name, i);
5245       newname = ggc_strdup (tempname);
5246       free (tempname);
5247
5248       argvi = new_var_info (argdecl, newname);
5249       argvi->offset = fi_parm_base + i;
5250       argvi->size = 1;
5251       argvi->is_full_var = true;
5252       argvi->fullsize = vi->fullsize;
5253       if (arg)
5254         argvi->may_have_pointers = could_have_pointers (arg);
5255       gcc_assert (prev_vi->offset < argvi->offset);
5256       prev_vi->next = argvi;
5257       prev_vi = argvi;
5258       if (arg)
5259         {
5260           insert_vi_for_tree (arg, argvi);
5261           arg = DECL_CHAIN (arg);
5262         }
5263     }
5264
5265   /* Add one representative for all further args.  */
5266   if (is_varargs)
5267     {
5268       varinfo_t argvi;
5269       const char *newname;
5270       char *tempname;
5271       tree decl;
5272
5273       asprintf (&tempname, "%s.varargs", name);
5274       newname = ggc_strdup (tempname);
5275       free (tempname);
5276
5277       /* We need sth that can be pointed to for va_start.  */
5278       decl = create_tmp_var_raw (ptr_type_node, name);
5279       get_var_ann (decl);
5280
5281       argvi = new_var_info (decl, newname);
5282       argvi->offset = fi_parm_base + num_args;
5283       argvi->size = ~0;
5284       argvi->is_full_var = true;
5285       argvi->is_heap_var = true;
5286       argvi->fullsize = vi->fullsize;
5287       gcc_assert (prev_vi->offset < argvi->offset);
5288       prev_vi->next = argvi;
5289       prev_vi = argvi;
5290     }
5291
5292   return vi;
5293 }
5294
5295
5296 /* Return true if FIELDSTACK contains fields that overlap.
5297    FIELDSTACK is assumed to be sorted by offset.  */
5298
5299 static bool
5300 check_for_overlaps (VEC (fieldoff_s,heap) *fieldstack)
5301 {
5302   fieldoff_s *fo = NULL;
5303   unsigned int i;
5304   HOST_WIDE_INT lastoffset = -1;
5305
5306   FOR_EACH_VEC_ELT (fieldoff_s, fieldstack, i, fo)
5307     {
5308       if (fo->offset == lastoffset)
5309         return true;
5310       lastoffset = fo->offset;
5311     }
5312   return false;
5313 }
5314
5315 /* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
5316    This will also create any varinfo structures necessary for fields
5317    of DECL.  */
5318
5319 static varinfo_t
5320 create_variable_info_for_1 (tree decl, const char *name)
5321 {
5322   varinfo_t vi, newvi;
5323   tree decl_type = TREE_TYPE (decl);
5324   tree declsize = DECL_P (decl) ? DECL_SIZE (decl) : TYPE_SIZE (decl_type);
5325   VEC (fieldoff_s,heap) *fieldstack = NULL;
5326   fieldoff_s *fo;
5327   unsigned int i;
5328
5329   if (!declsize
5330       || !host_integerp (declsize, 1))
5331     {
5332       vi = new_var_info (decl, name);
5333       vi->offset = 0;
5334       vi->size = ~0;
5335       vi->fullsize = ~0;
5336       vi->is_unknown_size_var = true;
5337       vi->is_full_var = true;
5338       vi->may_have_pointers = could_have_pointers (decl);
5339       return vi;
5340     }
5341
5342   /* Collect field information.  */
5343   if (use_field_sensitive
5344       && var_can_have_subvars (decl)
5345       /* ???  Force us to not use subfields for global initializers
5346          in IPA mode.  Else we'd have to parse arbitrary initializers.  */
5347       && !(in_ipa_mode
5348            && is_global_var (decl)
5349            && DECL_INITIAL (decl)))
5350     {
5351       fieldoff_s *fo = NULL;
5352       bool notokay = false;
5353       unsigned int i;
5354
5355       push_fields_onto_fieldstack (decl_type, &fieldstack, 0,
5356                                    TREE_PUBLIC (decl)
5357                                    || DECL_EXTERNAL (decl)
5358                                    || TREE_ADDRESSABLE (decl));
5359
5360       for (i = 0; !notokay && VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
5361         if (fo->has_unknown_size
5362             || fo->offset < 0)
5363           {
5364             notokay = true;
5365             break;
5366           }
5367
5368       /* We can't sort them if we have a field with a variable sized type,
5369          which will make notokay = true.  In that case, we are going to return
5370          without creating varinfos for the fields anyway, so sorting them is a
5371          waste to boot.  */
5372       if (!notokay)
5373         {
5374           sort_fieldstack (fieldstack);
5375           /* Due to some C++ FE issues, like PR 22488, we might end up
5376              what appear to be overlapping fields even though they,
5377              in reality, do not overlap.  Until the C++ FE is fixed,
5378              we will simply disable field-sensitivity for these cases.  */
5379           notokay = check_for_overlaps (fieldstack);
5380         }
5381
5382       if (notokay)
5383         VEC_free (fieldoff_s, heap, fieldstack);
5384     }
5385
5386   /* If we didn't end up collecting sub-variables create a full
5387      variable for the decl.  */
5388   if (VEC_length (fieldoff_s, fieldstack) <= 1
5389       || VEC_length (fieldoff_s, fieldstack) > MAX_FIELDS_FOR_FIELD_SENSITIVE)
5390     {
5391       vi = new_var_info (decl, name);
5392       vi->offset = 0;
5393       vi->may_have_pointers = could_have_pointers (decl);
5394       vi->fullsize = TREE_INT_CST_LOW (declsize);
5395       vi->size = vi->fullsize;
5396       vi->is_full_var = true;
5397       VEC_free (fieldoff_s, heap, fieldstack);
5398       return vi;
5399     }
5400
5401   vi = new_var_info (decl, name);
5402   vi->fullsize = TREE_INT_CST_LOW (declsize);
5403   for (i = 0, newvi = vi;
5404        VEC_iterate (fieldoff_s, fieldstack, i, fo);
5405        ++i, newvi = newvi->next)
5406     {
5407       const char *newname = "NULL";
5408       char *tempname;
5409
5410       if (dump_file)
5411         {
5412           asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC
5413                     "+" HOST_WIDE_INT_PRINT_DEC, name, fo->offset, fo->size);
5414           newname = ggc_strdup (tempname);
5415           free (tempname);
5416         }
5417       newvi->name = newname;
5418       newvi->offset = fo->offset;
5419       newvi->size = fo->size;
5420       newvi->fullsize = vi->fullsize;
5421       newvi->may_have_pointers = fo->may_have_pointers;
5422       newvi->only_restrict_pointers = fo->only_restrict_pointers;
5423       if (i + 1 < VEC_length (fieldoff_s, fieldstack))
5424         newvi->next = new_var_info (decl, name);
5425     }
5426
5427   VEC_free (fieldoff_s, heap, fieldstack);
5428
5429   return vi;
5430 }
5431
5432 static unsigned int
5433 create_variable_info_for (tree decl, const char *name)
5434 {
5435   varinfo_t vi = create_variable_info_for_1 (decl, name);
5436   unsigned int id = vi->id;
5437
5438   insert_vi_for_tree (decl, vi);
5439
5440   /* Create initial constraints for globals.  */
5441   for (; vi; vi = vi->next)
5442     {
5443       if (!vi->may_have_pointers
5444           || !vi->is_global_var)
5445         continue;
5446
5447       /* Mark global restrict qualified pointers.  */
5448       if ((POINTER_TYPE_P (TREE_TYPE (decl))
5449            && TYPE_RESTRICT (TREE_TYPE (decl)))
5450           || vi->only_restrict_pointers)
5451         make_constraint_from_restrict (vi, "GLOBAL_RESTRICT");
5452
5453       /* For escaped variables initialize them from nonlocal.  */
5454       if (!in_ipa_mode
5455           || DECL_EXTERNAL (decl) || TREE_PUBLIC (decl))
5456         make_copy_constraint (vi, nonlocal_id);
5457
5458       /* If this is a global variable with an initializer and we are in
5459          IPA mode generate constraints for it.  In non-IPA mode
5460          the initializer from nonlocal is all we need.  */
5461       if (in_ipa_mode
5462           && DECL_INITIAL (decl))
5463         {
5464           VEC (ce_s, heap) *rhsc = NULL;
5465           struct constraint_expr lhs, *rhsp;
5466           unsigned i;
5467           get_constraint_for_rhs (DECL_INITIAL (decl), &rhsc);
5468           lhs.var = vi->id;
5469           lhs.offset = 0;
5470           lhs.type = SCALAR;
5471           FOR_EACH_VEC_ELT (ce_s, rhsc, i, rhsp)
5472             process_constraint (new_constraint (lhs, *rhsp));
5473           /* If this is a variable that escapes from the unit
5474              the initializer escapes as well.  */
5475           if (DECL_EXTERNAL (decl) || TREE_PUBLIC (decl))
5476             {
5477               lhs.var = escaped_id;
5478               lhs.offset = 0;
5479               lhs.type = SCALAR;
5480               FOR_EACH_VEC_ELT (ce_s, rhsc, i, rhsp)
5481                 process_constraint (new_constraint (lhs, *rhsp));
5482             }
5483           VEC_free (ce_s, heap, rhsc);
5484         }
5485     }
5486
5487   return id;
5488 }
5489
5490 /* Print out the points-to solution for VAR to FILE.  */
5491
5492 static void
5493 dump_solution_for_var (FILE *file, unsigned int var)
5494 {
5495   varinfo_t vi = get_varinfo (var);
5496   unsigned int i;
5497   bitmap_iterator bi;
5498
5499   /* Dump the solution for unified vars anyway, this avoids difficulties
5500      in scanning dumps in the testsuite.  */
5501   fprintf (file, "%s = { ", vi->name);
5502   vi = get_varinfo (find (var));
5503   EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
5504     fprintf (file, "%s ", get_varinfo (i)->name);
5505   fprintf (file, "}");
5506
5507   /* But note when the variable was unified.  */
5508   if (vi->id != var)
5509     fprintf (file, " same as %s", vi->name);
5510
5511   fprintf (file, "\n");
5512 }
5513
5514 /* Print the points-to solution for VAR to stdout.  */
5515
5516 DEBUG_FUNCTION void
5517 debug_solution_for_var (unsigned int var)
5518 {
5519   dump_solution_for_var (stdout, var);
5520 }
5521
5522 /* Create varinfo structures for all of the variables in the
5523    function for intraprocedural mode.  */
5524
5525 static void
5526 intra_create_variable_infos (void)
5527 {
5528   tree t;
5529
5530   /* For each incoming pointer argument arg, create the constraint ARG
5531      = NONLOCAL or a dummy variable if it is a restrict qualified
5532      passed-by-reference argument.  */
5533   for (t = DECL_ARGUMENTS (current_function_decl); t; t = DECL_CHAIN (t))
5534     {
5535       varinfo_t p;
5536
5537       if (!could_have_pointers (t))
5538         continue;
5539
5540       /* For restrict qualified pointers to objects passed by
5541          reference build a real representative for the pointed-to object.  */
5542       if (DECL_BY_REFERENCE (t)
5543           && POINTER_TYPE_P (TREE_TYPE (t))
5544           && TYPE_RESTRICT (TREE_TYPE (t)))
5545         {
5546           struct constraint_expr lhsc, rhsc;
5547           varinfo_t vi;
5548           tree heapvar = heapvar_lookup (t, 0);
5549           if (heapvar == NULL_TREE)
5550             {
5551               var_ann_t ann;
5552               heapvar = create_tmp_var_raw (TREE_TYPE (TREE_TYPE (t)),
5553                                             "PARM_NOALIAS");
5554               DECL_EXTERNAL (heapvar) = 1;
5555               heapvar_insert (t, 0, heapvar);
5556               ann = get_var_ann (heapvar);
5557               ann->is_heapvar = 1;
5558             }
5559           if (gimple_referenced_vars (cfun))
5560             add_referenced_var (heapvar);
5561           lhsc.var = get_vi_for_tree (t)->id;
5562           lhsc.type = SCALAR;
5563           lhsc.offset = 0;
5564           rhsc.var = (vi = get_vi_for_tree (heapvar))->id;
5565           rhsc.type = ADDRESSOF;
5566           rhsc.offset = 0;
5567           process_constraint (new_constraint (lhsc, rhsc));
5568           vi->is_restrict_var = 1;
5569           continue;
5570         }
5571
5572       for (p = get_vi_for_tree (t); p; p = p->next)
5573         {
5574           if (p->may_have_pointers)
5575             make_constraint_from (p, nonlocal_id);
5576           if (p->only_restrict_pointers)
5577             make_constraint_from_restrict (p, "PARM_RESTRICT");
5578         }
5579       if (POINTER_TYPE_P (TREE_TYPE (t))
5580           && TYPE_RESTRICT (TREE_TYPE (t)))
5581         make_constraint_from_restrict (get_vi_for_tree (t), "PARM_RESTRICT");
5582     }
5583
5584   /* Add a constraint for a result decl that is passed by reference.  */
5585   if (DECL_RESULT (cfun->decl)
5586       && DECL_BY_REFERENCE (DECL_RESULT (cfun->decl)))
5587     {
5588       varinfo_t p, result_vi = get_vi_for_tree (DECL_RESULT (cfun->decl));
5589
5590       for (p = result_vi; p; p = p->next)
5591         make_constraint_from (p, nonlocal_id);
5592     }
5593
5594   /* Add a constraint for the incoming static chain parameter.  */
5595   if (cfun->static_chain_decl != NULL_TREE)
5596     {
5597       varinfo_t p, chain_vi = get_vi_for_tree (cfun->static_chain_decl);
5598
5599       for (p = chain_vi; p; p = p->next)
5600         make_constraint_from (p, nonlocal_id);
5601     }
5602 }
5603
5604 /* Structure used to put solution bitmaps in a hashtable so they can
5605    be shared among variables with the same points-to set.  */
5606
5607 typedef struct shared_bitmap_info
5608 {
5609   bitmap pt_vars;
5610   hashval_t hashcode;
5611 } *shared_bitmap_info_t;
5612 typedef const struct shared_bitmap_info *const_shared_bitmap_info_t;
5613
5614 static htab_t shared_bitmap_table;
5615
5616 /* Hash function for a shared_bitmap_info_t */
5617
5618 static hashval_t
5619 shared_bitmap_hash (const void *p)
5620 {
5621   const_shared_bitmap_info_t const bi = (const_shared_bitmap_info_t) p;
5622   return bi->hashcode;
5623 }
5624
5625 /* Equality function for two shared_bitmap_info_t's. */
5626
5627 static int
5628 shared_bitmap_eq (const void *p1, const void *p2)
5629 {
5630   const_shared_bitmap_info_t const sbi1 = (const_shared_bitmap_info_t) p1;
5631   const_shared_bitmap_info_t const sbi2 = (const_shared_bitmap_info_t) p2;
5632   return bitmap_equal_p (sbi1->pt_vars, sbi2->pt_vars);
5633 }
5634
5635 /* Lookup a bitmap in the shared bitmap hashtable, and return an already
5636    existing instance if there is one, NULL otherwise.  */
5637
5638 static bitmap
5639 shared_bitmap_lookup (bitmap pt_vars)
5640 {
5641   void **slot;
5642   struct shared_bitmap_info sbi;
5643
5644   sbi.pt_vars = pt_vars;
5645   sbi.hashcode = bitmap_hash (pt_vars);
5646
5647   slot = htab_find_slot_with_hash (shared_bitmap_table, &sbi,
5648                                    sbi.hashcode, NO_INSERT);
5649   if (!slot)
5650     return NULL;
5651   else
5652     return ((shared_bitmap_info_t) *slot)->pt_vars;
5653 }
5654
5655
5656 /* Add a bitmap to the shared bitmap hashtable.  */
5657
5658 static void
5659 shared_bitmap_add (bitmap pt_vars)
5660 {
5661   void **slot;
5662   shared_bitmap_info_t sbi = XNEW (struct shared_bitmap_info);
5663
5664   sbi->pt_vars = pt_vars;
5665   sbi->hashcode = bitmap_hash (pt_vars);
5666
5667   slot = htab_find_slot_with_hash (shared_bitmap_table, sbi,
5668                                    sbi->hashcode, INSERT);
5669   gcc_assert (!*slot);
5670   *slot = (void *) sbi;
5671 }
5672
5673
5674 /* Set bits in INTO corresponding to the variable uids in solution set FROM.  */
5675
5676 static void
5677 set_uids_in_ptset (bitmap into, bitmap from, struct pt_solution *pt)
5678 {
5679   unsigned int i;
5680   bitmap_iterator bi;
5681
5682   EXECUTE_IF_SET_IN_BITMAP (from, 0, i, bi)
5683     {
5684       varinfo_t vi = get_varinfo (i);
5685
5686       /* The only artificial variables that are allowed in a may-alias
5687          set are heap variables.  */
5688       if (vi->is_artificial_var && !vi->is_heap_var)
5689         continue;
5690
5691       if (TREE_CODE (vi->decl) == VAR_DECL
5692           || TREE_CODE (vi->decl) == PARM_DECL
5693           || TREE_CODE (vi->decl) == RESULT_DECL)
5694         {
5695           /* If we are in IPA mode we will not recompute points-to
5696              sets after inlining so make sure they stay valid.  */
5697           if (in_ipa_mode
5698               && !DECL_PT_UID_SET_P (vi->decl))
5699             SET_DECL_PT_UID (vi->decl, DECL_UID (vi->decl));
5700
5701           /* Add the decl to the points-to set.  Note that the points-to
5702              set contains global variables.  */
5703           bitmap_set_bit (into, DECL_PT_UID (vi->decl));
5704           if (vi->is_global_var)
5705             pt->vars_contains_global = true;
5706         }
5707     }
5708 }
5709
5710
5711 /* Compute the points-to solution *PT for the variable VI.  */
5712
5713 static void
5714 find_what_var_points_to (varinfo_t orig_vi, struct pt_solution *pt)
5715 {
5716   unsigned int i;
5717   bitmap_iterator bi;
5718   bitmap finished_solution;
5719   bitmap result;
5720   varinfo_t vi;
5721
5722   memset (pt, 0, sizeof (struct pt_solution));
5723
5724   /* This variable may have been collapsed, let's get the real
5725      variable.  */
5726   vi = get_varinfo (find (orig_vi->id));
5727
5728   /* Translate artificial variables into SSA_NAME_PTR_INFO
5729      attributes.  */
5730   EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
5731     {
5732       varinfo_t vi = get_varinfo (i);
5733
5734       if (vi->is_artificial_var)
5735         {
5736           if (vi->id == nothing_id)
5737             pt->null = 1;
5738           else if (vi->id == escaped_id)
5739             {
5740               if (in_ipa_mode)
5741                 pt->ipa_escaped = 1;
5742               else
5743                 pt->escaped = 1;
5744             }
5745           else if (vi->id == nonlocal_id)
5746             pt->nonlocal = 1;
5747           else if (vi->is_heap_var)
5748             /* We represent heapvars in the points-to set properly.  */
5749             ;
5750           else if (vi->id == readonly_id)
5751             /* Nobody cares.  */
5752             ;
5753           else if (vi->id == anything_id
5754                    || vi->id == integer_id)
5755             pt->anything = 1;
5756         }
5757       if (vi->is_restrict_var)
5758         pt->vars_contains_restrict = true;
5759     }
5760
5761   /* Instead of doing extra work, simply do not create
5762      elaborate points-to information for pt_anything pointers.  */
5763   if (pt->anything
5764       && (orig_vi->is_artificial_var
5765           || !pt->vars_contains_restrict))
5766     return;
5767
5768   /* Share the final set of variables when possible.  */
5769   finished_solution = BITMAP_GGC_ALLOC ();
5770   stats.points_to_sets_created++;
5771
5772   set_uids_in_ptset (finished_solution, vi->solution, pt);
5773   result = shared_bitmap_lookup (finished_solution);
5774   if (!result)
5775     {
5776       shared_bitmap_add (finished_solution);
5777       pt->vars = finished_solution;
5778     }
5779   else
5780     {
5781       pt->vars = result;
5782       bitmap_clear (finished_solution);
5783     }
5784 }
5785
5786 /* Given a pointer variable P, fill in its points-to set.  */
5787
5788 static void
5789 find_what_p_points_to (tree p)
5790 {
5791   struct ptr_info_def *pi;
5792   tree lookup_p = p;
5793   varinfo_t vi;
5794
5795   /* For parameters, get at the points-to set for the actual parm
5796      decl.  */
5797   if (TREE_CODE (p) == SSA_NAME
5798       && (TREE_CODE (SSA_NAME_VAR (p)) == PARM_DECL
5799           || TREE_CODE (SSA_NAME_VAR (p)) == RESULT_DECL)
5800       && SSA_NAME_IS_DEFAULT_DEF (p))
5801     lookup_p = SSA_NAME_VAR (p);
5802
5803   vi = lookup_vi_for_tree (lookup_p);
5804   if (!vi)
5805     return;
5806
5807   pi = get_ptr_info (p);
5808   find_what_var_points_to (vi, &pi->pt);
5809 }
5810
5811
5812 /* Query statistics for points-to solutions.  */
5813
5814 static struct {
5815   unsigned HOST_WIDE_INT pt_solution_includes_may_alias;
5816   unsigned HOST_WIDE_INT pt_solution_includes_no_alias;
5817   unsigned HOST_WIDE_INT pt_solutions_intersect_may_alias;
5818   unsigned HOST_WIDE_INT pt_solutions_intersect_no_alias;
5819 } pta_stats;
5820
5821 void
5822 dump_pta_stats (FILE *s)
5823 {
5824   fprintf (s, "\nPTA query stats:\n");
5825   fprintf (s, "  pt_solution_includes: "
5826            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
5827            HOST_WIDE_INT_PRINT_DEC" queries\n",
5828            pta_stats.pt_solution_includes_no_alias,
5829            pta_stats.pt_solution_includes_no_alias
5830            + pta_stats.pt_solution_includes_may_alias);
5831   fprintf (s, "  pt_solutions_intersect: "
5832            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
5833            HOST_WIDE_INT_PRINT_DEC" queries\n",
5834            pta_stats.pt_solutions_intersect_no_alias,
5835            pta_stats.pt_solutions_intersect_no_alias
5836            + pta_stats.pt_solutions_intersect_may_alias);
5837 }
5838
5839
5840 /* Reset the points-to solution *PT to a conservative default
5841    (point to anything).  */
5842
5843 void
5844 pt_solution_reset (struct pt_solution *pt)
5845 {
5846   memset (pt, 0, sizeof (struct pt_solution));
5847   pt->anything = true;
5848 }
5849
5850 /* Set the points-to solution *PT to point only to the variables
5851    in VARS.  VARS_CONTAINS_GLOBAL specifies whether that contains
5852    global variables and VARS_CONTAINS_RESTRICT specifies whether
5853    it contains restrict tag variables.  */
5854
5855 void
5856 pt_solution_set (struct pt_solution *pt, bitmap vars,
5857                  bool vars_contains_global, bool vars_contains_restrict)
5858 {
5859   memset (pt, 0, sizeof (struct pt_solution));
5860   pt->vars = vars;
5861   pt->vars_contains_global = vars_contains_global;
5862   pt->vars_contains_restrict = vars_contains_restrict;
5863 }
5864
5865 /* Set the points-to solution *PT to point only to the variable VAR.  */
5866
5867 void
5868 pt_solution_set_var (struct pt_solution *pt, tree var)
5869 {
5870   memset (pt, 0, sizeof (struct pt_solution));
5871   pt->vars = BITMAP_GGC_ALLOC ();
5872   bitmap_set_bit (pt->vars, DECL_UID (var));
5873   pt->vars_contains_global = is_global_var (var);
5874 }
5875
5876 /* Computes the union of the points-to solutions *DEST and *SRC and
5877    stores the result in *DEST.  This changes the points-to bitmap
5878    of *DEST and thus may not be used if that might be shared.
5879    The points-to bitmap of *SRC and *DEST will not be shared after
5880    this function if they were not before.  */
5881
5882 static void
5883 pt_solution_ior_into (struct pt_solution *dest, struct pt_solution *src)
5884 {
5885   dest->anything |= src->anything;
5886   if (dest->anything)
5887     {
5888       pt_solution_reset (dest);
5889       return;
5890     }
5891
5892   dest->nonlocal |= src->nonlocal;
5893   dest->escaped |= src->escaped;
5894   dest->ipa_escaped |= src->ipa_escaped;
5895   dest->null |= src->null;
5896   dest->vars_contains_global |= src->vars_contains_global;
5897   dest->vars_contains_restrict |= src->vars_contains_restrict;
5898   if (!src->vars)
5899     return;
5900
5901   if (!dest->vars)
5902     dest->vars = BITMAP_GGC_ALLOC ();
5903   bitmap_ior_into (dest->vars, src->vars);
5904 }
5905
5906 /* Return true if the points-to solution *PT is empty.  */
5907
5908 bool
5909 pt_solution_empty_p (struct pt_solution *pt)
5910 {
5911   if (pt->anything
5912       || pt->nonlocal)
5913     return false;
5914
5915   if (pt->vars
5916       && !bitmap_empty_p (pt->vars))
5917     return false;
5918
5919   /* If the solution includes ESCAPED, check if that is empty.  */
5920   if (pt->escaped
5921       && !pt_solution_empty_p (&cfun->gimple_df->escaped))
5922     return false;
5923
5924   /* If the solution includes ESCAPED, check if that is empty.  */
5925   if (pt->ipa_escaped
5926       && !pt_solution_empty_p (&ipa_escaped_pt))
5927     return false;
5928
5929   return true;
5930 }
5931
5932 /* Return true if the points-to solution *PT includes global memory.  */
5933
5934 bool
5935 pt_solution_includes_global (struct pt_solution *pt)
5936 {
5937   if (pt->anything
5938       || pt->nonlocal
5939       || pt->vars_contains_global)
5940     return true;
5941
5942   if (pt->escaped)
5943     return pt_solution_includes_global (&cfun->gimple_df->escaped);
5944
5945   if (pt->ipa_escaped)
5946     return pt_solution_includes_global (&ipa_escaped_pt);
5947
5948   /* ???  This predicate is not correct for the IPA-PTA solution
5949      as we do not properly distinguish between unit escape points
5950      and global variables.  */
5951   if (cfun->gimple_df->ipa_pta)
5952     return true;
5953
5954   return false;
5955 }
5956
5957 /* Return true if the points-to solution *PT includes the variable
5958    declaration DECL.  */
5959
5960 static bool
5961 pt_solution_includes_1 (struct pt_solution *pt, const_tree decl)
5962 {
5963   if (pt->anything)
5964     return true;
5965
5966   if (pt->nonlocal
5967       && is_global_var (decl))
5968     return true;
5969
5970   if (pt->vars
5971       && bitmap_bit_p (pt->vars, DECL_PT_UID (decl)))
5972     return true;
5973
5974   /* If the solution includes ESCAPED, check it.  */
5975   if (pt->escaped
5976       && pt_solution_includes_1 (&cfun->gimple_df->escaped, decl))
5977     return true;
5978
5979   /* If the solution includes ESCAPED, check it.  */
5980   if (pt->ipa_escaped
5981       && pt_solution_includes_1 (&ipa_escaped_pt, decl))
5982     return true;
5983
5984   return false;
5985 }
5986
5987 bool
5988 pt_solution_includes (struct pt_solution *pt, const_tree decl)
5989 {
5990   bool res = pt_solution_includes_1 (pt, decl);
5991   if (res)
5992     ++pta_stats.pt_solution_includes_may_alias;
5993   else
5994     ++pta_stats.pt_solution_includes_no_alias;
5995   return res;
5996 }
5997
5998 /* Return true if both points-to solutions PT1 and PT2 have a non-empty
5999    intersection.  */
6000
6001 static bool
6002 pt_solutions_intersect_1 (struct pt_solution *pt1, struct pt_solution *pt2)
6003 {
6004   if (pt1->anything || pt2->anything)
6005     return true;
6006
6007   /* If either points to unknown global memory and the other points to
6008      any global memory they alias.  */
6009   if ((pt1->nonlocal
6010        && (pt2->nonlocal
6011            || pt2->vars_contains_global))
6012       || (pt2->nonlocal
6013           && pt1->vars_contains_global))
6014     return true;
6015
6016   /* Check the escaped solution if required.  */
6017   if ((pt1->escaped || pt2->escaped)
6018       && !pt_solution_empty_p (&cfun->gimple_df->escaped))
6019     {
6020       /* If both point to escaped memory and that solution
6021          is not empty they alias.  */
6022       if (pt1->escaped && pt2->escaped)
6023         return true;
6024
6025       /* If either points to escaped memory see if the escaped solution
6026          intersects with the other.  */
6027       if ((pt1->escaped
6028            && pt_solutions_intersect_1 (&cfun->gimple_df->escaped, pt2))
6029           || (pt2->escaped
6030               && pt_solutions_intersect_1 (&cfun->gimple_df->escaped, pt1)))
6031         return true;
6032     }
6033
6034   /* Check the escaped solution if required.
6035      ???  Do we need to check the local against the IPA escaped sets?  */
6036   if ((pt1->ipa_escaped || pt2->ipa_escaped)
6037       && !pt_solution_empty_p (&ipa_escaped_pt))
6038     {
6039       /* If both point to escaped memory and that solution
6040          is not empty they alias.  */
6041       if (pt1->ipa_escaped && pt2->ipa_escaped)
6042         return true;
6043
6044       /* If either points to escaped memory see if the escaped solution
6045          intersects with the other.  */
6046       if ((pt1->ipa_escaped
6047            && pt_solutions_intersect_1 (&ipa_escaped_pt, pt2))
6048           || (pt2->ipa_escaped
6049               && pt_solutions_intersect_1 (&ipa_escaped_pt, pt1)))
6050         return true;
6051     }
6052
6053   /* Now both pointers alias if their points-to solution intersects.  */
6054   return (pt1->vars
6055           && pt2->vars
6056           && bitmap_intersect_p (pt1->vars, pt2->vars));
6057 }
6058
6059 bool
6060 pt_solutions_intersect (struct pt_solution *pt1, struct pt_solution *pt2)
6061 {
6062   bool res = pt_solutions_intersect_1 (pt1, pt2);
6063   if (res)
6064     ++pta_stats.pt_solutions_intersect_may_alias;
6065   else
6066     ++pta_stats.pt_solutions_intersect_no_alias;
6067   return res;
6068 }
6069
6070 /* Return true if both points-to solutions PT1 and PT2 for two restrict
6071    qualified pointers are possibly based on the same pointer.  */
6072
6073 bool
6074 pt_solutions_same_restrict_base (struct pt_solution *pt1,
6075                                  struct pt_solution *pt2)
6076 {
6077   /* If we deal with points-to solutions of two restrict qualified
6078      pointers solely rely on the pointed-to variable bitmap intersection.
6079      For two pointers that are based on each other the bitmaps will
6080      intersect.  */
6081   if (pt1->vars_contains_restrict
6082       && pt2->vars_contains_restrict)
6083     {
6084       gcc_assert (pt1->vars && pt2->vars);
6085       return bitmap_intersect_p (pt1->vars, pt2->vars);
6086     }
6087
6088   return true;
6089 }
6090
6091
6092 /* Dump points-to information to OUTFILE.  */
6093
6094 static void
6095 dump_sa_points_to_info (FILE *outfile)
6096 {
6097   unsigned int i;
6098
6099   fprintf (outfile, "\nPoints-to sets\n\n");
6100
6101   if (dump_flags & TDF_STATS)
6102     {
6103       fprintf (outfile, "Stats:\n");
6104       fprintf (outfile, "Total vars:               %d\n", stats.total_vars);
6105       fprintf (outfile, "Non-pointer vars:          %d\n",
6106                stats.nonpointer_vars);
6107       fprintf (outfile, "Statically unified vars:  %d\n",
6108                stats.unified_vars_static);
6109       fprintf (outfile, "Dynamically unified vars: %d\n",
6110                stats.unified_vars_dynamic);
6111       fprintf (outfile, "Iterations:               %d\n", stats.iterations);
6112       fprintf (outfile, "Number of edges:          %d\n", stats.num_edges);
6113       fprintf (outfile, "Number of implicit edges: %d\n",
6114                stats.num_implicit_edges);
6115     }
6116
6117   for (i = 0; i < VEC_length (varinfo_t, varmap); i++)
6118     {
6119       varinfo_t vi = get_varinfo (i);
6120       if (!vi->may_have_pointers)
6121         continue;
6122       dump_solution_for_var (outfile, i);
6123     }
6124 }
6125
6126
6127 /* Debug points-to information to stderr.  */
6128
6129 DEBUG_FUNCTION void
6130 debug_sa_points_to_info (void)
6131 {
6132   dump_sa_points_to_info (stderr);
6133 }
6134
6135
6136 /* Initialize the always-existing constraint variables for NULL
6137    ANYTHING, READONLY, and INTEGER */
6138
6139 static void
6140 init_base_vars (void)
6141 {
6142   struct constraint_expr lhs, rhs;
6143   varinfo_t var_anything;
6144   varinfo_t var_nothing;
6145   varinfo_t var_readonly;
6146   varinfo_t var_escaped;
6147   varinfo_t var_nonlocal;
6148   varinfo_t var_storedanything;
6149   varinfo_t var_integer;
6150
6151   /* Create the NULL variable, used to represent that a variable points
6152      to NULL.  */
6153   var_nothing = new_var_info (NULL_TREE, "NULL");
6154   gcc_assert (var_nothing->id == nothing_id);
6155   var_nothing->is_artificial_var = 1;
6156   var_nothing->offset = 0;
6157   var_nothing->size = ~0;
6158   var_nothing->fullsize = ~0;
6159   var_nothing->is_special_var = 1;
6160   var_nothing->may_have_pointers = 0;
6161   var_nothing->is_global_var = 0;
6162
6163   /* Create the ANYTHING variable, used to represent that a variable
6164      points to some unknown piece of memory.  */
6165   var_anything = new_var_info (NULL_TREE, "ANYTHING");
6166   gcc_assert (var_anything->id == anything_id);
6167   var_anything->is_artificial_var = 1;
6168   var_anything->size = ~0;
6169   var_anything->offset = 0;
6170   var_anything->next = NULL;
6171   var_anything->fullsize = ~0;
6172   var_anything->is_special_var = 1;
6173
6174   /* Anything points to anything.  This makes deref constraints just
6175      work in the presence of linked list and other p = *p type loops,
6176      by saying that *ANYTHING = ANYTHING. */
6177   lhs.type = SCALAR;
6178   lhs.var = anything_id;
6179   lhs.offset = 0;
6180   rhs.type = ADDRESSOF;
6181   rhs.var = anything_id;
6182   rhs.offset = 0;
6183
6184   /* This specifically does not use process_constraint because
6185      process_constraint ignores all anything = anything constraints, since all
6186      but this one are redundant.  */
6187   VEC_safe_push (constraint_t, heap, constraints, new_constraint (lhs, rhs));
6188
6189   /* Create the READONLY variable, used to represent that a variable
6190      points to readonly memory.  */
6191   var_readonly = new_var_info (NULL_TREE, "READONLY");
6192   gcc_assert (var_readonly->id == readonly_id);
6193   var_readonly->is_artificial_var = 1;
6194   var_readonly->offset = 0;
6195   var_readonly->size = ~0;
6196   var_readonly->fullsize = ~0;
6197   var_readonly->next = NULL;
6198   var_readonly->is_special_var = 1;
6199
6200   /* readonly memory points to anything, in order to make deref
6201      easier.  In reality, it points to anything the particular
6202      readonly variable can point to, but we don't track this
6203      separately. */
6204   lhs.type = SCALAR;
6205   lhs.var = readonly_id;
6206   lhs.offset = 0;
6207   rhs.type = ADDRESSOF;
6208   rhs.var = readonly_id;  /* FIXME */
6209   rhs.offset = 0;
6210   process_constraint (new_constraint (lhs, rhs));
6211
6212   /* Create the ESCAPED variable, used to represent the set of escaped
6213      memory.  */
6214   var_escaped = new_var_info (NULL_TREE, "ESCAPED");
6215   gcc_assert (var_escaped->id == escaped_id);
6216   var_escaped->is_artificial_var = 1;
6217   var_escaped->offset = 0;
6218   var_escaped->size = ~0;
6219   var_escaped->fullsize = ~0;
6220   var_escaped->is_special_var = 0;
6221
6222   /* Create the NONLOCAL variable, used to represent the set of nonlocal
6223      memory.  */
6224   var_nonlocal = new_var_info (NULL_TREE, "NONLOCAL");
6225   gcc_assert (var_nonlocal->id == nonlocal_id);
6226   var_nonlocal->is_artificial_var = 1;
6227   var_nonlocal->offset = 0;
6228   var_nonlocal->size = ~0;
6229   var_nonlocal->fullsize = ~0;
6230   var_nonlocal->is_special_var = 1;
6231
6232   /* ESCAPED = *ESCAPED, because escaped is may-deref'd at calls, etc.  */
6233   lhs.type = SCALAR;
6234   lhs.var = escaped_id;
6235   lhs.offset = 0;
6236   rhs.type = DEREF;
6237   rhs.var = escaped_id;
6238   rhs.offset = 0;
6239   process_constraint (new_constraint (lhs, rhs));
6240
6241   /* ESCAPED = ESCAPED + UNKNOWN_OFFSET, because if a sub-field escapes the
6242      whole variable escapes.  */
6243   lhs.type = SCALAR;
6244   lhs.var = escaped_id;
6245   lhs.offset = 0;
6246   rhs.type = SCALAR;
6247   rhs.var = escaped_id;
6248   rhs.offset = UNKNOWN_OFFSET;
6249   process_constraint (new_constraint (lhs, rhs));
6250
6251   /* *ESCAPED = NONLOCAL.  This is true because we have to assume
6252      everything pointed to by escaped points to what global memory can
6253      point to.  */
6254   lhs.type = DEREF;
6255   lhs.var = escaped_id;
6256   lhs.offset = 0;
6257   rhs.type = SCALAR;
6258   rhs.var = nonlocal_id;
6259   rhs.offset = 0;
6260   process_constraint (new_constraint (lhs, rhs));
6261
6262   /* NONLOCAL = &NONLOCAL, NONLOCAL = &ESCAPED.  This is true because
6263      global memory may point to global memory and escaped memory.  */
6264   lhs.type = SCALAR;
6265   lhs.var = nonlocal_id;
6266   lhs.offset = 0;
6267   rhs.type = ADDRESSOF;
6268   rhs.var = nonlocal_id;
6269   rhs.offset = 0;
6270   process_constraint (new_constraint (lhs, rhs));
6271   rhs.type = ADDRESSOF;
6272   rhs.var = escaped_id;
6273   rhs.offset = 0;
6274   process_constraint (new_constraint (lhs, rhs));
6275
6276   /* Create the STOREDANYTHING variable, used to represent the set of
6277      variables stored to *ANYTHING.  */
6278   var_storedanything = new_var_info (NULL_TREE, "STOREDANYTHING");
6279   gcc_assert (var_storedanything->id == storedanything_id);
6280   var_storedanything->is_artificial_var = 1;
6281   var_storedanything->offset = 0;
6282   var_storedanything->size = ~0;
6283   var_storedanything->fullsize = ~0;
6284   var_storedanything->is_special_var = 0;
6285
6286   /* Create the INTEGER variable, used to represent that a variable points
6287      to what an INTEGER "points to".  */
6288   var_integer = new_var_info (NULL_TREE, "INTEGER");
6289   gcc_assert (var_integer->id == integer_id);
6290   var_integer->is_artificial_var = 1;
6291   var_integer->size = ~0;
6292   var_integer->fullsize = ~0;
6293   var_integer->offset = 0;
6294   var_integer->next = NULL;
6295   var_integer->is_special_var = 1;
6296
6297   /* INTEGER = ANYTHING, because we don't know where a dereference of
6298      a random integer will point to.  */
6299   lhs.type = SCALAR;
6300   lhs.var = integer_id;
6301   lhs.offset = 0;
6302   rhs.type = ADDRESSOF;
6303   rhs.var = anything_id;
6304   rhs.offset = 0;
6305   process_constraint (new_constraint (lhs, rhs));
6306 }
6307
6308 /* Initialize things necessary to perform PTA */
6309
6310 static void
6311 init_alias_vars (void)
6312 {
6313   use_field_sensitive = (MAX_FIELDS_FOR_FIELD_SENSITIVE > 1);
6314
6315   bitmap_obstack_initialize (&pta_obstack);
6316   bitmap_obstack_initialize (&oldpta_obstack);
6317   bitmap_obstack_initialize (&predbitmap_obstack);
6318
6319   constraint_pool = create_alloc_pool ("Constraint pool",
6320                                        sizeof (struct constraint), 30);
6321   variable_info_pool = create_alloc_pool ("Variable info pool",
6322                                           sizeof (struct variable_info), 30);
6323   constraints = VEC_alloc (constraint_t, heap, 8);
6324   varmap = VEC_alloc (varinfo_t, heap, 8);
6325   vi_for_tree = pointer_map_create ();
6326   call_stmt_vars = pointer_map_create ();
6327
6328   memset (&stats, 0, sizeof (stats));
6329   shared_bitmap_table = htab_create (511, shared_bitmap_hash,
6330                                      shared_bitmap_eq, free);
6331   init_base_vars ();
6332 }
6333
6334 /* Remove the REF and ADDRESS edges from GRAPH, as well as all the
6335    predecessor edges.  */
6336
6337 static void
6338 remove_preds_and_fake_succs (constraint_graph_t graph)
6339 {
6340   unsigned int i;
6341
6342   /* Clear the implicit ref and address nodes from the successor
6343      lists.  */
6344   for (i = 0; i < FIRST_REF_NODE; i++)
6345     {
6346       if (graph->succs[i])
6347         bitmap_clear_range (graph->succs[i], FIRST_REF_NODE,
6348                             FIRST_REF_NODE * 2);
6349     }
6350
6351   /* Free the successor list for the non-ref nodes.  */
6352   for (i = FIRST_REF_NODE; i < graph->size; i++)
6353     {
6354       if (graph->succs[i])
6355         BITMAP_FREE (graph->succs[i]);
6356     }
6357
6358   /* Now reallocate the size of the successor list as, and blow away
6359      the predecessor bitmaps.  */
6360   graph->size = VEC_length (varinfo_t, varmap);
6361   graph->succs = XRESIZEVEC (bitmap, graph->succs, graph->size);
6362
6363   free (graph->implicit_preds);
6364   graph->implicit_preds = NULL;
6365   free (graph->preds);
6366   graph->preds = NULL;
6367   bitmap_obstack_release (&predbitmap_obstack);
6368 }
6369
6370 /* Initialize the heapvar for statement mapping.  */
6371
6372 static void
6373 init_alias_heapvars (void)
6374 {
6375   if (!heapvar_for_stmt)
6376     heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, heapvar_map_eq,
6377                                         NULL);
6378 }
6379
6380 /* Delete the heapvar for statement mapping.  */
6381
6382 void
6383 delete_alias_heapvars (void)
6384 {
6385   if (heapvar_for_stmt)
6386     htab_delete (heapvar_for_stmt);
6387   heapvar_for_stmt = NULL;
6388 }
6389
6390 /* Solve the constraint set.  */
6391
6392 static void
6393 solve_constraints (void)
6394 {
6395   struct scc_info *si;
6396
6397   if (dump_file)
6398     fprintf (dump_file,
6399              "\nCollapsing static cycles and doing variable "
6400              "substitution\n");
6401
6402   init_graph (VEC_length (varinfo_t, varmap) * 2);
6403
6404   if (dump_file)
6405     fprintf (dump_file, "Building predecessor graph\n");
6406   build_pred_graph ();
6407
6408   if (dump_file)
6409     fprintf (dump_file, "Detecting pointer and location "
6410              "equivalences\n");
6411   si = perform_var_substitution (graph);
6412
6413   if (dump_file)
6414     fprintf (dump_file, "Rewriting constraints and unifying "
6415              "variables\n");
6416   rewrite_constraints (graph, si);
6417
6418   build_succ_graph ();
6419   free_var_substitution_info (si);
6420
6421   if (dump_file && (dump_flags & TDF_GRAPH))
6422     dump_constraint_graph (dump_file);
6423
6424   move_complex_constraints (graph);
6425
6426   if (dump_file)
6427     fprintf (dump_file, "Uniting pointer but not location equivalent "
6428              "variables\n");
6429   unite_pointer_equivalences (graph);
6430
6431   if (dump_file)
6432     fprintf (dump_file, "Finding indirect cycles\n");
6433   find_indirect_cycles (graph);
6434
6435   /* Implicit nodes and predecessors are no longer necessary at this
6436      point. */
6437   remove_preds_and_fake_succs (graph);
6438
6439   if (dump_file)
6440     fprintf (dump_file, "Solving graph\n");
6441
6442   solve_graph (graph);
6443
6444   if (dump_file)
6445     dump_sa_points_to_info (dump_file);
6446 }
6447
6448 /* Create points-to sets for the current function.  See the comments
6449    at the start of the file for an algorithmic overview.  */
6450
6451 static void
6452 compute_points_to_sets (void)
6453 {
6454   basic_block bb;
6455   unsigned i;
6456   varinfo_t vi;
6457
6458   timevar_push (TV_TREE_PTA);
6459
6460   init_alias_vars ();
6461   init_alias_heapvars ();
6462
6463   intra_create_variable_infos ();
6464
6465   /* Now walk all statements and build the constraint set.  */
6466   FOR_EACH_BB (bb)
6467     {
6468       gimple_stmt_iterator gsi;
6469
6470       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6471         {
6472           gimple phi = gsi_stmt (gsi);
6473
6474           if (is_gimple_reg (gimple_phi_result (phi)))
6475             find_func_aliases (phi);
6476         }
6477
6478       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6479         {
6480           gimple stmt = gsi_stmt (gsi);
6481
6482           find_func_aliases (stmt);
6483         }
6484     }
6485
6486   if (dump_file)
6487     {
6488       fprintf (dump_file, "Points-to analysis\n\nConstraints:\n\n");
6489       dump_constraints (dump_file, 0);
6490     }
6491
6492   /* From the constraints compute the points-to sets.  */
6493   solve_constraints ();
6494
6495   /* Compute the points-to set for ESCAPED used for call-clobber analysis.  */
6496   find_what_var_points_to (get_varinfo (escaped_id),
6497                            &cfun->gimple_df->escaped);
6498
6499   /* Make sure the ESCAPED solution (which is used as placeholder in
6500      other solutions) does not reference itself.  This simplifies
6501      points-to solution queries.  */
6502   cfun->gimple_df->escaped.escaped = 0;
6503
6504   /* Mark escaped HEAP variables as global.  */
6505   FOR_EACH_VEC_ELT (varinfo_t, varmap, i, vi)
6506     if (vi->is_heap_var
6507         && !vi->is_restrict_var
6508         && !vi->is_global_var)
6509       DECL_EXTERNAL (vi->decl) = vi->is_global_var
6510         = pt_solution_includes (&cfun->gimple_df->escaped, vi->decl);
6511
6512   /* Compute the points-to sets for pointer SSA_NAMEs.  */
6513   for (i = 0; i < num_ssa_names; ++i)
6514     {
6515       tree ptr = ssa_name (i);
6516       if (ptr
6517           && POINTER_TYPE_P (TREE_TYPE (ptr)))
6518         find_what_p_points_to (ptr);
6519     }
6520
6521   /* Compute the call-used/clobbered sets.  */
6522   FOR_EACH_BB (bb)
6523     {
6524       gimple_stmt_iterator gsi;
6525
6526       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6527         {
6528           gimple stmt = gsi_stmt (gsi);
6529           struct pt_solution *pt;
6530           if (!is_gimple_call (stmt))
6531             continue;
6532
6533           pt = gimple_call_use_set (stmt);
6534           if (gimple_call_flags (stmt) & ECF_CONST)
6535             memset (pt, 0, sizeof (struct pt_solution));
6536           else if ((vi = lookup_call_use_vi (stmt)) != NULL)
6537             {
6538               find_what_var_points_to (vi, pt);
6539               /* Escaped (and thus nonlocal) variables are always
6540                  implicitly used by calls.  */
6541               /* ???  ESCAPED can be empty even though NONLOCAL
6542                  always escaped.  */
6543               pt->nonlocal = 1;
6544               pt->escaped = 1;
6545             }
6546           else
6547             {
6548               /* If there is nothing special about this call then
6549                  we have made everything that is used also escape.  */
6550               *pt = cfun->gimple_df->escaped;
6551               pt->nonlocal = 1;
6552             }
6553
6554           pt = gimple_call_clobber_set (stmt);
6555           if (gimple_call_flags (stmt) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
6556             memset (pt, 0, sizeof (struct pt_solution));
6557           else if ((vi = lookup_call_clobber_vi (stmt)) != NULL)
6558             {
6559               find_what_var_points_to (vi, pt);
6560               /* Escaped (and thus nonlocal) variables are always
6561                  implicitly clobbered by calls.  */
6562               /* ???  ESCAPED can be empty even though NONLOCAL
6563                  always escaped.  */
6564               pt->nonlocal = 1;
6565               pt->escaped = 1;
6566             }
6567           else
6568             {
6569               /* If there is nothing special about this call then
6570                  we have made everything that is used also escape.  */
6571               *pt = cfun->gimple_df->escaped;
6572               pt->nonlocal = 1;
6573             }
6574         }
6575     }
6576
6577   timevar_pop (TV_TREE_PTA);
6578 }
6579
6580
6581 /* Delete created points-to sets.  */
6582
6583 static void
6584 delete_points_to_sets (void)
6585 {
6586   unsigned int i;
6587
6588   htab_delete (shared_bitmap_table);
6589   if (dump_file && (dump_flags & TDF_STATS))
6590     fprintf (dump_file, "Points to sets created:%d\n",
6591              stats.points_to_sets_created);
6592
6593   pointer_map_destroy (vi_for_tree);
6594   pointer_map_destroy (call_stmt_vars);
6595   bitmap_obstack_release (&pta_obstack);
6596   VEC_free (constraint_t, heap, constraints);
6597
6598   for (i = 0; i < graph->size; i++)
6599     VEC_free (constraint_t, heap, graph->complex[i]);
6600   free (graph->complex);
6601
6602   free (graph->rep);
6603   free (graph->succs);
6604   free (graph->pe);
6605   free (graph->pe_rep);
6606   free (graph->indirect_cycles);
6607   free (graph);
6608
6609   VEC_free (varinfo_t, heap, varmap);
6610   free_alloc_pool (variable_info_pool);
6611   free_alloc_pool (constraint_pool);
6612 }
6613
6614
6615 /* Compute points-to information for every SSA_NAME pointer in the
6616    current function and compute the transitive closure of escaped
6617    variables to re-initialize the call-clobber states of local variables.  */
6618
6619 unsigned int
6620 compute_may_aliases (void)
6621 {
6622   if (cfun->gimple_df->ipa_pta)
6623     {
6624       if (dump_file)
6625         {
6626           fprintf (dump_file, "\nNot re-computing points-to information "
6627                    "because IPA points-to information is available.\n\n");
6628
6629           /* But still dump what we have remaining it.  */
6630           dump_alias_info (dump_file);
6631
6632           if (dump_flags & TDF_DETAILS)
6633             dump_referenced_vars (dump_file);
6634         }
6635
6636       return 0;
6637     }
6638
6639   /* For each pointer P_i, determine the sets of variables that P_i may
6640      point-to.  Compute the reachability set of escaped and call-used
6641      variables.  */
6642   compute_points_to_sets ();
6643
6644   /* Debugging dumps.  */
6645   if (dump_file)
6646     {
6647       dump_alias_info (dump_file);
6648
6649       if (dump_flags & TDF_DETAILS)
6650         dump_referenced_vars (dump_file);
6651     }
6652
6653   /* Deallocate memory used by aliasing data structures and the internal
6654      points-to solution.  */
6655   delete_points_to_sets ();
6656
6657   gcc_assert (!need_ssa_update_p (cfun));
6658
6659   return 0;
6660 }
6661
6662 static bool
6663 gate_tree_pta (void)
6664 {
6665   return flag_tree_pta;
6666 }
6667
6668 /* A dummy pass to cause points-to information to be computed via
6669    TODO_rebuild_alias.  */
6670
6671 struct gimple_opt_pass pass_build_alias =
6672 {
6673  {
6674   GIMPLE_PASS,
6675   "alias",                  /* name */
6676   gate_tree_pta,            /* gate */
6677   NULL,                     /* execute */
6678   NULL,                     /* sub */
6679   NULL,                     /* next */
6680   0,                        /* static_pass_number */
6681   TV_NONE,                  /* tv_id */
6682   PROP_cfg | PROP_ssa,      /* properties_required */
6683   0,                        /* properties_provided */
6684   0,                        /* properties_destroyed */
6685   0,                        /* todo_flags_start */
6686   TODO_rebuild_alias | TODO_dump_func  /* todo_flags_finish */
6687  }
6688 };
6689
6690 /* A dummy pass to cause points-to information to be computed via
6691    TODO_rebuild_alias.  */
6692
6693 struct gimple_opt_pass pass_build_ealias =
6694 {
6695  {
6696   GIMPLE_PASS,
6697   "ealias",                 /* name */
6698   gate_tree_pta,            /* gate */
6699   NULL,                     /* execute */
6700   NULL,                     /* sub */
6701   NULL,                     /* next */
6702   0,                        /* static_pass_number */
6703   TV_NONE,                  /* tv_id */
6704   PROP_cfg | PROP_ssa,      /* properties_required */
6705   0,                        /* properties_provided */
6706   0,                        /* properties_destroyed */
6707   0,                        /* todo_flags_start */
6708   TODO_rebuild_alias | TODO_dump_func  /* todo_flags_finish */
6709  }
6710 };
6711
6712
6713 /* Return true if we should execute IPA PTA.  */
6714 static bool
6715 gate_ipa_pta (void)
6716 {
6717   return (optimize
6718           && flag_ipa_pta
6719           /* Don't bother doing anything if the program has errors.  */
6720           && !seen_error ());
6721 }
6722
6723 /* IPA PTA solutions for ESCAPED.  */
6724 struct pt_solution ipa_escaped_pt
6725   = { true, false, false, false, false, false, false, NULL };
6726
6727 /* Execute the driver for IPA PTA.  */
6728 static unsigned int
6729 ipa_pta_execute (void)
6730 {
6731   struct cgraph_node *node;
6732   struct varpool_node *var;
6733   int from;
6734
6735   in_ipa_mode = 1;
6736
6737   init_alias_heapvars ();
6738   init_alias_vars ();
6739
6740   /* Build the constraints.  */
6741   for (node = cgraph_nodes; node; node = node->next)
6742     {
6743       struct cgraph_node *alias;
6744       varinfo_t vi;
6745
6746       /* Nodes without a body are not interesting.  Especially do not
6747          visit clones at this point for now - we get duplicate decls
6748          there for inline clones at least.  */
6749       if (!gimple_has_body_p (node->decl)
6750           || node->clone_of)
6751         continue;
6752
6753       vi = create_function_info_for (node->decl,
6754                                      alias_get_name (node->decl));
6755
6756       /* Associate the varinfo node with all aliases.  */
6757       for (alias = node->same_body; alias; alias = alias->next)
6758         insert_vi_for_tree (alias->decl, vi);
6759     }
6760
6761   /* Create constraints for global variables and their initializers.  */
6762   for (var = varpool_nodes; var; var = var->next)
6763     {
6764       struct varpool_node *alias;
6765       varinfo_t vi;
6766
6767       vi = get_vi_for_tree (var->decl);
6768
6769       /* Associate the varinfo node with all aliases.  */
6770       for (alias = var->extra_name; alias; alias = alias->next)
6771         insert_vi_for_tree (alias->decl, vi);
6772     }
6773
6774   if (dump_file)
6775     {
6776       fprintf (dump_file,
6777                "Generating constraints for global initializers\n\n");
6778       dump_constraints (dump_file, 0);
6779       fprintf (dump_file, "\n");
6780     }
6781   from = VEC_length (constraint_t, constraints);
6782
6783   for (node = cgraph_nodes; node; node = node->next)
6784     {
6785       struct function *func;
6786       basic_block bb;
6787       tree old_func_decl;
6788
6789       /* Nodes without a body are not interesting.  */
6790       if (!gimple_has_body_p (node->decl)
6791           || node->clone_of)
6792         continue;
6793
6794       if (dump_file)
6795         {
6796           fprintf (dump_file,
6797                    "Generating constraints for %s", cgraph_node_name (node));
6798           if (DECL_ASSEMBLER_NAME_SET_P (node->decl))
6799             fprintf (dump_file, " (%s)",
6800                      IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl)));
6801           fprintf (dump_file, "\n");
6802         }
6803
6804       func = DECL_STRUCT_FUNCTION (node->decl);
6805       old_func_decl = current_function_decl;
6806       push_cfun (func);
6807       current_function_decl = node->decl;
6808
6809       /* For externally visible functions use local constraints for
6810          their arguments.  For local functions we see all callers
6811          and thus do not need initial constraints for parameters.  */
6812       if (node->local.externally_visible)
6813         intra_create_variable_infos ();
6814
6815       /* Build constriants for the function body.  */
6816       FOR_EACH_BB_FN (bb, func)
6817         {
6818           gimple_stmt_iterator gsi;
6819
6820           for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
6821                gsi_next (&gsi))
6822             {
6823               gimple phi = gsi_stmt (gsi);
6824
6825               if (is_gimple_reg (gimple_phi_result (phi)))
6826                 find_func_aliases (phi);
6827             }
6828
6829           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6830             {
6831               gimple stmt = gsi_stmt (gsi);
6832
6833               find_func_aliases (stmt);
6834               find_func_clobbers (stmt);
6835             }
6836         }
6837
6838       current_function_decl = old_func_decl;
6839       pop_cfun ();
6840
6841       if (dump_file)
6842         {
6843           fprintf (dump_file, "\n");
6844           dump_constraints (dump_file, from);
6845           fprintf (dump_file, "\n");
6846         }
6847       from = VEC_length (constraint_t, constraints);
6848     }
6849
6850   /* From the constraints compute the points-to sets.  */
6851   solve_constraints ();
6852
6853   /* Compute the global points-to sets for ESCAPED.
6854      ???  Note that the computed escape set is not correct
6855      for the whole unit as we fail to consider graph edges to
6856      externally visible functions.  */
6857   find_what_var_points_to (get_varinfo (escaped_id), &ipa_escaped_pt);
6858
6859   /* Make sure the ESCAPED solution (which is used as placeholder in
6860      other solutions) does not reference itself.  This simplifies
6861      points-to solution queries.  */
6862   ipa_escaped_pt.ipa_escaped = 0;
6863
6864   /* Assign the points-to sets to the SSA names in the unit.  */
6865   for (node = cgraph_nodes; node; node = node->next)
6866     {
6867       tree ptr;
6868       struct function *fn;
6869       unsigned i;
6870       varinfo_t fi;
6871       basic_block bb;
6872       struct pt_solution uses, clobbers;
6873       struct cgraph_edge *e;
6874
6875       /* Nodes without a body are not interesting.  */
6876       if (!gimple_has_body_p (node->decl)
6877           || node->clone_of)
6878         continue;
6879
6880       fn = DECL_STRUCT_FUNCTION (node->decl);
6881
6882       /* Compute the points-to sets for pointer SSA_NAMEs.  */
6883       FOR_EACH_VEC_ELT (tree, fn->gimple_df->ssa_names, i, ptr)
6884         {
6885           if (ptr
6886               && POINTER_TYPE_P (TREE_TYPE (ptr)))
6887             find_what_p_points_to (ptr);
6888         }
6889
6890       /* Compute the call-use and call-clobber sets for all direct calls.  */
6891       fi = lookup_vi_for_tree (node->decl);
6892       gcc_assert (fi->is_fn_info);
6893       find_what_var_points_to (first_vi_for_offset (fi, fi_clobbers),
6894                                &clobbers);
6895       find_what_var_points_to (first_vi_for_offset (fi, fi_uses), &uses);
6896       for (e = node->callers; e; e = e->next_caller)
6897         {
6898           if (!e->call_stmt)
6899             continue;
6900
6901           *gimple_call_clobber_set (e->call_stmt) = clobbers;
6902           *gimple_call_use_set (e->call_stmt) = uses;
6903         }
6904
6905       /* Compute the call-use and call-clobber sets for indirect calls
6906          and calls to external functions.  */
6907       FOR_EACH_BB_FN (bb, fn)
6908         {
6909           gimple_stmt_iterator gsi;
6910
6911           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6912             {
6913               gimple stmt = gsi_stmt (gsi);
6914               struct pt_solution *pt;
6915               varinfo_t vi;
6916               tree decl;
6917
6918               if (!is_gimple_call (stmt))
6919                 continue;
6920
6921               /* Handle direct calls to external functions.  */
6922               decl = gimple_call_fndecl (stmt);
6923               if (decl
6924                   && (!(fi = lookup_vi_for_tree (decl))
6925                       || !fi->is_fn_info))
6926                 {
6927                   pt = gimple_call_use_set (stmt);
6928                   if (gimple_call_flags (stmt) & ECF_CONST)
6929                     memset (pt, 0, sizeof (struct pt_solution));
6930                   else if ((vi = lookup_call_use_vi (stmt)) != NULL)
6931                     {
6932                       find_what_var_points_to (vi, pt);
6933                       /* Escaped (and thus nonlocal) variables are always
6934                          implicitly used by calls.  */
6935                       /* ???  ESCAPED can be empty even though NONLOCAL
6936                          always escaped.  */
6937                       pt->nonlocal = 1;
6938                       pt->ipa_escaped = 1;
6939                     }
6940                   else
6941                     {
6942                       /* If there is nothing special about this call then
6943                          we have made everything that is used also escape.  */
6944                       *pt = ipa_escaped_pt;
6945                       pt->nonlocal = 1;
6946                     }
6947
6948                   pt = gimple_call_clobber_set (stmt);
6949                   if (gimple_call_flags (stmt) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
6950                     memset (pt, 0, sizeof (struct pt_solution));
6951                   else if ((vi = lookup_call_clobber_vi (stmt)) != NULL)
6952                     {
6953                       find_what_var_points_to (vi, pt);
6954                       /* Escaped (and thus nonlocal) variables are always
6955                          implicitly clobbered by calls.  */
6956                       /* ???  ESCAPED can be empty even though NONLOCAL
6957                          always escaped.  */
6958                       pt->nonlocal = 1;
6959                       pt->ipa_escaped = 1;
6960                     }
6961                   else
6962                     {
6963                       /* If there is nothing special about this call then
6964                          we have made everything that is used also escape.  */
6965                       *pt = ipa_escaped_pt;
6966                       pt->nonlocal = 1;
6967                     }
6968                 }
6969
6970               /* Handle indirect calls.  */
6971               if (!decl
6972                   && (fi = get_fi_for_callee (stmt)))
6973                 {
6974                   /* We need to accumulate all clobbers/uses of all possible
6975                      callees.  */
6976                   fi = get_varinfo (find (fi->id));
6977                   /* If we cannot constrain the set of functions we'll end up
6978                      calling we end up using/clobbering everything.  */
6979                   if (bitmap_bit_p (fi->solution, anything_id)
6980                       || bitmap_bit_p (fi->solution, nonlocal_id)
6981                       || bitmap_bit_p (fi->solution, escaped_id))
6982                     {
6983                       pt_solution_reset (gimple_call_clobber_set (stmt));
6984                       pt_solution_reset (gimple_call_use_set (stmt));
6985                     }
6986                   else
6987                     {
6988                       bitmap_iterator bi;
6989                       unsigned i;
6990                       struct pt_solution *uses, *clobbers;
6991
6992                       uses = gimple_call_use_set (stmt);
6993                       clobbers = gimple_call_clobber_set (stmt);
6994                       memset (uses, 0, sizeof (struct pt_solution));
6995                       memset (clobbers, 0, sizeof (struct pt_solution));
6996                       EXECUTE_IF_SET_IN_BITMAP (fi->solution, 0, i, bi)
6997                         {
6998                           struct pt_solution sol;
6999
7000                           vi = get_varinfo (i);
7001                           if (!vi->is_fn_info)
7002                             {
7003                               /* ???  We could be more precise here?  */
7004                               uses->nonlocal = 1;
7005                               uses->ipa_escaped = 1;
7006                               clobbers->nonlocal = 1;
7007                               clobbers->ipa_escaped = 1;
7008                               continue;
7009                             }
7010
7011                           if (!uses->anything)
7012                             {
7013                               find_what_var_points_to
7014                                   (first_vi_for_offset (vi, fi_uses), &sol);
7015                               pt_solution_ior_into (uses, &sol);
7016                             }
7017                           if (!clobbers->anything)
7018                             {
7019                               find_what_var_points_to
7020                                   (first_vi_for_offset (vi, fi_clobbers), &sol);
7021                               pt_solution_ior_into (clobbers, &sol);
7022                             }
7023                         }
7024                     }
7025                 }
7026             }
7027         }
7028
7029       fn->gimple_df->ipa_pta = true;
7030     }
7031
7032   delete_points_to_sets ();
7033
7034   in_ipa_mode = 0;
7035
7036   return 0;
7037 }
7038
7039 struct simple_ipa_opt_pass pass_ipa_pta =
7040 {
7041  {
7042   SIMPLE_IPA_PASS,
7043   "pta",                                /* name */
7044   gate_ipa_pta,                 /* gate */
7045   ipa_pta_execute,                      /* execute */
7046   NULL,                                 /* sub */
7047   NULL,                                 /* next */
7048   0,                                    /* static_pass_number */
7049   TV_IPA_PTA,                   /* tv_id */
7050   0,                                    /* properties_required */
7051   0,                                    /* properties_provided */
7052   0,                                    /* properties_destroyed */
7053   0,                                    /* todo_flags_start */
7054   TODO_update_ssa                       /* todo_flags_finish */
7055  }
7056 };
7057
7058
7059 #include "gt-tree-ssa-structalias.h"