OSDN Git Service

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