OSDN Git Service

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