Abstract out everything having to do with member pointers into the ABI
class;  they should just be completely opaque throughout IR gen now,
although I haven't really audited that.

Fix a bug apparently inherited from gcc-4.2 where we failed to null-check
member data pointers when performing derived-to-base or base-to-derived
conversions on them.

llvm-svn: 111789
diff --git a/clang/test/CodeGenCXX/pointers-to-data-members.cpp b/clang/test/CodeGenCXX/pointers-to-data-members.cpp
index 70308c6..60c1661 100644
--- a/clang/test/CodeGenCXX/pointers-to-data-members.cpp
+++ b/clang/test/CodeGenCXX/pointers-to-data-members.cpp
@@ -65,15 +65,21 @@
 int C::*pc;
 
 void f() {
-  // CHECK: store i64 -1, i64* @_ZN5Casts2paE
+  // CHECK:      store i64 -1, i64* @_ZN5Casts2paE
   pa = 0;
 
-  // CHECK: [[ADJ:%[a-zA-Z0-9\.]+]] = add nsw i64 {{.*}}, 4
-  // CHECK: store i64 [[ADJ]], i64* @_ZN5Casts2pcE
+  // CHECK-NEXT: [[TMP:%.*]] = load i64* @_ZN5Casts2paE, align 8
+  // CHECK-NEXT: [[ADJ:%.*]] = add nsw i64 [[TMP]], 4
+  // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
+  // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
+  // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2pcE
   pc = pa;
 
-  // CHECK: [[ADJ:%[a-zA-Z0-9\.]+]] = sub nsw i64 {{.*}}, 4
-  // CHECK: store i64 [[ADJ]], i64* @_ZN5Casts2paE
+  // CHECK-NEXT: [[TMP:%.*]] = load i64* @_ZN5Casts2pcE, align 8
+  // CHECK-NEXT: [[ADJ:%.*]] = sub nsw i64 [[TMP]], 4
+  // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
+  // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
+  // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2paE
   pa = static_cast<int A::*>(pc);
 }