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.
--- /dev/null
+/* { 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;
+}
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);