OSDN Git Service

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