[LLVMdev] Promoting malloc to alloca

Nick Lewycky nicholas at mxc.ca
Tue Jul 13 00:04:30 PDT 2010


Duncan Sands wrote:
> Hi Nick,
>
>> The attribute you're looking for, "delete if result is unused" doesn't
>> exist in LLVM. I've considered it in the past, but the truth is that
>> most of the time I want to eliminate dead malloc's, they *do* have a
>> use: the matching free. At some point I expect I'm going to teach LLVM
>> to remove dead malloc+free / new+delete / new[]+delete[] pairings, but I
>> haven't gotten around to it yet. Teaching it to kill an allocation with
>> no uses at all will be dead simple too.
>
> LLVM already removes malloc+(perhaps compare with null)+free.

What?

   declare noalias i8* @malloc() nounwind
   declare void @free(i8* nocapture) nounwind
   define i8 @test() {
     %A = call i8* @malloc()
     call void @free(i8* %A)
     ret i8 undef
   }

doesn't optimize at all. While we're at it, we also don't get:

   declare noalias i8* @malloc() nounwind
   define i8 @test() {
     %A = call i8* @malloc()
     %B = load i8* %A
     ret i8 %B
   }

either, though that's fixable by inserting llvm.lifetime.start right 
after the malloc.

Nick



More information about the llvm-dev mailing list