[cfe-dev] Is valid optimization: dropping new[]

Nuno Lopes nunoplopes at sapo.pt
Wed Feb 6 01:24:40 PST 2013


Quoting Dmitri Shubin <sbn at tbricks.com>:

> On 02/06/13 11:49, John McCall wrote:
>> The optimizer is making not-strictly-standard assumptions about the
>> behavior of global operator new[] and the merits of intentionally triggering
>> an out-of-memory condition with a leak vs. promoting leaked allocations
>> to the stack.  You can disable these assumptions with -fno-builtin, avoid
>> them by compiling at -O0, or work around them by assigning each 'p' in
>> turn to a volatile global variable, which will stop the compiler  
>> from realizing
>> that they leak.
>
> Yes, making p to be 'static volatile char *' fixed the problem, thank you!
>
> Do I understand you right that the compiler did the following:
> 1. replaced 'new char[1024]' with smth like 'alloca(1024)'
> 2. since alloca() cannot fail it removed try/catch and if() statements.
> 3. since the result isn't used 'alloca()' call was removed also.

That's not really what's happening.
The call to 'new' (or malloc or any other memory allocation function)  
is removed if the only uses of the return value are the following:
  - comparisons with NULL
  - calls to free() / delete

There is an optimization that can promote a heap allocation to a stack  
allocation, but only for small allocation sizes, of course.

Nuno



More information about the cfe-dev mailing list