1 /* Tree based points-to analysis
2 Copyright (C) 2005, 2006 Free Software Foundation, Inc.
3 Contributed by Daniel Berlin <dberlin@dberlin.org>
5 This file is part of GCC.
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 2 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with GCC; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "coretypes.h"
32 #include "hard-reg-set.h"
33 #include "basic-block.h"
36 #include "diagnostic.h"
39 #include "tree-flow.h"
40 #include "tree-inline.h"
43 #include "tree-gimple.h"
47 #include "tree-pass.h"
49 #include "alloc-pool.h"
50 #include "splay-tree.h"
52 #include "tree-ssa-structalias.h"
54 #include "pointer-set.h"
56 /* The idea behind this analyzer is to generate set constraints from the
57 program, then solve the resulting constraints in order to generate the
60 Set constraints are a way of modeling program analysis problems that
61 involve sets. They consist of an inclusion constraint language,
62 describing the variables (each variable is a set) and operations that
63 are involved on the variables, and a set of rules that derive facts
64 from these operations. To solve a system of set constraints, you derive
65 all possible facts under the rules, which gives you the correct sets
68 See "Efficient Field-sensitive pointer analysis for C" by "David
69 J. Pearce and Paul H. J. Kelly and Chris Hankin, at
70 http://citeseer.ist.psu.edu/pearce04efficient.html
72 Also see "Ultra-fast Aliasing Analysis using CLA: A Million Lines
73 of C Code in a Second" by ""Nevin Heintze and Olivier Tardieu" at
74 http://citeseer.ist.psu.edu/heintze01ultrafast.html
76 There are three types of real constraint expressions, DEREF,
77 ADDRESSOF, and SCALAR. Each constraint expression consists
78 of a constraint type, a variable, and an offset.
80 SCALAR is a constraint expression type used to represent x, whether
81 it appears on the LHS or the RHS of a statement.
82 DEREF is a constraint expression type used to represent *x, whether
83 it appears on the LHS or the RHS of a statement.
84 ADDRESSOF is a constraint expression used to represent &x, whether
85 it appears on the LHS or the RHS of a statement.
87 Each pointer variable in the program is assigned an integer id, and
88 each field of a structure variable is assigned an integer id as well.
90 Structure variables are linked to their list of fields through a "next
91 field" in each variable that points to the next field in offset
93 Each variable for a structure field has
95 1. "size", that tells the size in bits of that field.
96 2. "fullsize, that tells the size in bits of the entire structure.
97 3. "offset", that tells the offset in bits from the beginning of the
98 structure to this field.
110 foo.a -> id 1, size 32, offset 0, fullsize 64, next foo.b
111 foo.b -> id 2, size 32, offset 32, fullsize 64, next NULL
112 bar -> id 3, size 32, offset 0, fullsize 32, next NULL
115 In order to solve the system of set constraints, the following is
118 1. Each constraint variable x has a solution set associated with it,
121 2. Constraints are separated into direct, copy, and complex.
122 Direct constraints are ADDRESSOF constraints that require no extra
123 processing, such as P = &Q
124 Copy constraints are those of the form P = Q.
125 Complex constraints are all the constraints involving dereferences
126 and offsets (including offsetted copies).
128 3. All direct constraints of the form P = &Q are processed, such
129 that Q is added to Sol(P)
131 4. All complex constraints for a given constraint variable are stored in a
132 linked list attached to that variable's node.
134 5. A directed graph is built out of the copy constraints. Each
135 constraint variable is a node in the graph, and an edge from
136 Q to P is added for each copy constraint of the form P = Q
138 6. The graph is then walked, and solution sets are
139 propagated along the copy edges, such that an edge from Q to P
140 causes Sol(P) <- Sol(P) union Sol(Q).
142 7. As we visit each node, all complex constraints associated with
143 that node are processed by adding appropriate copy edges to the graph, or the
144 appropriate variables to the solution set.
146 8. The process of walking the graph is iterated until no solution
149 Prior to walking the graph in steps 6 and 7, We perform static
150 cycle elimination on the constraint graph, as well
151 as off-line variable substitution.
153 TODO: Adding offsets to pointer-to-structures can be handled (IE not punted
154 on and turned into anything), but isn't. You can just see what offset
155 inside the pointed-to struct it's going to access.
157 TODO: Constant bounded arrays can be handled as if they were structs of the
158 same number of elements.
160 TODO: Modeling heap and incoming pointers becomes much better if we
161 add fields to them as we discover them, which we could do.
163 TODO: We could handle unions, but to be honest, it's probably not
164 worth the pain or slowdown. */
166 static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map
))) htab_t heapvar_for_stmt
;
168 /* One variable to represent all non-local accesses. */
171 static bool use_field_sensitive
= true;
172 static int in_ipa_mode
= 0;
174 /* Used for predecessor bitmaps. */
175 static bitmap_obstack predbitmap_obstack
;
177 /* Used for points-to sets. */
178 static bitmap_obstack pta_obstack
;
180 /* Used for oldsolution members of variables. */
181 static bitmap_obstack oldpta_obstack
;
183 /* Used for per-solver-iteration bitmaps. */
184 static bitmap_obstack iteration_obstack
;
186 static unsigned int create_variable_info_for (tree
, const char *);
187 typedef struct constraint_graph
*constraint_graph_t
;
188 static void unify_nodes (constraint_graph_t
, unsigned int, unsigned int, bool);
190 DEF_VEC_P(constraint_t
);
191 DEF_VEC_ALLOC_P(constraint_t
,heap
);
193 #define EXECUTE_IF_IN_NONNULL_BITMAP(a, b, c, d) \
195 EXECUTE_IF_SET_IN_BITMAP (a, b, c, d)
197 static struct constraint_stats
199 unsigned int total_vars
;
200 unsigned int nonpointer_vars
;
201 unsigned int unified_vars_static
;
202 unsigned int unified_vars_dynamic
;
203 unsigned int iterations
;
204 unsigned int num_edges
;
205 unsigned int num_implicit_edges
;
206 unsigned int points_to_sets_created
;
211 /* ID of this variable */
214 /* Name of this variable */
217 /* Tree that this variable is associated with. */
220 /* Offset of this variable, in bits, from the base variable */
221 unsigned HOST_WIDE_INT offset
;
223 /* Size of the variable, in bits. */
224 unsigned HOST_WIDE_INT size
;
226 /* Full size of the base variable, in bits. */
227 unsigned HOST_WIDE_INT fullsize
;
229 /* A link to the variable for the next field in this structure. */
230 struct variable_info
*next
;
232 /* True if the variable is directly the target of a dereference.
233 This is used to track which variables are *actually* dereferenced
234 so we can prune their points to listed. */
235 unsigned int directly_dereferenced
:1;
237 /* True if this is a variable created by the constraint analysis, such as
238 heap variables and constraints we had to break up. */
239 unsigned int is_artificial_var
:1;
241 /* True if this is a special variable whose solution set should not be
243 unsigned int is_special_var
:1;
245 /* True for variables whose size is not known or variable. */
246 unsigned int is_unknown_size_var
:1;
248 /* True for variables that have unions somewhere in them. */
249 unsigned int has_union
:1;
251 /* True if this is a heap variable. */
252 unsigned int is_heap_var
:1;
254 /* Points-to set for this variable. */
257 /* Old points-to set for this variable. */
260 /* Variable ids represented by this node. */
263 /* Variable id this was collapsed to due to type unsafety. This
264 should be unused completely after build_succ_graph, or something
266 struct variable_info
*collapsed_to
;
268 typedef struct variable_info
*varinfo_t
;
270 static varinfo_t
first_vi_for_offset (varinfo_t
, unsigned HOST_WIDE_INT
);
272 /* Pool of variable info structures. */
273 static alloc_pool variable_info_pool
;
275 DEF_VEC_P(varinfo_t
);
277 DEF_VEC_ALLOC_P(varinfo_t
, heap
);
279 /* Table of variable info structures for constraint variables.
280 Indexed directly by variable info id. */
281 static VEC(varinfo_t
,heap
) *varmap
;
283 /* Return the varmap element N */
285 static inline varinfo_t
286 get_varinfo (unsigned int n
)
288 return VEC_index (varinfo_t
, varmap
, n
);
291 /* Return the varmap element N, following the collapsed_to link. */
293 static inline varinfo_t
294 get_varinfo_fc (unsigned int n
)
296 varinfo_t v
= VEC_index (varinfo_t
, varmap
, n
);
299 return v
->collapsed_to
;
303 /* Variable that represents the unknown pointer. */
304 static varinfo_t var_anything
;
305 static tree anything_tree
;
306 static unsigned int anything_id
;
308 /* Variable that represents the NULL pointer. */
309 static varinfo_t var_nothing
;
310 static tree nothing_tree
;
311 static unsigned int nothing_id
;
313 /* Variable that represents read only memory. */
314 static varinfo_t var_readonly
;
315 static tree readonly_tree
;
316 static unsigned int readonly_id
;
318 /* Variable that represents integers. This is used for when people do things
320 static varinfo_t var_integer
;
321 static tree integer_tree
;
322 static unsigned int integer_id
;
324 /* Variable that represents escaped variables. This is used to give
325 incoming pointer variables a better set than ANYTHING. */
326 static varinfo_t var_escaped_vars
;
327 static tree escaped_vars_tree
;
328 static unsigned int escaped_vars_id
;
330 /* Variable that represents non-local variables before we expand it to
331 one for each type. */
332 static unsigned int nonlocal_vars_id
;
333 /* Lookup a heap var for FROM, and return it if we find one. */
336 heapvar_lookup (tree from
)
338 struct tree_map
*h
, in
;
341 h
= htab_find_with_hash (heapvar_for_stmt
, &in
, htab_hash_pointer (from
));
347 /* Insert a mapping FROM->TO in the heap var for statement
351 heapvar_insert (tree from
, tree to
)
356 h
= ggc_alloc (sizeof (struct tree_map
));
357 h
->hash
= htab_hash_pointer (from
);
360 loc
= htab_find_slot_with_hash (heapvar_for_stmt
, h
, h
->hash
, INSERT
);
361 *(struct tree_map
**) loc
= h
;
364 /* Return a new variable info structure consisting for a variable
365 named NAME, and using constraint graph node NODE. */
368 new_var_info (tree t
, unsigned int id
, const char *name
)
370 varinfo_t ret
= pool_alloc (variable_info_pool
);
375 ret
->directly_dereferenced
= false;
376 ret
->is_artificial_var
= false;
377 ret
->is_heap_var
= false;
378 ret
->is_special_var
= false;
379 ret
->is_unknown_size_var
= false;
380 ret
->has_union
= false;
381 ret
->solution
= BITMAP_ALLOC (&pta_obstack
);
382 ret
->oldsolution
= BITMAP_ALLOC (&oldpta_obstack
);
384 ret
->collapsed_to
= NULL
;
388 typedef enum {SCALAR
, DEREF
, ADDRESSOF
} constraint_expr_type
;
390 /* An expression that appears in a constraint. */
392 struct constraint_expr
394 /* Constraint type. */
395 constraint_expr_type type
;
397 /* Variable we are referring to in the constraint. */
400 /* Offset, in bits, of this constraint from the beginning of
401 variables it ends up referring to.
403 IOW, in a deref constraint, we would deref, get the result set,
404 then add OFFSET to each member. */
405 unsigned HOST_WIDE_INT offset
;
408 typedef struct constraint_expr ce_s
;
410 DEF_VEC_ALLOC_O(ce_s
, heap
);
411 static void get_constraint_for (tree
, VEC(ce_s
, heap
) **);
412 static void do_deref (VEC (ce_s
, heap
) **);
414 /* Our set constraints are made up of two constraint expressions, one
417 As described in the introduction, our set constraints each represent an
418 operation between set valued variables.
422 struct constraint_expr lhs
;
423 struct constraint_expr rhs
;
426 /* List of constraints that we use to build the constraint graph from. */
428 static VEC(constraint_t
,heap
) *constraints
;
429 static alloc_pool constraint_pool
;
433 DEF_VEC_ALLOC_I(int, heap
);
435 /* The constraint graph is represented as an array of bitmaps
436 containing successor nodes. */
438 struct constraint_graph
440 /* Size of this graph, which may be different than the number of
441 nodes in the variable map. */
444 /* Explicit successors of each node. */
447 /* Implicit predecessors of each node (Used for variable
449 bitmap
*implicit_preds
;
451 /* Explicit predecessors of each node (Used for variable substitution). */
454 /* Indirect cycle representatives, or -1 if the node has no indirect
456 int *indirect_cycles
;
458 /* Representative node for a node. rep[a] == a unless the node has
462 /* Equivalence class representative for a node. This is used for
463 variable substitution. */
466 /* Label for each node, used during variable substitution. */
469 /* Bitmap of nodes where the bit is set if the node is a direct
470 node. Used for variable substitution. */
471 sbitmap direct_nodes
;
473 /* Vector of complex constraints for each graph node. Complex
474 constraints are those involving dereferences or offsets that are
476 VEC(constraint_t
,heap
) **complex;
479 static constraint_graph_t graph
;
481 /* During variable substitution and the offline version of indirect
482 cycle finding, we create nodes to represent dereferences and
483 address taken constraints. These represent where these start and
485 #define FIRST_REF_NODE (VEC_length (varinfo_t, varmap))
486 #define LAST_REF_NODE (FIRST_REF_NODE + (FIRST_REF_NODE - 1))
487 #define FIRST_ADDR_NODE (LAST_REF_NODE + 1)
489 /* Return the representative node for NODE, if NODE has been unioned
491 This function performs path compression along the way to finding
492 the representative. */
495 find (unsigned int node
)
497 gcc_assert (node
< graph
->size
);
498 if (graph
->rep
[node
] != node
)
499 return graph
->rep
[node
] = find (graph
->rep
[node
]);
503 /* Union the TO and FROM nodes to the TO nodes.
504 Note that at some point in the future, we may want to do
505 union-by-rank, in which case we are going to have to return the
506 node we unified to. */
509 unite (unsigned int to
, unsigned int from
)
511 gcc_assert (to
< graph
->size
&& from
< graph
->size
);
512 if (to
!= from
&& graph
->rep
[from
] != to
)
514 graph
->rep
[from
] = to
;
520 /* Create a new constraint consisting of LHS and RHS expressions. */
523 new_constraint (const struct constraint_expr lhs
,
524 const struct constraint_expr rhs
)
526 constraint_t ret
= pool_alloc (constraint_pool
);
532 /* Print out constraint C to FILE. */
535 dump_constraint (FILE *file
, constraint_t c
)
537 if (c
->lhs
.type
== ADDRESSOF
)
539 else if (c
->lhs
.type
== DEREF
)
541 fprintf (file
, "%s", get_varinfo_fc (c
->lhs
.var
)->name
);
542 if (c
->lhs
.offset
!= 0)
543 fprintf (file
, " + " HOST_WIDE_INT_PRINT_DEC
, c
->lhs
.offset
);
544 fprintf (file
, " = ");
545 if (c
->rhs
.type
== ADDRESSOF
)
547 else if (c
->rhs
.type
== DEREF
)
549 fprintf (file
, "%s", get_varinfo_fc (c
->rhs
.var
)->name
);
550 if (c
->rhs
.offset
!= 0)
551 fprintf (file
, " + " HOST_WIDE_INT_PRINT_DEC
, c
->rhs
.offset
);
552 fprintf (file
, "\n");
555 /* Print out constraint C to stderr. */
558 debug_constraint (constraint_t c
)
560 dump_constraint (stderr
, c
);
563 /* Print out all constraints to FILE */
566 dump_constraints (FILE *file
)
570 for (i
= 0; VEC_iterate (constraint_t
, constraints
, i
, c
); i
++)
571 dump_constraint (file
, c
);
574 /* Print out all constraints to stderr. */
577 debug_constraints (void)
579 dump_constraints (stderr
);
584 The solver is a simple worklist solver, that works on the following
587 sbitmap changed_nodes = all zeroes;
589 For each node that is not already collapsed:
591 set bit in changed nodes
593 while (changed_count > 0)
595 compute topological ordering for constraint graph
597 find and collapse cycles in the constraint graph (updating
598 changed if necessary)
600 for each node (n) in the graph in topological order:
603 Process each complex constraint associated with the node,
604 updating changed if necessary.
606 For each outgoing edge from n, propagate the solution from n to
607 the destination of the edge, updating changed as necessary.
611 /* Return true if two constraint expressions A and B are equal. */
614 constraint_expr_equal (struct constraint_expr a
, struct constraint_expr b
)
616 return a
.type
== b
.type
&& a
.var
== b
.var
&& a
.offset
== b
.offset
;
619 /* Return true if constraint expression A is less than constraint expression
620 B. This is just arbitrary, but consistent, in order to give them an
624 constraint_expr_less (struct constraint_expr a
, struct constraint_expr b
)
626 if (a
.type
== b
.type
)
629 return a
.offset
< b
.offset
;
631 return a
.var
< b
.var
;
634 return a
.type
< b
.type
;
637 /* Return true if constraint A is less than constraint B. This is just
638 arbitrary, but consistent, in order to give them an ordering. */
641 constraint_less (const constraint_t a
, const constraint_t b
)
643 if (constraint_expr_less (a
->lhs
, b
->lhs
))
645 else if (constraint_expr_less (b
->lhs
, a
->lhs
))
648 return constraint_expr_less (a
->rhs
, b
->rhs
);
651 /* Return true if two constraints A and B are equal. */
654 constraint_equal (struct constraint a
, struct constraint b
)
656 return constraint_expr_equal (a
.lhs
, b
.lhs
)
657 && constraint_expr_equal (a
.rhs
, b
.rhs
);
661 /* Find a constraint LOOKFOR in the sorted constraint vector VEC */
664 constraint_vec_find (VEC(constraint_t
,heap
) *vec
,
665 struct constraint lookfor
)
673 place
= VEC_lower_bound (constraint_t
, vec
, &lookfor
, constraint_less
);
674 if (place
>= VEC_length (constraint_t
, vec
))
676 found
= VEC_index (constraint_t
, vec
, place
);
677 if (!constraint_equal (*found
, lookfor
))
682 /* Union two constraint vectors, TO and FROM. Put the result in TO. */
685 constraint_set_union (VEC(constraint_t
,heap
) **to
,
686 VEC(constraint_t
,heap
) **from
)
691 for (i
= 0; VEC_iterate (constraint_t
, *from
, i
, c
); i
++)
693 if (constraint_vec_find (*to
, *c
) == NULL
)
695 unsigned int place
= VEC_lower_bound (constraint_t
, *to
, c
,
697 VEC_safe_insert (constraint_t
, heap
, *to
, place
, c
);
702 /* Take a solution set SET, add OFFSET to each member of the set, and
703 overwrite SET with the result when done. */
706 solution_set_add (bitmap set
, unsigned HOST_WIDE_INT offset
)
708 bitmap result
= BITMAP_ALLOC (&iteration_obstack
);
711 unsigned HOST_WIDE_INT min
= -1, max
= 0;
713 /* Compute set of vars we can reach from set + offset. */
715 EXECUTE_IF_SET_IN_BITMAP (set
, 0, i
, bi
)
717 if (get_varinfo (i
)->is_artificial_var
718 || get_varinfo (i
)->has_union
719 || get_varinfo (i
)->is_unknown_size_var
)
722 if (get_varinfo (i
)->offset
+ offset
< min
)
723 min
= get_varinfo (i
)->offset
+ offset
;
724 if (get_varinfo (i
)->offset
+ get_varinfo (i
)->size
+ offset
> max
)
726 max
= get_varinfo (i
)->offset
+ get_varinfo (i
)->size
+ offset
;
727 if (max
> get_varinfo (i
)->fullsize
)
728 max
= get_varinfo (i
)->fullsize
;
732 EXECUTE_IF_SET_IN_BITMAP (set
, 0, i
, bi
)
734 /* If this is a properly sized variable, only add offset if it's
735 less than end. Otherwise, it is globbed to a single
738 if (get_varinfo (i
)->offset
+ get_varinfo (i
)->size
- 1 >= min
739 && get_varinfo (i
)->offset
< max
)
741 bitmap_set_bit (result
, i
);
743 else if (get_varinfo (i
)->is_artificial_var
744 || get_varinfo (i
)->has_union
745 || get_varinfo (i
)->is_unknown_size_var
)
747 bitmap_set_bit (result
, i
);
751 bitmap_copy (set
, result
);
752 BITMAP_FREE (result
);
755 /* Union solution sets TO and FROM, and add INC to each member of FROM in the
759 set_union_with_increment (bitmap to
, bitmap from
, unsigned HOST_WIDE_INT inc
)
762 return bitmap_ior_into (to
, from
);
768 tmp
= BITMAP_ALLOC (&iteration_obstack
);
769 bitmap_copy (tmp
, from
);
770 solution_set_add (tmp
, inc
);
771 res
= bitmap_ior_into (to
, tmp
);
777 /* Insert constraint C into the list of complex constraints for graph
781 insert_into_complex (constraint_graph_t graph
,
782 unsigned int var
, constraint_t c
)
784 VEC (constraint_t
, heap
) *complex = graph
->complex[var
];
785 unsigned int place
= VEC_lower_bound (constraint_t
, complex, c
,
788 /* Only insert constraints that do not already exist. */
789 if (place
>= VEC_length (constraint_t
, complex)
790 || !constraint_equal (*c
, *VEC_index (constraint_t
, complex, place
)))
791 VEC_safe_insert (constraint_t
, heap
, graph
->complex[var
], place
, c
);
795 /* Condense two variable nodes into a single variable node, by moving
796 all associated info from SRC to TO. */
799 merge_node_constraints (constraint_graph_t graph
, unsigned int to
,
805 gcc_assert (find (from
) == to
);
807 /* Move all complex constraints from src node into to node */
808 for (i
= 0; VEC_iterate (constraint_t
, graph
->complex[from
], i
, c
); i
++)
810 /* In complex constraints for node src, we may have either
811 a = *src, and *src = a, or an offseted constraint which are
812 always added to the rhs node's constraints. */
814 if (c
->rhs
.type
== DEREF
)
816 else if (c
->lhs
.type
== DEREF
)
821 constraint_set_union (&graph
->complex[to
], &graph
->complex[from
]);
822 VEC_free (constraint_t
, heap
, graph
->complex[from
]);
823 graph
->complex[from
] = NULL
;
827 /* Remove edges involving NODE from GRAPH. */
830 clear_edges_for_node (constraint_graph_t graph
, unsigned int node
)
832 if (graph
->succs
[node
])
833 BITMAP_FREE (graph
->succs
[node
]);
836 /* Merge GRAPH nodes FROM and TO into node TO. */
839 merge_graph_nodes (constraint_graph_t graph
, unsigned int to
,
842 if (graph
->indirect_cycles
[from
] != -1)
844 /* If we have indirect cycles with the from node, and we have
845 none on the to node, the to node has indirect cycles from the
846 from node now that they are unified.
847 If indirect cycles exist on both, unify the nodes that they
848 are in a cycle with, since we know they are in a cycle with
850 if (graph
->indirect_cycles
[to
] == -1)
852 graph
->indirect_cycles
[to
] = graph
->indirect_cycles
[from
];
856 unsigned int tonode
= find (graph
->indirect_cycles
[to
]);
857 unsigned int fromnode
= find (graph
->indirect_cycles
[from
]);
859 if (unite (tonode
, fromnode
))
860 unify_nodes (graph
, tonode
, fromnode
, true);
864 /* Merge all the successor edges. */
865 if (graph
->succs
[from
])
867 if (!graph
->succs
[to
])
868 graph
->succs
[to
] = BITMAP_ALLOC (&pta_obstack
);
869 bitmap_ior_into (graph
->succs
[to
],
873 clear_edges_for_node (graph
, from
);
877 /* Add an indirect graph edge to GRAPH, going from TO to FROM if
878 it doesn't exist in the graph already. */
881 add_implicit_graph_edge (constraint_graph_t graph
, unsigned int to
,
887 if (!graph
->implicit_preds
[to
])
888 graph
->implicit_preds
[to
] = BITMAP_ALLOC (&predbitmap_obstack
);
890 if (!bitmap_bit_p (graph
->implicit_preds
[to
], from
))
892 stats
.num_implicit_edges
++;
893 bitmap_set_bit (graph
->implicit_preds
[to
], from
);
897 /* Add a predecessor graph edge to GRAPH, going from TO to FROM if
898 it doesn't exist in the graph already.
899 Return false if the edge already existed, true otherwise. */
902 add_pred_graph_edge (constraint_graph_t graph
, unsigned int to
,
905 if (!graph
->preds
[to
])
906 graph
->preds
[to
] = BITMAP_ALLOC (&predbitmap_obstack
);
907 if (!bitmap_bit_p (graph
->preds
[to
], from
))
908 bitmap_set_bit (graph
->preds
[to
], from
);
911 /* Add a graph edge to GRAPH, going from FROM to TO if
912 it doesn't exist in the graph already.
913 Return false if the edge already existed, true otherwise. */
916 add_graph_edge (constraint_graph_t graph
, unsigned int to
,
927 if (!graph
->succs
[from
])
928 graph
->succs
[from
] = BITMAP_ALLOC (&pta_obstack
);
929 if (!bitmap_bit_p (graph
->succs
[from
], to
))
932 if (to
< FIRST_REF_NODE
&& from
< FIRST_REF_NODE
)
934 bitmap_set_bit (graph
->succs
[from
], to
);
941 /* Return true if {DEST.SRC} is an existing graph edge in GRAPH. */
944 valid_graph_edge (constraint_graph_t graph
, unsigned int src
,
947 return (graph
->succs
[dest
]
948 && bitmap_bit_p (graph
->succs
[dest
], src
));
951 /* Build the constraint graph, adding only predecessor edges right now. */
954 build_pred_graph (void)
960 graph
= XNEW (struct constraint_graph
);
961 graph
->size
= (VEC_length (varinfo_t
, varmap
)) * 3;
962 graph
->succs
= XCNEWVEC (bitmap
, graph
->size
);
963 graph
->implicit_preds
= XCNEWVEC (bitmap
, graph
->size
);
964 graph
->preds
= XCNEWVEC (bitmap
, graph
->size
);
965 graph
->indirect_cycles
= XNEWVEC (int, VEC_length (varinfo_t
, varmap
));
966 graph
->label
= XCNEWVEC (unsigned int, graph
->size
);
967 graph
->rep
= XNEWVEC (unsigned int, graph
->size
);
968 graph
->eq_rep
= XNEWVEC (int, graph
->size
);
969 graph
->complex = XCNEWVEC (VEC(constraint_t
, heap
) *,
970 VEC_length (varinfo_t
, varmap
));
971 graph
->direct_nodes
= sbitmap_alloc (graph
->size
);
972 sbitmap_zero (graph
->direct_nodes
);
974 for (j
= 0; j
< FIRST_REF_NODE
; j
++)
976 if (!get_varinfo (j
)->is_special_var
)
977 SET_BIT (graph
->direct_nodes
, j
);
980 for (j
= 0; j
< graph
->size
; j
++)
983 graph
->eq_rep
[j
] = -1;
986 for (j
= 0; j
< VEC_length (varinfo_t
, varmap
); j
++)
987 graph
->indirect_cycles
[j
] = -1;
989 for (i
= 0; VEC_iterate (constraint_t
, constraints
, i
, c
); i
++)
991 struct constraint_expr lhs
= c
->lhs
;
992 struct constraint_expr rhs
= c
->rhs
;
993 unsigned int lhsvar
= get_varinfo_fc (lhs
.var
)->id
;
994 unsigned int rhsvar
= get_varinfo_fc (rhs
.var
)->id
;
996 if (lhs
.type
== DEREF
)
999 if (rhs
.offset
== 0 && lhs
.offset
== 0 && rhs
.type
== SCALAR
)
1000 add_pred_graph_edge (graph
, FIRST_REF_NODE
+ lhsvar
, rhsvar
);
1001 if (rhs
.type
== ADDRESSOF
)
1002 RESET_BIT (graph
->direct_nodes
, rhsvar
);
1004 else if (rhs
.type
== DEREF
)
1007 if (rhs
.offset
== 0 && lhs
.offset
== 0 && lhs
.type
== SCALAR
)
1008 add_pred_graph_edge (graph
, lhsvar
, FIRST_REF_NODE
+ rhsvar
);
1010 RESET_BIT (graph
->direct_nodes
, lhsvar
);
1012 else if (rhs
.type
== ADDRESSOF
)
1015 add_pred_graph_edge (graph
, lhsvar
, FIRST_ADDR_NODE
+ rhsvar
);
1016 /* Implicitly, *x = y */
1017 add_implicit_graph_edge (graph
, FIRST_REF_NODE
+ lhsvar
, rhsvar
);
1019 RESET_BIT (graph
->direct_nodes
, rhsvar
);
1021 else if (lhsvar
> anything_id
1022 && lhsvar
!= rhsvar
&& lhs
.offset
== 0 && rhs
.offset
== 0)
1025 add_pred_graph_edge (graph
, lhsvar
, rhsvar
);
1026 /* Implicitly, *x = *y */
1027 add_implicit_graph_edge (graph
, FIRST_REF_NODE
+ lhsvar
,
1028 FIRST_REF_NODE
+ rhsvar
);
1030 else if (lhs
.offset
!= 0 || rhs
.offset
!= 0)
1032 if (rhs
.offset
!= 0)
1033 RESET_BIT (graph
->direct_nodes
, lhs
.var
);
1034 if (lhs
.offset
!= 0)
1035 RESET_BIT (graph
->direct_nodes
, rhs
.var
);
1040 /* Build the constraint graph, adding successor edges. */
1043 build_succ_graph (void)
1048 for (i
= 0; VEC_iterate (constraint_t
, constraints
, i
, c
); i
++)
1050 struct constraint_expr lhs
;
1051 struct constraint_expr rhs
;
1052 unsigned int lhsvar
;
1053 unsigned int rhsvar
;
1060 lhsvar
= find (get_varinfo_fc (lhs
.var
)->id
);
1061 rhsvar
= find (get_varinfo_fc (rhs
.var
)->id
);
1063 if (lhs
.type
== DEREF
)
1065 if (rhs
.offset
== 0 && lhs
.offset
== 0 && rhs
.type
== SCALAR
)
1066 add_graph_edge (graph
, FIRST_REF_NODE
+ lhsvar
, rhsvar
);
1068 else if (rhs
.type
== DEREF
)
1070 if (rhs
.offset
== 0 && lhs
.offset
== 0 && lhs
.type
== SCALAR
)
1071 add_graph_edge (graph
, lhsvar
, FIRST_REF_NODE
+ rhsvar
);
1073 else if (rhs
.type
== ADDRESSOF
)
1076 gcc_assert (find (get_varinfo_fc (rhs
.var
)->id
)
1077 == get_varinfo_fc (rhs
.var
)->id
);
1078 bitmap_set_bit (get_varinfo (lhsvar
)->solution
, rhsvar
);
1080 else if (lhsvar
> anything_id
1081 && lhsvar
!= rhsvar
&& lhs
.offset
== 0 && rhs
.offset
== 0)
1083 add_graph_edge (graph
, lhsvar
, rhsvar
);
1089 /* Changed variables on the last iteration. */
1090 static unsigned int changed_count
;
1091 static sbitmap changed
;
1093 DEF_VEC_I(unsigned);
1094 DEF_VEC_ALLOC_I(unsigned,heap
);
1097 /* Strongly Connected Component visitation info. */
1104 unsigned int *node_mapping
;
1106 VEC(unsigned,heap
) *scc_stack
;
1110 /* Recursive routine to find strongly connected components in GRAPH.
1111 SI is the SCC info to store the information in, and N is the id of current
1112 graph node we are processing.
1114 This is Tarjan's strongly connected component finding algorithm, as
1115 modified by Nuutila to keep only non-root nodes on the stack.
1116 The algorithm can be found in "On finding the strongly connected
1117 connected components in a directed graph" by Esko Nuutila and Eljas
1118 Soisalon-Soininen, in Information Processing Letters volume 49,
1119 number 1, pages 9-14. */
1122 scc_visit (constraint_graph_t graph
, struct scc_info
*si
, unsigned int n
)
1126 unsigned int my_dfs
;
1128 SET_BIT (si
->visited
, n
);
1129 si
->dfs
[n
] = si
->current_index
++;
1130 my_dfs
= si
->dfs
[n
];
1132 /* Visit all the successors. */
1133 EXECUTE_IF_IN_NONNULL_BITMAP (graph
->succs
[n
], 0, i
, bi
)
1137 if (i
> LAST_REF_NODE
)
1141 if (TEST_BIT (si
->roots
, w
))
1144 if (!TEST_BIT (si
->visited
, w
))
1145 scc_visit (graph
, si
, w
);
1147 unsigned int t
= find (w
);
1148 unsigned int nnode
= find (n
);
1149 gcc_assert (nnode
== n
);
1151 if (si
->dfs
[t
] < si
->dfs
[nnode
])
1152 si
->dfs
[n
] = si
->dfs
[t
];
1156 /* See if any components have been identified. */
1157 if (si
->dfs
[n
] == my_dfs
)
1159 if (VEC_length (unsigned, si
->scc_stack
) > 0
1160 && si
->dfs
[VEC_last (unsigned, si
->scc_stack
)] >= my_dfs
)
1162 bitmap scc
= BITMAP_ALLOC (NULL
);
1163 bool have_ref_node
= n
>= FIRST_REF_NODE
;
1164 unsigned int lowest_node
;
1167 bitmap_set_bit (scc
, n
);
1169 while (VEC_length (unsigned, si
->scc_stack
) != 0
1170 && si
->dfs
[VEC_last (unsigned, si
->scc_stack
)] >= my_dfs
)
1172 unsigned int w
= VEC_pop (unsigned, si
->scc_stack
);
1174 bitmap_set_bit (scc
, w
);
1175 if (w
>= FIRST_REF_NODE
)
1176 have_ref_node
= true;
1179 lowest_node
= bitmap_first_set_bit (scc
);
1180 gcc_assert (lowest_node
< FIRST_REF_NODE
);
1181 EXECUTE_IF_SET_IN_BITMAP (scc
, 0, i
, bi
)
1183 if (i
< FIRST_REF_NODE
)
1185 /* Mark this node for collapsing. */
1186 if (unite (lowest_node
, i
))
1187 unify_nodes (graph
, lowest_node
, i
, false);
1191 unite (lowest_node
, i
);
1192 graph
->indirect_cycles
[i
- FIRST_REF_NODE
] = lowest_node
;
1196 SET_BIT (si
->roots
, n
);
1199 VEC_safe_push (unsigned, heap
, si
->scc_stack
, n
);
1202 /* Unify node FROM into node TO, updating the changed count if
1203 necessary when UPDATE_CHANGED is true. */
1206 unify_nodes (constraint_graph_t graph
, unsigned int to
, unsigned int from
,
1207 bool update_changed
)
1210 gcc_assert (to
!= from
&& find (to
) == to
);
1211 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1212 fprintf (dump_file
, "Unifying %s to %s\n",
1213 get_varinfo (from
)->name
,
1214 get_varinfo (to
)->name
);
1217 stats
.unified_vars_dynamic
++;
1219 stats
.unified_vars_static
++;
1221 merge_graph_nodes (graph
, to
, from
);
1222 merge_node_constraints (graph
, to
, from
);
1224 if (update_changed
&& TEST_BIT (changed
, from
))
1226 RESET_BIT (changed
, from
);
1227 if (!TEST_BIT (changed
, to
))
1228 SET_BIT (changed
, to
);
1231 gcc_assert (changed_count
> 0);
1236 /* If the solution changes because of the merging, we need to mark
1237 the variable as changed. */
1238 if (bitmap_ior_into (get_varinfo (to
)->solution
,
1239 get_varinfo (from
)->solution
))
1241 if (update_changed
&& !TEST_BIT (changed
, to
))
1243 SET_BIT (changed
, to
);
1248 BITMAP_FREE (get_varinfo (from
)->solution
);
1249 BITMAP_FREE (get_varinfo (from
)->oldsolution
);
1251 if (stats
.iterations
> 0)
1253 BITMAP_FREE (get_varinfo (to
)->oldsolution
);
1254 get_varinfo (to
)->oldsolution
= BITMAP_ALLOC (&oldpta_obstack
);
1257 if (valid_graph_edge (graph
, to
, to
))
1259 if (graph
->succs
[to
])
1260 bitmap_clear_bit (graph
->succs
[to
], to
);
1264 /* Information needed to compute the topological ordering of a graph. */
1268 /* sbitmap of visited nodes. */
1270 /* Array that stores the topological order of the graph, *in
1272 VEC(unsigned,heap
) *topo_order
;
1276 /* Initialize and return a topological info structure. */
1278 static struct topo_info
*
1279 init_topo_info (void)
1281 size_t size
= VEC_length (varinfo_t
, varmap
);
1282 struct topo_info
*ti
= XNEW (struct topo_info
);
1283 ti
->visited
= sbitmap_alloc (size
);
1284 sbitmap_zero (ti
->visited
);
1285 ti
->topo_order
= VEC_alloc (unsigned, heap
, 1);
1290 /* Free the topological sort info pointed to by TI. */
1293 free_topo_info (struct topo_info
*ti
)
1295 sbitmap_free (ti
->visited
);
1296 VEC_free (unsigned, heap
, ti
->topo_order
);
1300 /* Visit the graph in topological order, and store the order in the
1301 topo_info structure. */
1304 topo_visit (constraint_graph_t graph
, struct topo_info
*ti
,
1310 SET_BIT (ti
->visited
, n
);
1312 if (graph
->succs
[n
])
1313 EXECUTE_IF_SET_IN_BITMAP (graph
->succs
[n
], 0, j
, bi
)
1315 if (!TEST_BIT (ti
->visited
, j
))
1316 topo_visit (graph
, ti
, j
);
1319 VEC_safe_push (unsigned, heap
, ti
->topo_order
, n
);
1322 /* Return true if variable N + OFFSET is a legal field of N. */
1325 type_safe (unsigned int n
, unsigned HOST_WIDE_INT
*offset
)
1327 varinfo_t ninfo
= get_varinfo (n
);
1329 /* For things we've globbed to single variables, any offset into the
1330 variable acts like the entire variable, so that it becomes offset
1332 if (ninfo
->is_special_var
1333 || ninfo
->is_artificial_var
1334 || ninfo
->is_unknown_size_var
)
1339 return (get_varinfo (n
)->offset
+ *offset
) < get_varinfo (n
)->fullsize
;
1342 /* Process a constraint C that represents *x = &y. */
1345 do_da_constraint (constraint_graph_t graph ATTRIBUTE_UNUSED
,
1346 constraint_t c
, bitmap delta
)
1348 unsigned int rhs
= c
->rhs
.var
;
1352 /* For each member j of Delta (Sol(x)), add x to Sol(j) */
1353 EXECUTE_IF_SET_IN_BITMAP (delta
, 0, j
, bi
)
1355 unsigned HOST_WIDE_INT offset
= c
->lhs
.offset
;
1356 if (type_safe (j
, &offset
) && !(get_varinfo (j
)->is_special_var
))
1358 /* *x != NULL && *x != ANYTHING*/
1362 unsigned HOST_WIDE_INT fieldoffset
= get_varinfo (j
)->offset
+ offset
;
1364 v
= first_vi_for_offset (get_varinfo (j
), fieldoffset
);
1368 sol
= get_varinfo (t
)->solution
;
1369 if (!bitmap_bit_p (sol
, rhs
))
1371 bitmap_set_bit (sol
, rhs
);
1372 if (!TEST_BIT (changed
, t
))
1374 SET_BIT (changed
, t
);
1379 else if (0 && dump_file
&& !(get_varinfo (j
)->is_special_var
))
1380 fprintf (dump_file
, "Untypesafe usage in do_da_constraint.\n");
1385 /* Process a constraint C that represents x = *y, using DELTA as the
1386 starting solution. */
1389 do_sd_constraint (constraint_graph_t graph
, constraint_t c
,
1392 unsigned int lhs
= find (c
->lhs
.var
);
1394 bitmap sol
= get_varinfo (lhs
)->solution
;
1398 if (bitmap_bit_p (delta
, anything_id
))
1400 flag
= !bitmap_bit_p (sol
, anything_id
);
1402 bitmap_set_bit (sol
, anything_id
);
1405 /* For each variable j in delta (Sol(y)), add
1406 an edge in the graph from j to x, and union Sol(j) into Sol(x). */
1407 EXECUTE_IF_SET_IN_BITMAP (delta
, 0, j
, bi
)
1409 unsigned HOST_WIDE_INT roffset
= c
->rhs
.offset
;
1410 if (type_safe (j
, &roffset
))
1413 unsigned HOST_WIDE_INT fieldoffset
= get_varinfo (j
)->offset
+ roffset
;
1416 v
= first_vi_for_offset (get_varinfo (j
), fieldoffset
);
1421 /* Adding edges from the special vars is pointless.
1422 They don't have sets that can change. */
1423 if (get_varinfo (t
) ->is_special_var
)
1424 flag
|= bitmap_ior_into (sol
, get_varinfo (t
)->solution
);
1425 else if (add_graph_edge (graph
, lhs
, t
))
1426 flag
|= bitmap_ior_into (sol
, get_varinfo (t
)->solution
);
1428 else if (0 && dump_file
&& !(get_varinfo (j
)->is_special_var
))
1429 fprintf (dump_file
, "Untypesafe usage in do_sd_constraint\n");
1434 /* If the LHS solution changed, mark the var as changed. */
1437 get_varinfo (lhs
)->solution
= sol
;
1438 if (!TEST_BIT (changed
, lhs
))
1440 SET_BIT (changed
, lhs
);
1446 /* Process a constraint C that represents *x = y. */
1449 do_ds_constraint (constraint_t c
, bitmap delta
)
1451 unsigned int rhs
= find (c
->rhs
.var
);
1452 unsigned HOST_WIDE_INT roff
= c
->rhs
.offset
;
1453 bitmap sol
= get_varinfo (rhs
)->solution
;
1457 if (bitmap_bit_p (sol
, anything_id
))
1459 EXECUTE_IF_SET_IN_BITMAP (delta
, 0, j
, bi
)
1461 varinfo_t jvi
= get_varinfo (j
);
1463 unsigned int loff
= c
->lhs
.offset
;
1464 unsigned HOST_WIDE_INT fieldoffset
= jvi
->offset
+ loff
;
1467 v
= first_vi_for_offset (get_varinfo (j
), fieldoffset
);
1472 if (!bitmap_bit_p (get_varinfo (t
)->solution
, anything_id
))
1474 bitmap_set_bit (get_varinfo (t
)->solution
, anything_id
);
1475 if (!TEST_BIT (changed
, t
))
1477 SET_BIT (changed
, t
);
1485 /* For each member j of delta (Sol(x)), add an edge from y to j and
1486 union Sol(y) into Sol(j) */
1487 EXECUTE_IF_SET_IN_BITMAP (delta
, 0, j
, bi
)
1489 unsigned HOST_WIDE_INT loff
= c
->lhs
.offset
;
1490 if (type_safe (j
, &loff
) && !(get_varinfo (j
)->is_special_var
))
1494 unsigned HOST_WIDE_INT fieldoffset
= get_varinfo (j
)->offset
+ loff
;
1497 v
= first_vi_for_offset (get_varinfo (j
), fieldoffset
);
1501 tmp
= get_varinfo (t
)->solution
;
1503 if (set_union_with_increment (tmp
, sol
, roff
))
1505 get_varinfo (t
)->solution
= tmp
;
1507 sol
= get_varinfo (rhs
)->solution
;
1508 if (!TEST_BIT (changed
, t
))
1510 SET_BIT (changed
, t
);
1515 else if (0 && dump_file
&& !(get_varinfo (j
)->is_special_var
))
1516 fprintf (dump_file
, "Untypesafe usage in do_ds_constraint\n");
1520 /* Handle a non-simple (simple meaning requires no iteration),
1521 constraint (IE *x = &y, x = *y, *x = y, and x = y with offsets involved). */
1524 do_complex_constraint (constraint_graph_t graph
, constraint_t c
, bitmap delta
)
1526 if (c
->lhs
.type
== DEREF
)
1528 if (c
->rhs
.type
== ADDRESSOF
)
1531 do_da_constraint (graph
, c
, delta
);
1536 do_ds_constraint (c
, delta
);
1539 else if (c
->rhs
.type
== DEREF
)
1542 if (!(get_varinfo (c
->lhs
.var
)->is_special_var
))
1543 do_sd_constraint (graph
, c
, delta
);
1552 gcc_assert (c
->rhs
.type
== SCALAR
&& c
->lhs
.type
== SCALAR
);
1553 t
= find (c
->rhs
.var
);
1554 solution
= get_varinfo (t
)->solution
;
1555 t
= find (c
->lhs
.var
);
1556 tmp
= get_varinfo (t
)->solution
;
1558 flag
= set_union_with_increment (tmp
, solution
, c
->rhs
.offset
);
1562 get_varinfo (t
)->solution
= tmp
;
1563 if (!TEST_BIT (changed
, t
))
1565 SET_BIT (changed
, t
);
1572 /* Initialize and return a new SCC info structure. */
1574 static struct scc_info
*
1575 init_scc_info (size_t size
)
1577 struct scc_info
*si
= XNEW (struct scc_info
);
1580 si
->current_index
= 0;
1581 si
->visited
= sbitmap_alloc (size
);
1582 sbitmap_zero (si
->visited
);
1583 si
->roots
= sbitmap_alloc (size
);
1584 sbitmap_zero (si
->roots
);
1585 si
->node_mapping
= XNEWVEC (unsigned int, size
);
1586 si
->dfs
= XCNEWVEC (unsigned int, size
);
1588 for (i
= 0; i
< size
; i
++)
1589 si
->node_mapping
[i
] = i
;
1591 si
->scc_stack
= VEC_alloc (unsigned, heap
, 1);
1595 /* Free an SCC info structure pointed to by SI */
1598 free_scc_info (struct scc_info
*si
)
1600 sbitmap_free (si
->visited
);
1601 sbitmap_free (si
->roots
);
1602 free (si
->node_mapping
);
1604 VEC_free (unsigned, heap
, si
->scc_stack
);
1609 /* Find indirect cycles in GRAPH that occur, using strongly connected
1610 components, and note them in the indirect cycles map.
1612 This technique comes from Ben Hardekopf and Calvin Lin,
1613 "It Pays to be Lazy: Fast and Accurate Pointer Analysis for Millions of
1614 Lines of Code", submitted to PLDI 2007. */
1617 find_indirect_cycles (constraint_graph_t graph
)
1620 unsigned int size
= graph
->size
;
1621 struct scc_info
*si
= init_scc_info (size
);
1623 for (i
= 0; i
< MIN (LAST_REF_NODE
, size
); i
++ )
1624 if (!TEST_BIT (si
->visited
, i
) && find (i
) == i
)
1625 scc_visit (graph
, si
, i
);
1630 /* Compute a topological ordering for GRAPH, and store the result in the
1631 topo_info structure TI. */
1634 compute_topo_order (constraint_graph_t graph
,
1635 struct topo_info
*ti
)
1638 unsigned int size
= VEC_length (varinfo_t
, varmap
);
1640 for (i
= 0; i
!= size
; ++i
)
1641 if (!TEST_BIT (ti
->visited
, i
) && find (i
) == i
)
1642 topo_visit (graph
, ti
, i
);
1645 /* Perform offline variable substitution.
1647 This is a linear time way of identifying variables that must have
1648 equivalent points-to sets, including those caused by static cycles,
1649 and single entry subgraphs, in the constraint graph.
1651 The technique is described in "Off-line variable substitution for
1652 scaling points-to analysis" by Atanas Rountev and Satish Chandra,
1653 in "ACM SIGPLAN Notices" volume 35, number 5, pages 47-56.
1655 There is an optimal way to do this involving hash based value
1656 numbering, once the technique is published i will implement it
1659 The general method of finding equivalence classes is as follows:
1660 Add fake nodes (REF nodes) and edges for *a = b and a = *b constraints.
1661 Add fake nodes (ADDRESS nodes) and edges for a = &b constraints.
1662 Initialize all non-REF/ADDRESS nodes to be direct nodes
1663 For each SCC in the predecessor graph:
1664 for each member (x) of the SCC
1665 if x is not a direct node:
1666 set rootnode(SCC) to be not a direct node
1667 collapse node x into rootnode(SCC).
1668 if rootnode(SCC) is not a direct node:
1669 label rootnode(SCC) with a new equivalence class
1671 if all labeled predecessors of rootnode(SCC) have the same
1673 label rootnode(SCC) with this label
1675 label rootnode(SCC) with a new equivalence class
1677 All direct nodes with the same equivalence class can be replaced
1678 with a single representative node.
1679 All unlabeled nodes (label == 0) are not pointers and all edges
1680 involving them can be eliminated.
1681 We perform these optimizations during move_complex_constraints.
1684 static int equivalence_class
;
1686 /* Recursive routine to find strongly connected components in GRAPH,
1687 and label it's nodes with equivalence classes.
1688 This is used during variable substitution to find cycles involving
1689 the regular or implicit predecessors, and label them as equivalent.
1690 The SCC finding algorithm used is the same as that for scc_visit. */
1693 label_visit (constraint_graph_t graph
, struct scc_info
*si
, unsigned int n
)
1697 unsigned int my_dfs
;
1699 gcc_assert (si
->node_mapping
[n
] == n
);
1700 SET_BIT (si
->visited
, n
);
1701 si
->dfs
[n
] = si
->current_index
++;
1702 my_dfs
= si
->dfs
[n
];
1704 /* Visit all the successors. */
1705 EXECUTE_IF_IN_NONNULL_BITMAP (graph
->preds
[n
], 0, i
, bi
)
1707 unsigned int w
= si
->node_mapping
[i
];
1709 if (TEST_BIT (si
->roots
, w
))
1712 if (!TEST_BIT (si
->visited
, w
))
1713 label_visit (graph
, si
, w
);
1715 unsigned int t
= si
->node_mapping
[w
];
1716 unsigned int nnode
= si
->node_mapping
[n
];
1717 gcc_assert (nnode
== n
);
1719 if (si
->dfs
[t
] < si
->dfs
[nnode
])
1720 si
->dfs
[n
] = si
->dfs
[t
];
1724 /* Visit all the implicit predecessors. */
1725 EXECUTE_IF_IN_NONNULL_BITMAP (graph
->implicit_preds
[n
], 0, i
, bi
)
1727 unsigned int w
= si
->node_mapping
[i
];
1729 if (TEST_BIT (si
->roots
, w
))
1732 if (!TEST_BIT (si
->visited
, w
))
1733 label_visit (graph
, si
, w
);
1735 unsigned int t
= si
->node_mapping
[w
];
1736 unsigned int nnode
= si
->node_mapping
[n
];
1737 gcc_assert (nnode
== n
);
1739 if (si
->dfs
[t
] < si
->dfs
[nnode
])
1740 si
->dfs
[n
] = si
->dfs
[t
];
1744 /* See if any components have been identified. */
1745 if (si
->dfs
[n
] == my_dfs
)
1747 while (VEC_length (unsigned, si
->scc_stack
) != 0
1748 && si
->dfs
[VEC_last (unsigned, si
->scc_stack
)] >= my_dfs
)
1750 unsigned int w
= VEC_pop (unsigned, si
->scc_stack
);
1751 si
->node_mapping
[w
] = n
;
1753 if (!TEST_BIT (graph
->direct_nodes
, w
))
1754 RESET_BIT (graph
->direct_nodes
, n
);
1756 SET_BIT (si
->roots
, n
);
1758 if (!TEST_BIT (graph
->direct_nodes
, n
))
1760 graph
->label
[n
] = equivalence_class
++;
1764 unsigned int size
= 0;
1765 unsigned int firstlabel
= ~0;
1767 EXECUTE_IF_IN_NONNULL_BITMAP (graph
->preds
[n
], 0, i
, bi
)
1769 unsigned int j
= si
->node_mapping
[i
];
1771 if (j
== n
|| graph
->label
[j
] == 0)
1774 if (firstlabel
== (unsigned int)~0)
1776 firstlabel
= graph
->label
[j
];
1779 else if (graph
->label
[j
] != firstlabel
)
1784 graph
->label
[n
] = 0;
1786 graph
->label
[n
] = firstlabel
;
1788 graph
->label
[n
] = equivalence_class
++;
1792 VEC_safe_push (unsigned, heap
, si
->scc_stack
, n
);
1795 /* Perform offline variable substitution, discovering equivalence
1796 classes, and eliminating non-pointer variables. */
1798 static struct scc_info
*
1799 perform_var_substitution (constraint_graph_t graph
)
1802 unsigned int size
= graph
->size
;
1803 struct scc_info
*si
= init_scc_info (size
);
1805 bitmap_obstack_initialize (&iteration_obstack
);
1806 equivalence_class
= 0;
1808 /* We only need to visit the non-address nodes for labeling
1809 purposes, as the address nodes will never have any predecessors,
1810 because &x never appears on the LHS of a constraint. */
1811 for (i
= 0; i
< LAST_REF_NODE
; i
++)
1812 if (!TEST_BIT (si
->visited
, si
->node_mapping
[i
]))
1813 label_visit (graph
, si
, si
->node_mapping
[i
]);
1815 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1816 for (i
= 0; i
< FIRST_REF_NODE
; i
++)
1818 bool direct_node
= TEST_BIT (graph
->direct_nodes
, i
);
1820 "Equivalence class for %s node id %d:%s is %d\n",
1821 direct_node
? "Direct node" : "Indirect node", i
,
1822 get_varinfo (i
)->name
,
1823 graph
->label
[si
->node_mapping
[i
]]);
1826 /* Quickly eliminate our non-pointer variables. */
1828 for (i
= 0; i
< FIRST_REF_NODE
; i
++)
1830 unsigned int node
= si
->node_mapping
[i
];
1832 if (graph
->label
[node
] == 0 && TEST_BIT (graph
->direct_nodes
, node
))
1834 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1836 "%s is a non-pointer variable, eliminating edges.\n",
1837 get_varinfo (node
)->name
);
1838 stats
.nonpointer_vars
++;
1839 clear_edges_for_node (graph
, node
);
1845 /* Free information that was only necessary for variable
1849 free_var_substitution_info (struct scc_info
*si
)
1852 free (graph
->label
);
1853 free (graph
->eq_rep
);
1854 sbitmap_free (graph
->direct_nodes
);
1855 bitmap_obstack_release (&iteration_obstack
);
1858 /* Return an existing node that is equivalent to NODE, which has
1859 equivalence class LABEL, if one exists. Return NODE otherwise. */
1862 find_equivalent_node (constraint_graph_t graph
,
1863 unsigned int node
, unsigned int label
)
1865 /* If the address version of this variable is unused, we can
1866 substitute it for anything else with the same label.
1867 Otherwise, we know the pointers are equivalent, but not the
1870 if (graph
->label
[FIRST_ADDR_NODE
+ node
] == 0)
1872 gcc_assert (label
< graph
->size
);
1874 if (graph
->eq_rep
[label
] != -1)
1876 /* Unify the two variables since we know they are equivalent. */
1877 if (unite (graph
->eq_rep
[label
], node
))
1878 unify_nodes (graph
, graph
->eq_rep
[label
], node
, false);
1879 return graph
->eq_rep
[label
];
1883 graph
->eq_rep
[label
] = node
;
1889 /* Move complex constraints to the appropriate nodes, and collapse
1890 variables we've discovered are equivalent during variable
1891 substitution. SI is the SCC_INFO that is the result of
1892 perform_variable_substitution. */
1895 move_complex_constraints (constraint_graph_t graph
,
1896 struct scc_info
*si
)
1902 for (j
= 0; j
< graph
->size
; j
++)
1903 gcc_assert (find (j
) == j
);
1905 for (i
= 0; VEC_iterate (constraint_t
, constraints
, i
, c
); i
++)
1907 struct constraint_expr lhs
= c
->lhs
;
1908 struct constraint_expr rhs
= c
->rhs
;
1909 unsigned int lhsvar
= find (get_varinfo_fc (lhs
.var
)->id
);
1910 unsigned int rhsvar
= find (get_varinfo_fc (rhs
.var
)->id
);
1911 unsigned int lhsnode
, rhsnode
;
1912 unsigned int lhslabel
, rhslabel
;
1914 lhsnode
= si
->node_mapping
[lhsvar
];
1915 rhsnode
= si
->node_mapping
[rhsvar
];
1916 lhslabel
= graph
->label
[lhsnode
];
1917 rhslabel
= graph
->label
[rhsnode
];
1919 /* See if it is really a non-pointer variable, and if so, ignore
1923 if (!TEST_BIT (graph
->direct_nodes
, lhsnode
))
1924 lhslabel
= graph
->label
[lhsnode
] = equivalence_class
++;
1927 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1930 fprintf (dump_file
, "%s is a non-pointer variable,"
1931 "ignoring constraint:",
1932 get_varinfo (lhs
.var
)->name
);
1933 dump_constraint (dump_file
, c
);
1935 VEC_replace (constraint_t
, constraints
, i
, NULL
);
1942 if (!TEST_BIT (graph
->direct_nodes
, rhsnode
))
1943 rhslabel
= graph
->label
[rhsnode
] = equivalence_class
++;
1946 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1949 fprintf (dump_file
, "%s is a non-pointer variable,"
1950 "ignoring constraint:",
1951 get_varinfo (rhs
.var
)->name
);
1952 dump_constraint (dump_file
, c
);
1954 VEC_replace (constraint_t
, constraints
, i
, NULL
);
1959 lhsvar
= find_equivalent_node (graph
, lhsvar
, lhslabel
);
1960 rhsvar
= find_equivalent_node (graph
, rhsvar
, rhslabel
);
1961 c
->lhs
.var
= lhsvar
;
1962 c
->rhs
.var
= rhsvar
;
1964 if (lhs
.type
== DEREF
)
1966 if (rhs
.type
== ADDRESSOF
|| rhsvar
> anything_id
)
1967 insert_into_complex (graph
, lhsvar
, c
);
1969 else if (rhs
.type
== DEREF
)
1971 if (!(get_varinfo (lhsvar
)->is_special_var
))
1972 insert_into_complex (graph
, rhsvar
, c
);
1974 else if (rhs
.type
!= ADDRESSOF
&& lhsvar
> anything_id
1975 && (lhs
.offset
!= 0 || rhs
.offset
!= 0))
1977 insert_into_complex (graph
, rhsvar
, c
);
1983 /* Eliminate indirect cycles involving NODE. Return true if NODE was
1984 part of an SCC, false otherwise. */
1987 eliminate_indirect_cycles (unsigned int node
)
1989 if (graph
->indirect_cycles
[node
] != -1
1990 && !bitmap_empty_p (get_varinfo (node
)->solution
))
1993 VEC(unsigned,heap
) *queue
= NULL
;
1995 unsigned int to
= find (graph
->indirect_cycles
[node
]);
1998 /* We can't touch the solution set and call unify_nodes
1999 at the same time, because unify_nodes is going to do
2000 bitmap unions into it. */
2002 EXECUTE_IF_SET_IN_BITMAP (get_varinfo (node
)->solution
, 0, i
, bi
)
2004 if (find (i
) == i
&& i
!= to
)
2007 VEC_safe_push (unsigned, heap
, queue
, i
);
2012 VEC_iterate (unsigned, queue
, queuepos
, i
);
2015 unify_nodes (graph
, to
, i
, true);
2017 VEC_free (unsigned, heap
, queue
);
2023 /* Solve the constraint graph GRAPH using our worklist solver.
2024 This is based on the PW* family of solvers from the "Efficient Field
2025 Sensitive Pointer Analysis for C" paper.
2026 It works by iterating over all the graph nodes, processing the complex
2027 constraints and propagating the copy constraints, until everything stops
2028 changed. This corresponds to steps 6-8 in the solving list given above. */
2031 solve_graph (constraint_graph_t graph
)
2033 unsigned int size
= VEC_length (varinfo_t
, varmap
);
2038 changed
= sbitmap_alloc (size
);
2039 sbitmap_zero (changed
);
2041 /* Mark all initial non-collapsed nodes as changed. */
2042 for (i
= 0; i
< size
; i
++)
2044 varinfo_t ivi
= get_varinfo (i
);
2045 if (find (i
) == i
&& !bitmap_empty_p (ivi
->solution
)
2046 && ((graph
->succs
[i
] && !bitmap_empty_p (graph
->succs
[i
]))
2047 || VEC_length (constraint_t
, graph
->complex[i
]) > 0))
2049 SET_BIT (changed
, i
);
2054 /* Allocate a bitmap to be used to store the changed bits. */
2055 pts
= BITMAP_ALLOC (&pta_obstack
);
2057 while (changed_count
> 0)
2060 struct topo_info
*ti
= init_topo_info ();
2063 bitmap_obstack_initialize (&iteration_obstack
);
2065 compute_topo_order (graph
, ti
);
2067 while (VEC_length (unsigned, ti
->topo_order
) != 0)
2070 i
= VEC_pop (unsigned, ti
->topo_order
);
2072 /* If this variable is not a representative, skip it. */
2076 /* In certain indirect cycle cases, we may merge this
2077 variable to another. */
2078 if (eliminate_indirect_cycles (i
) && find (i
) != i
)
2081 /* If the node has changed, we need to process the
2082 complex constraints and outgoing edges again. */
2083 if (TEST_BIT (changed
, i
))
2088 VEC(constraint_t
,heap
) *complex = graph
->complex[i
];
2089 bool solution_empty
;
2091 RESET_BIT (changed
, i
);
2094 /* Compute the changed set of solution bits. */
2095 bitmap_and_compl (pts
, get_varinfo (i
)->solution
,
2096 get_varinfo (i
)->oldsolution
);
2098 if (bitmap_empty_p (pts
))
2101 bitmap_ior_into (get_varinfo (i
)->oldsolution
, pts
);
2103 solution
= get_varinfo (i
)->solution
;
2104 solution_empty
= bitmap_empty_p (solution
);
2106 /* Process the complex constraints */
2107 for (j
= 0; VEC_iterate (constraint_t
, complex, j
, c
); j
++)
2109 /* The only complex constraint that can change our
2110 solution to non-empty, given an empty solution,
2111 is a constraint where the lhs side is receiving
2112 some set from elsewhere. */
2113 if (!solution_empty
|| c
->lhs
.type
!= DEREF
)
2114 do_complex_constraint (graph
, c
, pts
);
2117 solution_empty
= bitmap_empty_p (solution
);
2119 if (!solution_empty
)
2123 /* Propagate solution to all successors. */
2124 EXECUTE_IF_IN_NONNULL_BITMAP (graph
->succs
[i
],
2130 unsigned int to
= find (j
);
2131 tmp
= get_varinfo (to
)->solution
;
2134 /* Don't try to propagate to ourselves. */
2138 flag
= set_union_with_increment (tmp
, pts
, 0);
2142 get_varinfo (to
)->solution
= tmp
;
2143 if (!TEST_BIT (changed
, to
))
2145 SET_BIT (changed
, to
);
2153 free_topo_info (ti
);
2154 bitmap_obstack_release (&iteration_obstack
);
2158 sbitmap_free (changed
);
2159 bitmap_obstack_release (&oldpta_obstack
);
2162 /* Map from trees to variable infos. */
2163 static struct pointer_map_t
*vi_for_tree
;
2166 /* Insert ID as the variable id for tree T in the vi_for_tree map. */
2169 insert_vi_for_tree (tree t
, varinfo_t vi
)
2171 void **slot
= pointer_map_insert (vi_for_tree
, t
);
2173 gcc_assert (*slot
== NULL
);
2177 /* Find the variable info for tree T in VI_FOR_TREE. If T does not
2178 exist in the map, return NULL, otherwise, return the varinfo we found. */
2181 lookup_vi_for_tree (tree t
)
2183 void **slot
= pointer_map_contains (vi_for_tree
, t
);
2187 return (varinfo_t
) *slot
;
2190 /* Return a printable name for DECL */
2193 alias_get_name (tree decl
)
2195 const char *res
= get_name (decl
);
2197 int num_printed
= 0;
2206 if (TREE_CODE (decl
) == SSA_NAME
)
2208 num_printed
= asprintf (&temp
, "%s_%u",
2209 alias_get_name (SSA_NAME_VAR (decl
)),
2210 SSA_NAME_VERSION (decl
));
2212 else if (DECL_P (decl
))
2214 num_printed
= asprintf (&temp
, "D.%u", DECL_UID (decl
));
2216 if (num_printed
> 0)
2218 res
= ggc_strdup (temp
);
2224 /* Find the variable id for tree T in the map.
2225 If T doesn't exist in the map, create an entry for it and return it. */
2228 get_vi_for_tree (tree t
)
2230 void **slot
= pointer_map_contains (vi_for_tree
, t
);
2232 return get_varinfo (create_variable_info_for (t
, alias_get_name (t
)));
2234 return (varinfo_t
) *slot
;
2237 /* Get a constraint expression from an SSA_VAR_P node. */
2239 static struct constraint_expr
2240 get_constraint_exp_from_ssa_var (tree t
)
2242 struct constraint_expr cexpr
;
2244 gcc_assert (SSA_VAR_P (t
) || DECL_P (t
));
2246 /* For parameters, get at the points-to set for the actual parm
2248 if (TREE_CODE (t
) == SSA_NAME
2249 && TREE_CODE (SSA_NAME_VAR (t
)) == PARM_DECL
2250 && default_def (SSA_NAME_VAR (t
)) == t
)
2251 return get_constraint_exp_from_ssa_var (SSA_NAME_VAR (t
));
2253 cexpr
.type
= SCALAR
;
2255 cexpr
.var
= get_vi_for_tree (t
)->id
;
2256 /* If we determine the result is "anything", and we know this is readonly,
2257 say it points to readonly memory instead. */
2258 if (cexpr
.var
== anything_id
&& TREE_READONLY (t
))
2260 cexpr
.type
= ADDRESSOF
;
2261 cexpr
.var
= readonly_id
;
2268 /* Process a completed constraint T, and add it to the constraint
2272 process_constraint (constraint_t t
)
2274 struct constraint_expr rhs
= t
->rhs
;
2275 struct constraint_expr lhs
= t
->lhs
;
2277 gcc_assert (rhs
.var
< VEC_length (varinfo_t
, varmap
));
2278 gcc_assert (lhs
.var
< VEC_length (varinfo_t
, varmap
));
2280 if (lhs
.type
== DEREF
)
2281 get_varinfo (lhs
.var
)->directly_dereferenced
= true;
2282 if (rhs
.type
== DEREF
)
2283 get_varinfo (rhs
.var
)->directly_dereferenced
= true;
2285 if (!use_field_sensitive
)
2291 /* ANYTHING == ANYTHING is pointless. */
2292 if (lhs
.var
== anything_id
&& rhs
.var
== anything_id
)
2295 /* If we have &ANYTHING = something, convert to SOMETHING = &ANYTHING) */
2296 else if (lhs
.var
== anything_id
&& lhs
.type
== ADDRESSOF
)
2301 process_constraint (t
);
2303 /* This can happen in our IR with things like n->a = *p */
2304 else if (rhs
.type
== DEREF
&& lhs
.type
== DEREF
&& rhs
.var
!= anything_id
)
2306 /* Split into tmp = *rhs, *lhs = tmp */
2307 tree rhsdecl
= get_varinfo (rhs
.var
)->decl
;
2308 tree pointertype
= TREE_TYPE (rhsdecl
);
2309 tree pointedtotype
= TREE_TYPE (pointertype
);
2310 tree tmpvar
= create_tmp_var_raw (pointedtotype
, "doubledereftmp");
2311 struct constraint_expr tmplhs
= get_constraint_exp_from_ssa_var (tmpvar
);
2313 /* If this is an aggregate of known size, we should have passed
2314 this off to do_structure_copy, and it should have broken it
2316 gcc_assert (!AGGREGATE_TYPE_P (pointedtotype
)
2317 || get_varinfo (rhs
.var
)->is_unknown_size_var
);
2319 process_constraint (new_constraint (tmplhs
, rhs
));
2320 process_constraint (new_constraint (lhs
, tmplhs
));
2324 gcc_assert (rhs
.type
!= ADDRESSOF
|| rhs
.offset
== 0);
2325 VEC_safe_push (constraint_t
, heap
, constraints
, t
);
2329 /* Return true if T is a variable of a type that could contain
2333 could_have_pointers (tree t
)
2335 tree type
= TREE_TYPE (t
);
2337 if (POINTER_TYPE_P (type
)
2338 || AGGREGATE_TYPE_P (type
)
2339 || TREE_CODE (type
) == COMPLEX_TYPE
)
2345 /* Return the position, in bits, of FIELD_DECL from the beginning of its
2348 static unsigned HOST_WIDE_INT
2349 bitpos_of_field (const tree fdecl
)
2352 if (TREE_CODE (DECL_FIELD_OFFSET (fdecl
)) != INTEGER_CST
2353 || TREE_CODE (DECL_FIELD_BIT_OFFSET (fdecl
)) != INTEGER_CST
)
2356 return (tree_low_cst (DECL_FIELD_OFFSET (fdecl
), 1) * 8)
2357 + tree_low_cst (DECL_FIELD_BIT_OFFSET (fdecl
), 1);
2361 /* Return true if an access to [ACCESSPOS, ACCESSSIZE]
2362 overlaps with a field at [FIELDPOS, FIELDSIZE] */
2365 offset_overlaps_with_access (const unsigned HOST_WIDE_INT fieldpos
,
2366 const unsigned HOST_WIDE_INT fieldsize
,
2367 const unsigned HOST_WIDE_INT accesspos
,
2368 const unsigned HOST_WIDE_INT accesssize
)
2370 if (fieldpos
== accesspos
&& fieldsize
== accesssize
)
2372 if (accesspos
>= fieldpos
&& accesspos
< (fieldpos
+ fieldsize
))
2374 if (accesspos
< fieldpos
&& (accesspos
+ accesssize
> fieldpos
))
2380 /* Given a COMPONENT_REF T, return the constraint_expr for it. */
2383 get_constraint_for_component_ref (tree t
, VEC(ce_s
, heap
) **results
)
2386 HOST_WIDE_INT bitsize
= -1;
2387 HOST_WIDE_INT bitmaxsize
= -1;
2388 HOST_WIDE_INT bitpos
;
2390 struct constraint_expr
*result
;
2391 unsigned int beforelength
= VEC_length (ce_s
, *results
);
2393 /* Some people like to do cute things like take the address of
2396 while (!SSA_VAR_P (forzero
) && !CONSTANT_CLASS_P (forzero
))
2397 forzero
= TREE_OPERAND (forzero
, 0);
2399 if (CONSTANT_CLASS_P (forzero
) && integer_zerop (forzero
))
2401 struct constraint_expr temp
;
2404 temp
.var
= integer_id
;
2406 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2410 t
= get_ref_base_and_extent (t
, &bitpos
, &bitsize
, &bitmaxsize
);
2412 /* String constants are readonly, so there is nothing to really do
2414 if (TREE_CODE (t
) == STRING_CST
)
2417 get_constraint_for (t
, results
);
2418 result
= VEC_last (ce_s
, *results
);
2419 result
->offset
= bitpos
;
2421 gcc_assert (beforelength
+ 1 == VEC_length (ce_s
, *results
));
2423 /* This can also happen due to weird offsetof type macros. */
2424 if (TREE_CODE (t
) != ADDR_EXPR
&& result
->type
== ADDRESSOF
)
2425 result
->type
= SCALAR
;
2427 if (result
->type
== SCALAR
)
2429 /* In languages like C, you can access one past the end of an
2430 array. You aren't allowed to dereference it, so we can
2431 ignore this constraint. When we handle pointer subtraction,
2432 we may have to do something cute here. */
2434 if (result
->offset
< get_varinfo (result
->var
)->fullsize
2437 /* It's also not true that the constraint will actually start at the
2438 right offset, it may start in some padding. We only care about
2439 setting the constraint to the first actual field it touches, so
2442 for (curr
= get_varinfo (result
->var
); curr
; curr
= curr
->next
)
2444 if (offset_overlaps_with_access (curr
->offset
, curr
->size
,
2445 result
->offset
, bitmaxsize
))
2447 result
->var
= curr
->id
;
2451 /* assert that we found *some* field there. The user couldn't be
2452 accessing *only* padding. */
2453 /* Still the user could access one past the end of an array
2454 embedded in a struct resulting in accessing *only* padding. */
2455 gcc_assert (curr
|| ref_contains_array_ref (orig_t
));
2457 else if (bitmaxsize
== 0)
2459 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2460 fprintf (dump_file
, "Access to zero-sized part of variable,"
2464 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2465 fprintf (dump_file
, "Access to past the end of variable, ignoring\n");
2472 /* Dereference the constraint expression CONS, and return the result.
2473 DEREF (ADDRESSOF) = SCALAR
2474 DEREF (SCALAR) = DEREF
2475 DEREF (DEREF) = (temp = DEREF1; result = DEREF(temp))
2476 This is needed so that we can handle dereferencing DEREF constraints. */
2479 do_deref (VEC (ce_s
, heap
) **constraints
)
2481 struct constraint_expr
*c
;
2484 for (i
= 0; VEC_iterate (ce_s
, *constraints
, i
, c
); i
++)
2486 if (c
->type
== SCALAR
)
2488 else if (c
->type
== ADDRESSOF
)
2490 else if (c
->type
== DEREF
)
2492 tree tmpvar
= create_tmp_var_raw (ptr_type_node
, "dereftmp");
2493 struct constraint_expr tmplhs
= get_constraint_exp_from_ssa_var (tmpvar
);
2494 process_constraint (new_constraint (tmplhs
, *c
));
2495 c
->var
= tmplhs
.var
;
2502 /* Create a nonlocal variable of TYPE to represent nonlocals we can
2506 create_nonlocal_var (tree type
)
2508 tree nonlocal
= create_tmp_var_raw (type
, "NONLOCAL");
2510 if (referenced_vars
)
2511 add_referenced_var (nonlocal
);
2513 DECL_EXTERNAL (nonlocal
) = 1;
2517 /* Given a tree T, return the constraint expression for it. */
2520 get_constraint_for (tree t
, VEC (ce_s
, heap
) **results
)
2522 struct constraint_expr temp
;
2524 /* x = integer is all glommed to a single variable, which doesn't
2525 point to anything by itself. That is, of course, unless it is an
2526 integer constant being treated as a pointer, in which case, we
2527 will return that this is really the addressof anything. This
2528 happens below, since it will fall into the default case. The only
2529 case we know something about an integer treated like a pointer is
2530 when it is the NULL pointer, and then we just say it points to
2532 if (TREE_CODE (t
) == INTEGER_CST
2533 && !POINTER_TYPE_P (TREE_TYPE (t
)))
2535 temp
.var
= integer_id
;
2538 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2541 else if (TREE_CODE (t
) == INTEGER_CST
2542 && integer_zerop (t
))
2544 temp
.var
= nothing_id
;
2545 temp
.type
= ADDRESSOF
;
2547 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2551 switch (TREE_CODE_CLASS (TREE_CODE (t
)))
2553 case tcc_expression
:
2555 switch (TREE_CODE (t
))
2559 struct constraint_expr
*c
;
2561 tree exp
= TREE_OPERAND (t
, 0);
2562 tree pttype
= TREE_TYPE (TREE_TYPE (t
));
2564 get_constraint_for (exp
, results
);
2566 /* Make sure we capture constraints to all elements
2568 if ((handled_component_p (exp
)
2569 && ref_contains_array_ref (exp
))
2570 || TREE_CODE (TREE_TYPE (exp
)) == ARRAY_TYPE
)
2572 struct constraint_expr
*origrhs
;
2574 struct constraint_expr tmp
;
2576 if (VEC_length (ce_s
, *results
) == 0)
2579 gcc_assert (VEC_length (ce_s
, *results
) == 1);
2580 origrhs
= VEC_last (ce_s
, *results
);
2582 VEC_pop (ce_s
, *results
);
2583 origvar
= get_varinfo (origrhs
->var
);
2584 for (; origvar
; origvar
= origvar
->next
)
2586 tmp
.var
= origvar
->id
;
2587 VEC_safe_push (ce_s
, heap
, *results
, &tmp
);
2590 else if (VEC_length (ce_s
, *results
) == 1
2591 && (AGGREGATE_TYPE_P (pttype
)
2592 || TREE_CODE (pttype
) == COMPLEX_TYPE
))
2594 struct constraint_expr
*origrhs
;
2596 struct constraint_expr tmp
;
2598 gcc_assert (VEC_length (ce_s
, *results
) == 1);
2599 origrhs
= VEC_last (ce_s
, *results
);
2601 VEC_pop (ce_s
, *results
);
2602 origvar
= get_varinfo (origrhs
->var
);
2603 for (; origvar
; origvar
= origvar
->next
)
2605 tmp
.var
= origvar
->id
;
2606 VEC_safe_push (ce_s
, heap
, *results
, &tmp
);
2610 for (i
= 0; VEC_iterate (ce_s
, *results
, i
, c
); i
++)
2612 if (c
->type
== DEREF
)
2615 c
->type
= ADDRESSOF
;
2621 /* XXX: In interprocedural mode, if we didn't have the
2622 body, we would need to do *each pointer argument =
2624 if (call_expr_flags (t
) & (ECF_MALLOC
| ECF_MAY_BE_ALLOCA
))
2627 tree heapvar
= heapvar_lookup (t
);
2629 if (heapvar
== NULL
)
2631 heapvar
= create_tmp_var_raw (ptr_type_node
, "HEAP");
2632 DECL_EXTERNAL (heapvar
) = 1;
2633 if (referenced_vars
)
2634 add_referenced_var (heapvar
);
2635 heapvar_insert (t
, heapvar
);
2638 temp
.var
= create_variable_info_for (heapvar
,
2639 alias_get_name (heapvar
));
2641 vi
= get_varinfo (temp
.var
);
2642 vi
->is_artificial_var
= 1;
2643 vi
->is_heap_var
= 1;
2644 temp
.type
= ADDRESSOF
;
2646 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2651 temp
.var
= escaped_vars_id
;
2654 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2660 temp
.type
= ADDRESSOF
;
2661 temp
.var
= anything_id
;
2663 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2670 switch (TREE_CODE (t
))
2674 get_constraint_for (TREE_OPERAND (t
, 0), results
);
2679 case ARRAY_RANGE_REF
:
2681 get_constraint_for_component_ref (t
, results
);
2685 temp
.type
= ADDRESSOF
;
2686 temp
.var
= anything_id
;
2688 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2695 switch (TREE_CODE (t
))
2699 case NON_LVALUE_EXPR
:
2701 tree op
= TREE_OPERAND (t
, 0);
2703 /* Cast from non-pointer to pointers are bad news for us.
2704 Anything else, we see through */
2705 if (!(POINTER_TYPE_P (TREE_TYPE (t
))
2706 && ! POINTER_TYPE_P (TREE_TYPE (op
))))
2708 get_constraint_for (op
, results
);
2716 temp
.type
= ADDRESSOF
;
2717 temp
.var
= anything_id
;
2719 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2724 case tcc_exceptional
:
2726 switch (TREE_CODE (t
))
2730 get_constraint_for (PHI_RESULT (t
), results
);
2736 struct constraint_expr temp
;
2737 temp
= get_constraint_exp_from_ssa_var (t
);
2738 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2744 temp
.type
= ADDRESSOF
;
2745 temp
.var
= anything_id
;
2747 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2752 case tcc_declaration
:
2754 struct constraint_expr temp
;
2755 temp
= get_constraint_exp_from_ssa_var (t
);
2756 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2761 temp
.type
= ADDRESSOF
;
2762 temp
.var
= anything_id
;
2764 VEC_safe_push (ce_s
, heap
, *results
, &temp
);
2771 /* Handle the structure copy case where we have a simple structure copy
2772 between LHS and RHS that is of SIZE (in bits)
2774 For each field of the lhs variable (lhsfield)
2775 For each field of the rhs variable at lhsfield.offset (rhsfield)
2776 add the constraint lhsfield = rhsfield
2778 If we fail due to some kind of type unsafety or other thing we
2779 can't handle, return false. We expect the caller to collapse the
2780 variable in that case. */
2783 do_simple_structure_copy (const struct constraint_expr lhs
,
2784 const struct constraint_expr rhs
,
2785 const unsigned HOST_WIDE_INT size
)
2787 varinfo_t p
= get_varinfo (lhs
.var
);
2788 unsigned HOST_WIDE_INT pstart
, last
;
2790 last
= p
->offset
+ size
;
2791 for (; p
&& p
->offset
< last
; p
= p
->next
)
2794 struct constraint_expr templhs
= lhs
;
2795 struct constraint_expr temprhs
= rhs
;
2796 unsigned HOST_WIDE_INT fieldoffset
;
2798 templhs
.var
= p
->id
;
2799 q
= get_varinfo (temprhs
.var
);
2800 fieldoffset
= p
->offset
- pstart
;
2801 q
= first_vi_for_offset (q
, q
->offset
+ fieldoffset
);
2804 temprhs
.var
= q
->id
;
2805 process_constraint (new_constraint (templhs
, temprhs
));
2811 /* Handle the structure copy case where we have a structure copy between a
2812 aggregate on the LHS and a dereference of a pointer on the RHS
2813 that is of SIZE (in bits)
2815 For each field of the lhs variable (lhsfield)
2816 rhs.offset = lhsfield->offset
2817 add the constraint lhsfield = rhs
2821 do_rhs_deref_structure_copy (const struct constraint_expr lhs
,
2822 const struct constraint_expr rhs
,
2823 const unsigned HOST_WIDE_INT size
)
2825 varinfo_t p
= get_varinfo (lhs
.var
);
2826 unsigned HOST_WIDE_INT pstart
,last
;
2828 last
= p
->offset
+ size
;
2830 for (; p
&& p
->offset
< last
; p
= p
->next
)
2833 struct constraint_expr templhs
= lhs
;
2834 struct constraint_expr temprhs
= rhs
;
2835 unsigned HOST_WIDE_INT fieldoffset
;
2838 if (templhs
.type
== SCALAR
)
2839 templhs
.var
= p
->id
;
2841 templhs
.offset
= p
->offset
;
2843 q
= get_varinfo (temprhs
.var
);
2844 fieldoffset
= p
->offset
- pstart
;
2845 temprhs
.offset
+= fieldoffset
;
2846 process_constraint (new_constraint (templhs
, temprhs
));
2850 /* Handle the structure copy case where we have a structure copy
2851 between a aggregate on the RHS and a dereference of a pointer on
2852 the LHS that is of SIZE (in bits)
2854 For each field of the rhs variable (rhsfield)
2855 lhs.offset = rhsfield->offset
2856 add the constraint lhs = rhsfield
2860 do_lhs_deref_structure_copy (const struct constraint_expr lhs
,
2861 const struct constraint_expr rhs
,
2862 const unsigned HOST_WIDE_INT size
)
2864 varinfo_t p
= get_varinfo (rhs
.var
);
2865 unsigned HOST_WIDE_INT pstart
,last
;
2867 last
= p
->offset
+ size
;
2869 for (; p
&& p
->offset
< last
; p
= p
->next
)
2872 struct constraint_expr templhs
= lhs
;
2873 struct constraint_expr temprhs
= rhs
;
2874 unsigned HOST_WIDE_INT fieldoffset
;
2877 if (temprhs
.type
== SCALAR
)
2878 temprhs
.var
= p
->id
;
2880 temprhs
.offset
= p
->offset
;
2882 q
= get_varinfo (templhs
.var
);
2883 fieldoffset
= p
->offset
- pstart
;
2884 templhs
.offset
+= fieldoffset
;
2885 process_constraint (new_constraint (templhs
, temprhs
));
2889 /* Sometimes, frontends like to give us bad type information. This
2890 function will collapse all the fields from VAR to the end of VAR,
2891 into VAR, so that we treat those fields as a single variable.
2892 We return the variable they were collapsed into. */
2895 collapse_rest_of_var (unsigned int var
)
2897 varinfo_t currvar
= get_varinfo (var
);
2900 for (field
= currvar
->next
; field
; field
= field
->next
)
2903 fprintf (dump_file
, "Type safety: Collapsing var %s into %s\n",
2904 field
->name
, currvar
->name
);
2906 gcc_assert (!field
->collapsed_to
);
2907 field
->collapsed_to
= currvar
;
2910 currvar
->next
= NULL
;
2911 currvar
->size
= currvar
->fullsize
- currvar
->offset
;
2916 /* Handle aggregate copies by expanding into copies of the respective
2917 fields of the structures. */
2920 do_structure_copy (tree lhsop
, tree rhsop
)
2922 struct constraint_expr lhs
, rhs
, tmp
;
2923 VEC (ce_s
, heap
) *lhsc
= NULL
, *rhsc
= NULL
;
2925 unsigned HOST_WIDE_INT lhssize
;
2926 unsigned HOST_WIDE_INT rhssize
;
2928 get_constraint_for (lhsop
, &lhsc
);
2929 get_constraint_for (rhsop
, &rhsc
);
2930 gcc_assert (VEC_length (ce_s
, lhsc
) == 1);
2931 gcc_assert (VEC_length (ce_s
, rhsc
) == 1);
2932 lhs
= *(VEC_last (ce_s
, lhsc
));
2933 rhs
= *(VEC_last (ce_s
, rhsc
));
2935 VEC_free (ce_s
, heap
, lhsc
);
2936 VEC_free (ce_s
, heap
, rhsc
);
2938 /* If we have special var = x, swap it around. */
2939 if (lhs
.var
<= integer_id
&& !(get_varinfo (rhs
.var
)->is_special_var
))
2946 /* This is fairly conservative for the RHS == ADDRESSOF case, in that it's
2947 possible it's something we could handle. However, most cases falling
2948 into this are dealing with transparent unions, which are slightly
2950 if (rhs
.type
== ADDRESSOF
&& !(get_varinfo (rhs
.var
)->is_special_var
))
2952 rhs
.type
= ADDRESSOF
;
2953 rhs
.var
= anything_id
;
2956 /* If the RHS is a special var, or an addressof, set all the LHS fields to
2957 that special var. */
2958 if (rhs
.var
<= integer_id
)
2960 for (p
= get_varinfo (lhs
.var
); p
; p
= p
->next
)
2962 struct constraint_expr templhs
= lhs
;
2963 struct constraint_expr temprhs
= rhs
;
2965 if (templhs
.type
== SCALAR
)
2966 templhs
.var
= p
->id
;
2968 templhs
.offset
+= p
->offset
;
2969 process_constraint (new_constraint (templhs
, temprhs
));
2974 tree rhstype
= TREE_TYPE (rhsop
);
2975 tree lhstype
= TREE_TYPE (lhsop
);
2979 lhstypesize
= DECL_P (lhsop
) ? DECL_SIZE (lhsop
) : TYPE_SIZE (lhstype
);
2980 rhstypesize
= DECL_P (rhsop
) ? DECL_SIZE (rhsop
) : TYPE_SIZE (rhstype
);
2982 /* If we have a variably sized types on the rhs or lhs, and a deref
2983 constraint, add the constraint, lhsconstraint = &ANYTHING.
2984 This is conservatively correct because either the lhs is an unknown
2985 sized var (if the constraint is SCALAR), or the lhs is a DEREF
2986 constraint, and every variable it can point to must be unknown sized
2987 anyway, so we don't need to worry about fields at all. */
2988 if ((rhs
.type
== DEREF
&& TREE_CODE (rhstypesize
) != INTEGER_CST
)
2989 || (lhs
.type
== DEREF
&& TREE_CODE (lhstypesize
) != INTEGER_CST
))
2991 rhs
.var
= anything_id
;
2992 rhs
.type
= ADDRESSOF
;
2994 process_constraint (new_constraint (lhs
, rhs
));
2998 /* The size only really matters insofar as we don't set more or less of
2999 the variable. If we hit an unknown size var, the size should be the
3000 whole darn thing. */
3001 if (get_varinfo (rhs
.var
)->is_unknown_size_var
)
3004 rhssize
= TREE_INT_CST_LOW (rhstypesize
);
3006 if (get_varinfo (lhs
.var
)->is_unknown_size_var
)
3009 lhssize
= TREE_INT_CST_LOW (lhstypesize
);
3012 if (rhs
.type
== SCALAR
&& lhs
.type
== SCALAR
)
3014 if (!do_simple_structure_copy (lhs
, rhs
, MIN (lhssize
, rhssize
)))
3016 lhs
.var
= collapse_rest_of_var (lhs
.var
);
3017 rhs
.var
= collapse_rest_of_var (rhs
.var
);
3022 process_constraint (new_constraint (lhs
, rhs
));
3025 else if (lhs
.type
!= DEREF
&& rhs
.type
== DEREF
)
3026 do_rhs_deref_structure_copy (lhs
, rhs
, MIN (lhssize
, rhssize
));
3027 else if (lhs
.type
== DEREF
&& rhs
.type
!= DEREF
)
3028 do_lhs_deref_structure_copy (lhs
, rhs
, MIN (lhssize
, rhssize
));
3031 tree pointedtotype
= lhstype
;
3034 gcc_assert (rhs
.type
== DEREF
&& lhs
.type
== DEREF
);
3035 tmpvar
= create_tmp_var_raw (pointedtotype
, "structcopydereftmp");
3036 do_structure_copy (tmpvar
, rhsop
);
3037 do_structure_copy (lhsop
, tmpvar
);
3043 /* Update related alias information kept in AI. This is used when
3044 building name tags, alias sets and deciding grouping heuristics.
3045 STMT is the statement to process. This function also updates
3046 ADDRESSABLE_VARS. */
3049 update_alias_info (tree stmt
, struct alias_info
*ai
)
3052 use_operand_p use_p
;
3054 enum escape_type stmt_escape_type
= is_escape_site (stmt
);
3057 if (stmt_escape_type
== ESCAPE_TO_CALL
3058 || stmt_escape_type
== ESCAPE_TO_PURE_CONST
)
3060 ai
->num_calls_found
++;
3061 if (stmt_escape_type
== ESCAPE_TO_PURE_CONST
)
3062 ai
->num_pure_const_calls_found
++;
3065 /* Mark all the variables whose address are taken by the statement. */
3066 addr_taken
= addresses_taken (stmt
);
3069 bitmap_ior_into (addressable_vars
, addr_taken
);
3071 /* If STMT is an escape point, all the addresses taken by it are
3073 if (stmt_escape_type
!= NO_ESCAPE
)
3078 EXECUTE_IF_SET_IN_BITMAP (addr_taken
, 0, i
, bi
)
3080 tree rvar
= referenced_var (i
);
3081 if (!unmodifiable_var_p (rvar
))
3082 mark_call_clobbered (rvar
, stmt_escape_type
);
3087 /* Process each operand use. If an operand may be aliased, keep
3088 track of how many times it's being used. For pointers, determine
3089 whether they are dereferenced by the statement, or whether their
3090 value escapes, etc. */
3091 FOR_EACH_PHI_OR_STMT_USE (use_p
, stmt
, iter
, SSA_OP_USE
)
3095 struct ptr_info_def
*pi
;
3096 bool is_store
, is_potential_deref
;
3097 unsigned num_uses
, num_derefs
;
3099 op
= USE_FROM_PTR (use_p
);
3101 /* If STMT is a PHI node, OP may be an ADDR_EXPR. If so, add it
3102 to the set of addressable variables. */
3103 if (TREE_CODE (op
) == ADDR_EXPR
)
3105 gcc_assert (TREE_CODE (stmt
) == PHI_NODE
);
3107 /* PHI nodes don't have annotations for pinning the set
3108 of addresses taken, so we collect them here.
3110 FIXME, should we allow PHI nodes to have annotations
3111 so that they can be treated like regular statements?
3112 Currently, they are treated as second-class
3114 add_to_addressable_set (TREE_OPERAND (op
, 0), &addressable_vars
);
3118 /* Ignore constants. */
3119 if (TREE_CODE (op
) != SSA_NAME
)
3122 var
= SSA_NAME_VAR (op
);
3123 v_ann
= var_ann (var
);
3125 /* The base variable of an ssa name must be a GIMPLE register, and thus
3126 it cannot be aliased. */
3127 gcc_assert (!may_be_aliased (var
));
3129 /* We are only interested in pointers. */
3130 if (!POINTER_TYPE_P (TREE_TYPE (op
)))
3133 pi
= get_ptr_info (op
);
3135 /* Add OP to AI->PROCESSED_PTRS, if it's not there already. */
3136 if (!TEST_BIT (ai
->ssa_names_visited
, SSA_NAME_VERSION (op
)))
3138 SET_BIT (ai
->ssa_names_visited
, SSA_NAME_VERSION (op
));
3139 VEC_safe_push (tree
, heap
, ai
->processed_ptrs
, op
);
3142 /* If STMT is a PHI node, then it will not have pointer
3143 dereferences and it will not be an escape point. */
3144 if (TREE_CODE (stmt
) == PHI_NODE
)
3147 /* Determine whether OP is a dereferenced pointer, and if STMT
3148 is an escape point, whether OP escapes. */
3149 count_uses_and_derefs (op
, stmt
, &num_uses
, &num_derefs
, &is_store
);
3151 /* Handle a corner case involving address expressions of the
3152 form '&PTR->FLD'. The problem with these expressions is that
3153 they do not represent a dereference of PTR. However, if some
3154 other transformation propagates them into an INDIRECT_REF
3155 expression, we end up with '*(&PTR->FLD)' which is folded
3158 So, if the original code had no other dereferences of PTR,
3159 the aliaser will not create memory tags for it, and when
3160 &PTR->FLD gets propagated to INDIRECT_REF expressions, the
3161 memory operations will receive no V_MAY_DEF/VUSE operands.
3163 One solution would be to have count_uses_and_derefs consider
3164 &PTR->FLD a dereference of PTR. But that is wrong, since it
3165 is not really a dereference but an offset calculation.
3167 What we do here is to recognize these special ADDR_EXPR
3168 nodes. Since these expressions are never GIMPLE values (they
3169 are not GIMPLE invariants), they can only appear on the RHS
3170 of an assignment and their base address is always an
3171 INDIRECT_REF expression. */
3172 is_potential_deref
= false;
3173 if (TREE_CODE (stmt
) == MODIFY_EXPR
3174 && TREE_CODE (TREE_OPERAND (stmt
, 1)) == ADDR_EXPR
3175 && !is_gimple_val (TREE_OPERAND (stmt
, 1)))
3177 /* If the RHS if of the form &PTR->FLD and PTR == OP, then
3178 this represents a potential dereference of PTR. */
3179 tree rhs
= TREE_OPERAND (stmt
, 1);
3180 tree base
= get_base_address (TREE_OPERAND (rhs
, 0));
3181 if (TREE_CODE (base
) == INDIRECT_REF
3182 && TREE_OPERAND (base
, 0) == op
)
3183 is_potential_deref
= true;
3186 if (num_derefs
> 0 || is_potential_deref
)
3188 /* Mark OP as dereferenced. In a subsequent pass,
3189 dereferenced pointers that point to a set of
3190 variables will be assigned a name tag to alias
3191 all the variables OP points to. */
3192 pi
->is_dereferenced
= 1;
3194 /* Keep track of how many time we've dereferenced each
3196 NUM_REFERENCES_INC (v_ann
);
3198 /* If this is a store operation, mark OP as being
3199 dereferenced to store, otherwise mark it as being
3200 dereferenced to load. */
3202 bitmap_set_bit (ai
->dereferenced_ptrs_store
, DECL_UID (var
));
3204 bitmap_set_bit (ai
->dereferenced_ptrs_load
, DECL_UID (var
));
3207 if (stmt_escape_type
!= NO_ESCAPE
&& num_derefs
< num_uses
)
3209 /* If STMT is an escape point and STMT contains at
3210 least one direct use of OP, then the value of OP
3211 escapes and so the pointed-to variables need to
3212 be marked call-clobbered. */
3213 pi
->value_escapes_p
= 1;
3214 pi
->escape_mask
|= stmt_escape_type
;
3216 /* If the statement makes a function call, assume
3217 that pointer OP will be dereferenced in a store
3218 operation inside the called function. */
3219 if (get_call_expr_in (stmt
)
3220 || stmt_escape_type
== ESCAPE_STORED_IN_GLOBAL
)
3222 bitmap_set_bit (ai
->dereferenced_ptrs_store
, DECL_UID (var
));
3223 pi
->is_dereferenced
= 1;
3228 if (TREE_CODE (stmt
) == PHI_NODE
)
3231 /* Update reference counter for definitions to any
3232 potentially aliased variable. This is used in the alias
3233 grouping heuristics. */
3234 FOR_EACH_SSA_TREE_OPERAND (op
, stmt
, iter
, SSA_OP_DEF
)
3236 tree var
= SSA_NAME_VAR (op
);
3237 var_ann_t ann
= var_ann (var
);
3238 bitmap_set_bit (ai
->written_vars
, DECL_UID (var
));
3239 if (may_be_aliased (var
))
3240 NUM_REFERENCES_INC (ann
);
3244 /* Mark variables in V_MAY_DEF operands as being written to. */
3245 FOR_EACH_SSA_TREE_OPERAND (op
, stmt
, iter
, SSA_OP_VIRTUAL_DEFS
)
3247 tree var
= DECL_P (op
) ? op
: SSA_NAME_VAR (op
);
3248 bitmap_set_bit (ai
->written_vars
, DECL_UID (var
));
3252 /* Handle pointer arithmetic EXPR when creating aliasing constraints.
3253 Expressions of the type PTR + CST can be handled in two ways:
3255 1- If the constraint for PTR is ADDRESSOF for a non-structure
3256 variable, then we can use it directly because adding or
3257 subtracting a constant may not alter the original ADDRESSOF
3258 constraint (i.e., pointer arithmetic may not legally go outside
3259 an object's boundaries).
3261 2- If the constraint for PTR is ADDRESSOF for a structure variable,
3262 then if CST is a compile-time constant that can be used as an
3263 offset, we can determine which sub-variable will be pointed-to
3266 Return true if the expression is handled. For any other kind of
3267 expression, return false so that each operand can be added as a
3268 separate constraint by the caller. */
3271 handle_ptr_arith (VEC (ce_s
, heap
) *lhsc
, tree expr
)
3274 struct constraint_expr
*c
, *c2
;
3277 VEC (ce_s
, heap
) *temp
= NULL
;
3278 unsigned HOST_WIDE_INT rhsoffset
= 0;
3280 if (TREE_CODE (expr
) != PLUS_EXPR
3281 && TREE_CODE (expr
) != MINUS_EXPR
)
3284 op0
= TREE_OPERAND (expr
, 0);
3285 op1
= TREE_OPERAND (expr
, 1);
3287 get_constraint_for (op0
, &temp
);
3288 if (POINTER_TYPE_P (TREE_TYPE (op0
))
3289 && host_integerp (op1
, 1)
3290 && TREE_CODE (expr
) == PLUS_EXPR
)
3292 if ((TREE_INT_CST_LOW (op1
) * BITS_PER_UNIT
) / BITS_PER_UNIT
3293 != TREE_INT_CST_LOW (op1
))
3295 rhsoffset
= TREE_INT_CST_LOW (op1
) * BITS_PER_UNIT
;
3301 for (i
= 0; VEC_iterate (ce_s
, lhsc
, i
, c
); i
++)
3302 for (j
= 0; VEC_iterate (ce_s
, temp
, j
, c2
); j
++)
3304 if (c2
->type
== ADDRESSOF
&& rhsoffset
!= 0)
3306 varinfo_t temp
= get_varinfo (c2
->var
);
3308 /* An access one after the end of an array is valid,
3309 so simply punt on accesses we cannot resolve. */
3310 temp
= first_vi_for_offset (temp
, rhsoffset
);
3317 c2
->offset
= rhsoffset
;
3318 process_constraint (new_constraint (*c
, *c2
));
3321 VEC_free (ce_s
, heap
, temp
);
3327 /* Walk statement T setting up aliasing constraints according to the
3328 references found in T. This function is the main part of the
3329 constraint builder. AI points to auxiliary alias information used
3330 when building alias sets and computing alias grouping heuristics. */
3333 find_func_aliases (tree origt
)
3336 VEC(ce_s
, heap
) *lhsc
= NULL
;
3337 VEC(ce_s
, heap
) *rhsc
= NULL
;
3338 struct constraint_expr
*c
;
3340 if (TREE_CODE (t
) == RETURN_EXPR
&& TREE_OPERAND (t
, 0))
3341 t
= TREE_OPERAND (t
, 0);
3343 /* Now build constraints expressions. */
3344 if (TREE_CODE (t
) == PHI_NODE
)
3346 gcc_assert (!AGGREGATE_TYPE_P (TREE_TYPE (PHI_RESULT (t
))));
3348 /* Only care about pointers and structures containing
3350 if (could_have_pointers (PHI_RESULT (t
)))
3355 /* For a phi node, assign all the arguments to
3357 get_constraint_for (PHI_RESULT (t
), &lhsc
);
3358 for (i
= 0; i
< PHI_NUM_ARGS (t
); i
++)
3361 tree strippedrhs
= PHI_ARG_DEF (t
, i
);
3363 STRIP_NOPS (strippedrhs
);
3364 rhstype
= TREE_TYPE (strippedrhs
);
3365 get_constraint_for (PHI_ARG_DEF (t
, i
), &rhsc
);
3367 for (j
= 0; VEC_iterate (ce_s
, lhsc
, j
, c
); j
++)
3369 struct constraint_expr
*c2
;
3370 while (VEC_length (ce_s
, rhsc
) > 0)
3372 c2
= VEC_last (ce_s
, rhsc
);
3373 process_constraint (new_constraint (*c
, *c2
));
3374 VEC_pop (ce_s
, rhsc
);
3380 /* In IPA mode, we need to generate constraints to pass call
3381 arguments through their calls. There are two case, either a
3382 modify_expr when we are returning a value, or just a plain
3383 call_expr when we are not. */
3384 else if (in_ipa_mode
3385 && ((TREE_CODE (t
) == MODIFY_EXPR
3386 && TREE_CODE (TREE_OPERAND (t
, 1)) == CALL_EXPR
3387 && !(call_expr_flags (TREE_OPERAND (t
, 1))
3388 & (ECF_MALLOC
| ECF_MAY_BE_ALLOCA
)))
3389 || (TREE_CODE (t
) == CALL_EXPR
3390 && !(call_expr_flags (t
)
3391 & (ECF_MALLOC
| ECF_MAY_BE_ALLOCA
)))))
3399 if (TREE_CODE (t
) == MODIFY_EXPR
)
3401 lhsop
= TREE_OPERAND (t
, 0);
3402 rhsop
= TREE_OPERAND (t
, 1);
3409 decl
= get_callee_fndecl (rhsop
);
3411 /* If we can directly resolve the function being called, do so.
3412 Otherwise, it must be some sort of indirect expression that
3413 we should still be able to handle. */
3416 fi
= get_vi_for_tree (decl
);
3420 decl
= TREE_OPERAND (rhsop
, 0);
3421 fi
= get_vi_for_tree (decl
);
3424 /* Assign all the passed arguments to the appropriate incoming
3425 parameters of the function. */
3426 arglist
= TREE_OPERAND (rhsop
, 1);
3428 for (;arglist
; arglist
= TREE_CHAIN (arglist
))
3430 tree arg
= TREE_VALUE (arglist
);
3431 struct constraint_expr lhs
;
3432 struct constraint_expr
*rhsp
;
3434 get_constraint_for (arg
, &rhsc
);
3435 if (TREE_CODE (decl
) != FUNCTION_DECL
)
3444 lhs
.var
= first_vi_for_offset (fi
, i
)->id
;
3447 while (VEC_length (ce_s
, rhsc
) != 0)
3449 rhsp
= VEC_last (ce_s
, rhsc
);
3450 process_constraint (new_constraint (lhs
, *rhsp
));
3451 VEC_pop (ce_s
, rhsc
);
3456 /* If we are returning a value, assign it to the result. */
3459 struct constraint_expr rhs
;
3460 struct constraint_expr
*lhsp
;
3463 get_constraint_for (lhsop
, &lhsc
);
3464 if (TREE_CODE (decl
) != FUNCTION_DECL
)
3473 rhs
.var
= first_vi_for_offset (fi
, i
)->id
;
3476 for (j
= 0; VEC_iterate (ce_s
, lhsc
, j
, lhsp
); j
++)
3477 process_constraint (new_constraint (*lhsp
, rhs
));
3480 /* Otherwise, just a regular assignment statement. */
3481 else if (TREE_CODE (t
) == MODIFY_EXPR
)
3483 tree lhsop
= TREE_OPERAND (t
, 0);
3484 tree rhsop
= TREE_OPERAND (t
, 1);
3487 if ((AGGREGATE_TYPE_P (TREE_TYPE (lhsop
))
3488 || TREE_CODE (TREE_TYPE (lhsop
)) == COMPLEX_TYPE
)
3489 && (AGGREGATE_TYPE_P (TREE_TYPE (rhsop
))
3490 || TREE_CODE (TREE_TYPE (lhsop
)) == COMPLEX_TYPE
))
3492 do_structure_copy (lhsop
, rhsop
);
3496 /* Only care about operations with pointers, structures
3497 containing pointers, dereferences, and call expressions. */
3498 if (could_have_pointers (lhsop
)
3499 || TREE_CODE (rhsop
) == CALL_EXPR
)
3501 get_constraint_for (lhsop
, &lhsc
);
3502 switch (TREE_CODE_CLASS (TREE_CODE (rhsop
)))
3504 /* RHS that consist of unary operations,
3505 exceptional types, or bare decls/constants, get
3506 handled directly by get_constraint_for. */
3508 case tcc_declaration
:
3510 case tcc_exceptional
:
3511 case tcc_expression
:
3516 get_constraint_for (rhsop
, &rhsc
);
3517 for (j
= 0; VEC_iterate (ce_s
, lhsc
, j
, c
); j
++)
3519 struct constraint_expr
*c2
;
3522 for (k
= 0; VEC_iterate (ce_s
, rhsc
, k
, c2
); k
++)
3523 process_constraint (new_constraint (*c
, *c2
));
3531 /* For pointer arithmetic of the form
3532 PTR + CST, we can simply use PTR's
3533 constraint because pointer arithmetic is
3534 not allowed to go out of bounds. */
3535 if (handle_ptr_arith (lhsc
, rhsop
))
3540 /* Otherwise, walk each operand. Notice that we
3541 can't use the operand interface because we need
3542 to process expressions other than simple operands
3543 (e.g. INDIRECT_REF, ADDR_EXPR, CALL_EXPR). */
3545 for (i
= 0; i
< TREE_CODE_LENGTH (TREE_CODE (rhsop
)); i
++)
3547 tree op
= TREE_OPERAND (rhsop
, i
);
3550 gcc_assert (VEC_length (ce_s
, rhsc
) == 0);
3551 get_constraint_for (op
, &rhsc
);
3552 for (j
= 0; VEC_iterate (ce_s
, lhsc
, j
, c
); j
++)
3554 struct constraint_expr
*c2
;
3555 while (VEC_length (ce_s
, rhsc
) > 0)
3557 c2
= VEC_last (ce_s
, rhsc
);
3558 process_constraint (new_constraint (*c
, *c2
));
3559 VEC_pop (ce_s
, rhsc
);
3568 /* After promoting variables and computing aliasing we will
3569 need to re-scan most statements. FIXME: Try to minimize the
3570 number of statements re-scanned. It's not really necessary to
3571 re-scan *all* statements. */
3572 mark_stmt_modified (origt
);
3573 VEC_free (ce_s
, heap
, rhsc
);
3574 VEC_free (ce_s
, heap
, lhsc
);
3578 /* Find the first varinfo in the same variable as START that overlaps with
3580 Effectively, walk the chain of fields for the variable START to find the
3581 first field that overlaps with OFFSET.
3582 Return NULL if we can't find one. */
3585 first_vi_for_offset (varinfo_t start
, unsigned HOST_WIDE_INT offset
)
3587 varinfo_t curr
= start
;
3590 /* We may not find a variable in the field list with the actual
3591 offset when when we have glommed a structure to a variable.
3592 In that case, however, offset should still be within the size
3594 if (offset
>= curr
->offset
&& offset
< (curr
->offset
+ curr
->size
))
3602 /* Insert the varinfo FIELD into the field list for BASE, at the front
3606 insert_into_field_list (varinfo_t base
, varinfo_t field
)
3608 varinfo_t prev
= base
;
3609 varinfo_t curr
= base
->next
;
3615 /* Insert the varinfo FIELD into the field list for BASE, ordered by
3619 insert_into_field_list_sorted (varinfo_t base
, varinfo_t field
)
3621 varinfo_t prev
= base
;
3622 varinfo_t curr
= base
->next
;
3633 if (field
->offset
<= curr
->offset
)
3638 field
->next
= prev
->next
;
3643 /* qsort comparison function for two fieldoff's PA and PB */
3646 fieldoff_compare (const void *pa
, const void *pb
)
3648 const fieldoff_s
*foa
= (const fieldoff_s
*)pa
;
3649 const fieldoff_s
*fob
= (const fieldoff_s
*)pb
;
3650 HOST_WIDE_INT foasize
, fobsize
;
3652 if (foa
->offset
!= fob
->offset
)
3653 return foa
->offset
- fob
->offset
;
3655 foasize
= TREE_INT_CST_LOW (foa
->size
);
3656 fobsize
= TREE_INT_CST_LOW (fob
->size
);
3657 return foasize
- fobsize
;
3660 /* Sort a fieldstack according to the field offset and sizes. */
3662 sort_fieldstack (VEC(fieldoff_s
,heap
) *fieldstack
)
3664 qsort (VEC_address (fieldoff_s
, fieldstack
),
3665 VEC_length (fieldoff_s
, fieldstack
),
3666 sizeof (fieldoff_s
),
3670 /* Given a TYPE, and a vector of field offsets FIELDSTACK, push all the fields
3671 of TYPE onto fieldstack, recording their offsets along the way.
3672 OFFSET is used to keep track of the offset in this entire structure, rather
3673 than just the immediately containing structure. Returns the number
3675 HAS_UNION is set to true if we find a union type as a field of
3679 push_fields_onto_fieldstack (tree type
, VEC(fieldoff_s
,heap
) **fieldstack
,
3680 HOST_WIDE_INT offset
, bool *has_union
)
3684 unsigned HOST_WIDE_INT minoffset
= -1;
3686 if (TREE_CODE (type
) == COMPLEX_TYPE
)
3688 fieldoff_s
*real_part
, *img_part
;
3689 real_part
= VEC_safe_push (fieldoff_s
, heap
, *fieldstack
, NULL
);
3690 real_part
->type
= TREE_TYPE (type
);
3691 real_part
->size
= TYPE_SIZE (TREE_TYPE (type
));
3692 real_part
->offset
= offset
;
3693 real_part
->decl
= NULL_TREE
;
3695 img_part
= VEC_safe_push (fieldoff_s
, heap
, *fieldstack
, NULL
);
3696 img_part
->type
= TREE_TYPE (type
);
3697 img_part
->size
= TYPE_SIZE (TREE_TYPE (type
));
3698 img_part
->offset
= offset
+ TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (type
)));
3699 img_part
->decl
= NULL_TREE
;
3704 if (TREE_CODE (type
) == ARRAY_TYPE
)
3706 tree sz
= TYPE_SIZE (type
);
3707 tree elsz
= TYPE_SIZE (TREE_TYPE (type
));
3712 || ! host_integerp (sz
, 1)
3713 || TREE_INT_CST_LOW (sz
) == 0
3715 || ! host_integerp (elsz
, 1)
3716 || TREE_INT_CST_LOW (elsz
) == 0)
3719 nr
= TREE_INT_CST_LOW (sz
) / TREE_INT_CST_LOW (elsz
);
3720 if (nr
> SALIAS_MAX_ARRAY_ELEMENTS
)
3723 for (i
= 0; i
< nr
; ++i
)
3729 && (TREE_CODE (TREE_TYPE (type
)) == QUAL_UNION_TYPE
3730 || TREE_CODE (TREE_TYPE (type
)) == UNION_TYPE
))
3733 if (!AGGREGATE_TYPE_P (TREE_TYPE (type
))) /* var_can_have_subvars */
3735 else if (!(pushed
= push_fields_onto_fieldstack
3736 (TREE_TYPE (type
), fieldstack
,
3737 offset
+ i
* TREE_INT_CST_LOW (elsz
), has_union
)))
3738 /* Empty structures may have actual size, like in C++. So
3739 see if we didn't push any subfields and the size is
3740 nonzero, push the field onto the stack */
3747 pair
= VEC_safe_push (fieldoff_s
, heap
, *fieldstack
, NULL
);
3748 pair
->type
= TREE_TYPE (type
);
3750 pair
->decl
= NULL_TREE
;
3751 pair
->offset
= offset
+ i
* TREE_INT_CST_LOW (elsz
);
3761 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
3762 if (TREE_CODE (field
) == FIELD_DECL
)
3768 && (TREE_CODE (TREE_TYPE (field
)) == QUAL_UNION_TYPE
3769 || TREE_CODE (TREE_TYPE (field
)) == UNION_TYPE
))
3772 if (!var_can_have_subvars (field
))
3774 else if (!(pushed
= push_fields_onto_fieldstack
3775 (TREE_TYPE (field
), fieldstack
,
3776 offset
+ bitpos_of_field (field
), has_union
))
3777 && DECL_SIZE (field
)
3778 && !integer_zerop (DECL_SIZE (field
)))
3779 /* Empty structures may have actual size, like in C++. So
3780 see if we didn't push any subfields and the size is
3781 nonzero, push the field onto the stack */
3788 pair
= VEC_safe_push (fieldoff_s
, heap
, *fieldstack
, NULL
);
3789 pair
->type
= TREE_TYPE (field
);
3790 pair
->size
= DECL_SIZE (field
);
3792 pair
->offset
= offset
+ bitpos_of_field (field
);
3798 if (bitpos_of_field (field
) < minoffset
)
3799 minoffset
= bitpos_of_field (field
);
3802 /* We need to create a fake subvar for empty bases. But _only_ for non-empty
3804 if (minoffset
!= 0 && count
!= 0)
3808 pair
= VEC_safe_push (fieldoff_s
, heap
, *fieldstack
, NULL
);
3809 pair
->type
= void_type_node
;
3810 pair
->size
= build_int_cst (size_type_node
, minoffset
);
3812 pair
->offset
= offset
;
3819 /* Create a constraint from ESCAPED_VARS variable to VI. */
3821 make_constraint_from_escaped (varinfo_t vi
)
3823 struct constraint_expr lhs
, rhs
;
3829 rhs
.var
= escaped_vars_id
;
3832 process_constraint (new_constraint (lhs
, rhs
));
3835 /* Create a constraint to the ESCAPED_VARS variable from constraint
3839 make_constraint_to_escaped (struct constraint_expr rhs
)
3841 struct constraint_expr lhs
;
3843 lhs
.var
= escaped_vars_id
;
3847 process_constraint (new_constraint (lhs
, rhs
));
3850 /* Count the number of arguments DECL has, and set IS_VARARGS to true
3851 if it is a varargs function. */
3854 count_num_arguments (tree decl
, bool *is_varargs
)
3859 for (t
= TYPE_ARG_TYPES (TREE_TYPE (decl
));
3863 if (TREE_VALUE (t
) == void_type_node
)
3873 /* Creation function node for DECL, using NAME, and return the index
3874 of the variable we've created for the function. */
3877 create_function_info_for (tree decl
, const char *name
)
3879 unsigned int index
= VEC_length (varinfo_t
, varmap
);
3883 bool is_varargs
= false;
3885 /* Create the variable info. */
3887 vi
= new_var_info (decl
, index
, name
);
3892 vi
->fullsize
= count_num_arguments (decl
, &is_varargs
) + 1;
3893 insert_vi_for_tree (vi
->decl
, vi
);
3894 VEC_safe_push (varinfo_t
, heap
, varmap
, vi
);
3898 /* If it's varargs, we don't know how many arguments it has, so we
3905 vi
->is_unknown_size_var
= true;
3910 arg
= DECL_ARGUMENTS (decl
);
3912 /* Set up variables for each argument. */
3913 for (i
= 1; i
< vi
->fullsize
; i
++)
3916 const char *newname
;
3918 unsigned int newindex
;
3919 tree argdecl
= decl
;
3924 newindex
= VEC_length (varinfo_t
, varmap
);
3925 asprintf (&tempname
, "%s.arg%d", name
, i
-1);
3926 newname
= ggc_strdup (tempname
);
3929 argvi
= new_var_info (argdecl
, newindex
, newname
);
3930 argvi
->decl
= argdecl
;
3931 VEC_safe_push (varinfo_t
, heap
, varmap
, argvi
);
3934 argvi
->fullsize
= vi
->fullsize
;
3935 argvi
->has_union
= false;
3936 insert_into_field_list_sorted (vi
, argvi
);
3937 stats
.total_vars
++;
3940 insert_vi_for_tree (arg
, argvi
);
3941 arg
= TREE_CHAIN (arg
);
3945 /* Create a variable for the return var. */
3946 if (DECL_RESULT (decl
) != NULL
3947 || !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl
))))
3950 const char *newname
;
3952 unsigned int newindex
;
3953 tree resultdecl
= decl
;
3957 if (DECL_RESULT (decl
))
3958 resultdecl
= DECL_RESULT (decl
);
3960 newindex
= VEC_length (varinfo_t
, varmap
);
3961 asprintf (&tempname
, "%s.result", name
);
3962 newname
= ggc_strdup (tempname
);
3965 resultvi
= new_var_info (resultdecl
, newindex
, newname
);
3966 resultvi
->decl
= resultdecl
;
3967 VEC_safe_push (varinfo_t
, heap
, varmap
, resultvi
);
3968 resultvi
->offset
= i
;
3970 resultvi
->fullsize
= vi
->fullsize
;
3971 resultvi
->has_union
= false;
3972 insert_into_field_list_sorted (vi
, resultvi
);
3973 stats
.total_vars
++;
3974 if (DECL_RESULT (decl
))
3975 insert_vi_for_tree (DECL_RESULT (decl
), resultvi
);
3981 /* Return true if FIELDSTACK contains fields that overlap.
3982 FIELDSTACK is assumed to be sorted by offset. */
3985 check_for_overlaps (VEC (fieldoff_s
,heap
) *fieldstack
)
3987 fieldoff_s
*fo
= NULL
;
3989 HOST_WIDE_INT lastoffset
= -1;
3991 for (i
= 0; VEC_iterate (fieldoff_s
, fieldstack
, i
, fo
); i
++)
3993 if (fo
->offset
== lastoffset
)
3995 lastoffset
= fo
->offset
;
4000 /* This function is called through walk_tree to walk global
4001 initializers looking for constraints we need to add to the
4005 find_global_initializers (tree
*tp
, int *walk_subtrees ATTRIBUTE_UNUSED
,
4008 varinfo_t vi
= (varinfo_t
)viv
;
4011 switch (TREE_CODE (t
))
4013 /* Dereferences and addressofs are the only important things
4014 here, and i don't even remember if dereferences are legal
4015 here in initializers. */
4019 struct constraint_expr
*c
;
4022 VEC(ce_s
, heap
) *rhsc
= NULL
;
4023 get_constraint_for (t
, &rhsc
);
4024 for (i
= 0; VEC_iterate (ce_s
, rhsc
, i
, c
); i
++)
4026 struct constraint_expr lhs
;
4031 process_constraint (new_constraint (lhs
, *c
));
4034 VEC_free (ce_s
, heap
, rhsc
);
4038 /* We might not have walked this because we skip
4039 DECL_EXTERNALs during the initial scan. */
4040 if (referenced_vars
)
4043 if (referenced_var_check_and_insert (t
))
4044 mark_sym_for_renaming (t
);
4053 /* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
4054 This will also create any varinfo structures necessary for fields
4058 create_variable_info_for (tree decl
, const char *name
)
4060 unsigned int index
= VEC_length (varinfo_t
, varmap
);
4062 tree
decltype = TREE_TYPE (decl
);
4063 tree declsize
= DECL_P (decl
) ? DECL_SIZE (decl
) : TYPE_SIZE (decltype);
4064 bool notokay
= false;
4066 bool is_global
= DECL_P (decl
) ? is_global_var (decl
) : false;
4067 VEC (fieldoff_s
,heap
) *fieldstack
= NULL
;
4069 if (TREE_CODE (decl
) == FUNCTION_DECL
&& in_ipa_mode
)
4070 return create_function_info_for (decl
, name
);
4072 hasunion
= TREE_CODE (decltype) == UNION_TYPE
4073 || TREE_CODE (decltype) == QUAL_UNION_TYPE
;
4074 if (var_can_have_subvars (decl
) && use_field_sensitive
&& !hasunion
)
4076 push_fields_onto_fieldstack (decltype, &fieldstack
, 0, &hasunion
);
4079 VEC_free (fieldoff_s
, heap
, fieldstack
);
4085 /* If the variable doesn't have subvars, we may end up needing to
4086 sort the field list and create fake variables for all the
4088 vi
= new_var_info (decl
, index
, name
);
4091 vi
->has_union
= hasunion
;
4093 || TREE_CODE (declsize
) != INTEGER_CST
4094 || TREE_CODE (decltype) == UNION_TYPE
4095 || TREE_CODE (decltype) == QUAL_UNION_TYPE
)
4097 vi
->is_unknown_size_var
= true;
4103 vi
->fullsize
= TREE_INT_CST_LOW (declsize
);
4104 vi
->size
= vi
->fullsize
;
4107 insert_vi_for_tree (vi
->decl
, vi
);
4108 VEC_safe_push (varinfo_t
, heap
, varmap
, vi
);
4109 if (is_global
&& (!flag_whole_program
|| !in_ipa_mode
))
4111 make_constraint_from_escaped (vi
);
4113 /* If the variable can't be aliased, there is no point in
4114 putting it in the set of nonlocal vars. */
4115 if (may_be_aliased (vi
->decl
))
4117 struct constraint_expr rhs
;
4119 rhs
.type
= ADDRESSOF
;
4121 make_constraint_to_escaped (rhs
);
4124 if (TREE_CODE (decl
) != FUNCTION_DECL
&& DECL_INITIAL (decl
))
4126 walk_tree_without_duplicates (&DECL_INITIAL (decl
),
4127 find_global_initializers
,
4133 if (use_field_sensitive
4135 && !vi
->is_unknown_size_var
4136 && var_can_have_subvars (decl
)
4137 && VEC_length (fieldoff_s
, fieldstack
) <= MAX_FIELDS_FOR_FIELD_SENSITIVE
)
4139 unsigned int newindex
= VEC_length (varinfo_t
, varmap
);
4140 fieldoff_s
*fo
= NULL
;
4143 for (i
= 0; !notokay
&& VEC_iterate (fieldoff_s
, fieldstack
, i
, fo
); i
++)
4146 || TREE_CODE (fo
->size
) != INTEGER_CST
4154 /* We can't sort them if we have a field with a variable sized type,
4155 which will make notokay = true. In that case, we are going to return
4156 without creating varinfos for the fields anyway, so sorting them is a
4160 sort_fieldstack (fieldstack
);
4161 /* Due to some C++ FE issues, like PR 22488, we might end up
4162 what appear to be overlapping fields even though they,
4163 in reality, do not overlap. Until the C++ FE is fixed,
4164 we will simply disable field-sensitivity for these cases. */
4165 notokay
= check_for_overlaps (fieldstack
);
4169 if (VEC_length (fieldoff_s
, fieldstack
) != 0)
4170 fo
= VEC_index (fieldoff_s
, fieldstack
, 0);
4172 if (fo
== NULL
|| notokay
)
4174 vi
->is_unknown_size_var
= 1;
4177 VEC_free (fieldoff_s
, heap
, fieldstack
);
4181 vi
->size
= TREE_INT_CST_LOW (fo
->size
);
4182 vi
->offset
= fo
->offset
;
4183 for (i
= VEC_length (fieldoff_s
, fieldstack
) - 1;
4184 i
>= 1 && VEC_iterate (fieldoff_s
, fieldstack
, i
, fo
);
4188 const char *newname
= "NULL";
4191 newindex
= VEC_length (varinfo_t
, varmap
);
4195 asprintf (&tempname
, "%s.%s",
4196 vi
->name
, alias_get_name (fo
->decl
));
4198 asprintf (&tempname
, "%s." HOST_WIDE_INT_PRINT_DEC
,
4199 vi
->name
, fo
->offset
);
4200 newname
= ggc_strdup (tempname
);
4203 newvi
= new_var_info (decl
, newindex
, newname
);
4204 newvi
->offset
= fo
->offset
;
4205 newvi
->size
= TREE_INT_CST_LOW (fo
->size
);
4206 newvi
->fullsize
= vi
->fullsize
;
4207 insert_into_field_list (vi
, newvi
);
4208 VEC_safe_push (varinfo_t
, heap
, varmap
, newvi
);
4209 if (is_global
&& (!flag_whole_program
|| !in_ipa_mode
))
4211 /* If the variable can't be aliased, there is no point in
4212 putting it in the set of nonlocal vars. */
4213 if (may_be_aliased (vi
->decl
))
4215 struct constraint_expr rhs
;
4218 rhs
.type
= ADDRESSOF
;
4220 make_constraint_to_escaped (rhs
);
4222 make_constraint_from_escaped (newvi
);
4227 VEC_free (fieldoff_s
, heap
, fieldstack
);
4232 /* Print out the points-to solution for VAR to FILE. */
4235 dump_solution_for_var (FILE *file
, unsigned int var
)
4237 varinfo_t vi
= get_varinfo (var
);
4241 if (find (var
) != var
)
4243 varinfo_t vipt
= get_varinfo (find (var
));
4244 fprintf (file
, "%s = same as %s\n", vi
->name
, vipt
->name
);
4248 fprintf (file
, "%s = { ", vi
->name
);
4249 EXECUTE_IF_SET_IN_BITMAP (vi
->solution
, 0, i
, bi
)
4251 fprintf (file
, "%s ", get_varinfo (i
)->name
);
4253 fprintf (file
, "}\n");
4257 /* Print the points-to solution for VAR to stdout. */
4260 debug_solution_for_var (unsigned int var
)
4262 dump_solution_for_var (stdout
, var
);
4265 /* Create varinfo structures for all of the variables in the
4266 function for intraprocedural mode. */
4269 intra_create_variable_infos (void)
4272 struct constraint_expr lhs
, rhs
;
4273 varinfo_t nonlocal_vi
;
4275 /* For each incoming pointer argument arg, ARG = ESCAPED_VARS or a
4276 dummy variable if flag_argument_noalias > 2. */
4277 for (t
= DECL_ARGUMENTS (current_function_decl
); t
; t
= TREE_CHAIN (t
))
4280 unsigned int arg_id
;
4282 if (!could_have_pointers (t
))
4285 arg_id
= get_vi_for_tree (t
)->id
;
4287 /* With flag_argument_noalias greater than two means that the incoming
4288 argument cannot alias anything except for itself so create a HEAP
4290 if (POINTER_TYPE_P (TREE_TYPE (t
))
4291 && flag_argument_noalias
> 2)
4294 tree heapvar
= heapvar_lookup (t
);
4298 lhs
.var
= get_vi_for_tree (t
)->id
;
4300 if (heapvar
== NULL_TREE
)
4302 heapvar
= create_tmp_var_raw (TREE_TYPE (TREE_TYPE (t
)),
4304 DECL_EXTERNAL (heapvar
) = 1;
4305 if (referenced_vars
)
4306 add_referenced_var (heapvar
);
4307 heapvar_insert (t
, heapvar
);
4310 vi
= get_vi_for_tree (heapvar
);
4311 vi
->is_artificial_var
= 1;
4312 vi
->is_heap_var
= 1;
4314 rhs
.type
= ADDRESSOF
;
4316 for (p
= get_varinfo (lhs
.var
); p
; p
= p
->next
)
4318 struct constraint_expr temp
= lhs
;
4320 process_constraint (new_constraint (temp
, rhs
));
4325 for (p
= get_varinfo (arg_id
); p
; p
= p
->next
)
4326 make_constraint_from_escaped (p
);
4330 nonlocal_all
= create_nonlocal_var (void_type_node
);
4332 /* Create variable info for the nonlocal var if it does not
4334 nonlocal_vars_id
= create_variable_info_for (nonlocal_all
,
4335 get_name (nonlocal_all
));
4336 nonlocal_vi
= get_varinfo (nonlocal_vars_id
);
4337 nonlocal_vi
->is_artificial_var
= 1;
4338 nonlocal_vi
->is_heap_var
= 1;
4339 nonlocal_vi
->is_unknown_size_var
= 1;
4340 nonlocal_vi
->directly_dereferenced
= true;
4342 rhs
.var
= nonlocal_vars_id
;
4343 rhs
.type
= ADDRESSOF
;
4346 lhs
.var
= escaped_vars_id
;
4350 process_constraint (new_constraint (lhs
, rhs
));
4353 /* Set bits in INTO corresponding to the variable uids in solution set
4354 FROM, which came from variable PTR.
4355 For variables that are actually dereferenced, we also use type
4356 based alias analysis to prune the points-to sets. */
4359 set_uids_in_ptset (tree ptr
, bitmap into
, bitmap from
)
4364 unsigned HOST_WIDE_INT ptr_alias_set
= get_alias_set (TREE_TYPE (ptr
));
4366 EXECUTE_IF_SET_IN_BITMAP (from
, 0, i
, bi
)
4368 varinfo_t vi
= get_varinfo (i
);
4369 unsigned HOST_WIDE_INT var_alias_set
;
4371 /* The only artificial variables that are allowed in a may-alias
4372 set are heap variables. */
4373 if (vi
->is_artificial_var
&& !vi
->is_heap_var
)
4376 if (vi
->has_union
&& get_subvars_for_var (vi
->decl
) != NULL
)
4378 /* Variables containing unions may need to be converted to
4379 their SFT's, because SFT's can have unions and we cannot. */
4380 for (sv
= get_subvars_for_var (vi
->decl
); sv
; sv
= sv
->next
)
4381 bitmap_set_bit (into
, DECL_UID (sv
->var
));
4383 else if (TREE_CODE (vi
->decl
) == VAR_DECL
4384 || TREE_CODE (vi
->decl
) == PARM_DECL
4385 || TREE_CODE (vi
->decl
) == RESULT_DECL
)
4387 if (var_can_have_subvars (vi
->decl
)
4388 && get_subvars_for_var (vi
->decl
))
4390 /* If VI->DECL is an aggregate for which we created
4391 SFTs, add the SFT corresponding to VI->OFFSET. */
4392 tree sft
= get_subvar_at (vi
->decl
, vi
->offset
);
4395 var_alias_set
= get_alias_set (sft
);
4396 if (!vi
->directly_dereferenced
4397 || alias_sets_conflict_p (ptr_alias_set
, var_alias_set
))
4398 bitmap_set_bit (into
, DECL_UID (sft
));
4403 /* Otherwise, just add VI->DECL to the alias set.
4404 Don't type prune artificial vars. */
4405 if (vi
->is_artificial_var
)
4406 bitmap_set_bit (into
, DECL_UID (vi
->decl
));
4409 var_alias_set
= get_alias_set (vi
->decl
);
4410 if (!vi
->directly_dereferenced
4411 || alias_sets_conflict_p (ptr_alias_set
, var_alias_set
))
4412 bitmap_set_bit (into
, DECL_UID (vi
->decl
));
4420 static bool have_alias_info
= false;
4422 /* Given a pointer variable P, fill in its points-to set, or return
4423 false if we can't. */
4426 find_what_p_points_to (tree p
)
4431 if (!have_alias_info
)
4434 /* For parameters, get at the points-to set for the actual parm
4436 if (TREE_CODE (p
) == SSA_NAME
4437 && TREE_CODE (SSA_NAME_VAR (p
)) == PARM_DECL
4438 && default_def (SSA_NAME_VAR (p
)) == p
)
4439 lookup_p
= SSA_NAME_VAR (p
);
4441 vi
= lookup_vi_for_tree (lookup_p
);
4445 if (vi
->is_artificial_var
)
4448 /* See if this is a field or a structure. */
4449 if (vi
->size
!= vi
->fullsize
)
4451 /* Nothing currently asks about structure fields directly,
4452 but when they do, we need code here to hand back the
4454 if (!var_can_have_subvars (vi
->decl
)
4455 || get_subvars_for_var (vi
->decl
) == NULL
)
4460 struct ptr_info_def
*pi
= get_ptr_info (p
);
4464 /* This variable may have been collapsed, let's get the real
4466 vi
= get_varinfo (find (vi
->id
));
4468 /* Translate artificial variables into SSA_NAME_PTR_INFO
4470 EXECUTE_IF_SET_IN_BITMAP (vi
->solution
, 0, i
, bi
)
4472 varinfo_t vi
= get_varinfo (i
);
4474 if (vi
->is_artificial_var
)
4476 /* FIXME. READONLY should be handled better so that
4477 flow insensitive aliasing can disregard writable
4479 if (vi
->id
== nothing_id
)
4481 else if (vi
->id
== anything_id
)
4482 pi
->pt_anything
= 1;
4483 else if (vi
->id
== readonly_id
)
4484 pi
->pt_anything
= 1;
4485 else if (vi
->id
== integer_id
)
4486 pi
->pt_anything
= 1;
4487 else if (vi
->is_heap_var
)
4488 pi
->pt_global_mem
= 1;
4492 if (pi
->pt_anything
)
4496 pi
->pt_vars
= BITMAP_GGC_ALLOC ();
4498 set_uids_in_ptset (vi
->decl
, pi
->pt_vars
, vi
->solution
);
4500 if (bitmap_empty_p (pi
->pt_vars
))
4512 /* Dump points-to information to OUTFILE. */
4515 dump_sa_points_to_info (FILE *outfile
)
4519 fprintf (outfile
, "\nPoints-to sets\n\n");
4521 if (dump_flags
& TDF_STATS
)
4523 fprintf (outfile
, "Stats:\n");
4524 fprintf (outfile
, "Total vars: %d\n", stats
.total_vars
);
4525 fprintf (outfile
, "Non-pointer vars: %d\n",
4526 stats
.nonpointer_vars
);
4527 fprintf (outfile
, "Statically unified vars: %d\n",
4528 stats
.unified_vars_static
);
4529 fprintf (outfile
, "Dynamically unified vars: %d\n",
4530 stats
.unified_vars_dynamic
);
4531 fprintf (outfile
, "Iterations: %d\n", stats
.iterations
);
4532 fprintf (outfile
, "Number of edges: %d\n", stats
.num_edges
);
4533 fprintf (outfile
, "Number of implicit edges: %d\n",
4534 stats
.num_implicit_edges
);
4537 for (i
= 0; i
< VEC_length (varinfo_t
, varmap
); i
++)
4538 dump_solution_for_var (outfile
, i
);
4542 /* Debug points-to information to stderr. */
4545 debug_sa_points_to_info (void)
4547 dump_sa_points_to_info (stderr
);
4551 /* Initialize the always-existing constraint variables for NULL
4552 ANYTHING, READONLY, and INTEGER */
4555 init_base_vars (void)
4557 struct constraint_expr lhs
, rhs
;
4559 /* Create the NULL variable, used to represent that a variable points
4561 nothing_tree
= create_tmp_var_raw (void_type_node
, "NULL");
4562 var_nothing
= new_var_info (nothing_tree
, 0, "NULL");
4563 insert_vi_for_tree (nothing_tree
, var_nothing
);
4564 var_nothing
->is_artificial_var
= 1;
4565 var_nothing
->offset
= 0;
4566 var_nothing
->size
= ~0;
4567 var_nothing
->fullsize
= ~0;
4568 var_nothing
->is_special_var
= 1;
4570 VEC_safe_push (varinfo_t
, heap
, varmap
, var_nothing
);
4572 /* Create the ANYTHING variable, used to represent that a variable
4573 points to some unknown piece of memory. */
4574 anything_tree
= create_tmp_var_raw (void_type_node
, "ANYTHING");
4575 var_anything
= new_var_info (anything_tree
, 1, "ANYTHING");
4576 insert_vi_for_tree (anything_tree
, var_anything
);
4577 var_anything
->is_artificial_var
= 1;
4578 var_anything
->size
= ~0;
4579 var_anything
->offset
= 0;
4580 var_anything
->next
= NULL
;
4581 var_anything
->fullsize
= ~0;
4582 var_anything
->is_special_var
= 1;
4585 /* Anything points to anything. This makes deref constraints just
4586 work in the presence of linked list and other p = *p type loops,
4587 by saying that *ANYTHING = ANYTHING. */
4588 VEC_safe_push (varinfo_t
, heap
, varmap
, var_anything
);
4590 lhs
.var
= anything_id
;
4592 rhs
.type
= ADDRESSOF
;
4593 rhs
.var
= anything_id
;
4596 /* This specifically does not use process_constraint because
4597 process_constraint ignores all anything = anything constraints, since all
4598 but this one are redundant. */
4599 VEC_safe_push (constraint_t
, heap
, constraints
, new_constraint (lhs
, rhs
));
4601 /* Create the READONLY variable, used to represent that a variable
4602 points to readonly memory. */
4603 readonly_tree
= create_tmp_var_raw (void_type_node
, "READONLY");
4604 var_readonly
= new_var_info (readonly_tree
, 2, "READONLY");
4605 var_readonly
->is_artificial_var
= 1;
4606 var_readonly
->offset
= 0;
4607 var_readonly
->size
= ~0;
4608 var_readonly
->fullsize
= ~0;
4609 var_readonly
->next
= NULL
;
4610 var_readonly
->is_special_var
= 1;
4611 insert_vi_for_tree (readonly_tree
, var_readonly
);
4613 VEC_safe_push (varinfo_t
, heap
, varmap
, var_readonly
);
4615 /* readonly memory points to anything, in order to make deref
4616 easier. In reality, it points to anything the particular
4617 readonly variable can point to, but we don't track this
4620 lhs
.var
= readonly_id
;
4622 rhs
.type
= ADDRESSOF
;
4623 rhs
.var
= anything_id
;
4626 process_constraint (new_constraint (lhs
, rhs
));
4628 /* Create the INTEGER variable, used to represent that a variable points
4630 integer_tree
= create_tmp_var_raw (void_type_node
, "INTEGER");
4631 var_integer
= new_var_info (integer_tree
, 3, "INTEGER");
4632 insert_vi_for_tree (integer_tree
, var_integer
);
4633 var_integer
->is_artificial_var
= 1;
4634 var_integer
->size
= ~0;
4635 var_integer
->fullsize
= ~0;
4636 var_integer
->offset
= 0;
4637 var_integer
->next
= NULL
;
4638 var_integer
->is_special_var
= 1;
4640 VEC_safe_push (varinfo_t
, heap
, varmap
, var_integer
);
4642 /* INTEGER = ANYTHING, because we don't know where a dereference of
4643 a random integer will point to. */
4645 lhs
.var
= integer_id
;
4647 rhs
.type
= ADDRESSOF
;
4648 rhs
.var
= anything_id
;
4650 process_constraint (new_constraint (lhs
, rhs
));
4652 /* Create the ESCAPED_VARS variable used to represent variables that
4653 escape this function. */
4654 escaped_vars_tree
= create_tmp_var_raw (void_type_node
, "ESCAPED_VARS");
4655 var_escaped_vars
= new_var_info (escaped_vars_tree
, 4, "ESCAPED_VARS");
4656 insert_vi_for_tree (escaped_vars_tree
, var_escaped_vars
);
4657 var_escaped_vars
->is_artificial_var
= 1;
4658 var_escaped_vars
->size
= ~0;
4659 var_escaped_vars
->fullsize
= ~0;
4660 var_escaped_vars
->offset
= 0;
4661 var_escaped_vars
->next
= NULL
;
4662 escaped_vars_id
= 4;
4663 VEC_safe_push (varinfo_t
, heap
, varmap
, var_escaped_vars
);
4665 /* ESCAPED_VARS = *ESCAPED_VARS */
4667 lhs
.var
= escaped_vars_id
;
4670 rhs
.var
= escaped_vars_id
;
4672 process_constraint (new_constraint (lhs
, rhs
));
4676 /* Initialize things necessary to perform PTA */
4679 init_alias_vars (void)
4681 bitmap_obstack_initialize (&pta_obstack
);
4682 bitmap_obstack_initialize (&oldpta_obstack
);
4683 bitmap_obstack_initialize (&predbitmap_obstack
);
4685 constraint_pool
= create_alloc_pool ("Constraint pool",
4686 sizeof (struct constraint
), 30);
4687 variable_info_pool
= create_alloc_pool ("Variable info pool",
4688 sizeof (struct variable_info
), 30);
4689 constraints
= VEC_alloc (constraint_t
, heap
, 8);
4690 varmap
= VEC_alloc (varinfo_t
, heap
, 8);
4691 vi_for_tree
= pointer_map_create ();
4693 memset (&stats
, 0, sizeof (stats
));
4697 /* Given a statement STMT, generate necessary constraints to
4698 escaped_vars for the escaping variables. */
4701 find_escape_constraints (tree stmt
)
4703 enum escape_type stmt_escape_type
= is_escape_site (stmt
);
4705 VEC(ce_s
, heap
) *rhsc
= NULL
;
4706 struct constraint_expr
*c
;
4709 if (stmt_escape_type
== NO_ESCAPE
)
4712 if (TREE_CODE (stmt
) == RETURN_EXPR
)
4714 /* Returns are either bare, with an embedded MODIFY_EXPR, or
4715 just a plain old expression. */
4716 if (!TREE_OPERAND (stmt
, 0))
4718 if (TREE_CODE (TREE_OPERAND (stmt
, 0)) == MODIFY_EXPR
)
4719 rhs
= TREE_OPERAND (TREE_OPERAND (stmt
, 0), 1);
4721 rhs
= TREE_OPERAND (stmt
, 0);
4723 get_constraint_for (rhs
, &rhsc
);
4724 for (i
= 0; VEC_iterate (ce_s
, rhsc
, i
, c
); i
++)
4725 make_constraint_to_escaped (*c
);
4726 VEC_free (ce_s
, heap
, rhsc
);
4729 else if (TREE_CODE (stmt
) == ASM_EXPR
)
4731 /* Whatever the inputs of the ASM are, escape. */
4734 for (arg
= ASM_INPUTS (stmt
); arg
; arg
= TREE_CHAIN (arg
))
4737 get_constraint_for (TREE_VALUE (arg
), &rhsc
);
4738 for (i
= 0; VEC_iterate (ce_s
, rhsc
, i
, c
); i
++)
4739 make_constraint_to_escaped (*c
);
4740 VEC_free (ce_s
, heap
, rhsc
);
4744 else if (TREE_CODE (stmt
) == CALL_EXPR
4745 || (TREE_CODE (stmt
) == MODIFY_EXPR
4746 && TREE_CODE (TREE_OPERAND (stmt
, 1)) == CALL_EXPR
))
4748 /* Calls cause all of the arguments passed in to escape. */
4751 if (TREE_CODE (stmt
) == MODIFY_EXPR
)
4752 stmt
= TREE_OPERAND (stmt
, 1);
4753 for (arg
= TREE_OPERAND (stmt
, 1); arg
; arg
= TREE_CHAIN (arg
))
4755 if (POINTER_TYPE_P (TREE_TYPE (TREE_VALUE (arg
))))
4758 get_constraint_for (TREE_VALUE (arg
), &rhsc
);
4759 for (i
= 0; VEC_iterate (ce_s
, rhsc
, i
, c
); i
++)
4760 make_constraint_to_escaped (*c
);
4761 VEC_free (ce_s
, heap
, rhsc
);
4768 gcc_assert (TREE_CODE (stmt
) == MODIFY_EXPR
);
4771 gcc_assert (stmt_escape_type
== ESCAPE_BAD_CAST
4772 || stmt_escape_type
== ESCAPE_STORED_IN_GLOBAL
4773 || stmt_escape_type
== ESCAPE_UNKNOWN
);
4774 rhs
= TREE_OPERAND (stmt
, 1);
4776 /* Look through casts for the real escaping variable.
4777 Constants don't really escape, so ignore them.
4778 Otherwise, whatever escapes must be on our RHS. */
4779 if (TREE_CODE (rhs
) == NOP_EXPR
4780 || TREE_CODE (rhs
) == CONVERT_EXPR
4781 || TREE_CODE (rhs
) == NON_LVALUE_EXPR
)
4783 get_constraint_for (TREE_OPERAND (rhs
, 0), &rhsc
);
4785 else if (CONSTANT_CLASS_P (rhs
))
4789 get_constraint_for (rhs
, &rhsc
);
4791 for (i
= 0; VEC_iterate (ce_s
, rhsc
, i
, c
); i
++)
4792 make_constraint_to_escaped (*c
);
4793 VEC_free (ce_s
, heap
, rhsc
);
4797 /* Remove the REF and ADDRESS edges from GRAPH, as well as all the
4798 predecessor edges. */
4801 remove_preds_and_fake_succs (constraint_graph_t graph
)
4805 /* Clear the implicit ref and address nodes from the successor
4807 for (i
= 0; i
< FIRST_REF_NODE
; i
++)
4809 if (graph
->succs
[i
])
4810 bitmap_clear_range (graph
->succs
[i
], FIRST_REF_NODE
,
4811 FIRST_REF_NODE
* 2);
4814 /* Free the successor list for the non-ref nodes. */
4815 for (i
= FIRST_REF_NODE
; i
< graph
->size
; i
++)
4817 if (graph
->succs
[i
])
4818 BITMAP_FREE (graph
->succs
[i
]);
4821 /* Now reallocate the size of the successor list as, and blow away
4822 the predecessor bitmaps. */
4823 graph
->size
= VEC_length (varinfo_t
, varmap
);
4824 graph
->succs
= xrealloc (graph
->succs
, graph
->size
* sizeof (bitmap
));
4826 free (graph
->implicit_preds
);
4827 graph
->implicit_preds
= NULL
;
4828 free (graph
->preds
);
4829 graph
->preds
= NULL
;
4830 bitmap_obstack_release (&predbitmap_obstack
);
4833 /* Create points-to sets for the current function. See the comments
4834 at the start of the file for an algorithmic overview. */
4837 compute_points_to_sets (struct alias_info
*ai
)
4840 struct scc_info
*si
;
4842 timevar_push (TV_TREE_PTA
);
4845 init_alias_heapvars ();
4847 intra_create_variable_infos ();
4849 /* Now walk all statements and derive aliases. */
4852 block_stmt_iterator bsi
;
4855 for (phi
= phi_nodes (bb
); phi
; phi
= TREE_CHAIN (phi
))
4857 if (is_gimple_reg (PHI_RESULT (phi
)))
4859 find_func_aliases (phi
);
4860 /* Update various related attributes like escaped
4861 addresses, pointer dereferences for loads and stores.
4862 This is used when creating name tags and alias
4864 update_alias_info (phi
, ai
);
4868 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
4870 tree stmt
= bsi_stmt (bsi
);
4872 find_func_aliases (stmt
);
4873 find_escape_constraints (stmt
);
4874 /* Update various related attributes like escaped
4875 addresses, pointer dereferences for loads and stores.
4876 This is used when creating name tags and alias
4878 update_alias_info (stmt
, ai
);
4885 fprintf (dump_file
, "Points-to analysis\n\nConstraints:\n\n");
4886 dump_constraints (dump_file
);
4891 "\nCollapsing static cycles and doing variable "
4894 build_pred_graph ();
4895 si
= perform_var_substitution (graph
);
4896 move_complex_constraints (graph
, si
);
4897 free_var_substitution_info (si
);
4899 build_succ_graph ();
4900 find_indirect_cycles (graph
);
4902 /* Implicit nodes and predecessors are no longer necessary at this
4904 remove_preds_and_fake_succs (graph
);
4907 fprintf (dump_file
, "\nSolving graph:\n");
4909 solve_graph (graph
);
4912 dump_sa_points_to_info (dump_file
);
4913 have_alias_info
= true;
4915 timevar_pop (TV_TREE_PTA
);
4918 /* Delete created points-to sets. */
4921 delete_points_to_sets (void)
4926 if (dump_file
&& (dump_flags
& TDF_STATS
))
4927 fprintf (dump_file
, "Points to sets created:%d\n",
4928 stats
.points_to_sets_created
);
4930 pointer_map_destroy (vi_for_tree
);
4931 bitmap_obstack_release (&pta_obstack
);
4932 VEC_free (constraint_t
, heap
, constraints
);
4934 for (i
= 0; VEC_iterate (varinfo_t
, varmap
, i
, v
); i
++)
4935 VEC_free (constraint_t
, heap
, graph
->complex[i
]);
4936 free (graph
->complex);
4939 free (graph
->succs
);
4940 free (graph
->indirect_cycles
);
4943 VEC_free (varinfo_t
, heap
, varmap
);
4944 free_alloc_pool (variable_info_pool
);
4945 free_alloc_pool (constraint_pool
);
4946 have_alias_info
= false;
4949 /* Return true if we should execute IPA PTA. */
4953 return (flag_unit_at_a_time
!= 0
4955 /* Don't bother doing anything if the program has errors. */
4956 && !(errorcount
|| sorrycount
));
4959 /* Execute the driver for IPA PTA. */
4961 ipa_pta_execute (void)
4964 struct cgraph_node
*node
;
4966 init_alias_heapvars ();
4969 for (node
= cgraph_nodes
; node
; node
= node
->next
)
4971 if (!node
->analyzed
|| cgraph_is_master_clone (node
))
4975 varid
= create_function_info_for (node
->decl
,
4976 cgraph_node_name (node
));
4977 if (node
->local
.externally_visible
)
4979 varinfo_t fi
= get_varinfo (varid
);
4980 for (; fi
; fi
= fi
->next
)
4981 make_constraint_from_escaped (fi
);
4985 for (node
= cgraph_nodes
; node
; node
= node
->next
)
4987 if (node
->analyzed
&& cgraph_is_master_clone (node
))
4989 struct function
*cfun
= DECL_STRUCT_FUNCTION (node
->decl
);
4991 tree old_func_decl
= current_function_decl
;
4994 "Generating constraints for %s\n",
4995 cgraph_node_name (node
));
4997 current_function_decl
= node
->decl
;
4999 FOR_EACH_BB_FN (bb
, cfun
)
5001 block_stmt_iterator bsi
;
5004 for (phi
= phi_nodes (bb
); phi
; phi
= TREE_CHAIN (phi
))
5006 if (is_gimple_reg (PHI_RESULT (phi
)))
5008 find_func_aliases (phi
);
5012 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
5014 tree stmt
= bsi_stmt (bsi
);
5015 find_func_aliases (stmt
);
5018 current_function_decl
= old_func_decl
;
5023 /* Make point to anything. */
5027 build_constraint_graph ();
5031 fprintf (dump_file
, "Points-to analysis\n\nConstraints:\n\n");
5032 dump_constraints (dump_file
);
5037 "\nCollapsing static cycles and doing variable "
5040 find_and_collapse_graph_cycles (graph
, false);
5041 perform_var_substitution (graph
);
5044 fprintf (dump_file
, "\nSolving graph:\n");
5046 solve_graph (graph
);
5049 dump_sa_points_to_info (dump_file
);
5051 delete_alias_heapvars ();
5052 delete_points_to_sets ();
5057 struct tree_opt_pass pass_ipa_pta
=
5060 gate_ipa_pta
, /* gate */
5061 ipa_pta_execute
, /* execute */
5064 0, /* static_pass_number */
5065 TV_IPA_PTA
, /* tv_id */
5066 0, /* properties_required */
5067 0, /* properties_provided */
5068 0, /* properties_destroyed */
5069 0, /* todo_flags_start */
5070 0, /* todo_flags_finish */
5074 /* Initialize the heapvar for statement mapping. */
5076 init_alias_heapvars (void)
5078 if (!heapvar_for_stmt
)
5079 heapvar_for_stmt
= htab_create_ggc (11, tree_map_hash
, tree_map_eq
,
5081 nonlocal_all
= NULL_TREE
;
5085 delete_alias_heapvars (void)
5087 nonlocal_all
= NULL_TREE
;
5088 htab_delete (heapvar_for_stmt
);
5089 heapvar_for_stmt
= NULL
;
5092 #include "gt-tree-ssa-structalias.h"