https://gcc.gnu.org/g:c08b0d3f7b3539b26031de31d88dea6b94474577

commit r15-861-gc08b0d3f7b3539b26031de31d88dea6b94474577
Author: Richard Biener <rguent...@suse.de>
Date:   Mon May 27 10:41:02 2024 +0200

    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.

Diff:
---
 gcc/testsuite/gcc.dg/pr115236.c | 12 ++++++++++++
 gcc/tree-ssa-structalias.cc     | 20 ++++++++++++++------
 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 00000000000..91edfab957a
--- /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 9cec2c6cfd9..330e64e65da 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);
     }

Reply via email to