[LLVMdev] extractelement causes memory access violation - what to do?

Philip Reames listmail at philipreames.com
Fri Jun 26 11:20:32 PDT 2015



On 06/26/2015 11:07 AM, David Majnemer wrote:
>
>
> On Fri, Jun 26, 2015 at 9:38 AM, Philip Reames 
> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>
>     On 06/26/2015 08:42 AM, David Majnemer wrote:
>>
>>
>>     On Fri, Jun 26, 2015 at 7:00 AM, Paweł Bylica <chfast at gmail.com
>>     <mailto:chfast at gmail.com>> wrote:
>>
>>         Hi,
>>
>>         Let's have a simple program:
>>         define i32 @main(i32 %n, i64 %idx) {
>>           %idxSafe = trunc i64 %idx to i5
>>           %r = extractelement <4 x i32> <i32 -1, i32 -1, i32 -1, i32
>>         -1>, i64 %idx
>>           ret i32 %r
>>         }
>>
>>         The assembly of that would be:
>>         pcmpeqd%xmm0, %xmm0
>>         movdqa%xmm0, -24(%rsp)
>>         movl-24(%rsp,%rsi,4), %eax
>>         retq
>>
>>         The language reference states that the extractelement
>>         instruction produces undefined value in case the index
>>         argument is invalid (our case). But the implementation simply
>>         dumps the vector to the stack memory, calculates the memory
>>         offset out of the index value and tries to access the memory.
>>         That causes the crash.
>>
>>         The workaround is to trunc the index value before
>>         extractelement (see %idxSafe). But what should be the
>>         ultimate solution?
>>
>>
>>     We could fix this by specifying that out of bounds access on an
>>     extractelement leads to full-on undefined behavior, no need to
>>     force everyone to eat the cost of a mask.
>     This seems like the appropriate decision to me. It's closely in
>     line with existing practice and assumptions.
>
>
> The only problem that I can see by specifying it this way is that they 
> cannot be speculatively executed, isSafeToSpeculativelyExecute 
> believes it is currently safe to do so.  I can see why speculating 
> this instruction might be good. Perhaps we should emit a mask...
Hm, yuck.  Hadn't thought about that one.

One option would to let extractelements with provably in bounds entries 
be speculated, but not others.

Another option might be to have a mask emitted by the code that is 
speculating it.

I'm not sure how bad either scheme would actually be in practice. Almost 
all of the extractelements I see in optimized IR have constant indices.

Philip
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150626/af8762d8/attachment.html>


More information about the llvm-dev mailing list