[PATCH] A new HeapToStack allocation promotion pass

Hal Finkel hfinkel at anl.gov
Fri Oct 4 05:50:16 PDT 2013


----- Original Message -----
> ----- 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.

To be slightly more specific on this last point, there is some pass that inserts 'unreachable' after such functions, but I should make sure that we always run after it (or deal with it internally).

 -Hal

> 
>  -Hal
> 
> > 
> > --
> > Marc Glisse
> > 
> 
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 

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



More information about the llvm-commits mailing list