<div dir="ltr"><div>Hal,<br>Thanks for your answer. Should I report a bug?<br><br></div>Best regards,<br>Alexey</div><div class="gmail_extra"><br><div class="gmail_quote">2014-10-17 14:30 GMT+03:00 Hal Finkel <span dir="ltr"><<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">----- Original Message -----<br>
> From: "Aliaksei Zasenka" <<a href="mailto:listhex@gmail.com">listhex@gmail.com</a>><br>
> To: <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a><br>
> Sent: Friday, October 17, 2014 4:24:27 AM<br>
> Subject: [LLVMdev] opt -O2 leads to incorrect operation (possibly a bug in    the DSE)<br>
><br>
> Hi all,<br>
><br>
> Consider the following example:<br>
><br>
> define void @fn(i8* %buf) #0 {<br>
> entry:<br>
> %arrayidx = getelementptr i8* %buf, i64 18<br>
> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %arrayidx, i8* %buf,<br>
> i64 18, i32 1, i1 false)<br>
> %arrayidx1 = getelementptr i8* %buf, i64 18<br>
> store i8 1, i8* %arrayidx1, align 1<br>
> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %buf, i8* %arrayidx,<br>
> i64 18, i32 1, i1 false)<br>
> ret void<br>
> }<br>
><br>
><br>
><br>
> I ran opt -O2 ex.ll -S, and got:<br>
><br>
> define void @fn(i8* nocapture %buf) #0 {<br>
> entry:<br>
> %arrayidx = getelementptr i8* %buf, i64 18<br>
> store i8 1, i8* %arrayidx, align 1<br>
> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %buf, i8* %arrayidx,<br>
> i64 18, i32 1, i1 false)<br>
> ret void<br>
> }<br>
><br>
><br>
> In that case previous contents of bytes 0-17 are overwritten by bytes<br>
> 18-35 (pre-opt code doesn't do that).<br>
><br>
><br>
><br>
> Another point, if I change the code to:<br>
><br>
> define void @fn(i8* %buf) #0 {<br>
> entry:<br>
> %arrayidx = getelementptr i8* %buf, i64 18<br>
> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %arrayidx, i8* %buf,<br>
> i64 18, i32 1, i1 false)<br>
><br>
> ;changing 19th byte, not 18th:<br>
><br>
> %arrayidx1 = getelementptr i8* %buf, i64 19<br>
> store i8 1, i8* %arrayidx1, align 1<br>
> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %buf, i8* %arrayidx,<br>
> i64 18, i32 1, i1 false)<br>
> ret void<br>
> }<br>
><br>
><br>
><br>
> I get correct piece of code:<br>
><br>
> define void @fn(i8* nocapture %buf) #0 {<br>
> entry:<br>
> %arrayidx = getelementptr i8* %buf, i64 18<br>
> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %arrayidx, i8* %buf,<br>
> i64 18, i32 1, i1 false)<br>
> %arrayidx1 = getelementptr i8* %buf, i64 19<br>
> store i8 1, i8* %arrayidx1, align 1<br>
> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %buf, i8* %arrayidx,<br>
> i64 18, i32 1, i1 false)<br>
> ret void<br>
> }<br>
><br>
> Adding some datalayout to module also solves the issue.<br>
><br>
> -print-after-all shows that the 'Dead Store Elimination' pass erases<br>
> first call to memcpy.<br>
><br>
> I found that the following code in DeadStoreElimination.cpp leads to<br>
> such behavior:<br>
> if (DL == nullptr && Later.Ptr->getType() == Earlier.Ptr->getType())<br>
> return OverwriteComplete;<br>
><br>
><br>
> Is this issue a bug in DSE or maybe I'm doing some wrong?<br>
><br>
<br>
</div></div>Looks like a bug in DSE, you're not doing anything wrong. We don't test much without data layouts anymore. This code might pre-date DSE's handling of memcpy intrinsics (just a guess). In any case, we'll fix it.<br>
<br>
 -Hal<br>
<br>
><br>
><br>
><br>
> Best regards,<br>
> Alexey<br>
><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
><br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Hal Finkel<br>
Assistant Computational Scientist<br>
Leadership Computing Facility<br>
Argonne National Laboratory<br>
</font></span></blockquote></div><br></div>