<div dir="ltr">On Sun, Aug 11, 2013 at 5:49 AM, Michele Scandale <span dir="ltr"><<a href="mailto:michele.scandale@gmail.com" target="_blank">michele.scandale@gmail.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 class="im">On 08/11/2013 08:41 AM, Micah Villmow wrote:<br>
> How about this as a solution.<br>
><br>
> Add one hook into TargetInstrInfo, and one into TargetISelLowering.<br>
><br>
> 1) getAddressSpaceRelation(unsigned AS1, unsigned AS2) - Returns either disjoint, subset, superset, equal. Function defaults to equal.<br>
> 2) isAddressSpaceSupported(unsigned AS) - Returns true if supported, false otherwise. Function defaults to false for all non-zero AS.<br>
><br>
> These could be used by IR passes to optimized(#1) and legalization(#2). It requires no changes by backends that do not want to support multiple address spaces and extremely minimal and reasonable support by backends that do. On a plus side, it also requires no IR/Module changes.<br>

<br>
</div>To know if two address spaces are disjoint for alias analysis purpose, it's more<br>
effective to know if in the source language the property holds or not, because<br>
as said two disjoint address spaces in the abstract model (like the one defined<br>
by OpenCL) can be implemented in the same physical address space in separated<br>
regions, so asking to the target wont produce the correct answer for all the<br>
targets (see X86 or whatever 'classical' processor with one address space)!<br></blockquote><div><br></div><div>Which is why I believe metadata is the right approach here.  The physical address space mapping can be left as a part of the IR as it is now; the IR is target-dependent anyway and the metadata should not be needed for correctness.  Then you can attach metadata to the IR that assigns language-specific semantics to the IR.  If the metadata doesn't exist, or is stripped out, the optimizers have to assume aliasing.  This metadata doesn't need to be language-specific.  As mentioned earlier in the thread, it can just be mapping that assigns a logical address space to loads/stores, and defines which address spaces overlap.  Maybe to avoid confusion, instead of calling them address spaces, we could call them address regions or something like that.  Just so they're not confused with LLVM IR address spaces.</div>
<div><br></div><div>This combined with Micah's proposal for the two new hooks should handle all of the use-cases.  An optimizer can first look at the physical address spaces.  If they are different and the target states that they do not alias, then they do not alias.  This would handle aliasing for the case of generic IR.  But if they may alias due to the address space information (e.g. always for X86), then the optimizer can look for metadata created by the front-end (e.g. clang OpenCL) and use that to see if aliasing is possible.  In the case of OpenCL, the metadata would say aliasing is not possible between private and local memory.  So even if the LLVM IR address spaces are the same, the optimizer will know that aliasing is not possible.</div>
<div><br></div><div>Any I missing something here?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
-Michele<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>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div>
</div></div>