OSDN Git Service

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