[llvm] r183584 - Fix an assertion in MemCpyOpt pass.

Shuxin Yang shuxin.llvm at gmail.com
Fri Jun 7 17:51:29 PDT 2013


On 6/7/13 4:39 PM, Eli Friedman wrote:
> On Fri, Jun 7, 2013 at 3:45 PM, Shuxin Yang <shuxin.llvm at gmail.com 
> <mailto: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?
If not, why is it possible copying cpyLen byte from (part of) src to Dest?

> And if it is safe, why is this check necessary at all?
>
I guess you confuse cpyLen with SrcLen.
I asked the same question when I read the code. After the 2nd thought, I 
think it is necessary.
You never know how the callee access the Src, it could access the last 
byte (the SrcSize-th byte) of the object
corresponding to the Src, and cpyLen < SrcSize.




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130607/606ab12e/attachment.html>


More information about the llvm-commits mailing list