OSDN Git Service

2011-10-06 Thomas Quinot <quinot@adacore.com>
[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       case BUILT_IN_STRDUP:
4134       case BUILT_IN_STRNDUP:
4135         if (gimple_call_lhs (t))
4136           {
4137             handle_lhs_call (t, gimple_call_lhs (t), gimple_call_flags (t),
4138                              NULL, fndecl);
4139             get_constraint_for_ptr_offset (gimple_call_lhs (t),
4140                                            NULL_TREE, &lhsc);
4141             get_constraint_for_ptr_offset (gimple_call_arg (t, 0),
4142                                            NULL_TREE, &rhsc);
4143             do_deref (&lhsc);
4144             do_deref (&rhsc);
4145             process_all_all_constraints (lhsc, rhsc);
4146             VEC_free (ce_s, heap, lhsc);
4147             VEC_free (ce_s, heap, rhsc);
4148             return true;
4149           }
4150         break;
4151       /* Trampolines are special - they set up passing the static
4152          frame.  */
4153       case BUILT_IN_INIT_TRAMPOLINE:
4154         {
4155           tree tramp = gimple_call_arg (t, 0);
4156           tree nfunc = gimple_call_arg (t, 1);
4157           tree frame = gimple_call_arg (t, 2);
4158           unsigned i;
4159           struct constraint_expr lhs, *rhsp;
4160           if (in_ipa_mode)
4161             {
4162               varinfo_t nfi = NULL;
4163               gcc_assert (TREE_CODE (nfunc) == ADDR_EXPR);
4164               nfi = lookup_vi_for_tree (TREE_OPERAND (nfunc, 0));
4165               if (nfi)
4166                 {
4167                   lhs = get_function_part_constraint (nfi, fi_static_chain);
4168                   get_constraint_for (frame, &rhsc);
4169                   FOR_EACH_VEC_ELT (ce_s, rhsc, i, rhsp)
4170                       process_constraint (new_constraint (lhs, *rhsp));
4171                   VEC_free (ce_s, heap, rhsc);
4172
4173                   /* Make the frame point to the function for
4174                      the trampoline adjustment call.  */
4175                   get_constraint_for (tramp, &lhsc);
4176                   do_deref (&lhsc);
4177                   get_constraint_for (nfunc, &rhsc);
4178                   process_all_all_constraints (lhsc, rhsc);
4179                   VEC_free (ce_s, heap, rhsc);
4180                   VEC_free (ce_s, heap, lhsc);
4181
4182                   return true;
4183                 }
4184             }
4185           /* Else fallthru to generic handling which will let
4186              the frame escape.  */
4187           break;
4188         }
4189       case BUILT_IN_ADJUST_TRAMPOLINE:
4190         {
4191           tree tramp = gimple_call_arg (t, 0);
4192           tree res = gimple_call_lhs (t);
4193           if (in_ipa_mode && res)
4194             {
4195               get_constraint_for (res, &lhsc);
4196               get_constraint_for (tramp, &rhsc);
4197               do_deref (&rhsc);
4198               process_all_all_constraints (lhsc, rhsc);
4199               VEC_free (ce_s, heap, rhsc);
4200               VEC_free (ce_s, heap, lhsc);
4201             }
4202           return true;
4203         }
4204       /* Variadic argument handling needs to be handled in IPA
4205          mode as well.  */
4206       case BUILT_IN_VA_START:
4207         {
4208           tree valist = gimple_call_arg (t, 0);
4209           struct constraint_expr rhs, *lhsp;
4210           unsigned i;
4211           get_constraint_for (valist, &lhsc);
4212           do_deref (&lhsc);
4213           /* The va_list gets access to pointers in variadic
4214              arguments.  Which we know in the case of IPA analysis
4215              and otherwise are just all nonlocal variables.  */
4216           if (in_ipa_mode)
4217             {
4218               fi = lookup_vi_for_tree (cfun->decl);
4219               rhs = get_function_part_constraint (fi, ~0);
4220               rhs.type = ADDRESSOF;
4221             }
4222           else
4223             {
4224               rhs.var = nonlocal_id;
4225               rhs.type = ADDRESSOF;
4226               rhs.offset = 0;
4227             }
4228           FOR_EACH_VEC_ELT (ce_s, lhsc, i, lhsp)
4229             process_constraint (new_constraint (*lhsp, rhs));
4230           VEC_free (ce_s, heap, lhsc);
4231           /* va_list is clobbered.  */
4232           make_constraint_to (get_call_clobber_vi (t)->id, valist);
4233           return true;
4234         }
4235       /* va_end doesn't have any effect that matters.  */
4236       case BUILT_IN_VA_END:
4237         return true;
4238       /* Alternate return.  Simply give up for now.  */
4239       case BUILT_IN_RETURN:
4240         {
4241           fi = NULL;
4242           if (!in_ipa_mode
4243               || !(fi = get_vi_for_tree (cfun->decl)))
4244             make_constraint_from (get_varinfo (escaped_id), anything_id);
4245           else if (in_ipa_mode
4246                    && fi != NULL)
4247             {
4248               struct constraint_expr lhs, rhs;
4249               lhs = get_function_part_constraint (fi, fi_result);
4250               rhs.var = anything_id;
4251               rhs.offset = 0;
4252               rhs.type = SCALAR;
4253               process_constraint (new_constraint (lhs, rhs));
4254             }
4255           return true;
4256         }
4257       /* printf-style functions may have hooks to set pointers to
4258          point to somewhere into the generated string.  Leave them
4259          for a later excercise...  */
4260       default:
4261         /* Fallthru to general call handling.  */;
4262       }
4263
4264   return false;
4265 }
4266
4267 /* Create constraints for the call T.  */
4268
4269 static void
4270 find_func_aliases_for_call (gimple t)
4271 {
4272   tree fndecl = gimple_call_fndecl (t);
4273   VEC(ce_s, heap) *lhsc = NULL;
4274   VEC(ce_s, heap) *rhsc = NULL;
4275   varinfo_t fi;
4276
4277   if (fndecl != NULL_TREE
4278       && DECL_BUILT_IN (fndecl)
4279       && find_func_aliases_for_builtin_call (t))
4280     return;
4281
4282   fi = get_fi_for_callee (t);
4283   if (!in_ipa_mode
4284       || (fndecl && !fi->is_fn_info))
4285     {
4286       VEC(ce_s, heap) *rhsc = NULL;
4287       int flags = gimple_call_flags (t);
4288
4289       /* Const functions can return their arguments and addresses
4290          of global memory but not of escaped memory.  */
4291       if (flags & (ECF_CONST|ECF_NOVOPS))
4292         {
4293           if (gimple_call_lhs (t))
4294             handle_const_call (t, &rhsc);
4295         }
4296       /* Pure functions can return addresses in and of memory
4297          reachable from their arguments, but they are not an escape
4298          point for reachable memory of their arguments.  */
4299       else if (flags & (ECF_PURE|ECF_LOOPING_CONST_OR_PURE))
4300         handle_pure_call (t, &rhsc);
4301       else
4302         handle_rhs_call (t, &rhsc);
4303       if (gimple_call_lhs (t))
4304         handle_lhs_call (t, gimple_call_lhs (t), flags, rhsc, fndecl);
4305       VEC_free (ce_s, heap, rhsc);
4306     }
4307   else
4308     {
4309       tree lhsop;
4310       unsigned j;
4311
4312       /* Assign all the passed arguments to the appropriate incoming
4313          parameters of the function.  */
4314       for (j = 0; j < gimple_call_num_args (t); j++)
4315         {
4316           struct constraint_expr lhs ;
4317           struct constraint_expr *rhsp;
4318           tree arg = gimple_call_arg (t, j);
4319
4320           get_constraint_for_rhs (arg, &rhsc);
4321           lhs = get_function_part_constraint (fi, fi_parm_base + j);
4322           while (VEC_length (ce_s, rhsc) != 0)
4323             {
4324               rhsp = VEC_last (ce_s, rhsc);
4325               process_constraint (new_constraint (lhs, *rhsp));
4326               VEC_pop (ce_s, rhsc);
4327             }
4328         }
4329
4330       /* If we are returning a value, assign it to the result.  */
4331       lhsop = gimple_call_lhs (t);
4332       if (lhsop)
4333         {
4334           struct constraint_expr rhs;
4335           struct constraint_expr *lhsp;
4336
4337           get_constraint_for (lhsop, &lhsc);
4338           rhs = get_function_part_constraint (fi, fi_result);
4339           if (fndecl
4340               && DECL_RESULT (fndecl)
4341               && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
4342             {
4343               VEC(ce_s, heap) *tem = NULL;
4344               VEC_safe_push (ce_s, heap, tem, &rhs);
4345               do_deref (&tem);
4346               rhs = *VEC_index (ce_s, tem, 0);
4347               VEC_free(ce_s, heap, tem);
4348             }
4349           FOR_EACH_VEC_ELT (ce_s, lhsc, j, lhsp)
4350             process_constraint (new_constraint (*lhsp, rhs));
4351         }
4352
4353       /* If we pass the result decl by reference, honor that.  */
4354       if (lhsop
4355           && fndecl
4356           && DECL_RESULT (fndecl)
4357           && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
4358         {
4359           struct constraint_expr lhs;
4360           struct constraint_expr *rhsp;
4361
4362           get_constraint_for_address_of (lhsop, &rhsc);
4363           lhs = get_function_part_constraint (fi, fi_result);
4364           FOR_EACH_VEC_ELT (ce_s, rhsc, j, rhsp)
4365             process_constraint (new_constraint (lhs, *rhsp));
4366           VEC_free (ce_s, heap, rhsc);
4367         }
4368
4369       /* If we use a static chain, pass it along.  */
4370       if (gimple_call_chain (t))
4371         {
4372           struct constraint_expr lhs;
4373           struct constraint_expr *rhsp;
4374
4375           get_constraint_for (gimple_call_chain (t), &rhsc);
4376           lhs = get_function_part_constraint (fi, fi_static_chain);
4377           FOR_EACH_VEC_ELT (ce_s, rhsc, j, rhsp)
4378             process_constraint (new_constraint (lhs, *rhsp));
4379         }
4380     }
4381 }
4382
4383 /* Walk statement T setting up aliasing constraints according to the
4384    references found in T.  This function is the main part of the
4385    constraint builder.  AI points to auxiliary alias information used
4386    when building alias sets and computing alias grouping heuristics.  */
4387
4388 static void
4389 find_func_aliases (gimple origt)
4390 {
4391   gimple t = origt;
4392   VEC(ce_s, heap) *lhsc = NULL;
4393   VEC(ce_s, heap) *rhsc = NULL;
4394   struct constraint_expr *c;
4395   varinfo_t fi;
4396
4397   /* Now build constraints expressions.  */
4398   if (gimple_code (t) == GIMPLE_PHI)
4399     {
4400       size_t i;
4401       unsigned int j;
4402
4403       /* For a phi node, assign all the arguments to
4404          the result.  */
4405       get_constraint_for (gimple_phi_result (t), &lhsc);
4406       for (i = 0; i < gimple_phi_num_args (t); i++)
4407         {
4408           tree strippedrhs = PHI_ARG_DEF (t, i);
4409
4410           STRIP_NOPS (strippedrhs);
4411           get_constraint_for_rhs (gimple_phi_arg_def (t, i), &rhsc);
4412
4413           FOR_EACH_VEC_ELT (ce_s, lhsc, j, c)
4414             {
4415               struct constraint_expr *c2;
4416               while (VEC_length (ce_s, rhsc) > 0)
4417                 {
4418                   c2 = VEC_last (ce_s, rhsc);
4419                   process_constraint (new_constraint (*c, *c2));
4420                   VEC_pop (ce_s, rhsc);
4421                 }
4422             }
4423         }
4424     }
4425   /* In IPA mode, we need to generate constraints to pass call
4426      arguments through their calls.   There are two cases,
4427      either a GIMPLE_CALL returning a value, or just a plain
4428      GIMPLE_CALL when we are not.
4429
4430      In non-ipa mode, we need to generate constraints for each
4431      pointer passed by address.  */
4432   else if (is_gimple_call (t))
4433     find_func_aliases_for_call (t);
4434     
4435   /* Otherwise, just a regular assignment statement.  Only care about
4436      operations with pointer result, others are dealt with as escape
4437      points if they have pointer operands.  */
4438   else if (is_gimple_assign (t))
4439     {
4440       /* Otherwise, just a regular assignment statement.  */
4441       tree lhsop = gimple_assign_lhs (t);
4442       tree rhsop = (gimple_num_ops (t) == 2) ? gimple_assign_rhs1 (t) : NULL;
4443
4444       if (rhsop && AGGREGATE_TYPE_P (TREE_TYPE (lhsop)))
4445         do_structure_copy (lhsop, rhsop);
4446       else
4447         {
4448           enum tree_code code = gimple_assign_rhs_code (t);
4449
4450           get_constraint_for (lhsop, &lhsc);
4451
4452           if (code == POINTER_PLUS_EXPR)
4453             get_constraint_for_ptr_offset (gimple_assign_rhs1 (t),
4454                                            gimple_assign_rhs2 (t), &rhsc);
4455           else if (code == BIT_AND_EXPR
4456                    && TREE_CODE (gimple_assign_rhs2 (t)) == INTEGER_CST)
4457             {
4458               /* Aligning a pointer via a BIT_AND_EXPR is offsetting
4459                  the pointer.  Handle it by offsetting it by UNKNOWN.  */
4460               get_constraint_for_ptr_offset (gimple_assign_rhs1 (t),
4461                                              NULL_TREE, &rhsc);
4462             }
4463           else if ((CONVERT_EXPR_CODE_P (code)
4464                     && !(POINTER_TYPE_P (gimple_expr_type (t))
4465                          && !POINTER_TYPE_P (TREE_TYPE (rhsop))))
4466                    || gimple_assign_single_p (t))
4467             get_constraint_for_rhs (rhsop, &rhsc);
4468           else if (truth_value_p (code))
4469             /* Truth value results are not pointer (parts).  Or at least
4470                very very unreasonable obfuscation of a part.  */
4471             ;
4472           else
4473             {
4474               /* All other operations are merges.  */
4475               VEC (ce_s, heap) *tmp = NULL;
4476               struct constraint_expr *rhsp;
4477               unsigned i, j;
4478               get_constraint_for_rhs (gimple_assign_rhs1 (t), &rhsc);
4479               for (i = 2; i < gimple_num_ops (t); ++i)
4480                 {
4481                   get_constraint_for_rhs (gimple_op (t, i), &tmp);
4482                   FOR_EACH_VEC_ELT (ce_s, tmp, j, rhsp)
4483                     VEC_safe_push (ce_s, heap, rhsc, rhsp);
4484                   VEC_truncate (ce_s, tmp, 0);
4485                 }
4486               VEC_free (ce_s, heap, tmp);
4487             }
4488           process_all_all_constraints (lhsc, rhsc);
4489         }
4490       /* If there is a store to a global variable the rhs escapes.  */
4491       if ((lhsop = get_base_address (lhsop)) != NULL_TREE
4492           && DECL_P (lhsop)
4493           && is_global_var (lhsop)
4494           && (!in_ipa_mode
4495               || DECL_EXTERNAL (lhsop) || TREE_PUBLIC (lhsop)))
4496         make_escape_constraint (rhsop);
4497     }
4498   /* Handle escapes through return.  */
4499   else if (gimple_code (t) == GIMPLE_RETURN
4500            && gimple_return_retval (t) != NULL_TREE)
4501     {
4502       fi = NULL;
4503       if (!in_ipa_mode
4504           || !(fi = get_vi_for_tree (cfun->decl)))
4505         make_escape_constraint (gimple_return_retval (t));
4506       else if (in_ipa_mode
4507                && fi != NULL)
4508         {
4509           struct constraint_expr lhs ;
4510           struct constraint_expr *rhsp;
4511           unsigned i;
4512
4513           lhs = get_function_part_constraint (fi, fi_result);
4514           get_constraint_for_rhs (gimple_return_retval (t), &rhsc);
4515           FOR_EACH_VEC_ELT (ce_s, rhsc, i, rhsp)
4516             process_constraint (new_constraint (lhs, *rhsp));
4517         }
4518     }
4519   /* Handle asms conservatively by adding escape constraints to everything.  */
4520   else if (gimple_code (t) == GIMPLE_ASM)
4521     {
4522       unsigned i, noutputs;
4523       const char **oconstraints;
4524       const char *constraint;
4525       bool allows_mem, allows_reg, is_inout;
4526
4527       noutputs = gimple_asm_noutputs (t);
4528       oconstraints = XALLOCAVEC (const char *, noutputs);
4529
4530       for (i = 0; i < noutputs; ++i)
4531         {
4532           tree link = gimple_asm_output_op (t, i);
4533           tree op = TREE_VALUE (link);
4534
4535           constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4536           oconstraints[i] = constraint;
4537           parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
4538                                    &allows_reg, &is_inout);
4539
4540           /* A memory constraint makes the address of the operand escape.  */
4541           if (!allows_reg && allows_mem)
4542             make_escape_constraint (build_fold_addr_expr (op));
4543
4544           /* The asm may read global memory, so outputs may point to
4545              any global memory.  */
4546           if (op)
4547             {
4548               VEC(ce_s, heap) *lhsc = NULL;
4549               struct constraint_expr rhsc, *lhsp;
4550               unsigned j;
4551               get_constraint_for (op, &lhsc);
4552               rhsc.var = nonlocal_id;
4553               rhsc.offset = 0;
4554               rhsc.type = SCALAR;
4555               FOR_EACH_VEC_ELT (ce_s, lhsc, j, lhsp)
4556                 process_constraint (new_constraint (*lhsp, rhsc));
4557               VEC_free (ce_s, heap, lhsc);
4558             }
4559         }
4560       for (i = 0; i < gimple_asm_ninputs (t); ++i)
4561         {
4562           tree link = gimple_asm_input_op (t, i);
4563           tree op = TREE_VALUE (link);
4564
4565           constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
4566
4567           parse_input_constraint (&constraint, 0, 0, noutputs, 0, oconstraints,
4568                                   &allows_mem, &allows_reg);
4569
4570           /* A memory constraint makes the address of the operand escape.  */
4571           if (!allows_reg && allows_mem)
4572             make_escape_constraint (build_fold_addr_expr (op));
4573           /* Strictly we'd only need the constraint to ESCAPED if
4574              the asm clobbers memory, otherwise using something
4575              along the lines of per-call clobbers/uses would be enough.  */
4576           else if (op)
4577             make_escape_constraint (op);
4578         }
4579     }
4580
4581   VEC_free (ce_s, heap, rhsc);
4582   VEC_free (ce_s, heap, lhsc);
4583 }
4584
4585
4586 /* Create a constraint adding to the clobber set of FI the memory
4587    pointed to by PTR.  */
4588
4589 static void
4590 process_ipa_clobber (varinfo_t fi, tree ptr)
4591 {
4592   VEC(ce_s, heap) *ptrc = NULL;
4593   struct constraint_expr *c, lhs;
4594   unsigned i;
4595   get_constraint_for_rhs (ptr, &ptrc);
4596   lhs = get_function_part_constraint (fi, fi_clobbers);
4597   FOR_EACH_VEC_ELT (ce_s, ptrc, i, c)
4598     process_constraint (new_constraint (lhs, *c));
4599   VEC_free (ce_s, heap, ptrc);
4600 }
4601
4602 /* Walk statement T setting up clobber and use constraints according to the
4603    references found in T.  This function is a main part of the
4604    IPA constraint builder.  */
4605
4606 static void
4607 find_func_clobbers (gimple origt)
4608 {
4609   gimple t = origt;
4610   VEC(ce_s, heap) *lhsc = NULL;
4611   VEC(ce_s, heap) *rhsc = NULL;
4612   varinfo_t fi;
4613
4614   /* Add constraints for clobbered/used in IPA mode.
4615      We are not interested in what automatic variables are clobbered
4616      or used as we only use the information in the caller to which
4617      they do not escape.  */
4618   gcc_assert (in_ipa_mode);
4619
4620   /* If the stmt refers to memory in any way it better had a VUSE.  */
4621   if (gimple_vuse (t) == NULL_TREE)
4622     return;
4623
4624   /* We'd better have function information for the current function.  */
4625   fi = lookup_vi_for_tree (cfun->decl);
4626   gcc_assert (fi != NULL);
4627
4628   /* Account for stores in assignments and calls.  */
4629   if (gimple_vdef (t) != NULL_TREE
4630       && gimple_has_lhs (t))
4631     {
4632       tree lhs = gimple_get_lhs (t);
4633       tree tem = lhs;
4634       while (handled_component_p (tem))
4635         tem = TREE_OPERAND (tem, 0);
4636       if ((DECL_P (tem)
4637            && !auto_var_in_fn_p (tem, cfun->decl))
4638           || INDIRECT_REF_P (tem)
4639           || (TREE_CODE (tem) == MEM_REF
4640               && !(TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR
4641                    && auto_var_in_fn_p
4642                         (TREE_OPERAND (TREE_OPERAND (tem, 0), 0), cfun->decl))))
4643         {
4644           struct constraint_expr lhsc, *rhsp;
4645           unsigned i;
4646           lhsc = get_function_part_constraint (fi, fi_clobbers);
4647           get_constraint_for_address_of (lhs, &rhsc);
4648           FOR_EACH_VEC_ELT (ce_s, rhsc, i, rhsp)
4649             process_constraint (new_constraint (lhsc, *rhsp));
4650           VEC_free (ce_s, heap, rhsc);
4651         }
4652     }
4653
4654   /* Account for uses in assigments and returns.  */
4655   if (gimple_assign_single_p (t)
4656       || (gimple_code (t) == GIMPLE_RETURN
4657           && gimple_return_retval (t) != NULL_TREE))
4658     {
4659       tree rhs = (gimple_assign_single_p (t)
4660                   ? gimple_assign_rhs1 (t) : gimple_return_retval (t));
4661       tree tem = rhs;
4662       while (handled_component_p (tem))
4663         tem = TREE_OPERAND (tem, 0);
4664       if ((DECL_P (tem)
4665            && !auto_var_in_fn_p (tem, cfun->decl))
4666           || INDIRECT_REF_P (tem)
4667           || (TREE_CODE (tem) == MEM_REF
4668               && !(TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR
4669                    && auto_var_in_fn_p
4670                         (TREE_OPERAND (TREE_OPERAND (tem, 0), 0), cfun->decl))))
4671         {
4672           struct constraint_expr lhs, *rhsp;
4673           unsigned i;
4674           lhs = get_function_part_constraint (fi, fi_uses);
4675           get_constraint_for_address_of (rhs, &rhsc);
4676           FOR_EACH_VEC_ELT (ce_s, rhsc, i, rhsp)
4677             process_constraint (new_constraint (lhs, *rhsp));
4678           VEC_free (ce_s, heap, rhsc);
4679         }
4680     }
4681
4682   if (is_gimple_call (t))
4683     {
4684       varinfo_t cfi = NULL;
4685       tree decl = gimple_call_fndecl (t);
4686       struct constraint_expr lhs, rhs;
4687       unsigned i, j;
4688
4689       /* For builtins we do not have separate function info.  For those
4690          we do not generate escapes for we have to generate clobbers/uses.  */
4691       if (decl
4692           && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
4693         switch (DECL_FUNCTION_CODE (decl))
4694           {
4695           /* The following functions use and clobber memory pointed to
4696              by their arguments.  */
4697           case BUILT_IN_STRCPY:
4698           case BUILT_IN_STRNCPY:
4699           case BUILT_IN_BCOPY:
4700           case BUILT_IN_MEMCPY:
4701           case BUILT_IN_MEMMOVE:
4702           case BUILT_IN_MEMPCPY:
4703           case BUILT_IN_STPCPY:
4704           case BUILT_IN_STPNCPY:
4705           case BUILT_IN_STRCAT:
4706           case BUILT_IN_STRNCAT:
4707           case BUILT_IN_STRCPY_CHK:
4708           case BUILT_IN_STRNCPY_CHK:
4709           case BUILT_IN_MEMCPY_CHK:
4710           case BUILT_IN_MEMMOVE_CHK:
4711           case BUILT_IN_MEMPCPY_CHK:
4712           case BUILT_IN_STPCPY_CHK:
4713           case BUILT_IN_STRCAT_CHK:
4714           case BUILT_IN_STRNCAT_CHK:
4715             {
4716               tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (decl)
4717                                                == BUILT_IN_BCOPY ? 1 : 0));
4718               tree src = gimple_call_arg (t, (DECL_FUNCTION_CODE (decl)
4719                                               == BUILT_IN_BCOPY ? 0 : 1));
4720               unsigned i;
4721               struct constraint_expr *rhsp, *lhsp;
4722               get_constraint_for_ptr_offset (dest, NULL_TREE, &lhsc);
4723               lhs = get_function_part_constraint (fi, fi_clobbers);
4724               FOR_EACH_VEC_ELT (ce_s, lhsc, i, lhsp)
4725                 process_constraint (new_constraint (lhs, *lhsp));
4726               VEC_free (ce_s, heap, lhsc);
4727               get_constraint_for_ptr_offset (src, NULL_TREE, &rhsc);
4728               lhs = get_function_part_constraint (fi, fi_uses);
4729               FOR_EACH_VEC_ELT (ce_s, rhsc, i, rhsp)
4730                 process_constraint (new_constraint (lhs, *rhsp));
4731               VEC_free (ce_s, heap, rhsc);
4732               return;
4733             }
4734           /* The following function clobbers memory pointed to by
4735              its argument.  */
4736           case BUILT_IN_MEMSET:
4737           case BUILT_IN_MEMSET_CHK:
4738             {
4739               tree dest = gimple_call_arg (t, 0);
4740               unsigned i;
4741               ce_s *lhsp;
4742               get_constraint_for_ptr_offset (dest, NULL_TREE, &lhsc);
4743               lhs = get_function_part_constraint (fi, fi_clobbers);
4744               FOR_EACH_VEC_ELT (ce_s, lhsc, i, lhsp)
4745                 process_constraint (new_constraint (lhs, *lhsp));
4746               VEC_free (ce_s, heap, lhsc);
4747               return;
4748             }
4749           /* The following functions clobber their second and third
4750              arguments.  */
4751           case BUILT_IN_SINCOS:
4752           case BUILT_IN_SINCOSF:
4753           case BUILT_IN_SINCOSL:
4754             {
4755               process_ipa_clobber (fi, gimple_call_arg (t, 1));
4756               process_ipa_clobber (fi, gimple_call_arg (t, 2));
4757               return;
4758             }
4759           /* The following functions clobber their second argument.  */
4760           case BUILT_IN_FREXP:
4761           case BUILT_IN_FREXPF:
4762           case BUILT_IN_FREXPL:
4763           case BUILT_IN_LGAMMA_R:
4764           case BUILT_IN_LGAMMAF_R:
4765           case BUILT_IN_LGAMMAL_R:
4766           case BUILT_IN_GAMMA_R:
4767           case BUILT_IN_GAMMAF_R:
4768           case BUILT_IN_GAMMAL_R:
4769           case BUILT_IN_MODF:
4770           case BUILT_IN_MODFF:
4771           case BUILT_IN_MODFL:
4772             {
4773               process_ipa_clobber (fi, gimple_call_arg (t, 1));
4774               return;
4775             }
4776           /* The following functions clobber their third argument.  */
4777           case BUILT_IN_REMQUO:
4778           case BUILT_IN_REMQUOF:
4779           case BUILT_IN_REMQUOL:
4780             {
4781               process_ipa_clobber (fi, gimple_call_arg (t, 2));
4782               return;
4783             }
4784           /* The following functions neither read nor clobber memory.  */
4785           case BUILT_IN_ASSUME_ALIGNED:
4786           case BUILT_IN_FREE:
4787             return;
4788           /* Trampolines are of no interest to us.  */
4789           case BUILT_IN_INIT_TRAMPOLINE:
4790           case BUILT_IN_ADJUST_TRAMPOLINE:
4791             return;
4792           case BUILT_IN_VA_START:
4793           case BUILT_IN_VA_END:
4794             return;
4795           /* printf-style functions may have hooks to set pointers to
4796              point to somewhere into the generated string.  Leave them
4797              for a later excercise...  */
4798           default:
4799             /* Fallthru to general call handling.  */;
4800           }
4801
4802       /* Parameters passed by value are used.  */
4803       lhs = get_function_part_constraint (fi, fi_uses);
4804       for (i = 0; i < gimple_call_num_args (t); i++)
4805         {
4806           struct constraint_expr *rhsp;
4807           tree arg = gimple_call_arg (t, i);
4808
4809           if (TREE_CODE (arg) == SSA_NAME
4810               || is_gimple_min_invariant (arg))
4811             continue;
4812
4813           get_constraint_for_address_of (arg, &rhsc);
4814           FOR_EACH_VEC_ELT (ce_s, rhsc, j, rhsp)
4815             process_constraint (new_constraint (lhs, *rhsp));
4816           VEC_free (ce_s, heap, rhsc);
4817         }
4818
4819       /* Build constraints for propagating clobbers/uses along the
4820          callgraph edges.  */
4821       cfi = get_fi_for_callee (t);
4822       if (cfi->id == anything_id)
4823         {
4824           if (gimple_vdef (t))
4825             make_constraint_from (first_vi_for_offset (fi, fi_clobbers),
4826                                   anything_id);
4827           make_constraint_from (first_vi_for_offset (fi, fi_uses),
4828                                 anything_id);
4829           return;
4830         }
4831
4832       /* For callees without function info (that's external functions),
4833          ESCAPED is clobbered and used.  */
4834       if (gimple_call_fndecl (t)
4835           && !cfi->is_fn_info)
4836         {
4837           varinfo_t vi;
4838
4839           if (gimple_vdef (t))
4840             make_copy_constraint (first_vi_for_offset (fi, fi_clobbers),
4841                                   escaped_id);
4842           make_copy_constraint (first_vi_for_offset (fi, fi_uses), escaped_id);
4843
4844           /* Also honor the call statement use/clobber info.  */
4845           if ((vi = lookup_call_clobber_vi (t)) != NULL)
4846             make_copy_constraint (first_vi_for_offset (fi, fi_clobbers),
4847                                   vi->id);
4848           if ((vi = lookup_call_use_vi (t)) != NULL)
4849             make_copy_constraint (first_vi_for_offset (fi, fi_uses),
4850                                   vi->id);
4851           return;
4852         }
4853
4854       /* Otherwise the caller clobbers and uses what the callee does.
4855          ???  This should use a new complex constraint that filters
4856          local variables of the callee.  */
4857       if (gimple_vdef (t))
4858         {
4859           lhs = get_function_part_constraint (fi, fi_clobbers);
4860           rhs = get_function_part_constraint (cfi, fi_clobbers);
4861           process_constraint (new_constraint (lhs, rhs));
4862         }
4863       lhs = get_function_part_constraint (fi, fi_uses);
4864       rhs = get_function_part_constraint (cfi, fi_uses);
4865       process_constraint (new_constraint (lhs, rhs));
4866     }
4867   else if (gimple_code (t) == GIMPLE_ASM)
4868     {
4869       /* ???  Ick.  We can do better.  */
4870       if (gimple_vdef (t))
4871         make_constraint_from (first_vi_for_offset (fi, fi_clobbers),
4872                               anything_id);
4873       make_constraint_from (first_vi_for_offset (fi, fi_uses),
4874                             anything_id);
4875     }
4876
4877   VEC_free (ce_s, heap, rhsc);
4878 }
4879
4880
4881 /* Find the first varinfo in the same variable as START that overlaps with
4882    OFFSET.  Return NULL if we can't find one.  */
4883
4884 static varinfo_t
4885 first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset)
4886 {
4887   /* If the offset is outside of the variable, bail out.  */
4888   if (offset >= start->fullsize)
4889     return NULL;
4890
4891   /* If we cannot reach offset from start, lookup the first field
4892      and start from there.  */
4893   if (start->offset > offset)
4894     start = lookup_vi_for_tree (start->decl);
4895
4896   while (start)
4897     {
4898       /* We may not find a variable in the field list with the actual
4899          offset when when we have glommed a structure to a variable.
4900          In that case, however, offset should still be within the size
4901          of the variable. */
4902       if (offset >= start->offset
4903           && (offset - start->offset) < start->size)
4904         return start;
4905
4906       start= start->next;
4907     }
4908
4909   return NULL;
4910 }
4911
4912 /* Find the first varinfo in the same variable as START that overlaps with
4913    OFFSET.  If there is no such varinfo the varinfo directly preceding
4914    OFFSET is returned.  */
4915
4916 static varinfo_t
4917 first_or_preceding_vi_for_offset (varinfo_t start,
4918                                   unsigned HOST_WIDE_INT offset)
4919 {
4920   /* If we cannot reach offset from start, lookup the first field
4921      and start from there.  */
4922   if (start->offset > offset)
4923     start = lookup_vi_for_tree (start->decl);
4924
4925   /* We may not find a variable in the field list with the actual
4926      offset when when we have glommed a structure to a variable.
4927      In that case, however, offset should still be within the size
4928      of the variable.
4929      If we got beyond the offset we look for return the field
4930      directly preceding offset which may be the last field.  */
4931   while (start->next
4932          && offset >= start->offset
4933          && !((offset - start->offset) < start->size))
4934     start = start->next;
4935
4936   return start;
4937 }
4938
4939
4940 /* This structure is used during pushing fields onto the fieldstack
4941    to track the offset of the field, since bitpos_of_field gives it
4942    relative to its immediate containing type, and we want it relative
4943    to the ultimate containing object.  */
4944
4945 struct fieldoff
4946 {
4947   /* Offset from the base of the base containing object to this field.  */
4948   HOST_WIDE_INT offset;
4949
4950   /* Size, in bits, of the field.  */
4951   unsigned HOST_WIDE_INT size;
4952
4953   unsigned has_unknown_size : 1;
4954
4955   unsigned must_have_pointers : 1;
4956
4957   unsigned may_have_pointers : 1;
4958
4959   unsigned only_restrict_pointers : 1;
4960 };
4961 typedef struct fieldoff fieldoff_s;
4962
4963 DEF_VEC_O(fieldoff_s);
4964 DEF_VEC_ALLOC_O(fieldoff_s,heap);
4965
4966 /* qsort comparison function for two fieldoff's PA and PB */
4967
4968 static int
4969 fieldoff_compare (const void *pa, const void *pb)
4970 {
4971   const fieldoff_s *foa = (const fieldoff_s *)pa;
4972   const fieldoff_s *fob = (const fieldoff_s *)pb;
4973   unsigned HOST_WIDE_INT foasize, fobsize;
4974
4975   if (foa->offset < fob->offset)
4976     return -1;
4977   else if (foa->offset > fob->offset)
4978     return 1;
4979
4980   foasize = foa->size;
4981   fobsize = fob->size;
4982   if (foasize < fobsize)
4983     return -1;
4984   else if (foasize > fobsize)
4985     return 1;
4986   return 0;
4987 }
4988
4989 /* Sort a fieldstack according to the field offset and sizes.  */
4990 static void
4991 sort_fieldstack (VEC(fieldoff_s,heap) *fieldstack)
4992 {
4993   VEC_qsort (fieldoff_s, fieldstack, fieldoff_compare);
4994 }
4995
4996 /* Return true if V is a tree that we can have subvars for.
4997    Normally, this is any aggregate type.  Also complex
4998    types which are not gimple registers can have subvars.  */
4999
5000 static inline bool
5001 var_can_have_subvars (const_tree v)
5002 {
5003   /* Volatile variables should never have subvars.  */
5004   if (TREE_THIS_VOLATILE (v))
5005     return false;
5006
5007   /* Non decls or memory tags can never have subvars.  */
5008   if (!DECL_P (v))
5009     return false;
5010
5011   /* Aggregates without overlapping fields can have subvars.  */
5012   if (TREE_CODE (TREE_TYPE (v)) == RECORD_TYPE)
5013     return true;
5014
5015   return false;
5016 }
5017
5018 /* Return true if T is a type that does contain pointers.  */
5019
5020 static bool
5021 type_must_have_pointers (tree type)
5022 {
5023   if (POINTER_TYPE_P (type))
5024     return true;
5025
5026   if (TREE_CODE (type) == ARRAY_TYPE)
5027     return type_must_have_pointers (TREE_TYPE (type));
5028
5029   /* A function or method can have pointers as arguments, so track
5030      those separately.  */
5031   if (TREE_CODE (type) == FUNCTION_TYPE
5032       || TREE_CODE (type) == METHOD_TYPE)
5033     return true;
5034
5035   return false;
5036 }
5037
5038 static bool
5039 field_must_have_pointers (tree t)
5040 {
5041   return type_must_have_pointers (TREE_TYPE (t));
5042 }
5043
5044 /* Given a TYPE, and a vector of field offsets FIELDSTACK, push all
5045    the fields of TYPE onto fieldstack, recording their offsets along
5046    the way.
5047
5048    OFFSET is used to keep track of the offset in this entire
5049    structure, rather than just the immediately containing structure.
5050    Returns false if the caller is supposed to handle the field we
5051    recursed for.  */
5052
5053 static bool
5054 push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
5055                              HOST_WIDE_INT offset)
5056 {
5057   tree field;
5058   bool empty_p = true;
5059
5060   if (TREE_CODE (type) != RECORD_TYPE)
5061     return false;
5062
5063   /* If the vector of fields is growing too big, bail out early.
5064      Callers check for VEC_length <= MAX_FIELDS_FOR_FIELD_SENSITIVE, make
5065      sure this fails.  */
5066   if (VEC_length (fieldoff_s, *fieldstack) > MAX_FIELDS_FOR_FIELD_SENSITIVE)
5067     return false;
5068
5069   for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5070     if (TREE_CODE (field) == FIELD_DECL)
5071       {
5072         bool push = false;
5073         HOST_WIDE_INT foff = bitpos_of_field (field);
5074
5075         if (!var_can_have_subvars (field)
5076             || TREE_CODE (TREE_TYPE (field)) == QUAL_UNION_TYPE
5077             || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
5078           push = true;
5079         else if (!push_fields_onto_fieldstack
5080                     (TREE_TYPE (field), fieldstack, offset + foff)
5081                  && (DECL_SIZE (field)
5082                      && !integer_zerop (DECL_SIZE (field))))
5083           /* Empty structures may have actual size, like in C++.  So
5084              see if we didn't push any subfields and the size is
5085              nonzero, push the field onto the stack.  */
5086           push = true;
5087
5088         if (push)
5089           {
5090             fieldoff_s *pair = NULL;
5091             bool has_unknown_size = false;
5092             bool must_have_pointers_p;
5093
5094             if (!VEC_empty (fieldoff_s, *fieldstack))
5095               pair = VEC_last (fieldoff_s, *fieldstack);
5096
5097             /* If there isn't anything at offset zero, create sth.  */
5098             if (!pair
5099                 && offset + foff != 0)
5100               {
5101                 pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
5102                 pair->offset = 0;
5103                 pair->size = offset + foff;
5104                 pair->has_unknown_size = false;
5105                 pair->must_have_pointers = false;
5106                 pair->may_have_pointers = false;
5107                 pair->only_restrict_pointers = false;
5108               }
5109
5110             if (!DECL_SIZE (field)
5111                 || !host_integerp (DECL_SIZE (field), 1))
5112               has_unknown_size = true;
5113
5114             /* If adjacent fields do not contain pointers merge them.  */
5115             must_have_pointers_p = field_must_have_pointers (field);
5116             if (pair
5117                 && !has_unknown_size
5118                 && !must_have_pointers_p
5119                 && !pair->must_have_pointers
5120                 && !pair->has_unknown_size
5121                 && pair->offset + (HOST_WIDE_INT)pair->size == offset + foff)
5122               {
5123                 pair->size += TREE_INT_CST_LOW (DECL_SIZE (field));
5124               }
5125             else
5126               {
5127                 pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
5128                 pair->offset = offset + foff;
5129                 pair->has_unknown_size = has_unknown_size;
5130                 if (!has_unknown_size)
5131                   pair->size = TREE_INT_CST_LOW (DECL_SIZE (field));
5132                 else
5133                   pair->size = -1;
5134                 pair->must_have_pointers = must_have_pointers_p;
5135                 pair->may_have_pointers = true;
5136                 pair->only_restrict_pointers
5137                   = (!has_unknown_size
5138                      && POINTER_TYPE_P (TREE_TYPE (field))
5139                      && TYPE_RESTRICT (TREE_TYPE (field)));
5140               }
5141           }
5142
5143         empty_p = false;
5144       }
5145
5146   return !empty_p;
5147 }
5148
5149 /* Count the number of arguments DECL has, and set IS_VARARGS to true
5150    if it is a varargs function.  */
5151
5152 static unsigned int
5153 count_num_arguments (tree decl, bool *is_varargs)
5154 {
5155   unsigned int num = 0;
5156   tree t;
5157
5158   /* Capture named arguments for K&R functions.  They do not
5159      have a prototype and thus no TYPE_ARG_TYPES.  */
5160   for (t = DECL_ARGUMENTS (decl); t; t = DECL_CHAIN (t))
5161     ++num;
5162
5163   /* Check if the function has variadic arguments.  */
5164   for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); t; t = TREE_CHAIN (t))
5165     if (TREE_VALUE (t) == void_type_node)
5166       break;
5167   if (!t)
5168     *is_varargs = true;
5169
5170   return num;
5171 }
5172
5173 /* Creation function node for DECL, using NAME, and return the index
5174    of the variable we've created for the function.  */
5175
5176 static varinfo_t
5177 create_function_info_for (tree decl, const char *name)
5178 {
5179   struct function *fn = DECL_STRUCT_FUNCTION (decl);
5180   varinfo_t vi, prev_vi;
5181   tree arg;
5182   unsigned int i;
5183   bool is_varargs = false;
5184   unsigned int num_args = count_num_arguments (decl, &is_varargs);
5185
5186   /* Create the variable info.  */
5187
5188   vi = new_var_info (decl, name);
5189   vi->offset = 0;
5190   vi->size = 1;
5191   vi->fullsize = fi_parm_base + num_args;
5192   vi->is_fn_info = 1;
5193   vi->may_have_pointers = false;
5194   if (is_varargs)
5195     vi->fullsize = ~0;
5196   insert_vi_for_tree (vi->decl, vi);
5197
5198   prev_vi = vi;
5199
5200   /* Create a variable for things the function clobbers and one for
5201      things the function uses.  */
5202     {
5203       varinfo_t clobbervi, usevi;
5204       const char *newname;
5205       char *tempname;
5206
5207       asprintf (&tempname, "%s.clobber", name);
5208       newname = ggc_strdup (tempname);
5209       free (tempname);
5210
5211       clobbervi = new_var_info (NULL, newname);
5212       clobbervi->offset = fi_clobbers;
5213       clobbervi->size = 1;
5214       clobbervi->fullsize = vi->fullsize;
5215       clobbervi->is_full_var = true;
5216       clobbervi->is_global_var = false;
5217       gcc_assert (prev_vi->offset < clobbervi->offset);
5218       prev_vi->next = clobbervi;
5219       prev_vi = clobbervi;
5220
5221       asprintf (&tempname, "%s.use", name);
5222       newname = ggc_strdup (tempname);
5223       free (tempname);
5224
5225       usevi = new_var_info (NULL, newname);
5226       usevi->offset = fi_uses;
5227       usevi->size = 1;
5228       usevi->fullsize = vi->fullsize;
5229       usevi->is_full_var = true;
5230       usevi->is_global_var = false;
5231       gcc_assert (prev_vi->offset < usevi->offset);
5232       prev_vi->next = usevi;
5233       prev_vi = usevi;
5234     }
5235
5236   /* And one for the static chain.  */
5237   if (fn->static_chain_decl != NULL_TREE)
5238     {
5239       varinfo_t chainvi;
5240       const char *newname;
5241       char *tempname;
5242
5243       asprintf (&tempname, "%s.chain", name);
5244       newname = ggc_strdup (tempname);
5245       free (tempname);
5246
5247       chainvi = new_var_info (fn->static_chain_decl, newname);
5248       chainvi->offset = fi_static_chain;
5249       chainvi->size = 1;
5250       chainvi->fullsize = vi->fullsize;
5251       chainvi->is_full_var = true;
5252       chainvi->is_global_var = false;
5253       gcc_assert (prev_vi->offset < chainvi->offset);
5254       prev_vi->next = chainvi;
5255       prev_vi = chainvi;
5256       insert_vi_for_tree (fn->static_chain_decl, chainvi);
5257     }
5258
5259   /* Create a variable for the return var.  */
5260   if (DECL_RESULT (decl) != NULL
5261       || !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
5262     {
5263       varinfo_t resultvi;
5264       const char *newname;
5265       char *tempname;
5266       tree resultdecl = decl;
5267
5268       if (DECL_RESULT (decl))
5269         resultdecl = DECL_RESULT (decl);
5270
5271       asprintf (&tempname, "%s.result", name);
5272       newname = ggc_strdup (tempname);
5273       free (tempname);
5274
5275       resultvi = new_var_info (resultdecl, newname);
5276       resultvi->offset = fi_result;
5277       resultvi->size = 1;
5278       resultvi->fullsize = vi->fullsize;
5279       resultvi->is_full_var = true;
5280       if (DECL_RESULT (decl))
5281         resultvi->may_have_pointers = true;
5282       gcc_assert (prev_vi->offset < resultvi->offset);
5283       prev_vi->next = resultvi;
5284       prev_vi = resultvi;
5285       if (DECL_RESULT (decl))
5286         insert_vi_for_tree (DECL_RESULT (decl), resultvi);
5287     }
5288
5289   /* Set up variables for each argument.  */
5290   arg = DECL_ARGUMENTS (decl);
5291   for (i = 0; i < num_args; i++)
5292     {
5293       varinfo_t argvi;
5294       const char *newname;
5295       char *tempname;
5296       tree argdecl = decl;
5297
5298       if (arg)
5299         argdecl = arg;
5300
5301       asprintf (&tempname, "%s.arg%d", name, i);
5302       newname = ggc_strdup (tempname);
5303       free (tempname);
5304
5305       argvi = new_var_info (argdecl, newname);
5306       argvi->offset = fi_parm_base + i;
5307       argvi->size = 1;
5308       argvi->is_full_var = true;
5309       argvi->fullsize = vi->fullsize;
5310       if (arg)
5311         argvi->may_have_pointers = true;
5312       gcc_assert (prev_vi->offset < argvi->offset);
5313       prev_vi->next = argvi;
5314       prev_vi = argvi;
5315       if (arg)
5316         {
5317           insert_vi_for_tree (arg, argvi);
5318           arg = DECL_CHAIN (arg);
5319         }
5320     }
5321
5322   /* Add one representative for all further args.  */
5323   if (is_varargs)
5324     {
5325       varinfo_t argvi;
5326       const char *newname;
5327       char *tempname;
5328       tree decl;
5329
5330       asprintf (&tempname, "%s.varargs", name);
5331       newname = ggc_strdup (tempname);
5332       free (tempname);
5333
5334       /* We need sth that can be pointed to for va_start.  */
5335       decl = build_fake_var_decl (ptr_type_node);
5336
5337       argvi = new_var_info (decl, newname);
5338       argvi->offset = fi_parm_base + num_args;
5339       argvi->size = ~0;
5340       argvi->is_full_var = true;
5341       argvi->is_heap_var = true;
5342       argvi->fullsize = vi->fullsize;
5343       gcc_assert (prev_vi->offset < argvi->offset);
5344       prev_vi->next = argvi;
5345       prev_vi = argvi;
5346     }
5347
5348   return vi;
5349 }
5350
5351
5352 /* Return true if FIELDSTACK contains fields that overlap.
5353    FIELDSTACK is assumed to be sorted by offset.  */
5354
5355 static bool
5356 check_for_overlaps (VEC (fieldoff_s,heap) *fieldstack)
5357 {
5358   fieldoff_s *fo = NULL;
5359   unsigned int i;
5360   HOST_WIDE_INT lastoffset = -1;
5361
5362   FOR_EACH_VEC_ELT (fieldoff_s, fieldstack, i, fo)
5363     {
5364       if (fo->offset == lastoffset)
5365         return true;
5366       lastoffset = fo->offset;
5367     }
5368   return false;
5369 }
5370
5371 /* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
5372    This will also create any varinfo structures necessary for fields
5373    of DECL.  */
5374
5375 static varinfo_t
5376 create_variable_info_for_1 (tree decl, const char *name)
5377 {
5378   varinfo_t vi, newvi;
5379   tree decl_type = TREE_TYPE (decl);
5380   tree declsize = DECL_P (decl) ? DECL_SIZE (decl) : TYPE_SIZE (decl_type);
5381   VEC (fieldoff_s,heap) *fieldstack = NULL;
5382   fieldoff_s *fo;
5383   unsigned int i;
5384
5385   if (!declsize
5386       || !host_integerp (declsize, 1))
5387     {
5388       vi = new_var_info (decl, name);
5389       vi->offset = 0;
5390       vi->size = ~0;
5391       vi->fullsize = ~0;
5392       vi->is_unknown_size_var = true;
5393       vi->is_full_var = true;
5394       vi->may_have_pointers = true;
5395       return vi;
5396     }
5397
5398   /* Collect field information.  */
5399   if (use_field_sensitive
5400       && var_can_have_subvars (decl)
5401       /* ???  Force us to not use subfields for global initializers
5402          in IPA mode.  Else we'd have to parse arbitrary initializers.  */
5403       && !(in_ipa_mode
5404            && is_global_var (decl)
5405            && DECL_INITIAL (decl)))
5406     {
5407       fieldoff_s *fo = NULL;
5408       bool notokay = false;
5409       unsigned int i;
5410
5411       push_fields_onto_fieldstack (decl_type, &fieldstack, 0);
5412
5413       for (i = 0; !notokay && VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
5414         if (fo->has_unknown_size
5415             || fo->offset < 0)
5416           {
5417             notokay = true;
5418             break;
5419           }
5420
5421       /* We can't sort them if we have a field with a variable sized type,
5422          which will make notokay = true.  In that case, we are going to return
5423          without creating varinfos for the fields anyway, so sorting them is a
5424          waste to boot.  */
5425       if (!notokay)
5426         {
5427           sort_fieldstack (fieldstack);
5428           /* Due to some C++ FE issues, like PR 22488, we might end up
5429              what appear to be overlapping fields even though they,
5430              in reality, do not overlap.  Until the C++ FE is fixed,
5431              we will simply disable field-sensitivity for these cases.  */
5432           notokay = check_for_overlaps (fieldstack);
5433         }
5434
5435       if (notokay)
5436         VEC_free (fieldoff_s, heap, fieldstack);
5437     }
5438
5439   /* If we didn't end up collecting sub-variables create a full
5440      variable for the decl.  */
5441   if (VEC_length (fieldoff_s, fieldstack) <= 1
5442       || VEC_length (fieldoff_s, fieldstack) > MAX_FIELDS_FOR_FIELD_SENSITIVE)
5443     {
5444       vi = new_var_info (decl, name);
5445       vi->offset = 0;
5446       vi->may_have_pointers = true;
5447       vi->fullsize = TREE_INT_CST_LOW (declsize);
5448       vi->size = vi->fullsize;
5449       vi->is_full_var = true;
5450       VEC_free (fieldoff_s, heap, fieldstack);
5451       return vi;
5452     }
5453
5454   vi = new_var_info (decl, name);
5455   vi->fullsize = TREE_INT_CST_LOW (declsize);
5456   for (i = 0, newvi = vi;
5457        VEC_iterate (fieldoff_s, fieldstack, i, fo);
5458        ++i, newvi = newvi->next)
5459     {
5460       const char *newname = "NULL";
5461       char *tempname;
5462
5463       if (dump_file)
5464         {
5465           asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC
5466                     "+" HOST_WIDE_INT_PRINT_DEC, name, fo->offset, fo->size);
5467           newname = ggc_strdup (tempname);
5468           free (tempname);
5469         }
5470       newvi->name = newname;
5471       newvi->offset = fo->offset;
5472       newvi->size = fo->size;
5473       newvi->fullsize = vi->fullsize;
5474       newvi->may_have_pointers = fo->may_have_pointers;
5475       newvi->only_restrict_pointers = fo->only_restrict_pointers;
5476       if (i + 1 < VEC_length (fieldoff_s, fieldstack))
5477         newvi->next = new_var_info (decl, name);
5478     }
5479
5480   VEC_free (fieldoff_s, heap, fieldstack);
5481
5482   return vi;
5483 }
5484
5485 static unsigned int
5486 create_variable_info_for (tree decl, const char *name)
5487 {
5488   varinfo_t vi = create_variable_info_for_1 (decl, name);
5489   unsigned int id = vi->id;
5490
5491   insert_vi_for_tree (decl, vi);
5492
5493   if (TREE_CODE (decl) != VAR_DECL)
5494     return id;
5495
5496   /* Create initial constraints for globals.  */
5497   for (; vi; vi = vi->next)
5498     {
5499       if (!vi->may_have_pointers
5500           || !vi->is_global_var)
5501         continue;
5502
5503       /* Mark global restrict qualified pointers.  */
5504       if ((POINTER_TYPE_P (TREE_TYPE (decl))
5505            && TYPE_RESTRICT (TREE_TYPE (decl)))
5506           || vi->only_restrict_pointers)
5507         make_constraint_from_restrict (vi, "GLOBAL_RESTRICT");
5508
5509       /* In non-IPA mode the initializer from nonlocal is all we need.  */
5510       if (!in_ipa_mode
5511           || DECL_HARD_REGISTER (decl))
5512         make_copy_constraint (vi, nonlocal_id);
5513
5514       else
5515         {
5516           struct varpool_node *vnode = varpool_get_node (decl);
5517
5518           /* For escaped variables initialize them from nonlocal.  */
5519           if (!varpool_all_refs_explicit_p (vnode))
5520             make_copy_constraint (vi, nonlocal_id);
5521
5522           /* If this is a global variable with an initializer and we are in
5523              IPA mode generate constraints for it.  */
5524           if (DECL_INITIAL (decl))
5525             {
5526               VEC (ce_s, heap) *rhsc = NULL;
5527               struct constraint_expr lhs, *rhsp;
5528               unsigned i;
5529               get_constraint_for_rhs (DECL_INITIAL (decl), &rhsc);
5530               lhs.var = vi->id;
5531               lhs.offset = 0;
5532               lhs.type = SCALAR;
5533               FOR_EACH_VEC_ELT (ce_s, rhsc, i, rhsp)
5534                 process_constraint (new_constraint (lhs, *rhsp));
5535               /* If this is a variable that escapes from the unit
5536                  the initializer escapes as well.  */
5537               if (!varpool_all_refs_explicit_p (vnode))
5538                 {
5539                   lhs.var = escaped_id;
5540                   lhs.offset = 0;
5541                   lhs.type = SCALAR;
5542                   FOR_EACH_VEC_ELT (ce_s, rhsc, i, rhsp)
5543                     process_constraint (new_constraint (lhs, *rhsp));
5544                 }
5545               VEC_free (ce_s, heap, rhsc);
5546             }
5547         }
5548     }
5549
5550   return id;
5551 }
5552
5553 /* Print out the points-to solution for VAR to FILE.  */
5554
5555 static void
5556 dump_solution_for_var (FILE *file, unsigned int var)
5557 {
5558   varinfo_t vi = get_varinfo (var);
5559   unsigned int i;
5560   bitmap_iterator bi;
5561
5562   /* Dump the solution for unified vars anyway, this avoids difficulties
5563      in scanning dumps in the testsuite.  */
5564   fprintf (file, "%s = { ", vi->name);
5565   vi = get_varinfo (find (var));
5566   EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
5567     fprintf (file, "%s ", get_varinfo (i)->name);
5568   fprintf (file, "}");
5569
5570   /* But note when the variable was unified.  */
5571   if (vi->id != var)
5572     fprintf (file, " same as %s", vi->name);
5573
5574   fprintf (file, "\n");
5575 }
5576
5577 /* Print the points-to solution for VAR to stdout.  */
5578
5579 DEBUG_FUNCTION void
5580 debug_solution_for_var (unsigned int var)
5581 {
5582   dump_solution_for_var (stdout, var);
5583 }
5584
5585 /* Create varinfo structures for all of the variables in the
5586    function for intraprocedural mode.  */
5587
5588 static void
5589 intra_create_variable_infos (void)
5590 {
5591   tree t;
5592
5593   /* For each incoming pointer argument arg, create the constraint ARG
5594      = NONLOCAL or a dummy variable if it is a restrict qualified
5595      passed-by-reference argument.  */
5596   for (t = DECL_ARGUMENTS (current_function_decl); t; t = DECL_CHAIN (t))
5597     {
5598       varinfo_t p;
5599
5600       /* For restrict qualified pointers to objects passed by
5601          reference build a real representative for the pointed-to object.
5602          Treat restrict qualified references the same.  */
5603       if (TYPE_RESTRICT (TREE_TYPE (t))
5604           && ((DECL_BY_REFERENCE (t) && POINTER_TYPE_P (TREE_TYPE (t)))
5605               || TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE))
5606         {
5607           struct constraint_expr lhsc, rhsc;
5608           varinfo_t vi;
5609           tree heapvar = build_fake_var_decl (TREE_TYPE (TREE_TYPE (t)));
5610           DECL_EXTERNAL (heapvar) = 1;
5611           vi = create_variable_info_for_1 (heapvar, "PARM_NOALIAS");
5612           insert_vi_for_tree (heapvar, vi);
5613           lhsc.var = get_vi_for_tree (t)->id;
5614           lhsc.type = SCALAR;
5615           lhsc.offset = 0;
5616           rhsc.var = vi->id;
5617           rhsc.type = ADDRESSOF;
5618           rhsc.offset = 0;
5619           process_constraint (new_constraint (lhsc, rhsc));
5620           vi->is_restrict_var = 1;
5621           for (; vi; vi = vi->next)
5622             if (vi->may_have_pointers)
5623               {
5624                 if (vi->only_restrict_pointers)
5625                   make_constraint_from_restrict (vi, "GLOBAL_RESTRICT");
5626                 make_copy_constraint (vi, nonlocal_id);
5627               }
5628           continue;
5629         }
5630
5631       for (p = get_vi_for_tree (t); p; p = p->next)
5632         {
5633           if (p->may_have_pointers)
5634             make_constraint_from (p, nonlocal_id);
5635           if (p->only_restrict_pointers)
5636             make_constraint_from_restrict (p, "PARM_RESTRICT");
5637         }
5638       if (POINTER_TYPE_P (TREE_TYPE (t))
5639           && TYPE_RESTRICT (TREE_TYPE (t)))
5640         make_constraint_from_restrict (get_vi_for_tree (t), "PARM_RESTRICT");
5641     }
5642
5643   /* Add a constraint for a result decl that is passed by reference.  */
5644   if (DECL_RESULT (cfun->decl)
5645       && DECL_BY_REFERENCE (DECL_RESULT (cfun->decl)))
5646     {
5647       varinfo_t p, result_vi = get_vi_for_tree (DECL_RESULT (cfun->decl));
5648
5649       for (p = result_vi; p; p = p->next)
5650         make_constraint_from (p, nonlocal_id);
5651     }
5652
5653   /* Add a constraint for the incoming static chain parameter.  */
5654   if (cfun->static_chain_decl != NULL_TREE)
5655     {
5656       varinfo_t p, chain_vi = get_vi_for_tree (cfun->static_chain_decl);
5657
5658       for (p = chain_vi; p; p = p->next)
5659         make_constraint_from (p, nonlocal_id);
5660     }
5661 }
5662
5663 /* Structure used to put solution bitmaps in a hashtable so they can
5664    be shared among variables with the same points-to set.  */
5665
5666 typedef struct shared_bitmap_info
5667 {
5668   bitmap pt_vars;
5669   hashval_t hashcode;
5670 } *shared_bitmap_info_t;
5671 typedef const struct shared_bitmap_info *const_shared_bitmap_info_t;
5672
5673 static htab_t shared_bitmap_table;
5674
5675 /* Hash function for a shared_bitmap_info_t */
5676
5677 static hashval_t
5678 shared_bitmap_hash (const void *p)
5679 {
5680   const_shared_bitmap_info_t const bi = (const_shared_bitmap_info_t) p;
5681   return bi->hashcode;
5682 }
5683
5684 /* Equality function for two shared_bitmap_info_t's. */
5685
5686 static int
5687 shared_bitmap_eq (const void *p1, const void *p2)
5688 {
5689   const_shared_bitmap_info_t const sbi1 = (const_shared_bitmap_info_t) p1;
5690   const_shared_bitmap_info_t const sbi2 = (const_shared_bitmap_info_t) p2;
5691   return bitmap_equal_p (sbi1->pt_vars, sbi2->pt_vars);
5692 }
5693
5694 /* Lookup a bitmap in the shared bitmap hashtable, and return an already
5695    existing instance if there is one, NULL otherwise.  */
5696
5697 static bitmap
5698 shared_bitmap_lookup (bitmap pt_vars)
5699 {
5700   void **slot;
5701   struct shared_bitmap_info sbi;
5702
5703   sbi.pt_vars = pt_vars;
5704   sbi.hashcode = bitmap_hash (pt_vars);
5705
5706   slot = htab_find_slot_with_hash (shared_bitmap_table, &sbi,
5707                                    sbi.hashcode, NO_INSERT);
5708   if (!slot)
5709     return NULL;
5710   else
5711     return ((shared_bitmap_info_t) *slot)->pt_vars;
5712 }
5713
5714
5715 /* Add a bitmap to the shared bitmap hashtable.  */
5716
5717 static void
5718 shared_bitmap_add (bitmap pt_vars)
5719 {
5720   void **slot;
5721   shared_bitmap_info_t sbi = XNEW (struct shared_bitmap_info);
5722
5723   sbi->pt_vars = pt_vars;
5724   sbi->hashcode = bitmap_hash (pt_vars);
5725
5726   slot = htab_find_slot_with_hash (shared_bitmap_table, sbi,
5727                                    sbi->hashcode, INSERT);
5728   gcc_assert (!*slot);
5729   *slot = (void *) sbi;
5730 }
5731
5732
5733 /* Set bits in INTO corresponding to the variable uids in solution set FROM.  */
5734
5735 static void
5736 set_uids_in_ptset (bitmap into, bitmap from, struct pt_solution *pt)
5737 {
5738   unsigned int i;
5739   bitmap_iterator bi;
5740
5741   EXECUTE_IF_SET_IN_BITMAP (from, 0, i, bi)
5742     {
5743       varinfo_t vi = get_varinfo (i);
5744
5745       /* The only artificial variables that are allowed in a may-alias
5746          set are heap variables.  */
5747       if (vi->is_artificial_var && !vi->is_heap_var)
5748         continue;
5749
5750       if (TREE_CODE (vi->decl) == VAR_DECL
5751           || TREE_CODE (vi->decl) == PARM_DECL
5752           || TREE_CODE (vi->decl) == RESULT_DECL)
5753         {
5754           /* If we are in IPA mode we will not recompute points-to
5755              sets after inlining so make sure they stay valid.  */
5756           if (in_ipa_mode
5757               && !DECL_PT_UID_SET_P (vi->decl))
5758             SET_DECL_PT_UID (vi->decl, DECL_UID (vi->decl));
5759
5760           /* Add the decl to the points-to set.  Note that the points-to
5761              set contains global variables.  */
5762           bitmap_set_bit (into, DECL_PT_UID (vi->decl));
5763           if (vi->is_global_var)
5764             pt->vars_contains_global = true;
5765         }
5766     }
5767 }
5768
5769
5770 /* Compute the points-to solution *PT for the variable VI.  */
5771
5772 static void
5773 find_what_var_points_to (varinfo_t orig_vi, struct pt_solution *pt)
5774 {
5775   unsigned int i;
5776   bitmap_iterator bi;
5777   bitmap finished_solution;
5778   bitmap result;
5779   varinfo_t vi;
5780
5781   memset (pt, 0, sizeof (struct pt_solution));
5782
5783   /* This variable may have been collapsed, let's get the real
5784      variable.  */
5785   vi = get_varinfo (find (orig_vi->id));
5786
5787   /* Translate artificial variables into SSA_NAME_PTR_INFO
5788      attributes.  */
5789   EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
5790     {
5791       varinfo_t vi = get_varinfo (i);
5792
5793       if (vi->is_artificial_var)
5794         {
5795           if (vi->id == nothing_id)
5796             pt->null = 1;
5797           else if (vi->id == escaped_id)
5798             {
5799               if (in_ipa_mode)
5800                 pt->ipa_escaped = 1;
5801               else
5802                 pt->escaped = 1;
5803             }
5804           else if (vi->id == nonlocal_id)
5805             pt->nonlocal = 1;
5806           else if (vi->is_heap_var)
5807             /* We represent heapvars in the points-to set properly.  */
5808             ;
5809           else if (vi->id == readonly_id)
5810             /* Nobody cares.  */
5811             ;
5812           else if (vi->id == anything_id
5813                    || vi->id == integer_id)
5814             pt->anything = 1;
5815         }
5816       if (vi->is_restrict_var)
5817         pt->vars_contains_restrict = true;
5818     }
5819
5820   /* Instead of doing extra work, simply do not create
5821      elaborate points-to information for pt_anything pointers.  */
5822   if (pt->anything
5823       && (orig_vi->is_artificial_var
5824           || !pt->vars_contains_restrict))
5825     return;
5826
5827   /* Share the final set of variables when possible.  */
5828   finished_solution = BITMAP_GGC_ALLOC ();
5829   stats.points_to_sets_created++;
5830
5831   set_uids_in_ptset (finished_solution, vi->solution, pt);
5832   result = shared_bitmap_lookup (finished_solution);
5833   if (!result)
5834     {
5835       shared_bitmap_add (finished_solution);
5836       pt->vars = finished_solution;
5837     }
5838   else
5839     {
5840       pt->vars = result;
5841       bitmap_clear (finished_solution);
5842     }
5843 }
5844
5845 /* Given a pointer variable P, fill in its points-to set.  */
5846
5847 static void
5848 find_what_p_points_to (tree p)
5849 {
5850   struct ptr_info_def *pi;
5851   tree lookup_p = p;
5852   varinfo_t vi;
5853
5854   /* For parameters, get at the points-to set for the actual parm
5855      decl.  */
5856   if (TREE_CODE (p) == SSA_NAME
5857       && (TREE_CODE (SSA_NAME_VAR (p)) == PARM_DECL
5858           || TREE_CODE (SSA_NAME_VAR (p)) == RESULT_DECL)
5859       && SSA_NAME_IS_DEFAULT_DEF (p))
5860     lookup_p = SSA_NAME_VAR (p);
5861
5862   vi = lookup_vi_for_tree (lookup_p);
5863   if (!vi)
5864     return;
5865
5866   pi = get_ptr_info (p);
5867   find_what_var_points_to (vi, &pi->pt);
5868 }
5869
5870
5871 /* Query statistics for points-to solutions.  */
5872
5873 static struct {
5874   unsigned HOST_WIDE_INT pt_solution_includes_may_alias;
5875   unsigned HOST_WIDE_INT pt_solution_includes_no_alias;
5876   unsigned HOST_WIDE_INT pt_solutions_intersect_may_alias;
5877   unsigned HOST_WIDE_INT pt_solutions_intersect_no_alias;
5878 } pta_stats;
5879
5880 void
5881 dump_pta_stats (FILE *s)
5882 {
5883   fprintf (s, "\nPTA query stats:\n");
5884   fprintf (s, "  pt_solution_includes: "
5885            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
5886            HOST_WIDE_INT_PRINT_DEC" queries\n",
5887            pta_stats.pt_solution_includes_no_alias,
5888            pta_stats.pt_solution_includes_no_alias
5889            + pta_stats.pt_solution_includes_may_alias);
5890   fprintf (s, "  pt_solutions_intersect: "
5891            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
5892            HOST_WIDE_INT_PRINT_DEC" queries\n",
5893            pta_stats.pt_solutions_intersect_no_alias,
5894            pta_stats.pt_solutions_intersect_no_alias
5895            + pta_stats.pt_solutions_intersect_may_alias);
5896 }
5897
5898
5899 /* Reset the points-to solution *PT to a conservative default
5900    (point to anything).  */
5901
5902 void
5903 pt_solution_reset (struct pt_solution *pt)
5904 {
5905   memset (pt, 0, sizeof (struct pt_solution));
5906   pt->anything = true;
5907 }
5908
5909 /* Set the points-to solution *PT to point only to the variables
5910    in VARS.  VARS_CONTAINS_GLOBAL specifies whether that contains
5911    global variables and VARS_CONTAINS_RESTRICT specifies whether
5912    it contains restrict tag variables.  */
5913
5914 void
5915 pt_solution_set (struct pt_solution *pt, bitmap vars,
5916                  bool vars_contains_global, bool vars_contains_restrict)
5917 {
5918   memset (pt, 0, sizeof (struct pt_solution));
5919   pt->vars = vars;
5920   pt->vars_contains_global = vars_contains_global;
5921   pt->vars_contains_restrict = vars_contains_restrict;
5922 }
5923
5924 /* Set the points-to solution *PT to point only to the variable VAR.  */
5925
5926 void
5927 pt_solution_set_var (struct pt_solution *pt, tree var)
5928 {
5929   memset (pt, 0, sizeof (struct pt_solution));
5930   pt->vars = BITMAP_GGC_ALLOC ();
5931   bitmap_set_bit (pt->vars, DECL_PT_UID (var));
5932   pt->vars_contains_global = is_global_var (var);
5933 }
5934
5935 /* Computes the union of the points-to solutions *DEST and *SRC and
5936    stores the result in *DEST.  This changes the points-to bitmap
5937    of *DEST and thus may not be used if that might be shared.
5938    The points-to bitmap of *SRC and *DEST will not be shared after
5939    this function if they were not before.  */
5940
5941 static void
5942 pt_solution_ior_into (struct pt_solution *dest, struct pt_solution *src)
5943 {
5944   dest->anything |= src->anything;
5945   if (dest->anything)
5946     {
5947       pt_solution_reset (dest);
5948       return;
5949     }
5950
5951   dest->nonlocal |= src->nonlocal;
5952   dest->escaped |= src->escaped;
5953   dest->ipa_escaped |= src->ipa_escaped;
5954   dest->null |= src->null;
5955   dest->vars_contains_global |= src->vars_contains_global;
5956   dest->vars_contains_restrict |= src->vars_contains_restrict;
5957   if (!src->vars)
5958     return;
5959
5960   if (!dest->vars)
5961     dest->vars = BITMAP_GGC_ALLOC ();
5962   bitmap_ior_into (dest->vars, src->vars);
5963 }
5964
5965 /* Return true if the points-to solution *PT is empty.  */
5966
5967 bool
5968 pt_solution_empty_p (struct pt_solution *pt)
5969 {
5970   if (pt->anything
5971       || pt->nonlocal)
5972     return false;
5973
5974   if (pt->vars
5975       && !bitmap_empty_p (pt->vars))
5976     return false;
5977
5978   /* If the solution includes ESCAPED, check if that is empty.  */
5979   if (pt->escaped
5980       && !pt_solution_empty_p (&cfun->gimple_df->escaped))
5981     return false;
5982
5983   /* If the solution includes ESCAPED, check if that is empty.  */
5984   if (pt->ipa_escaped
5985       && !pt_solution_empty_p (&ipa_escaped_pt))
5986     return false;
5987
5988   return true;
5989 }
5990
5991 /* Return true if the points-to solution *PT only point to a single var, and
5992    return the var uid in *UID.  */
5993
5994 bool
5995 pt_solution_singleton_p (struct pt_solution *pt, unsigned *uid)
5996 {
5997   if (pt->anything || pt->nonlocal || pt->escaped || pt->ipa_escaped
5998       || pt->null || pt->vars == NULL
5999       || !bitmap_single_bit_set_p (pt->vars))
6000     return false;
6001
6002   *uid = bitmap_first_set_bit (pt->vars);
6003   return true;
6004 }
6005
6006 /* Return true if the points-to solution *PT includes global memory.  */
6007
6008 bool
6009 pt_solution_includes_global (struct pt_solution *pt)
6010 {
6011   if (pt->anything
6012       || pt->nonlocal
6013       || pt->vars_contains_global)
6014     return true;
6015
6016   if (pt->escaped)
6017     return pt_solution_includes_global (&cfun->gimple_df->escaped);
6018
6019   if (pt->ipa_escaped)
6020     return pt_solution_includes_global (&ipa_escaped_pt);
6021
6022   /* ???  This predicate is not correct for the IPA-PTA solution
6023      as we do not properly distinguish between unit escape points
6024      and global variables.  */
6025   if (cfun->gimple_df->ipa_pta)
6026     return true;
6027
6028   return false;
6029 }
6030
6031 /* Return true if the points-to solution *PT includes the variable
6032    declaration DECL.  */
6033
6034 static bool
6035 pt_solution_includes_1 (struct pt_solution *pt, const_tree decl)
6036 {
6037   if (pt->anything)
6038     return true;
6039
6040   if (pt->nonlocal
6041       && is_global_var (decl))
6042     return true;
6043
6044   if (pt->vars
6045       && bitmap_bit_p (pt->vars, DECL_PT_UID (decl)))
6046     return true;
6047
6048   /* If the solution includes ESCAPED, check it.  */
6049   if (pt->escaped
6050       && pt_solution_includes_1 (&cfun->gimple_df->escaped, decl))
6051     return true;
6052
6053   /* If the solution includes ESCAPED, check it.  */
6054   if (pt->ipa_escaped
6055       && pt_solution_includes_1 (&ipa_escaped_pt, decl))
6056     return true;
6057
6058   return false;
6059 }
6060
6061 bool
6062 pt_solution_includes (struct pt_solution *pt, const_tree decl)
6063 {
6064   bool res = pt_solution_includes_1 (pt, decl);
6065   if (res)
6066     ++pta_stats.pt_solution_includes_may_alias;
6067   else
6068     ++pta_stats.pt_solution_includes_no_alias;
6069   return res;
6070 }
6071
6072 /* Return true if both points-to solutions PT1 and PT2 have a non-empty
6073    intersection.  */
6074
6075 static bool
6076 pt_solutions_intersect_1 (struct pt_solution *pt1, struct pt_solution *pt2)
6077 {
6078   if (pt1->anything || pt2->anything)
6079     return true;
6080
6081   /* If either points to unknown global memory and the other points to
6082      any global memory they alias.  */
6083   if ((pt1->nonlocal
6084        && (pt2->nonlocal
6085            || pt2->vars_contains_global))
6086       || (pt2->nonlocal
6087           && pt1->vars_contains_global))
6088     return true;
6089
6090   /* Check the escaped solution if required.  */
6091   if ((pt1->escaped || pt2->escaped)
6092       && !pt_solution_empty_p (&cfun->gimple_df->escaped))
6093     {
6094       /* If both point to escaped memory and that solution
6095          is not empty they alias.  */
6096       if (pt1->escaped && pt2->escaped)
6097         return true;
6098
6099       /* If either points to escaped memory see if the escaped solution
6100          intersects with the other.  */
6101       if ((pt1->escaped
6102            && pt_solutions_intersect_1 (&cfun->gimple_df->escaped, pt2))
6103           || (pt2->escaped
6104               && pt_solutions_intersect_1 (&cfun->gimple_df->escaped, pt1)))
6105         return true;
6106     }
6107
6108   /* Check the escaped solution if required.
6109      ???  Do we need to check the local against the IPA escaped sets?  */
6110   if ((pt1->ipa_escaped || pt2->ipa_escaped)
6111       && !pt_solution_empty_p (&ipa_escaped_pt))
6112     {
6113       /* If both point to escaped memory and that solution
6114          is not empty they alias.  */
6115       if (pt1->ipa_escaped && pt2->ipa_escaped)
6116         return true;
6117
6118       /* If either points to escaped memory see if the escaped solution
6119          intersects with the other.  */
6120       if ((pt1->ipa_escaped
6121            && pt_solutions_intersect_1 (&ipa_escaped_pt, pt2))
6122           || (pt2->ipa_escaped
6123               && pt_solutions_intersect_1 (&ipa_escaped_pt, pt1)))
6124         return true;
6125     }
6126
6127   /* Now both pointers alias if their points-to solution intersects.  */
6128   return (pt1->vars
6129           && pt2->vars
6130           && bitmap_intersect_p (pt1->vars, pt2->vars));
6131 }
6132
6133 bool
6134 pt_solutions_intersect (struct pt_solution *pt1, struct pt_solution *pt2)
6135 {
6136   bool res = pt_solutions_intersect_1 (pt1, pt2);
6137   if (res)
6138     ++pta_stats.pt_solutions_intersect_may_alias;
6139   else
6140     ++pta_stats.pt_solutions_intersect_no_alias;
6141   return res;
6142 }
6143
6144 /* Return true if both points-to solutions PT1 and PT2 for two restrict
6145    qualified pointers are possibly based on the same pointer.  */
6146
6147 bool
6148 pt_solutions_same_restrict_base (struct pt_solution *pt1,
6149                                  struct pt_solution *pt2)
6150 {
6151   /* If we deal with points-to solutions of two restrict qualified
6152      pointers solely rely on the pointed-to variable bitmap intersection.
6153      For two pointers that are based on each other the bitmaps will
6154      intersect.  */
6155   if (pt1->vars_contains_restrict
6156       && pt2->vars_contains_restrict)
6157     {
6158       gcc_assert (pt1->vars && pt2->vars);
6159       return bitmap_intersect_p (pt1->vars, pt2->vars);
6160     }
6161
6162   return true;
6163 }
6164
6165
6166 /* Dump points-to information to OUTFILE.  */
6167
6168 static void
6169 dump_sa_points_to_info (FILE *outfile)
6170 {
6171   unsigned int i;
6172
6173   fprintf (outfile, "\nPoints-to sets\n\n");
6174
6175   if (dump_flags & TDF_STATS)
6176     {
6177       fprintf (outfile, "Stats:\n");
6178       fprintf (outfile, "Total vars:               %d\n", stats.total_vars);
6179       fprintf (outfile, "Non-pointer vars:          %d\n",
6180                stats.nonpointer_vars);
6181       fprintf (outfile, "Statically unified vars:  %d\n",
6182                stats.unified_vars_static);
6183       fprintf (outfile, "Dynamically unified vars: %d\n",
6184                stats.unified_vars_dynamic);
6185       fprintf (outfile, "Iterations:               %d\n", stats.iterations);
6186       fprintf (outfile, "Number of edges:          %d\n", stats.num_edges);
6187       fprintf (outfile, "Number of implicit edges: %d\n",
6188                stats.num_implicit_edges);
6189     }
6190
6191   for (i = 0; i < VEC_length (varinfo_t, varmap); i++)
6192     {
6193       varinfo_t vi = get_varinfo (i);
6194       if (!vi->may_have_pointers)
6195         continue;
6196       dump_solution_for_var (outfile, i);
6197     }
6198 }
6199
6200
6201 /* Debug points-to information to stderr.  */
6202
6203 DEBUG_FUNCTION void
6204 debug_sa_points_to_info (void)
6205 {
6206   dump_sa_points_to_info (stderr);
6207 }
6208
6209
6210 /* Initialize the always-existing constraint variables for NULL
6211    ANYTHING, READONLY, and INTEGER */
6212
6213 static void
6214 init_base_vars (void)
6215 {
6216   struct constraint_expr lhs, rhs;
6217   varinfo_t var_anything;
6218   varinfo_t var_nothing;
6219   varinfo_t var_readonly;
6220   varinfo_t var_escaped;
6221   varinfo_t var_nonlocal;
6222   varinfo_t var_storedanything;
6223   varinfo_t var_integer;
6224
6225   /* Create the NULL variable, used to represent that a variable points
6226      to NULL.  */
6227   var_nothing = new_var_info (NULL_TREE, "NULL");
6228   gcc_assert (var_nothing->id == nothing_id);
6229   var_nothing->is_artificial_var = 1;
6230   var_nothing->offset = 0;
6231   var_nothing->size = ~0;
6232   var_nothing->fullsize = ~0;
6233   var_nothing->is_special_var = 1;
6234   var_nothing->may_have_pointers = 0;
6235   var_nothing->is_global_var = 0;
6236
6237   /* Create the ANYTHING variable, used to represent that a variable
6238      points to some unknown piece of memory.  */
6239   var_anything = new_var_info (NULL_TREE, "ANYTHING");
6240   gcc_assert (var_anything->id == anything_id);
6241   var_anything->is_artificial_var = 1;
6242   var_anything->size = ~0;
6243   var_anything->offset = 0;
6244   var_anything->next = NULL;
6245   var_anything->fullsize = ~0;
6246   var_anything->is_special_var = 1;
6247
6248   /* Anything points to anything.  This makes deref constraints just
6249      work in the presence of linked list and other p = *p type loops,
6250      by saying that *ANYTHING = ANYTHING. */
6251   lhs.type = SCALAR;
6252   lhs.var = anything_id;
6253   lhs.offset = 0;
6254   rhs.type = ADDRESSOF;
6255   rhs.var = anything_id;
6256   rhs.offset = 0;
6257
6258   /* This specifically does not use process_constraint because
6259      process_constraint ignores all anything = anything constraints, since all
6260      but this one are redundant.  */
6261   VEC_safe_push (constraint_t, heap, constraints, new_constraint (lhs, rhs));
6262
6263   /* Create the READONLY variable, used to represent that a variable
6264      points to readonly memory.  */
6265   var_readonly = new_var_info (NULL_TREE, "READONLY");
6266   gcc_assert (var_readonly->id == readonly_id);
6267   var_readonly->is_artificial_var = 1;
6268   var_readonly->offset = 0;
6269   var_readonly->size = ~0;
6270   var_readonly->fullsize = ~0;
6271   var_readonly->next = NULL;
6272   var_readonly->is_special_var = 1;
6273
6274   /* readonly memory points to anything, in order to make deref
6275      easier.  In reality, it points to anything the particular
6276      readonly variable can point to, but we don't track this
6277      separately. */
6278   lhs.type = SCALAR;
6279   lhs.var = readonly_id;
6280   lhs.offset = 0;
6281   rhs.type = ADDRESSOF;
6282   rhs.var = readonly_id;  /* FIXME */
6283   rhs.offset = 0;
6284   process_constraint (new_constraint (lhs, rhs));
6285
6286   /* Create the ESCAPED variable, used to represent the set of escaped
6287      memory.  */
6288   var_escaped = new_var_info (NULL_TREE, "ESCAPED");
6289   gcc_assert (var_escaped->id == escaped_id);
6290   var_escaped->is_artificial_var = 1;
6291   var_escaped->offset = 0;
6292   var_escaped->size = ~0;
6293   var_escaped->fullsize = ~0;
6294   var_escaped->is_special_var = 0;
6295
6296   /* Create the NONLOCAL variable, used to represent the set of nonlocal
6297      memory.  */
6298   var_nonlocal = new_var_info (NULL_TREE, "NONLOCAL");
6299   gcc_assert (var_nonlocal->id == nonlocal_id);
6300   var_nonlocal->is_artificial_var = 1;
6301   var_nonlocal->offset = 0;
6302   var_nonlocal->size = ~0;
6303   var_nonlocal->fullsize = ~0;
6304   var_nonlocal->is_special_var = 1;
6305
6306   /* ESCAPED = *ESCAPED, because escaped is may-deref'd at calls, etc.  */
6307   lhs.type = SCALAR;
6308   lhs.var = escaped_id;
6309   lhs.offset = 0;
6310   rhs.type = DEREF;
6311   rhs.var = escaped_id;
6312   rhs.offset = 0;
6313   process_constraint (new_constraint (lhs, rhs));
6314
6315   /* ESCAPED = ESCAPED + UNKNOWN_OFFSET, because if a sub-field escapes the
6316      whole variable escapes.  */
6317   lhs.type = SCALAR;
6318   lhs.var = escaped_id;
6319   lhs.offset = 0;
6320   rhs.type = SCALAR;
6321   rhs.var = escaped_id;
6322   rhs.offset = UNKNOWN_OFFSET;
6323   process_constraint (new_constraint (lhs, rhs));
6324
6325   /* *ESCAPED = NONLOCAL.  This is true because we have to assume
6326      everything pointed to by escaped points to what global memory can
6327      point to.  */
6328   lhs.type = DEREF;
6329   lhs.var = escaped_id;
6330   lhs.offset = 0;
6331   rhs.type = SCALAR;
6332   rhs.var = nonlocal_id;
6333   rhs.offset = 0;
6334   process_constraint (new_constraint (lhs, rhs));
6335
6336   /* NONLOCAL = &NONLOCAL, NONLOCAL = &ESCAPED.  This is true because
6337      global memory may point to global memory and escaped memory.  */
6338   lhs.type = SCALAR;
6339   lhs.var = nonlocal_id;
6340   lhs.offset = 0;
6341   rhs.type = ADDRESSOF;
6342   rhs.var = nonlocal_id;
6343   rhs.offset = 0;
6344   process_constraint (new_constraint (lhs, rhs));
6345   rhs.type = ADDRESSOF;
6346   rhs.var = escaped_id;
6347   rhs.offset = 0;
6348   process_constraint (new_constraint (lhs, rhs));
6349
6350   /* Create the STOREDANYTHING variable, used to represent the set of
6351      variables stored to *ANYTHING.  */
6352   var_storedanything = new_var_info (NULL_TREE, "STOREDANYTHING");
6353   gcc_assert (var_storedanything->id == storedanything_id);
6354   var_storedanything->is_artificial_var = 1;
6355   var_storedanything->offset = 0;
6356   var_storedanything->size = ~0;
6357   var_storedanything->fullsize = ~0;
6358   var_storedanything->is_special_var = 0;
6359
6360   /* Create the INTEGER variable, used to represent that a variable points
6361      to what an INTEGER "points to".  */
6362   var_integer = new_var_info (NULL_TREE, "INTEGER");
6363   gcc_assert (var_integer->id == integer_id);
6364   var_integer->is_artificial_var = 1;
6365   var_integer->size = ~0;
6366   var_integer->fullsize = ~0;
6367   var_integer->offset = 0;
6368   var_integer->next = NULL;
6369   var_integer->is_special_var = 1;
6370
6371   /* INTEGER = ANYTHING, because we don't know where a dereference of
6372      a random integer will point to.  */
6373   lhs.type = SCALAR;
6374   lhs.var = integer_id;
6375   lhs.offset = 0;
6376   rhs.type = ADDRESSOF;
6377   rhs.var = anything_id;
6378   rhs.offset = 0;
6379   process_constraint (new_constraint (lhs, rhs));
6380 }
6381
6382 /* Initialize things necessary to perform PTA */
6383
6384 static void
6385 init_alias_vars (void)
6386 {
6387   use_field_sensitive = (MAX_FIELDS_FOR_FIELD_SENSITIVE > 1);
6388
6389   bitmap_obstack_initialize (&pta_obstack);
6390   bitmap_obstack_initialize (&oldpta_obstack);
6391   bitmap_obstack_initialize (&predbitmap_obstack);
6392
6393   constraint_pool = create_alloc_pool ("Constraint pool",
6394                                        sizeof (struct constraint), 30);
6395   variable_info_pool = create_alloc_pool ("Variable info pool",
6396                                           sizeof (struct variable_info), 30);
6397   constraints = VEC_alloc (constraint_t, heap, 8);
6398   varmap = VEC_alloc (varinfo_t, heap, 8);
6399   vi_for_tree = pointer_map_create ();
6400   call_stmt_vars = pointer_map_create ();
6401
6402   memset (&stats, 0, sizeof (stats));
6403   shared_bitmap_table = htab_create (511, shared_bitmap_hash,
6404                                      shared_bitmap_eq, free);
6405   init_base_vars ();
6406
6407   gcc_obstack_init (&fake_var_decl_obstack);
6408 }
6409
6410 /* Remove the REF and ADDRESS edges from GRAPH, as well as all the
6411    predecessor edges.  */
6412
6413 static void
6414 remove_preds_and_fake_succs (constraint_graph_t graph)
6415 {
6416   unsigned int i;
6417
6418   /* Clear the implicit ref and address nodes from the successor
6419      lists.  */
6420   for (i = 0; i < FIRST_REF_NODE; i++)
6421     {
6422       if (graph->succs[i])
6423         bitmap_clear_range (graph->succs[i], FIRST_REF_NODE,
6424                             FIRST_REF_NODE * 2);
6425     }
6426
6427   /* Free the successor list for the non-ref nodes.  */
6428   for (i = FIRST_REF_NODE; i < graph->size; i++)
6429     {
6430       if (graph->succs[i])
6431         BITMAP_FREE (graph->succs[i]);
6432     }
6433
6434   /* Now reallocate the size of the successor list as, and blow away
6435      the predecessor bitmaps.  */
6436   graph->size = VEC_length (varinfo_t, varmap);
6437   graph->succs = XRESIZEVEC (bitmap, graph->succs, graph->size);
6438
6439   free (graph->implicit_preds);
6440   graph->implicit_preds = NULL;
6441   free (graph->preds);
6442   graph->preds = NULL;
6443   bitmap_obstack_release (&predbitmap_obstack);
6444 }
6445
6446 /* Solve the constraint set.  */
6447
6448 static void
6449 solve_constraints (void)
6450 {
6451   struct scc_info *si;
6452
6453   if (dump_file)
6454     fprintf (dump_file,
6455              "\nCollapsing static cycles and doing variable "
6456              "substitution\n");
6457
6458   init_graph (VEC_length (varinfo_t, varmap) * 2);
6459
6460   if (dump_file)
6461     fprintf (dump_file, "Building predecessor graph\n");
6462   build_pred_graph ();
6463
6464   if (dump_file)
6465     fprintf (dump_file, "Detecting pointer and location "
6466              "equivalences\n");
6467   si = perform_var_substitution (graph);
6468
6469   if (dump_file)
6470     fprintf (dump_file, "Rewriting constraints and unifying "
6471              "variables\n");
6472   rewrite_constraints (graph, si);
6473
6474   build_succ_graph ();
6475
6476   free_var_substitution_info (si);
6477
6478   /* Attach complex constraints to graph nodes.  */
6479   move_complex_constraints (graph);
6480
6481   if (dump_file)
6482     fprintf (dump_file, "Uniting pointer but not location equivalent "
6483              "variables\n");
6484   unite_pointer_equivalences (graph);
6485
6486   if (dump_file)
6487     fprintf (dump_file, "Finding indirect cycles\n");
6488   find_indirect_cycles (graph);
6489
6490   /* Implicit nodes and predecessors are no longer necessary at this
6491      point. */
6492   remove_preds_and_fake_succs (graph);
6493
6494   if (dump_file && (dump_flags & TDF_GRAPH))
6495     {
6496       fprintf (dump_file, "\n\n// The constraint graph before solve-graph "
6497                "in dot format:\n");
6498       dump_constraint_graph (dump_file);
6499       fprintf (dump_file, "\n\n");
6500     }
6501
6502   if (dump_file)
6503     fprintf (dump_file, "Solving graph\n");
6504
6505   solve_graph (graph);
6506
6507   if (dump_file && (dump_flags & TDF_GRAPH))
6508     {
6509       fprintf (dump_file, "\n\n// The constraint graph after solve-graph "
6510                "in dot format:\n");
6511       dump_constraint_graph (dump_file);
6512       fprintf (dump_file, "\n\n");
6513     }
6514
6515   if (dump_file)
6516     dump_sa_points_to_info (dump_file);
6517 }
6518
6519 /* Create points-to sets for the current function.  See the comments
6520    at the start of the file for an algorithmic overview.  */
6521
6522 static void
6523 compute_points_to_sets (void)
6524 {
6525   basic_block bb;
6526   unsigned i;
6527   varinfo_t vi;
6528
6529   timevar_push (TV_TREE_PTA);
6530
6531   init_alias_vars ();
6532
6533   intra_create_variable_infos ();
6534
6535   /* Now walk all statements and build the constraint set.  */
6536   FOR_EACH_BB (bb)
6537     {
6538       gimple_stmt_iterator gsi;
6539
6540       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6541         {
6542           gimple phi = gsi_stmt (gsi);
6543
6544           if (is_gimple_reg (gimple_phi_result (phi)))
6545             find_func_aliases (phi);
6546         }
6547
6548       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6549         {
6550           gimple stmt = gsi_stmt (gsi);
6551
6552           find_func_aliases (stmt);
6553         }
6554     }
6555
6556   if (dump_file)
6557     {
6558       fprintf (dump_file, "Points-to analysis\n\nConstraints:\n\n");
6559       dump_constraints (dump_file, 0);
6560     }
6561
6562   /* From the constraints compute the points-to sets.  */
6563   solve_constraints ();
6564
6565   /* Compute the points-to set for ESCAPED used for call-clobber analysis.  */
6566   find_what_var_points_to (get_varinfo (escaped_id),
6567                            &cfun->gimple_df->escaped);
6568
6569   /* Make sure the ESCAPED solution (which is used as placeholder in
6570      other solutions) does not reference itself.  This simplifies
6571      points-to solution queries.  */
6572   cfun->gimple_df->escaped.escaped = 0;
6573
6574   /* Mark escaped HEAP variables as global.  */
6575   FOR_EACH_VEC_ELT (varinfo_t, varmap, i, vi)
6576     if (vi->is_heap_var
6577         && !vi->is_restrict_var
6578         && !vi->is_global_var)
6579       DECL_EXTERNAL (vi->decl) = vi->is_global_var
6580         = pt_solution_includes (&cfun->gimple_df->escaped, vi->decl);
6581
6582   /* Compute the points-to sets for pointer SSA_NAMEs.  */
6583   for (i = 0; i < num_ssa_names; ++i)
6584     {
6585       tree ptr = ssa_name (i);
6586       if (ptr
6587           && POINTER_TYPE_P (TREE_TYPE (ptr)))
6588         find_what_p_points_to (ptr);
6589     }
6590
6591   /* Compute the call-used/clobbered sets.  */
6592   FOR_EACH_BB (bb)
6593     {
6594       gimple_stmt_iterator gsi;
6595
6596       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6597         {
6598           gimple stmt = gsi_stmt (gsi);
6599           struct pt_solution *pt;
6600           if (!is_gimple_call (stmt))
6601             continue;
6602
6603           pt = gimple_call_use_set (stmt);
6604           if (gimple_call_flags (stmt) & ECF_CONST)
6605             memset (pt, 0, sizeof (struct pt_solution));
6606           else if ((vi = lookup_call_use_vi (stmt)) != NULL)
6607             {
6608               find_what_var_points_to (vi, pt);
6609               /* Escaped (and thus nonlocal) variables are always
6610                  implicitly used by calls.  */
6611               /* ???  ESCAPED can be empty even though NONLOCAL
6612                  always escaped.  */
6613               pt->nonlocal = 1;
6614               pt->escaped = 1;
6615             }
6616           else
6617             {
6618               /* If there is nothing special about this call then
6619                  we have made everything that is used also escape.  */
6620               *pt = cfun->gimple_df->escaped;
6621               pt->nonlocal = 1;
6622             }
6623
6624           pt = gimple_call_clobber_set (stmt);
6625           if (gimple_call_flags (stmt) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
6626             memset (pt, 0, sizeof (struct pt_solution));
6627           else if ((vi = lookup_call_clobber_vi (stmt)) != NULL)
6628             {
6629               find_what_var_points_to (vi, pt);
6630               /* Escaped (and thus nonlocal) variables are always
6631                  implicitly clobbered by calls.  */
6632               /* ???  ESCAPED can be empty even though NONLOCAL
6633                  always escaped.  */
6634               pt->nonlocal = 1;
6635               pt->escaped = 1;
6636             }
6637           else
6638             {
6639               /* If there is nothing special about this call then
6640                  we have made everything that is used also escape.  */
6641               *pt = cfun->gimple_df->escaped;
6642               pt->nonlocal = 1;
6643             }
6644         }
6645     }
6646
6647   timevar_pop (TV_TREE_PTA);
6648 }
6649
6650
6651 /* Delete created points-to sets.  */
6652
6653 static void
6654 delete_points_to_sets (void)
6655 {
6656   unsigned int i;
6657
6658   htab_delete (shared_bitmap_table);
6659   if (dump_file && (dump_flags & TDF_STATS))
6660     fprintf (dump_file, "Points to sets created:%d\n",
6661              stats.points_to_sets_created);
6662
6663   pointer_map_destroy (vi_for_tree);
6664   pointer_map_destroy (call_stmt_vars);
6665   bitmap_obstack_release (&pta_obstack);
6666   VEC_free (constraint_t, heap, constraints);
6667
6668   for (i = 0; i < graph->size; i++)
6669     VEC_free (constraint_t, heap, graph->complex[i]);
6670   free (graph->complex);
6671
6672   free (graph->rep);
6673   free (graph->succs);
6674   free (graph->pe);
6675   free (graph->pe_rep);
6676   free (graph->indirect_cycles);
6677   free (graph);
6678
6679   VEC_free (varinfo_t, heap, varmap);
6680   free_alloc_pool (variable_info_pool);
6681   free_alloc_pool (constraint_pool);
6682
6683   obstack_free (&fake_var_decl_obstack, NULL);
6684 }
6685
6686
6687 /* Compute points-to information for every SSA_NAME pointer in the
6688    current function and compute the transitive closure of escaped
6689    variables to re-initialize the call-clobber states of local variables.  */
6690
6691 unsigned int
6692 compute_may_aliases (void)
6693 {
6694   if (cfun->gimple_df->ipa_pta)
6695     {
6696       if (dump_file)
6697         {
6698           fprintf (dump_file, "\nNot re-computing points-to information "
6699                    "because IPA points-to information is available.\n\n");
6700
6701           /* But still dump what we have remaining it.  */
6702           dump_alias_info (dump_file);
6703
6704           if (dump_flags & TDF_DETAILS)
6705             dump_referenced_vars (dump_file);
6706         }
6707
6708       return 0;
6709     }
6710
6711   /* For each pointer P_i, determine the sets of variables that P_i may
6712      point-to.  Compute the reachability set of escaped and call-used
6713      variables.  */
6714   compute_points_to_sets ();
6715
6716   /* Debugging dumps.  */
6717   if (dump_file)
6718     {
6719       dump_alias_info (dump_file);
6720
6721       if (dump_flags & TDF_DETAILS)
6722         dump_referenced_vars (dump_file);
6723     }
6724
6725   /* Deallocate memory used by aliasing data structures and the internal
6726      points-to solution.  */
6727   delete_points_to_sets ();
6728
6729   gcc_assert (!need_ssa_update_p (cfun));
6730
6731   return 0;
6732 }
6733
6734 static bool
6735 gate_tree_pta (void)
6736 {
6737   return flag_tree_pta;
6738 }
6739
6740 /* A dummy pass to cause points-to information to be computed via
6741    TODO_rebuild_alias.  */
6742
6743 struct gimple_opt_pass pass_build_alias =
6744 {
6745  {
6746   GIMPLE_PASS,
6747   "alias",                  /* name */
6748   gate_tree_pta,            /* gate */
6749   NULL,                     /* execute */
6750   NULL,                     /* sub */
6751   NULL,                     /* next */
6752   0,                        /* static_pass_number */
6753   TV_NONE,                  /* tv_id */
6754   PROP_cfg | PROP_ssa,      /* properties_required */
6755   0,                        /* properties_provided */
6756   0,                        /* properties_destroyed */
6757   0,                        /* todo_flags_start */
6758   TODO_rebuild_alias        /* todo_flags_finish */
6759  }
6760 };
6761
6762 /* A dummy pass to cause points-to information to be computed via
6763    TODO_rebuild_alias.  */
6764
6765 struct gimple_opt_pass pass_build_ealias =
6766 {
6767  {
6768   GIMPLE_PASS,
6769   "ealias",                 /* name */
6770   gate_tree_pta,            /* gate */
6771   NULL,                     /* execute */
6772   NULL,                     /* sub */
6773   NULL,                     /* next */
6774   0,                        /* static_pass_number */
6775   TV_NONE,                  /* tv_id */
6776   PROP_cfg | PROP_ssa,      /* properties_required */
6777   0,                        /* properties_provided */
6778   0,                        /* properties_destroyed */
6779   0,                        /* todo_flags_start */
6780   TODO_rebuild_alias        /* todo_flags_finish */
6781  }
6782 };
6783
6784
6785 /* Return true if we should execute IPA PTA.  */
6786 static bool
6787 gate_ipa_pta (void)
6788 {
6789   return (optimize
6790           && flag_ipa_pta
6791           /* Don't bother doing anything if the program has errors.  */
6792           && !seen_error ());
6793 }
6794
6795 /* IPA PTA solutions for ESCAPED.  */
6796 struct pt_solution ipa_escaped_pt
6797   = { true, false, false, false, false, false, false, NULL };
6798
6799 /* Associate node with varinfo DATA. Worker for
6800    cgraph_for_node_and_aliases.  */
6801 static bool
6802 associate_varinfo_to_alias (struct cgraph_node *node, void *data)
6803 {
6804   if (node->alias || node->thunk.thunk_p)
6805     insert_vi_for_tree (node->decl, (varinfo_t)data);
6806   return false;
6807 }
6808
6809 /* Execute the driver for IPA PTA.  */
6810 static unsigned int
6811 ipa_pta_execute (void)
6812 {
6813   struct cgraph_node *node;
6814   struct varpool_node *var;
6815   int from;
6816
6817   in_ipa_mode = 1;
6818
6819   init_alias_vars ();
6820
6821   if (dump_file && (dump_flags & TDF_DETAILS))
6822     {
6823       dump_cgraph (dump_file);
6824       fprintf (dump_file, "\n");
6825     }
6826
6827   /* Build the constraints.  */
6828   for (node = cgraph_nodes; node; node = node->next)
6829     {
6830       varinfo_t vi;
6831       /* Nodes without a body are not interesting.  Especially do not
6832          visit clones at this point for now - we get duplicate decls
6833          there for inline clones at least.  */
6834       if (!cgraph_function_with_gimple_body_p (node))
6835         continue;
6836
6837       gcc_assert (!node->clone_of);
6838
6839       vi = create_function_info_for (node->decl,
6840                                      alias_get_name (node->decl));
6841       cgraph_for_node_and_aliases (node, associate_varinfo_to_alias, vi, true);
6842     }
6843
6844   /* Create constraints for global variables and their initializers.  */
6845   for (var = varpool_nodes; var; var = var->next)
6846     {
6847       if (var->alias)
6848         continue;
6849
6850       get_vi_for_tree (var->decl);
6851     }
6852
6853   if (dump_file)
6854     {
6855       fprintf (dump_file,
6856                "Generating constraints for global initializers\n\n");
6857       dump_constraints (dump_file, 0);
6858       fprintf (dump_file, "\n");
6859     }
6860   from = VEC_length (constraint_t, constraints);
6861
6862   for (node = cgraph_nodes; node; node = node->next)
6863     {
6864       struct function *func;
6865       basic_block bb;
6866       tree old_func_decl;
6867
6868       /* Nodes without a body are not interesting.  */
6869       if (!cgraph_function_with_gimple_body_p (node))
6870         continue;
6871
6872       if (dump_file)
6873         {
6874           fprintf (dump_file,
6875                    "Generating constraints for %s", cgraph_node_name (node));
6876           if (DECL_ASSEMBLER_NAME_SET_P (node->decl))
6877             fprintf (dump_file, " (%s)",
6878                      IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl)));
6879           fprintf (dump_file, "\n");
6880         }
6881
6882       func = DECL_STRUCT_FUNCTION (node->decl);
6883       old_func_decl = current_function_decl;
6884       push_cfun (func);
6885       current_function_decl = node->decl;
6886
6887       /* For externally visible or attribute used annotated functions use
6888          local constraints for their arguments.
6889          For local functions we see all callers and thus do not need initial
6890          constraints for parameters.  */
6891       if (node->reachable_from_other_partition
6892           || node->local.externally_visible
6893           || node->needed)
6894         {
6895           intra_create_variable_infos ();
6896
6897           /* We also need to make function return values escape.  Nothing
6898              escapes by returning from main though.  */
6899           if (!MAIN_NAME_P (DECL_NAME (node->decl)))
6900             {
6901               varinfo_t fi, rvi;
6902               fi = lookup_vi_for_tree (node->decl);
6903               rvi = first_vi_for_offset (fi, fi_result);
6904               if (rvi && rvi->offset == fi_result)
6905                 {
6906                   struct constraint_expr includes;
6907                   struct constraint_expr var;
6908                   includes.var = escaped_id;
6909                   includes.offset = 0;
6910                   includes.type = SCALAR;
6911                   var.var = rvi->id;
6912                   var.offset = 0;
6913                   var.type = SCALAR;
6914                   process_constraint (new_constraint (includes, var));
6915                 }
6916             }
6917         }
6918
6919       /* Build constriants for the function body.  */
6920       FOR_EACH_BB_FN (bb, func)
6921         {
6922           gimple_stmt_iterator gsi;
6923
6924           for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
6925                gsi_next (&gsi))
6926             {
6927               gimple phi = gsi_stmt (gsi);
6928
6929               if (is_gimple_reg (gimple_phi_result (phi)))
6930                 find_func_aliases (phi);
6931             }
6932
6933           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6934             {
6935               gimple stmt = gsi_stmt (gsi);
6936
6937               find_func_aliases (stmt);
6938               find_func_clobbers (stmt);
6939             }
6940         }
6941
6942       current_function_decl = old_func_decl;
6943       pop_cfun ();
6944
6945       if (dump_file)
6946         {
6947           fprintf (dump_file, "\n");
6948           dump_constraints (dump_file, from);
6949           fprintf (dump_file, "\n");
6950         }
6951       from = VEC_length (constraint_t, constraints);
6952     }
6953
6954   /* From the constraints compute the points-to sets.  */
6955   solve_constraints ();
6956
6957   /* Compute the global points-to sets for ESCAPED.
6958      ???  Note that the computed escape set is not correct
6959      for the whole unit as we fail to consider graph edges to
6960      externally visible functions.  */
6961   find_what_var_points_to (get_varinfo (escaped_id), &ipa_escaped_pt);
6962
6963   /* Make sure the ESCAPED solution (which is used as placeholder in
6964      other solutions) does not reference itself.  This simplifies
6965      points-to solution queries.  */
6966   ipa_escaped_pt.ipa_escaped = 0;
6967
6968   /* Assign the points-to sets to the SSA names in the unit.  */
6969   for (node = cgraph_nodes; node; node = node->next)
6970     {
6971       tree ptr;
6972       struct function *fn;
6973       unsigned i;
6974       varinfo_t fi;
6975       basic_block bb;
6976       struct pt_solution uses, clobbers;
6977       struct cgraph_edge *e;
6978
6979       /* Nodes without a body are not interesting.  */
6980       if (!cgraph_function_with_gimple_body_p (node))
6981         continue;
6982
6983       fn = DECL_STRUCT_FUNCTION (node->decl);
6984
6985       /* Compute the points-to sets for pointer SSA_NAMEs.  */
6986       FOR_EACH_VEC_ELT (tree, fn->gimple_df->ssa_names, i, ptr)
6987         {
6988           if (ptr
6989               && POINTER_TYPE_P (TREE_TYPE (ptr)))
6990             find_what_p_points_to (ptr);
6991         }
6992
6993       /* Compute the call-use and call-clobber sets for all direct calls.  */
6994       fi = lookup_vi_for_tree (node->decl);
6995       gcc_assert (fi->is_fn_info);
6996       find_what_var_points_to (first_vi_for_offset (fi, fi_clobbers),
6997                                &clobbers);
6998       find_what_var_points_to (first_vi_for_offset (fi, fi_uses), &uses);
6999       for (e = node->callers; e; e = e->next_caller)
7000         {
7001           if (!e->call_stmt)
7002             continue;
7003
7004           *gimple_call_clobber_set (e->call_stmt) = clobbers;
7005           *gimple_call_use_set (e->call_stmt) = uses;
7006         }
7007
7008       /* Compute the call-use and call-clobber sets for indirect calls
7009          and calls to external functions.  */
7010       FOR_EACH_BB_FN (bb, fn)
7011         {
7012           gimple_stmt_iterator gsi;
7013
7014           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
7015             {
7016               gimple stmt = gsi_stmt (gsi);
7017               struct pt_solution *pt;
7018               varinfo_t vi;
7019               tree decl;
7020
7021               if (!is_gimple_call (stmt))
7022                 continue;
7023
7024               /* Handle direct calls to external functions.  */
7025               decl = gimple_call_fndecl (stmt);
7026               if (decl
7027                   && (!(fi = lookup_vi_for_tree (decl))
7028                       || !fi->is_fn_info))
7029                 {
7030                   pt = gimple_call_use_set (stmt);
7031                   if (gimple_call_flags (stmt) & ECF_CONST)
7032                     memset (pt, 0, sizeof (struct pt_solution));
7033                   else if ((vi = lookup_call_use_vi (stmt)) != NULL)
7034                     {
7035                       find_what_var_points_to (vi, pt);
7036                       /* Escaped (and thus nonlocal) variables are always
7037                          implicitly used by calls.  */
7038                       /* ???  ESCAPED can be empty even though NONLOCAL
7039                          always escaped.  */
7040                       pt->nonlocal = 1;
7041                       pt->ipa_escaped = 1;
7042                     }
7043                   else
7044                     {
7045                       /* If there is nothing special about this call then
7046                          we have made everything that is used also escape.  */
7047                       *pt = ipa_escaped_pt;
7048                       pt->nonlocal = 1;
7049                     }
7050
7051                   pt = gimple_call_clobber_set (stmt);
7052                   if (gimple_call_flags (stmt) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
7053                     memset (pt, 0, sizeof (struct pt_solution));
7054                   else if ((vi = lookup_call_clobber_vi (stmt)) != NULL)
7055                     {
7056                       find_what_var_points_to (vi, pt);
7057                       /* Escaped (and thus nonlocal) variables are always
7058                          implicitly clobbered by calls.  */
7059                       /* ???  ESCAPED can be empty even though NONLOCAL
7060                          always escaped.  */
7061                       pt->nonlocal = 1;
7062                       pt->ipa_escaped = 1;
7063                     }
7064                   else
7065                     {
7066                       /* If there is nothing special about this call then
7067                          we have made everything that is used also escape.  */
7068                       *pt = ipa_escaped_pt;
7069                       pt->nonlocal = 1;
7070                     }
7071                 }
7072
7073               /* Handle indirect calls.  */
7074               if (!decl
7075                   && (fi = get_fi_for_callee (stmt)))
7076                 {
7077                   /* We need to accumulate all clobbers/uses of all possible
7078                      callees.  */
7079                   fi = get_varinfo (find (fi->id));
7080                   /* If we cannot constrain the set of functions we'll end up
7081                      calling we end up using/clobbering everything.  */
7082                   if (bitmap_bit_p (fi->solution, anything_id)
7083                       || bitmap_bit_p (fi->solution, nonlocal_id)
7084                       || bitmap_bit_p (fi->solution, escaped_id))
7085                     {
7086                       pt_solution_reset (gimple_call_clobber_set (stmt));
7087                       pt_solution_reset (gimple_call_use_set (stmt));
7088                     }
7089                   else
7090                     {
7091                       bitmap_iterator bi;
7092                       unsigned i;
7093                       struct pt_solution *uses, *clobbers;
7094
7095                       uses = gimple_call_use_set (stmt);
7096                       clobbers = gimple_call_clobber_set (stmt);
7097                       memset (uses, 0, sizeof (struct pt_solution));
7098                       memset (clobbers, 0, sizeof (struct pt_solution));
7099                       EXECUTE_IF_SET_IN_BITMAP (fi->solution, 0, i, bi)
7100                         {
7101                           struct pt_solution sol;
7102
7103                           vi = get_varinfo (i);
7104                           if (!vi->is_fn_info)
7105                             {
7106                               /* ???  We could be more precise here?  */
7107                               uses->nonlocal = 1;
7108                               uses->ipa_escaped = 1;
7109                               clobbers->nonlocal = 1;
7110                               clobbers->ipa_escaped = 1;
7111                               continue;
7112                             }
7113
7114                           if (!uses->anything)
7115                             {
7116                               find_what_var_points_to
7117                                   (first_vi_for_offset (vi, fi_uses), &sol);
7118                               pt_solution_ior_into (uses, &sol);
7119                             }
7120                           if (!clobbers->anything)
7121                             {
7122                               find_what_var_points_to
7123                                   (first_vi_for_offset (vi, fi_clobbers), &sol);
7124                               pt_solution_ior_into (clobbers, &sol);
7125                             }
7126                         }
7127                     }
7128                 }
7129             }
7130         }
7131
7132       fn->gimple_df->ipa_pta = true;
7133     }
7134
7135   delete_points_to_sets ();
7136
7137   in_ipa_mode = 0;
7138
7139   return 0;
7140 }
7141
7142 struct simple_ipa_opt_pass pass_ipa_pta =
7143 {
7144  {
7145   SIMPLE_IPA_PASS,
7146   "pta",                                /* name */
7147   gate_ipa_pta,                 /* gate */
7148   ipa_pta_execute,                      /* execute */
7149   NULL,                                 /* sub */
7150   NULL,                                 /* next */
7151   0,                                    /* static_pass_number */
7152   TV_IPA_PTA,                   /* tv_id */
7153   0,                                    /* properties_required */
7154   0,                                    /* properties_provided */
7155   0,                                    /* properties_destroyed */
7156   0,                                    /* todo_flags_start */
7157   TODO_update_ssa                       /* todo_flags_finish */
7158  }
7159 };