[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