https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82899
--- Comment #12 from Antony Polukhin <antoshkka at gmail dot com> --- (In reply to Marc Glisse from comment #10) > This seems fixed in 8.1 (at least we don't generate the extra mov anymore), > can you check? Actually it still does not work for subobjects. For example https://godbolt.org/g/zPha3U Code struct array { int d[2]; }; struct test { array data1; array data2; test(const array& t); }; test::test(const array& t) : data1{t} , data2{t} {} produces assembly test::test(array const&): mov rax, QWORD PTR [rsi] mov QWORD PTR [rdi], rax mov rax, QWORD PTR [rsi] <== Not required. Could not alias mov QWORD PTR [rdi+8], rax ret [class.ctor] paragraph 14 also covers this case: "During the construction of an object, if the value of the object *or any of its subobjects* is accessed through a glvalue that is not obtained, directly or indirectly, from the constructor’s this pointer, the value of the object or subobject thus obtained is unspecified." Looks like not only `this` should be marked with __restrict, but also all the subobjects of the type.