This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR37869, wrong points-to results
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Daniel Berlin <dberlin at dberlin dot org>
- Date: Wed, 26 Nov 2008 00:36:31 +0100 (CET)
- Subject: [PATCH] Fix PR37869, wrong points-to results
This fixes PR37869. As analyzed by Danny a memory optimization in
the points-to solver has implementation issues which causes us
to compute empty points-to sets for random dereferenced pointers.
The following patch simply removes this optimization. Fixing it
properly would need another intermediate bitmap, probably not
worth the trouble.
Bootstrapped and tested on x86_64-unknown-linux-gnu - ok for trunk?
Thanks,
Richard.
2008-11-25 Daniel Berlin <dberlin@dberlin.org>
Richard Guenther <rguenther@suse.de>
PR tree-optimization/37869
* tree-ssa-structalias.c (struct constraint_graph): Remove
pt_used and number_incoming members.
(build_pred_graph): Do not allocate them.
(condense_visit): Do not use them.
(label_visit): Likewise.
(free_var_substitution_info): Do not free them.
Index: gcc/tree-ssa-structalias.c
===================================================================
*** gcc/tree-ssa-structalias.c (revision 142204)
--- gcc/tree-ssa-structalias.c (working copy)
*************** struct constraint_graph
*** 506,521 ****
taken. Used for variable substitution. */
bitmap address_taken;
- /* True if points_to bitmap for this node is stored in the hash
- table. */
- sbitmap pt_used;
-
- /* Number of incoming edges remaining to be processed by pointer
- equivalence.
- Used for variable substitution. */
- unsigned int *number_incoming;
-
-
/* Vector of complex constraints for each graph node. Complex
constraints are those involving dereferences or offsets that are
not 0. */
--- 506,511 ----
*************** build_pred_graph (void)
*** 1101,1111 ****
graph->points_to = XCNEWVEC (bitmap, graph->size);
graph->eq_rep = XNEWVEC (int, graph->size);
graph->direct_nodes = sbitmap_alloc (graph->size);
- graph->pt_used = sbitmap_alloc (graph->size);
graph->address_taken = BITMAP_ALLOC (&predbitmap_obstack);
- graph->number_incoming = XCNEWVEC (unsigned int, graph->size);
sbitmap_zero (graph->direct_nodes);
- sbitmap_zero (graph->pt_used);
for (j = 0; j < FIRST_REF_NODE; j++)
{
--- 1091,1098 ----
*************** condense_visit (constraint_graph_t graph
*** 2008,2018 ****
bitmap_ior_into (graph->points_to[n],
graph->points_to[w]);
}
- EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi)
- {
- unsigned int rep = si->node_mapping[i];
- graph->number_incoming[rep]++;
- }
}
SET_BIT (si->deleted, n);
}
--- 1995,2000 ----
*************** label_visit (constraint_graph_t graph, s
*** 2041,2061 ****
/* Skip unused edges */
if (w == n || graph->pointer_label[w] == 0)
! {
! graph->number_incoming[w]--;
! continue;
! }
if (graph->points_to[w])
bitmap_ior_into(graph->points_to[n], graph->points_to[w]);
-
- /* If all incoming edges to w have been processed and
- graph->points_to[w] was not stored in the hash table, we can
- free it. */
- graph->number_incoming[w]--;
- if (!graph->number_incoming[w] && !TEST_BIT (graph->pt_used, w))
- {
- BITMAP_FREE (graph->points_to[w]);
- }
}
/* Indirect nodes get fresh variables. */
if (!TEST_BIT (graph->direct_nodes, n))
--- 2023,2032 ----
/* Skip unused edges */
if (w == n || graph->pointer_label[w] == 0)
! continue;
!
if (graph->points_to[w])
bitmap_ior_into(graph->points_to[n], graph->points_to[w]);
}
/* Indirect nodes get fresh variables. */
if (!TEST_BIT (graph->direct_nodes, n))
*************** label_visit (constraint_graph_t graph, s
*** 2067,2073 ****
graph->points_to[n]);
if (!label)
{
- SET_BIT (graph->pt_used, n);
label = pointer_equiv_class++;
equiv_class_add (pointer_equiv_class_table,
label, graph->points_to[n]);
--- 2038,2043 ----
*************** free_var_substitution_info (struct scc_i
*** 2193,2202 ****
free (graph->loc_label);
free (graph->pointed_by);
free (graph->points_to);
- free (graph->number_incoming);
free (graph->eq_rep);
sbitmap_free (graph->direct_nodes);
- sbitmap_free (graph->pt_used);
htab_delete (pointer_equiv_class_table);
htab_delete (location_equiv_class_table);
bitmap_obstack_release (&iteration_obstack);
--- 2163,2170 ----