[libcxx] Patch/RFC: Avoid using ::operator new in the default allocator

Marshall Clow mclow.lists at gmail.com
Wed Sep 25 12:37:12 PDT 2013


On Sep 25, 2013, at 2:14 PM, Benjamin Kramer <benny.kra at gmail.com> wrote:

> Since N3664 was implemented in Clang (r186799) it can't optimize unused pairs of ::operator new and ::operator delete anymore. Calls generated by a new/delete expression are still foldable with the updated wording. This affects optimizing away unnecessary code that would be really nice to get right. For example
> 
> #include <vector>
> 
> int main() {
>  std::vector<int> v;
>  v.push_back(1);
> 
>  return v[0];
> }
> 
> This should fold down to "return 1;" with no allocations. The example is of course oversimplified but situations like this easily occur in real world code through inlining.
> 
> The proposed patch replaces "::operator new(x)" with "new char[x]" and adds the necessary casts in the allocator class, as suggested by Richard Smith. This is sufficient to constant fold code like my test case again.

Is there some technical reason that clang cannot optimize away unused pairs of ::operator new/delete? (as opposed to "just doesn't do it any more" - not a real quote).

-- Marshall

Marshall Clow     Idio Software   <mailto:mclow.lists at gmail.com>

A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait).
        -- Yu Suzuki





More information about the cfe-commits mailing list