<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div><div>On Feb 12, 2013, at 12:25 PM, 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"><div>Hi Arnold,</div><div><br></div><div>Thanks for the review!</div><div><br></div><div><br></div>On 12 February 2013 17:43, Arnold Schwaighofer <span dir="ltr"><<a href="mailto:aschwaighofer@apple.com" target="_blank">aschwaighofer@apple.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">The existing Analysis tests for "overlap" between memory regions (underlying pointers). As such, it can ignore the access pattern and can operate using just the pointer and the underlying object.<br></blockquote><div><br></div><div>Hum, ok, that should simplify a lot the code, then. Though, I could only find the getLocation() with StoreInst, LoadInst, VAArgInst, not generic values.</div></div></div></div></blockquote><div><br></div>I was referring to the existing analysis in the loop vectorizer. If we start using alias analysis we have to be a lot more careful, we have to compare the pointer operand (plus consider that the access will be vectorized).</div><div><br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto; ">We will have to ask "Do the future vectorized accesses overlap?" Something like:<br><br>AA->alias((&A[i+1], MaxVF*4), (&A[i], MaxVF*4)).<br></blockquote><div><br></div><div>I know, there was a comment on the previous patch to that effect. I couldn't find an AA method to inspect memory considering strides. It might be possible to examine the edges, but it'd be more efficient to do that inside AA. I assume this is done elsewhere, maybe I could re-use the same idea.</div></div></div></div></blockquote><div><br></div>Alias analysis is not dependence analysis and as such it does not know about strides. It will only answer questions such as "Does access to location A and access to location B possibly alias". The Location object encapsulates how big our access is and the address we are accessing.</div><div><br></div><div><br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">Also, for the writes you use the underlying object to look up a value in the ReadWrites multi-map that is populated with "getPointerOperand()" which is not necessarily the underlying object.<br></blockquote><div><br></div><div>That is how the vector was populated, I just stored the instruction alongside it to retrieve later on. From what you said above, it might not be necessary (but I'd have to have a way to check aliasing on the underlying objects).</div></div></div></div></blockquote>I think you misunderstood my first sentence in the previous email (see above).</div><div><br></div><div>Think of the underlying object in A[i] as A. When you do a store or load the "getPointerOperand()" in my example is &A[i]. Two different objects - one is the gep the other one could be for example a global variable.</div><div><br></div><div>The existing analysis in the loop vectorizer is conservative and will say if there is both a load and store to A via two different pointers (for example &A[i], &A[i+1] it will give up.</div><div><br></div><div>If we add a query using alias analysis (we now allow several accesses of a common underlying object) we need to look at all accesses &X[…] for possible aliasing with &A[i] where X == A. (This is assuming we insert dynamic checks for unknown objects). </div><div><br></div><div>Note the difference between &A[i] , which is what Store->getPointerOperand() returns, and A which is what GetUnderlyingObject(Store->getPointerOperand()) returns.</div><div><br></div><div>If we see a store to &A[i] we now need to look at all other memory accesses to see whether they alias with it. In the multimap you only store &A[i] so you can't query for all  other objects accessing A.</div><div><br></div><div>At a high high level (I am not suggesting we do this because it is slow), you would have to ask for every load/store pair whether their pointer operands alias under the assumption that they are accessed with a location.size that is the size of the vectorized load/store access. Everything beyond that is optimization - that we have to ensure is correct.</div><div><br></div><div>I also believe that if you implement this, that alias analysis will tell you that you have possibly overlapping accesses in your example:</div><div><br></div><div>struct {</div><div>int a[100];</div><div>int b[100];</div><div>} S;</div><div><br></div><div>because</div><div><br></div><div>alias((&S.a[99], 4xsizeof(int)), &S.b[0], 4xsizeof(int)) == partial alias</div><div><br></div><div><br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">I spent some time looking at that part of the code and I'm still in doubt as to what that possible regions can the underlying object point to, or if the underlying object is always accessible via the pointer operand.</div></div></div></blockquote><div><br></div>The underlying object can point to anything - we are looking only at identified objects (Allocas, Globals, NoAlias parameters, etc.) in the existing code.<br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>The code seems marginally ok, since all the other vectorization cases are still working and the new global alias also works, but that doesn't say much...</div><div><br></div></div></div></div></blockquote><div><br></div>Unfortunately, the code as it is incorrect.</div><div><br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>cheers,</div><div>--renato</div></div></div></div></blockquote><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div></div></div></div></div></div><div><blockquote type="cite">
</blockquote></div><br></body></html>