OSDN Git Service

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