<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Note that the final index(es) and size of accessed memory have to be the same, and no zero length arrays must be involved that means you have to look at the type of the gep (and I am sure I am missing other conditions here). Essentially, you have to symbolically evaluate the address computation and take the size of the access into account. Something along the lines of BasicAA::aliasGEP.<div><br></div><div>You can assume that</div><div><div><div>  %arrayidx = getelementptr inbounds %struct.anon* @Foo, i32 0, i32 1, i32 %idxprom</div><div>  %0 = load i64* %arrayidx, align 8</div><div>  %arrayidx4 = getelementptr inbounds %struct.anon* @Foo, i32 0, i32 0, i32 %idxprom</div><div>  store i64 %mul, i64* %arrayidx4, align 8</div></div><div>don't overlap, but not so for:</div><div><div>  %arrayidx = getelementptr inbounds %struct.anon* @Foo, i32 0, i32 1, i32 %idxprom</div><div>  %0 = load i64* %arrayidx, align 8</div><div>  %arrayidx4 = getelementptr inbounds %struct.anon* @Foo, i32 0, i32 0, i32 %anotheridx</div><div>  store i64 %mul, i64* %arrayidx4, align 8</div></div><div><br></div><div><div><div>On Feb 5, 2013, at 11:41 AM, Renato Golin <<a href="mailto:renato.golin@linaro.org">renato.golin@linaro.org</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">On 5 February 2013 17:28, Nadav Rotem <span dir="ltr"><<a href="mailto:nrotem@apple.com" target="_blank">nrotem@apple.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div class="im"><span style="color:rgb(34,34,34)">We insert runtime overlap checks only for unidentified objects. The problem here is that the vectorizer thinks that A,B,C are all pointers to the same array, so it gives up.  If A,B,C were different arrays then it could have used runtime checks.    </span></div>
</div></blockquote><div><br></div><div style="">Yes, that is exactly the code that creates the run-time checks. ;)</div><div style=""><br></div><div style="">I'll try to inspect the uses for GEPs and store the offsets in a map. If it works, we can think of a better implementation.</div>
<div style=""><br></div><div style="">cheers,</div><div style="">--renato</div></div></div></div>
_______________________________________________<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">http://llvm.cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br></blockquote></div><br></div></div></body></html>