Fix an assertion in MemCpyOpt pass.
authorShuxin Yang <shuxin.llvm@gmail.com>
Fri, 7 Jun 2013 22:45:21 +0000 (22:45 +0000)
committerShuxin Yang <shuxin.llvm@gmail.com>
Fri, 7 Jun 2013 22:45:21 +0000 (22:45 +0000)
commit1c2b03aae9e56e69d215e9b39928a1340e3ca0c3
tree99cdbcaa19b85e4e0e133e79adf62143ccdbc1ec
parent40be73bed71a69853720a7f0609cb1f2f77dc3bd
  Fix an assertion in MemCpyOpt pass.

  The MemCpyOpt pass is capable of optimizing:
      callee(&S); copy N bytes from S to D.
    into:
      callee(&D);
subject to some legality constraints.

  Assertion is triggered when the compiler tries to evalute "sizeof(typeof(D))",
while D is an opaque-typed, 'sret' formal argument of function being compiled.
i.e. the signature of the func being compiled is something like this:
  T caller(...,%opaque* noalias nocapture sret %D, ...)

  The fix is that when come across such situation, instead of calling some
utility functions to get the size of D's type (which will crash), we simply
assume D has at least N bytes as implified by the copy-instruction.

rdar://14073661

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183584 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/MemCpyOptimizer.cpp
test/Transforms/MemCpyOpt/memcpy.ll