<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Tue, Jun 30, 2015 at 11:03 PM Hal Finkel <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">----- Original Message -----<br>
> From: "Paweł Bylica" <<a href="mailto:chfast@gmail.com" target="_blank">chfast@gmail.com</a>><br>
> To: "David Majnemer" <<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>><br>
> Cc: "LLVMdev" <<a href="mailto:llvmdev@cs.uiuc.edu" target="_blank">llvmdev@cs.uiuc.edu</a>><br>
> Sent: Tuesday, June 30, 2015 5:42:24 AM<br>
> Subject: Re: [LLVMdev] extractelement causes memory access violation - what   to do?<br>
><br>
><br>
><br>
><br>
><br>
> On Fri, Jun 26, 2015 at 5:42 PM David Majnemer <<br>
> <a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a> > wrote:<br>
><br>
><br>
><br>
><br>
><br>
> On Fri, Jun 26, 2015 at 7:00 AM, Paweł Bylica < <a href="mailto:chfast@gmail.com" target="_blank">chfast@gmail.com</a> ><br>
> wrote:<br>
><br>
><br>
><br>
> Hi,<br>
><br>
><br>
> Let's have a simple program:<br>
><br>
> define i32 @main(i32 %n, i64 %idx) {<br>
> %idxSafe = trunc i64 %idx to i5<br>
> %r = extractelement <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, i64<br>
> %idx<br>
> ret i32 %r<br>
> }<br>
><br>
><br>
> The assembly of that would be:<br>
><br>
> pcmpeqd %xmm0, %xmm0<br>
> movdqa %xmm0, -24(%rsp)<br>
> movl -24(%rsp,%rsi,4), %eax<br>
> retq<br>
><br>
><br>
> The language reference states that the extractelement instruction<br>
> produces undefined value in case the index argument is invalid (our<br>
> case). But the implementation simply dumps the vector to the stack<br>
> memory, calculates the memory offset out of the index value and<br>
> tries to access the memory. That causes the crash.<br>
><br>
><br>
> The workaround is to trunc the index value before extractelement (see<br>
> %idxSafe). But what should be the ultimate solution?<br>
><br>
><br>
><br>
><br>
><br>
> We could fix this by specifying that out of bounds access on an<br>
> extractelement leads to full-on undefined behavior, no need to force<br>
> everyone to eat the cost of a mask.<br>
><br>
><br>
> I don't have preference for any of the solutions.<br>
><br>
><br>
> I have a side question. It is not stated explicitly in the reference<br>
> but I would assume the index of extractelement is processed as an<br>
> unsigned value. However, the DAG Builder extends the index with<br>
> sext. Is it correct?<br>
<br>
Hrmm. Given that only (small) positive numbers are valid, it shouldn't matter. Unless we can find a reason that it works better to be sext, it seems conceptually cleaner to make it zext.<br></blockquote><div><br></div><div>I have tried to change it to zext. 2 Mips test have failed. I haven't checked the details though.</div><div>sext looks pretty wrong to me because i5 -1 does not mean 31 any more.</div><div><br></div><div>- PB</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
 -Hal<br>
<br>
><br>
><br>
> - PB<br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" rel="noreferrer" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
><br>
<br>
--<br>
Hal Finkel<br>
Assistant Computational Scientist<br>
Leadership Computing Facility<br>
Argonne National Laboratory<br>
</blockquote></div></div>