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.

Attachment: operator_new.patch
Description: Binary data


- Ben
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to