[PATCH] A new HeapToStack allocation promotion pass

David Blaikie dblaikie at gmail.com
Mon Sep 23 14:18:44 PDT 2013


On Mon, Sep 23, 2013 at 2:00 PM, hfinkel at anl.gov <hfinkel at anl.gov> wrote:

> Hi chandlerc,
>
> 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.).
>
> The pairing between the malloc and the free need not be 1:1, for example:
>
> void foo2(int a) {
>   int *x;
>
>   if (a == 0)
>     x = malloc(16);
>   else
>     x = malloc(32);
>
>   bar(x);
>   free(x);
> }
>
> where both mallocs and the free can be removed, and, finally, the free
> might not exclusively be used to free stack-promotable allocations, as in:
>
> void foo3(int *y) {
>   if (y == 0)
>     y = malloc(48);
>
>   bar(y);
>   free(y);
> }
>
> to handle this last case, which is referred to as an 'ambiguous' free in
> the code, a new boolean value is introduced to track the source of the
> allocation. The malloc is removed, but the free is not. Instead, the
> pointer passed to the free is conditionally set to null to prevent freeing
> a stack address.
>

I don't believe free is guaranteed to be a no-op on null (I believe it's
undefined), unlike C++ delete (which is defined to no-op on null). Should
this instead make the whole call conditional, rather than the argument?


>
> I talked briefly to Chandler about this offline, and we might want to turn
> the core functionality here into a utility function so that it can be used
> directly by SROA. Nevertheless, I think that the basic functionality can be
> reviewed in this form, and I'd like to discuss any other desired
> refactoring as part of the review process.
>
> Note: Using this pass causes a miscompile in
> SingleSource/Benchmarks/Shootout/objinst -- the transformation performed by
> HeapToStack looks valid, and bugpoint attributes the failure to some
> combination of later transformations. I'll open a separate bug report to
> track this issue.
>
> Please review and thanks again!
>
>
> http://llvm-reviews.chandlerc.com/D1745
>
> Files:
>   include/llvm-c/Transforms/Scalar.h
>   include/llvm/IR/DataLayout.h
>   include/llvm/InitializePasses.h
>   include/llvm/LinkAllPasses.h
>   include/llvm/Transforms/Scalar.h
>   lib/Transforms/IPO/PassManagerBuilder.cpp
>   lib/Transforms/Scalar/CMakeLists.txt
>   lib/Transforms/Scalar/HeapToStack.cpp
>   lib/Transforms/Scalar/Scalar.cpp
>   test/Transforms/HeapToStack/basic.ll
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130923/d7cf638f/attachment.html>


More information about the llvm-commits mailing list