OSDN Git Service

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