This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/64601] Missed PRE on std::vector move assignment
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 16 Jan 2015 09:39:42 +0000
- Subject: [Bug tree-optimization/64601] Missed PRE on std::vector move assignment
- Auto-submitted: auto-generated
- References: <bug-64601-4 at http dot gcc dot gnu dot org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64601
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
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 V & v, struct V & w)
{
int * _3;
int * _6;
int * _7;
int * _8;
<bb 2>:
_3 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_start;
MEM[(int * &)w_2(D)].D.14881._M_impl._M_start = 0B;
_6 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_finish;
MEM[(int * &)w_2(D)].D.14881._M_impl._M_finish = 0B;
_7 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_end_of_storage;
MEM[(int * &)w_2(D)].D.14881._M_impl._M_end_of_storage = 0B;
_8 = MEM[(int * &)v_4(D)].D.14881._M_impl._M_start;
MEM[(int * &)v_4(D)].D.14881._M_impl._M_start = _3;
MEM[(int * &)v_4(D)].D.14881._M_impl._M_finish = _6;
MEM[(int * &)v_4(D)].D.14881._M_impl._M_end_of_storage = _7;
...
void g(V&, V&) (struct V & v, struct V & w)
{
int * __tmp.0_5;
int * _6;
int * __tmp.0_7;
int * _8;
int * __tmp.0_9;
int * _10;
<bb 2>:
__tmp.0_5 = MEM[(int * &)v_4(D)].D.14881._M_impl._M_start;
MEM[(int * &)v_4(D)].D.14881._M_impl._M_start = 0B;
MEM[(int * &)v_4(D)].D.14881._M_impl._M_finish = 0B;
MEM[(int * &)v_4(D)].D.14881._M_impl._M_end_of_storage = 0B;
_6 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_start;
MEM[(int * &)v_4(D)].D.14881._M_impl._M_start = _6;
MEM[(int * &)w_2(D)].D.14881._M_impl._M_start = 0B;
__tmp.0_7 = MEM[(int * &)v_4(D)].D.14881._M_impl._M_finish;
_8 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_finish;
MEM[(int * &)v_4(D)].D.14881._M_impl._M_finish = _8;
MEM[(int * &)w_2(D)].D.14881._M_impl._M_finish = __tmp.0_7;
__tmp.0_9 = MEM[(int * &)v_4(D)].D.14881._M_impl._M_end_of_storage;
_10 = MEM[(int * &)w_2(D)].D.14881._M_impl._M_end_of_storage;
MEM[(int * &)v_4(D)].D.14881._M_impl._M_end_of_storage = _10;
MEM[(int * &)w_2(D)].D.14881._M_impl._M_end_of_storage = __tmp.0_9;
they are still all plain int * accesses.