On Sep 25, 2013, at 2:37 PM, Marshall Clow <[email protected]> wrote:

> On Sep 25, 2013, at 2:14 PM, Benjamin Kramer <[email protected]> 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).

Added in N3664:
        An implementation is allowed to omit a call to a replaceable global 
allocation function (18.6.1.1, 18.6.1.2). 

To me, "replaceable global allocation function" --> ::operator new.

-- Marshall

Marshall Clow     Idio Software   <mailto:[email protected]>

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


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

Reply via email to