[LLVMdev] malloc / free & memcpy optimisations.

Jeremy Lakeman Jeremy.Lakeman at gmail.com
Tue May 21 05:34:57 PDT 2013


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

This is mainly for string or binary blob handling, using the stack isn't a
great idea for size reasons.

While I'm experimenting with simple code examples now, and I picked a
simple one for this email. I'm certain things will get much more
complicated once I implement more features of the language.


On Tue, May 21, 2013 at 8:45 PM, Jeremy Lakeman <Jeremy.Lakeman at gmail.com>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
> }
>
> 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?
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130521/88e90d02/attachment.html>


More information about the llvm-dev mailing list