[PATCH] A new HeapToStack allocation promotion pass

Hal Finkel hfinkel at anl.gov
Fri Oct 4 05:38:48 PDT 2013


----- Original Message -----
> (I am not on the list)
> 
> > This adds a new optimization pass that can 'promote' malloc'd
> > memory to
> > stack-allocated memory when the lifetime of the allocation can be
> > determined to be bounded by the execution of the function.
> > 
> > To be specific, consider the following three cases:
> > 
> > void bar(int *x);
> > 
> > void foo1() {
> >   int *x = malloc(16);
> >   bar(x);
> >   free(x);
> > }
> > 
> > In this case the malloc can be replaced by an alloca, and the free
> > removed. Note that this is true even though the pointer 'x' is
> > definitely
> > captured (and may be recorded in global storage, etc.).
> 
> Hello,
> 
> this seems to rely on the fact that 'bar' returns normally, and thus
> that
> whenever malloc is executed, free will be as well. However, bar could
> never return, or return abnormally by throwing an exception which
> will
> skip the call to free.
> 
> void bar(int *x) {
>    free(x);
>    throw 42;
> }
> 
> will result in calling free on the stack. Now if there was a
> destructor
> calling free in foo1... Do you actually also consider exceptions when
> you
> test that all paths from malloc to the exits contain a call to free?
> That
> would only leave noreturn functions.

Marc,

Thanks!

My understanding is that the extra control-flow from exception handling should be accounted for by the basic-block successor/predecessor information (because calling a function that might throw uses invoke, and then you see both the regular predecessor and the cleanup block as predecessors). I'll double-check that's correct. Also, you're right, I should check the function's does-not-return attribute also.

 -Hal

> 
> --
> Marc Glisse
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-commits mailing list