]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/115199 - fix PTA constraint processing for &ANYTHING LHS
authorRichard Biener <rguenther@suse.de>
Thu, 23 May 2024 11:33:15 +0000 (13:33 +0200)
committerRichard Biener <rguenther@suse.de>
Thu, 23 May 2024 12:38:49 +0000 (14:38 +0200)
When processing a &ANYTHING = X constraint we treat it as *ANYTHING = X
during constraint processing but then end up recording it as
&ANYTHING = X anyway, breaking constraint graph building.  This is
because we only update the local copy of the LHS and not the constraint
itself.

PR tree-optimization/115199
* tree-ssa-structalias.cc (process_constraint): Also
record &ANYTHING = X as *ANYTING = X in the end.

* gcc.dg/torture/pr115199.c: New testcase.

gcc/testsuite/gcc.dg/torture/pr115199.c [new file with mode: 0644]
gcc/tree-ssa-structalias.cc

diff --git a/gcc/testsuite/gcc.dg/torture/pr115199.c b/gcc/testsuite/gcc.dg/torture/pr115199.c
new file mode 100644 (file)
index 0000000..981a733
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+
+struct b {
+  char *volatile c;
+};
+struct b * __attribute__((noipa))
+d()
+{
+  char *e;
+  struct b *b = __builtin_malloc(sizeof(b));
+  void *f = __builtin_malloc(1);
+
+  e = __builtin_memcpy(f, "z", 1);
+  b->c = e;
+  return b;
+}
+
+int main()
+{
+  struct b b = *d();
+  if (b.c[0] != 'z')
+    __builtin_abort();
+  return 0;
+}
index 0e9423a78ecb619d3b6cc22b627756217c1a3ded..a39b36c146eb656f43cd54fbf520dd56149e862e 100644 (file)
@@ -3104,7 +3104,7 @@ process_constraint (constraint_t t)
      it here by turning it into *ANYTHING.  */
   if (lhs.type == ADDRESSOF
       && lhs.var == anything_id)
-    lhs.type = DEREF;
+    t->lhs.type = lhs.type = DEREF;
 
   /* ADDRESSOF on the lhs is invalid.  */
   gcc_assert (lhs.type != ADDRESSOF);