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