https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104276

            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 

std::vector<int> foo() {
  auto result = std::vector<int>(SZ);
  int *ptr = result.data();
  for (std::size_t n = 0; n < SZ; ++n) {
                ptr[n] = static_cast<int>( 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<int> foo() {
  auto result = std::vector<int>(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 string. 
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 )` ?

Reply via email to