Memmove vs Dead Code Elimination


I have attached an example file to show you how i’m doing string concatenation. (This is the result after opt -O3 from llvm3.0)
There are two strings (a and b) allocated and filled with malloc and llvm.memcpy (from an internal constant). Then, a third string (c) is created. The new length is correctly constant folded, and llvm.memcpy copies the memory from the first two strings into the new one.
If LLVM would change the memcpy from a and b to c to a memcpy from the internal constant to c, it would be much better optimizable:

  • Filling c could be made of one big memcpy
  • The data filled into a and b would not longer be used
  • So dead code elimination could remove two memcpy calls
  • Then no calls are done on a and b, all other store’s could be removed by dead store elimination
  • From a and b, a malloc/free pair would be remain which will be removed then

I hope you can implement some optimization rules to achieve that improvement :wink:

stringref.ll (13.6 KB)