<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Wed, Dec 30, 2015 at 12:15 PM Tobias Grosser via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: grosser<br>
Date: Wed Dec 30 14:11:48 2015<br>
New Revision: 256650<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=256650&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=256650&view=rev</a><br>
Log:<br>
IslExprBuilder: Provide PointerLikeTypeTraits for isl_id<br>
<br>
Providing an explicit PointerLikeTypeTraits implementation became necessary<br>
since LLVM started in <a href="https://llvm.org/svn/llvm-project/llvm/trunk@256620" rel="noreferrer" target="_blank">https://llvm.org/svn/llvm-project/llvm/trunk@256620</a><br>
to automatically derive the pointer alignment from the pointer element type,<br>
which does not work for incomplete types as used by isl. To ensure our code<br>
still compiles, we provide an instantiation of PointerLikeTypeTraits for isl_id<br>
which assumes no minimal alignment. isl pointers are likely to have a "higher"<br>
alignment. We can exploit this later in case this becomes performance relevant.<br>
<br>
Modified:<br>
    polly/trunk/include/polly/CodeGen/IslExprBuilder.h<br>
<br>
Modified: polly/trunk/include/polly/CodeGen/IslExprBuilder.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/CodeGen/IslExprBuilder.h?rev=256650&r1=256649&r2=256650&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/CodeGen/IslExprBuilder.h?rev=256650&r1=256649&r2=256650&view=diff</a><br>
==============================================================================<br>
--- polly/trunk/include/polly/CodeGen/IslExprBuilder.h (original)<br>
+++ polly/trunk/include/polly/CodeGen/IslExprBuilder.h Wed Dec 30 14:11:48 2015<br>
@@ -23,6 +23,21 @@ class DataLayout;<br>
 class ScalarEvolution;<br>
 }<br>
<br>
+struct isl_id;<br>
+<br>
+namespace llvm {<br>
+// Provide PointerLikeTypeTraits for isl_id.<br>
+template <> class PointerLikeTypeTraits<isl_id *> {<br></blockquote><div><br></div><div>Unfortunately, this almost guarantees an ODR violation if anyone ever causes an instantiation of the primary template without having included this header.</div><div><br></div><div>Why does isl_id need to remain incomplete here?</div><div><br></div><div>If it truly needs to be opaque, I would suggest changing whatever data structure to explicitly operate on void* which we provide a generic template for which assumes at least 4-byte alignment. This template is intended precisely for the cases where the types of the pointers change, aren't possibly known ahead of time, etc., and the code actually must erase the type and make generic assumptions.</div><div><br></div><div>I find using void* to do this somewhat more transparent. What do you think?</div><div><br></div><div>-Chandler</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+public:<br>
+  static inline const void *getAsVoidPointer(isl_id *P) { return (void *)P; }<br>
+  static inline const Region *getFromVoidPointer(void *P) {<br>
+    return (Region *)P;<br>
+  }<br>
+  enum { NumLowBitsAvailable = 0 };<br>
+};<br>
+}<br>
+<br>
 namespace polly {<br>
<br>
 /// @brief LLVM-IR generator for isl_ast_expr[essions]<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>