------- Comment #13 from rguenth at gcc dot gnu dot org 2007-07-07 17:23 ------- The following creates a similar copy chain, but still chooses the right one to copy from.
struct Foo { int x; }; void use(int); void foo(struct Foo *p, int q) { int a = p->x; int b, c; p->x = a; if (q) c = p->x; else c = a; use (c); } ./cc1 -quiet -O2 t.i -fdump-tree-all-vops-details -fno-tree-fre -fno-tree-pre -fno-tree-dominator-opts -fno-tree-vrp Visiting PHI node: c_1 = PHI <c_5(3), a_3(2)> Argument #0: c_5 copy-of chain: c_5 -> a_3 -> a_3 [COPY] Argument #1: a_3 copy-of chain: a_3 -> a_3 [NOT A COPY] PHI node c_1 copy-of chain: c_1 -> c_5 -> a_3 -> a_3 [COPY] -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32636