From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 6FC3D385840C; Fri, 28 Jan 2022 23:16:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6FC3D385840C From: "Darrell.Wright at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/104276] New: Fail to eliminate deadstore from vector constructor Date: Fri, 28 Jan 2022 23:16:21 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Version: 12.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: Darrell.Wright at gmail dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Jan 2022 23:16:21 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D104276 Bug ID: 104276 Summary: Fail to eliminate deadstore from vector constructor Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: Darrell.Wright at gmail dot com Target Milestone: --- clang is unable to remove the memset in code like=20 std::vector foo() { auto result =3D std::vector(SZ); int *ptr =3D result.data(); for (std::size_t n =3D 0; n < SZ; ++n) { ptr[n] =3D static_cast( n ); } return result; } https://gcc.godbolt.org/z/5cbKejfqr This is unaffected if the value is set during resize. That may result in inlining of the memset but does not eliminate it. However for code that uses blessed methods like memset subsequently std::vector foo() { auto result =3D std::vector(SZ); std::memset(result.data(), 5, sizeof(int) * SZ); return result; } https://gcc.godbolt.org/z/Kfs9x8Pe9 It is. This seems to be the usecase of resize_and_overwrite in future stri= ng.=20 Is there a way to formulate the code to do this. Or, and I think a better = way, is there a builtin or could there be that lets the compiler assume that the memory will be subsequently written to? e.g. `__bultin_assume_set( void * dest, size_t count )` ?=