[LLVMdev] wrong code generation for memcpy function in SROA optimization pass

David Blaikie dblaikie at gmail.com
Sun Nov 24 19:01:11 PST 2013


On Sat, Nov 23, 2013 at 8:51 PM, huyanlin19870324
<huyanlin19870324 at 126.com>wrote:

> SROA optimization pass did some optimizations and transforms for memcpy
> function,such as ld/st operations.When someone has written down code like
> size>sizeof(dest) in memcpy(*dest,*src,size),
>

How could it be valid to memcpy when the size of the destination is smaller
than the number of bytes you asked to copy? It looks to me like your
program has undefined behavior. Don't do that.

- David


> there was much likely a wrong code generation.for example,considered
> as such testcase:
> int main()
> {
>   char ch;
>   short sh = 0x1234;
>   memcpy(&ch,&sh,2);
>   printf("ch=0x%02x\n",ch);
> }
> At i586 target,the corect executive result was "ch=0x34",but once openning
> the SROA optimization
> pass it turned out as "ch=0x00".
>     Then I had a try to dump IR code for comparsion between before and
> after SROA optimization pass.
> IR before SROA:
> define i32 @main() #0 {
> entry:
>   %retval = alloca i32,align 4,
>   %ch = alloca i8,align 1,
>   %sh = alloca i16,align 2,
>   store i32 0,i32* %retval,
>   store i16 4660,i16* %sh,align 2,!tbaa!0,
>   %0 = bitcast i16* %sh to i8*
>   call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ch,i8* %0,,i32 2,i32 1,i1
> false),
>   %1 = load i8* ch,align 1,!tbaa!0,
>   %conv = sext i8 %1 to i32,
>   %call = call i32 (i8*,...)* @printf(i8* getelementptr
> inbounds([9*i8]*@.str,i32 0,i32 0),i32 %conv),
>   ret i32 0,
> }
> IR after SROA:
> define i32 @main() #0 {
> entry:
>   %conv = sext i8 undef to i32,
>   %call = call i32 (i8*,...)* @printf(i8* getelementptr
> inbounds([9*i8]*@.str,i32 0,i32 0),i32 %conv),
>   ret i32 0,
> }
>     Then I tried to debbuging with SROA.cpp,I found in funcction
> visitMemTransferInst,it accorded the IR instruction "call void
> @llvm.memcpy.p0i8.p0i8.i32(i8* %ch,i8* %0,,i32 2,i32 1,i1 false)",would
> produce such codes(finally,memcpy disappeared and the codes would be
> delated,IR after SROA become incorrect ,am i right?)
> %sh.0.cast = bitcast i8* ch to i16*,
> %sh.0.copyload = load i16* sh,align 1,
> store i16 %sh.0.copyload,i16* %sh.0.cast,align 1,
>
>      In a word,I think visitMemTransferInst function in SROA.cpp had
> maken a incorrect optimization for memcpy in the situation like memcpy's
> size>sizeof(dest).
> am i write? I would appreciate any suggestions on this.Thanks very much!
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131124/f65707b4/attachment.html>


More information about the llvm-dev mailing list