summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorShuxin Yang <shuxin.llvm@gmail.com>2013-06-07 22:45:21 +0000
committerShuxin Yang <shuxin.llvm@gmail.com>2013-06-07 22:45:21 +0000
commit1c2b03aae9e56e69d215e9b39928a1340e3ca0c3 (patch)
tree99cdbcaa19b85e4e0e133e79adf62143ccdbc1ec /lib
parent40be73bed71a69853720a7f0609cb1f2f77dc3bd (diff)
downloadllvm-1c2b03aae9e56e69d215e9b39928a1340e3ca0c3.tar.gz
llvm-1c2b03aae9e56e69d215e9b39928a1340e3ca0c3.tar.bz2
llvm-1c2b03aae9e56e69d215e9b39928a1340e3ca0c3.tar.xz
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
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/Scalar/MemCpyOptimizer.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index be0f0e8a25..8600c9ebf7 100644
--- a/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -626,8 +626,10 @@ bool MemCpyOpt::performCallSlotOptzn(Instruction *cpy,
return false;
Type *StructTy = cast<PointerType>(A->getType())->getElementType();
- uint64_t destSize = TD->getTypeAllocSize(StructTy);
-
+ // If StructTy is an opaque type, it should have at least <cpyLen> bytes,
+ // as implified by the copy-instruction.
+ uint64_t destSize = StructTy->isSized() ?
+ TD->getTypeAllocSize(StructTy) : cpyLen;
if (destSize < srcSize)
return false;
} else {