<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">Feel free to commit with some comments on the test.</div><div class="gmail_quote"><br></div><div class="gmail_quote">On Wed, Jun 25, 2014 at 1:31 PM, Tom Stellard <span dir="ltr"><<a href="mailto:thomas.stellard@amd.com" target="_blank">thomas.stellard@amd.com</a>></span> wrote:<br>
</div><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">---<br>
 include/clang/Basic/TargetInfo.h            |  4 +---<br>
 lib/Basic/TargetInfo.cpp                    |  9 +++++++++<br>
 test/CodeGen/<a href="http://record-lowering-non-zero-as.cl" target="_blank">record-lowering-non-zero-as.cl</a> | 14 ++++++++++++++<br>
 3 files changed, 24 insertions(+), 3 deletions(-)<br>
 create mode 100644 test/CodeGen/<a href="http://record-lowering-non-zero-as.cl" target="_blank">record-lowering-non-zero-as.cl</a><br>
<br>
diff --git a/include/clang/Basic/TargetInfo.h b/include/clang/Basic/TargetInfo.h<br>
index e1d0116..65dc101 100644<br>
--- a/include/clang/Basic/TargetInfo.h<br>
+++ b/include/clang/Basic/TargetInfo.h<br>
@@ -790,9 +790,7 @@ public:<br>
   }<br>
<br>
 protected:<br>
-  virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {<br>
-    return PointerWidth;<br>
-  }<br>
+  virtual uint64_t getPointerWidthV(unsigned AddrSpace) const;<br>
   virtual uint64_t getPointerAlignV(unsigned AddrSpace) const {<br>
     return PointerAlign;<br>
   }<br>
diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp<br>
index 71e39dd..d0f6306 100644<br>
--- a/lib/Basic/TargetInfo.cpp<br>
+++ b/lib/Basic/TargetInfo.cpp<br>
@@ -17,6 +17,7 @@<br>
 #include "clang/Basic/LangOptions.h"<br>
 #include "llvm/ADT/APFloat.h"<br>
 #include "llvm/ADT/STLExtras.h"<br>
+#include "llvm/IR/DataLayout.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
 #include <cstdlib><br>
 using namespace clang;<br>
@@ -242,6 +243,14 @@ bool TargetInfo::isTypeSigned(IntType T) {<br>
   };<br>
 }<br>
<br>
+uint64_t TargetInfo::getPointerWidthV(unsigned AddrSpace) const {<br>
+  if (!DescriptionString)<br>
+    return PointerWidth;<br>
+<br>
+  llvm::DataLayout DL(DescriptionString);<br>
+  return DL.getPointerSizeInBits(AddrSpace);<br>
+}<br></blockquote><div><br></div><div>Seems reasonable.</div><div> </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">

+<br>
 /// setForcedLangOptions - Set forced language options.<br>
 /// Apply changes to the target information with respect to certain<br>
 /// language options which change the target configuration.<br>
diff --git a/test/CodeGen/<a href="http://record-lowering-non-zero-as.cl" target="_blank">record-lowering-non-zero-as.cl</a> b/test/CodeGen/<a href="http://record-lowering-non-zero-as.cl" target="_blank">record-lowering-non-zero-as.cl</a><br>

new file mode 100644<br>
index 0000000..a96756f<br>
--- /dev/null<br>
+++ b/test/CodeGen/<a href="http://record-lowering-non-zero-as.cl" target="_blank">record-lowering-non-zero-as.cl</a><br>
@@ -0,0 +1,14 @@<br>
+// REQUIRES: r600-registered-target<br>
+// RUN: %clang -target r600 -mcpu=verde -S -emit-llvm -o - %s<br></blockquote><div><br></div><div>IMO this should be a Sema test.  CodeGen was working as intended, it's the output of sizeof() that was wrong.  Can you make this a Sema test like:<br>
</div><div><br></div><div>struct test_as0 { int *ptr; };</div><div>int as0[sizeof(struct test_as0) == 4 ? 1 : -1];</div><div><div>struct test_as1 { global int *ptr; };</div><div>int as1[sizeof(struct test_as1) == 8 ? 1 : -1];</div>
</div><div><div><div>// ... and so on, for other interesting address spaces.</div></div></div><div><br></div><div>If you also want a CodeGen test, please FileCheck for the correct LLVM IR struct type.</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">
+<br>
+// Record lowering was crashing on SI and newer targets, because it<br>
+// was using the wrong size for test::ptr.  Since global memory<br>
+// has 64-bit pointers, sizeof(test::ptr) should be 8.<br>
+<br>
+struct test {<br>
+  global int *ptr;<br>
+};<br>
+<br>
+void func(struct test t, global int *ptr) {<br>
+  *ptr = 0;<br>
+}<br>
<span class=""><font color="#888888">--<br>
1.8.1.5<br>
<br>
</font></span></blockquote></div><br></div></div>