OSDN Git Service

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