From 9792b646c68d0dcee4049662091f1496b4c85ce7 Mon Sep 17 00:00:00 2001 From: Shuxin Yang Date: Sat, 8 Jun 2013 04:56:05 +0000 Subject: Fix a potential bug in r183584. r183584 tries to derive some info from the code *AFTER* a call and apply these derived info to the code *BEFORE* the call, which is not always safe as the call in question may never return, and in this case, the derived info is invalid. Thank Duncan for pointing out this potential bug. rdar://14073661 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183606 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/MemCpyOptimizer.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'lib/Transforms/Scalar/MemCpyOptimizer.cpp') diff --git a/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/lib/Transforms/Scalar/MemCpyOptimizer.cpp index 8600c9ebf7..c3259254f8 100644 --- a/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -626,10 +626,14 @@ bool MemCpyOpt::performCallSlotOptzn(Instruction *cpy, return false; Type *StructTy = cast(A->getType())->getElementType(); - // If StructTy is an opaque type, it should have at least bytes, - // as implified by the copy-instruction. - uint64_t destSize = StructTy->isSized() ? - TD->getTypeAllocSize(StructTy) : cpyLen; + if (!StructTy->isSized()) { + // The call may never return and hence the copy-instruction may never + // be executed, and therefore it's not safe to say "the destination + // has at least bytes, as implied by the copy-instruction", + return false; + } + + uint64_t destSize = TD->getTypeAllocSize(StructTy); if (destSize < srcSize) return false; } else { -- cgit v1.2.3