[LLVMdev] malloc / free & memcpy optimisations.

Jeremy Lakeman Jeremy.Lakeman at gmail.com
Tue May 21 04:15:39 PDT 2013


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/89b18cd1/attachment.html>


More information about the llvm-dev mailing list