aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-05-27 10:41:02 +0200
committerRichard Biener <rguenther@suse.de>2024-05-28 14:35:35 +0200
commitc08b0d3f7b3539b26031de31d88dea6b94474577 (patch)
tree6a39dd8f4b636828d32f683173046cfcf4fd0a4b
parent19cc61111120087619b496732b249b48b1fbe27e (diff)
downloadgcc-c08b0d3f7b3539b26031de31d88dea6b94474577.zip
gcc-c08b0d3f7b3539b26031de31d88dea6b94474577.tar.gz
gcc-c08b0d3f7b3539b26031de31d88dea6b94474577.tar.bz2
tree-optimization/115236 - more points-to *ANYTHING = x fixes
The stored-to ANYTHING handling has more holes, uncovered by treating volatile accesses as ANYTHING. We fail to properly build the pred and succ graphs, in particular we may not elide direct nodes from receiving from STOREDANYTHING. PR tree-optimization/115236 * tree-ssa-structalias.cc (build_pred_graph): Properly handle *ANYTHING = X. (build_succ_graph): Likewise. Do not elide direct nodes from receiving from STOREDANYTHING. * gcc.dg/pr115236.c: New testcase.
-rw-r--r--gcc/testsuite/gcc.dg/pr115236.c12
-rw-r--r--gcc/tree-ssa-structalias.cc20
2 files changed, 26 insertions, 6 deletions
diff --git a/gcc/testsuite/gcc.dg/pr115236.c b/gcc/testsuite/gcc.dg/pr115236.c
new file mode 100644
index 0000000..91edfab
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr115236.c
@@ -0,0 +1,12 @@
+/* { dg-do run } */
+/* { dg-options "-O -fno-tree-fre" } */
+
+int a, *b = &a;
+int main()
+{
+ int *c, *volatile *d = &c;
+ *d = b;
+ if (c != &a)
+ __builtin_abort();
+ return 0;
+}
diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc
index 9cec2c6..330e64e 100644
--- a/gcc/tree-ssa-structalias.cc
+++ b/gcc/tree-ssa-structalias.cc
@@ -1312,7 +1312,12 @@ build_pred_graph (void)
{
/* *x = y. */
if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR)
- add_pred_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
+ {
+ if (lhs.var == anything_id)
+ add_pred_graph_edge (graph, storedanything_id, rhsvar);
+ else
+ add_pred_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
+ }
}
else if (rhs.type == DEREF)
{
@@ -1398,7 +1403,12 @@ build_succ_graph (void)
if (lhs.type == DEREF)
{
if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR)
- add_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
+ {
+ if (lhs.var == anything_id)
+ add_graph_edge (graph, storedanything_id, rhsvar);
+ else
+ add_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
+ }
}
else if (rhs.type == DEREF)
{
@@ -1418,13 +1428,11 @@ build_succ_graph (void)
}
}
- /* Add edges from STOREDANYTHING to all non-direct nodes that can
- receive pointers. */
+ /* Add edges from STOREDANYTHING to all nodes that can receive pointers. */
t = find (storedanything_id);
for (i = integer_id + 1; i < FIRST_REF_NODE; ++i)
{
- if (!bitmap_bit_p (graph->direct_nodes, i)
- && get_varinfo (i)->may_have_pointers)
+ if (get_varinfo (i)->may_have_pointers)
add_graph_edge (graph, find (i), t);
}