[LLVMdev] malloc / free & memcpy optimisations.

Duncan Sands baldrick at free.fr
Tue May 21 04:57:34 PDT 2013


Hi Jeremy,

On 21/05/13 13:15, Jeremy Lakeman wrote:
> The front end I'm building for an existing interpreted language is unfortunately
> producing output similar to this far too often;
>
> define void @foo(i8* nocapture %dest, i8* nocapture %src, i32 %len) nounwind {
>    %1 = tail call noalias i8* @malloc(i32 %len) nounwind
>    tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %src, i32 %len, i32 1,
> i1 false)
>    tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %1, i32 %len, i32 1,
> i1 false)
>    tail call void @free(i8* %1) nounwind
>    ret void
> }

could you allocate the memory on the stack instead (alloca instruction)?

Ciao, Duncan.

>
> I'd like to be able to reduce this pattern to this;
>
> define void @foo(i8* nocapture %dest, i8* nocapture %src, i32 %len) nounwind {
>    tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i32
> 1, i1 false)
>    ret void
> }
>
> Optimising all cases of this pattern from within my front end's AST would be
> difficult. I'd rather implement this as an llvm pass or two that runs after
> other function passes have already cleaned up the mess I've made.
>
> Has anyone written any passes to detect and combine multiple memory copies that
> originated from the same data?
> And then eliminate stores and malloc / free pairs for local pointers that are
> never read from or captured?
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>




More information about the llvm-dev mailing list