https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79578
Bug ID: 79578 Summary: Unnecessary instructions in generated code Product: gcc Version: 7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: maxim.yegorushkin at gmail dot com Target Milestone: --- When the following code is compiled with gcc-7 and earlier versions with flags --std=c++14 -O3 -pthread: #include <new> #include <cstdint> struct A { std::uint16_t a, b; }; A* f(char* b) __attribute__((noinline)); A* f(char* b) { auto a = new(b) A{}; a->a = 1; a->b = 2; return a; } int main() { char b[sizeof(A)] alignas(A); f(b); } The generated code for f contains unnecessary instructions: f(char*): testq %rdi, %rdi <--- unnecessary code begin movq %rdi, %rax je .L2 movl $0, (%rdi) <--- unnecessary code end .L2: movl $131073, (%rax) ret I expect the generated code to be just: f(char*): movl $131073, (%rdi) ret Because: 1. operator new(size_t, void*) is an inline function, its definition is available in this translation unit. 2. The code assigns through that pointer, so the pointer must be valid. Therefore there is no need to test the result of new for 0. 3. Static single assignment form must notice that the assignment of 0 is redundant.