[Bug tree-optimization/64601] Missed PRE on std::vector move assignment

2015-01-17 Thread glisse at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601 Marc Glisse changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED Resolution|---

[Bug tree-optimization/64601] Missed PRE on std::vector move assignment

2015-01-16 Thread glisse at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601 --- Comment #8 from Marc Glisse --- With the modified hack below, the testsuite passes, except: gcc.dg/tree-ssa/scev-[34].c those go from xfail to pass, that sounds good g++.dg/tree-ssa/pr31146.C seems that the scan-tree-dump is too strict c-c++

[Bug tree-optimization/64601] Missed PRE on std::vector move assignment

2015-01-16 Thread glisse at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601 --- Comment #7 from Marc Glisse --- I am testing the following hack, I hope there will be at least 1 failure in the testsuite that will help me understand why it is wrong. It bootstraps and gives accesses like MEM[(struct _Vector_impl *)v_4(D)]._

[Bug tree-optimization/64601] Missed PRE on std::vector move assignment

2015-01-16 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601 --- Comment #6 from Richard Biener --- Note that we do it correctly even - forcing a TBAA type of just 'int' and thus disabling path-based disambiguation. So doing this won't help you, it just will generate larger trees: void f(V&, V&) (struct

[Bug tree-optimization/64601] Missed PRE on std::vector move assignment

2015-01-16 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601 --- Comment #5 from Richard Biener --- Created attachment 34460 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34460&action=edit patch This is what I am talking about (I think it's wrong and instead we have to remove the case completely)

[Bug tree-optimization/64601] Missed PRE on std::vector move assignment

2015-01-16 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601 --- Comment #4 from Richard Biener --- (In reply to Marc Glisse from comment #3) > Actually there is no need for inlining. > > struct A { int i; }; > void f(struct A *a){ *&a->i=0; } > void g(struct A *a){ int*p=&a->i;*p=0; } > > The main diffe

[Bug tree-optimization/64601] Missed PRE on std::vector move assignment

2015-01-15 Thread glisse at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601 --- Comment #3 from Marc Glisse --- Actually there is no need for inlining. struct A { int i; }; void f(struct A *a){ *&a->i=0; } void g(struct A *a){ int*p=&a->i;*p=0; } The main difference seems to be that the first one gets through fold-cons

[Bug tree-optimization/64601] Missed PRE on std::vector move assignment

2015-01-15 Thread glisse at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601 --- Comment #2 from Marc Glisse --- (In reply to Richard Biener from comment #1) > It's indeed that GCC only sees int accesses based on w and v and thus has to > consider they might alias. > > TBAA cannot be strengthened easily here because the

[Bug tree-optimization/64601] Missed PRE on std::vector move assignment

2015-01-15 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601 --- Comment #1 from Richard Biener --- It's indeed that GCC only sees int accesses based on w and v and thus has to consider they might alias. Maybe it's time to try that "trick" with the same clobbering value... TBAA cannot be strengthened eas