summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-structalias.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2008-07-04 09:34:36 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2008-07-04 09:34:36 +0000
commitfc733d7acdfa8558f385da0510f03abde53c8565 (patch)
treec246ed79651a3ea0f60e636497df49b18fcf12da /gcc/tree-ssa-structalias.c
parent92667ff7f2525ea5d9422fb2e7a472bbf0386020 (diff)
downloadgcc-fc733d7acdfa8558f385da0510f03abde53c8565.tar.gz
2008-07-04 Richard Guenther <rguenther@suse.de>
* tree-ssa-structalias.c (lookup_vi_for_tree): Declare. (do_sd_constraint): Handle a dereference of ESCAPED and CALLUSED properly to compute the reachability set if we do field-sensitive PTA. * invoke.texi (max-fields-for-field-sensitive): Document default. * opts.c (decode_options): Set max-fields-for-field-sensitive to 100 for optimize >= 2. * gcc.dg/tree-ssa/pta-callused.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137453 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r--gcc/tree-ssa-structalias.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 553125641ce..0b68b84dce0 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -262,6 +262,7 @@ struct variable_info
typedef struct variable_info *varinfo_t;
static varinfo_t first_vi_for_offset (varinfo_t, unsigned HOST_WIDE_INT);
+static varinfo_t lookup_vi_for_tree (tree);
/* Pool of variable info structures. */
static alloc_pool variable_info_pool;
@@ -1406,6 +1407,47 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c,
goto done;
}
+ /* For x = *ESCAPED and x = *CALLUSED we want to compute the
+ reachability set of the rhs var. As a pointer to a sub-field
+ of a variable can also reach all other fields of the variable
+ we simply have to expand the solution to contain all sub-fields
+ if one sub-field is contained. */
+ if (c->rhs.var == escaped_id
+ || c->rhs.var == callused_id)
+ {
+ bitmap vars = NULL;
+ /* In a first pass record all variables we need to add all
+ sub-fields off. This avoids quadratic behavior. */
+ EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
+ {
+ varinfo_t v = lookup_vi_for_tree (get_varinfo (j)->decl);
+ if (v->next != NULL)
+ {
+ if (vars == NULL)
+ vars = BITMAP_ALLOC (NULL);
+ bitmap_set_bit (vars, v->id);
+ }
+ }
+ /* In the second pass now do the addition to the solution and
+ to speed up solving add it to the delta as well. */
+ if (vars != NULL)
+ {
+ EXECUTE_IF_SET_IN_BITMAP (vars, 0, j, bi)
+ {
+ varinfo_t v = get_varinfo (j);
+ for (; v != NULL; v = v->next)
+ {
+ if (bitmap_set_bit (sol, v->id))
+ {
+ flag = true;
+ bitmap_set_bit (delta, v->id);
+ }
+ }
+ }
+ BITMAP_FREE (vars);
+ }
+ }
+
/* For each variable j in delta (Sol(y)), add
an edge in the graph from j to x, and union Sol(j) into Sol(x). */
EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)