[llvm] r183584 - Fix an assertion in MemCpyOpt pass.
Eli Friedman
eli.friedman at gmail.com
Fri Jun 7 16:39:46 PDT 2013
On Fri, Jun 7, 2013 at 3:45 PM, Shuxin Yang <shuxin.llvm at gmail.com> wrote:
> Author: shuxin_yang
> Date: Fri Jun 7 17:45:21 2013
> New Revision: 183584
>
> URL: http://llvm.org/viewvc/llvm-project?rev=183584&view=rev
> Log:
> 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
>
> Modified:
> llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
> llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll
>
> Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp?rev=183584&r1=183583&r2=183584&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Fri Jun 7
> 17:45:21 2013
> @@ -626,8 +626,10 @@ bool MemCpyOpt::performCallSlotOptzn(Ins
> 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;
>
Why is it safe to assume StructTy is at least cpyLen bytes? And if it is
safe, why is this check necessary at all?
-Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130607/f9dc794f/attachment.html>
More information about the llvm-commits
mailing list