[clang] 2f1fb5d - [Clang] Convert some tests to opaque pointers (NFC)

Nikita Popov via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 8 06:26:39 PDT 2023


Author: Nikita Popov
Date: 2023-06-08T15:26:27+02:00
New Revision: 2f1fb5da724cf1c4455eadf67591640f83801547

URL: https://github.com/llvm/llvm-project/commit/2f1fb5da724cf1c4455eadf67591640f83801547
DIFF: https://github.com/llvm/llvm-project/commit/2f1fb5da724cf1c4455eadf67591640f83801547.diff

LOG: [Clang] Convert some tests to opaque pointers (NFC)

Added: 
    

Modified: 
    clang/test/CodeGenCXX/cxx11-initializer-aggregate.cpp
    clang/test/CodeGenCXX/cxx11-initializer-array-new.cpp
    clang/test/CodeGenCXX/cxx11-thread-local.cpp
    clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp
    clang/test/CodeGenCXX/cxx1z-copy-omission.cpp
    clang/test/CodeGenCXX/cxx1z-decomposition.cpp
    clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp
    clang/test/CodeGenCXX/cxx2a-destroying-delete.cpp
    clang/test/CodeGenCXX/cxx2a-thread-local-constinit.cpp
    clang/test/CodeGenCXX/cxx2a-three-way-comparison.cpp
    clang/test/CodeGenCXX/debug-info-inlined.cpp
    clang/test/CodeGenCXX/debug-info-range-for-var-names.cpp
    clang/test/CodeGenCXX/delete.cpp
    clang/test/CodeGenCXX/derived-to-virtual-base-class-calls-final.cpp
    clang/test/CodeGenCXX/destructors.cpp
    clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
    clang/test/CodeGenCXX/duplicate-mangled-name.cpp
    clang/test/CodeGenCXX/eh.cpp
    clang/test/CodeGenCXX/exceptions.cpp
    clang/test/CodeGenCXX/extern-c.cpp
    clang/test/CodeGenCXX/externc-ifunc-resolver.cpp
    clang/test/CodeGenCXX/finegrain-bitfield-access.cpp
    clang/test/CodeGenCXX/global-array-destruction.cpp
    clang/test/CodeGenCXX/global-init.cpp
    clang/test/CodeGenCXX/inheriting-constructor.cpp
    clang/test/CodeGenCXX/lambda-expressions-inside-auto-functions.cpp
    clang/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp
    clang/test/CodeGenCXX/lvalue-bitcasts.cpp
    clang/test/CodeGenCXX/mangle-local-class-vtables.cpp
    clang/test/CodeGenCXX/mangle-ms.cpp
    clang/test/CodeGenCXX/matrix-casts.cpp
    clang/test/CodeGenCXX/matrix-type-builtins.cpp
    clang/test/CodeGenCXX/ms-property.cpp
    clang/test/CodeGenCXX/ms-thunks-unprototyped.cpp
    clang/test/CodeGenCXX/ms-union-member-ref.cpp

Removed: 
    


################################################################################
diff  --git a/clang/test/CodeGenCXX/cxx11-initializer-aggregate.cpp b/clang/test/CodeGenCXX/cxx11-initializer-aggregate.cpp
index b3cf8df7509a8..0c9246d4e411f 100644
--- a/clang/test/CodeGenCXX/cxx11-initializer-aggregate.cpp
+++ b/clang/test/CodeGenCXX/cxx11-initializer-aggregate.cpp
@@ -1,14 +1,14 @@
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -S -emit-llvm -o - %s -triple x86_64-linux-gnu | FileCheck %s
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++17 -S -emit-llvm -o - %s -triple x86_64-linux-gnu | FileCheck %s
+// RUN: %clang_cc1 -std=c++11 -S -emit-llvm -o - %s -triple x86_64-linux-gnu | FileCheck %s
+// RUN: %clang_cc1 -std=c++17 -S -emit-llvm -o - %s -triple x86_64-linux-gnu | FileCheck %s
 
 struct A { int a, b; int f(); };
 
 namespace NonAggregateCopyInAggregateInit { // PR32044
   struct A { constexpr A(int n) : x(n), y() {} int x, y; } extern a;
-  // CHECK-DAG: @_ZN31NonAggregateCopyInAggregateInit1bE ={{.*}} global %{{.*}} { %[[A:.*]]* @_ZN31NonAggregateCopyInAggregateInit1aE }
+  // CHECK-DAG: @_ZN31NonAggregateCopyInAggregateInit1bE ={{.*}} global %{{.*}} { ptr @_ZN31NonAggregateCopyInAggregateInit1aE }
   struct B { A &p; } b{{a}};
-  // CHECK-DAG: @_ZGRN31NonAggregateCopyInAggregateInit1cE_ = internal global %[[A]] { i32 1, i32 0 }
-  // CHECK-DAG: @_ZN31NonAggregateCopyInAggregateInit1cE ={{.*}} global %{{.*}} { %{{.*}}* @_ZGRN31NonAggregateCopyInAggregateInit1cE_ }
+  // CHECK-DAG: @_ZGRN31NonAggregateCopyInAggregateInit1cE_ = internal global %[[A:.*]] { i32 1, i32 0 }
+  // CHECK-DAG: @_ZN31NonAggregateCopyInAggregateInit1cE ={{.*}} global %{{.*}} { ptr @_ZGRN31NonAggregateCopyInAggregateInit1cE_ }
   struct C { A &&p; } c{{1}};
 }
 
@@ -51,11 +51,11 @@ namespace PR37560 {
 // CHECK-LABEL: define {{.*}}@_Z3fn1i(
 int fn1(int x) {
   // CHECK: %[[INITLIST:.*]] = alloca %struct.A
-  // CHECK: %[[A:.*]] = getelementptr inbounds %struct.A, %struct.A* %[[INITLIST]], i32 0, i32 0
-  // CHECK: store i32 %{{.*}}, i32* %[[A]], align 4
-  // CHECK: %[[B:.*]] = getelementptr inbounds %struct.A, %struct.A* %[[INITLIST]], i32 0, i32 1
-  // CHECK: store i32 5, i32* %[[B]], align 4
-  // CHECK: call noundef i32 @_ZN1A1fEv(%struct.A* {{[^,]*}} %[[INITLIST]])
+  // CHECK: %[[A:.*]] = getelementptr inbounds %struct.A, ptr %[[INITLIST]], i32 0, i32 0
+  // CHECK: store i32 %{{.*}}, ptr %[[A]], align 4
+  // CHECK: %[[B:.*]] = getelementptr inbounds %struct.A, ptr %[[INITLIST]], i32 0, i32 1
+  // CHECK: store i32 5, ptr %[[B]], align 4
+  // CHECK: call noundef i32 @_ZN1A1fEv(ptr {{[^,]*}} %[[INITLIST]])
   return A{x, 5}.f();
 }
 
@@ -64,9 +64,9 @@ struct B { int &r; int &f() { return r; } };
 // CHECK-LABEL: define {{.*}}@_Z3fn2Ri(
 int &fn2(int &v) {
   // CHECK: %[[INITLIST2:.*]] = alloca %struct.B, align 8
-  // CHECK: %[[R:.*]] = getelementptr inbounds %struct.B, %struct.B* %[[INITLIST2:.*]], i32 0, i32 0
-  // CHECK: store i32* %{{.*}}, i32** %[[R]], align 8
-  // CHECK: call noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) i32* @_ZN1B1fEv(%struct.B* {{[^,]*}} %[[INITLIST2:.*]])
+  // CHECK: %[[R:.*]] = getelementptr inbounds %struct.B, ptr %[[INITLIST2:.*]], i32 0, i32 0
+  // CHECK: store ptr %{{.*}}, ptr %[[R]], align 8
+  // CHECK: call noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN1B1fEv(ptr {{[^,]*}} %[[INITLIST2:.*]])
   return B{v}.f();
 }
 
@@ -77,7 +77,7 @@ int &fn2(int &v) {
 // CHECK: br i1
 //
 // CHECK: getelementptr inbounds {{.*}}, i64 1
-// CHECK: icmp eq {{.*}}, getelementptr inbounds {{.*}}, i64 1, i64 0
+// CHECK: icmp eq {{.*}}, getelementptr inbounds {{.*}}, i64 30
 // CHECK: br i1
 //
 // CHECK: call i32 @__cxa_atexit(

diff  --git a/clang/test/CodeGenCXX/cxx11-initializer-array-new.cpp b/clang/test/CodeGenCXX/cxx11-initializer-array-new.cpp
index c1eb26c4bbe39..48ee019a55f55 100644
--- a/clang/test/CodeGenCXX/cxx11-initializer-array-new.cpp
+++ b/clang/test/CodeGenCXX/cxx11-initializer-array-new.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-linux-gnu -std=c++11 %s -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++11 %s -emit-llvm -o - | FileCheck %s
 
 // PR10878
 
@@ -7,35 +7,32 @@ struct S { S(); S(int); ~S(); int n; };
 void *p = new S[2][3]{ { 1, 2, 3 }, { 4, 5, 6 } };
 
 // CHECK-LABEL: define
-// CHECK: %[[ALLOC:.*]] = call noalias noundef nonnull i8* @_Znam(i64 noundef 32)
-// CHECK: %[[COOKIE:.*]] = bitcast i8* %[[ALLOC]] to i64*
-// CHECK: store i64 6, i64* %[[COOKIE]]
-// CHECK: %[[START_AS_i8:.*]] = getelementptr inbounds i8, i8* %[[ALLOC]], i64 8
-// CHECK: %[[START_AS_S:.*]] = bitcast i8* %[[START_AS_i8]] to %[[S:.*]]*
+// CHECK: %[[ALLOC:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 32)
+// CHECK: store i64 6, ptr %[[ALLOC]]
+// CHECK: %[[START_AS_i8:.*]] = getelementptr inbounds i8, ptr %[[ALLOC]], i64 8
 //
 // Explicit initializers:
 //
 // { 1, 2, 3 }
 //
-// CHECK: %[[S_0:.*]] = bitcast %[[S]]* %[[START_AS_S]] to [3 x %[[S]]]*
 //
-// CHECK: %[[S_0_0:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_0]], i64 0, i64 0
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_0_0]], i32 noundef 1)
-// CHECK: %[[S_0_1:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_0_0]], i64 1
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_0_1]], i32 noundef 2)
-// CHECK: %[[S_0_2:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_0_1]], i64 1
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_0_2]], i32 noundef 3)
+// CHECK: %[[S_0_0:.*]] = getelementptr inbounds [3 x %[[S:.*]]], ptr %[[START_AS_i8]], i64 0, i64 0
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_0_0]], i32 noundef 1)
+// CHECK: %[[S_0_1:.*]] = getelementptr inbounds %[[S]], ptr %[[S_0_0]], i64 1
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_0_1]], i32 noundef 2)
+// CHECK: %[[S_0_2:.*]] = getelementptr inbounds %[[S]], ptr %[[S_0_1]], i64 1
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_0_2]], i32 noundef 3)
 //
 // { 4, 5, 6 }
 //
-// CHECK: %[[S_1:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_0]], i64 1
+// CHECK: %[[S_1:.*]] = getelementptr inbounds [3 x %[[S]]], ptr %[[START_AS_i8]], i64 1
 //
-// CHECK: %[[S_1_0:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_1]], i64 0, i64 0
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_1_0]], i32 noundef 4)
-// CHECK: %[[S_1_1:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_1_0]], i64 1
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_1_1]], i32 noundef 5)
-// CHECK: %[[S_1_2:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_1_1]], i64 1
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_1_2]], i32 noundef 6)
+// CHECK: %[[S_1_0:.*]] = getelementptr inbounds [3 x %[[S]]], ptr %[[S_1]], i64 0, i64 0
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_1_0]], i32 noundef 4)
+// CHECK: %[[S_1_1:.*]] = getelementptr inbounds %[[S]], ptr %[[S_1_0]], i64 1
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_1_1]], i32 noundef 5)
+// CHECK: %[[S_1_2:.*]] = getelementptr inbounds %[[S]], ptr %[[S_1_1]], i64 1
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_1_2]], i32 noundef 6)
 //
 // CHECK-NOT: br i1
 // CHECK-NOT: call
@@ -46,57 +43,53 @@ void *q = new S[n][3]{ { 1, 2, 3 }, { 4, 5, 6 } };
 
 // CHECK-LABEL: define
 //
-// CHECK: load i32, i32* @n
+// CHECK: load i32, ptr @n
 // CHECK: call {{.*}} @llvm.umul.with.overflow.i64(i64 %[[N:.*]], i64 12)
 // CHECK: %[[ELTS:.*]] = mul i64 %[[N]], 3
 // CHECK: call {{.*}} @llvm.uadd.with.overflow.i64(i64 %{{.*}}, i64 8)
-// CHECK: %[[ALLOC:.*]] = call noalias noundef nonnull i8* @_Znam(i64 noundef %{{.*}})
+// CHECK: %[[ALLOC:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef %{{.*}})
 //
-// CHECK: %[[COOKIE:.*]] = bitcast i8* %[[ALLOC]] to i64*
-// CHECK: store i64 %[[ELTS]], i64* %[[COOKIE]]
-// CHECK: %[[START_AS_i8:.*]] = getelementptr inbounds i8, i8* %[[ALLOC]], i64 8
-// CHECK: %[[START_AS_S:.*]] = bitcast i8* %[[START_AS_i8]] to %[[S]]*
+// CHECK: store i64 %[[ELTS]], ptr %[[ALLOC]]
+// CHECK: %[[START_AS_i8:.*]] = getelementptr inbounds i8, ptr %[[ALLOC]], i64 8
 //
 // Explicit initializers:
 //
 // { 1, 2, 3 }
 //
-// CHECK: %[[S_0:.*]] = bitcast %[[S]]* %[[START_AS_S]] to [3 x %[[S]]]*
 //
-// CHECK: %[[S_0_0:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_0]], i64 0, i64 0
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_0_0]], i32 noundef 1)
-// CHECK: %[[S_0_1:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_0_0]], i64 1
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_0_1]], i32 noundef 2)
-// CHECK: %[[S_0_2:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_0_1]], i64 1
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_0_2]], i32 noundef 3)
+// CHECK: %[[S_0_0:.*]] = getelementptr inbounds [3 x %[[S]]], ptr %[[START_AS_i8]], i64 0, i64 0
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_0_0]], i32 noundef 1)
+// CHECK: %[[S_0_1:.*]] = getelementptr inbounds %[[S]], ptr %[[S_0_0]], i64 1
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_0_1]], i32 noundef 2)
+// CHECK: %[[S_0_2:.*]] = getelementptr inbounds %[[S]], ptr %[[S_0_1]], i64 1
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_0_2]], i32 noundef 3)
 //
 // { 4, 5, 6 }
 //
-// CHECK: %[[S_1:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_0]], i64 1
+// CHECK: %[[S_1:.*]] = getelementptr inbounds [3 x %[[S]]], ptr %[[START_AS_i8]], i64 1
 //
-// CHECK: %[[S_1_0:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_1]], i64 0, i64 0
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_1_0]], i32 noundef 4)
-// CHECK: %[[S_1_1:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_1_0]], i64 1
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_1_1]], i32 noundef 5)
-// CHECK: %[[S_1_2:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_1_1]], i64 1
-// CHECK: call void @_ZN1SC1Ei(%[[S]]* {{[^,]*}} %[[S_1_2]], i32 noundef 6)
+// CHECK: %[[S_1_0:.*]] = getelementptr inbounds [3 x %[[S]]], ptr %[[S_1]], i64 0, i64 0
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_1_0]], i32 noundef 4)
+// CHECK: %[[S_1_1:.*]] = getelementptr inbounds %[[S]], ptr %[[S_1_0]], i64 1
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_1_1]], i32 noundef 5)
+// CHECK: %[[S_1_2:.*]] = getelementptr inbounds %[[S]], ptr %[[S_1_1]], i64 1
+// CHECK: call void @_ZN1SC1Ei(ptr {{[^,]*}} %[[S_1_2]], i32 noundef 6)
 //
 // And the rest.
 //
-// CHECK: %[[S_2:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_1]], i64 1
-// CHECK: %[[S_2_AS_S:.*]] = bitcast [3 x %[[S]]]* %[[S_2]] to %[[S]]*
+// CHECK: %[[S_2:.*]] = getelementptr inbounds [3 x %[[S]]], ptr %[[S_1]], i64 1
 //
 // CHECK: %[[REST:.*]] = sub i64 %[[ELTS]], 6
 // CHECK: icmp eq i64 %[[REST]], 0
 // CHECK: br i1
 //
-// CHECK: %[[END:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_2_AS_S]], i64 %[[REST]]
+// CHECK: %[[END:.*]] = getelementptr inbounds %[[S]], ptr %[[S_2]], i64 %[[REST]]
 // CHECK: br label
 //
-// CHECK: %[[CUR:.*]] = phi %[[S]]* [ %[[S_2_AS_S]], {{.*}} ], [ %[[NEXT:.*]], {{.*}} ]
-// CHECK: call void @_ZN1SC1Ev(%[[S]]* {{[^,]*}} %[[CUR]])
-// CHECK: %[[NEXT]] = getelementptr inbounds %[[S]], %[[S]]* %[[CUR]], i64 1
-// CHECK: icmp eq %[[S]]* %[[NEXT]], %[[END]]
+// CHECK: %[[CUR:.*]] = phi ptr [ %[[S_2]], {{.*}} ], [ %[[NEXT:.*]], {{.*}} ]
+// CHECK: call void @_ZN1SC1Ev(ptr {{[^,]*}} %[[CUR]])
+// CHECK: %[[NEXT]] = getelementptr inbounds %[[S]], ptr %[[CUR]], i64 1
+// CHECK: icmp eq ptr %[[NEXT]], %[[END]]
 // CHECK: br i1
 //
 // CHECK: }
@@ -106,54 +99,50 @@ void *r = new T[n][3]{ { 1, 2, 3 }, { 4, 5, 6 } };
 
 // CHECK-LABEL: define
 //
-// CHECK: load i32, i32* @n
+// CHECK: load i32, ptr @n
 // CHECK: call {{.*}} @llvm.umul.with.overflow.i64(i64 %[[N:.*]], i64 12)
 // CHECK: %[[ELTS:.*]] = mul i64 %[[N]], 3
 //
 // No cookie.
 // CHECK-NOT: @llvm.uadd.with.overflow
 //
-// CHECK: %[[ALLOC:.*]] = call noalias noundef nonnull i8* @_Znam(i64 noundef %{{.*}})
+// CHECK: %[[ALLOC:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef %{{.*}})
 //
-// CHECK: %[[START_AS_T:.*]] = bitcast i8* %[[ALLOC]] to %[[T:.*]]*
 //
 // Explicit initializers:
 //
 // { 1, 2, 3 }
 //
-// CHECK: %[[T_0:.*]] = bitcast %[[T]]* %[[START_AS_T]] to [3 x %[[T]]]*
 //
-// CHECK: %[[T_0_0:.*]] = getelementptr inbounds [3 x %[[T]]], [3 x %[[T]]]* %[[T_0]], i64 0, i64 0
-// CHECK: %[[T_0_0_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_0]], i32 0, i32 0
-// CHECK: store i32 1, i32* %[[T_0_0_0]]
-// CHECK: %[[T_0_1:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_0]], i64 1
-// CHECK: %[[T_0_1_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_1]], i32 0, i32 0
-// CHECK: store i32 2, i32* %[[T_0_1_0]]
-// CHECK: %[[T_0_2:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_1]], i64 1
-// CHECK: %[[T_0_2_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_2]], i32 0, i32 0
-// CHECK: store i32 3, i32* %[[T_0_2_0]]
+// CHECK: %[[T_0_0:.*]] = getelementptr inbounds [3 x %[[T:.*]]], ptr %[[ALLOC]], i64 0, i64 0
+// CHECK: %[[T_0_0_0:.*]] = getelementptr inbounds %[[T]], ptr %[[T_0_0]], i32 0, i32 0
+// CHECK: store i32 1, ptr %[[T_0_0_0]]
+// CHECK: %[[T_0_1:.*]] = getelementptr inbounds %[[T]], ptr %[[T_0_0]], i64 1
+// CHECK: %[[T_0_1_0:.*]] = getelementptr inbounds %[[T]], ptr %[[T_0_1]], i32 0, i32 0
+// CHECK: store i32 2, ptr %[[T_0_1_0]]
+// CHECK: %[[T_0_2:.*]] = getelementptr inbounds %[[T]], ptr %[[T_0_1]], i64 1
+// CHECK: %[[T_0_2_0:.*]] = getelementptr inbounds %[[T]], ptr %[[T_0_2]], i32 0, i32 0
+// CHECK: store i32 3, ptr %[[T_0_2_0]]
 //
 // { 4, 5, 6 }
 //
-// CHECK: %[[T_1:.*]] = getelementptr inbounds [3 x %[[T]]], [3 x %[[T]]]* %[[T_0]], i64 1
+// CHECK: %[[T_1:.*]] = getelementptr inbounds [3 x %[[T]]], ptr %[[ALLOC]], i64 1
 //
-// CHECK: %[[T_1_0:.*]] = getelementptr inbounds [3 x %[[T]]], [3 x %[[T]]]* %[[T_1]], i64 0, i64 0
-// CHECK: %[[T_1_0_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_0]], i32 0, i32 0
-// CHECK: store i32 4, i32* %[[T_1_0_0]]
-// CHECK: %[[T_1_1:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_0]], i64 1
-// CHECK: %[[T_1_1_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_1]], i32 0, i32 0
-// CHECK: store i32 5, i32* %[[T_1_1_0]]
-// CHECK: %[[T_1_2:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_1]], i64 1
-// CHECK: %[[T_1_2_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_2]], i32 0, i32 0
-// CHECK: store i32 6, i32* %[[T_1_2_0]]
+// CHECK: %[[T_1_0:.*]] = getelementptr inbounds [3 x %[[T]]], ptr %[[T_1]], i64 0, i64 0
+// CHECK: %[[T_1_0_0:.*]] = getelementptr inbounds %[[T]], ptr %[[T_1_0]], i32 0, i32 0
+// CHECK: store i32 4, ptr %[[T_1_0_0]]
+// CHECK: %[[T_1_1:.*]] = getelementptr inbounds %[[T]], ptr %[[T_1_0]], i64 1
+// CHECK: %[[T_1_1_0:.*]] = getelementptr inbounds %[[T]], ptr %[[T_1_1]], i32 0, i32 0
+// CHECK: store i32 5, ptr %[[T_1_1_0]]
+// CHECK: %[[T_1_2:.*]] = getelementptr inbounds %[[T]], ptr %[[T_1_1]], i64 1
+// CHECK: %[[T_1_2_0:.*]] = getelementptr inbounds %[[T]], ptr %[[T_1_2]], i32 0, i32 0
+// CHECK: store i32 6, ptr %[[T_1_2_0]]
 //
 // And the rest gets memset to 0.
 //
-// CHECK: %[[T_2:.*]] = getelementptr inbounds [3 x %[[T]]], [3 x %[[T]]]* %[[T_1]], i64 1
-// CHECK: %[[T_2_AS_T:.*]] = bitcast [3 x %[[T]]]* %[[T_2]] to %[[T]]*
+// CHECK: %[[T_2:.*]] = getelementptr inbounds [3 x %[[T]]], ptr %[[T_1]], i64 1
 //
 // CHECK: %[[SIZE:.*]] = sub i64 %{{.*}}, 24
-// CHECK: %[[REST:.*]] = bitcast %[[T]]* %[[T_2_AS_T]] to i8*
-// CHECK: call void @llvm.memset.p0i8.i64(i8* align 4 %[[REST]], i8 0, i64 %[[SIZE]], i1 false)
+// CHECK: call void @llvm.memset.p0.i64(ptr align 4 %[[T_2]], i8 0, i64 %[[SIZE]], i1 false)
 //
 // CHECK: }

diff  --git a/clang/test/CodeGenCXX/cxx11-thread-local.cpp b/clang/test/CodeGenCXX/cxx11-thread-local.cpp
index 33f6a4df8a108..1a6e289c9c2bd 100644
--- a/clang/test/CodeGenCXX/cxx11-thread-local.cpp
+++ b/clang/test/CodeGenCXX/cxx11-thread-local.cpp
@@ -1,15 +1,15 @@
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX %s
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -emit-llvm %s -O2 -disable-llvm-passes -o - -triple x86_64-linux-gnu | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX,CHECK-OPT %s
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -femulated-tls -emit-llvm %s -o - \
+// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX %s
+// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -O2 -disable-llvm-passes -o - -triple x86_64-linux-gnu | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX,CHECK-OPT %s
+// RUN: %clang_cc1 -std=c++11 -femulated-tls -emit-llvm %s -o - \
 // RUN:     -triple x86_64-linux-gnu 2>&1 | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX %s
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -emit-llvm %s -o - -triple x86_64-apple-darwin12 | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -emit-llvm %s -o - -triple powerpc64-unknown-aix-xcoff | FileCheck --check-prefixes=CHECK,AIX,LINUX_AIX %s
+// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple x86_64-apple-darwin12 | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
+// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple powerpc64-unknown-aix-xcoff | FileCheck --check-prefixes=CHECK,AIX,LINUX_AIX %s
 
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -fno-use-cxa-atexit -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX %s
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -fno-use-cxa-atexit -emit-llvm %s -O2 -disable-llvm-passes -o - -triple x86_64-linux-gnu | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX,CHECK-OPT %s
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -fno-use-cxa-atexit -femulated-tls -emit-llvm %s -o - \
+// RUN: %clang_cc1 -std=c++11 -fno-use-cxa-atexit -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX %s
+// RUN: %clang_cc1 -std=c++11 -fno-use-cxa-atexit -emit-llvm %s -O2 -disable-llvm-passes -o - -triple x86_64-linux-gnu | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX,CHECK-OPT %s
+// RUN: %clang_cc1 -std=c++11 -fno-use-cxa-atexit -femulated-tls -emit-llvm %s -o - \
 // RUN:     -triple x86_64-linux-gnu 2>&1 | FileCheck --check-prefixes=CHECK,LINUX,LINUX_AIX %s
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -fno-use-cxa-atexit -emit-llvm %s -o - -triple x86_64-apple-darwin12 | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
+// RUN: %clang_cc1 -std=c++11 -fno-use-cxa-atexit -emit-llvm %s -o - -triple x86_64-apple-darwin12 | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
 
 int f();
 int g();
@@ -90,14 +90,14 @@ void *e2 = V<char>::m + W<char>::m + &X<char>::m;
 
 // CHECK-DAG: @llvm.global_ctors = appending global {{.*}} @[[GLOBAL_INIT:[^ ]*]]
 
-// LINUX_AIX-DAG: @_ZTH1a ={{.*}} alias void (), void ()* @__tls_init
-// DARWIN-DAG: @_ZTH1a = internal alias void (), void ()* @__tls_init
-// LINUX_AIX-DAG: @_ZTHN1U1mE ={{.*}} alias void (), void ()* @__tls_init
-// DARWIN-DAG: @_ZTHN1U1mE = internal alias void (), void ()* @__tls_init
-// CHECK-DAG: @_ZTHN1VIiE1mE = linkonce_odr alias void (), void ()* @[[V_M_INIT:[^, ]*]]
-// CHECK-DAG: @_ZTHN1XIiE1mE = linkonce_odr alias void (), void ()* @[[X_M_INIT:[^, ]*]]
-// CHECK-DAG: @_ZTHN1VIfE1mE = weak_odr alias void (), void ()* @[[VF_M_INIT:[^, ]*]]
-// CHECK-DAG: @_ZTHN1XIfE1mE = weak_odr alias void (), void ()* @[[XF_M_INIT:[^, ]*]]
+// LINUX_AIX-DAG: @_ZTH1a ={{.*}} alias void (), ptr @__tls_init
+// DARWIN-DAG: @_ZTH1a = internal alias void (), ptr @__tls_init
+// LINUX_AIX-DAG: @_ZTHN1U1mE ={{.*}} alias void (), ptr @__tls_init
+// DARWIN-DAG: @_ZTHN1U1mE = internal alias void (), ptr @__tls_init
+// CHECK-DAG: @_ZTHN1VIiE1mE = linkonce_odr alias void (), ptr @[[V_M_INIT:[^, ]*]]
+// CHECK-DAG: @_ZTHN1XIiE1mE = linkonce_odr alias void (), ptr @[[X_M_INIT:[^, ]*]]
+// CHECK-DAG: @_ZTHN1VIfE1mE = weak_odr alias void (), ptr @[[VF_M_INIT:[^, ]*]]
+// CHECK-DAG: @_ZTHN1XIfE1mE = weak_odr alias void (), ptr @[[XF_M_INIT:[^, ]*]]
 // FIXME: We really want a CHECK-DAG-NOT for these.
 // CHECK-NOT: @_ZTHN1WIiE1mE =
 // CHECK-NOT: @_ZTHN1WIfE1mE =
@@ -108,190 +108,190 @@ void *e2 = V<char>::m + W<char>::m + &X<char>::m;
 
 // CHECK: define {{.*}} @[[A_INIT:.*]]()
 // CHECK: call{{.*}} i32 @_Z1fv()
-// CHECK: [[A_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @a)
-// CHECK-NEXT: store i32 {{.*}}, i32* [[A_ADDR]], align 4
+// CHECK: [[A_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @a)
+// CHECK-NEXT: store i32 {{.*}}, ptr [[A_ADDR]], align 4
 
 // CHECK-LABEL: define{{.*}} i32 @_Z1fv()
 int f() {
-  // CHECK: %[[GUARD:.*]] = load i8, i8* @_ZGVZ1fvE1n, align 1
+  // CHECK: %[[GUARD:.*]] = load i8, ptr @_ZGVZ1fvE1n, align 1
   // CHECK: %[[NEED_INIT:.*]] = icmp eq i8 %[[GUARD]], 0
   // CHECK: br i1 %[[NEED_INIT]]{{.*}}
 
   // CHECK: %[[CALL:.*]] = call{{.*}} i32 @_Z1gv()
-  // CHECK: [[N_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZZ1fvE1n)
-  // CHECK: store i32 %[[CALL]], i32* [[N_ADDR]], align 4
-  // CHECK: store i8 1, i8* @_ZGVZ1fvE1n
+  // CHECK: [[N_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZZ1fvE1n)
+  // CHECK: store i32 %[[CALL]], ptr [[N_ADDR]], align 4
+  // CHECK: store i8 1, ptr @_ZGVZ1fvE1n
   // CHECK: br label
   static thread_local int n = g();
 
-  // CHECK: [[N_ADDR2:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZZ1fvE1n)
-  // CHECK: load i32, i32* [[N_ADDR2]], align 4
+  // CHECK: [[N_ADDR2:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZZ1fvE1n)
+  // CHECK: load i32, ptr [[N_ADDR2]], align 4
   return n;
 }
 
 // CHECK: define {{.*}} @[[C_INIT:.*]]()
-// LINUX_AIX: call i32* @_ZTW1b()
-// DARWIN: call cxx_fast_tlscc i32* @_ZTW1b()
-// CHECK-NEXT: load i32, i32* %{{.*}}, align 4
-// CHECK-NEXT: store i32 %{{.*}}, i32* @c, align 4
-
-// LINUX_AIX-LABEL: define linkonce_odr hidden noundef i32* @_ZTW1b()
-// LINUX: br i1 icmp ne (void ()* @_ZTH1b, void ()* null),
-// AIX-NOT: br i1 icmp ne (void ()* @_ZTH1b, void ()* null),
+// LINUX_AIX: call ptr @_ZTW1b()
+// DARWIN: call cxx_fast_tlscc ptr @_ZTW1b()
+// CHECK-NEXT: load i32, ptr %{{.*}}, align 4
+// CHECK-NEXT: store i32 %{{.*}}, ptr @c, align 4
+
+// LINUX_AIX-LABEL: define linkonce_odr hidden noundef ptr @_ZTW1b()
+// LINUX: br i1 icmp ne (ptr @_ZTH1b, ptr null),
+// AIX-NOT: br i1 icmp ne (ptr @_ZTH1b, ptr null),
 // not null:
 // LINUX_AIX: call void @_ZTH1b()
 // LINUX: br label
 // AIX-NOT: br label
 // finally:
-// LINUX_AIX: [[B_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @b)
-// LINUX_AIX: ret i32* [[B_ADDR]]
-// DARWIN-LABEL: declare cxx_fast_tlscc noundef i32* @_ZTW1b()
+// LINUX_AIX: [[B_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @b)
+// LINUX_AIX: ret ptr [[B_ADDR]]
+// DARWIN-LABEL: declare cxx_fast_tlscc noundef ptr @_ZTW1b()
 // There is no definition of the thread wrapper on Darwin for external TLV.
 
 // CHECK: define {{.*}} @[[D_INIT:.*]]()
 // CHECK: call{{.*}} i32 @_Z1gv()
-// CHECK-NEXT: [[D_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZL1d)
-// CHECK-NEXT: store i32 %{{.*}}, i32* [[D_ADDR]], align 4
+// CHECK-NEXT: [[D_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZL1d)
+// CHECK-NEXT: store i32 %{{.*}}, ptr [[D_ADDR]], align 4
 
 // CHECK: define {{.*}} @[[U_M_INIT:.*]]()
 // CHECK: call{{.*}} i32 @_Z1fv()
-// CHECK-NEXT: [[UM_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZN1U1mE)
-// CHECK-NEXT: store i32 %{{.*}}, i32* [[UM_ADDR]], align 4
+// CHECK-NEXT: [[UM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1U1mE)
+// CHECK-NEXT: store i32 %{{.*}}, ptr [[UM_ADDR]], align 4
 
 // CHECK: define {{.*}} @[[E_INIT:.*]]()
-// LINUX_AIX: call i32* @_ZTWN1VIiE1mE()
-// DARWIN: call cxx_fast_tlscc i32* @_ZTWN1VIiE1mE()
-// CHECK-NEXT: load i32, i32* %{{.*}}, align 4
-// LINUX_AIX: call {{.*}}* @_ZTWN1XIiE1mE()
-// DARWIN: call cxx_fast_tlscc {{.*}}* @_ZTWN1XIiE1mE()
+// LINUX_AIX: call ptr @_ZTWN1VIiE1mE()
+// DARWIN: call cxx_fast_tlscc ptr @_ZTWN1VIiE1mE()
+// CHECK-NEXT: load i32, ptr %{{.*}}, align 4
+// LINUX_AIX: call ptr @_ZTWN1XIiE1mE()
+// DARWIN: call cxx_fast_tlscc ptr @_ZTWN1XIiE1mE()
 // CHECK: store {{.*}} @e
 
-// LINUX_AIX-LABEL: define weak_odr hidden noundef i32* @_ZTWN1VIiE1mE()
-// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc noundef i32* @_ZTWN1VIiE1mE()
+// LINUX_AIX-LABEL: define weak_odr hidden noundef ptr @_ZTWN1VIiE1mE()
+// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc noundef ptr @_ZTWN1VIiE1mE()
 // LINUX_AIX: call void @_ZTHN1VIiE1mE()
 // DARWIN: call cxx_fast_tlscc void @_ZTHN1VIiE1mE()
-// CHECK: [[VM_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZN1VIiE1mE)
-// CHECK: ret i32* [[VM_ADDR]]
+// CHECK: [[VM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1VIiE1mE)
+// CHECK: ret ptr [[VM_ADDR]]
 
-// LINUX_AIX-LABEL: define weak_odr hidden noundef i32* @_ZTWN1WIiE1mE()
-// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc noundef i32* @_ZTWN1WIiE1mE()
+// LINUX_AIX-LABEL: define weak_odr hidden noundef ptr @_ZTWN1WIiE1mE()
+// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc noundef ptr @_ZTWN1WIiE1mE()
 // CHECK-NOT: call
-// CHECK: [[WM_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZN1WIiE1mE)
-// CHECK: ret i32* [[WM_ADDR]]
+// CHECK: [[WM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1WIiE1mE)
+// CHECK: ret ptr [[WM_ADDR]]
 
-// LINUX_AIX-LABEL: define weak_odr hidden {{.*}}* @_ZTWN1XIiE1mE()
-// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc {{.*}}* @_ZTWN1XIiE1mE()
+// LINUX_AIX-LABEL: define weak_odr hidden {{.*}}ptr @_ZTWN1XIiE1mE()
+// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc {{.*}}ptr @_ZTWN1XIiE1mE()
 // LINUX_AIX: call void @_ZTHN1XIiE1mE()
 // DARWIN: call cxx_fast_tlscc void @_ZTHN1XIiE1mE()
-// CHECK: [[XM_ADDR:%.+]] = call align 1 %struct.Dtor* @llvm.threadlocal.address.p0s_struct.Dtors(%struct.Dtor* align 1 @_ZN1XIiE1mE)
-// CHECK: ret {{.*}}* [[XM_ADDR]]
+// CHECK: [[XM_ADDR:%.+]] = call align 1 ptr @llvm.threadlocal.address.p0(ptr align 1 @_ZN1XIiE1mE)
+// CHECK: ret ptr [[XM_ADDR]]
 
 // LINUX_AIX: define internal void @[[VF_M_INIT]]()
 // DARWIN: define internal cxx_fast_tlscc void @[[VF_M_INIT]]()
 // CHECK-NOT: comdat
-// CHECK: load i8, i8* bitcast (i64* @_ZGVN1VIfE1mE to i8*)
+// CHECK: load i8, ptr @_ZGVN1VIfE1mE
 // CHECK: %[[VF_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0
 // CHECK: br i1 %[[VF_M_INITIALIZED]],
 // need init:
-// CHECK: store i8 1, i8* bitcast (i64* @_ZGVN1VIfE1mE to i8*)
+// CHECK: store i8 1, ptr @_ZGVN1VIfE1mE
 // CHECK: call{{.*}} i32 @_Z1gv()
-// CHECK: [[VFM_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZN1VIfE1mE)
-// CHECK: store i32 %{{.*}}, i32* [[VFM_ADDR]], align 4
+// CHECK: [[VFM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1VIfE1mE)
+// CHECK: store i32 %{{.*}}, ptr [[VFM_ADDR]], align 4
 // CHECK: br label
 
 // LINUX_AIX: define internal void @[[XF_M_INIT]]()
 // DARWIN: define internal cxx_fast_tlscc void @[[XF_M_INIT]]()
 // CHECK-NOT: comdat
-// CHECK: load i8, i8* bitcast (i64* @_ZGVN1XIfE1mE to i8*)
+// CHECK: load i8, ptr @_ZGVN1XIfE1mE
 // CHECK: %[[XF_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0
 // CHECK: br i1 %[[XF_M_INITIALIZED]],
 // need init:
-// CHECK: store i8 1, i8* bitcast (i64* @_ZGVN1XIfE1mE to i8*)
+// CHECK: store i8 1, ptr @_ZGVN1XIfE1mE
 // AIX-NOT: br
 // LINUX: call {{.*}}__cxa_thread_atexit
 // AIX: call {{.*}}__pt_atexit_np
 // DARWIN: call {{.*}}_tlv_atexit
 // CHECK: br label
 
-// LINUX: declare i32 @__cxa_thread_atexit(void (i8*)*, i8*, i8*)
-// AIX: declare i32 @__pt_atexit_np(i32, i32 (i32, ...)*, ...)
-// DARWIN: declare i32 @_tlv_atexit(void (i8*)*, i8*, i8*)
+// LINUX: declare i32 @__cxa_thread_atexit(ptr, ptr, ptr)
+// AIX: declare i32 @__pt_atexit_np(i32, ptr, ...)
+// DARWIN: declare i32 @_tlv_atexit(ptr, ptr, ptr)
 
-// DARWIN: declare cxx_fast_tlscc noundef i32* @_ZTWN1VIcE1mE()
-// LINUX_AIX: define linkonce_odr hidden noundef i32* @_ZTWN1VIcE1mE() {{#[0-9]+}}{{( comdat)?}} {
-// LINUX: br i1 icmp ne (void ()* @_ZTHN1VIcE1mE,
-// AIX-NOT: br i1 icmp ne (void ()* @_ZTHN1VIcE1mE
+// DARWIN: declare cxx_fast_tlscc noundef ptr @_ZTWN1VIcE1mE()
+// LINUX_AIX: define linkonce_odr hidden noundef ptr @_ZTWN1VIcE1mE() {{#[0-9]+}}{{( comdat)?}} {
+// LINUX: br i1 icmp ne (ptr @_ZTHN1VIcE1mE,
+// AIX-NOT: br i1 icmp ne (ptr @_ZTHN1VIcE1mE
 // LINUX_AIX: call void @_ZTHN1VIcE1mE()
-// LINUX_AIX: [[VEM_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZN1VIcE1mE)
-// LINUX_AIX: ret i32* [[VEM_ADDR]]
+// LINUX_AIX: [[VEM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1VIcE1mE)
+// LINUX_AIX: ret ptr [[VEM_ADDR]]
 
-// DARWIN: declare cxx_fast_tlscc noundef i32* @_ZTWN1WIcE1mE()
-// LINUX_AIX: define linkonce_odr hidden noundef i32* @_ZTWN1WIcE1mE() {{#[0-9]+}}{{( comdat)?}} {
-// LINUX: br i1 icmp ne (void ()* @_ZTHN1WIcE1mE,
-// AIX-NOT: br i1 icmp ne (void ()* @_ZTHN1WIcE1mE,
+// DARWIN: declare cxx_fast_tlscc noundef ptr @_ZTWN1WIcE1mE()
+// LINUX_AIX: define linkonce_odr hidden noundef ptr @_ZTWN1WIcE1mE() {{#[0-9]+}}{{( comdat)?}} {
+// LINUX: br i1 icmp ne (ptr @_ZTHN1WIcE1mE,
+// AIX-NOT: br i1 icmp ne (ptr @_ZTHN1WIcE1mE,
 // LINUX_AIX: call void @_ZTHN1WIcE1mE()
-// LINUX_AIX: [[WEM_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZN1WIcE1mE)
-// LINUX_AIX: ret i32* [[WEM_ADDR]]
+// LINUX_AIX: [[WEM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1WIcE1mE)
+// LINUX_AIX: ret ptr [[WEM_ADDR]]
 
-// DARWIN: declare cxx_fast_tlscc {{.*}}* @_ZTWN1XIcE1mE()
-// LINUX_AIX: define linkonce_odr hidden {{.*}}* @_ZTWN1XIcE1mE() {{#[0-9]+}}{{( comdat)?}} {
-// LINUX: br i1 icmp ne (void ()* @_ZTHN1XIcE1mE,
-// AIX-NOT: br i1 icmp ne (void ()* @_ZTHN1XIcE1mE,
+// DARWIN: declare cxx_fast_tlscc {{.*}}ptr @_ZTWN1XIcE1mE()
+// LINUX_AIX: define linkonce_odr hidden {{.*}}ptr @_ZTWN1XIcE1mE() {{#[0-9]+}}{{( comdat)?}} {
+// LINUX: br i1 icmp ne (ptr @_ZTHN1XIcE1mE,
+// AIX-NOT: br i1 icmp ne (ptr @_ZTHN1XIcE1mE,
 // LINUX_AIX: call void @_ZTHN1XIcE1mE()
-// LINUX_AIX: [[XEM_ADDR:%.+]] = call align 1 %struct.Dtor* @llvm.threadlocal.address.p0s_struct.Dtors(%struct.Dtor* align 1 @_ZN1XIcE1mE)
-// LINUX_AIX: ret {{.*}}* [[XEM_ADDR]]
+// LINUX_AIX: [[XEM_ADDR:%.+]] = call align 1 ptr @llvm.threadlocal.address.p0(ptr align 1 @_ZN1XIcE1mE)
+// LINUX_AIX: ret ptr [[XEM_ADDR]]
 
 struct S { S(); ~S(); };
 struct T { ~T(); };
 
 // CHECK-LABEL: define{{.*}} void @_Z8tls_dtorv()
 void tls_dtor() {
-  // CHECK: load i8, i8* @_ZGVZ8tls_dtorvE1s
-  // CHECK: call void @_ZN1SC1Ev(%struct.S* {{[^,]*}} @_ZZ8tls_dtorvE1s)
-  // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZZ8tls_dtorvE1s{{.*}} @__dso_handle
-  // AIX: call i32 (i32, i32 (i32, ...)*, ...) @__pt_atexit_np(i32 0, {{.*}}@__dtor__ZZ8tls_dtorvE1s){{.*}}
-  // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZZ8tls_dtorvE1s{{.*}} @__dso_handle
-  // CHECK: store i8 1, i8* @_ZGVZ8tls_dtorvE1s
+  // CHECK: load i8, ptr @_ZGVZ8tls_dtorvE1s
+  // CHECK: call void @_ZN1SC1Ev(ptr {{[^,]*}} @_ZZ8tls_dtorvE1s)
+  // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1SD1Ev, {{.*}} @_ZZ8tls_dtorvE1s{{.*}} @__dso_handle
+  // AIX: call i32 (i32, ptr, ...) @__pt_atexit_np(i32 0, {{.*}}@__dtor__ZZ8tls_dtorvE1s){{.*}}
+  // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1SD1Ev, {{.*}} @_ZZ8tls_dtorvE1s{{.*}} @__dso_handle
+  // CHECK: store i8 1, ptr @_ZGVZ8tls_dtorvE1s
   static thread_local S s;
 
-  // CHECK: load i8, i8* @_ZGVZ8tls_dtorvE1t
+  // CHECK: load i8, ptr @_ZGVZ8tls_dtorvE1t
   // CHECK-NOT: _ZN1T
-  // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1TD1Ev {{.*}}@_ZZ8tls_dtorvE1t{{.*}} @__dso_handle
-  // AIX: call i32 (i32, i32 (i32, ...)*, ...) @__pt_atexit_np(i32 0, {{.*}}@__dtor__ZZ8tls_dtorvE1t){{.*}}
-  // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1TD1Ev {{.*}}@_ZZ8tls_dtorvE1t{{.*}} @__dso_handle
-  // CHECK: store i8 1, i8* @_ZGVZ8tls_dtorvE1t
+  // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1TD1Ev, {{.*}}@_ZZ8tls_dtorvE1t{{.*}} @__dso_handle
+  // AIX: call i32 (i32, ptr, ...) @__pt_atexit_np(i32 0, {{.*}}@__dtor__ZZ8tls_dtorvE1t){{.*}}
+  // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1TD1Ev, {{.*}}@_ZZ8tls_dtorvE1t{{.*}} @__dso_handle
+  // CHECK: store i8 1, ptr @_ZGVZ8tls_dtorvE1t
   static thread_local T t;
 
-  // CHECK: load i8, i8* @_ZGVZ8tls_dtorvE1u
-  // CHECK: call void @_ZN1SC1Ev(%struct.S* {{[^,]*}} @_ZGRZ8tls_dtorvE1u_)
-  // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZGRZ8tls_dtorvE1u_{{.*}} @__dso_handle
-  // AIX: call i32 (i32, i32 (i32, ...)*, ...) @__pt_atexit_np(i32 0, {{.*}}__dtor__ZZ8tls_dtorvE1u){{.*}}
-  // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZGRZ8tls_dtorvE1u_{{.*}} @__dso_handle
-  // CHECK: store i8 1, i8* @_ZGVZ8tls_dtorvE1u
+  // CHECK: load i8, ptr @_ZGVZ8tls_dtorvE1u
+  // CHECK: call void @_ZN1SC1Ev(ptr {{[^,]*}} @_ZGRZ8tls_dtorvE1u_)
+  // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1SD1Ev, {{.*}} @_ZGRZ8tls_dtorvE1u_{{.*}} @__dso_handle
+  // AIX: call i32 (i32, ptr, ...) @__pt_atexit_np(i32 0, {{.*}}__dtor__ZZ8tls_dtorvE1u){{.*}}
+  // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1SD1Ev, {{.*}} @_ZGRZ8tls_dtorvE1u_{{.*}} @__dso_handle
+  // CHECK: store i8 1, ptr @_ZGVZ8tls_dtorvE1u
   static thread_local const S &u = S();
 }
 
 // AIX: define {{.*}}@__dtor__ZZ8tls_dtorvE1s(i32 noundef signext %0, ...){{.*}}{
 // AIX: entry:
 // AIX:   %.addr = alloca i32, align 4
-// AIX:   store i32 %0, i32* %.addr, align 4
-// AIX:   call void @_ZN1SD1Ev(%struct.S* @_ZZ8tls_dtorvE1s)
+// AIX:   store i32 %0, ptr %.addr, align 4
+// AIX:   call void @_ZN1SD1Ev(ptr @_ZZ8tls_dtorvE1s)
 // AIX:   ret i32 0
 // AIX: }
 
 // AIX: define {{.*}}@__dtor__ZZ8tls_dtorvE1t(i32 noundef signext %0, ...){{.*}}{
 // AIX: entry:
 // AIX:   %.addr = alloca i32, align 4
-// AIX:   store i32 %0, i32* %.addr, align 4
-// AIX:   call void @_ZN1TD1Ev(%struct.T* @_ZZ8tls_dtorvE1t)
+// AIX:   store i32 %0, ptr %.addr, align 4
+// AIX:   call void @_ZN1TD1Ev(ptr @_ZZ8tls_dtorvE1t)
 // AIX:   ret i32 0
 // AIX: }
 
 // AIX: define {{.*}}@__dtor__ZZ8tls_dtorvE1u(i32 noundef signext %0, ...){{.*}}{
 // AIX: entry:
 // AIX:   %.addr = alloca i32, align 4
-// AIX:   store i32 %0, i32* %.addr, align 4
-// AIX:   call void @_ZN1SD1Ev(%struct.S* @_ZGRZ8tls_dtorvE1u_)
+// AIX:   store i32 %0, ptr %.addr, align 4
+// AIX:   call void @_ZN1SD1Ev(ptr @_ZGRZ8tls_dtorvE1u_)
 // AIX:   ret i32 0
 // AIX: }
 
@@ -309,7 +309,7 @@ struct PR19254 {
 // CHECK: define {{.*}} @_ZN7PR192541fEv(
 int PR19254::f() {
   // LINUX_AIX: call void @_ZTHN7PR192541nE(
-  // DARWIN: call cxx_fast_tlscc i32* @_ZTWN7PR192541nE(
+  // DARWIN: call cxx_fast_tlscc ptr @_ZTWN7PR192541nE(
   return this->n;
 }
 
@@ -319,30 +319,30 @@ thread_local int anon_i{f()};
 void set_anon_i() {
   anon_i = 2;
 }
-// LINUX_AIX-LABEL: define internal noundef i32* @_ZTWN12_GLOBAL__N_16anon_iE()
-// DARWIN-LABEL: define internal cxx_fast_tlscc noundef i32* @_ZTWN12_GLOBAL__N_16anon_iE()
+// LINUX_AIX-LABEL: define internal noundef ptr @_ZTWN12_GLOBAL__N_16anon_iE()
+// DARWIN-LABEL: define internal cxx_fast_tlscc noundef ptr @_ZTWN12_GLOBAL__N_16anon_iE()
 
 // LINUX_AIX: define internal void @[[V_M_INIT]]()
 // DARWIN: define internal cxx_fast_tlscc void @[[V_M_INIT]]()
 // CHECK-NOT: comdat
-// CHECK: load i8, i8* bitcast (i64* @_ZGVN1VIiE1mE to i8*)
+// CHECK: load i8, ptr @_ZGVN1VIiE1mE
 // CHECK: %[[V_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0
 // CHECK: br i1 %[[V_M_INITIALIZED]],
 // need init:
-// CHECK: store i8 1, i8* bitcast (i64* @_ZGVN1VIiE1mE to i8*)
+// CHECK: store i8 1, ptr @_ZGVN1VIiE1mE
 // CHECK: call{{.*}} i32 @_Z1gv()
-// CHECK: [[VEM_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZN1VIiE1mE)
-// CHECK: store i32 %{{.*}}, i32* [[VEM_ADDR]], align 4
+// CHECK: [[VEM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1VIiE1mE)
+// CHECK: store i32 %{{.*}}, ptr [[VEM_ADDR]], align 4
 // CHECK: br label
 
 // LINUX_AIX: define internal void @[[X_M_INIT]]()
 // DARWIN: define internal cxx_fast_tlscc void @[[X_M_INIT]]()
 // CHECK-NOT: comdat
-// CHECK: load i8, i8* bitcast (i64* @_ZGVN1XIiE1mE to i8*)
+// CHECK: load i8, ptr @_ZGVN1XIiE1mE
 // CHECK: %[[X_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0
 // CHECK: br i1 %[[X_M_INITIALIZED]],
 // need init:
-// CHECK: store i8 1, i8* bitcast (i64* @_ZGVN1XIiE1mE to i8*)
+// CHECK: store i8 1, ptr @_ZGVN1XIiE1mE
 // LINUX: call {{.*}}__cxa_thread_atexit
 // AIX: call {{.*}}__pt_atexit_np
 // DARWIN: call {{.*}}_tlv_atexit
@@ -354,12 +354,12 @@ void set_anon_i() {
 
 
 // CHECK: define {{.*}}@__tls_init()
-// CHECK: load i8, i8* @__tls_guard
+// CHECK: load i8, ptr @__tls_guard
 // CHECK: %[[NEED_TLS_INIT:.*]] = icmp eq i8 %{{.*}}, 0
 // CHECK: br i1 %[[NEED_TLS_INIT]],
 // init:
-// CHECK: store i8 1, i8* @__tls_guard
-// CHECK-OPT: call {}* @llvm.invariant.start.p0i8(i64 1, i8* @__tls_guard)
+// CHECK: store i8 1, ptr @__tls_guard
+// CHECK-OPT: call ptr @llvm.invariant.start.p0(i64 1, ptr @__tls_guard)
 // CHECK-NOT: call void @[[V_M_INIT]]()
 // CHECK: call void @[[A_INIT]]()
 // CHECK-NOT: call void @[[V_M_INIT]]()
@@ -369,12 +369,12 @@ void set_anon_i() {
 // CHECK-NOT: call void @[[V_M_INIT]]()
 
 
-// LINUX_AIX: define weak_odr hidden noundef i32* @_ZTW1a()
-// DARWIN: define cxx_fast_tlscc noundef i32* @_ZTW1a()
+// LINUX_AIX: define weak_odr hidden noundef ptr @_ZTW1a()
+// DARWIN: define cxx_fast_tlscc noundef ptr @_ZTW1a()
 // LINUX_AIX:   call void @_ZTH1a()
 // DARWIN: call cxx_fast_tlscc void @_ZTH1a()
-// CHECK:   [[A_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @a)
-// CHECK:   ret i32* [[A_ADDR]]
+// CHECK:   [[A_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @a)
+// CHECK:   ret ptr [[A_ADDR]]
 // CHECK: }
 
 
@@ -383,12 +383,12 @@ void set_anon_i() {
 // thread-local variables in this TU.
 // CHECK-NOT: define {{.*}} @_ZTWL1d()
 
-// LINUX_AIX-LABEL: define weak_odr hidden noundef i32* @_ZTWN1U1mE()
-// DARWIN-LABEL: define cxx_fast_tlscc noundef i32* @_ZTWN1U1mE()
+// LINUX_AIX-LABEL: define weak_odr hidden noundef ptr @_ZTWN1U1mE()
+// DARWIN-LABEL: define cxx_fast_tlscc noundef ptr @_ZTWN1U1mE()
 // LINUX_AIX: call void @_ZTHN1U1mE()
 // DARWIN: call cxx_fast_tlscc void @_ZTHN1U1mE()
-// CHECK: [[UM_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @_ZN1U1mE)
-// CHECK: ret i32* [[UM_ADDR]]
+// CHECK: [[UM_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @_ZN1U1mE)
+// CHECK: ret ptr [[UM_ADDR]]
 
 // LINUX_AIX: declare extern_weak void @_ZTH1b() [[ATTR:#[0-9]+]]
 

diff  --git a/clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp b/clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp
index 776bc2fe8a6bb..1c163d9f608dc 100644
--- a/clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp
+++ b/clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++1y %s -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -std=c++1y %s -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s
 
 struct A {
   int n = 0;
@@ -29,7 +29,7 @@ A c { 1, 0, 'A', f(), { 3 } };
 
 // @b has a constant initializer
 // CHECK: @[[STR_B:.*]] = {{.*}} [8 x i8] c"bazquux\00"
-// CHECK: @b ={{.*}} global {{.*}} i32 4, {{.*}} @[[STR_B]], {{.*}} i8 117, i32 42, {{.*}} i8 9
+// CHECK: @b ={{.*}} global {{.*}} i32 4, {{.*}} @[[STR_B]], i8 117, i32 42, {{.*}} i8 9
 
 B x;
 B y {};
@@ -49,15 +49,15 @@ C n{};
 
 // Initialization of 'a':
 
-// CHECK: store i32 0, i32* getelementptr inbounds ({{.*}} @a, i32 0, i32 0)
-// CHECK: store i8* {{.*}} @[[STR_A]]{{.*}}, i8** getelementptr inbounds ({{.*}} @a, i32 0, i32 1)
-// CHECK: load i8*, i8** getelementptr inbounds ({{.*}} @a, i32 0, i32 1)
-// CHECK: load i32, i32* getelementptr inbounds ({{.*}} @a, i32 0, i32 0)
-// CHECK: getelementptr inbounds i8, i8* %{{.*}}, {{.*}} %{{.*}}
-// CHECK: store i8 %{{.*}}, i8* getelementptr inbounds ({{.*}} @a, i32 0, i32 2)
+// CHECK: store i32 0, ptr @a
+// CHECK: store ptr @[[STR_A]], ptr getelementptr inbounds ({{.*}} @a, i32 0, i32 1)
+// CHECK: load ptr, ptr getelementptr inbounds ({{.*}} @a, i32 0, i32 1)
+// CHECK: load i32, ptr @a
+// CHECK: getelementptr inbounds i8, ptr %{{.*}}, {{.*}} %{{.*}}
+// CHECK: store i8 %{{.*}}, ptr getelementptr inbounds ({{.*}} @a, i32 0, i32 2)
 // CHECK: call noundef i32 @_ZN1A1fEv({{.*}} @a)
-// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({{.*}}, {{.*}}* @a, i32 0, i32 3)
-// CHECK: store double 1.000000e+00, double* getelementptr inbounds ({{.*}} @a, i32 0, i32 4, i32 0)
+// CHECK: store i32 %{{.*}}, ptr getelementptr inbounds ({{.*}}, ptr @a, i32 0, i32 3)
+// CHECK: store double 1.000000e+00, ptr getelementptr inbounds ({{.*}} @a, i32 0, i32 4)
 
 // No dynamic initialization of 'b':
 
@@ -65,16 +65,16 @@ C n{};
 
 // Initialization of 'c':
 
-// CHECK: store i32 1, i32* getelementptr inbounds ({{.*}} @c, i32 0, i32 0)
-// CHECK: store i8* null, i8** getelementptr inbounds ({{.*}} @c, i32 0, i32 1)
+// CHECK: store i32 1, ptr @c
+// CHECK: store ptr null, ptr getelementptr inbounds ({{.*}} @c, i32 0, i32 1)
 // CHECK-NOT: load
-// CHECK: store i8 65, i8* getelementptr inbounds ({{.*}} @c, i32 0, i32 2)
+// CHECK: store i8 65, ptr getelementptr inbounds ({{.*}} @c, i32 0, i32 2)
 // CHECK: call noundef i32 @_Z1fv()
-// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({{.*}}, {{.*}}* @c, i32 0, i32 3)
+// CHECK: store i32 %{{.*}}, ptr getelementptr inbounds ({{.*}}, ptr @c, i32 0, i32 3)
 // CHECK-NOT: C1Ev
-// CHECK: store i8 3, i8* {{.*}} @c, i32 0, i32 4)
+// CHECK: store i8 3, ptr {{.*}} @c, i32 0, i32 4)
 
 // CHECK: call void @_ZN1BC1Ev({{.*}} @x)
 
 // CHECK: call noundef i32 @_ZN1B1fEv({{.*}} @y)
-// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({{.*}} @y, i32 0, i32 0)
+// CHECK: store i32 %{{.*}}, ptr @y

diff  --git a/clang/test/CodeGenCXX/cxx1z-copy-omission.cpp b/clang/test/CodeGenCXX/cxx1z-copy-omission.cpp
index 162d94356a066..db6671bcd301b 100644
--- a/clang/test/CodeGenCXX/cxx1z-copy-omission.cpp
+++ b/clang/test/CodeGenCXX/cxx1z-copy-omission.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++1z -emit-llvm -triple x86_64-linux-gnu -o - %s | FileCheck %s
+// RUN: %clang_cc1 -std=c++1z -emit-llvm -triple x86_64-linux-gnu -o - %s | FileCheck %s
 
 struct A {
   A(int);
@@ -19,7 +19,7 @@ void g() {
   // CHECK: %[[A:.*]] = alloca
   // CHECK-NOT: alloca
   // CHECK-NOT: call
-  // CHECK: call {{.*}} @_Z1fv({{.*}}* sret({{.*}}) align 4 %[[A]])
+  // CHECK: call {{.*}} @_Z1fv(ptr sret({{.*}}) align 4 %[[A]])
   A a = A( A{ f() } );
   // CHECK-NOT: call
 
@@ -27,7 +27,7 @@ void g() {
   h();
   // CHECK-NOT: call
 
-  // CHECK: call void @_ZN1AD1Ev({{.*}}* {{[^,]*}} %[[A]])
+  // CHECK: call void @_ZN1AD1Ev(ptr {{[^,]*}} %[[A]])
   // CHECK-NOT: call
   // CHECK-LABEL: }
 }
@@ -40,12 +40,12 @@ void h() {
   // CHECK-NOT: alloca
   // CHECK-NOT: call
 
-  // CHECK: call {{.*}} @_Z1fv({{.*}}* sret({{.*}}) align 4 %[[A]])
+  // CHECK: call {{.*}} @_Z1fv(ptr sret({{.*}}) align 4 %[[A]])
   // CHECK-NOT: call
-  // CHECK: call {{.*}} @_Z1f1A({{.*}}* noundef %[[A]])
+  // CHECK: call {{.*}} @_Z1f1A(ptr noundef %[[A]])
   f(f());
   // CHECK-NOT: call
-  // CHECK: call void @_ZN1AD1Ev({{.*}}* {{[^,]*}} %[[A]])
+  // CHECK: call void @_ZN1AD1Ev(ptr {{[^,]*}} %[[A]])
 
   // CHECK: call void @_Z1hv(
   h();
@@ -84,24 +84,24 @@ void i() {
 
 // CHECK-LABEL: define {{.*}} @_Z1jv(
 void j() {
-  // CHECK:   alloca %{{.*}}*
+  // CHECK:   alloca ptr
   // CHECK:   %[[OUTERTEMP:.*]] = alloca %{{.*}}
   // CHECK:   %[[INNERTEMP:.*]] = alloca %{{.*}}
-  // CHECK:   call void @_ZN1AC1Ei(%{{.*}} %[[INNERTEMP]], i32 noundef 1)
-  // CHECK:   call noundef zeroext i1 @_ZN1AcvbEv(%{{.*}} %[[INNERTEMP]])
+  // CHECK:   call void @_ZN1AC1Ei(ptr {{.*}} %[[INNERTEMP]], i32 noundef 1)
+  // CHECK:   call noundef zeroext i1 @_ZN1AcvbEv(ptr {{.*}} %[[INNERTEMP]])
   // CHECK:   br i1
   //
-  // CHECK:   call void @_ZN1AC1EOS_(%{{.*}} %[[OUTERTEMP]], %{{.*}} %[[INNERTEMP]])
+  // CHECK:   call void @_ZN1AC1EOS_(ptr {{.*}} %[[OUTERTEMP]], ptr {{.*}} %[[INNERTEMP]])
   // CHECK:   br label
   //
-  // CHECK:   call void @_ZN1AC1Ei(%{{.*}} %[[OUTERTEMP]], i32 noundef 2)
+  // CHECK:   call void @_ZN1AC1Ei(ptr {{.*}} %[[OUTERTEMP]], i32 noundef 2)
   // CHECK:   br label
   //
-  // CHECK:   call void @_ZN1AD1Ev(%{{.*}} %[[INNERTEMP]])
+  // CHECK:   call void @_ZN1AD1Ev(ptr {{.*}} %[[INNERTEMP]])
   A &&a = A(1) ?: A(2);
 
   // CHECK:   call void @_Z1iv()
   i();
 
-  // CHECK:   call void @_ZN1AD1Ev(%{{.*}} %[[OUTERTEMP]])
+  // CHECK:   call void @_ZN1AD1Ev(ptr {{.*}} %[[OUTERTEMP]])
 }

diff  --git a/clang/test/CodeGenCXX/cxx1z-decomposition.cpp b/clang/test/CodeGenCXX/cxx1z-decomposition.cpp
index 05d63c2c84961..7e482394ee8e0 100644
--- a/clang/test/CodeGenCXX/cxx1z-decomposition.cpp
+++ b/clang/test/CodeGenCXX/cxx1z-decomposition.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++1z -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -std=c++1z -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
 
 namespace std {
   using size_t = decltype(sizeof(0));
@@ -33,58 +33,58 @@ template<typename T> T &make();
 // CHECK: @_ZDC2a12a2E ={{.*}} global {{.*}} zeroinitializer, align 4
 auto [a1, a2] = make<A>();
 // CHECK: @_ZDC2b12b2E ={{.*}} global {{.*}} zeroinitializer, align 1
-// CHECK: @b1 ={{.*}} global {{.*}}* null, align 8
+// CHECK: @b1 ={{.*}} global ptr null, align 8
 // CHECK: @_ZGR2b1_ = internal global {{.*}} zeroinitializer, align 1
-// CHECK: @b2 ={{.*}} global i32* null, align 8
+// CHECK: @b2 ={{.*}} global ptr null, align 8
 // CHECK: @_ZGR2b2_ = internal global i32 0, align 4
 auto [b1, b2] = make<B>();
-// CHECK: @_ZDC2c12c2E ={{.*}} global [2 x i32]* null, align 8
+// CHECK: @_ZDC2c12c2E ={{.*}} global ptr null, align 8
 auto &[c1, c2] = make<C>();
 // CHECK: @_ZDC2d12d2E ={{.*}} global <2 x i32> zeroinitializer, align 8
 auto [d1, d2] = make<D>();
 // CHECK: @_ZDC2e12e2E ={{.*}} global { i32, i32 } zeroinitializer, align 4
 auto [e1, e2] = make<E>();
 
-// CHECK: call {{.*}}* @_Z4makeI1AERT_v()
+// CHECK: call {{.*}}ptr @_Z4makeI1AERT_v()
 // CHECK: call {{.*}}memcpy{{.*}}@_ZDC2a12a2E
 
 // CHECK: @_Z4makeI1BERT_v()
 //   CHECK: call i32 @_Z3getILi0EEDa1B()
-//   CHECK: call void @_ZN1XC1E1Y({{.*}}* {{[^,]*}} @_ZGR2b1_, i32
+//   CHECK: call void @_ZN1XC1E1Y(ptr {{[^,]*}} @_ZGR2b1_, i32
 //   CHECK: call i32 @__cxa_atexit({{.*}}@_ZN1XD1Ev{{.*}}@_ZGR2b1_
-//   CHECK: store {{.*}}* @_ZGR2b1_,
+//   CHECK: store ptr @_ZGR2b1_,
 //
 //   CHECK: call noundef double @_Z3getILi1EEDa1B()
 //   CHECK: fptosi double %{{.*}} to i32
-//   CHECK: store i32 %{{.*}}, i32* @_ZGR2b2_
-//   CHECK: store i32* @_ZGR2b2_, i32** @b2
+//   CHECK: store i32 %{{.*}}, ptr @_ZGR2b2_
+//   CHECK: store ptr @_ZGR2b2_, ptr @b2
 
-// CHECK: call {{.*}}* @_Z4makeIA2_iERT_v()
-// CHECK: store {{.*}}, [2 x i32]** @_ZDC2c12c2E
+// CHECK: call {{.*}}ptr @_Z4makeIA2_iERT_v()
+// CHECK: store {{.*}}, ptr @_ZDC2c12c2E
 
-// CHECK: call {{.*}}* @_Z4makeIDv2_iERT_v()
-// CHECK: store {{.*}}, <2 x i32>* @_ZDC2d12d2E, align 8
+// CHECK: call {{.*}}ptr @_Z4makeIDv2_iERT_v()
+// CHECK: store {{.*}}, ptr @_ZDC2d12d2E, align 8
 
-// CHECK: call {{.*}}* @_Z4makeICiERT_v()
-// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_ZDC2e12e2E, i32 0, i32 0)
-// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_ZDC2e12e2E, i32 0, i32 1)
+// CHECK: call {{.*}}ptr @_Z4makeICiERT_v()
+// CHECK: store i32 %{{.*}}, ptr @_ZDC2e12e2E
+// CHECK: store i32 %{{.*}}, ptr getelementptr inbounds ({ i32, i32 }, ptr @_ZDC2e12e2E, i32 0, i32 1)
 
 // CHECK: define{{.*}} i32 @_Z12test_globalsv()
 int test_globals() {
   return a2 + b2 + c2 + d2 + e2;
-  // CHECK: load i8, i8* getelementptr inbounds (%struct.A, %struct.A* @_ZDC2a12a2E, i32 0, i32 1)
+  // CHECK: load i8, ptr getelementptr inbounds (%struct.A, ptr @_ZDC2a12a2E, i32 0, i32 1)
   //
-  // CHECK: %[[b2:.*]] = load i32*, i32** @b2
-  // CHECK: load i32, i32* %[[b2]]
+  // CHECK: %[[b2:.*]] = load ptr, ptr @b2
+  // CHECK: load i32, ptr %[[b2]]
   //
-  // CHECK: %[[c1c2:.*]] = load [2 x i32]*, [2 x i32]** @_ZDC2c12c2E
-  // CHECK: %[[c2:.*]] = getelementptr inbounds [2 x i32], [2 x i32]* %[[c1c2]], i64 0, i64 1
-  // CHECK: load i32, i32* %[[c2]]
+  // CHECK: %[[c1c2:.*]] = load ptr, ptr @_ZDC2c12c2E
+  // CHECK: %[[c2:.*]] = getelementptr inbounds [2 x i32], ptr %[[c1c2]], i64 0, i64 1
+  // CHECK: load i32, ptr %[[c2]]
   //
-  // CHECK: %[[d1d2:.*]] = load <2 x i32>, <2 x i32>* @_ZDC2d12d2E
+  // CHECK: %[[d1d2:.*]] = load <2 x i32>, ptr @_ZDC2d12d2E
   // CHECK: extractelement <2 x i32> %[[d1d2]], i32 1
   //
-  // CHECK: load i32, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_ZDC2e12e2E, i32 0, i32 1)
+  // CHECK: load i32, ptr getelementptr inbounds ({ i32, i32 }, ptr @_ZDC2e12e2E, i32 0, i32 1)
 }
 
 // CHECK: define{{.*}} i32 @_Z11test_localsv()
@@ -93,16 +93,16 @@ int test_locals() {
 
   // CHECK: @_Z4makeI1BERT_v()
   //   CHECK: call i32 @_Z3getILi0EEDa1B()
-  //   CHECK: call void @_ZN1XC1E1Y({{.*}}* {{[^,]*}} %[[b1:.*]], i32
+  //   CHECK: call void @_ZN1XC1E1Y(ptr {{[^,]*}} %[[b1:.*]], i32
   //
   //   CHECK: call noundef double @_Z3getILi1EEDa1B()
   //   CHECK: %[[cvt:.*]] = fptosi double %{{.*}} to i32
-  //   CHECK: store i32 %[[cvt]], i32* %[[b2:.*]],
-  //   CHECK: store i32* %[[b2]], i32** %[[b2ref:.*]],
+  //   CHECK: store i32 %[[cvt]], ptr %[[b2:.*]],
+  //   CHECK: store ptr %[[b2]], ptr %[[b2ref:.*]],
 
   return b2;
-  // CHECK: %[[b2:.*]] = load i32*, i32** %[[b2ref]]
-  // CHECK: load i32, i32* %[[b2]]
+  // CHECK: %[[b2:.*]] = load ptr, ptr %[[b2ref]]
+  // CHECK: load i32, ptr %[[b2]]
 
   // CHECK: call {{.*}}@_ZN1XD1Ev({{.*}}%[[b1]])
 }
@@ -111,10 +111,10 @@ int test_locals() {
 void test_bitfield(A &a) {
   auto &[a1, a2] = a;
   a1 = 5;
-  // CHECK: load i16, i16* %[[BITFIELD:.*]],
+  // CHECK: load i16, ptr %[[BITFIELD:.*]],
   // CHECK: and i16 %{{.*}}, -8192
   // CHECK: or i16 %{{.*}}, 5
-  // CHECK: store i16 %{{.*}}, i16* %[[BITFIELD]],
+  // CHECK: store i16 %{{.*}}, ptr %[[BITFIELD]],
 }
 
 // CHECK-LABEL: define {{.*}}@_Z18test_static_simple
@@ -150,7 +150,7 @@ int test_static_tuple() {
   // CHECK: @__cxa_guard_acquire({{.*}} @_ZGVZ17test_static_tuplevE2x1)
   // CHECK: call {{.*}} @_Z3getILi0EEDa1B(
   // CHECK: call {{.*}} @_ZN1XC1E1Y({{.*}} @_ZGRZ17test_static_tuplevE2x1_,
-  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN1XD1Ev {{.*}} @_ZGRZ17test_static_tuplevE2x1_
+  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN1XD1Ev, {{.*}} @_ZGRZ17test_static_tuplevE2x1_
   // CHECK: store {{.*}} @_ZGRZ17test_static_tuplevE2x1_, {{.*}} @_ZZ17test_static_tuplevE2x1
   // CHECK: call void @__cxa_guard_release({{.*}} @_ZGVZ17test_static_tuplevE2x1)
 

diff  --git a/clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp b/clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp
index 7f66020cf42ca..90a01a0a59aed 100644
--- a/clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp
+++ b/clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++1z %s -triple x86_64-linux-gnu -fexceptions -fcxx-exceptions -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -std=c++1z %s -triple x86_64-linux-gnu -fexceptions -fcxx-exceptions -emit-llvm -o - | FileCheck %s
 
 namespace Constant {
   struct A {
@@ -29,13 +29,13 @@ namespace Constant {
   // CHECK: @_ZN8Constant2d3E ={{.*}} global { i32, i8, i8 } { i32 1, i8 0, i8 0 }, align 4
 
   // CHECK-LABEL: define {{.*}}global_var_init
-  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN8Constant1DD1Ev {{.*}} @_ZN8Constant2d1E
+  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN8Constant1DD1Ev, {{.*}} @_ZN8Constant2d1E
 
   // CHECK-LABEL: define {{.*}}global_var_init
-  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN8Constant1DD1Ev {{.*}} @_ZN8Constant2d2E
+  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN8Constant1DD1Ev, {{.*}} @_ZN8Constant2d2E
 
   // CHECK-LABEL: define {{.*}}global_var_init
-  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN8Constant1DD1Ev {{.*}} @_ZN8Constant2d3E
+  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN8Constant1DD1Ev, {{.*}} @_ZN8Constant2d3E
 }
 
 namespace Dynamic {
@@ -64,27 +64,27 @@ namespace Dynamic {
   D d1 = {};
   // CHECK-LABEL: define {{.*}}global_var_init
   // CHECK: call void @_ZN7Dynamic1AC2Ev({{.*}} @_ZN7Dynamic2d1E
-  // CHECK: store i32 5, {{.*}}i8* getelementptr inbounds {{.*}} @_ZN7Dynamic2d1E{{.*}}, i64 8
+  // CHECK: store i32 5, {{.*}}ptr getelementptr inbounds {{.*}} @_ZN7Dynamic2d1E{{.*}}, i64 8
   // CHECK: invoke void @_ZN7Dynamic1CC2Eb({{.*}} @_ZN7Dynamic2d1E{{.*}}, i1 noundef zeroext true)
   // CHECK:   unwind label %[[UNWIND:.*]]
   // CHECK: invoke noundef i32 @_ZN7Dynamic1fEv()
   // CHECK:   unwind label %[[UNWIND:.*]]
-  // CHECK: store i32 {{.*}}, i32* getelementptr {{.*}} @_ZN7Dynamic2d1E, i32 0, i32 2
-  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN7Dynamic1DD1Ev {{.*}} @_ZN7Dynamic2d1E
+  // CHECK: store i32 {{.*}}, ptr getelementptr {{.*}} @_ZN7Dynamic2d1E, i32 0, i32 2
+  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN7Dynamic1DD1Ev, {{.*}} @_ZN7Dynamic2d1E
   // CHECK: ret
   //
   //   UNWIND:
-  // CHECK: call void @_ZN7Dynamic1BD1Ev({{.*}}i8* getelementptr inbounds {{.*}} @_ZN7Dynamic2d1E{{.*}}, i64 8
+  // CHECK: call void @_ZN7Dynamic1BD1Ev(ptr {{.*}}getelementptr inbounds {{.*}} @_ZN7Dynamic2d1E{{.*}}, i64 8
   // CHECK: call void @_ZN7Dynamic1AD1Ev({{.*}} @_ZN7Dynamic2d1E
 
   D d2 = {1, 2, false};
   // CHECK-LABEL: define {{.*}}global_var_init
   // CHECK: call void @_ZN7Dynamic1AC1Ei({{.*}} @_ZN7Dynamic2d2E{{.*}}, i32 noundef 1)
-  // CHECK: store i32 2, {{.*}}i8* getelementptr inbounds {{.*}}@_ZN7Dynamic2d2E{{.*}}, i64 8
+  // CHECK: store i32 2, {{.*}}ptr getelementptr inbounds {{.*}}@_ZN7Dynamic2d2E{{.*}}, i64 8
   // CHECK: invoke void @_ZN7Dynamic1CC1Eb({{.*}} @_ZN7Dynamic2d2E{{.*}}, i1 noundef zeroext false)
   // CHECK: invoke noundef i32 @_ZN7Dynamic1fEv()
-  // CHECK: store i32 {{.*}}, i32* getelementptr {{.*}} @_ZN7Dynamic2d2E, i32 0, i32 2
-  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN7Dynamic1DD1Ev {{.*}} @_ZN7Dynamic2d2E
+  // CHECK: store i32 {{.*}}, ptr getelementptr {{.*}} @_ZN7Dynamic2d2E, i32 0, i32 2
+  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN7Dynamic1DD1Ev, {{.*}} @_ZN7Dynamic2d2E
   // CHECK: ret void
 
   D d3 = {g(), h(), {}, i()};
@@ -93,20 +93,20 @@ namespace Dynamic {
   // CHECK: call void @_ZN7Dynamic1AC1Ei({{.*}} @_ZN7Dynamic2d3E{{.*}}, i32 noundef %[[G_CALL]])
   // CHECK: %[[H_CALL:.*]] = invoke noundef i32 @_ZN7Dynamic1hEv()
   // CHECK:   unwind label %[[DESTROY_A_LPAD:.*]]
-  // CHECK: store i32 %[[H_CALL]], {{.*}}i8* getelementptr inbounds {{.*}} @_ZN7Dynamic2d3E{{.*}}, i64 8
+  // CHECK: store i32 %[[H_CALL]], {{.*}}ptr getelementptr inbounds {{.*}} @_ZN7Dynamic2d3E{{.*}}, i64 8
   // CHECK: invoke void @_ZN7Dynamic1CC2Eb({{.*}} @_ZN7Dynamic2d3E{{.*}}, i1 noundef zeroext true)
   // CHECK:   unwind label %[[DESTROY_AB_LPAD:.*]]
   // CHECK: %[[I_CALL:.*]] = invoke noundef i32 @_ZN7Dynamic1iEv()
   // CHECK:   unwind label %[[DESTROY_AB_LPAD:.*]]
-  // CHECK: store i32 %[[I_CALL]], i32* getelementptr {{.*}} @_ZN7Dynamic2d3E, i32 0, i32 2
-  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN7Dynamic1DD1Ev {{.*}} @_ZN7Dynamic2d3E to i8*
+  // CHECK: store i32 %[[I_CALL]], ptr getelementptr {{.*}} @_ZN7Dynamic2d3E, i32 0, i32 2
+  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN7Dynamic1DD1Ev, {{.*}} @_ZN7Dynamic2d3E
   // CHECK: ret
   //
   //   DESTROY_A_LPAD:
   // CHECK: br label %[[A_CLEANUP:.*]]
   //
   //   DESTROY_B_LPAD:
-  // CHECK: call void @_ZN7Dynamic1BD1Ev({{.*}}i8* getelementptr inbounds {{.*}} @_ZN7Dynamic2d3E{{.*}}, i64 8
+  // CHECK: call void @_ZN7Dynamic1BD1Ev(ptr {{.*}}getelementptr inbounds {{.*}} @_ZN7Dynamic2d3E{{.*}}, i64 8
   // CHECK: br label %[[A_CLEANUP:.*]]
   //
   //   A_CLEANUP:
@@ -119,7 +119,7 @@ namespace Instantiated1 {
   template<int> B v({});
   template B v<0>;
   // CHECK-LABEL: define {{.*}}global_var_init{{.*}} comdat($_ZN13Instantiated11vILi0EEE) {
-  // CHECK: call void @_ZN13Instantiated11BC1Ev(%{{.*}}* {{[^,]*}} @_ZN13Instantiated11vILi0EEE)
+  // CHECK: call void @_ZN13Instantiated11BC1Ev(ptr {{[^,]*}} @_ZN13Instantiated11vILi0EEE)
 }
 
 namespace Instantiated2 {

diff  --git a/clang/test/CodeGenCXX/cxx2a-destroying-delete.cpp b/clang/test/CodeGenCXX/cxx2a-destroying-delete.cpp
index 9e7ebcef1d02e..20264b67353a9 100644
--- a/clang/test/CodeGenCXX/cxx2a-destroying-delete.cpp
+++ b/clang/test/CodeGenCXX/cxx2a-destroying-delete.cpp
@@ -1,11 +1,11 @@
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++2a -fexceptions -emit-llvm %s -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK,CHECK-ITANIUM,CHECK-64BIT
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++2a -fexceptions -emit-llvm %s -triple x86_64-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI64,CHECK-64BIT
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++2a -fexceptions -emit-llvm %s -triple i386-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI32,CHECK-32BIT
+// RUN: %clang_cc1 -std=c++2a -fexceptions -emit-llvm %s -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK,CHECK-ITANIUM,CHECK-64BIT
+// RUN: %clang_cc1 -std=c++2a -fexceptions -emit-llvm %s -triple x86_64-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI64,CHECK-64BIT
+// RUN: %clang_cc1 -std=c++2a -fexceptions -emit-llvm %s -triple i386-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI32,CHECK-32BIT
 
 // PR46908: ensure the IR passes the verifier with optimizations enabled.
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++2a -fexceptions -emit-llvm-only %s -triple x86_64-linux-gnu -O2
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++2a -fexceptions -emit-llvm-only %s -triple x86_64-windows -O2
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++2a -fexceptions -emit-llvm-only %s -triple i386-windows -O2
+// RUN: %clang_cc1 -std=c++2a -fexceptions -emit-llvm-only %s -triple x86_64-linux-gnu -O2
+// RUN: %clang_cc1 -std=c++2a -fexceptions -emit-llvm-only %s -triple x86_64-windows -O2
+// RUN: %clang_cc1 -std=c++2a -fexceptions -emit-llvm-only %s -triple i386-windows -O2
 
 namespace std {
   using size_t = decltype(sizeof(0));
@@ -21,14 +21,14 @@ struct A {
 void delete_A(A *a) { delete a; }
 // CHECK-LABEL: define {{.*}}delete_A
 // CHECK: %[[a:.*]] = load
-// CHECK: icmp eq %{{.*}} %[[a]], null
+// CHECK: icmp eq ptr %[[a]], null
 // CHECK: br i1
 //
 // Ensure that we call the destroying delete and not the destructor.
 // CHECK-NOT: call
-// CHECK-ITANIUM: call void @_ZN1AdlEPS_St19destroying_delete_t(%{{.*}}* noundef %[[a]])
-// CHECK-MSABI64: call void @"??3A@@SAXPEAU0 at Udestroying_delete_t@std@@@Z"(%{{.*}}* noundef %[[a]], i8
-// CHECK-MSABI32: call void @"??3A@@SAXPAU0 at Udestroying_delete_t@std@@@Z"(%{{.*}}* noundef %[[a]], %{{.*}}* noundef byval(%{{.*}}) align 4 %{{.*}})
+// CHECK-ITANIUM: call void @_ZN1AdlEPS_St19destroying_delete_t(ptr noundef %[[a]])
+// CHECK-MSABI64: call void @"??3A@@SAXPEAU0 at Udestroying_delete_t@std@@@Z"(ptr noundef %[[a]], i8
+// CHECK-MSABI32: call void @"??3A@@SAXPAU0 at Udestroying_delete_t@std@@@Z"(ptr noundef %[[a]], ptr noundef byval(%{{.*}}) align 4 %{{.*}})
 // CHECK-NOT: call
 // CHECK: }
 
@@ -39,14 +39,14 @@ struct B {
 void delete_B(B *b) { delete b; }
 // CHECK-LABEL: define {{.*}}delete_B
 // CHECK: %[[b:.*]] = load
-// CHECK: icmp eq %{{.*}} %[[b]], null
+// CHECK: icmp eq ptr %[[b]], null
 // CHECK: br i1
 //
 // Ensure that we call the virtual destructor and not the operator delete.
 // CHECK-NOT: call
 // CHECK: %[[VTABLE:.*]] = load
 // CHECK: %[[DTOR:.*]] = load
-// CHECK: call {{void|noundef i8\*|x86_thiscallcc noundef i8\*}} %[[DTOR]](%{{.*}}* {{[^,]*}} %[[b]]
+// CHECK: call {{void|noundef ptr|x86_thiscallcc noundef ptr}} %[[DTOR]](ptr {{[^,]*}} %[[b]]
 // CHECK-MSABI-SAME: , i32 noundef 1)
 // CHECK-NOT: call
 // CHECK: }
@@ -60,21 +60,20 @@ void delete_C(C *c) { delete c; }
 // Check that we perform a derived-to-base conversion on the parameter to 'operator delete'.
 // CHECK-LABEL: define {{.*}}delete_C
 // CHECK: %[[c:.*]] = load
-// CHECK: icmp eq %{{.*}} %[[c]], null
+// CHECK: icmp eq ptr %[[c]], null
 // CHECK: br i1
 //
 // CHECK-64BIT: %[[base:.*]] = getelementptr {{.*}}, i64 8
 // CHECK-32BIT: %[[base:.*]] = getelementptr {{.*}}, i32 4
-// CHECK: %[[castbase:.*]] = bitcast {{.*}} %[[base]]
 //
-// CHECK: %[[a:.*]] = phi {{.*}} %[[castbase]]
-// CHECK: icmp eq %{{.*}} %[[a]], null
+// CHECK: %[[a:.*]] = phi {{.*}} %[[base]]
+// CHECK: icmp eq ptr %[[a]], null
 // CHECK: br i1
 //
 // CHECK-NOT: call
-// CHECK-ITANIUM: call void @_ZN1AdlEPS_St19destroying_delete_t(%{{.*}}* noundef %[[a]])
-// CHECK-MSABI64: call void @"??3A@@SAXPEAU0 at Udestroying_delete_t@std@@@Z"(%{{.*}}* noundef %[[a]], i8
-// CHECK-MSABI32: call void @"??3A@@SAXPAU0 at Udestroying_delete_t@std@@@Z"(%{{.*}}* noundef %[[a]], %{{.*}}* noundef byval(%{{.*}}) align 4 %{{.*}})
+// CHECK-ITANIUM: call void @_ZN1AdlEPS_St19destroying_delete_t(ptr noundef %[[a]])
+// CHECK-MSABI64: call void @"??3A@@SAXPEAU0 at Udestroying_delete_t@std@@@Z"(ptr noundef %[[a]], i8
+// CHECK-MSABI32: call void @"??3A@@SAXPAU0 at Udestroying_delete_t@std@@@Z"(ptr noundef %[[a]], ptr noundef byval(%{{.*}}) align 4 %{{.*}})
 // CHECK-NOT: call
 // CHECK: }
 
@@ -83,20 +82,19 @@ struct D : Padding, VDel, B {};
 void delete_D(D *d) { delete d; }
 // CHECK-LABEL: define {{.*}}delete_D
 // CHECK: %[[d:.*]] = load
-// CHECK: icmp eq %{{.*}} %[[d]], null
+// CHECK: icmp eq ptr %[[d]], null
 // CHECK: br i1
 //
 // CHECK-NOT: call
 // For MS, we don't add a new vtable slot to the primary vtable for the virtual
 // destructor. Instead we cast to the VDel base class.
-// CHECK-MSABI: bitcast {{.*}} %[[d]]
-// CHECK-MSABI64-NEXT: %[[d:.*]] = getelementptr {{.*}}, i64 8
-// CHECK-MSABI32-NEXT: %[[d:.*]] = getelementptr {{.*}}, i32 4
+// CHECK-MSABI64: %[[d:.*]] = getelementptr {{.*}}, i64 8
+// CHECK-MSABI32: %[[d:.*]] = getelementptr {{.*}}, i32 4
 //
 // CHECK: %[[VTABLE:.*]] = load
 // CHECK: %[[DTOR:.*]] = load
 //
-// CHECK: call {{void|noundef i8\*|x86_thiscallcc noundef i8\*}} %[[DTOR]]({{.*}}*{{[^,]*}} %[[d]]
+// CHECK: call {{void|noundef ptr|x86_thiscallcc noundef ptr}} %[[DTOR]](ptr{{[^,]*}} %[[d]]
 // CHECK-MSABI-SAME: , i32 noundef 1)
 // CHECK-NOT: call
 // CHECK: }
@@ -143,9 +141,9 @@ struct alignas(16) G : E, F { void *data; };
 void delete_G(G *g) { delete g; }
 // CHECK-LABEL: define {{.*}}delete_G
 // CHECK-NOT: call
-// CHECK-ITANIUM: call void @_ZN1FdlEPS_St19destroying_delete_tmSt11align_val_t(%{{.*}}* noundef %[[a]], i64 noundef 32, i64 noundef 16)
-// CHECK-MSABI64: call void @"??3F@@SAXPEAU0 at Udestroying_delete_t@std@@_KW4align_val_t at 2@@Z"(%{{.*}}* noundef %[[a]], i8 {{[^,]*}}, i64 noundef 32, i64 noundef 16)
-// CHECK-MSABI32: call void @"??3F@@SAXPAU0 at Udestroying_delete_t@std@@IW4align_val_t at 2@@Z"(%{{.*}}* noundef %[[a]], %{{.*}}* noundef byval(%{{.*}}) align 4 %{{.*}}, i32 noundef 16, i32 noundef 16)
+// CHECK-ITANIUM: call void @_ZN1FdlEPS_St19destroying_delete_tmSt11align_val_t(ptr noundef %[[a]], i64 noundef 32, i64 noundef 16)
+// CHECK-MSABI64: call void @"??3F@@SAXPEAU0 at Udestroying_delete_t@std@@_KW4align_val_t at 2@@Z"(ptr noundef %[[a]], i8 {{[^,]*}}, i64 noundef 32, i64 noundef 16)
+// CHECK-MSABI32: call void @"??3F@@SAXPAU0 at Udestroying_delete_t@std@@IW4align_val_t at 2@@Z"(ptr noundef %[[a]], ptr noundef byval(%{{.*}}) align 4 %{{.*}}, i32 noundef 16, i32 noundef 16)
 // CHECK-NOT: call
 // CHECK: }
 

diff  --git a/clang/test/CodeGenCXX/cxx2a-thread-local-constinit.cpp b/clang/test/CodeGenCXX/cxx2a-thread-local-constinit.cpp
index 18e55435486f1..b5a9f34bd1f00 100644
--- a/clang/test/CodeGenCXX/cxx2a-thread-local-constinit.cpp
+++ b/clang/test/CodeGenCXX/cxx2a-thread-local-constinit.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-linux-gnu -std=c++2a %s -emit-llvm -o - | FileCheck --check-prefix=CHECK --check-prefix=LINUX %s
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin12  -std=c++2a %s -emit-llvm -o - | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++2a %s -emit-llvm -o - | FileCheck --check-prefix=CHECK --check-prefix=LINUX %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin12  -std=c++2a %s -emit-llvm -o - | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
 
 // Check variable definitions/declarations. Note that on Darwin, typically the
 // variable's symbol is marked internal, and only the _ZTW function is
@@ -19,7 +19,7 @@ extern thread_local int a;
 extern thread_local constinit int b;
 
 // CHECK-LABEL: define{{.*}} i32 @_Z5get_av()
-// CHECK: call {{(cxx_fast_tlscc )?}}i32* @_ZTW1a()
+// CHECK: call {{(cxx_fast_tlscc )?}}ptr @_ZTW1a()
 // CHECK: }
 int get_a() { return a; }
 
@@ -31,8 +31,8 @@ int get_a() { return a; }
 
 // CHECK-LABEL: define{{.*}} i32 @_Z5get_bv()
 // CHECK-NOT: call
-// CHECK: [[B_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @b)
-// CHECK: load i32, i32* [[B_ADDR]]
+// CHECK: [[B_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @b)
+// CHECK: load i32, ptr [[B_ADDR]]
 // CHECK-NOT: call
 // CHECK: }
 int get_b() { return b; }
@@ -42,8 +42,8 @@ int get_b() { return b; }
 extern thread_local int c;
 
 // CHECK-LABEL: define{{.*}} i32 @_Z5get_cv()
-// LINUX: call {{(cxx_fast_tlscc )?}}i32* @_ZTW1c()
-// CHECK: load i32, i32* %
+// LINUX: call {{(cxx_fast_tlscc )?}}ptr @_ZTW1c()
+// CHECK: load i32, ptr %
 // CHECK: }
 int get_c() { return c; }
 
@@ -53,8 +53,8 @@ int get_c() { return c; }
 // LINUX-LABEL: define weak_odr {{.*}} @_ZTW1c()
 // CHECK-NOT: br i1
 // CHECK-NOT: call
-// CHECK: [[C_ADDR:%.+]] = call align 4 i32* @llvm.threadlocal.address.p0i32(i32* align 4 @c)
-// CHECK: ret i32* [[C_ADDR]]
+// CHECK: [[C_ADDR:%.+]] = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @c)
+// CHECK: ret ptr [[C_ADDR]]
 // CHECK: }
 
 thread_local int c = 0;
@@ -63,7 +63,7 @@ thread_local int c = 0;
 // destruction, and so speculatively call the thread wrapper.
 
 // CHECK-LABEL: define {{.*}} @_Z6get_e3v(
-// CHECK: call {{.*}}* @_ZTW2e3()
+// CHECK: call {{(cxx_fast_tlscc )?}}ptr @_ZTW2e3()
 // CHECK-LABEL: }
 extern thread_local constinit struct DestructedFwdDecl e3;
 DestructedFwdDecl &get_e3() { return e3; }
@@ -81,13 +81,13 @@ struct Destructed {
 
 extern thread_local constinit Destructed e;
 // CHECK-LABEL: define{{.*}} i32 @_Z5get_ev()
-// CHECK: call {{.*}}* @_ZTW1e()
+// CHECK: call {{(cxx_fast_tlscc )?}}ptr @_ZTW1e()
 // CHECK: }
 int get_e() { return e.n; }
 
 // CHECK: define {{.*}}[[E2_INIT:@__cxx_global_var_init[^(]*]](
-// LINUX: call {{.*}} @__cxa_thread_atexit({{.*}} @_ZN10DestructedD1Ev {{.*}} @e2
-// DARWIN: call {{.*}} @_tlv_atexit({{.*}} @_ZN10DestructedD1Ev {{.*}} @e2
+// LINUX: call {{.*}} @__cxa_thread_atexit({{.*}} @_ZN10DestructedD1Ev, {{.*}} @e2
+// DARWIN: call {{.*}} @_tlv_atexit({{.*}} @_ZN10DestructedD1Ev, {{.*}} @e2
 thread_local constinit Destructed e2;
 
 thread_local constinit int f = 4;

diff  --git a/clang/test/CodeGenCXX/cxx2a-three-way-comparison.cpp b/clang/test/CodeGenCXX/cxx2a-three-way-comparison.cpp
index 16e1a8e5a77ff..b994031a978a9 100644
--- a/clang/test/CodeGenCXX/cxx2a-three-way-comparison.cpp
+++ b/clang/test/CodeGenCXX/cxx2a-three-way-comparison.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++2a -emit-llvm %s -o - -triple %itanium_abi_triple | FileCheck %s --check-prefixes=CHECK,ITANIUM
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++2a -emit-llvm %s -o - -triple x86_64-pc-win32 2>&1 | FileCheck %s --check-prefixes=CHECK,MSABI
+// RUN: %clang_cc1 -std=c++2a -emit-llvm %s -o - -triple %itanium_abi_triple | FileCheck %s --check-prefixes=CHECK,ITANIUM
+// RUN: %clang_cc1 -std=c++2a -emit-llvm %s -o - -triple x86_64-pc-win32 2>&1 | FileCheck %s --check-prefixes=CHECK,MSABI
 
 namespace std {
   struct strong_ordering {
@@ -35,8 +35,8 @@ struct Y : Primary, X {
   virtual std::strong_ordering operator<=>(const Y&) const = default;
 };
 Y y;
-// ITANIUM: @_ZTV1Y = {{.*}}constant {{.*}} null, {{.*}} @_ZTI1Y {{.*}} @_ZN7Primary1fEv {{.*}} @_ZNK1YssERKS_ {{.*}} @_ZN1YaSERKS_ {{.*}} @_ZN1YaSEOS_ {{.*}} @_ZNK1YeqERKS_ {{.*}} -[[POINTERSIZE:4|8]]
-// ITANIUM-SAME: @_ZTI1Y {{.*}} @_ZThn[[POINTERSIZE]]_N1YaSERKS_
+// ITANIUM: @_ZTV1Y = {{.*}}constant {{.*}} null, {{.*}} @_ZTI1Y, {{.*}} @_ZN7Primary1fEv, {{.*}} @_ZNK1YssERKS_, {{.*}} @_ZN1YaSERKS_, {{.*}} @_ZN1YaSEOS_, {{.*}} @_ZNK1YeqERKS_], {{.*}} -[[POINTERSIZE:4|8]]
+// ITANIUM-SAME: @_ZTI1Y, {{.*}} @_ZThn[[POINTERSIZE]]_N1YaSERKS_
 
 struct A {
   void operator<=>(int);

diff  --git a/clang/test/CodeGenCXX/debug-info-inlined.cpp b/clang/test/CodeGenCXX/debug-info-inlined.cpp
index 4e9d1e189cf73..d73a8a67f2cc4 100644
--- a/clang/test/CodeGenCXX/debug-info-inlined.cpp
+++ b/clang/test/CodeGenCXX/debug-info-inlined.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -emit-llvm -triple i686-pc-windows-msvc19.0.24213 -gcodeview -debug-info-kind=limited -std=c++14 %s -o - | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -triple i686-pc-windows-msvc19.0.24213 -gcodeview -debug-info-kind=limited -std=c++14 %s -o - | FileCheck %s
 // PR33997.
 struct WithDtor {
   ~WithDtor();
@@ -21,9 +21,7 @@ B::B() : Forward(WithDtor()) {}
 
 // CHECK: define{{.*}}A
 // CHECK-NOT: {{ ret }}
-// CHECK: store %class.Forward* %
-// CHECK-SAME: %class.Forward** %
-// CHECK-SAME: !dbg ![[INL:[0-9]+]]
+// CHECK: store ptr %{{.*}}, ptr %{{.*}}, !dbg ![[INL:[0-9]+]]
 
 // CHECK: ![[INL]] = !DILocation(line: 10, column: 15, scope: ![[SP:[0-9]+]], inlinedAt:
 // CHECK: ![[SP]] = distinct !DISubprogram(name: "Base", {{.*}} DISPFlagDefinition

diff  --git a/clang/test/CodeGenCXX/debug-info-range-for-var-names.cpp b/clang/test/CodeGenCXX/debug-info-range-for-var-names.cpp
index 8181947dd725f..30291d74331a4 100644
--- a/clang/test/CodeGenCXX/debug-info-range-for-var-names.cpp
+++ b/clang/test/CodeGenCXX/debug-info-range-for-var-names.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
 
 struct vec {
   using itr = int*;
@@ -15,15 +15,15 @@ void test() {
       }
 }
 
-// CHECK: call void @llvm.dbg.declare(metadata %struct.vec** {{.*}}, metadata ![[RANGE1:[0-9]+]]
-// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[BEGIN1:[0-9]+]]
-// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[END1:[0-9]+]]
-// CHECK: call void @llvm.dbg.declare(metadata %struct.vec** {{.*}}, metadata ![[RANGE2:[0-9]+]]
-// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[BEGIN2:[0-9]+]]
-// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[END2:[0-9]+]]
-// CHECK: call void @llvm.dbg.declare(metadata %struct.vec** {{.*}}, metadata ![[RANGE3:[0-9]+]]
-// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[BEGIN3:[0-9]+]]
-// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[END3:[0-9]+]]
+// CHECK: call void @llvm.dbg.declare(metadata ptr %__range1, metadata ![[RANGE1:[0-9]+]]
+// CHECK: call void @llvm.dbg.declare(metadata ptr {{.*}}, metadata ![[BEGIN1:[0-9]+]]
+// CHECK: call void @llvm.dbg.declare(metadata ptr {{.*}}, metadata ![[END1:[0-9]+]]
+// CHECK: call void @llvm.dbg.declare(metadata ptr %__range2, metadata ![[RANGE2:[0-9]+]]
+// CHECK: call void @llvm.dbg.declare(metadata ptr {{.*}}, metadata ![[BEGIN2:[0-9]+]]
+// CHECK: call void @llvm.dbg.declare(metadata ptr {{.*}}, metadata ![[END2:[0-9]+]]
+// CHECK: call void @llvm.dbg.declare(metadata ptr %__range3, metadata ![[RANGE3:[0-9]+]]
+// CHECK: call void @llvm.dbg.declare(metadata ptr {{.*}}, metadata ![[BEGIN3:[0-9]+]]
+// CHECK: call void @llvm.dbg.declare(metadata ptr {{.*}}, metadata ![[END3:[0-9]+]]
 // CHECK: ![[RANGE1]] = !DILocalVariable(name: "__range1",
 // CHECK: ![[BEGIN1]] = !DILocalVariable(name: "__begin1",
 // CHECK: ![[END1]] = !DILocalVariable(name: "__end1",

diff  --git a/clang/test/CodeGenCXX/delete.cpp b/clang/test/CodeGenCXX/delete.cpp
index a216f23b3c308..1a418f48b6598 100644
--- a/clang/test/CodeGenCXX/delete.cpp
+++ b/clang/test/CodeGenCXX/delete.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin10 %s -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOSIZE
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin10 %s -emit-llvm -o - -Oz -disable-llvm-passes | FileCheck %s --check-prefixes=CHECK,CHECK-SIZE
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOSIZE
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -emit-llvm -o - -Oz -disable-llvm-passes | FileCheck %s --check-prefixes=CHECK,CHECK-SIZE
 
 void t1(int *a) {
   delete a;
@@ -16,8 +16,7 @@ void t3(S *s) {
   // CHECK: icmp {{.*}} null
   // CHECK: br i1
 
-  // CHECK: bitcast
-  // CHECK-NEXT: call void @_ZdlPv
+  // CHECK: call void @_ZdlPv
 
   // Check the delete is inside the 'if !null' check unless we're optimizing
   // for size. FIXME: We could omit the branch entirely in this case.
@@ -35,10 +34,8 @@ struct T {
 // CHECK-LABEL: define{{.*}} void @_Z2t4P1T
 void t4(T *t) {
   // CHECK: call void @_ZN1TD1Ev
-  // CHECK-NOSIZE-NEXT: bitcast
   // CHECK-SIZE-NEXT: br
-  // CHECK-SIZE: bitcast
-  // CHECK-NEXT: call void @_ZdlPv
+  // CHECK: call void @_ZdlPv
   delete t;
 }
 
@@ -64,14 +61,12 @@ namespace test0 {
   // CHECK-LABEL: define{{.*}} void @_ZN5test04testEPNS_1AE(
   void test(A *a) {
     // CHECK: call void @_ZN5test01AD1Ev
-    // CHECK-NOSIZE-NEXT: bitcast
     // CHECK-SIZE-NEXT: br
-    // CHECK-SIZE: bitcast
-    // CHECK-NEXT: call void @_ZN5test01AdlEPv
+    // CHECK: call void @_ZN5test01AdlEPv
     delete a;
   }
 
-  // CHECK-LABEL: define linkonce_odr void @_ZN5test01AD1Ev(%"struct.test0::A"* {{[^,]*}} %this) unnamed_addr
+  // CHECK-LABEL: define linkonce_odr void @_ZN5test01AD1Ev(ptr {{[^,]*}} %this) unnamed_addr
   // CHECK-LABEL: define linkonce_odr void @_ZN5test01AdlEPv
 }
 
@@ -84,39 +79,37 @@ namespace test1 {
   // CHECK-LABEL: define{{.*}} void @_ZN5test14testEPA10_A20_NS_1AE(
   void test(A (*arr)[10][20]) {
     delete [] arr;
-    // CHECK:      icmp eq [10 x [20 x [[A:%.*]]]]* [[PTR:%.*]], null
+    // CHECK:      icmp eq ptr [[PTR:%.*]], null
     // CHECK-NEXT: br i1
 
-    // CHECK:      [[BEGIN:%.*]] = getelementptr inbounds [10 x [20 x [[A]]]], [10 x [20 x [[A]]]]* [[PTR]], i32 0, i32 0, i32 0
-    // CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[BEGIN]] to i8*
-    // CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 -8
-    // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[ALLOC]] to i64*
-    // CHECK-NEXT: [[COUNT:%.*]] = load i64, i64* [[T1]]
-    // CHECK:      [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 [[COUNT]]
-    // CHECK-NEXT: [[ISEMPTY:%.*]] = icmp eq [[A]]* [[BEGIN]], [[END]]
+    // CHECK:      [[BEGIN:%.*]] = getelementptr inbounds [10 x [20 x [[A:%.*]]]], ptr [[PTR]], i32 0, i32 0, i32 0
+    // CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8, ptr [[BEGIN]], i64 -8
+    // CHECK-NEXT: [[COUNT:%.*]] = load i64, ptr [[ALLOC]]
+    // CHECK:      [[END:%.*]] = getelementptr inbounds [[A]], ptr [[BEGIN]], i64 [[COUNT]]
+    // CHECK-NEXT: [[ISEMPTY:%.*]] = icmp eq ptr [[BEGIN]], [[END]]
     // CHECK-NEXT: br i1 [[ISEMPTY]],
-    // CHECK:      [[PAST:%.*]] = phi [[A]]* [ [[END]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
-    // CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]], [[A]]* [[PAST]], i64 -1
-    // CHECK-NEXT: call void @_ZN5test11AD1Ev([[A]]* {{[^,]*}} [[CUR]])
-    // CHECK-NEXT: [[ISDONE:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]]
+    // CHECK:      [[PAST:%.*]] = phi ptr [ [[END]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
+    // CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]], ptr [[PAST]], i64 -1
+    // CHECK-NEXT: call void @_ZN5test11AD1Ev(ptr {{[^,]*}} [[CUR]])
+    // CHECK-NEXT: [[ISDONE:%.*]] = icmp eq ptr [[CUR]], [[BEGIN]]
     // CHECK-NEXT: br i1 [[ISDONE]]
-    // CHECK:      call void @_ZdaPv(i8* noundef [[ALLOC]])
+    // CHECK:      call void @_ZdaPv(ptr noundef [[ALLOC]])
   }
 }
 
 namespace test2 {
   // CHECK-LABEL: define{{.*}} void @_ZN5test21fEPb
   void f(bool *b) {
-    // CHECK: call void @_ZdlPv(i8*
+    // CHECK: call void @_ZdlPv(ptr
     delete b;
-    // CHECK: call void @_ZdaPv(i8*
+    // CHECK: call void @_ZdaPv(ptr
     delete [] b;
   }
 }
 
 namespace test3 {
   void f(int a[10][20]) {
-    // CHECK: call void @_ZdaPv(i8*
+    // CHECK: call void @_ZdaPv(ptr
     delete a;
   }
 }
@@ -132,21 +125,19 @@ namespace test4 {
   void global_delete_virtual(X *xp) {
     //   Load the offset-to-top from the vtable and apply it.
     //   This has to be done first because the dtor can mess it up.
-    // CHECK:      [[T0:%.*]] = bitcast [[X:%.*]]* [[XP:%.*]] to i64**
-    // CHECK-NEXT: [[VTABLE:%.*]] = load i64*, i64** [[T0]]
-    // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i64, i64* [[VTABLE]], i64 -2
-    // CHECK-NEXT: [[OFFSET:%.*]] = load i64, i64* [[T0]], align 8
-    // CHECK-NEXT: [[T0:%.*]] = bitcast [[X]]* [[XP]] to i8*
-    // CHECK-NEXT: [[ALLOCATED:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 [[OFFSET]]
+    // CHECK: [[XP:%.*]] = load ptr, ptr [[XP_ADDR:%.*]]
+    // CHECK: [[VTABLE:%.*]] = load ptr, ptr [[XP]]
+    // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i64, ptr [[VTABLE]], i64 -2
+    // CHECK-NEXT: [[OFFSET:%.*]] = load i64, ptr [[T0]], align 8
+    // CHECK-NEXT: [[ALLOCATED:%.*]] = getelementptr inbounds i8, ptr [[XP]], i64 [[OFFSET]]
     //   Load the complete-object destructor (not the deleting destructor)
     //   and call noundef it.
-    // CHECK-NEXT: [[T0:%.*]] = bitcast [[X:%.*]]* [[XP:%.*]] to void ([[X]]*)***
-    // CHECK-NEXT: [[VTABLE:%.*]] = load void ([[X]]*)**, void ([[X]]*)*** [[T0]]
-    // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds void ([[X]]*)*, void ([[X]]*)** [[VTABLE]], i64 0
-    // CHECK-NEXT: [[DTOR:%.*]] = load void ([[X]]*)*, void ([[X]]*)** [[T0]]
-    // CHECK-NEXT: call void [[DTOR]]([[X]]* {{[^,]*}} [[OBJ:%.*]])
+    // CHECK-NEXT: [[VTABLE:%.*]] = load ptr, ptr [[XP:%.*]]
+    // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds ptr, ptr [[VTABLE]], i64 0
+    // CHECK-NEXT: [[DTOR:%.*]] = load ptr, ptr [[T0]]
+    // CHECK-NEXT: call void [[DTOR]](ptr {{[^,]*}} [[OBJ:%.*]])
     //   Call the global operator delete.
-    // CHECK-NEXT: call void @_ZdlPv(i8* noundef [[ALLOCATED]]) [[NUW:#[0-9]+]]
+    // CHECK-NEXT: call void @_ZdlPv(ptr noundef [[ALLOCATED]]) [[NUW:#[0-9]+]]
     ::delete xp;
   }
 }

diff  --git a/clang/test/CodeGenCXX/derived-to-virtual-base-class-calls-final.cpp b/clang/test/CodeGenCXX/derived-to-virtual-base-class-calls-final.cpp
index 2d6cfe68cee02..df2d4b3ae7bee 100644
--- a/clang/test/CodeGenCXX/derived-to-virtual-base-class-calls-final.cpp
+++ b/clang/test/CodeGenCXX/derived-to-virtual-base-class-calls-final.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers %s -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 %s -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %s
 
 struct A { int i; };
 struct B { char j; };
@@ -9,8 +9,8 @@ struct D final : virtual C {
   virtual void f();
 };
 
-// CHECK-LABEL: define {{.*}}dereferenceable({{[0-9]+}}) %struct.B* @_Z1fR1D
+// CHECK-LABEL: define {{.*}}dereferenceable({{[0-9]+}}) ptr @_Z1fR1D
 B &f(D &d) {
-  // CHECK-NOT: load i8*, i8**
+  // CHECK-NOT: load ptr, ptr %{{[0-9]+}}
   return d;
 }

diff  --git a/clang/test/CodeGenCXX/destructors.cpp b/clang/test/CodeGenCXX/destructors.cpp
index 995cc9cdce139..99c82ec76989a 100644
--- a/clang/test/CodeGenCXX/destructors.cpp
+++ b/clang/test/CodeGenCXX/destructors.cpp
@@ -1,10 +1,10 @@
-// RUN: %clang_cc1 -no-opaque-pointers %s -triple x86_64-apple-darwin10 -emit-llvm -o - -mconstructor-aliases -fcxx-exceptions -fexceptions -O1 -disable-llvm-passes -std=c++03 > %t
+// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - -mconstructor-aliases -fcxx-exceptions -fexceptions -O1 -disable-llvm-passes -std=c++03 > %t
 // RUN: FileCheck --check-prefix=CHECK1 --input-file=%t %s
 // RUN: FileCheck --check-prefix=CHECK2 --input-file=%t %s
 // RUN: FileCheck --check-prefix=CHECK3 --input-file=%t %s
 // RUN: FileCheck --check-prefixes=CHECK4,CHECK4v03 --input-file=%t %s
 // RUN: FileCheck --check-prefixes=CHECK5,CHECK5v03 --input-file=%t %s
-// RUN: %clang_cc1 -no-opaque-pointers %s -triple x86_64-apple-darwin10 -emit-llvm -o - -mconstructor-aliases -fcxx-exceptions -fexceptions -O1 -disable-llvm-passes -std=c++11 > %t2
+// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - -mconstructor-aliases -fcxx-exceptions -fexceptions -O1 -disable-llvm-passes -std=c++11 > %t2
 // RUN: FileCheck --check-prefix=CHECK1    --input-file=%t2 %s
 // RUN: FileCheck --check-prefix=CHECK2v11 --input-file=%t2 %s
 // RUN: FileCheck --check-prefix=CHECK3    --input-file=%t2 %s
@@ -44,9 +44,9 @@ namespace PR7526 {
   struct allocator_derived : allocator { };
 
   // CHECK1-LABEL: define{{.*}} void @_ZN6PR75263fooEv()
-  // CHECK1: call void {{.*}} @_ZN6PR75269allocatorD2Ev
+  // CHECK1: call void @_ZN6PR75269allocatorD2Ev
 
-  // CHECK1-LABEL: define{{.*}} void @_ZN6PR75269allocatorD2Ev(%"struct.PR7526::allocator"* {{[^,]*}} %this) unnamed_addr
+  // CHECK1-LABEL: define{{.*}} void @_ZN6PR75269allocatorD2Ev(ptr {{[^,]*}} %this) unnamed_addr
   // CHECK1: call void @__cxa_call_unexpected
   allocator::~allocator() throw() { foo(); }
 
@@ -97,7 +97,7 @@ namespace test0 {
 // complete destructor alias tested above
 
 // CHECK2-LABEL: @_ZN5test01AD1Ev ={{.*}} unnamed_addr alias {{.*}} @_ZN5test01AD2Ev
-// CHECK2-LABEL: define{{.*}} void @_ZN5test01AD2Ev(%"struct.test0::A"* {{[^,]*}} %this) unnamed_addr
+// CHECK2-LABEL: define{{.*}} void @_ZN5test01AD2Ev(ptr {{[^,]*}} %this) unnamed_addr
 // CHECK2: invoke void @_ZN5test06MemberD1Ev
 // CHECK2:   unwind label [[MEM_UNWIND:%[a-zA-Z0-9.]+]]
 // CHECK2: invoke void @_ZN5test04BaseD2Ev
@@ -105,7 +105,7 @@ namespace test0 {
 
 // In C++11, the destructors are often known not to throw.
 // CHECK2v11-LABEL: @_ZN5test01AD1Ev ={{.*}} unnamed_addr alias {{.*}} @_ZN5test01AD2Ev
-// CHECK2v11-LABEL: define{{.*}} void @_ZN5test01AD2Ev(%"struct.test0::A"* {{[^,]*}} %this) unnamed_addr
+// CHECK2v11-LABEL: define{{.*}} void @_ZN5test01AD2Ev(ptr {{[^,]*}} %this) unnamed_addr
 // CHECK2v11: call void @_ZN5test06MemberD1Ev
 // CHECK2v11: call void @_ZN5test04BaseD2Ev
 
@@ -116,17 +116,17 @@ namespace test0 {
   B::~B() try { } catch (int i) {}
   // It will suppress the delegation optimization here, though.
 
-// CHECK2-LABEL: define{{.*}} void @_ZN5test01BD2Ev(%"struct.test0::B"* {{[^,]*}} %this, i8** noundef %vtt) unnamed_addr
+// CHECK2-LABEL: define{{.*}} void @_ZN5test01BD2Ev(ptr {{[^,]*}} %this, ptr noundef %vtt) unnamed_addr
 // CHECK2: invoke void @_ZN5test06MemberD1Ev
 // CHECK2:   unwind label [[MEM_UNWIND:%[a-zA-Z0-9.]+]]
 // CHECK2: invoke void @_ZN5test04BaseD2Ev
 // CHECK2:   unwind label [[BASE_UNWIND:%[a-zA-Z0-9.]+]]
 
-// CHECK2v11-LABEL: define{{.*}} void @_ZN5test01BD2Ev(%"struct.test0::B"* {{[^,]*}} %this, i8** noundef %vtt) unnamed_addr
+// CHECK2v11-LABEL: define{{.*}} void @_ZN5test01BD2Ev(ptr {{[^,]*}} %this, ptr noundef %vtt) unnamed_addr
 // CHECK2v11: call void @_ZN5test06MemberD1Ev
 // CHECK2v11: call void @_ZN5test04BaseD2Ev
 
-// CHECK2-LABEL: define{{.*}} void @_ZN5test01BD1Ev(%"struct.test0::B"* {{[^,]*}} %this) unnamed_addr
+// CHECK2-LABEL: define{{.*}} void @_ZN5test01BD1Ev(ptr {{[^,]*}} %this) unnamed_addr
 // CHECK2: invoke void @_ZN5test06MemberD1Ev
 // CHECK2:   unwind label [[MEM_UNWIND:%[a-zA-Z0-9.]+]]
 // CHECK2: invoke void @_ZN5test04BaseD2Ev
@@ -134,7 +134,7 @@ namespace test0 {
 // CHECK2: invoke void @_ZN5test05VBaseD2Ev
 // CHECK2:   unwind label [[VBASE_UNWIND:%[a-zA-Z0-9.]+]]
 
-// CHECK2v11-LABEL: define{{.*}} void @_ZN5test01BD1Ev(%"struct.test0::B"* {{[^,]*}} %this) unnamed_addr
+// CHECK2v11-LABEL: define{{.*}} void @_ZN5test01BD1Ev(ptr {{[^,]*}} %this) unnamed_addr
 // CHECK2v11: call void @_ZN5test06MemberD1Ev
 // CHECK2v11: call void @_ZN5test04BaseD2Ev
 // CHECK2v11: call void @_ZN5test05VBaseD2Ev
@@ -164,25 +164,25 @@ namespace test1 {
   // CHECK3: @_ZN5test11OD2Ev ={{.*}} unnamed_addr alias {{.*}} @_ZN5test11AD2Ev
 
   struct P : NonEmpty, A { ~P(); };
-  P::~P() {} // CHECK3-LABEL: define{{.*}} void @_ZN5test11PD2Ev(%"struct.test1::P"* {{[^,]*}} %this) unnamed_addr
+  P::~P() {} // CHECK3-LABEL: define{{.*}} void @_ZN5test11PD2Ev(ptr {{[^,]*}} %this) unnamed_addr
 
   struct Q : A, B { ~Q(); };
-  Q::~Q() {} // CHECK3-LABEL: define{{.*}} void @_ZN5test11QD2Ev(%"struct.test1::Q"* {{[^,]*}} %this) unnamed_addr
+  Q::~Q() {} // CHECK3-LABEL: define{{.*}} void @_ZN5test11QD2Ev(ptr {{[^,]*}} %this) unnamed_addr
 
   struct R : A { ~R(); };
-  R::~R() { A a; } // CHECK3-LABEL: define{{.*}} void @_ZN5test11RD2Ev(%"struct.test1::R"* {{[^,]*}} %this) unnamed_addr
+  R::~R() { A a; } // CHECK3-LABEL: define{{.*}} void @_ZN5test11RD2Ev(ptr {{[^,]*}} %this) unnamed_addr
 
   struct S : A { ~S(); int x; };
   S::~S() {}
-  // CHECK4: @_ZN5test11SD2Ev ={{.*}} unnamed_addr alias {{.*}}, bitcast {{.*}} @_ZN5test11AD2Ev
+  // CHECK4: @_ZN5test11SD2Ev ={{.*}} unnamed_addr alias {{.*}}, ptr @_ZN5test11AD2Ev
 
   struct T : A { ~T(); B x; };
-  T::~T() {} // CHECK4-LABEL: define{{.*}} void @_ZN5test11TD2Ev(%"struct.test1::T"* {{[^,]*}} %this) unnamed_addr
+  T::~T() {} // CHECK4-LABEL: define{{.*}} void @_ZN5test11TD2Ev(ptr {{[^,]*}} %this) unnamed_addr
 
   // The VTT parameter prevents this.  We could still make this work
   // for calling conventions that are safe against extra parameters.
   struct U : A, virtual B { ~U(); };
-  U::~U() {} // CHECK4-LABEL: define{{.*}} void @_ZN5test11UD2Ev(%"struct.test1::U"* {{[^,]*}} %this, i8** noundef %vtt) unnamed_addr
+  U::~U() {} // CHECK4-LABEL: define{{.*}} void @_ZN5test11UD2Ev(ptr {{[^,]*}} %this, ptr noundef %vtt) unnamed_addr
 }
 
 // PR6471
@@ -191,7 +191,7 @@ namespace test2 {
   struct B : A { ~B(); };
 
   B::~B() {}
-  // CHECK4-LABEL: define{{.*}} void @_ZN5test21BD2Ev(%"struct.test2::B"* {{[^,]*}} %this) unnamed_addr
+  // CHECK4-LABEL: define{{.*}} void @_ZN5test21BD2Ev(ptr {{[^,]*}} %this) unnamed_addr
   // CHECK4: call void @_ZN5test21AD2Ev
 }
 
@@ -208,52 +208,52 @@ namespace test3 {
     new D; // Force emission of D's vtable
   }
 
-  // CHECK4-LABEL: define internal void @_ZN5test312_GLOBAL__N_11CD2Ev(%"struct.test3::(anonymous namespace)::C"* {{[^,]*}} %this) unnamed_addr
+  // CHECK4-LABEL: define internal void @_ZN5test312_GLOBAL__N_11CD2Ev(ptr {{[^,]*}} %this) unnamed_addr
   // CHECK4v03: invoke void @_ZN5test31BD2Ev(
   // CHECK4v11: call   void @_ZN5test31BD2Ev(
   // CHECK4: call void @_ZN5test31AD2Ev(
   // CHECK4: ret void
 
-  // CHECK4-LABEL: define internal void @_ZN5test312_GLOBAL__N_11DD0Ev(%"struct.test3::(anonymous namespace)::D"* {{[^,]*}} %this) unnamed_addr
-  // CHECK4v03-SAME:  personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
-  // CHECK4v03: invoke void {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
-  // CHECK4v11: call   void {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
+  // CHECK4-LABEL: define internal void @_ZN5test312_GLOBAL__N_11DD0Ev(ptr {{[^,]*}} %this) unnamed_addr
+  // CHECK4v03-SAME:  personality ptr @__gxx_personality_v0
+  // CHECK4v03: invoke void @_ZN5test312_GLOBAL__N_11CD2Ev
+  // CHECK4v11: call   void @_ZN5test312_GLOBAL__N_11CD2Ev
   // CHECK4: call void @_ZdlPv({{.*}}) [[NUW:#[0-9]+]]
   // CHECK4: ret void
-  // CHECK4v03: landingpad { i8*, i32 }
+  // CHECK4v03: landingpad { ptr, i32 }
   // CHECK4v03-NEXT: cleanup
   // CHECK4v03: call void @_ZdlPv({{.*}}) [[NUW]]
-  // CHECK4v03: resume { i8*, i32 }
+  // CHECK4v03: resume { ptr, i32 }
   // CHECK4v11-NOT: landingpad
 
   // CHECK4-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11DD1Ev(
-  // CHECK4: getelementptr inbounds i8, i8* {{.*}}, i64 -8
-  // CHECK4: call void {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
+  // CHECK4: getelementptr inbounds i8, ptr {{.*}}, i64 -8
+  // CHECK4: call void @_ZN5test312_GLOBAL__N_11CD2Ev
   // CHECK4: ret void
 
   // CHECK4-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11DD0Ev(
-  // CHECK4: getelementptr inbounds i8, i8* {{.*}}, i64 -8
+  // CHECK4: getelementptr inbounds i8, ptr {{.*}}, i64 -8
   // CHECK4: call void @_ZN5test312_GLOBAL__N_11DD0Ev(
   // CHECK4: ret void
 
-  // CHECK4-LABEL: define internal void @_ZN5test312_GLOBAL__N_11CD0Ev(%"struct.test3::(anonymous namespace)::C"* {{[^,]*}} %this) unnamed_addr
-  // CHECK4v03-SAME:  personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+  // CHECK4-LABEL: define internal void @_ZN5test312_GLOBAL__N_11CD0Ev(ptr {{[^,]*}} %this) unnamed_addr
+  // CHECK4v03-SAME:  personality ptr @__gxx_personality_v0
   // CHECK4v03: invoke void @_ZN5test312_GLOBAL__N_11CD2Ev(
   // CHECK4v11: call   void @_ZN5test312_GLOBAL__N_11CD2Ev(
   // CHECK4: call void @_ZdlPv({{.*}}) [[NUW]]
   // CHECK4: ret void
-  // CHECK4v03: landingpad { i8*, i32 }
+  // CHECK4v03: landingpad { ptr, i32 }
   // CHECK4v03-NEXT: cleanup
   // CHECK4v03: call void @_ZdlPv({{.*}}) [[NUW]]
-  // CHECK4v03: resume { i8*, i32 }
+  // CHECK4v03: resume { ptr, i32 }
 
   // CHECK4-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11CD1Ev(
-  // CHECK4: getelementptr inbounds i8, i8* {{.*}}, i64 -8
+  // CHECK4: getelementptr inbounds i8, ptr {{.*}}, i64 -8
   // CHECK4: call void @_ZN5test312_GLOBAL__N_11CD2Ev(
   // CHECK4: ret void
 
   // CHECK4-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11CD0Ev(
-  // CHECK4: getelementptr inbounds i8, i8* {{.*}}, i64 -8
+  // CHECK4: getelementptr inbounds i8, ptr {{.*}}, i64 -8
   // CHECK4: call void @_ZN5test312_GLOBAL__N_11CD0Ev(
   // CHECK4: ret void
 
@@ -283,14 +283,14 @@ namespace test4 {
   // CHECK5:      [[X:%.*]] = alloca i32
   // CHECK5-NEXT: [[A:%.*]] = alloca
   // CHECK5:      br label
-  // CHECK5:      [[TMP:%.*]] = load i32, i32* [[X]]
+  // CHECK5:      [[TMP:%.*]] = load i32, ptr [[X]]
   // CHECK5-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP]], 0
   // CHECK5-NEXT: br i1
   // CHECK5:      call void @_ZN5test41AD1Ev(
   // CHECK5:      br label
-  // CHECK5:      [[TMP:%.*]] = load i32, i32* [[X]]
+  // CHECK5:      [[TMP:%.*]] = load i32, ptr [[X]]
   // CHECK5:      [[TMP2:%.*]] = add nsw i32 [[TMP]], -1
-  // CHECK5:      store i32 [[TMP2]], i32* [[X]]
+  // CHECK5:      store i32 [[TMP2]], ptr [[X]]
   // CHECK5:      br label
   // CHECK5:      ret void
   void bar(int x) {
@@ -306,28 +306,27 @@ namespace test5 {
 
   // CHECK5-LABEL: define{{.*}} void @_ZN5test53fooEv()
   // CHECK5:      [[ELEMS:%.*]] = alloca [5 x [[A:%.*]]], align
-  // CHECK5v03-NEXT: [[EXN:%.*]] = alloca i8*
+  // CHECK5v03-NEXT: [[EXN:%.*]] = alloca ptr
   // CHECK5v03-NEXT: [[SEL:%.*]] = alloca i32
-  // CHECK5-NEXT: [[PELEMS:%.*]] = bitcast [5 x [[A]]]* [[ELEMS]] to i8*
-  // CHECK5-NEXT: call void @llvm.lifetime.start.p0i8(i64 5, i8* [[PELEMS]])
-  // CHECK5-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x [[A]]], [5 x [[A]]]* [[ELEMS]], i32 0, i32 0
-  // CHECK5-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 5
+  // CHECK5-NEXT: call void @llvm.lifetime.start.p0(i64 5, ptr [[ELEMS]])
+  // CHECK5-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x [[A]]], ptr [[ELEMS]], i32 0, i32 0
+  // CHECK5-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], ptr [[BEGIN]], i64 5
   // CHECK5-NEXT: br label
-  // CHECK5:      [[POST:%.*]] = phi [[A]]* [ [[END]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
-  // CHECK5-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[POST]], i64 -1
-  // CHECK5v03-NEXT: invoke void @_ZN5test51AD1Ev([[A]]* {{[^,]*}} [[ELT]])
-  // CHECK5v11-NEXT: call   void @_ZN5test51AD1Ev([[A]]* {{[^,]*}} [[ELT]])
-  // CHECK5:      [[T0:%.*]] = icmp eq [[A]]* [[ELT]], [[BEGIN]]
+  // CHECK5:      [[POST:%.*]] = phi ptr [ [[END]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
+  // CHECK5-NEXT: [[ELT]] = getelementptr inbounds [[A]], ptr [[POST]], i64 -1
+  // CHECK5v03-NEXT: invoke void @_ZN5test51AD1Ev(ptr {{[^,]*}} [[ELT]])
+  // CHECK5v11-NEXT: call   void @_ZN5test51AD1Ev(ptr {{[^,]*}} [[ELT]])
+  // CHECK5:      [[T0:%.*]] = icmp eq ptr [[ELT]], [[BEGIN]]
   // CHECK5-NEXT: br i1 [[T0]],
   // CHECK5:      call void @llvm.lifetime.end
   // CHECK5-NEXT: ret void
   // lpad
-  // CHECK5v03:      [[EMPTY:%.*]] = icmp eq [[A]]* [[BEGIN]], [[ELT]]
+  // CHECK5v03:      [[EMPTY:%.*]] = icmp eq ptr [[BEGIN]], [[ELT]]
   // CHECK5v03-NEXT: br i1 [[EMPTY]]
-  // CHECK5v03:      [[AFTER:%.*]] = phi [[A]]* [ [[ELT]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
-  // CHECK5v03-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1
-  // CHECK5v03-NEXT: invoke void @_ZN5test51AD1Ev([[A]]* {{[^,]*}} [[CUR]])
-  // CHECK5v03:      [[DONE:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]]
+  // CHECK5v03:      [[AFTER:%.*]] = phi ptr [ [[ELT]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
+  // CHECK5v03-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]], ptr [[AFTER]], i64 -1
+  // CHECK5v03-NEXT: invoke void @_ZN5test51AD1Ev(ptr {{[^,]*}} [[CUR]])
+  // CHECK5v03:      [[DONE:%.*]] = icmp eq ptr [[CUR]], [[BEGIN]]
   // CHECK5v03-NEXT: br i1 [[DONE]],
   // CHECK5v11-NOT: landingpad
   // CHECK5v11:   }
@@ -349,7 +348,7 @@ namespace test6 {
   };
 
   C::C() { opaque(); }
-  // CHECK5-LABEL: define{{.*}} void @_ZN5test61CC1Ev(%"struct.test6::C"* {{[^,]*}} %this) unnamed_addr
+  // CHECK5-LABEL: define{{.*}} void @_ZN5test61CC1Ev(ptr {{[^,]*}} %this) unnamed_addr
   // CHECK5:   call void @_ZN5test61BILj2EEC2Ev
   // CHECK5:   invoke void @_ZN5test61BILj3EEC2Ev
   // CHECK5:   invoke void @_ZN5test61BILj0EEC2Ev
@@ -359,7 +358,7 @@ namespace test6 {
   // FIXME: way too much EH cleanup code follows
 
   C::~C() { opaque(); }
-  // CHECK5-LABEL: define{{.*}} void @_ZN5test61CD2Ev(%"struct.test6::C"* {{[^,]*}} %this, i8** noundef %vtt) unnamed_addr
+  // CHECK5-LABEL: define{{.*}} void @_ZN5test61CD2Ev(ptr {{[^,]*}} %this, ptr noundef %vtt) unnamed_addr
   // CHECK5:   invoke void @_ZN5test66opaqueEv
   // CHECK5v03:   invoke void @_ZN5test61AD1Ev
   // CHECK5v03:   invoke void @_ZN5test61AD1Ev
@@ -377,7 +376,7 @@ namespace test6 {
   // CHECK5v03:   invoke void @_ZN5test61BILj1EED2Ev
   // CHECK5v03:   invoke void @_ZN5test61BILj0EED2Ev
 
-  // CHECK5-LABEL: define{{.*}} void @_ZN5test61CD1Ev(%"struct.test6::C"* {{[^,]*}} %this) unnamed_addr
+  // CHECK5-LABEL: define{{.*}} void @_ZN5test61CD1Ev(ptr {{[^,]*}} %this) unnamed_addr
   // CHECK5v03:   invoke void @_ZN5test61CD2Ev
   // CHECK5v03:   invoke void @_ZN5test61BILj3EED2Ev
   // CHECK5v03:   call void @_ZN5test61BILj2EED2Ev
@@ -428,11 +427,11 @@ namespace test8 {
   // CHECK5-LABEL:    define{{.*}} void @_ZN5test84testEv()
   // CHECK5:      [[X:%.*]] = alloca [[A:%.*]], align 1
   // CHECK5-NEXT: [[Y:%.*]] = alloca [[A:%.*]], align 1
-  // CHECK5:      call void @_ZN5test81AC1Ev([[A]]* {{[^,]*}} [[X]])
+  // CHECK5:      call void @_ZN5test81AC1Ev(ptr {{[^,]*}} [[X]])
   // CHECK5-NEXT: br label
-  // CHECK5:      invoke void @_ZN5test81AC1Ev([[A]]* {{[^,]*}} [[Y]])
-  // CHECK5v03:   invoke void @_ZN5test81AD1Ev([[A]]* {{[^,]*}} [[Y]])
-  // CHECK5v11:   call   void @_ZN5test81AD1Ev([[A]]* {{[^,]*}} [[Y]])
+  // CHECK5:      invoke void @_ZN5test81AC1Ev(ptr {{[^,]*}} [[Y]])
+  // CHECK5v03:   invoke void @_ZN5test81AD1Ev(ptr {{[^,]*}} [[Y]])
+  // CHECK5v11:   call   void @_ZN5test81AD1Ev(ptr {{[^,]*}} [[Y]])
   // CHECK5-NOT:  switch
   // CHECK5:      invoke void @_ZN5test83dieEv()
   // CHECK5:      unreachable
@@ -450,7 +449,7 @@ namespace test9 {
     f1<int>();
     f2();
   }
-  // CHECK5: call void @_ZN5test97ArgTypeD1Ev(%"struct.test9::ArgType"* {{[^,]*}} %
+  // CHECK5: call void @_ZN5test97ArgTypeD1Ev(ptr {{[^,]*}} %
   // CHECK5: call void @_ZN5test92f2Ev()
 }
 
@@ -482,31 +481,25 @@ namespace test11 {
 // CHECK6: [[T3:%[a-z0-9]+]] = alloca %"struct.test11::S1"
 
 // CHECK6: {{^}}invoke.cont
-// CHECK6: call void @_ZN6test112S1D1Ev(%"struct.test11::S1"* {{[^,]*}} [[T1]])
-// CHECK6: [[BC1:%[a-z0-9]+]] = bitcast %"struct.test11::S1"* [[T1]] to i8*
-// CHECK6: call void @llvm.lifetime.end.p0i8(i64 32, i8* [[BC1]])
+// CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T1]])
+// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T1]])
 // CHECK6: {{^}}lpad
-// CHECK6: call void @_ZN6test112S1D1Ev(%"struct.test11::S1"* {{[^,]*}} [[T1]])
-// CHECK6: [[BC2:%[a-z0-9]+]] = bitcast %"struct.test11::S1"* [[T1]] to i8*
-// CHECK6: call void @llvm.lifetime.end.p0i8(i64 32, i8* [[BC2]])
+// CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T1]])
+// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T1]])
 
 // CHECK6: {{^}}invoke.cont
-// CHECK6: call void @_ZN6test112S1D1Ev(%"struct.test11::S1"* {{[^,]*}} [[T2]])
-// CHECK6: [[BC3:%[a-z0-9]+]] = bitcast %"struct.test11::S1"* [[T2]] to i8*
-// CHECK6: call void @llvm.lifetime.end.p0i8(i64 32, i8* [[BC3]])
+// CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T2]])
+// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T2]])
 // CHECK6: {{^}}lpad
-// CHECK6: call void @_ZN6test112S1D1Ev(%"struct.test11::S1"* {{[^,]*}} [[T2]])
-// CHECK6: [[BC4:%[a-z0-9]+]] = bitcast %"struct.test11::S1"* [[T2]] to i8*
-// CHECK6: call void @llvm.lifetime.end.p0i8(i64 32, i8* [[BC4]])
+// CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T2]])
+// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T2]])
 
 // CHECK6: {{^}}invoke.cont
-// CHECK6: call void @_ZN6test112S1D1Ev(%"struct.test11::S1"* {{[^,]*}} [[T3]])
-// CHECK6: [[BC5:%[a-z0-9]+]] = bitcast %"struct.test11::S1"* [[T3]] to i8*
-// CHECK6: call void @llvm.lifetime.end.p0i8(i64 32, i8* [[BC5]])
+// CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T3]])
+// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T3]])
 // CHECK6: {{^}}lpad
-// CHECK6: call void @_ZN6test112S1D1Ev(%"struct.test11::S1"* {{[^,]*}} [[T3]])
-// CHECK6: [[BC6:%[a-z0-9]+]] = bitcast %"struct.test11::S1"* [[T3]] to i8*
-// CHECK6: call void @llvm.lifetime.end.p0i8(i64 32, i8* [[BC6]])
+// CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T3]])
+// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T3]])
 
   struct S1 {
     ~S1();

diff  --git a/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp b/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
index 5b1b5a8bb3985..931b60db69d6c 100644
--- a/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
+++ b/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple i386-unknown-unknown -std=c++11 %s -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 %s -emit-llvm -o - | FileCheck %s
 
 namespace Test1 {
   struct A {
@@ -175,7 +175,7 @@ namespace Test8 {
   // CHECK-LABEL: define{{.*}} i32 @_ZN5Test84testEPNS_1CE
   int test(C *c) {
     // CHECK: %[[THIS:.*]] = phi
-    // CHECK-NEXT: call noundef i32 @_ZN5Test81B3fooEv(%"struct.Test8::B"* {{[^,]*}} %[[THIS]])
+    // CHECK-NEXT: call noundef i32 @_ZN5Test81B3fooEv(ptr {{[^,]*}} %[[THIS]])
     return static_cast<B*>(c)->foo();
   }
 }
@@ -216,9 +216,7 @@ namespace Test9 {
     // FIXME: It should be possible to devirtualize this case, but that is
     // not implemented yet.
     // CHECK: load
-    // CHECK: bitcast
-    // CHECK: [[F_PTR_RA:%.+]] = bitcast
-    // CHECK: [[VTABLE:%.+]] = load {{.+}} [[F_PTR_RA]]
+    // CHECK: [[VTABLE:%.+]] = load {{.+}}
     // CHECK: [[VFN:%.+]] = getelementptr inbounds {{.+}} [[VTABLE]], i{{[0-9]+}} 0
     // CHECK-NEXT: %[[FUNC:.*]] = load {{.+}} [[VFN]]
     // CHECK-NEXT: = call {{.*}} %[[FUNC]]
@@ -229,9 +227,7 @@ namespace Test9 {
     // FIXME: It should be possible to devirtualize this case, but that is
     // not implemented yet.
     // CHECK: load
-    // CHECK: bitcast
-    // CHECK: [[F_PTR_RA:%.+]] = bitcast
-    // CHECK: [[VTABLE:%.+]] = load {{.+}} [[F_PTR_RA]]
+    // CHECK: [[VTABLE:%.+]] = load {{.+}}
     // CHECK: [[VFN:%.+]] = getelementptr inbounds {{.+}} [[VTABLE]], i{{[0-9]+}} 1
     // CHECK-NEXT: %[[FUNC:.*]] = load {{.+}} [[VFN]]
     // CHECK-NEXT: = call {{.*}} %[[FUNC]]
@@ -305,11 +301,11 @@ namespace Test11 {
   // CHECK: call void @_ZN6Test111SIiE7DerivedclEv(
   // CHECK: call noundef zeroext i1 @_ZN6Test111SIiE7DerivedeqERKNS_4BaseE(
   // CHECK: call noundef zeroext i1 @_ZN6Test111SIiE7DerivedntEv(
-  // CHECK: call noundef nonnull align 4 dereferenceable(4) %"class.Test11::Base"* @_ZN6Test111SIiE7DerivedixEi(
+  // CHECK: call noundef nonnull align 4 dereferenceable(4) ptr @_ZN6Test111SIiE7DerivedixEi(
   // CHECK: define linkonce_odr void @_ZN6Test111SIiE7DerivedclEv(
   // CHECK: define linkonce_odr noundef zeroext i1 @_ZN6Test111SIiE7DerivedeqERKNS_4BaseE(
   // CHECK: define linkonce_odr noundef zeroext i1 @_ZN6Test111SIiE7DerivedntEv(
-  // CHECK: define linkonce_odr noundef nonnull align 4 dereferenceable(4) %"class.Test11::Base"* @_ZN6Test111SIiE7DerivedixEi(
+  // CHECK: define linkonce_odr noundef nonnull align 4 dereferenceable(4) ptr @_ZN6Test111SIiE7DerivedixEi(
   class Base {
   public:
     virtual void operator()() {}

diff  --git a/clang/test/CodeGenCXX/duplicate-mangled-name.cpp b/clang/test/CodeGenCXX/duplicate-mangled-name.cpp
index 9bacab7a98e38..53476f75654fa 100644
--- a/clang/test/CodeGenCXX/duplicate-mangled-name.cpp
+++ b/clang/test/CodeGenCXX/duplicate-mangled-name.cpp
@@ -1,7 +1,7 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST1
-// RUN: %clang_cc1 -no-opaque-pointers -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST2 -emit-llvm -o - | FileCheck %s
-// RUN: %clang_cc1 -no-opaque-pointers -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST3
-// RUN: %clang_cc1 -no-opaque-pointers -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST4
+// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST1
+// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST2 -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST3
+// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify -DTEST4
 
 #ifdef TEST1
 
@@ -38,9 +38,9 @@ namespace nm {
 
 float foo() {
   _ZN1TD1Ev();
-// CHECK: call void bitcast ({{.*}} (%struct.T*)* @_ZN1TD1Ev to void ()*)()
+// CHECK: call void @_ZN1TD1Ev()
   T t;
-// CHECK: call {{.*}} @_ZN1TD1Ev(%struct.T* {{[^,]*}} %t)
+// CHECK: call {{.*}} @_ZN1TD1Ev(ptr {{[^,]*}} %t)
   return _ZN2nm3abcE + nm::abc;
 }
 

diff  --git a/clang/test/CodeGenCXX/eh.cpp b/clang/test/CodeGenCXX/eh.cpp
index 23421c6bee261..da642a0ba042a 100644
--- a/clang/test/CodeGenCXX/eh.cpp
+++ b/clang/test/CodeGenCXX/eh.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -no-opaque-pointers -fcxx-exceptions -fexceptions -triple x86_64-apple-macosx10.13.99 -std=c++11 -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=UNALIGNED %s
-// RUN: %clang_cc1 -no-opaque-pointers -fcxx-exceptions -fexceptions -triple x86_64-apple-macosx10.14 -std=c++11 -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ALIGNED %s
+// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -triple x86_64-apple-macosx10.13.99 -std=c++11 -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=UNALIGNED %s
+// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -triple x86_64-apple-macosx10.14 -std=c++11 -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ALIGNED %s
 
 struct test1_D {
   double d;
@@ -10,12 +10,10 @@ void test1() {
 }
 
 // CHECK-LABEL:     define{{.*}} void @_Z5test1v()
-// CHECK:       [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 8)
-// CHECK-NEXT:  [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSTAR:%[^*]*\*]]
-// CHECK-NEXT:  [[EXN2:%.*]] = bitcast [[DSTAR]] [[EXN]] to i8*
-// UNALIGNED-NEXT:  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[EXN2]], i8* align 8 bitcast ([[DSTAR]] @d1 to i8*), i64 8, i1 false)
-// ALIGNED-NEXT:  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 [[EXN2]], i8* align 8 bitcast ([[DSTAR]] @d1 to i8*), i64 8, i1 false)
-// CHECK-NEXT:  call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({ i8*, i8* }* @_ZTI7test1_D to i8*), i8* null) [[NR:#[0-9]+]]
+// CHECK:       [[EXNOBJ:%.*]] = call ptr @__cxa_allocate_exception(i64 8)
+// UNALIGNED-NEXT:  call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[EXNOBJ]], ptr align 8 @d1, i64 8, i1 false)
+// ALIGNED-NEXT:  call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[EXNOBJ]], ptr align 8 @d1, i64 8, i1 false)
+// CHECK-NEXT:  call void @__cxa_throw(ptr [[EXNOBJ]], ptr @_ZTI7test1_D, ptr null) [[NR:#[0-9]+]]
 // CHECK-NEXT:  unreachable
 
 
@@ -31,14 +29,13 @@ void test2() {
 }
 
 // CHECK-LABEL:     define{{.*}} void @_Z5test2v()
-// CHECK:       [[EXNVAR:%.*]] = alloca i8*
+// CHECK:       [[EXNVAR:%.*]] = alloca ptr
 // CHECK-NEXT:  [[SELECTORVAR:%.*]] = alloca i32
-// CHECK-NEXT:  [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 16)
-// CHECK-NEXT:  [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSTAR:%[^*]*\*]]
-// CHECK-NEXT:  invoke void @_ZN7test2_DC1ERKS_([[DSTAR]] {{[^,]*}} [[EXN]], [[DSTAR]] noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @d2)
+// CHECK-NEXT:  [[EXNOBJ:%.*]] = call ptr @__cxa_allocate_exception(i64 16)
+// CHECK-NEXT:  invoke void @_ZN7test2_DC1ERKS_(ptr {{[^,]*}} [[EXNOBJ]], ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) @d2)
 // CHECK-NEXT:     to label %[[CONT:.*]] unwind label %{{.*}}
 //      :     [[CONT]]:   (can't check this in Release-Asserts builds)
-// CHECK:       call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{.*}}* @_ZTI7test2_D to i8*), i8* null) [[NR]]
+// CHECK:       call void @__cxa_throw(ptr [[EXNOBJ]], ptr @_ZTI7test2_D, ptr null) [[NR]]
 // CHECK-NEXT:  unreachable
 
 
@@ -53,10 +50,9 @@ void test3() {
 }
 
 // CHECK-LABEL:     define{{.*}} void @_Z5test3v()
-// CHECK:       [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 8)
-// CHECK-NEXT:  [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[D:%[^*]+]]**
-// CHECK-NEXT:  store [[D]]* null, [[D]]** [[EXN]]
-// CHECK-NEXT:  call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({ i8*, i8*, i32, i8* }* @_ZTIPV7test3_D to i8*), i8* null) [[NR]]
+// CHECK:       [[EXNOBJ:%.*]] = call ptr @__cxa_allocate_exception(i64 8)
+// CHECK-NEXT:  store ptr null, ptr [[EXNOBJ]]
+// CHECK-NEXT:  call void @__cxa_throw(ptr [[EXNOBJ]], ptr @_ZTIPV7test3_D, ptr null) [[NR]]
 // CHECK-NEXT:  unreachable
 
 
@@ -81,13 +77,12 @@ namespace test5 {
     try { throw A(); } catch (A &x) {}
   }
 // CHECK-LABEL:      define{{.*}} void @_ZN5test54testEv()
-// CHECK:      [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 1)
-// CHECK:      [[EXNCAST:%.*]] = bitcast i8* [[EXNOBJ]] to [[A:%[^*]*]]*
-// CHECK-NEXT: invoke void @_ZN5test51AC1Ev([[A]]* {{[^,]*}} [[EXNCAST]])
-// CHECK:      invoke void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{.*}}* @_ZTIN5test51AE to i8*), i8* bitcast (void ([[A]]*)* @_ZN5test51AD1Ev to i8*)) [[NR]]
+// CHECK:      [[EXNOBJ:%.*]] = call ptr @__cxa_allocate_exception(i64 1)
+// CHECK: invoke void @_ZN5test51AC1Ev(ptr {{[^,]*}} [[EXNOBJ]])
+// CHECK:      invoke void @__cxa_throw(ptr [[EXNOBJ]], ptr @_ZTIN5test51AE, ptr @_ZN5test51AD1Ev) [[NR]]
 // CHECK-NEXT:   to label {{%.*}} unwind label %[[HANDLER:[^ ]*]]
 //      :    [[HANDLER]]:  (can't check this in Release-Asserts builds)
-// CHECK:      {{%.*}} = call i32 @llvm.eh.typeid.for(i8* bitcast ({{.*}}* @_ZTIN5test51AE to i8*))
+// CHECK:      {{%.*}} = call i32 @llvm.eh.typeid.for(ptr @_ZTIN5test51AE)
 }
 
 namespace test6 {
@@ -103,52 +98,50 @@ namespace test6 {
 // PR7127
 namespace test7 {
 // CHECK-LABEL:      define{{.*}} i32 @_ZN5test73fooEv() 
-// CHECK-SAME:  personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+// CHECK-SAME:  personality ptr @__gxx_personality_v0
   int foo() {
-// CHECK:      [[CAUGHTEXNVAR:%.*]] = alloca i8*
+// CHECK:      [[CAUGHTEXNVAR:%.*]] = alloca ptr
 // CHECK-NEXT: [[SELECTORVAR:%.*]] = alloca i32
 // CHECK-NEXT: [[INTCATCHVAR:%.*]] = alloca i32
     try {
       try {
-// CHECK-NEXT: [[EXNALLOC:%.*]] = call i8* @__cxa_allocate_exception
-// CHECK-NEXT: bitcast i8* [[EXNALLOC]] to i32*
-// CHECK-NEXT: store i32 1, i32*
-// CHECK-NEXT: invoke void @__cxa_throw(i8* [[EXNALLOC]], i8* bitcast (i8** @_ZTIi to i8*), i8* null
+// CHECK-NEXT: [[EXNALLOC:%.*]] = call ptr @__cxa_allocate_exception
+// CHECK-NEXT: store i32 1, ptr
+// CHECK-NEXT: invoke void @__cxa_throw(ptr [[EXNALLOC]], ptr @_ZTIi, ptr null
         throw 1;
       }
 
-// CHECK:      [[CAUGHTVAL:%.*]] = landingpad { i8*, i32 }
-// CHECK-NEXT:   catch i8* bitcast (i8** @_ZTIi to i8*)
-// CHECK-NEXT:   catch i8* null
-// CHECK-NEXT: [[CAUGHTEXN:%.*]] = extractvalue { i8*, i32 } [[CAUGHTVAL]], 0
-// CHECK-NEXT: store i8* [[CAUGHTEXN]], i8** [[CAUGHTEXNVAR]]
-// CHECK-NEXT: [[SELECTOR:%.*]] = extractvalue { i8*, i32 } [[CAUGHTVAL]], 1
-// CHECK-NEXT: store i32 [[SELECTOR]], i32* [[SELECTORVAR]]
+// CHECK:      [[CAUGHTVAL:%.*]] = landingpad { ptr, i32 }
+// CHECK-NEXT:   catch ptr @_ZTIi
+// CHECK-NEXT:   catch ptr null
+// CHECK-NEXT: [[CAUGHTEXN:%.*]] = extractvalue { ptr, i32 } [[CAUGHTVAL]], 0
+// CHECK-NEXT: store ptr [[CAUGHTEXN]], ptr [[CAUGHTEXNVAR]]
+// CHECK-NEXT: [[SELECTOR:%.*]] = extractvalue { ptr, i32 } [[CAUGHTVAL]], 1
+// CHECK-NEXT: store i32 [[SELECTOR]], ptr [[SELECTORVAR]]
 // CHECK-NEXT: br label
-// CHECK:      [[SELECTOR:%.*]] = load i32, i32* [[SELECTORVAR]]
-// CHECK-NEXT: [[T0:%.*]] = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*))
+// CHECK:      [[SELECTOR:%.*]] = load i32, ptr [[SELECTORVAR]]
+// CHECK-NEXT: [[T0:%.*]] = call i32 @llvm.eh.typeid.for(ptr @_ZTIi)
 // CHECK-NEXT: icmp eq i32 [[SELECTOR]], [[T0]]
 // CHECK-NEXT: br i1
-// CHECK:      [[T0:%.*]] = load i8*, i8** [[CAUGHTEXNVAR]]
-// CHECK-NEXT: [[T1:%.*]] = call i8* @__cxa_begin_catch(i8* [[T0]])
-// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to i32*
-// CHECK-NEXT: [[T3:%.*]] = load i32, i32* [[T2]]
-// CHECK-NEXT: store i32 [[T3]], i32* {{%.*}}, align 4
+// CHECK:      [[T0:%.*]] = load ptr, ptr [[CAUGHTEXNVAR]]
+// CHECK-NEXT: [[T1:%.*]] = call ptr @__cxa_begin_catch(ptr [[T0]])
+// CHECK-NEXT: [[T3:%.*]] = load i32, ptr [[T1]]
+// CHECK-NEXT: store i32 [[T3]], ptr {{%.*}}, align 4
 // CHECK-NEXT: invoke void @__cxa_rethrow
       catch (int) {
         throw;
       }
     }
-// CHECK:      [[CAUGHTVAL:%.*]] = landingpad { i8*, i32 }
-// CHECK-NEXT:   catch i8* null
-// CHECK-NEXT: [[CAUGHTEXN:%.*]] = extractvalue { i8*, i32 } [[CAUGHTVAL]], 0
-// CHECK-NEXT: store i8* [[CAUGHTEXN]], i8** [[CAUGHTEXNVAR]]
-// CHECK-NEXT: [[SELECTOR:%.*]] = extractvalue { i8*, i32 } [[CAUGHTVAL]], 1
-// CHECK-NEXT: store i32 [[SELECTOR]], i32* [[SELECTORVAR]]
+// CHECK:      [[CAUGHTVAL:%.*]] = landingpad { ptr, i32 }
+// CHECK-NEXT:   catch ptr null
+// CHECK-NEXT: [[CAUGHTEXN:%.*]] = extractvalue { ptr, i32 } [[CAUGHTVAL]], 0
+// CHECK-NEXT: store ptr [[CAUGHTEXN]], ptr [[CAUGHTEXNVAR]]
+// CHECK-NEXT: [[SELECTOR:%.*]] = extractvalue { ptr, i32 } [[CAUGHTVAL]], 1
+// CHECK-NEXT: store i32 [[SELECTOR]], ptr [[SELECTORVAR]]
 // CHECK-NEXT: call void @__cxa_end_catch()
 // CHECK-NEXT: br label
-// CHECK:      load i8*, i8** [[CAUGHTEXNVAR]]
-// CHECK-NEXT: call i8* @__cxa_begin_catch
+// CHECK:      load ptr, ptr [[CAUGHTEXNVAR]]
+// CHECK-NEXT: call ptr @__cxa_begin_catch
 // CHECK-NEXT: call void @__cxa_end_catch
     catch (...) {
     }
@@ -168,10 +161,9 @@ namespace test8 {
       // CHECK:      invoke void @_ZN5test83barEv()
       bar();
     } catch (A a) {
-      // CHECK:      call i8* @__cxa_get_exception_ptr
-      // CHECK-NEXT: bitcast
+      // CHECK:      call ptr @__cxa_get_exception_ptr
       // CHECK-NEXT: invoke void @_ZN5test81AC1ERKS0_(
-      // CHECK:      call i8* @__cxa_begin_catch
+      // CHECK:      call ptr @__cxa_begin_catch
       // CHECK-NEXT: call void @_ZN5test81AD1Ev(
       // CHECK:      call void @__cxa_end_catch()
       // CHECK:      ret void
@@ -187,20 +179,20 @@ namespace test9 {
   struct A { A(); };
 
 
-  // CHECK-LABEL: define{{.*}} void @_ZN5test91AC2Ev(%"struct.test9::A"* {{[^,]*}} %this) unnamed_addr
-  // CHECK-SAME:  personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+  // CHECK-LABEL: define{{.*}} void @_ZN5test91AC2Ev(ptr {{[^,]*}} %this) unnamed_addr
+  // CHECK-SAME:  personality ptr @__gxx_personality_v0
   A::A() try {
   // CHECK:      invoke void @_ZN5test96opaqueEv()
     opaque();
   } catch (int x) {
-  // CHECK:      landingpad { i8*, i32 }
-  // CHECK-NEXT:   catch i8* bitcast (i8** @_ZTIi to i8*)
+  // CHECK:      landingpad { ptr, i32 }
+  // CHECK-NEXT:   catch ptr @_ZTIi
 
-  // CHECK:      call i8* @__cxa_begin_catch
+  // CHECK:      call ptr @__cxa_begin_catch
   // CHECK:      invoke void @_ZN5test96opaqueEv()
   // CHECK:      invoke void @__cxa_rethrow()
 
-  // CHECK-LABEL:      define{{.*}} void @_ZN5test91AC1Ev(%"struct.test9::A"* {{[^,]*}} %this) unnamed_addr
+  // CHECK-LABEL:      define{{.*}} void @_ZN5test91AC1Ev(ptr {{[^,]*}} %this) unnamed_addr
   // CHECK:      call void @_ZN5test91AC2Ev
   // CHECK-NEXT: ret void
     opaque();
@@ -222,20 +214,16 @@ namespace test10 {
     // CHECK:      invoke void @_ZN6test106opaqueEv()
       opaque();
     } catch (int i) {
-    // CHECK:      call i8* @__cxa_begin_catch
-    // CHECK-NEXT: bitcast
-    // CHECK-NEXT: load i32, i32*
+    // CHECK:      call ptr @__cxa_begin_catch
+    // CHECK-NEXT: load i32, ptr
     // CHECK-NEXT: store i32
     // CHECK-NEXT: call void @__cxa_end_catch() [[NUW:#[0-9]+]]
     } catch (B a) {
-    // CHECK:      call i8* @__cxa_begin_catch
-    // CHECK-NEXT: bitcast
-    // CHECK-NEXT: bitcast
-    // CHECK-NEXT: bitcast
+    // CHECK:      call ptr @__cxa_begin_catch
     // CHECK-NEXT: call void @llvm.memcpy
     // CHECK-NEXT: invoke void @__cxa_end_catch()
     } catch (...) {
-    // CHECK:      call i8* @__cxa_begin_catch
+    // CHECK:      call ptr @__cxa_begin_catch
     // CHECK-NEXT: invoke void @__cxa_end_catch()
     }
 
@@ -254,11 +242,10 @@ namespace test11 {
       // CHECK:      invoke void @_ZN6test116opaqueEv()
       opaque();
     } catch (int**&p) {
-      // CHECK:      [[EXN:%.*]] = load i8*, i8**
-      // CHECK-NEXT: call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]]
-      // CHECK-NEXT: [[ADJ1:%.*]] = getelementptr i8, i8* [[EXN]], i32 32
-      // CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to i32***
-      // CHECK-NEXT: store i32*** [[ADJ2]], i32**** [[P:%.*]]
+      // CHECK:      [[EXN:%.*]] = load ptr, ptr
+      // CHECK-NEXT: call ptr @__cxa_begin_catch(ptr [[EXN]]) [[NUW]]
+      // CHECK-NEXT: [[ADJ1:%.*]] = getelementptr i8, ptr [[EXN]], i32 32
+      // CHECK-NEXT: store ptr [[ADJ1]], ptr [[P:%.*]]
       // CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]
     }
   }
@@ -268,18 +255,17 @@ namespace test11 {
   // CHECK-LABEL: define{{.*}} void @_ZN6test113barEv()
   void bar() {
     try {
-      // CHECK:      [[EXNSLOT:%.*]] = alloca i8*
+      // CHECK:      [[EXNSLOT:%.*]] = alloca ptr
       // CHECK-NEXT: [[SELECTORSLOT:%.*]] = alloca i32
-      // CHECK-NEXT: [[P:%.*]] = alloca [[A:%.*]]**,
-      // CHECK-NEXT: [[TMP:%.*]] = alloca [[A]]*
+      // CHECK-NEXT: [[P:%.*]] = alloca ptr,
+      // CHECK-NEXT: [[TMP:%.*]] = alloca ptr
       // CHECK-NEXT: invoke void @_ZN6test116opaqueEv()
       opaque();
     } catch (A*&p) {
-      // CHECK:      [[EXN:%.*]] = load i8*, i8** [[EXNSLOT]]
-      // CHECK-NEXT: [[ADJ1:%.*]] = call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]]
-      // CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to [[A]]*
-      // CHECK-NEXT: store [[A]]* [[ADJ2]], [[A]]** [[TMP]]
-      // CHECK-NEXT: store [[A]]** [[TMP]], [[A]]*** [[P]]
+      // CHECK:      [[EXN:%.*]] = load ptr, ptr [[EXNSLOT]]
+      // CHECK-NEXT: [[ADJ1:%.*]] = call ptr @__cxa_begin_catch(ptr [[EXN]]) [[NUW]]
+      // CHECK-NEXT: store ptr [[ADJ1]], ptr [[TMP]]
+      // CHECK-NEXT: store ptr [[TMP]], ptr [[P]]
       // CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]
     }
   }
@@ -294,7 +280,7 @@ namespace test12 {
   void test() {
     // CHECK: [[X:%.*]] = alloca [[A:%.*]],
     // CHECK: [[EHCLEANUPDEST:%.*]] = alloca i32
-    // CHECK: [[Y:%.*]] = alloca [[A]]
+    // CHECK: [[Y:%.*]] = alloca [[A:%.*]]
     // CHECK: [[Z:%.*]] = alloca [[A]]
     // CHECK: [[CLEANUPDEST:%.*]] = alloca i32
 
@@ -304,8 +290,8 @@ namespace test12 {
       A y;
       A z;
 
-      // CHECK: invoke void @_ZN6test121AD1Ev([[A]]* {{[^,]*}} [[Z]])
-      // CHECK: invoke void @_ZN6test121AD1Ev([[A]]* {{[^,]*}} [[Y]])
+      // CHECK: invoke void @_ZN6test121AD1Ev(ptr {{[^,]*}} [[Z]])
+      // CHECK: invoke void @_ZN6test121AD1Ev(ptr {{[^,]*}} [[Y]])
       // CHECK-NOT: switch
       goto success;
     }
@@ -313,7 +299,7 @@ namespace test12 {
   success:
     bool _ = true;
 
-    // CHECK: call void @_ZN6test121AD1Ev([[A]]* {{[^,]*}} [[X]])
+    // CHECK: call void @_ZN6test121AD1Ev(ptr {{[^,]*}} [[X]])
     // CHECK-NEXT: ret void
   }
 }
@@ -381,13 +367,13 @@ namespace test15 {
 
     try {
       // CHECK:      [[X:%.*]] = alloca i32
-      // CHECK:      store i32 10, i32* [[X]]
+      // CHECK:      store i32 10, ptr [[X]]
       // CHECK-NEXT: br label
       //   -> while.cond
       int x = 10;
 
       while (true) {
-        // CHECK:      load i32, i32* [[X]]
+        // CHECK:      load i32, ptr [[X]]
         // CHECK-NEXT: [[COND:%.*]] = invoke noundef zeroext i1 @_ZN6test156opaqueEi
         // CHECK:      br i1 [[COND]]
         if (opaque(x))
@@ -411,40 +397,39 @@ namespace test16 {
 
   // CHECK-LABEL: define{{.*}} void @_ZN6test163barEv()
   void bar() {
-    // CHECK:      [[EXN_SAVE:%.*]] = alloca i8*
+    // CHECK:      [[EXN_SAVE:%.*]] = alloca ptr
     // CHECK-NEXT: [[EXN_ACTIVE:%.*]] = alloca i1
     // CHECK-NEXT: [[TEMP:%.*]] = alloca [[A:%.*]],
-    // CHECK-NEXT: [[EXNSLOT:%.*]] = alloca i8*
+    // CHECK-NEXT: [[EXNSLOT:%.*]] = alloca ptr
     // CHECK-NEXT: [[SELECTORSLOT:%.*]] = alloca i32
     // CHECK-NEXT: [[TEMP_ACTIVE:%.*]] = alloca i1
 
     cond() ? throw B(A()) : foo();
 
     // CHECK-NEXT: [[COND:%.*]] = call noundef zeroext i1 @_ZN6test164condEv()
-    // CHECK-NEXT: store i1 false, i1* [[EXN_ACTIVE]]
-    // CHECK-NEXT: store i1 false, i1* [[TEMP_ACTIVE]]
+    // CHECK-NEXT: store i1 false, ptr [[EXN_ACTIVE]]
+    // CHECK-NEXT: store i1 false, ptr [[TEMP_ACTIVE]]
     // CHECK-NEXT: br i1 [[COND]],
 
-    // CHECK:      [[EXN:%.*]] = call i8* @__cxa_allocate_exception(i64 4)
-    // CHECK-NEXT: store i8* [[EXN]], i8** [[EXN_SAVE]]
-    // CHECK-NEXT: store i1 true, i1* [[EXN_ACTIVE]]
-    // CHECK-NEXT: [[T0:%.*]] = bitcast i8* [[EXN]] to [[B:%.*]]*
-    // CHECK-NEXT: invoke void @_ZN6test161AC1Ev([[A]]* {{[^,]*}} [[TEMP]])
-    // CHECK:      store i1 true, i1* [[TEMP_ACTIVE]]
-    // CHECK-NEXT: invoke void @_ZN6test161BC1ERKNS_1AE([[B]]* {{[^,]*}} [[T0]], [[A]]* noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[TEMP]])
-    // CHECK:      store i1 false, i1* [[EXN_ACTIVE]]
-    // CHECK-NEXT: invoke void @__cxa_throw(i8* [[EXN]],
+    // CHECK:      [[EXN:%.*]] = call ptr @__cxa_allocate_exception(i64 4)
+    // CHECK-NEXT: store ptr [[EXN]], ptr [[EXN_SAVE]]
+    // CHECK-NEXT: store i1 true, ptr [[EXN_ACTIVE]]
+    // CHECK-NEXT: invoke void @_ZN6test161AC1Ev(ptr {{[^,]*}} [[TEMP]])
+    // CHECK:      store i1 true, ptr [[TEMP_ACTIVE]]
+    // CHECK-NEXT: invoke void @_ZN6test161BC1ERKNS_1AE(ptr {{[^,]*}} [[EXN]], ptr noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[TEMP]])
+    // CHECK:      store i1 false, ptr [[EXN_ACTIVE]]
+    // CHECK-NEXT: invoke void @__cxa_throw(ptr [[EXN]],
 
     // CHECK:      invoke void @_ZN6test163fooEv()
     // CHECK:      br label
 
-    // CHECK:      invoke void @_ZN6test161AD1Ev([[A]]* {{[^,]*}} [[TEMP]])
+    // CHECK:      invoke void @_ZN6test161AD1Ev(ptr {{[^,]*}} [[TEMP]])
     // CHECK:      ret void
 
-    // CHECK:      [[T0:%.*]] = load i1, i1* [[EXN_ACTIVE]]
+    // CHECK:      [[T0:%.*]] = load i1, ptr [[EXN_ACTIVE]]
     // CHECK-NEXT: br i1 [[T0]]
-    // CHECK:      [[T1:%.*]] = load i8*, i8** [[EXN_SAVE]]
-    // CHECK-NEXT: call void @__cxa_free_exception(i8* [[T1]])
+    // CHECK:      [[T1:%.*]] = load ptr, ptr [[EXN_SAVE]]
+    // CHECK-NEXT: call void @__cxa_free_exception(ptr [[T1]])
     // CHECK-NEXT: br label
   }
 }
@@ -464,11 +449,9 @@ int foo() {
   throw DerivedException();
   // The alignment passed to memset is 16 on Darwin.
 
-  // CHECK: [[T0:%.*]] = call i8* @__cxa_allocate_exception(i64 16)
-  // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to %"class.test17::DerivedException"*
-  // CHECK-NEXT: [[T2:%.*]] = bitcast %"class.test17::DerivedException"* [[T1]] to i8*
-  // UNALIGNED-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[T2]], i8 0, i64 16, i1 false)
-  // ALIGNED-NEXT: call void @llvm.memset.p0i8.i64(i8* align 16 [[T2]], i8 0, i64 16, i1 false)
+  // CHECK: [[T0:%.*]] = call ptr @__cxa_allocate_exception(i64 16)
+  // UNALIGNED-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[T0]], i8 0, i64 16, i1 false)
+  // ALIGNED-NEXT: call void @llvm.memset.p0.i64(ptr align 16 [[T0]], i8 0, i64 16, i1 false)
 }
 }
 

diff  --git a/clang/test/CodeGenCXX/exceptions.cpp b/clang/test/CodeGenCXX/exceptions.cpp
index 0073367a056aa..72ee4f388e27a 100644
--- a/clang/test/CodeGenCXX/exceptions.cpp
+++ b/clang/test/CodeGenCXX/exceptions.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu -emit-llvm -std=c++98 -o - -fcxx-exceptions -fexceptions | FileCheck -check-prefix=CHECK -check-prefix=CHECK98 %s
-// RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu -emit-llvm -std=c++11 -o - -fcxx-exceptions -fexceptions | FileCheck -check-prefix=CHECK -check-prefix=CHECK11 %s
+// RUN: %clang_cc1 -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu -emit-llvm -std=c++98 -o - -fcxx-exceptions -fexceptions | FileCheck -check-prefix=CHECK -check-prefix=CHECK98 %s
+// RUN: %clang_cc1 -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu -emit-llvm -std=c++11 -o - -fcxx-exceptions -fexceptions | FileCheck -check-prefix=CHECK -check-prefix=CHECK11 %s
 
 // CHECK: %[[STRUCT_TEST13_A:.*]] = type { i32, i32 }
 
@@ -32,23 +32,21 @@ namespace test1 {
   struct A { A(int); A(int, int); ~A(); void *p; };
 
   A *a() {
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test11aEv()
-    // CHECK:      [[NEW:%.*]] = call noalias nonnull i8* @_Znwm(i64 8)
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
-    // CHECK-NEXT: invoke void @_ZN5test11AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 5)
-    // CHECK:      ret [[A]]* [[CAST]]
-    // CHECK:      call void @_ZdlPv(i8* [[NEW]])
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test11aEv()
+    // CHECK:      [[NEW:%.*]] = call noalias nonnull ptr @_Znwm(i64 8)
+    // CHECK-NEXT: invoke void @_ZN5test11AC1Ei(ptr {{[^,]*}} [[NEW]], i32 5)
+    // CHECK:      ret ptr [[NEW]]
+    // CHECK:      call void @_ZdlPv(ptr [[NEW]])
     return new A(5);
   }
 
   A *b() {
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test11bEv()
-    // CHECK:      [[NEW:%.*]] = call noalias nonnull i8* @_Znwm(i64 8)
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test11bEv()
+    // CHECK:      [[NEW:%.*]] = call noalias nonnull ptr @_Znwm(i64 8)
     // CHECK-NEXT: [[FOO:%.*]] = invoke i32 @_ZN5test13fooEv()
-    // CHECK:      invoke void @_ZN5test11AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 [[FOO]])
-    // CHECK:      ret [[A]]* [[CAST]]
-    // CHECK:      call void @_ZdlPv(i8* [[NEW]])
+    // CHECK:      invoke void @_ZN5test11AC1Ei(ptr {{[^,]*}} [[NEW]], i32 [[FOO]])
+    // CHECK:      ret ptr [[NEW]]
+    // CHECK:      call void @_ZdlPv(ptr [[NEW]])
     extern int foo();
     return new A(foo());
   }
@@ -57,78 +55,75 @@ namespace test1 {
   B makeB();
 
   A *c() {
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test11cEv()
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test11cEv()
     // CHECK:      [[ACTIVE:%.*]] = alloca i1
-    // CHECK-NEXT: [[NEW:%.*]] = call noalias nonnull i8* @_Znwm(i64 8)
-    // CHECK-NEXT: store i1 true, i1* [[ACTIVE]]
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
-    // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* {{[^,]*}} [[T0:%.*]])
-    // CHECK:      [[T1:%.*]] = getelementptr inbounds [[B]], [[B]]* [[T0]], i32 0, i32 0
-    // CHECK-NEXT: [[T2:%.*]] = load i32, i32* [[T1]], align 4
-    // CHECK-NEXT: invoke void @_ZN5test11AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 [[T2]])
-    // CHECK:      store i1 false, i1* [[ACTIVE]]
-
-    // CHECK98-NEXT: invoke void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T0]])
-    // CHECK11-NEXT: call void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T0]])
-
-    // CHECK:      ret [[A]]* [[CAST]]
-    // CHECK:      [[ISACTIVE:%.*]] = load i1, i1* [[ACTIVE]]
+    // CHECK-NEXT: [[NEW:%.*]] = call noalias nonnull ptr @_Znwm(i64 8)
+    // CHECK-NEXT: store i1 true, ptr [[ACTIVE]]
+    // CHECK-NEXT: invoke void @_ZN5test11BC1Ev(ptr {{[^,]*}} [[T0:%.*]])
+    // CHECK:      [[T1:%.*]] = getelementptr inbounds [[B:%.*]], ptr [[T0]], i32 0, i32 0
+    // CHECK-NEXT: [[T2:%.*]] = load i32, ptr [[T1]], align 4
+    // CHECK-NEXT: invoke void @_ZN5test11AC1Ei(ptr {{[^,]*}} [[NEW]], i32 [[T2]])
+    // CHECK:      store i1 false, ptr [[ACTIVE]]
+
+    // CHECK98-NEXT: invoke void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T0]])
+    // CHECK11-NEXT: call void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T0]])
+
+    // CHECK:      ret ptr [[NEW]]
+    // CHECK:      [[ISACTIVE:%.*]] = load i1, ptr [[ACTIVE]]
     // CHECK-NEXT: br i1 [[ISACTIVE]]
-    // CHECK:      call void @_ZdlPv(i8* [[NEW]])
+    // CHECK:      call void @_ZdlPv(ptr [[NEW]])
     return new A(B().x);
   }
 
   //   rdar://11904428
   //   Terminate landing pads should call __cxa_begin_catch first.
-  // CHECK98:      define linkonce_odr hidden void @__clang_call_terminate(i8* %0) [[NI_NR_NUW:#[0-9]+]] comdat
-  // CHECK98-NEXT:   [[T0:%.*]] = call i8* @__cxa_begin_catch(i8* %0) [[NUW:#[0-9]+]]
+  // CHECK98:      define linkonce_odr hidden void @__clang_call_terminate(ptr %0) [[NI_NR_NUW:#[0-9]+]] comdat
+  // CHECK98-NEXT:   [[T0:%.*]] = call ptr @__cxa_begin_catch(ptr %0) [[NUW:#[0-9]+]]
   // CHECK98-NEXT:   call void @_ZSt9terminatev() [[NR_NUW:#[0-9]+]]
   // CHECK98-NEXT:   unreachable
 
   A *d() {
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test11dEv()
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test11dEv()
     // CHECK:      [[ACTIVE:%.*]] = alloca i1
-    // CHECK-NEXT: [[NEW:%.*]] = call noalias nonnull i8* @_Znwm(i64 8)
-    // CHECK-NEXT: store i1 true, i1* [[ACTIVE]]
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
-    // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* {{[^,]*}} [[T0:%.*]])
-    // CHECK:      [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* {{[^,]*}} [[T0]])
-    // CHECK:      invoke void @_ZN5test11AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 [[T1]])
-    // CHECK:      store i1 false, i1* [[ACTIVE]]
-
-    // CHECK98-NEXT: invoke void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T0]])
-    // CHECK11-NEXT: call void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T0]])
-
-    // CHECK:      ret [[A]]* [[CAST]]
-    // CHECK:      [[ISACTIVE:%.*]] = load i1, i1* [[ACTIVE]]
+    // CHECK-NEXT: [[NEW:%.*]] = call noalias nonnull ptr @_Znwm(i64 8)
+    // CHECK-NEXT: store i1 true, ptr [[ACTIVE]]
+    // CHECK-NEXT: invoke void @_ZN5test11BC1Ev(ptr {{[^,]*}} [[T0:%.*]])
+    // CHECK:      [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv(ptr {{[^,]*}} [[T0]])
+    // CHECK:      invoke void @_ZN5test11AC1Ei(ptr {{[^,]*}} [[NEW]], i32 [[T1]])
+    // CHECK:      store i1 false, ptr [[ACTIVE]]
+
+    // CHECK98-NEXT: invoke void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T0]])
+    // CHECK11-NEXT: call void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T0]])
+
+    // CHECK:      ret ptr [[NEW]]
+    // CHECK:      [[ISACTIVE:%.*]] = load i1, ptr [[ACTIVE]]
     // CHECK-NEXT: br i1 [[ISACTIVE]]
-    // CHECK:      call void @_ZdlPv(i8* [[NEW]])
+    // CHECK:      call void @_ZdlPv(ptr [[NEW]])
     return new A(B());
   }
 
   A *e() {
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test11eEv()
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test11eEv()
     // CHECK:      [[ACTIVE:%.*]] = alloca i1
-    // CHECK-NEXT: [[NEW:%.*]] = call noalias nonnull i8* @_Znwm(i64 8)
-    // CHECK-NEXT: store i1 true, i1* [[ACTIVE]]
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
-    // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* {{[^,]*}} [[T0:%.*]])
-    // CHECK:      [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* {{[^,]*}} [[T0]])
-    // CHECK:      invoke void @_ZN5test11BC1Ev([[B]]* {{[^,]*}} [[T2:%.*]])
-    // CHECK:      [[T3:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* {{[^,]*}} [[T2]])
-    // CHECK:      invoke void @_ZN5test11AC1Eii([[A]]* {{[^,]*}} [[CAST]], i32 [[T1]], i32 [[T3]])
-    // CHECK:      store i1 false, i1* [[ACTIVE]]
-
-    // CHECK98-NEXT: invoke void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T2]])
-    // CHECK11-NEXT: call void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T2]])
-
-    // CHECK98:      invoke void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T0]])
-    // CHECK11:      call void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T0]])
-
-    // CHECK:      ret [[A]]* [[CAST]]
-    // CHECK:      [[ISACTIVE:%.*]] = load i1, i1* [[ACTIVE]]
+    // CHECK-NEXT: [[NEW:%.*]] = call noalias nonnull ptr @_Znwm(i64 8)
+    // CHECK-NEXT: store i1 true, ptr [[ACTIVE]]
+    // CHECK-NEXT: invoke void @_ZN5test11BC1Ev(ptr {{[^,]*}} [[T0:%.*]])
+    // CHECK:      [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv(ptr {{[^,]*}} [[T0]])
+    // CHECK:      invoke void @_ZN5test11BC1Ev(ptr {{[^,]*}} [[T2:%.*]])
+    // CHECK:      [[T3:%.*]] = invoke i32 @_ZN5test11BcviEv(ptr {{[^,]*}} [[T2]])
+    // CHECK:      invoke void @_ZN5test11AC1Eii(ptr {{[^,]*}} [[NEW]], i32 [[T1]], i32 [[T3]])
+    // CHECK:      store i1 false, ptr [[ACTIVE]]
+
+    // CHECK98-NEXT: invoke void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T2]])
+    // CHECK11-NEXT: call void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T2]])
+
+    // CHECK98:      invoke void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T0]])
+    // CHECK11:      call void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T0]])
+
+    // CHECK:      ret ptr [[NEW]]
+    // CHECK:      [[ISACTIVE:%.*]] = load i1, ptr [[ACTIVE]]
     // CHECK-NEXT: br i1 [[ISACTIVE]]
-    // CHECK:      call void @_ZdlPv(i8* [[NEW]])
+    // CHECK:      call void @_ZdlPv(ptr [[NEW]])
     return new A(B(), B());
   }
   A *f() {
@@ -142,30 +137,29 @@ namespace test1 {
   }
 
   A *i() {
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test11iEv()
-    // CHECK:      [[X:%.*]] = alloca [[A]]*, align 8
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test11iEv()
+    // CHECK:      [[X:%.*]] = alloca ptr, align 8
     // CHECK:      [[ACTIVE:%.*]] = alloca i1
-    // CHECK:      [[NEW:%.*]] = call noalias nonnull i8* @_Znwm(i64 8)
-    // CHECK-NEXT: store i1 true, i1* [[ACTIVE]]
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
-    // CHECK-NEXT: invoke void @_ZN5test15makeBEv([[B:%.*]]* sret([[B]]) align 4 [[T0:%.*]])
-    // CHECK:      [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* {{[^,]*}} [[T0]])
-    // CHECK:      invoke void @_ZN5test11AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 [[T1]])
-    // CHECK:      store i1 false, i1* [[ACTIVE]]
-    // CHECK-NEXT: store [[A]]* [[CAST]], [[A]]** [[X]], align 8
-    // CHECK:      invoke void @_ZN5test15makeBEv([[B:%.*]]* sret([[B]]) align 4 [[T2:%.*]])
-    // CHECK:      [[RET:%.*]] = load [[A]]*, [[A]]** [[X]], align 8
-
-    // CHECK98:      invoke void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T2]])
-    // CHECK11:      call void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T2]])
-
-    // CHECK98:      invoke void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T0]])
-    // CHECK11:      call void @_ZN5test11BD1Ev([[B]]* {{[^,]*}} [[T0]])
-
-    // CHECK:      ret [[A]]* [[RET]]
-    // CHECK:      [[ISACTIVE:%.*]] = load i1, i1* [[ACTIVE]]
+    // CHECK:      [[NEW:%.*]] = call noalias nonnull ptr @_Znwm(i64 8)
+    // CHECK-NEXT: store i1 true, ptr [[ACTIVE]]
+    // CHECK-NEXT: invoke void @_ZN5test15makeBEv(ptr sret([[B:%.*]]) align 4 [[T0:%.*]])
+    // CHECK:      [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv(ptr {{[^,]*}} [[T0]])
+    // CHECK:      invoke void @_ZN5test11AC1Ei(ptr {{[^,]*}} [[NEW]], i32 [[T1]])
+    // CHECK:      store i1 false, ptr [[ACTIVE]]
+    // CHECK-NEXT: store ptr [[NEW]], ptr [[X]], align 8
+    // CHECK:      invoke void @_ZN5test15makeBEv(ptr sret([[B:%.*]]) align 4 [[T2:%.*]])
+    // CHECK:      [[RET:%.*]] = load ptr, ptr [[X]], align 8
+
+    // CHECK98:      invoke void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T2]])
+    // CHECK11:      call void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T2]])
+
+    // CHECK98:      invoke void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T0]])
+    // CHECK11:      call void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[T0]])
+
+    // CHECK:      ret ptr [[RET]]
+    // CHECK:      [[ISACTIVE:%.*]] = load i1, ptr [[ACTIVE]]
     // CHECK-NEXT: br i1 [[ISACTIVE]]
-    // CHECK:      call void @_ZdlPv(i8* [[NEW]])
+    // CHECK:      call void @_ZdlPv(ptr [[NEW]])
     A *x;
     return (x = new A(makeB()), makeB(), x);
   }
@@ -180,16 +174,15 @@ namespace test2 {
   };
 
   A *a() {
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test21aEv()
-    // CHECK:      [[NEW:%.*]] = call i8* @_ZN5test21AnwEm(i64 8)
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
-    // CHECK-NEXT: invoke void @_ZN5test21AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 5)
-    // CHECK:      ret [[A]]* [[CAST]]
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test21aEv()
+    // CHECK:      [[NEW:%.*]] = call ptr @_ZN5test21AnwEm(i64 8)
+    // CHECK-NEXT: invoke void @_ZN5test21AC1Ei(ptr {{[^,]*}} [[NEW]], i32 5)
+    // CHECK:      ret ptr [[NEW]]
 
-    // CHECK98:      invoke void @_ZN5test21AdlEPvm(i8* [[NEW]], i64 8)
-    // CHECK11:      call void @_ZN5test21AdlEPvm(i8* [[NEW]], i64 8)
+    // CHECK98:      invoke void @_ZN5test21AdlEPvm(ptr [[NEW]], i64 8)
+    // CHECK11:      call void @_ZN5test21AdlEPvm(ptr [[NEW]], i64 8)
 
-    // CHECK98:      call void @__clang_call_terminate(i8* {{%.*}}) [[NR_NUW]]
+    // CHECK98:      call void @__clang_call_terminate(ptr {{%.*}}) [[NR_NUW]]
     return new A(5);
   }
 }
@@ -207,62 +200,60 @@ namespace test3 {
   A makeA(), *makeAPtr();
 
   A *a() {
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test31aEv()
-    // CHECK:      [[FOO:%.*]] = call i8* @_ZN5test33fooEv()
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test31aEv()
+    // CHECK:      [[FOO:%.*]] = call ptr @_ZN5test33fooEv()
     // CHECK:      [[BAR:%.*]] = call double @_ZN5test33barEv()
-    // CHECK:      [[NEW:%.*]] = call i8* @_ZN5test31AnwEmPvd(i64 8, i8* [[FOO]], double [[BAR]])
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
-    // CHECK-NEXT: invoke void @_ZN5test31AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 5)
-    // CHECK:      ret [[A]]* [[CAST]]
+    // CHECK:      [[NEW:%.*]] = call ptr @_ZN5test31AnwEmPvd(i64 8, ptr [[FOO]], double [[BAR]])
+    // CHECK-NEXT: invoke void @_ZN5test31AC1Ei(ptr {{[^,]*}} [[NEW]], i32 5)
+    // CHECK:      ret ptr [[NEW]]
 
-    // CHECK98:      invoke void @_ZN5test31AdlEPvS1_d(i8* [[NEW]], i8* [[FOO]], double [[BAR]])
-    // CHECK11:      call void @_ZN5test31AdlEPvS1_d(i8* [[NEW]], i8* [[FOO]], double [[BAR]])
+    // CHECK98:      invoke void @_ZN5test31AdlEPvS1_d(ptr [[NEW]], ptr [[FOO]], double [[BAR]])
+    // CHECK11:      call void @_ZN5test31AdlEPvS1_d(ptr [[NEW]], ptr [[FOO]], double [[BAR]])
 
-    // CHECK98:      call void @__clang_call_terminate(i8* {{%.*}}) [[NR_NUW]]
+    // CHECK98:      call void @__clang_call_terminate(ptr {{%.*}}) [[NR_NUW]]
     return new(foo(),bar()) A(5);
   }
 
   // rdar://problem/8439196
   A *b(bool cond) {
 
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test31bEb(i1 zeroext
-    // CHECK:      [[SAVED0:%.*]] = alloca i8*
-    // CHECK-NEXT: [[SAVED1:%.*]] = alloca i8*
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test31bEb(i1 zeroext
+    // CHECK:      [[SAVED0:%.*]] = alloca ptr
+    // CHECK-NEXT: [[SAVED1:%.*]] = alloca ptr
     // CHECK-NEXT: [[CLEANUPACTIVE:%.*]] = alloca i1
 
     // CHECK:      [[COND:%.*]] = trunc i8 {{.*}} to i1
-    // CHECK-NEXT: store i1 false, i1* [[CLEANUPACTIVE]]
+    // CHECK-NEXT: store i1 false, ptr [[CLEANUPACTIVE]]
     // CHECK-NEXT: br i1 [[COND]]
     return (cond ?
 
-    // CHECK:      [[FOO:%.*]] = call i8* @_ZN5test33fooEv()
-    // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test31AnwEmPvd(i64 8, i8* [[FOO]], double [[CONST:.*]])
-    // CHECK-NEXT: store i8* [[NEW]], i8** [[SAVED0]]
-    // CHECK-NEXT: store i8* [[FOO]], i8** [[SAVED1]]
-    // CHECK-NEXT: store i1 true, i1* [[CLEANUPACTIVE]]
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
-    // CHECK-NEXT: invoke void @_ZN5test35makeAEv([[A]]* sret([[A]]) align 8 [[CAST]])
+    // CHECK:      [[FOO:%.*]] = call ptr @_ZN5test33fooEv()
+    // CHECK-NEXT: [[NEW:%.*]] = call ptr @_ZN5test31AnwEmPvd(i64 8, ptr [[FOO]], double [[CONST:.*]])
+    // CHECK-NEXT: store ptr [[NEW]], ptr [[SAVED0]]
+    // CHECK-NEXT: store ptr [[FOO]], ptr [[SAVED1]]
+    // CHECK-NEXT: store i1 true, ptr [[CLEANUPACTIVE]]
+    // CHECK-NEXT: invoke void @_ZN5test35makeAEv(ptr sret([[A:%.*]]) align 8 [[NEW]])
     // CHECK: br label
     //   -> cond.end
             new(foo(),10.0) A(makeA()) :
 
-    // CHECK:      [[MAKE:%.*]] = call [[A]]* @_ZN5test38makeAPtrEv()
+    // CHECK:      [[MAKE:%.*]] = call ptr @_ZN5test38makeAPtrEv()
     // CHECK:      br label
     //   -> cond.end
             makeAPtr());
 
     // cond.end:
-    // CHECK:      [[RESULT:%.*]] = phi [[A]]* {{.*}}[[CAST]]{{.*}}[[MAKE]]
-    // CHECK:      ret [[A]]* [[RESULT]]
+    // CHECK:      [[RESULT:%.*]] = phi ptr {{.*}}[[NEW]]{{.*}}[[MAKE]]
+    // CHECK:      ret ptr [[RESULT]]
 
     // in the EH path:
-    // CHECK:      [[ISACTIVE:%.*]] = load i1, i1* [[CLEANUPACTIVE]]
+    // CHECK:      [[ISACTIVE:%.*]] = load i1, ptr [[CLEANUPACTIVE]]
     // CHECK-NEXT: br i1 [[ISACTIVE]]
-    // CHECK:      [[V0:%.*]] = load i8*, i8** [[SAVED0]]
-    // CHECK-NEXT: [[V1:%.*]] = load i8*, i8** [[SAVED1]]
+    // CHECK:      [[V0:%.*]] = load ptr, ptr [[SAVED0]]
+    // CHECK-NEXT: [[V1:%.*]] = load ptr, ptr [[SAVED1]]
 
-    // CHECK98-NEXT: invoke void @_ZN5test31AdlEPvS1_d(i8* [[V0]], i8* [[V1]], double [[CONST]])
-    // CHECK11-NEXT: call void @_ZN5test31AdlEPvS1_d(i8* [[V0]], i8* [[V1]], double [[CONST]])
+    // CHECK98-NEXT: invoke void @_ZN5test31AdlEPvS1_d(ptr [[V0]], ptr [[V1]], double [[CONST]])
+    // CHECK11-NEXT: call void @_ZN5test31AdlEPvS1_d(ptr [[V0]], ptr [[V1]], double [[CONST]])
   }
 }
 
@@ -275,13 +266,12 @@ namespace test4 {
   };
 
   A *a() {
-    // CHECK:    define{{( dso_local)?}} [[A:%.*]]* @_ZN5test41aEv()
-    // CHECK:      [[FOO:%.*]] = call i8* @_ZN5test43fooEv()
-    // CHECK-NEXT: [[BAR:%.*]] = call i8* @_ZN5test43barEv()
-    // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test41AnwEmPvS1_(i64 8, i8* [[FOO]], i8* [[BAR]])
-    // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
-    // CHECK-NEXT: call void @_ZN5test41AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 5)
-    // CHECK-NEXT: ret [[A]]* [[CAST]]
+    // CHECK:    define{{( dso_local)?}} ptr @_ZN5test41aEv()
+    // CHECK:      [[FOO:%.*]] = call ptr @_ZN5test43fooEv()
+    // CHECK-NEXT: [[BAR:%.*]] = call ptr @_ZN5test43barEv()
+    // CHECK-NEXT: [[NEW:%.*]] = call ptr @_ZN5test41AnwEmPvS1_(i64 8, ptr [[FOO]], ptr [[BAR]])
+    // CHECK-NEXT: call void @_ZN5test41AC1Ei(ptr {{[^,]*}} [[NEW]], i32 5)
+    // CHECK-NEXT: ret ptr [[NEW]]
     extern void *foo(), *bar();
 
     return new(foo(),bar()) A(5);
@@ -300,22 +290,21 @@ namespace test5 {
   void foo();
 
   // CHECK-LABEL:    define{{.*}} void @_ZN5test54testEv()
-  // CHECK:      [[EXNSLOT:%.*]] = alloca i8*
+  // CHECK:      [[EXNSLOT:%.*]] = alloca ptr
   // CHECK-NEXT: [[SELECTORSLOT:%.*]] = alloca i32
   // CHECK-NEXT: [[A:%.*]] = alloca [[A_T:%.*]], align 1
   // CHECK-NEXT: [[T:%.*]] = alloca [[T_T:%.*]], align 1
   // CHECK-NEXT: invoke void @_ZN5test53fooEv()
-  // CHECK:      [[EXN:%.*]] = load i8*, i8** [[EXNSLOT]]
-  // CHECK-NEXT: [[ADJ:%.*]] = call i8* @__cxa_get_exception_ptr(i8* [[EXN]])
-  // CHECK-NEXT: [[SRC:%.*]] = bitcast i8* [[ADJ]] to [[A_T]]*
-  // CHECK-NEXT: invoke void @_ZN5test51TC1Ev([[T_T]]* {{[^,]*}} [[T]])
-  // CHECK:      invoke void @_ZN5test51AC1ERKS0_RKNS_1TE([[A_T]]* {{[^,]*}} [[A]], [[A_T]]* nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[SRC]], [[T_T]]* nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[T]])
+  // CHECK:      [[EXN:%.*]] = load ptr, ptr [[EXNSLOT]]
+  // CHECK-NEXT: [[ADJ:%.*]] = call ptr @__cxa_get_exception_ptr(ptr [[EXN]])
+  // CHECK-NEXT: invoke void @_ZN5test51TC1Ev(ptr {{[^,]*}} [[T]])
+  // CHECK:      invoke void @_ZN5test51AC1ERKS0_RKNS_1TE(ptr {{[^,]*}} [[A:%.*]], ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[ADJ]], ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[T]])
 
-  // CHECK98:      invoke void @_ZN5test51TD1Ev([[T_T]]* {{[^,]*}} [[T]])
-  // CHECK11:      call void @_ZN5test51TD1Ev([[T_T]]* {{[^,]*}} [[T]])
+  // CHECK98:      invoke void @_ZN5test51TD1Ev(ptr {{[^,]*}} [[T]])
+  // CHECK11:      call void @_ZN5test51TD1Ev(ptr {{[^,]*}} [[T]])
 
-  // CHECK98:      call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]]
-  // CHECK98-NEXT: invoke void @_ZN5test51AD1Ev([[A_T]]* {{[^,]*}} [[A]])
+  // CHECK98:      call ptr @__cxa_begin_catch(ptr [[EXN]]) [[NUW]]
+  // CHECK98-NEXT: invoke void @_ZN5test51AD1Ev(ptr {{[^,]*}} [[A:%.*]])
 
   // CHECK:      call void @__cxa_end_catch()
   void test() {
@@ -351,72 +340,70 @@ namespace test7 {
   };
 
   B *test() {
-    // CHECK: define{{( dso_local)?}} [[B:%.*]]* @_ZN5test74testEv()
+    // CHECK: define{{( dso_local)?}} ptr @_ZN5test74testEv()
     // CHECK:      [[OUTER_NEW:%.*]] = alloca i1
     // CHECK-NEXT: alloca [[A:%.*]],
-    // CHECK-NEXT: alloca i8*
+    // CHECK-NEXT: alloca ptr
     // CHECK-NEXT: alloca i32
     // CHECK-NEXT: [[OUTER_A:%.*]] = alloca i1
-    // CHECK-NEXT: alloca i8*
+    // CHECK-NEXT: alloca ptr
     // CHECK-NEXT: [[INNER_NEW:%.*]] = alloca i1
-    // CHECK-NEXT: alloca [[A]]
+    // CHECK-NEXT: alloca [[A:%.*]]
     // CHECK-NEXT: [[INNER_A:%.*]] = alloca i1
 
     // Allocate the outer object.
-    // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test71BnwEm(
-    // CHECK-NEXT: icmp eq i8* [[NEW]], null
+    // CHECK-NEXT: [[NEW:%.*]] = call ptr @_ZN5test71BnwEm(
+    // CHECK-NEXT: icmp eq ptr [[NEW]], null
 
     // These stores, emitted before the outermost conditional branch,
     // deactivate the temporary cleanups.
-    // CHECK-NEXT: store i1 false, i1* [[OUTER_NEW]]
-    // CHECK-NEXT: store i1 false, i1* [[OUTER_A]]
-    // CHECK-NEXT: store i1 false, i1* [[INNER_NEW]]
-    // CHECK-NEXT: store i1 false, i1* [[INNER_A]]
+    // CHECK-NEXT: store i1 false, ptr [[OUTER_NEW]]
+    // CHECK-NEXT: store i1 false, ptr [[OUTER_A]]
+    // CHECK-NEXT: store i1 false, ptr [[INNER_NEW]]
+    // CHECK-NEXT: store i1 false, ptr [[INNER_A]]
     // CHECK-NEXT: br i1
 
     // We passed the first null check; activate that cleanup and continue.
-    // CHECK:      store i1 true, i1* [[OUTER_NEW]]
-    // CHECK-NEXT: bitcast
+    // CHECK:      store i1 true, ptr [[OUTER_NEW]]
 
     // Create the first A temporary and activate that cleanup.
     // CHECK-NEXT: invoke void @_ZN5test71AC1Ev(
-    // CHECK:      store i1 true, i1* [[OUTER_A]]
+    // CHECK:      store i1 true, ptr [[OUTER_A]]
 
     // Allocate the inner object.
-    // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test71BnwEm(
-    // CHECK-NEXT: icmp eq i8* [[NEW]], null
+    // CHECK-NEXT: [[NEW:%.*]] = call ptr @_ZN5test71BnwEm(
+    // CHECK-NEXT: icmp eq ptr [[NEW]], null
     // CHECK-NEXT: br i1
 
     // We passed the second null check; save that pointer, activate
     // that cleanup, and continue.
-    // CHECK:      store i8* [[NEW]]
-    // CHECK-NEXT: store i1 true, i1* [[INNER_NEW]]
-    // CHECK-NEXT: bitcast
+    // CHECK:      store ptr [[NEW]]
+    // CHECK-NEXT: store i1 true, ptr [[INNER_NEW]]
 
     // Build the second A temporary and activate that cleanup.
     // CHECK-NEXT: invoke void @_ZN5test71AC1Ev(
-    // CHECK:      store i1 true, i1* [[INNER_A]]
+    // CHECK:      store i1 true, ptr [[INNER_A]]
 
     // Build the inner B object and deactivate the inner delete cleanup.
     // CHECK-NEXT: invoke void @_ZN5test71BC1ERKNS_1AEPS0_(
-    // CHECK:      store i1 false, i1* [[INNER_NEW]]
+    // CHECK:      store i1 false, ptr [[INNER_NEW]]
     // CHECK:      phi
 
     // Build the outer B object and deactivate the outer delete cleanup.
     // CHECK-NEXT: invoke void @_ZN5test71BC1ERKNS_1AEPS0_(
-    // CHECK:      store i1 false, i1* [[OUTER_NEW]]
+    // CHECK:      store i1 false, ptr [[OUTER_NEW]]
     // CHECK:      phi
-    // CHECK-NEXT: store [[B]]*
+    // CHECK-NEXT: store ptr
 
     // Destroy the inner A object.
-    // CHECK-NEXT: load i1, i1* [[INNER_A]]
+    // CHECK-NEXT: load i1, ptr [[INNER_A]]
     // CHECK-NEXT: br i1
 
     // CHECK98:    invoke void @_ZN5test71AD1Ev(
     // CHECK11:    call void @_ZN5test71AD1Ev(
 
     // Destroy the outer A object.
-    // CHECK:      load i1, i1* [[OUTER_A]]
+    // CHECK:      load i1, ptr [[OUTER_A]]
     // CHECK-NEXT: br i1
 
     // CHECK98:    invoke void @_ZN5test71AD1Ev(
@@ -456,9 +443,9 @@ namespace test9 {
   A* test() {
     return new A[10];
   }
-  // CHECK: define{{.*}} {{%.*}}* @_ZN5test94testEv
-  // CHECK: [[TEST9_NEW:%.*]] = call noalias nonnull i8* @_Znam
-  // CHECK: call void @_ZdaPv(i8* [[TEST9_NEW]])
+  // CHECK: define{{.*}} ptr @_ZN5test94testEv
+  // CHECK: [[TEST9_NEW:%.*]] = call noalias nonnull ptr @_Znam
+  // CHECK: call void @_ZdaPv(ptr [[TEST9_NEW]])
 }
 
 // In a destructor with a function-try-block, a return statement in a
@@ -479,7 +466,7 @@ namespace test10 {
   B::~B() try { cleanup(); } catch (...) {}
   // CHECK-LABEL:    define{{.*}} void @_ZN6test101BD1Ev(
   // CHECK:      invoke void @_ZN6test107cleanupEv()
-  // CHECK:      call i8* @__cxa_begin_catch
+  // CHECK:      call ptr @__cxa_begin_catch
   // CHECK-NEXT: invoke void @__cxa_rethrow()
   // CHECK:      unreachable
 
@@ -487,8 +474,8 @@ namespace test10 {
   C::~C() try { cleanup(); } catch (...) { if (suppress) return; }
   // CHECK-LABEL:    define{{.*}} void @_ZN6test101CD1Ev(
   // CHECK:      invoke void @_ZN6test107cleanupEv()
-  // CHECK:      call i8* @__cxa_begin_catch
-  // CHECK-NEXT: load i8, i8* @_ZN6test108suppressE, align 1
+  // CHECK:      call ptr @__cxa_begin_catch
+  // CHECK-NEXT: load i8, ptr @_ZN6test108suppressE, align 1
   // CHECK-NEXT: trunc
   // CHECK-NEXT: br i1
 
@@ -520,57 +507,57 @@ namespace test11 {
     throw 0;
   }
   // CHECK-LABEL:    define{{.*}} void @_ZN6test111CC2Ev(
-  // CHECK:      [[THIS:%.*]] = load [[C:%.*]]*, [[C:%.*]]** {{%.*}}
+  // CHECK:      [[THIS:%.*]] = load ptr, ptr {{%.*}}
   //   Construct single.
-  // CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds [[C]], [[C]]* [[THIS]], i32 0, i32 0
-  // CHECK-NEXT: call void @_ZN6test111AC1Ev([[A:%.*]]* {{[^,]*}} [[SINGLE]])
+  // CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds [[C:%.*]], ptr [[THIS]], i32 0, i32 0
+  // CHECK-NEXT: call void @_ZN6test111AC1Ev(ptr {{[^,]*}} [[SINGLE]])
   //   Construct array.
-  // CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds [[C]], [[C]]* [[THIS]], i32 0, i32 1
-  // CHECK-NEXT: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]], [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0
-  // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ARRAYBEGIN]], i64 6
+  // CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds [[C:%.*]], ptr [[THIS]], i32 0, i32 1
+  // CHECK-NEXT: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A:%.*]]]], ptr [[ARRAY]], i32 0, i32 0, i32 0
+  // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A:%.*]], ptr [[ARRAYBEGIN]], i64 6
   // CHECK-NEXT: br label
-  // CHECK:      [[CUR:%.*]] = phi [[A]]* [ [[ARRAYBEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
-  // CHECK-NEXT: invoke void @_ZN6test111AC1Ev([[A:%.*]]* {{[^,]*}} [[CUR]])
-  // CHECK:      [[NEXT]] = getelementptr inbounds [[A]], [[A]]* [[CUR]], i64 1
-  // CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[ARRAYEND]]
+  // CHECK:      [[CUR:%.*]] = phi ptr [ [[ARRAYBEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
+  // CHECK-NEXT: invoke void @_ZN6test111AC1Ev(ptr {{[^,]*}} [[CUR]])
+  // CHECK:      [[NEXT]] = getelementptr inbounds [[A:%.*]], ptr [[CUR]], i64 1
+  // CHECK-NEXT: [[DONE:%.*]] = icmp eq ptr [[NEXT]], [[ARRAYEND]]
   // CHECK-NEXT: br i1 [[DONE]],
   //   throw 0;
   // CHECK:      invoke void @__cxa_throw(
   //   Landing pad 1, from constructor in array-initialization loop:
   // CHECK:      landingpad
   //     - First, destroy already-constructed bits of array.
-  // CHECK:      [[EMPTY:%.*]] = icmp eq [[A]]* [[ARRAYBEGIN]], [[CUR]]
+  // CHECK:      [[EMPTY:%.*]] = icmp eq ptr [[ARRAYBEGIN]], [[CUR]]
   // CHECK-NEXT: br i1 [[EMPTY]]
-  // CHECK:      [[AFTER:%.*]] = phi [[A]]* [ [[CUR]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
-  // CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1
+  // CHECK:      [[AFTER:%.*]] = phi ptr [ [[CUR]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
+  // CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A:%.*]], ptr [[AFTER]], i64 -1
 
-  // CHECK98-NEXT: invoke void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]])
-  // CHECK11-NEXT: call void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]])
+  // CHECK98-NEXT: invoke void @_ZN6test111AD1Ev(ptr {{[^,]*}} [[ELT]])
+  // CHECK11-NEXT: call void @_ZN6test111AD1Ev(ptr {{[^,]*}} [[ELT]])
 
-  // CHECK:      [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]]
+  // CHECK:      [[DONE:%.*]] = icmp eq ptr [[ELT]], [[ARRAYBEGIN]]
   // CHECK-NEXT: br i1 [[DONE]],
   //     - Next, chain to cleanup for single.
   // CHECK:      br label
   //   Landing pad 2, from throw site.
   // CHECK:      landingpad
   //     - First, destroy all of array.
-  // CHECK:      [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]], [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0
-  // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ARRAYBEGIN]], i64 6
+  // CHECK:      [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A:%.*]]]], ptr [[ARRAY]], i32 0, i32 0, i32 0
+  // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A:%.*]], ptr [[ARRAYBEGIN]], i64 6
   // CHECK-NEXT: br label
-  // CHECK:      [[AFTER:%.*]] = phi [[A]]* [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
-  // CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1
+  // CHECK:      [[AFTER:%.*]] = phi ptr [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
+  // CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]], ptr [[AFTER]], i64 -1
 
-  // CHECK98-NEXT: invoke void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]])
-  // CHECK11-NEXT: call void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]])
+  // CHECK98-NEXT: invoke void @_ZN6test111AD1Ev(ptr {{[^,]*}} [[ELT]])
+  // CHECK11-NEXT: call void @_ZN6test111AD1Ev(ptr {{[^,]*}} [[ELT]])
 
-  // CHECK:      [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]]
+  // CHECK:      [[DONE:%.*]] = icmp eq ptr [[ELT]], [[ARRAYBEGIN]]
   // CHECK-NEXT: br i1 [[DONE]],
   //     - Next, chain to cleanup for single.
   // CHECK:      br label
   //   Finally, the cleanup for single.
 
-  // CHECK98:      invoke void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[SINGLE]])
-  // CHECK11:      call void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[SINGLE]])
+  // CHECK98:      invoke void @_ZN6test111AD1Ev(ptr {{[^,]*}} [[SINGLE]])
+  // CHECK11:      call void @_ZN6test111AD1Ev(ptr {{[^,]*}} [[SINGLE]])
 
   // CHECK:      br label
   // CHECK:      resume
@@ -587,13 +574,12 @@ namespace test12 {
     return new (ptr) A();
   }
   // CHECK-LABEL: define {{.*}} @_ZN6test124testEPv(
-  // CHECK:       [[PTR:%.*]] = load i8*, i8*
-  // CHECK-NEXT:  [[CAST:%.*]] = bitcast i8* [[PTR]] to [[A:%.*]]*
-  // CHECK-NEXT:  invoke void @_ZN6test121AC1Ev([[A]]* {{[^,]*}} [[CAST]])
-  // CHECK:       ret [[A]]* [[CAST]]
+  // CHECK:       [[PTR:%.*]] = load ptr, ptr
+  // CHECK-NEXT:  invoke void @_ZN6test121AC1Ev(ptr {{[^,]*}} [[PTR]])
+  // CHECK:       ret ptr [[PTR]]
 
-  // CHECK98:       invoke void @_ZN6test121AdlEPvS1_(i8* [[PTR]], i8* [[PTR]])
-  // CHECK11:       call void @_ZN6test121AdlEPvS1_(i8* [[PTR]], i8* [[PTR]])
+  // CHECK98:       invoke void @_ZN6test121AdlEPvS1_(ptr [[PTR]], ptr [[PTR]])
+  // CHECK11:       call void @_ZN6test121AdlEPvS1_(ptr [[PTR]], ptr [[PTR]])
 }
 
 namespace test13 {
@@ -610,22 +596,22 @@ struct A {
 // CHECK: %[[REF_TMP1:.*]] = alloca %[[STRUCT_TEST13_A]], align 4
 // CHECK: %[[CLEANUP_COND2:.*]] = alloca i1, align 1
 
-// CHECK: call void @_ZN6test131AC1Ev(%[[STRUCT_TEST13_A]]* {{[^,]*}} %[[REF_TMP]])
-// CHECK: store i1 true, i1* %[[CLEANUP_COND]], align 1
+// CHECK: call void @_ZN6test131AC1Ev(ptr {{[^,]*}} %[[REF_TMP]])
+// CHECK: store i1 true, ptr %[[CLEANUP_COND]], align 1
 // CHECK: br
 
-// CHECK: invoke void @_ZN6test131AC1Ev(%[[STRUCT_TEST13_A]]* {{[^,]*}} %[[REF_TMP1]])
+// CHECK: invoke void @_ZN6test131AC1Ev(ptr {{[^,]*}} %[[REF_TMP1]])
 
-// CHECK: store i1 true, i1* %[[CLEANUP_COND2]], align 1
+// CHECK: store i1 true, ptr %[[CLEANUP_COND2]], align 1
 // CHECK: br
 
 // Check the flag before destructing the temporary.
 
-// CHECK: landingpad { i8*, i32 }
-// CHECK: %[[CLEANUP_IS_ACTIVE:.*]] = load i1, i1* %[[CLEANUP_COND]], align 1
+// CHECK: landingpad { ptr, i32 }
+// CHECK: %[[CLEANUP_IS_ACTIVE:.*]] = load i1, ptr %[[CLEANUP_COND]], align 1
 // CHECK: br i1 %[[CLEANUP_IS_ACTIVE]],
 
-// CHECK: void @_ZN6test131AD1Ev(%[[STRUCT_TEST13_A]]* {{[^,]*}} %[[REF_TMP]])
+// CHECK: void @_ZN6test131AD1Ev(ptr {{[^,]*}} %[[REF_TMP]])
 
 void test(int c) {
   const A &s = c ? static_cast<const A &>(A()) : static_cast<const A &>(A());

diff  --git a/clang/test/CodeGenCXX/extern-c.cpp b/clang/test/CodeGenCXX/extern-c.cpp
index 9f748bcef86a4..829c661ca4c80 100644
--- a/clang/test/CodeGenCXX/extern-c.cpp
+++ b/clang/test/CodeGenCXX/extern-c.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
 namespace foo {
 
 // CHECK-NOT: @a = global
@@ -70,14 +70,14 @@ extern "C" {
     __attribute__((used)) static int duplicate_internal_fn() { return 0; }
   }
 
-  // CHECK: @llvm.compiler.used = appending global {{.*}} @internal_var {{.*}} @internal_fn
+  // CHECK: @llvm.compiler.used = appending global {{.*}} @internal_var, {{.*}} @internal_fn
 
   // CHECK-NOT: @unused
   // CHECK-NOT: @duplicate_internal
-  // CHECK: @internal_var = internal alias i32, i32* @_ZL12internal_var
+  // CHECK: @internal_var = internal alias i32, ptr @_ZL12internal_var
   // CHECK-NOT: @unused
   // CHECK-NOT: @duplicate_internal
-  // CHECK: @internal_fn = internal alias i32 (), i32 ()* @_ZL11internal_fnv
+  // CHECK: @internal_fn = internal alias i32 (), ptr @_ZL11internal_fnv
   // CHECK-NOT: @unused
   // CHECK-NOT: @duplicate_internal
 }

diff  --git a/clang/test/CodeGenCXX/externc-ifunc-resolver.cpp b/clang/test/CodeGenCXX/externc-ifunc-resolver.cpp
index 135cecf4eeb22..0518a8dcc831d 100644
--- a/clang/test/CodeGenCXX/externc-ifunc-resolver.cpp
+++ b/clang/test/CodeGenCXX/externc-ifunc-resolver.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
 
 extern "C" {
 __attribute__((used)) static void *resolve_foo() { return 0; }
@@ -8,9 +8,9 @@ __attribute__((ifunc("resolve_foo"))) char foo3(float);
 __attribute__((ifunc("resolve_foo"))) char foo4(float);
 }
 
-// CHECK: @resolve_foo = internal alias i8* (), i8* ()* @_ZL11resolve_foov
-// CHECK: @foo = ifunc i8* (), bitcast (i8* ()* @_ZL11resolve_foov to i8* ()* ()*)
-// CHECK: @foo2 = ifunc void (i32), bitcast (i8* ()* @_ZL11resolve_foov to void (i32)* ()*)
-// CHECK: @foo3 = ifunc i8 (float), bitcast (i8* ()* @_ZL11resolve_foov to i8 (float)* ()*)
-// CHECK: @foo4 = ifunc i8 (float), bitcast (i8* ()* @_ZL11resolve_foov to i8 (float)* ()*)
-// CHECK: define internal noundef i8* @_ZL11resolve_foov()
+// CHECK: @resolve_foo = internal alias ptr (), ptr @_ZL11resolve_foov
+// CHECK: @foo = ifunc ptr (), ptr @_ZL11resolve_foov
+// CHECK: @foo2 = ifunc void (i32), ptr @_ZL11resolve_foov
+// CHECK: @foo3 = ifunc i8 (float), ptr @_ZL11resolve_foov
+// CHECK: @foo4 = ifunc i8 (float), ptr @_ZL11resolve_foov
+// CHECK: define internal noundef ptr @_ZL11resolve_foov()

diff  --git a/clang/test/CodeGenCXX/finegrain-bitfield-access.cpp b/clang/test/CodeGenCXX/finegrain-bitfield-access.cpp
index e61b00faeeb6f..648c5263b98bb 100644
--- a/clang/test/CodeGenCXX/finegrain-bitfield-access.cpp
+++ b/clang/test/CodeGenCXX/finegrain-bitfield-access.cpp
@@ -1,6 +1,6 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-linux-gnu -ffine-grained-bitfield-accesses \
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -ffine-grained-bitfield-accesses \
 // RUN:   -emit-llvm -o - %s | FileCheck %s
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-linux-gnu -ffine-grained-bitfield-accesses \
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -ffine-grained-bitfield-accesses \
 // RUN:   -emit-llvm -fsanitize=address -o - %s | FileCheck %s --check-prefix=SANITIZE
 // Check -fsplit-bitfields will be ignored since sanitizer is enabled.
 
@@ -15,11 +15,11 @@ struct S1 {
 S1 a1;
 unsigned read8_1() {
   // CHECK-LABEL: @_Z7read8_1v
-  // CHECK: %bf.load = load i8, i8* getelementptr inbounds (%struct.S1, %struct.S1* @a1, i32 0, i32 1), align 1
+  // CHECK: %bf.load = load i8, ptr getelementptr inbounds (%struct.S1, ptr @a1, i32 0, i32 1), align 1
   // CHECK-NEXT: %bf.cast = zext i8 %bf.load to i32
   // CHECK-NEXT: ret i32 %bf.cast
   // SANITIZE-LABEL: @_Z7read8_1v
-  // SANITIZE: %bf.load = load i32, i32* getelementptr inbounds {{.*}}, align 4
+  // SANITIZE: %bf.load = load i32, ptr {{.*}}, align 4
   // SANITIZE: %bf.lshr = lshr i32 %bf.load, 8
   // SANITIZE: %bf.clear = and i32 %bf.lshr, 255
   // SANITIZE: ret i32 %bf.clear
@@ -27,26 +27,26 @@ unsigned read8_1() {
 }
 void write8_1() {
   // CHECK-LABEL: @_Z8write8_1v
-  // CHECK: store i8 3, i8* getelementptr inbounds (%struct.S1, %struct.S1* @a1, i32 0, i32 1), align 1
+  // CHECK: store i8 3, ptr getelementptr inbounds (%struct.S1, ptr @a1, i32 0, i32 1), align 1
   // CHECK-NEXT: ret void
   // SANITIZE-LABEL: @_Z8write8_1v
-  // SANITIZE: %bf.load = load i32, i32* getelementptr inbounds {{.*}}, align 4
+  // SANITIZE: %bf.load = load i32, ptr {{.*}}, align 4
   // SANITIZE-NEXT: %bf.clear = and i32 %bf.load, -65281
   // SANITIZE-NEXT: %bf.set = or i32 %bf.clear, 768
-  // SANITIZE-NEXT: store i32 %bf.set, i32* getelementptr inbounds {{.*}}, align 4
+  // SANITIZE-NEXT: store i32 %bf.set, ptr {{.*}}, align 4
   // SANITIZE-NEXT: ret void
   a1.f3 = 3;
 }
 
 unsigned read8_2() {
   // CHECK-LABEL: @_Z7read8_2v
-  // CHECK: %bf.load = load i16, i16* getelementptr inbounds (%struct.S1, %struct.S1* @a1, i32 0, i32 2), align 2
+  // CHECK: %bf.load = load i16, ptr getelementptr inbounds (%struct.S1, ptr @a1, i32 0, i32 2), align 2
   // CHECK-NEXT: %bf.lshr = lshr i16 %bf.load, 4
   // CHECK-NEXT: %bf.clear = and i16 %bf.lshr, 255
   // CHECK-NEXT: %bf.cast = zext i16 %bf.clear to i32
   // CHECK-NEXT: ret i32 %bf.cast
   // SANITIZE-LABEL: @_Z7read8_2v
-  // SANITIZE: %bf.load = load i32, i32* getelementptr inbounds {{.*}}, align 4
+  // SANITIZE: %bf.load = load i32, ptr {{.*}}, align 4
   // SANITIZE-NEXT: %bf.lshr = lshr i32 %bf.load, 20
   // SANITIZE-NEXT: %bf.clear = and i32 %bf.lshr, 255
   // SANITIZE-NEXT: ret i32 %bf.clear
@@ -54,16 +54,16 @@ unsigned read8_2() {
 }
 void write8_2() {
   // CHECK-LABEL: @_Z8write8_2v
-  // CHECK: %bf.load = load i16, i16* getelementptr inbounds (%struct.S1, %struct.S1* @a1, i32 0, i32 2), align 2
+  // CHECK: %bf.load = load i16, ptr getelementptr inbounds (%struct.S1, ptr @a1, i32 0, i32 2), align 2
   // CHECK-NEXT: %bf.clear = and i16 %bf.load, -4081
   // CHECK-NEXT: %bf.set = or i16 %bf.clear, 48
-  // CHECK-NEXT: store i16 %bf.set, i16* getelementptr inbounds (%struct.S1, %struct.S1* @a1, i32 0, i32 2), align 2
+  // CHECK-NEXT: store i16 %bf.set, ptr getelementptr inbounds (%struct.S1, ptr @a1, i32 0, i32 2), align 2
   // CHECK-NEXT: ret void
   // SANITIZE-LABEL: @_Z8write8_2v
-  // SANITIZE: %bf.load = load i32, i32* getelementptr inbounds {{.*}}, align 4
+  // SANITIZE: %bf.load = load i32, ptr {{.*}}, align 4
   // SANITIZE-NEXT: %bf.clear = and i32 %bf.load, -267386881
   // SANITIZE-NEXT: %bf.set = or i32 %bf.clear, 3145728
-  // SANITIZE-NEXT: store i32 %bf.set, i32* getelementptr inbounds {{.*}}, align 4
+  // SANITIZE-NEXT: store i32 %bf.set, ptr {{.*}}, align 4
   // SANITIZE-NEXT: ret void
   a1.f5 = 3;
 }
@@ -77,12 +77,12 @@ struct S2 {
 S2 a2;
 unsigned read16_1() {
   // CHECK-LABEL: @_Z8read16_1v
-  // CHECK: %bf.load = load i16, i16* getelementptr inbounds (%struct.S2, %struct.S2* @a2, i32 0, i32 0), align 8
+  // CHECK: %bf.load = load i16, ptr @a2, align 8
   // CHECK-NEXT: %bf.cast = zext i16 %bf.load to i64
   // CHECK-NEXT: %conv = trunc i64 %bf.cast to i32
   // CHECK-NEXT: ret i32 %conv
   // SANITIZE-LABEL: @_Z8read16_1v
-  // SANITIZE: %bf.load = load i64, i64* bitcast {{.*}}, align 8
+  // SANITIZE: %bf.load = load i64, ptr {{.*}}, align 8
   // SANITIZE-NEXT: %bf.clear = and i64 %bf.load, 65535
   // SANITIZE-NEXT: %conv = trunc i64 %bf.clear to i32
   // SANITIZE-NEXT: ret i32 %conv
@@ -90,12 +90,12 @@ unsigned read16_1() {
 }
 unsigned read16_2() {
   // CHECK-LABEL: @_Z8read16_2v
-  // CHECK: %bf.load = load i16, i16* getelementptr inbounds (%struct.S2, %struct.S2* @a2, i32 0, i32 1), align 2
+  // CHECK: %bf.load = load i16, ptr getelementptr inbounds (%struct.S2, ptr @a2, i32 0, i32 1), align 2
   // CHECK-NEXT: %bf.cast = zext i16 %bf.load to i64
   // CHECK-NEXT: %conv = trunc i64 %bf.cast to i32
   // CHECK-NEXT: ret i32 %conv
   // SANITIZE-LABEL: @_Z8read16_2v
-  // SANITIZE: %bf.load = load i64, i64* bitcast {{.*}}, align 8
+  // SANITIZE: %bf.load = load i64, ptr {{.*}}, align 8
   // SANITIZE-NEXT: %bf.lshr = lshr i64 %bf.load, 16
   // SANITIZE-NEXT: %bf.clear = and i64 %bf.lshr, 65535
   // SANITIZE-NEXT: %conv = trunc i64 %bf.clear to i32
@@ -105,25 +105,25 @@ unsigned read16_2() {
 
 void write16_1() {
   // CHECK-LABEL: @_Z9write16_1v
-  // CHECK: store i16 5, i16* getelementptr inbounds (%struct.S2, %struct.S2* @a2, i32 0, i32 0), align 8
+  // CHECK: store i16 5, ptr @a2, align 8
   // CHECK-NEXT: ret void
   // SANITIZE-LABEL: @_Z9write16_1v
-  // SANITIZE: %bf.load = load i64, i64* bitcast {{.*}}, align 8
+  // SANITIZE: %bf.load = load i64, ptr {{.*}}, align 8
   // SANITIZE-NEXT: %bf.clear = and i64 %bf.load, -65536
   // SANITIZE-NEXT: %bf.set = or i64 %bf.clear, 5
-  // SANITIZE-NEXT: store i64 %bf.set, i64* bitcast {{.*}}, align 8
+  // SANITIZE-NEXT: store i64 %bf.set, ptr {{.*}}, align 8
   // SANITIZE-NEXT: ret void
   a2.f1 = 5;
 }
 void write16_2() {
   // CHECK-LABEL: @_Z9write16_2v
-  // CHECK: store i16 5, i16* getelementptr inbounds (%struct.S2, %struct.S2* @a2, i32 0, i32 1), align 2
+  // CHECK: store i16 5, ptr getelementptr inbounds (%struct.S2, ptr @a2, i32 0, i32 1), align 2
   // CHECK-NEXT: ret void
   // SANITIZE-LABEL: @_Z9write16_2v
-  // SANITIZE: %bf.load = load i64, i64* bitcast {{.*}}, align 8
+  // SANITIZE: %bf.load = load i64, ptr {{.*}}, align 8
   // SANITIZE-NEXT: %bf.clear = and i64 %bf.load, -4294901761
   // SANITIZE-NEXT: %bf.set = or i64 %bf.clear, 327680
-  // SANITIZE-NEXT: store i64 %bf.set, i64* bitcast {{.*}}, align 8
+  // SANITIZE-NEXT: store i64 %bf.set, ptr {{.*}}, align 8
   // SANITIZE-NEXT: ret void
   a2.f2 = 5;
 }
@@ -137,12 +137,12 @@ struct S3 {
 S3 a3;
 unsigned read32_1() {
   // CHECK-LABEL: @_Z8read32_1v
-  // CHECK: %bf.load = load i32, i32* getelementptr inbounds (%struct.S3, %struct.S3* @a3, i32 0, i32 1), align 4
+  // CHECK: %bf.load = load i32, ptr getelementptr inbounds (%struct.S3, ptr @a3, i32 0, i32 1), align 4
   // CHECK-NEXT: %bf.cast = zext i32 %bf.load to i64
   // CHECK-NEXT: %conv = trunc i64 %bf.cast to i32
   // CHECK-NEXT: ret i32 %conv
   // SANITIZE-LABEL: @_Z8read32_1v
-  // SANITIZE: %bf.load = load i64, i64* getelementptr inbounds {{.*}}, align 8
+  // SANITIZE: %bf.load = load i64, ptr {{.*}}, align 8
   // SANITIZE-NEXT: %bf.lshr = lshr i64 %bf.load, 32
   // SANITIZE-NEXT: %conv = trunc i64 %bf.lshr to i32
   // SANITIZE-NEXT: ret i32 %conv
@@ -150,13 +150,13 @@ unsigned read32_1() {
 }
 void write32_1() {
   // CHECK-LABEL: @_Z9write32_1v
-  // CHECK: store i32 5, i32* getelementptr inbounds (%struct.S3, %struct.S3* @a3, i32 0, i32 1), align 4
+  // CHECK: store i32 5, ptr getelementptr inbounds (%struct.S3, ptr @a3, i32 0, i32 1), align 4
   // CHECK-NEXT: ret void
   // SANITIZE-LABEL: @_Z9write32_1v
-  // SANITIZE: %bf.load = load i64, i64* getelementptr inbounds {{.*}}, align 8
+  // SANITIZE: %bf.load = load i64, ptr {{.*}}, align 8
   // SANITIZE-NEXT: %bf.clear = and i64 %bf.load, 4294967295
   // SANITIZE-NEXT: %bf.set = or i64 %bf.clear, 21474836480
-  // SANITIZE-NEXT: store i64 %bf.set, i64* getelementptr inbounds {{.*}}, align 8
+  // SANITIZE-NEXT: store i64 %bf.set, ptr {{.*}}, align 8
   // SANITIZE-NEXT: ret void
   a3.f3 = 5;
 }

diff  --git a/clang/test/CodeGenCXX/global-array-destruction.cpp b/clang/test/CodeGenCXX/global-array-destruction.cpp
index 297d14ed16f84..db4f89fe61cfa 100644
--- a/clang/test/CodeGenCXX/global-array-destruction.cpp
+++ b/clang/test/CodeGenCXX/global-array-destruction.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | FileCheck %s
 
 extern "C" int printf(...);
 
@@ -39,7 +39,7 @@ struct T {
 T t[2][3] = { 1.0, 2, 3.0, 4, 5.0, 6, 7.0, 8, 9.0, 10, 11.0, 12 };
 
 // CHECK: call {{.*}} @__cxa_atexit
-// CHECK: getelementptr inbounds ([2 x [3 x %struct.T]], [2 x [3 x %struct.T]]* bitcast ([2 x [3 x { double, i32 }]]* @t to [2 x [3 x %struct.T]]*), i64 1, i64 0, i64 0)
+// CHECK: getelementptr inbounds (%struct.T, ptr @t, i64 6)
 // CHECK: call void @_ZN1TD1Ev
 // CHECK: icmp eq {{.*}} @t
 // CHECK: br i1 {{.*}}
@@ -47,7 +47,7 @@ T t[2][3] = { 1.0, 2, 3.0, 4, 5.0, 6, 7.0, 8, 9.0, 10, 11.0, 12 };
 static T t2[2][3] = { 1.0, 2, 3.0, 4, 5.0, 6, 7.0, 8, 9.0, 10, 11.0, 12 };
 
 // CHECK: call {{.*}} @__cxa_atexit
-// CHECK: getelementptr inbounds ([2 x [3 x %struct.T]], [2 x [3 x %struct.T]]* bitcast ([2 x [3 x { double, i32 }]]* @_ZL2t2 to [2 x [3 x %struct.T]]*), i64 1, i64 0, i64 0)
+// CHECK: getelementptr inbounds (%struct.T, ptr @_ZL2t2, i64 6)
 // CHECK: call void @_ZN1TD1Ev
 // CHECK: icmp eq {{.*}} @_ZL2t2
 // CHECK: br i1 {{.*}}
@@ -56,7 +56,7 @@ using U = T[2][3];
 U &&u = U{ {{1.0, 2}, {3.0, 4}, {5.0, 6}}, {{7.0, 8}, {9.0, 10}, {11.0, 12}} };
 
 // CHECK: call {{.*}} @__cxa_atexit
-// CHECK: getelementptr inbounds ([2 x [3 x %struct.T]], [2 x [3 x %struct.T]]* @_ZGR1u_, i64 1, i64 0, i64 0)
+// CHECK: getelementptr inbounds (%struct.T, ptr @_ZGR1u_, i64 6)
 // CHECK: call void @_ZN1TD1Ev
 // CHECK: icmp eq {{.*}} @_ZGR1u_
 // CHECK: br i1 {{.*}}

diff  --git a/clang/test/CodeGenCXX/global-init.cpp b/clang/test/CodeGenCXX/global-init.cpp
index a50832b413cc7..757ac5465fb48 100644
--- a/clang/test/CodeGenCXX/global-init.cpp
+++ b/clang/test/CodeGenCXX/global-init.cpp
@@ -1,10 +1,10 @@
-// RUN: %clang_cc1 %std_cxx98-14 -no-opaque-pointers -triple=x86_64-apple-darwin10 -emit-llvm -fexceptions %s -o - |FileCheck %s --check-prefixes=CHECK,PRE17
-// RUN: %clang_cc1 %std_cxx98-14 -no-opaque-pointers -triple=x86_64-apple-darwin10 -emit-llvm %s -o - |FileCheck %s --check-prefixes=CHECK-NOEXC,PRE17
-// RUN: %clang_cc1 %std_cxx98-14 -no-opaque-pointers -triple=x86_64-apple-darwin10 -emit-llvm -mframe-pointer=non-leaf %s -o - \
+// RUN: %clang_cc1 %std_cxx98-14 -triple=x86_64-apple-darwin10 -emit-llvm -fexceptions %s -o - |FileCheck %s --check-prefixes=CHECK,PRE17
+// RUN: %clang_cc1 %std_cxx98-14 -triple=x86_64-apple-darwin10 -emit-llvm %s -o - |FileCheck %s --check-prefixes=CHECK-NOEXC,PRE17
+// RUN: %clang_cc1 %std_cxx98-14 -triple=x86_64-apple-darwin10 -emit-llvm -mframe-pointer=non-leaf %s -o - \
 // RUN:   | FileCheck -check-prefix CHECK-FP %s
-// RUN: %clang_cc1 %std_cxx98-14 -no-opaque-pointers -triple=x86_64-apple-darwin10 -emit-llvm %s -o - -fno-builtin \
+// RUN: %clang_cc1 %std_cxx98-14 -triple=x86_64-apple-darwin10 -emit-llvm %s -o - -fno-builtin \
 // RUN:   | FileCheck -check-prefix CHECK-NOBUILTIN %s
-// RUN: %clang_cc1 %std_cxx17- -no-opaque-pointers -triple=x86_64-apple-darwin10 -emit-llvm -fexceptions %s -o - | FileCheck %s
+// RUN: %clang_cc1 %std_cxx17- -triple=x86_64-apple-darwin10 -emit-llvm -fexceptions %s -o - | FileCheck %s
 
 struct A {
   A();
@@ -22,22 +22,22 @@ struct D { ~D(); };
 
 // PR6205: The casts should not require global initializers
 // CHECK: @_ZN6PR59741cE = external global %"struct.PR5974::C"
-// CHECK: @_ZN6PR59741aE ={{.*}} global %"struct.PR5974::A"* getelementptr inbounds (%"struct.PR5974::C", %"struct.PR5974::C"* @_ZN6PR59741cE, i32 0, i32 0)
-// CHECK: @_ZN6PR59741bE ={{.*}} global %"struct.PR5974::B"* bitcast (i8* getelementptr (i8, i8* bitcast (%"struct.PR5974::C"* @_ZN6PR59741cE to i8*), i64 4) to %"struct.PR5974::B"*), align 8
+// CHECK: @_ZN6PR59741aE ={{.*}} global ptr @_ZN6PR59741cE
+// CHECK: @_ZN6PR59741bE ={{.*}} global ptr getelementptr (i8, ptr @_ZN6PR59741cE, i64 4), align 8
 
-// CHECK: call void @_ZN1AC1Ev(%struct.A* {{[^,]*}} @a)
-// CHECK: call i32 @__cxa_atexit(void (i8*)* bitcast (void (%struct.A*)* @_ZN1AD1Ev to void (i8*)*), i8* getelementptr inbounds (%struct.A, %struct.A* @a, i32 0, i32 0), i8* @__dso_handle)
+// CHECK: call void @_ZN1AC1Ev(ptr {{[^,]*}} @a)
+// CHECK: call i32 @__cxa_atexit(ptr @_ZN1AD1Ev, ptr @a, ptr @__dso_handle)
 A a;
 
-// CHECK: call void @_ZN1BC1Ev(%struct.B* {{[^,]*}} @b)
-// CHECK: call i32 @__cxa_atexit(void (i8*)* bitcast (void (%struct.B*)* @_ZN1BD1Ev to void (i8*)*), i8* getelementptr inbounds (%struct.B, %struct.B* @b, i32 0, i32 0), i8* @__dso_handle)
+// CHECK: call void @_ZN1BC1Ev(ptr {{[^,]*}} @b)
+// CHECK: call i32 @__cxa_atexit(ptr @_ZN1BD1Ev, ptr @b, ptr @__dso_handle)
 B b;
 
 // PR6205: this should not require a global initializer
-// CHECK-NOT: call void @_ZN1CC1Ev(%struct.C* @c)
+// CHECK-NOT: call void @_ZN1CC1Ev(ptr @c)
 C c;
 
-// CHECK: call i32 @__cxa_atexit(void (i8*)* bitcast (void (%struct.D*)* @_ZN1DD1Ev to void (i8*)*), i8* getelementptr inbounds (%struct.D, %struct.D* @d, i32 0, i32 0), i8* @__dso_handle)
+// CHECK: call i32 @__cxa_atexit(ptr @_ZN1DD1Ev, ptr @d, ptr @__dso_handle)
 D d;
 
 // <rdar://problem/7458115>
@@ -61,7 +61,7 @@ namespace test2 {
 // CHECK: call void @_ZN5test29allocatorC1Ev(
 // CHECK: invoke void @_ZN5test21AC1ERKNS_9allocatorE(
 // CHECK: call void @_ZN5test29allocatorD1Ev(
-// CHECK: call i32 @__cxa_atexit({{.*}} @_ZN5test21AD1Ev {{.*}} @_ZN5test21aE
+// CHECK: call i32 @__cxa_atexit({{.*}} @_ZN5test21AD1Ev, {{.*}} @_ZN5test21aE
 }
 
 namespace test3 {
@@ -79,10 +79,10 @@ namespace test4 {
   extern int foo();
 
   // This needs an initialization function and guard variables.
-  // CHECK: load i8, i8* bitcast (i64* @_ZGVN5test41xE to i8*)
-  // CHECK: store i8 1, i8* bitcast (i64* @_ZGVN5test41xE to i8*)
+  // CHECK: load i8, ptr @_ZGVN5test41xE
+  // CHECK: store i8 1, ptr @_ZGVN5test41xE
   // CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_ZN5test43fooEv
-  // CHECK-NEXT: store i32 [[CALL]], i32* @_ZN5test41xE
+  // CHECK-NEXT: store i32 [[CALL]], ptr @_ZN5test41xE
   __attribute__((weak)) int x = foo();
 }
 
@@ -191,13 +191,13 @@ namespace test7 {
 // At the end of the file, we check that y is initialized before z.
 
 // CHECK:      define internal void [[TEST1_Z_INIT:@.*]]()
-// CHECK:        load i32, i32* @_ZN5test1L1yE
+// CHECK:        load i32, ptr @_ZN5test1L1yE
 // CHECK-NEXT:   xor
-// CHECK-NEXT:   store i32 {{.*}}, i32* @_ZN5test1L1zE
+// CHECK-NEXT:   store i32 {{.*}}, ptr @_ZN5test1L1zE
 // CHECK:      define internal void [[TEST1_Y_INIT:@.*]]()
-// CHECK:        load i32, i32* @_ZN5test1L1xE
+// CHECK:        load i32, ptr @_ZN5test1L1xE
 // CHECK-NEXT:   sub
-// CHECK-NEXT:   store i32 {{.*}}, i32* @_ZN5test1L1yE
+// CHECK-NEXT:   store i32 {{.*}}, ptr @_ZN5test1L1yE
 
 // CHECK: define internal void @_GLOBAL__sub_I_global_init.cpp() #{{[0-9]+}} section "__TEXT,__StaticInit,regular,pure_instructions" {
 // CHECK:   call void [[TEST1_Y_INIT]]

diff  --git a/clang/test/CodeGenCXX/inheriting-constructor.cpp b/clang/test/CodeGenCXX/inheriting-constructor.cpp
index 751604fad194c..b984ea177f211 100644
--- a/clang/test/CodeGenCXX/inheriting-constructor.cpp
+++ b/clang/test/CodeGenCXX/inheriting-constructor.cpp
@@ -1,8 +1,8 @@
-// RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -std=c++11 -triple i386-linux -emit-llvm -o - %s | FileCheck %s --check-prefix=ITANIUM
-// RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -std=c++11 -triple x86_64-darwin -emit-llvm -o - %s | FileCheck %s --check-prefix=ITANIUM
-// RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -std=c++11 -triple arm64-ehabi -emit-llvm -o - %s | FileCheck %s --check-prefix=ITANIUM
-// RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -std=c++11 -triple i386-windows -emit-llvm -o - %s | FileCheck %s --check-prefix=MSABI --check-prefix=WIN32
-// RUN: %clang_cc1 -no-opaque-pointers -no-enable-noundef-analysis -std=c++11 -triple x86_64-windows -emit-llvm -o - %s | FileCheck %s --check-prefix=MSABI --check-prefix=WIN64
+// RUN: %clang_cc1 -no-enable-noundef-analysis -std=c++11 -triple i386-linux -emit-llvm -o - %s | FileCheck %s --check-prefix=ITANIUM
+// RUN: %clang_cc1 -no-enable-noundef-analysis -std=c++11 -triple x86_64-darwin -emit-llvm -o - %s | FileCheck %s --check-prefix=ITANIUM
+// RUN: %clang_cc1 -no-enable-noundef-analysis -std=c++11 -triple arm64-ehabi -emit-llvm -o - %s | FileCheck %s --check-prefix=ITANIUM
+// RUN: %clang_cc1 -no-enable-noundef-analysis -std=c++11 -triple i386-windows -emit-llvm -o - %s | FileCheck %s --check-prefix=MSABI --check-prefix=WIN32
+// RUN: %clang_cc1 -no-enable-noundef-analysis -std=c++11 -triple x86_64-windows -emit-llvm -o - %s | FileCheck %s --check-prefix=MSABI --check-prefix=WIN64
 
 // PR12219
 struct A { A(int); virtual ~A(); };
@@ -46,28 +46,28 @@ namespace noninline_nonvirt {
   B b(1, 2, &b);
   // ITANIUM-LABEL: define {{.*}} @__cxx_global_var_init
   // ITANIUM: call void @_ZN1QC1Ei({{.*}} %[[TMP:.*]], i32 2)
-  // ITANIUM: call void @_ZN17noninline_nonvirt1BCI1NS_1AEEiO1QPvU17pass_object_size0({{.*}} @_ZN17noninline_nonvirt1bE, i32 1, {{.*}} %[[TMP]], i8* {{.*}} @_ZN17noninline_nonvirt1bE{{.*}}, i{{32|64}} 12)
+  // ITANIUM: call void @_ZN17noninline_nonvirt1BCI1NS_1AEEiO1QPvU17pass_object_size0({{.*}} @_ZN17noninline_nonvirt1bE, i32 1, {{.*}} %[[TMP]], ptr @_ZN17noninline_nonvirt1bE{{.*}}, i{{32|64}} 12)
   // ITANIUM: call void @_ZN1QD1Ev({{.*}} %[[TMP]])
   // ITANIUM: call i32 @__cxa_atexit(
 
   // Complete object ctor for B delegates to base object ctor.
   // ITANIUM-LABEL: define linkonce_odr void @_ZN17noninline_nonvirt1BCI1NS_1AEEiO1QPvU17pass_object_size0(
-  // ITANIUM: call void @_ZN17noninline_nonvirt1BCI2NS_1AEEiO1QPvU17pass_object_size0({{.*}}, i32 {{.*}}, %{{.*}}* {{.*}}, i8* {{.*}}, i{{32|64}} {{.*}})
+  // ITANIUM: call void @_ZN17noninline_nonvirt1BCI2NS_1AEEiO1QPvU17pass_object_size0({{.*}}, i32 {{.*}}, ptr {{.*}}, ptr {{.*}}, i{{32|64}} {{.*}})
 
   // In MSABI, we don't have ctor variants. B ctor forwards to A ctor.
-  // MSABI-LABEL: define internal {{.*}} @"??0B at noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}})
+  // MSABI-LABEL: define internal {{.*}} @"??0B at noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}})
   // MSABI: call {{.*}} @"??0Z@@Q{{AE|EAA}}@XZ"(
-  // MSABI: call {{.*}} @"??0A at noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}})
+  // MSABI: call {{.*}} @"??0A at noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}})
   // MSABI: call {{.*}} @"??0Z@@Q{{AE|EAA}}@XZ"(
 
   struct C : B { using B::B; };
   C c(1, 2, &c);
   // Complete object ctor for C delegates.
   // ITANIUM-LABEL: define linkonce_odr void @_ZN17noninline_nonvirt1CCI1NS_1AEEiO1QPvU17pass_object_size0(
-  // ITANIUM: call void @_ZN17noninline_nonvirt1CCI2NS_1AEEiO1QPvU17pass_object_size0({{.*}}, i32 {{.*}}, %{{.*}}* {{.*}}, i8* {{.*}}, i{{32|64}} {{.*}})
+  // ITANIUM: call void @_ZN17noninline_nonvirt1CCI2NS_1AEEiO1QPvU17pass_object_size0({{.*}}, i32 {{.*}}, ptr {{.*}}, ptr {{.*}}, i{{32|64}} {{.*}})
 
-  // MSABI-LABEL: define internal {{.*}} @"??0C at noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}})
-  // MSABI: call {{.*}} @"??0B at noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}})
+  // MSABI-LABEL: define internal {{.*}} @"??0C at noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}})
+  // MSABI: call {{.*}} @"??0B at noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}})
 }
 
 namespace noninline_virt {
@@ -76,15 +76,15 @@ namespace noninline_virt {
   B b(1, 2, &b);
   // Complete object ctor forwards to A ctor then constructs Zs.
   // ITANIUM-LABEL: define linkonce_odr void @_ZN14noninline_virt1BCI1NS_1AEEiO1QPvU17pass_object_size0(
-  // ITANIUM: call void @_ZN14noninline_virt1AC2EiO1QPvU17pass_object_size0({{.*}} %{{.*}}, i32 %{{.*}}, %{{.*}}* {{.*}}, i8* {{.*}}, i{{32|64}} %{{.*}}
+  // ITANIUM: call void @_ZN14noninline_virt1AC2EiO1QPvU17pass_object_size0({{.*}} %{{.*}}, i32 %{{.*}}, ptr {{.*}}, ptr {{.*}}, i{{32|64}} %{{.*}}
   // ITANIUM: call void @_ZN1ZC2Ev(
   // ITANIUM: store {{.*}} @_ZTVN14noninline_virt1BE
   // ITANIUM: call void @_ZN1ZC1Ev(
 
-  // MSABI-LABEL: define internal {{.*}} @"??0B at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}, i32 %{{.*}})
+  // MSABI-LABEL: define internal {{.*}} @"??0B at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}}, i32 %{{.*}})
   // MSABI: %[[COMPLETE:.*]] = icmp ne
   // MSABI: br i1 %[[COMPLETE]],
-  // MSABI: call {{.*}} @"??0A at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}})
+  // MSABI: call {{.*}} @"??0A at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}})
   // MSABI: br
   // MSABI: call {{.*}} @"??0Z@@Q{{AE|EAA}}@XZ"(
   // MSABI: call {{.*}} @"??0Z@@Q{{AE|EAA}}@XZ"(
@@ -94,19 +94,19 @@ namespace noninline_virt {
   // Complete object ctor forwards to A ctor, then calls B's base inheriting
   // constructor, which takes no arguments other than the this pointer and VTT.
   // ITANIUM-LABEL: define linkonce_odr void @_ZN14noninline_virt1CCI1NS_1AEEiO1QPvU17pass_object_size0(
-  // ITANIUM: call void @_ZN14noninline_virt1AC2EiO1QPvU17pass_object_size0({{.*}} %{{.*}}, i32 %{{.*}}, %{{.*}}* {{.*}}, i8* %{{.*}}, i{{32|64}} %{{.*}})
-  // ITANIUM: call void @_ZN14noninline_virt1BCI2NS_1AEEiO1QPvU17pass_object_size0(%{{.*}}* {{[^,]*}} %{{.*}}, i8** getelementptr inbounds ([2 x i8*], [2 x i8*]* @_ZTTN14noninline_virt1CE, i64 0, i64 1))
+  // ITANIUM: call void @_ZN14noninline_virt1AC2EiO1QPvU17pass_object_size0({{.*}} %{{.*}}, i32 %{{.*}}, ptr {{.*}}, ptr %{{.*}}, i{{32|64}} %{{.*}})
+  // ITANIUM: call void @_ZN14noninline_virt1BCI2NS_1AEEiO1QPvU17pass_object_size0(ptr {{[^,]*}} %{{.*}}, ptr getelementptr inbounds ([2 x ptr], ptr @_ZTTN14noninline_virt1CE, i64 0, i64 1))
   // ITANIUM: store {{.*}} @_ZTVN14noninline_virt1CE
 
   // C constructor forwards to B constructor and A constructor. We pass the args
   // to both. FIXME: Can we pass undef here instead, for the base object
   // constructor call?
-  // MSABI-LABEL: define internal {{.*}} @"??0C at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}, i32 %{{.*}})
+  // MSABI-LABEL: define internal {{.*}} @"??0C at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}}, i32 %{{.*}})
   // MSABI: %[[COMPLETE:.*]] = icmp ne
   // MSABI: br i1 %[[COMPLETE]],
-  // MSABI: call {{.*}} @"??0A at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}})
+  // MSABI: call {{.*}} @"??0A at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}})
   // MSABI: br
-  // MSABI: call {{.*}} @"??0B at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}, i32 0)
+  // MSABI: call {{.*}} @"??0B at noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0 at __clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}}, i32 0)
 }
 
 // For MSABI only, check that inalloca arguments result in inlining.
@@ -122,19 +122,19 @@ namespace inalloca_nonvirt {
 
   // On Win32, the inalloca call can't be forwarded so we force inlining.
   // WIN32: %[[TMP:.*]] = alloca
-  // WIN32: call i8* @llvm.stacksave()
+  // WIN32: call ptr @llvm.stacksave()
   // WIN32: %[[ARGMEM:.*]] = alloca inalloca
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(%{{.*}}* {{[^,]*}} %[[TMP]], i32 4)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4)
   // WIN32: %[[ARG3:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3)
   // WIN32: %[[ARG1:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1)
   // WIN32: call {{.*}} @"??0Z@@QAE at XZ"(
   // WIN32: %[[ARG2:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: store i32 2, i32* %[[ARG2]]
+  // WIN32: store i32 2, ptr %[[ARG2]]
   // WIN32: %[[ARG4:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: store {{.*}}* %[[TMP]], {{.*}}** %[[ARG4]]
-  // WIN32: call {{.*}} @"??0A at inalloca_nonvirt@@QAE at UQ@@H0$$QAU2@@Z"(%{{[^,]*}}, <{{.*}}>* inalloca(<{{.*}}>) %[[ARGMEM]])
+  // WIN32: store ptr %[[TMP]], ptr %[[ARG4]]
+  // WIN32: call {{.*}} @"??0A at inalloca_nonvirt@@QAE at UQ@@H0$$QAU2@@Z"(ptr{{[^,]*}}, ptr inalloca(<{{.*}}>) %[[ARGMEM]])
   // WIN32: call void @llvm.stackrestore(
   // WIN32: call {{.*}} @"??0Z@@QAE at XZ"(
   // WIN32: call {{.*}} @"??1Q@@QAE at XZ"(
@@ -144,13 +144,13 @@ namespace inalloca_nonvirt {
   // WIN64: %[[TMP:.*]] = alloca
   // WIN64: %[[ARG3:.*]] = alloca
   // WIN64: %[[ARG1:.*]] = alloca
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[TMP]], i32 4)
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3)
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1)
   // WIN64: call {{.*}} @"??0Z@@QEAA at XZ"(
-  // WIN64: call {{.*}} @"??0A at inalloca_nonvirt@@QEAA at UQ@@H0$$QEAU2@@Z"(%{{.*}}, %{{.*}}* %[[ARG1]], i32 2, %{{.*}}* %[[ARG3]], %{{.*}} %[[TMP]])
+  // WIN64: call {{.*}} @"??0A at inalloca_nonvirt@@QEAA at UQ@@H0$$QEAU2@@Z"(ptr{{.*}}, ptr %[[ARG1]], i32 2, ptr %[[ARG3]], ptr{{.*}} %[[TMP]])
   // WIN64: call {{.*}} @"??0Z@@QEAA at XZ"(
-  // WIN64: call void @"??1Q@@QEAA at XZ"({{.*}}* {{[^,]*}} %[[TMP]])
+  // WIN64: call void @"??1Q@@QEAA at XZ"(ptr {{[^,]*}} %[[TMP]])
 
   struct C : B { using B::B; };
   C c(1, 2, 3, 4);
@@ -158,19 +158,19 @@ namespace inalloca_nonvirt {
 
   // On Win32, the inalloca call can't be forwarded so we force inlining.
   // WIN32: %[[TMP:.*]] = alloca
-  // WIN32: call i8* @llvm.stacksave()
+  // WIN32: call ptr @llvm.stacksave()
   // WIN32: %[[ARGMEM:.*]] = alloca inalloca
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(%{{.*}}* {{[^,]*}} %[[TMP]], i32 4)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4)
   // WIN32: %[[ARG3:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3)
   // WIN32: %[[ARG1:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1)
   // WIN32: call {{.*}} @"??0Z@@QAE at XZ"(
   // WIN32: %[[ARG2:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: store i32 2, i32* %[[ARG2]]
+  // WIN32: store i32 2, ptr %[[ARG2]]
   // WIN32: %[[ARG4:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: store {{.*}}* %[[TMP]], {{.*}}** %[[ARG4]]
-  // WIN32: call {{.*}} @"??0A at inalloca_nonvirt@@QAE at UQ@@H0$$QAU2@@Z"(%{{[^,]*}}, <{{.*}}>* inalloca(<{{.*}}>) %[[ARGMEM]])
+  // WIN32: store ptr %[[TMP]], ptr %[[ARG4]]
+  // WIN32: call {{.*}} @"??0A at inalloca_nonvirt@@QAE at UQ@@H0$$QAU2@@Z"(ptr{{[^,]*}}, ptr inalloca(<{{.*}}>) %[[ARGMEM]])
   // WIN32: call void @llvm.stackrestore(
   // WIN32: call {{.*}} @"??0Z@@QAE at XZ"(
   // WIN32: call {{.*}} @"??1Q@@QAE at XZ"(
@@ -180,13 +180,13 @@ namespace inalloca_nonvirt {
   // WIN64: %[[TMP:.*]] = alloca
   // WIN64: %[[ARG3:.*]] = alloca
   // WIN64: %[[ARG1:.*]] = alloca
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[TMP]], i32 4)
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3)
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1)
   // WIN64: call {{.*}} @"??0Z@@QEAA at XZ"(
-  // WIN64: call {{.*}} @"??0A at inalloca_nonvirt@@QEAA at UQ@@H0$$QEAU2@@Z"(%{{.*}}, %{{.*}}* %[[ARG1]], i32 2, %{{.*}}* %[[ARG3]], %{{.*}} %[[TMP]])
+  // WIN64: call {{.*}} @"??0A at inalloca_nonvirt@@QEAA at UQ@@H0$$QEAU2@@Z"(ptr{{.*}}, ptr %[[ARG1]], i32 2, ptr %[[ARG3]], ptr{{.*}} %[[TMP]])
   // WIN64: call {{.*}} @"??0Z@@QEAA at XZ"(
-  // WIN64: call void @"??1Q@@QEAA at XZ"({{.*}}* {{[^,]*}} %[[TMP]])
+  // WIN64: call void @"??1Q@@QEAA at XZ"(ptr {{[^,]*}} %[[TMP]])
 }
 
 namespace inalloca_virt {
@@ -198,25 +198,25 @@ namespace inalloca_virt {
 
   // On Win32, the inalloca call can't be forwarded so we force inlining.
   // WIN32: %[[TMP:.*]] = alloca
-  // WIN32: call i8* @llvm.stacksave()
+  // WIN32: call ptr @llvm.stacksave()
   // WIN32: %[[ARGMEM:.*]] = alloca inalloca
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(%{{.*}}* {{[^,]*}} %[[TMP]], i32 4)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4)
   // WIN32: %[[ARG3:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3)
   // WIN32: %[[ARG1:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1)
   // FIXME: It's dumb to round-trip this though memory and generate a branch.
-  // WIN32: store i32 1, i32* %[[IS_MOST_DERIVED_ADDR:.*]]
-  // WIN32: %[[IS_MOST_DERIVED:.*]] = load i32, i32* %[[IS_MOST_DERIVED_ADDR]]
+  // WIN32: store i32 1, ptr %[[IS_MOST_DERIVED_ADDR:.*]]
+  // WIN32: %[[IS_MOST_DERIVED:.*]] = load i32, ptr %[[IS_MOST_DERIVED_ADDR]]
   // WIN32: %[[IS_MOST_DERIVED_i1:.*]] = icmp ne i32 %[[IS_MOST_DERIVED]], 0
   // WIN32: br i1 %[[IS_MOST_DERIVED_i1]]
   //
   // WIN32: store {{.*}} @"??_8B at inalloca_virt@@7B@"
   // WIN32: %[[ARG2:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: store i32 2, i32* %[[ARG2]]
+  // WIN32: store i32 2, ptr %[[ARG2]]
   // WIN32: %[[ARG4:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: store {{.*}}* %[[TMP]], {{.*}}** %[[ARG4]]
-  // WIN32: call {{.*}} @"??0A at inalloca_virt@@QAE at UQ@@H0$$QAU2@@Z"(%{{[^,]*}}, <{{.*}}>* inalloca(<{{.*}}>) %[[ARGMEM]])
+  // WIN32: store ptr %[[TMP]], ptr %[[ARG4]]
+  // WIN32: call {{.*}} @"??0A at inalloca_virt@@QAE at UQ@@H0$$QAU2@@Z"(ptr{{[^,]*}}, ptr inalloca(<{{.*}}>) %[[ARGMEM]])
   // WIN32: call void @llvm.stackrestore(
   // WIN32: br
   //
@@ -231,15 +231,15 @@ namespace inalloca_virt {
   // WIN64: %[[TMP:.*]] = alloca
   // WIN64: %[[ARG3:.*]] = alloca
   // WIN64: %[[ARG1:.*]] = alloca
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[TMP]], i32 4)
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3)
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1)
   // WIN64: br i1
-  // WIN64: call {{.*}} @"??0A at inalloca_virt@@QEAA at UQ@@H0$$QEAU2@@Z"(%{{.*}}, %{{.*}}* %[[ARG1]], i32 2, %{{.*}}* %[[ARG3]], %{{.*}} %[[TMP]])
+  // WIN64: call {{.*}} @"??0A at inalloca_virt@@QEAA at UQ@@H0$$QEAU2@@Z"(ptr{{.*}}, ptr %[[ARG1]], i32 2, ptr %[[ARG3]], ptr{{.*}} %[[TMP]])
   // WIN64: br
   // WIN64: call {{.*}} @"??0Z@@QEAA at XZ"(
   // WIN64: call {{.*}} @"??0Z@@QEAA at XZ"(
-  // WIN64: call void @"??1Q@@QEAA at XZ"({{.*}}* {{[^,]*}} %[[TMP]])
+  // WIN64: call void @"??1Q@@QEAA at XZ"(ptr {{[^,]*}} %[[TMP]])
 
   struct C : B { using B::B; };
   C c(1, 2, 3, 4);
@@ -249,24 +249,24 @@ namespace inalloca_virt {
 
   // On Win32, the inalloca call can't be forwarded so we force inlining.
   // WIN32: %[[TMP:.*]] = alloca
-  // WIN32: call i8* @llvm.stacksave()
+  // WIN32: call ptr @llvm.stacksave()
   // WIN32: %[[ARGMEM:.*]] = alloca inalloca
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(%{{.*}}* {{[^,]*}} %[[TMP]], i32 4)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4)
   // WIN32: %[[ARG3:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3)
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3)
   // WIN32: %[[ARG1:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1)
-  // WIN32: store i32 1, i32* %[[IS_MOST_DERIVED_ADDR:.*]]
-  // WIN32: %[[IS_MOST_DERIVED:.*]] = load i32, i32* %[[IS_MOST_DERIVED_ADDR]]
+  // WIN32: call {{.*}} @"??0Q@@QAE at H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1)
+  // WIN32: store i32 1, ptr %[[IS_MOST_DERIVED_ADDR:.*]]
+  // WIN32: %[[IS_MOST_DERIVED:.*]] = load i32, ptr %[[IS_MOST_DERIVED_ADDR]]
   // WIN32: %[[IS_MOST_DERIVED_i1:.*]] = icmp ne i32 %[[IS_MOST_DERIVED]], 0
   // WIN32: br i1 %[[IS_MOST_DERIVED_i1]]
   //
   // WIN32: store {{.*}} @"??_8C at inalloca_virt@@7B@"
   // WIN32: %[[ARG2:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: store i32 2, i32* %[[ARG2]]
+  // WIN32: store i32 2, ptr %[[ARG2]]
   // WIN32: %[[ARG4:.*]] = getelementptr {{.*}} %[[ARGMEM]]
-  // WIN32: store {{.*}}* %[[TMP]], {{.*}}** %[[ARG4]]
-  // WIN32: call {{.*}} @"??0A at inalloca_virt@@QAE at UQ@@H0$$QAU2@@Z"(%{{[^,]*}}, <{{.*}}>* inalloca(<{{.*}}>) %[[ARGMEM]])
+  // WIN32: store ptr %[[TMP]], ptr %[[ARG4]]
+  // WIN32: call {{.*}} @"??0A at inalloca_virt@@QAE at UQ@@H0$$QAU2@@Z"(ptr{{[^,]*}}, ptr inalloca(<{{.*}}>) %[[ARGMEM]])
   // WIN32: call void @llvm.stackrestore(
   // WIN32: br
   //
@@ -279,15 +279,15 @@ namespace inalloca_virt {
   // WIN64: %[[TMP:.*]] = alloca
   // WIN64: %[[ARG3:.*]] = alloca
   // WIN64: %[[ARG1:.*]] = alloca
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[TMP]], i32 4)
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3)
-  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3)
+  // WIN64: call {{.*}} @"??0Q@@QEAA at H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1)
   // WIN64: br i1
   // WIN64: store {{.*}} @"??_8C at inalloca_virt@@7B@"
-  // WIN64: call {{.*}} @"??0A at inalloca_virt@@QEAA at UQ@@H0$$QEAU2@@Z"(%{{.*}}, %{{.*}}* %[[ARG1]], i32 2, %{{.*}}* %[[ARG3]], %{{.*}} %[[TMP]])
+  // WIN64: call {{.*}} @"??0A at inalloca_virt@@QEAA at UQ@@H0$$QEAU2@@Z"(ptr{{.*}}, ptr %[[ARG1]], i32 2, ptr %[[ARG3]], ptr{{.*}} %[[TMP]])
   // WIN64: call {{.*}} @"??0Z@@QEAA at XZ"(
   // WIN64: call {{.*}} @"??0Z@@QEAA at XZ"(
-  // WIN64: call void @"??1Q@@QEAA at XZ"({{.*}}* {{[^,]*}} %[[TMP]])
+  // WIN64: call void @"??1Q@@QEAA at XZ"(ptr {{[^,]*}} %[[TMP]])
 }
 
 namespace inline_nonvirt {
@@ -299,13 +299,10 @@ namespace inline_nonvirt {
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 1)
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 3)
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 4)
-  // ITANIUM: %[[Z_BASE:.*]] = bitcast %{{.*}}* %[[THIS:.*]] to
   // ITANIUM: call void @_ZN1ZC2Ev(
-  // ITANIUM: %[[B_CAST:.*]] = bitcast {{.*}} %[[THIS]]
-  // ITANIUM: %[[A_CAST:.*]] = getelementptr {{.*}} %[[B_CAST]], i{{32|64}} 4
-  // ITANIUM: %[[A:.*]] = bitcast {{.*}} %[[A_CAST]]
-  // ITANIUM: call void ({{.*}}, ...) @_ZN14inline_nonvirt1AC2E1QiS1_OS1_z(%{{.*}}* {{[^,]*}} %[[A]], {{.*}}, i32 2, {{.*}}, {{.*}}, i32 5, i32 6)
-  // ITANIUM: %[[Z_MEMBER:.*]] = getelementptr {{.*}} %[[THIS]], i32 0, i32 2
+  // ITANIUM: %[[A:.*]] = getelementptr {{.*}}, i{{32|64}} 4
+  // ITANIUM: call void ({{.*}}, ...) @_ZN14inline_nonvirt1AC2E1QiS1_OS1_z(ptr {{[^,]*}} %[[A]], {{.*}}, i32 2, {{.*}}, {{.*}}, i32 5, i32 6)
+  // ITANIUM: %[[Z_MEMBER:.*]] = getelementptr {{.*}}, i32 0, i32 2
   // ITANIUM: call void @_ZN1ZC1Ev({{.*}} %[[Z_MEMBER]])
   // ITANIUM: call void @_ZN1QD1Ev(
   // ITANIUM: call void @_ZN1QD1Ev(
@@ -318,12 +315,9 @@ namespace inline_nonvirt {
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 1)
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 3)
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 4)
-  // ITANIUM: %[[Z_BASE:.*]] = bitcast %{{.*}}* %[[THIS:.*]] to
   // ITANIUM: call void @_ZN1ZC2Ev(
-  // ITANIUM: %[[B_CAST:.*]] = bitcast {{.*}} %[[THIS]]
-  // ITANIUM: %[[A_CAST:.*]] = getelementptr {{.*}} %[[B_CAST]], i{{32|64}} 4
-  // ITANIUM: %[[A:.*]] = bitcast {{.*}} %[[A_CAST]]
-  // ITANIUM: call void ({{.*}}, ...) @_ZN14inline_nonvirt1AC2E1QiS1_OS1_z(%{{.*}}* {{[^,]*}} %[[A]], {{.*}}, i32 2, {{.*}}, {{.*}}, i32 5, i32 6)
+  // ITANIUM: %[[A:.*]] = getelementptr {{.*}}, i{{32|64}} 4
+  // ITANIUM: call void ({{.*}}, ...) @_ZN14inline_nonvirt1AC2E1QiS1_OS1_z(ptr {{[^,]*}} %[[A]], {{.*}}, i32 2, {{.*}}, {{.*}}, i32 5, i32 6)
   // ITANIUM: %[[Z_MEMBER:.*]] = getelementptr {{.*}} %{{.*}}, i32 0, i32 2
   // ITANIUM: call void @_ZN1ZC1Ev({{.*}} %[[Z_MEMBER]])
   // ITANIUM: call void @_ZN1QD1Ev(
@@ -340,10 +334,8 @@ namespace inline_virt {
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 1)
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 3)
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 4)
-  // ITANIUM: %[[B_CAST:.*]] = bitcast {{.*}} %[[THIS:.*]]
-  // ITANIUM: %[[A_CAST:.*]] = getelementptr {{.*}} %[[B_CAST]], i{{32|64}} {{12|16}}
-  // ITANIUM: %[[A:.*]] = bitcast {{.*}} %[[A_CAST]]
-  // ITANIUM: call void ({{.*}}, ...) @_ZN11inline_virt1AC2E1QiS1_OS1_z(%{{.*}}* {{[^,]*}} %[[A]], {{.*}}, i32 2, {{.*}}, {{.*}}, i32 5, i32 6)
+  // ITANIUM: %[[A:.*]] = getelementptr {{.*}}, i{{32|64}} {{12|16}}
+  // ITANIUM: call void ({{.*}}, ...) @_ZN11inline_virt1AC2E1QiS1_OS1_z(ptr {{[^,]*}} %[[A]], {{.*}}, i32 2, {{.*}}, {{.*}}, i32 5, i32 6)
   // ITANIUM: call void @_ZN1ZC2Ev(
   // ITANIUM: call void @_ZN1ZC1Ev(
   // ITANIUM: call void @_ZN1QD1Ev(
@@ -359,11 +351,9 @@ namespace inline_virt {
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 1)
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 3)
   // ITANIUM: call void @_ZN1QC1Ei({{.*}}, i32 4)
-  // ITANIUM: %[[B_CAST:.*]] = bitcast {{.*}} %[[THIS:.*]]
-  // ITANIUM: %[[A_CAST:.*]] = getelementptr {{.*}} %[[B_CAST]], i{{32|64}} {{12|16}}
-  // ITANIUM: %[[A:.*]] = bitcast {{.*}} %[[A_CAST]]
-  // ITANIUM: call void ({{.*}}, ...) @_ZN11inline_virt1AC2E1QiS1_OS1_z(%{{.*}}* {{[^,]*}} %[[A]], {{.*}}, i32 2, {{.*}}, {{.*}}, i32 5, i32 6)
-  // ITANIUM: call void @_ZN11inline_virt1BCI2NS_1AEE1QiS1_OS1_z({{[^,]*}}, i8** getelementptr inbounds ([2 x i8*], [2 x i8*]* @_ZTTN11inline_virt1CE, i64 0, i64 1))
+  // ITANIUM: %[[A:.*]] = getelementptr {{.*}}, i{{32|64}} {{12|16}}
+  // ITANIUM: call void ({{.*}}, ...) @_ZN11inline_virt1AC2E1QiS1_OS1_z(ptr {{[^,]*}} %[[A]], {{.*}}, i32 2, {{.*}}, {{.*}}, i32 5, i32 6)
+  // ITANIUM: call void @_ZN11inline_virt1BCI2NS_1AEE1QiS1_OS1_z({{[^,]*}}, ptr getelementptr inbounds ([2 x ptr], ptr @_ZTTN11inline_virt1CE, i64 0, i64 1))
   // ITANIUM: store {{.*}} @_ZTVN11inline_virt1CE
   // ITANIUM: call void @_ZN1QD1Ev(
   // ITANIUM: call void @_ZN1QD1Ev(

diff  --git a/clang/test/CodeGenCXX/lambda-expressions-inside-auto-functions.cpp b/clang/test/CodeGenCXX/lambda-expressions-inside-auto-functions.cpp
index dd08026c3a176..bc5a4f1e7d373 100644
--- a/clang/test/CodeGenCXX/lambda-expressions-inside-auto-functions.cpp
+++ b/clang/test/CodeGenCXX/lambda-expressions-inside-auto-functions.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++1y | FileCheck --check-prefix CHECK_ABI_LATEST %s
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++1y -fclang-abi-compat=6.0 | FileCheck --check-prefix CHECK_ABIV6 %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++1y | FileCheck --check-prefix CHECK_ABI_LATEST %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++1y -fclang-abi-compat=6.0 | FileCheck --check-prefix CHECK_ABIV6 %s
 
 // CHECK-LABEL: define void @_ZN19non_inline_function3fooEv
 // CHECK-LABEL: define internal void @"_ZZN19non_inline_function3fooEvENK3$_0clEi"(%class.anon
@@ -24,9 +24,9 @@ auto foo2() {
 auto use = foo2<int>();
 
 }
-//CHECK-LABEL: define linkonce_odr void @_ZN22inline_member_function1X3fooEv(%"struct.inline_member_function::X"* %this)
-//CHECK-LABEL: define linkonce_odr void @_ZZN22inline_member_function1X3fooEvENKUliE_clEi(%class.anon
-//CHECK-LABEL: define linkonce_odr signext i8 @_ZZZN22inline_member_function1X3fooEvENKUliE_clEiENKUlcE_clEc(%class.anon
+//CHECK-LABEL: define linkonce_odr void @_ZN22inline_member_function1X3fooEv(ptr %this)
+//CHECK-LABEL: define linkonce_odr void @_ZZN22inline_member_function1X3fooEvENKUliE_clEi(ptr
+//CHECK-LABEL: define linkonce_odr signext i8 @_ZZZN22inline_member_function1X3fooEvENKUliE_clEiENKUlcE_clEc(ptr
 
 namespace inline_member_function {
 struct X {
@@ -53,12 +53,12 @@ struct A {
   
   template<class T> auto foo() { return [](const T&) { return 42; }; }
 };
-//CHECK_ABIV6: define linkonce_odr noundef i32 @_ZZN22inline_member_function1AIdE14default_lambdaIdEEDavENKUlRKdE_clES5_(%class.anon
-//CHECK_ABI_LATEST: define linkonce_odr noundef i32 @_ZZN22inline_member_function1AIdE14default_lambdaIdEEDavENKUlRKdE_clES4_(%class.anon
+//CHECK_ABIV6: define linkonce_odr noundef i32 @_ZZN22inline_member_function1AIdE14default_lambdaIdEEDavENKUlRKdE_clES5_(ptr
+//CHECK_ABI_LATEST: define linkonce_odr noundef i32 @_ZZN22inline_member_function1AIdE14default_lambdaIdEEDavENKUlRKdE_clES4_(ptr
 int run2 = A<double>{}.func()(3.14);
 
-//CHECK_ABIV6: define linkonce_odr noundef i32 @_ZZN22inline_member_function1AIcE14default_lambdaIcEEDavENKUlRKcE_clES5_(%class.anon
-//CHECK_ABI_LATEST: define linkonce_odr noundef i32 @_ZZN22inline_member_function1AIcE14default_lambdaIcEEDavENKUlRKcE_clES4_(%class.anon
+//CHECK_ABIV6: define linkonce_odr noundef i32 @_ZZN22inline_member_function1AIcE14default_lambdaIcEEDavENKUlRKcE_clES5_(ptr
+//CHECK_ABI_LATEST: define linkonce_odr noundef i32 @_ZZN22inline_member_function1AIcE14default_lambdaIcEEDavENKUlRKcE_clES4_(ptr
 int run3 = A<char>{}.func()('a');
 } // end inline_member_function
 

diff  --git a/clang/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp b/clang/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp
index c6b752e3e9e7c..18d2080a611e8 100644
--- a/clang/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp
+++ b/clang/test/CodeGenCXX/lambda-expressions-nested-linkage.cpp
@@ -1,9 +1,9 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++14 | FileCheck --check-prefixes=CHECK,CXX14 %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++14 | FileCheck --check-prefixes=CHECK,CXX14 %s
 
 // CHECK-LABEL: define{{.*}} void @_ZN19non_inline_function3fooEv()
-// CHECK-LABEL: define internal void @"_ZZN19non_inline_function3fooEvENK3$_0clEi"(%class.anon
-// CHECK-LABEL: define internal noundef signext i8 @"_ZZZN19non_inline_function3fooEvENK3$_0clEiENKUlcE_clEc"(%class.anon
+// CHECK-LABEL: define internal void @"_ZZN19non_inline_function3fooEvENK3$_0clEi"(ptr
+// CHECK-LABEL: define internal noundef signext i8 @"_ZZZN19non_inline_function3fooEvENK3$_0clEiENKUlcE_clEc"(ptr
 namespace non_inline_function {
 void foo() {
   auto L = [](int a) {
@@ -39,12 +39,12 @@ L<int> l;
 
 // CHECK-LABEL: define linkonce_odr noundef i32 @_ZN15inline_function3fooEv
 
-// CHECK-LABEL: define linkonce_odr void @_ZNK12non_template1L1tMUliE_clEi(%class.anon
-// CHECK-LABEL: define linkonce_odr noundef i32 @_ZZNK12non_template1L1tMUliE_clEiENKUliE_clEi(%class.anon
+// CHECK-LABEL: define linkonce_odr void @_ZNK12non_template1L1tMUliE_clEi(ptr
+// CHECK-LABEL: define linkonce_odr noundef i32 @_ZZNK12non_template1L1tMUliE_clEiENKUliE_clEi(ptr
 
 
-// CHECK-LABEL: define linkonce_odr void @_ZNK32lambdas_in_NSDMIs_template_class1LIiEUliE_clEi(%class.anon
-// CHECK-LABEL: define linkonce_odr noundef i32 @_ZZNK32lambdas_in_NSDMIs_template_class1LIiEUliE_clEiENKUliE_clEi(%class.anon
+// CHECK-LABEL: define linkonce_odr void @_ZNK32lambdas_in_NSDMIs_template_class1LIiEUliE_clEi(ptr
+// CHECK-LABEL: define linkonce_odr noundef i32 @_ZZNK32lambdas_in_NSDMIs_template_class1LIiEUliE_clEiENKUliE_clEi(ptr
 
 // CHECK-LABEL: define linkonce_odr void @_ZZN15inline_function3fooEvENKUliE_clEi
 // CHECK-LABEL: define linkonce_odr noundef signext i8 @_ZZZN15inline_function3fooEvENKUliE_clEiENKUlcE_clEc

diff  --git a/clang/test/CodeGenCXX/lvalue-bitcasts.cpp b/clang/test/CodeGenCXX/lvalue-bitcasts.cpp
index 6435c8bab0041..899c35781d92a 100644
--- a/clang/test/CodeGenCXX/lvalue-bitcasts.cpp
+++ b/clang/test/CodeGenCXX/lvalue-bitcasts.cpp
@@ -1,94 +1,76 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s
 
 struct X { int i; float f; };
 struct Y { X x; };
 
 // CHECK-LABEL: define{{.*}} void @_Z21reinterpret_cast_testRiRfR1X
 void reinterpret_cast_test(int &ir, float &fr, X &xr) {
-  // CHECK: load float*, float**
-  // CHECK: bitcast float*
-  // CHECK: load i32, i32*
+  // CHECK: load ptr, ptr
+  // CHECK: load i32, ptr
   ir = reinterpret_cast<int&>(fr);
   // CHECK: load
-  // CHECK: {{bitcast.*to i32\*}}
-  // CHECK: load i32, i32*
+  // CHECK: load i32, ptr
   ir = reinterpret_cast<int&>(xr);
-  // CHECK: load i32
-  // CHECK: {{bitcast.*to float\*}}
-  // CHECK: load float, float*
+  // CHECK: load ptr
+  // CHECK: load float, ptr
   fr = reinterpret_cast<float&>(ir);
   // CHECK: load
-  // CHECK: {{bitcast.*to float\*}}
-  // CHECK: load float, float*
+  // CHECK: load float, ptr
   fr = reinterpret_cast<float&>(xr);
-  // CHECK: load i32*, i32**
-  // CHECK: bitcast i32*
-  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
+  // CHECK: load ptr, ptr
+  // CHECK: call void @llvm.memcpy.p0.p0.i64
   xr = reinterpret_cast<X&>(ir);
-  // CHECK: load float*, float**
-  // CHECK: bitcast float*
-  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
+  // CHECK: load ptr, ptr
+  // CHECK: call void @llvm.memcpy.p0.p0.i64
   xr = reinterpret_cast<X&>(fr);
   _Complex float cf;
   _Complex float &cfr = cf;
-  // CHECK: load i32*, i32**
-  // CHECK: bitcast i32*
-  // CHECK: load float, float*
-  // CHECK: load float, float*
+  // CHECK: load ptr, ptr
+  // CHECK: load float, ptr
+  // CHECK: load float, ptr
   cfr = reinterpret_cast<_Complex float&>(ir);
-  // CHECK: load float*, float**
-  // CHECK: bitcast float*
-  // CHECK: load float, float*
-  // CHECK: load float, float*
+  // CHECK: load ptr, ptr
+  // CHECK: load float, ptr
+  // CHECK: load float, ptr
   cfr = reinterpret_cast<_Complex float&>(fr);
-  // CHECK: bitcast
-  // CHECK: load float, float*
-  // CHECK: load float, float*
+  // CHECK: load float, ptr
+  // CHECK: load float, ptr
   cfr = reinterpret_cast<_Complex float&>(xr);
   // CHECK: ret void
 }
 
 // CHECK-LABEL: define{{.*}} void @_Z6c_castRiRfR1X
 void c_cast(int &ir, float &fr, X &xr) {
-  // CHECK: load float*, float**
-  // CHECK: bitcast float*
-  // CHECK: load i32, i32*
+  // CHECK: load ptr, ptr
+  // CHECK: load i32, ptr
   ir = (int&)fr;
   // CHECK: load
-  // CHECK: {{bitcast.*to i32\*}}
-  // CHECK: load i32, i32*
+  // CHECK: load i32, ptr
   ir = (int&)xr;
-  // CHECK: load i32
-  // CHECK: {{bitcast.*to float\*}}
-  // CHECK: load float, float*
+  // CHECK: load ptr
+  // CHECK: load float, ptr
   fr = (float&)ir;
   // CHECK: load
-  // CHECK: {{bitcast.*to float\*}}
-  // CHECK: load float, float*
+  // CHECK: load float, ptr
   fr = (float&)xr;
-  // CHECK: load i32*, i32**
-  // CHECK: bitcast i32*
-  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
+  // CHECK: load ptr, ptr
+  // CHECK: call void @llvm.memcpy.p0.p0.i64
   xr = (X&)ir;
-  // CHECK: load float*, float**
-  // CHECK: bitcast float*
-  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
+  // CHECK: load ptr, ptr
+  // CHECK: call void @llvm.memcpy.p0.p0.i64
   xr = (X&)fr;
   _Complex float cf;
   _Complex float &cfr = cf;
-  // CHECK: load i32*, i32**
-  // CHECK: bitcast i32*
-  // CHECK: load float, float*
-  // CHECK: load float, float*
+  // CHECK: load ptr, ptr
+  // CHECK: load float, ptr
+  // CHECK: load float, ptr
   cfr = (_Complex float&)ir;
-  // CHECK: load float*, float**
-  // CHECK: bitcast float*
-  // CHECK: load float, float*
-  // CHECK: load float, float*
+  // CHECK: load ptr, ptr
+  // CHECK: load float, ptr
+  // CHECK: load float, ptr
   cfr = (_Complex float&)fr;
-  // CHECK: bitcast
-  // CHECK: load float, float*
-  // CHECK: load float, float*
+  // CHECK: load float, ptr
+  // CHECK: load float, ptr
   cfr = (_Complex float&)xr;
   // CHECK: ret void
 }
@@ -98,46 +80,37 @@ void functional_cast(int &ir, float &fr, X &xr) {
   typedef int &intref;
   typedef float &floatref;
   typedef X &Xref;
-  // CHECK: load float*, float**
-  // CHECK: bitcast float*
-  // CHECK: load i32, i32*
+  // CHECK: load ptr, ptr
+  // CHECK: load i32, ptr
   ir = intref(fr);
   // CHECK: load
-  // CHECK: {{bitcast.*to i32\*}}
-  // CHECK: load i32, i32*
+  // CHECK: load i32, ptr
   ir = intref(xr);
-  // CHECK: load i32
-  // CHECK: {{bitcast.*to float\*}}
-  // CHECK: load float, float*
+  // CHECK: load ptr
+  // CHECK: load float, ptr
   fr = floatref(ir);
   // CHECK: load
-  // CHECK: {{bitcast.*to float\*}}
-  // CHECK: load float, float*
+  // CHECK: load float, ptr
   fr = floatref(xr);
-  // CHECK: load i32*, i32**
-  // CHECK: bitcast i32*
-  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
+  // CHECK: load ptr, ptr
+  // CHECK: call void @llvm.memcpy.p0.p0.i64
   xr = Xref(ir);
-  // CHECK: load float*, float**
-  // CHECK: bitcast float*
-  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
+  // CHECK: load ptr, ptr
+  // CHECK: call void @llvm.memcpy.p0.p0.i64
   xr = Xref(fr);
   typedef _Complex float &complex_float_ref;
   _Complex float cf;
   _Complex float &cfr = cf;
-  // CHECK: load i32*, i32**
-  // CHECK: bitcast i32*
-  // CHECK: load float, float*
-  // CHECK: load float, float*
+  // CHECK: load ptr, ptr
+  // CHECK: load float, ptr
+  // CHECK: load float, ptr
   cfr = complex_float_ref(ir);
-  // CHECK: load float*, float**
-  // CHECK: bitcast float*
-  // CHECK: load float, float*
-  // CHECK: load float, float*
+  // CHECK: load ptr, ptr
+  // CHECK: load float, ptr
+  // CHECK: load float, ptr
   cfr = complex_float_ref(fr);
-  // CHECK: bitcast
-  // CHECK: load float, float*
-  // CHECK: load float, float*
+  // CHECK: load float, ptr
+  // CHECK: load float, ptr
   cfr = complex_float_ref(xr);
   // CHECK: ret void
 }

diff  --git a/clang/test/CodeGenCXX/mangle-local-class-vtables.cpp b/clang/test/CodeGenCXX/mangle-local-class-vtables.cpp
index c2a28eaa1c449..1c3f364993ea0 100644
--- a/clang/test/CodeGenCXX/mangle-local-class-vtables.cpp
+++ b/clang/test/CodeGenCXX/mangle-local-class-vtables.cpp
@@ -1,12 +1,12 @@
-// RUN: %clang_cc1 -no-opaque-pointers %s -emit-llvm -triple %itanium_abi_triple -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple %itanium_abi_triple -o - | FileCheck %s
 
-// CHECK: @_ZTVZ1GvE1C = {{.*}} @_ZTIZ1GvE1C {{.*}} @_ZZ1GvENK1C1FEv
+// CHECK: @_ZTVZ1GvE1C = {{.*}} @_ZTIZ1GvE1C, {{.*}} @_ZZ1GvENK1C1FEv
 // CHECK: @_ZTIZ1GvE1C = {{.*}} @_ZTSZ1GvE1C
-// CHECK: @_ZTVZ1GvE1C_0 = {{.*}} @_ZTIZ1GvE1C_0 {{.*}} @_ZZ1GvENK1C1FE_0v
+// CHECK: @_ZTVZ1GvE1C_0 = {{.*}} @_ZTIZ1GvE1C_0, {{.*}} @_ZZ1GvENK1C1FE_0v
 // CHECK: @_ZTIZ1GvE1C_0 = {{.*}} @_ZTSZ1GvE1C_0
-// CHECK: @_ZTVZ1GvE1C_1 = {{.*}} @_ZTIZ1GvE1C_1 {{.*}} @_ZZ1GvENK1C1FE_1v
+// CHECK: @_ZTVZ1GvE1C_1 = {{.*}} @_ZTIZ1GvE1C_1, {{.*}} @_ZZ1GvENK1C1FE_1v
 // CHECK: @_ZTIZ1GvE1C_1 = {{.*}} @_ZTSZ1GvE1C_1
-// CHECK: @_ZTVZN1J1KEvE1C = {{.*}} @_ZTIZN1J1KEvE1C {{.*}} @_ZZN1J1KEvENK1C1FEv
+// CHECK: @_ZTVZN1J1KEvE1C = {{.*}} @_ZTIZN1J1KEvE1C, {{.*}} @_ZZN1J1KEvENK1C1FEv
 // CHECK: @_ZTIZN1J1KEvE1C = {{.*}} @_ZTSZN1J1KEvE1C
 
 // CHECK: define {{.*}} @_ZZ1GvEN1CC2Ev(

diff  --git a/clang/test/CodeGenCXX/mangle-ms.cpp b/clang/test/CodeGenCXX/mangle-ms.cpp
index 056b1fdd94541..cf69a83bbdf8c 100644
--- a/clang/test/CodeGenCXX/mangle-ms.cpp
+++ b/clang/test/CodeGenCXX/mangle-ms.cpp
@@ -1,6 +1,6 @@
-// RUN: %clang_cc1 -no-opaque-pointers -fblocks -emit-llvm %s -o - -triple=i386-pc-win32 -std=c++98 | FileCheck %s
-// RUN: %clang_cc1 -no-opaque-pointers -fblocks -emit-llvm %s -o - -triple=x86_64-pc-win32 -std=c++98| FileCheck -check-prefix X64 %s
-// RUN: %clang_cc1 -no-opaque-pointers -fblocks -emit-llvm %s -o - -triple=aarch64-pc-win32 -std=c++98 -DARM | FileCheck -check-prefixes=X64,ARM %s
+// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=i386-pc-win32 -std=c++98 | FileCheck %s
+// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=x86_64-pc-win32 -std=c++98| FileCheck -check-prefix X64 %s
+// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=aarch64-pc-win32 -std=c++98 -DARM | FileCheck -check-prefixes=X64,ARM %s
 
 int a;
 // CHECK-DAG: @"?a@@3HA"
@@ -28,8 +28,8 @@ int _c(void) {return N::anonymous + c;}
 // X64-DAG:   @"?_c@@YAHXZ"
 
 const int &NeedsReferenceTemporary = 2;
-// CHECK-DAG: @"?NeedsReferenceTemporary@@3ABHB" = dso_local constant i32* @"?$RT1 at NeedsReferenceTemporary@@3ABHB"
-// X64-DAG: @"?NeedsReferenceTemporary@@3AEBHEB" = dso_local constant i32* @"?$RT1 at NeedsReferenceTemporary@@3AEBHEB"
+// CHECK-DAG: @"?NeedsReferenceTemporary@@3ABHB" = dso_local constant ptr @"?$RT1 at NeedsReferenceTemporary@@3ABHB"
+// X64-DAG: @"?NeedsReferenceTemporary@@3AEBHEB" = dso_local constant ptr @"?$RT1 at NeedsReferenceTemporary@@3AEBHEB"
 
 class foo {
   static const short d;
@@ -434,7 +434,7 @@ void f(S::T6) {}
 
 // X64-DAG: @"?f at UnnamedType@@YAXQEAPEAU<unnamed-type-T1>@S at 1@@Z"
 // X64-DAG: @"?f at UnnamedType@@YAXUT2 at S@1@@Z"
-// X64-DAG: @"?f at UnnamedType@@YAXPEAUT4 at S@1@@Z"(%"struct.UnnamedType::S::T4"
+// X64-DAG: @"?f at UnnamedType@@YAXPEAUT4 at S@1@@Z"(ptr
 // X64-DAG: @"?f at UnnamedType@@YAXUT4 at S@1@@Z"
 // X64-DAG: @"?f at UnnamedType@@YAXUT5 at S@1@@Z"
 // X64-DAG: @"?f at UnnamedType@@YAXPEAU<unnamed-type-T6>@S at 1@@Z"
@@ -447,10 +447,10 @@ namespace PassObjectSize {
 // size param P, where N is the Type of the pass_object_size attribute on P.
 //
 // e.g. we want to mangle:
-//   void foo(void *const __attribute__((pass_object_size(0))));
+//   void foo(ptr const __attribute__((pass_object_size(0))));
 // as if it were
 //   namespace __clang { enum __pass_object_size0 : size_t {}; }
-//   void foo(void *const, __clang::__pass_object_size0);
+//   void foo(ptr const, __clang::__pass_object_size0);
 // where __clang is a top-level namespace.
 
 // CHECK-DAG: define dso_local noundef i32 @"?foo at PassObjectSize@@YAHQAHW4__pass_object_size0 at __clang@@@Z"

diff  --git a/clang/test/CodeGenCXX/matrix-casts.cpp b/clang/test/CodeGenCXX/matrix-casts.cpp
index 346ef5211d889..4369d99a34915 100644
--- a/clang/test/CodeGenCXX/matrix-casts.cpp
+++ b/clang/test/CodeGenCXX/matrix-casts.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -std=c++11 -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
+// RUN: %clang_cc1 -std=c++11 -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
 
 template <typename X>
 using matrix_4_4 = X __attribute__((matrix_type(4, 4)));
@@ -8,10 +8,9 @@ using matrix_5_5 = Y __attribute__((matrix_type(5, 5)));
 
 // CHECK-LABEL: define{{.*}} void @_Z25CastCharMatrixToIntCStylev()
 void CastCharMatrixToIntCStyle() {
-  // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
+  // CHECK: [[C:%.*]] = load <25 x i8>, ptr {{.*}}, align 1
   // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
-  // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
-  // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
+  // CHECK-NEXT: store <25 x i32> [[CONV]], ptr {{.*}}, align 4
 
   matrix_5_5<char> c;
   matrix_5_5<int> i;
@@ -20,10 +19,9 @@ void CastCharMatrixToIntCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z29CastCharMatrixToIntStaticCastv()
 void CastCharMatrixToIntStaticCast() {
-  // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
+  // CHECK: [[C:%.*]] = load <25 x i8>, ptr {{.*}}, align 1
   // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
-  // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
-  // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
+  // CHECK-NEXT: store <25 x i32> [[CONV]], ptr {{.*}}, align 4
 
   matrix_5_5<char> c;
   matrix_5_5<int> i;
@@ -32,10 +30,9 @@ void CastCharMatrixToIntStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z33CastCharMatrixToUnsignedIntCStylev
 void CastCharMatrixToUnsignedIntCStyle() {
-  // CHECK:       [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
+  // CHECK:       [[C:%.*]] = load <25 x i8>, ptr {{.*}}, align 1
   // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
-  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<char> c;
@@ -45,10 +42,9 @@ void CastCharMatrixToUnsignedIntCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z37CastCharMatrixToUnsignedIntStaticCastv
 void CastCharMatrixToUnsignedIntStaticCast() {
-  // CHECK:       [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
+  // CHECK:       [[C:%.*]] = load <25 x i8>, ptr {{.*}}, align 1
   // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
-  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<char> c;
@@ -58,10 +54,9 @@ void CastCharMatrixToUnsignedIntStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z38CastUnsignedLongIntMatrixToShortCStylev
 void CastUnsignedLongIntMatrixToShortCStyle() {
-  // CHECK:      [[U:%.*]] = load <25 x i64>, <25 x i64>* {{.*}}, align 8
+  // CHECK:      [[U:%.*]] = load <25 x i64>, ptr {{.*}}, align 8
   // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> {{.*}} to <25 x i16>
-  // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
-  // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT: store <25 x i16> [[CONV]], ptr {{.*}}, align 2
   // CHECK-NEXT: ret void
 
   matrix_5_5<unsigned long int> u;
@@ -71,10 +66,9 @@ void CastUnsignedLongIntMatrixToShortCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z42CastUnsignedLongIntMatrixToShortStaticCastv
 void CastUnsignedLongIntMatrixToShortStaticCast() {
-  // CHECK:      [[U:%.*]] = load <25 x i64>, <25 x i64>* {{.*}}, align 8
+  // CHECK:      [[U:%.*]] = load <25 x i64>, ptr {{.*}}, align 8
   // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> {{.*}} to <25 x i16>
-  // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
-  // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT: store <25 x i16> [[CONV]], ptr {{.*}}, align 2
   // CHECK-NEXT: ret void
 
   matrix_5_5<unsigned long int> u;
@@ -84,10 +78,9 @@ void CastUnsignedLongIntMatrixToShortStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z26CastIntMatrixToShortCStylev()
 void CastIntMatrixToShortCStyle() {
-  // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
+  // CHECK:       [[I:%.*]] = load <25 x i32>, ptr {{.*}}, align 4
   // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i32> [[I]] to <25 x i16>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
-  // CHECK-NEXT:  store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr {{.*}}, align 2
   // CHECK-NEXT:  ret void
 
   matrix_5_5<int> i;
@@ -97,10 +90,9 @@ void CastIntMatrixToShortCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z30CastIntMatrixToShortStaticCastv()
 void CastIntMatrixToShortStaticCast() {
-  // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
+  // CHECK:       [[I:%.*]] = load <25 x i32>, ptr {{.*}}, align 4
   // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i32> [[I]] to <25 x i16>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
-  // CHECK-NEXT:  store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr {{.*}}, align 2
   // CHECK-NEXT:  ret void
 
   matrix_5_5<int> i;
@@ -110,10 +102,9 @@ void CastIntMatrixToShortStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z26CastIntMatrixToFloatCStylev()
 void CastIntMatrixToFloatCStyle() {
-  // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
+  // CHECK:       [[I:%.*]] = load <25 x i32>, ptr {{.*}}, align 4
   // CHECK-NEXT:  [[CONV]] = sitofp <25 x i32> {{.*}} to <25 x float>
-  // CHECK-NEXT:  [[CONV1]] = bitcast [25 x float]* {{.*}} to <25 x float>*
-  // CHECK-NEXT:  store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
+  // CHECK-NEXT:  store <25 x float> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<int> i;
@@ -123,10 +114,9 @@ void CastIntMatrixToFloatCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z30CastIntMatrixToFloatStaticCastv()
 void CastIntMatrixToFloatStaticCast() {
-  // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
+  // CHECK:       [[I:%.*]] = load <25 x i32>, ptr {{.*}}, align 4
   // CHECK-NEXT:  [[CONV]] = sitofp <25 x i32> {{.*}} to <25 x float>
-  // CHECK-NEXT:  [[CONV1]] = bitcast [25 x float]* {{.*}} to <25 x float>*
-  // CHECK-NEXT:  store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
+  // CHECK-NEXT:  store <25 x float> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<int> i;
@@ -136,10 +126,9 @@ void CastIntMatrixToFloatStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z34CastUnsignedIntMatrixToFloatCStylev()
 void CastUnsignedIntMatrixToFloatCStyle() {
-  // CHECK:       [[U:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
+  // CHECK:       [[U:%.*]] = load <25 x i16>, ptr {{.*}}, align 2
   // CHECK-NEXT:  [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
-  // CHECK-NEXT:  store <25 x float> [[CONV]], <25 x float>* {{.*}}, align 4
+  // CHECK-NEXT:  store <25 x float> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<unsigned short int> u;
@@ -149,10 +138,9 @@ void CastUnsignedIntMatrixToFloatCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z38CastUnsignedIntMatrixToFloatStaticCastv()
 void CastUnsignedIntMatrixToFloatStaticCast() {
-  // CHECK:       [[U:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
+  // CHECK:       [[U:%.*]] = load <25 x i16>, ptr {{.*}}, align 2
   // CHECK-NEXT:  [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
-  // CHECK-NEXT:  store <25 x float> [[CONV]], <25 x float>* {{.*}}, align 4
+  // CHECK-NEXT:  store <25 x float> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<unsigned short int> u;
@@ -162,10 +150,9 @@ void CastUnsignedIntMatrixToFloatStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z27CastDoubleMatrixToIntCStylev()
 void CastDoubleMatrixToIntCStyle() {
-  // CHECK:       [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
+  // CHECK:       [[D:%.*]] = load <25 x double>, ptr {{.*}}, align 8
   // CHECK-NEXT:  [[CONV:%.*]] = fptosi <25 x double> [[D]] to <25 x i32>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* %i to <25 x i32>*
-  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<double> d;
@@ -175,10 +162,9 @@ void CastDoubleMatrixToIntCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z31CastDoubleMatrixToIntStaticCastv()
 void CastDoubleMatrixToIntStaticCast() {
-  // CHECK:       [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
+  // CHECK:       [[D:%.*]] = load <25 x double>, ptr {{.*}}, align 8
   // CHECK-NEXT:  [[CONV:%.*]] = fptosi <25 x double> [[D]] to <25 x i32>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* %i to <25 x i32>*
-  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<double> d;
@@ -188,10 +174,9 @@ void CastDoubleMatrixToIntStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z39CastFloatMatrixToUnsignedShortIntCStylev()
 void CastFloatMatrixToUnsignedShortIntCStyle() {
-  // CHECK:       [[F:%.*]] = load <25 x float>, <25 x float>* {{.*}}, align 4
+  // CHECK:       [[F:%.*]] = load <25 x float>, ptr {{.*}}, align 4
   // CHECK-NEXT:  [[CONV:%.*]] = fptoui <25 x float> [[F]] to <25 x i16>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
-  // CHECK-NEXT:  store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr {{.*}}, align 2
   // CHECK-NEXT:  ret void
 
   matrix_5_5<float> f;
@@ -201,10 +186,9 @@ void CastFloatMatrixToUnsignedShortIntCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z43CastFloatMatrixToUnsignedShortIntStaticCastv()
 void CastFloatMatrixToUnsignedShortIntStaticCast() {
-  // CHECK:       [[F:%.*]] = load <25 x float>, <25 x float>* {{.*}}, align 4
+  // CHECK:       [[F:%.*]] = load <25 x float>, ptr {{.*}}, align 4
   // CHECK-NEXT:  [[CONV:%.*]] = fptoui <25 x float> [[F]] to <25 x i16>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
-  // CHECK-NEXT:  store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr {{.*}}, align 2
   // CHECK-NEXT:  ret void
 
   matrix_5_5<float> f;
@@ -214,10 +198,9 @@ void CastFloatMatrixToUnsignedShortIntStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z29CastDoubleMatrixToFloatCStylev()
 void CastDoubleMatrixToFloatCStyle() {
-  // CHECK:       [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
+  // CHECK:       [[D:%.*]] = load <25 x double>, ptr {{.*}}, align 8
   // CHECK-NEXT:  [[CONV:%.*]] = fptrunc <25 x double> [[D]] to <25 x float>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
-  // CHECK-NEXT:  store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
+  // CHECK-NEXT:  store <25 x float> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<double> d;
@@ -227,10 +210,9 @@ void CastDoubleMatrixToFloatCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z33CastDoubleMatrixToFloatStaticCastv()
 void CastDoubleMatrixToFloatStaticCast() {
-  // CHECK:       [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
+  // CHECK:       [[D:%.*]] = load <25 x double>, ptr {{.*}}, align 8
   // CHECK-NEXT:  [[CONV:%.*]] = fptrunc <25 x double> [[D]] to <25 x float>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
-  // CHECK-NEXT:  store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
+  // CHECK-NEXT:  store <25 x float> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<double> d;
@@ -240,10 +222,9 @@ void CastDoubleMatrixToFloatStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z39CastUnsignedShortIntToUnsignedIntCStylev()
 void CastUnsignedShortIntToUnsignedIntCStyle() {
-  // CHECK:       [[S:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
+  // CHECK:       [[S:%.*]] = load <25 x i16>, ptr {{.*}}, align 2
   // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[S]] to <25 x i32>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
-  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<unsigned short int> s;
@@ -253,10 +234,9 @@ void CastUnsignedShortIntToUnsignedIntCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z43CastUnsignedShortIntToUnsignedIntStaticCastv()
 void CastUnsignedShortIntToUnsignedIntStaticCast() {
-  // CHECK:       [[S:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
+  // CHECK:       [[S:%.*]] = load <25 x i16>, ptr {{.*}}, align 2
   // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[S]] to <25 x i32>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
-  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<unsigned short int> s;
@@ -266,10 +246,9 @@ void CastUnsignedShortIntToUnsignedIntStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z43CastUnsignedLongIntToUnsignedShortIntCStylev()
 void CastUnsignedLongIntToUnsignedShortIntCStyle() {
-  // CHECK:       [[L:%.*]] = load <25 x i64>, <25 x i64>* %0, align 8
+  // CHECK:       [[L:%.*]] = load <25 x i64>, ptr %l, align 8
   // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i64> [[L]] to <25 x i16>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
-  // CHECK-NEXT:  store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr {{.*}}, align 2
   // CHECK-NEXT:  ret void
 
   matrix_5_5<unsigned long int> l;
@@ -279,10 +258,9 @@ void CastUnsignedLongIntToUnsignedShortIntCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z47CastUnsignedLongIntToUnsignedShortIntStaticCastv()
 void CastUnsignedLongIntToUnsignedShortIntStaticCast() {
-  // CHECK:       [[L:%.*]] = load <25 x i64>, <25 x i64>* %0, align 8
+  // CHECK:       [[L:%.*]] = load <25 x i64>, ptr %l, align 8
   // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i64> [[L]] to <25 x i16>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
-  // CHECK-NEXT:  store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr {{.*}}, align 2
   // CHECK-NEXT:  ret void
 
   matrix_5_5<unsigned long int> l;
@@ -292,10 +270,9 @@ void CastUnsignedLongIntToUnsignedShortIntStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z31CastUnsignedShortIntToIntCStylev()
 void CastUnsignedShortIntToIntCStyle() {
-  // CHECK:       [[U:%.*]] = load <25 x i16>, <25 x i16>* %0, align 2
+  // CHECK:       [[U:%.*]] = load <25 x i16>, ptr %u, align 2
   // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
-  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<unsigned short int> u;
@@ -305,10 +282,9 @@ void CastUnsignedShortIntToIntCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z35CastUnsignedShortIntToIntStaticCastv()
 void CastUnsignedShortIntToIntStaticCast() {
-  // CHECK:       [[U:%.*]] = load <25 x i16>, <25 x i16>* %0, align 2
+  // CHECK:       [[U:%.*]] = load <25 x i16>, ptr %u, align 2
   // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
-  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
   // CHECK-NEXT:  ret void
 
   matrix_5_5<unsigned short int> u;
@@ -318,10 +294,9 @@ void CastUnsignedShortIntToIntStaticCast() {
 
 // CHECK-LABEL: define{{.*}} void @_Z30CastIntToUnsignedLongIntCStylev()
 void CastIntToUnsignedLongIntCStyle() {
-  // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* %0, align 4
+  // CHECK:       [[I:%.*]] = load <25 x i32>, ptr %i, align 4
   // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i64]* {{.*}} to <25 x i64>*
-  // CHECK-NEXT:  store <25 x i64> [[CONV]], <25 x i64>* {{.*}}, align 8
+  // CHECK-NEXT:  store <25 x i64> [[CONV]], ptr {{.*}}, align 8
   // CHECK-NEXT:  ret void
 
   matrix_5_5<int> i;
@@ -331,10 +306,9 @@ void CastIntToUnsignedLongIntCStyle() {
 
 // CHECK-LABEL: define{{.*}} void @_Z34CastIntToUnsignedLongIntStaticCastv()
 void CastIntToUnsignedLongIntStaticCast() {
-  // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* %0, align 4
+  // CHECK:       [[I:%.*]] = load <25 x i32>, ptr %i, align 4
   // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
-  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i64]* {{.*}} to <25 x i64>*
-  // CHECK-NEXT:  store <25 x i64> [[CONV]], <25 x i64>* {{.*}}, align 8
+  // CHECK-NEXT:  store <25 x i64> [[CONV]], ptr {{.*}}, align 8
   // CHECK-NEXT:  ret void
 
   matrix_5_5<int> i;
@@ -350,9 +324,9 @@ class Foo {
 };
 
 Foo class_constructor_matrix_ty(matrix_5_5<int> m) {
-  // CHECK-LABEL: define void @_Z27class_constructor_matrix_tyu11matrix_typeILm5ELm5EiE(%class.Foo* noalias sret(%class.Foo) align 4 %agg.result, <25 x i32> noundef %m)
-  // CHECK:         [[M:%.*]]  = load <25 x i32>, <25 x i32>* {{.*}}, align 4
-  // CHECK-NEXT:    call void @_ZN3FooC1Eu11matrix_typeILm5ELm5EiE(%class.Foo* noundef nonnull align 4 dereferenceable(40) %agg.result, <25 x i32> noundef [[M]])
+  // CHECK-LABEL: define void @_Z27class_constructor_matrix_tyu11matrix_typeILm5ELm5EiE(ptr noalias sret(%class.Foo) align 4 %agg.result, <25 x i32> noundef %m)
+  // CHECK:         [[M:%.*]]  = load <25 x i32>, ptr {{.*}}, align 4
+  // CHECK-NEXT:    call void @_ZN3FooC1Eu11matrix_typeILm5ELm5EiE(ptr noundef nonnull align 4 dereferenceable(40) %agg.result, <25 x i32> noundef [[M]])
   // CHECK-NEXT:    ret void
 
   return Foo(m);
@@ -364,9 +338,9 @@ struct Bar {
 };
 
 Bar struct_constructor_matrix_ty(matrix_4_4<float> m) {
-  // CHECK-LABEL: define void @_Z28struct_constructor_matrix_tyu11matrix_typeILm4ELm4EfE(%struct.Bar* noalias sret(%struct.Bar) align 4 %agg.result, <16 x float> noundef %m)
-  // CHECK:         [[M:%.*]] = load <16 x float>, <16 x float>* {{.*}}, align 4
-  // CHECK-NEXT:    call void @_ZN3BarC1Eu11matrix_typeILm4ELm4EfE(%struct.Bar* noundef nonnull align 4 dereferenceable(40) %agg.result, <16 x float> noundef [[M]])
+  // CHECK-LABEL: define void @_Z28struct_constructor_matrix_tyu11matrix_typeILm4ELm4EfE(ptr noalias sret(%struct.Bar) align 4 %agg.result, <16 x float> noundef %m)
+  // CHECK:         [[M:%.*]] = load <16 x float>, ptr {{.*}}, align 4
+  // CHECK-NEXT:    call void @_ZN3BarC1Eu11matrix_typeILm4ELm4EfE(ptr noundef nonnull align 4 dereferenceable(40) %agg.result, <16 x float> noundef [[M]])
   // CHECK-NEXT:    ret void
 
   return Bar(m);

diff  --git a/clang/test/CodeGenCXX/matrix-type-builtins.cpp b/clang/test/CodeGenCXX/matrix-type-builtins.cpp
index 1401e8da245e2..24bf797ab94a0 100644
--- a/clang/test/CodeGenCXX/matrix-type-builtins.cpp
+++ b/clang/test/CodeGenCXX/matrix-type-builtins.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - -std=c++17 | FileCheck %s
+// RUN: %clang_cc1 -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - -std=c++17 | FileCheck %s
 
 // Tests for the matrix type builtins.
 
@@ -19,10 +19,10 @@ MyMatrix<T, C, R> transpose(const MyMatrix<T, R, C> &M) {
 
 void test_transpose_template1() {
   // CHECK-LABEL: define{{.*}} void @_Z24test_transpose_template1v()
-  // CHECK:         call void @_Z9transposeIiLj4ELj10EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(%struct.MyMatrix.0* sret(%struct.MyMatrix.0) align 4 %M1_t, %struct.MyMatrix* noundef nonnull align 4 dereferenceable(160) %M1)
+  // CHECK:         call void @_Z9transposeIiLj4ELj10EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(ptr sret(%struct.MyMatrix.0) align 4 %M1_t, ptr noundef nonnull align 4 dereferenceable(160) %M1)
 
   // CHECK-LABEL: define linkonce_odr void @_Z9transposeIiLj4ELj10EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(
-  // CHECK:         [[M:%.*]] = load <40 x i32>, <40 x i32>* {{.*}}, align 4
+  // CHECK:         [[M:%.*]] = load <40 x i32>, ptr {{.*}}, align 4
   // CHECK-NEXT:    [[M_T:%.*]] = call <40 x i32> @llvm.matrix.transpose.v40i32(<40 x i32> [[M]], i32 4, i32 10)
 
   MyMatrix<int, 4, 10> M1;
@@ -31,23 +31,21 @@ void test_transpose_template1() {
 
 void test_transpose_template2(MyMatrix<double, 7, 6> &M) {
   // CHECK-LABEL: define{{.*}} void @_Z24test_transpose_template2R8MyMatrixIdLj7ELj6EE(
-  // CHECK:         call void @_Z9transposeIdLj7ELj6EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(%struct.MyMatrix.2* sret(%struct.MyMatrix.2) align 8 %ref.tmp1, %struct.MyMatrix.1* noundef nonnull align 8 dereferenceable(336) %0)
-  // CHECK-NEXT:    call void @_Z9transposeIdLj6ELj7EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(%struct.MyMatrix.1* sret(%struct.MyMatrix.1) align 8 %ref.tmp, %struct.MyMatrix.2* noundef nonnull align 8 dereferenceable(336) %ref.tmp1)
-  // CHECK-NEXT:    call void @_Z9transposeIdLj7ELj6EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(%struct.MyMatrix.2* sret(%struct.MyMatrix.2) align 8 %M2_t, %struct.MyMatrix.1* noundef nonnull align 8 dereferenceable(336) %ref.tmp)
+  // CHECK:         call void @_Z9transposeIdLj7ELj6EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(ptr sret(%struct.MyMatrix.2) align 8 %ref.tmp1, ptr noundef nonnull align 8 dereferenceable(336) %0)
+  // CHECK-NEXT:    call void @_Z9transposeIdLj6ELj7EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(ptr sret(%struct.MyMatrix.1) align 8 %ref.tmp, ptr noundef nonnull align 8 dereferenceable(336) %ref.tmp1)
+  // CHECK-NEXT:    call void @_Z9transposeIdLj7ELj6EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(ptr sret(%struct.MyMatrix.2) align 8 %M2_t, ptr noundef nonnull align 8 dereferenceable(336) %ref.tmp)
 
   // CHECK-LABEL: define linkonce_odr void @_Z9transposeIdLj7ELj6EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(
-  // CHECK:         [[M:%.*]] = load <42 x double>, <42 x double>* {{.*}}, align 8
+  // CHECK:         [[M:%.*]] = load <42 x double>, ptr {{.*}}, align 8
   // CHECK-NEXT:    [[M_T:%.*]] = call <42 x double> @llvm.matrix.transpose.v42f64(<42 x double> [[M]], i32 7, i32 6)
-  // CHECK-NEXT:    [[RES_ADDR:%.*]] = getelementptr inbounds %struct.MyMatrix.2, %struct.MyMatrix.2* %agg.result, i32 0, i32 0
-  // CHECK-NEXT:    [[RES_ADDR_C:%.*]] = bitcast [42 x double]* [[RES_ADDR]] to <42 x double>*
-  // CHECK-NEXT:    store <42 x double> [[M_T]], <42 x double>* [[RES_ADDR_C]], align 8
+  // CHECK-NEXT:    [[RES_ADDR:%.*]] = getelementptr inbounds %struct.MyMatrix.2, ptr %agg.result, i32 0, i32 0
+  // CHECK-NEXT:    store <42 x double> [[M_T]], ptr [[RES_ADDR]], align 8
 
   // CHECK-LABEL: define linkonce_odr void @_Z9transposeIdLj6ELj7EE8MyMatrixIT_XT1_EXT0_EERKS0_IS1_XT0_EXT1_EE(
-  // CHECK:         [[M:%.*]] = load <42 x double>, <42 x double>* {{.*}}, align 8
+  // CHECK:         [[M:%.*]] = load <42 x double>, ptr {{.*}}, align 8
   // CHECK-NEXT:    [[M_T:%.*]] = call <42 x double> @llvm.matrix.transpose.v42f64(<42 x double> [[M]], i32 6, i32 7)
-  // CHECK-NEXT:    [[RES_ADDR:%.*]] = getelementptr inbounds %struct.MyMatrix.1, %struct.MyMatrix.1* %agg.result, i32 0, i32 0
-  // CHECK-NEXT:    [[RES_ADDR_C:%.*]] = bitcast [42 x double]* [[RES_ADDR]] to <42 x double>*
-  // CHECK-NEXT:    store <42 x double> [[M_T]], <42 x double>* [[RES_ADDR_C]], align 8
+  // CHECK-NEXT:    [[RES_ADDR:%.*]] = getelementptr inbounds %struct.MyMatrix.1, ptr %agg.result, i32 0, i32 0
+  // CHECK-NEXT:    store <42 x double> [[M_T]], ptr [[RES_ADDR]], align 8
 
   MyMatrix<double, 6, 7> M2_t = transpose(transpose(transpose(M)));
 }
@@ -61,17 +59,15 @@ void test_transpose_rvalue() {
   // CHECK-NEXT:    [[CALL_RES:%.*]] = call noundef <9 x float> @_Z10get_matrixv()
   // CHECK-NEXT:    [[ADD:%.*]] = fadd <9 x float> [[CALL_RES]], <float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float 2.000000e+00>
   // CHECK-NEXT:    [[M_T:%.*]] = call <9 x float> @llvm.matrix.transpose.v9f32(<9 x float> [[ADD]], i32 3, i32 3)
-  // CHECK-NEXT:    [[M_T_ADDR_CAST:%.*]] = bitcast [9 x float]* [[M_T_ADDR]] to <9 x float>*
-  // CHECK-NEXT:    store <9 x float> [[M_T]], <9 x float>* [[M_T_ADDR_CAST]], align 4
+  // CHECK-NEXT:    store <9 x float> [[M_T]], ptr [[M_T_ADDR]], align 4
   matrix_t<float, 3, 3> m_t = __builtin_matrix_transpose(get_matrix() + 2.0);
 }
 
 void test_transpose_const(const matrix_t<float, 3, 3> &m) {
   // CHECK-LABEL:  define{{.*}} void @_Z20test_transpose_constRKu11matrix_typeILm3ELm3EfE(
-  // CHECK:         [[MATRIX:%.*]] = load <9 x float>, <9 x float>* {{.*}}, align 4
+  // CHECK:         [[MATRIX:%.*]] = load <9 x float>, ptr {{.*}}, align 4
   // CHECK-NEXT:    [[M_T:%.*]] = call <9 x float> @llvm.matrix.transpose.v9f32(<9 x float> [[MATRIX]], i32 3, i32 3)
-  // CHECK-NEXT:    [[M_T_ADDR:%.*]] = bitcast [9 x float]* %m_t to <9 x float>*
-  // CHECK-NEXT:    store <9 x float> [[M_T]], <9 x float>* [[M_T_ADDR]], align 4
+  // CHECK-NEXT:    store <9 x float> [[M_T]], ptr %m_t, align 4
   matrix_t<float, 3, 3> m_t = __builtin_matrix_transpose(m);
 }
 
@@ -88,25 +84,25 @@ matrix_t<T, R, C> column_major_load_with_stride(T *Ptr) {
 }
 
 void test_column_major_load_with_stride_template_double(double *Ptr) {
-  // CHECK-LABEL: define{{.*}} void @_Z50test_column_major_load_with_stride_template_doublePd(double* noundef %Ptr)
-  // CHECK:         [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
-  // CHECK-NEXT:    call noundef <40 x double> @_Z29column_major_load_with_strideIdLj10ELj4ELj15EEu11matrix_typeIXT0_EXT1_ET_EPS0_(double* noundef [[PTR]])
+  // CHECK-LABEL: define{{.*}} void @_Z50test_column_major_load_with_stride_template_doublePd(ptr noundef %Ptr)
+  // CHECK:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call noundef <40 x double> @_Z29column_major_load_with_strideIdLj10ELj4ELj15EEu11matrix_typeIXT0_EXT1_ET_EPS0_(ptr noundef [[PTR]])
 
-  // CHECK-LABEL:  define linkonce_odr noundef <40 x double> @_Z29column_major_load_with_strideIdLj10ELj4ELj15EEu11matrix_typeIXT0_EXT1_ET_EPS0_(double* noundef %Ptr)
-  // CHECK:         [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
-  // CHECK-NEXT:    call <40 x double> @llvm.matrix.column.major.load.v40f64.i64(double* align 8 [[PTR]], i64 15, i1 false, i32 10, i32 4)
+  // CHECK-LABEL:  define linkonce_odr noundef <40 x double> @_Z29column_major_load_with_strideIdLj10ELj4ELj15EEu11matrix_typeIXT0_EXT1_ET_EPS0_(ptr noundef %Ptr)
+  // CHECK:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call <40 x double> @llvm.matrix.column.major.load.v40f64.i64(ptr align 8 [[PTR]], i64 15, i1 false, i32 10, i32 4)
 
   matrix_t<double, 10, 4> M1 = column_major_load_with_stride<double, 10, 4, 15>(Ptr);
 }
 
 void test_column_major_load_with_stride_template_int(int *Ptr) {
-  // CHECK-LABEL: define{{.*}} void @_Z47test_column_major_load_with_stride_template_intPi(i32* noundef %Ptr) #5 {
-  // CHECK:         [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    call noundef <6 x i32> @_Z29column_major_load_with_strideIiLj3ELj2ELj12EEu11matrix_typeIXT0_EXT1_ET_EPS0_(i32* noundef [[PTR]])
+  // CHECK-LABEL: define{{.*}} void @_Z47test_column_major_load_with_stride_template_intPi(ptr noundef %Ptr) #5 {
+  // CHECK:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call noundef <6 x i32> @_Z29column_major_load_with_strideIiLj3ELj2ELj12EEu11matrix_typeIXT0_EXT1_ET_EPS0_(ptr noundef [[PTR]])
 
-  // CHECK-LABEL: define linkonce_odr noundef <6 x i32> @_Z29column_major_load_with_strideIiLj3ELj2ELj12EEu11matrix_typeIXT0_EXT1_ET_EPS0_(i32* noundef %Ptr)
-  // CHECK:         [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    call <6 x i32> @llvm.matrix.column.major.load.v6i32.i64(i32* align 4 [[PTR]], i64 12, i1 false, i32 3, i32 2)
+  // CHECK-LABEL: define linkonce_odr noundef <6 x i32> @_Z29column_major_load_with_strideIiLj3ELj2ELj12EEu11matrix_typeIXT0_EXT1_ET_EPS0_(ptr noundef %Ptr)
+  // CHECK:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call <6 x i32> @llvm.matrix.column.major.load.v6i32.i64(ptr align 4 [[PTR]], i64 12, i1 false, i32 3, i32 2)
 
   matrix_t<int, 3, 2> M1 = column_major_load_with_stride<int, 3, 2, 12>(Ptr);
 }
@@ -119,21 +115,21 @@ struct UnsignedWrapper {
 };
 
 void test_column_major_load_stride_wrapper(int *Ptr, UnsignedWrapper &W) {
-  // CHECK-LABEL:  define{{.*}} void @_Z37test_column_major_load_stride_wrapperPiR15UnsignedWrapper(i32* noundef %Ptr, %struct.UnsignedWrapper* noundef nonnull align 1 dereferenceable(1) %W)
-  // CHECK:         [[W:%.*]] = load %struct.UnsignedWrapper*, %struct.UnsignedWrapper** %W.addr, align 8
-  // CHECK-NEXT:    [[STRIDE:%.*]] = call noundef i32 @_ZN15UnsignedWrappercvjEv(%struct.UnsignedWrapper* {{[^,]*}} [[W]])
+  // CHECK-LABEL:  define{{.*}} void @_Z37test_column_major_load_stride_wrapperPiR15UnsignedWrapper(ptr noundef %Ptr, ptr noundef nonnull align 1 dereferenceable(1) %W)
+  // CHECK:         [[W:%.*]] = load ptr, ptr %W.addr, align 8
+  // CHECK-NEXT:    [[STRIDE:%.*]] = call noundef i32 @_ZN15UnsignedWrappercvjEv(ptr {{[^,]*}} [[W]])
   // CHECK-NEXT:    [[STRIDE_EXT:%.*]] = zext i32 [[STRIDE]] to i64
-  // CHECK-NEXT:    [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    call <4 x i32> @llvm.matrix.column.major.load.v4i32.i64(i32* align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 2, i32 2)
+  // CHECK-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call <4 x i32> @llvm.matrix.column.major.load.v4i32.i64(ptr align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 2, i32 2)
   matrix_t<int, 2, 2> M1 = __builtin_matrix_column_major_load(Ptr, 2, 2, W);
 }
 
 constexpr int constexpr3() { return 3; }
 
 void test_column_major_load_constexpr_num_rows(int *Ptr) {
-  // CHECK-LABEL: define{{.*}} void @_Z41test_column_major_load_constexpr_num_rowsPi(i32* noundef %Ptr)
-  // CHECK:         [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    call <6 x i32> @llvm.matrix.column.major.load.v6i32.i64(i32* align 4 [[PTR]], i64 3, i1 false, i32 3, i32 2)
+  // CHECK-LABEL: define{{.*}} void @_Z41test_column_major_load_constexpr_num_rowsPi(ptr noundef %Ptr)
+  // CHECK:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call <6 x i32> @llvm.matrix.column.major.load.v6i32.i64(ptr align 4 [[PTR]], i64 3, i1 false, i32 3, i32 2)
 
   matrix_t<int, 3, 2> M1 = __builtin_matrix_column_major_load(Ptr, constexpr3(), 2, 3);
 }
@@ -141,9 +137,9 @@ void test_column_major_load_constexpr_num_rows(int *Ptr) {
 constexpr int constexpr1() { return 1; }
 
 void test_column_major_load_constexpr_num_columns(int *Ptr) {
-  // CHECK-LABEL: define{{.*}} void @_Z44test_column_major_load_constexpr_num_columnsPi(i32* noundef %Ptr)
-  // CHECK:         [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    call <2 x i32> @llvm.matrix.column.major.load.v2i32.i64(i32* align 4 [[PTR]], i64 3, i1 false, i32 2, i32 1)
+  // CHECK-LABEL: define{{.*}} void @_Z44test_column_major_load_constexpr_num_columnsPi(ptr noundef %Ptr)
+  // CHECK:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call <2 x i32> @llvm.matrix.column.major.load.v2i32.i64(ptr align 4 [[PTR]], i64 3, i1 false, i32 2, i32 1)
   matrix_t<int, 2, 1> M1 = __builtin_matrix_column_major_load(Ptr, 2, constexpr1(), 3);
 }
 
@@ -151,18 +147,18 @@ template <unsigned N>
 constexpr int constexpr_plus1() { return N + 1; }
 
 void test_column_major_load_constexpr_num_columns_temp(int *Ptr) {
-  // CHECK-LABEL:  define{{.*}} void @_Z49test_column_major_load_constexpr_num_columns_tempPi(i32* noundef %Ptr)
-  // CHECK:         [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    call <10 x i32> @llvm.matrix.column.major.load.v10i32.i64(i32* align 4 [[PTR]], i64 3, i1 false, i32 2, i32 5)
+  // CHECK-LABEL:  define{{.*}} void @_Z49test_column_major_load_constexpr_num_columns_tempPi(ptr noundef %Ptr)
+  // CHECK:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call <10 x i32> @llvm.matrix.column.major.load.v10i32.i64(ptr align 4 [[PTR]], i64 3, i1 false, i32 2, i32 5)
   matrix_t<int, 2, 5> M1 = __builtin_matrix_column_major_load(Ptr, 2, constexpr_plus1<4>(), 3);
 }
 
 void test_column_major_load_constexpr_stride_constexpr(int *Ptr) {
-  // CHECK-LABEL: define{{.*}} void @_Z49test_column_major_load_constexpr_stride_constexprPi(i32* noundef %Ptr)
+  // CHECK-LABEL: define{{.*}} void @_Z49test_column_major_load_constexpr_stride_constexprPi(ptr noundef %Ptr)
   // CHECK:         [[STRIDE:%.*]] = call noundef i32 @_Z10constexpr3v()
   // CHECK-NEXT:    [[STRIDE_EXT:%.*]] = sext i32 [[STRIDE]] to i64
-  // CHECK-NEXT:    [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    call <4 x i32> @llvm.matrix.column.major.load.v4i32.i64(i32* align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 2, i32 2)
+  // CHECK-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call <4 x i32> @llvm.matrix.column.major.load.v4i32.i64(ptr align 4 [[PTR]], i64 [[STRIDE_EXT]], i1 false, i32 2, i32 2)
 
   matrix_t<int, 2, 2> M1 = __builtin_matrix_column_major_load(Ptr, 2, 2, constexpr3());
 }
@@ -193,53 +189,53 @@ void column_major_store_with_stride(matrix_t<T, R, C> &m, T *Ptr) {
 }
 
 void test_column_major_store_with_stride_template_double(double *Ptr) {
-  // CHECK-LABEL: define{{.*}} void @_Z51test_column_major_store_with_stride_template_doublePd(double* noundef %Ptr)
-  // CHECK:         [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
-  // CHECK-NEXT:    call void @_Z30column_major_store_with_strideIdLj10ELj4ELj15EEvRu11matrix_typeIXT0_EXT1_ET_EPS0_([40 x double]* noundef nonnull align 8 dereferenceable(320) %M1, double* noundef [[PTR]])
+  // CHECK-LABEL: define{{.*}} void @_Z51test_column_major_store_with_stride_template_doublePd(ptr noundef %Ptr)
+  // CHECK:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call void @_Z30column_major_store_with_strideIdLj10ELj4ELj15EEvRu11matrix_typeIXT0_EXT1_ET_EPS0_(ptr noundef nonnull align 8 dereferenceable(320) %M1, ptr noundef [[PTR]])
 
-  // CHECK-LABEL:  define linkonce_odr void @_Z30column_major_store_with_strideIdLj10ELj4ELj15EEvRu11matrix_typeIXT0_EXT1_ET_EPS0_([40 x double]* noundef nonnull align 8 dereferenceable(320) %m, double* noundef %Ptr)
-  // CHECK:         [[M:%.*]] = load <40 x double>, <40 x double>* {{.*}}, align 8
-  // CHECK-NEXT:    [[PTR:%.*]] = load double*, double** %Ptr.addr, align 8
-  // CHECK-NEXT:    call void @llvm.matrix.column.major.store.v40f64.i64(<40 x double> [[M]], double* align 8 [[PTR]], i64 15, i1 false, i32 10, i32 4)
+  // CHECK-LABEL:  define linkonce_odr void @_Z30column_major_store_with_strideIdLj10ELj4ELj15EEvRu11matrix_typeIXT0_EXT1_ET_EPS0_(ptr noundef nonnull align 8 dereferenceable(320) %m, ptr noundef %Ptr)
+  // CHECK:         [[M:%.*]] = load <40 x double>, ptr {{.*}}, align 8
+  // CHECK-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call void @llvm.matrix.column.major.store.v40f64.i64(<40 x double> [[M]], ptr align 8 [[PTR]], i64 15, i1 false, i32 10, i32 4)
 
   matrix_t<double, 10, 4> M1;
   column_major_store_with_stride<double, 10, 4, 15>(M1, Ptr);
 }
 
 void test_column_major_store_with_stride_template_int(int *Ptr) {
-  // CHECK-LABEL: define{{.*}} void @_Z48test_column_major_store_with_stride_template_intPi(i32* noundef %Ptr)
-  // CHECK:         [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    call void @_Z30column_major_store_with_strideIiLj3ELj2ELj3EEvRu11matrix_typeIXT0_EXT1_ET_EPS0_([6 x i32]* noundef nonnull align 4 dereferenceable(24) %M1, i32* noundef [[PTR]])
+  // CHECK-LABEL: define{{.*}} void @_Z48test_column_major_store_with_stride_template_intPi(ptr noundef %Ptr)
+  // CHECK:         [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call void @_Z30column_major_store_with_strideIiLj3ELj2ELj3EEvRu11matrix_typeIXT0_EXT1_ET_EPS0_(ptr noundef nonnull align 4 dereferenceable(24) %M1, ptr noundef [[PTR]])
 
-  // CHECK-LABEL:  define linkonce_odr void @_Z30column_major_store_with_strideIiLj3ELj2ELj3EEvRu11matrix_typeIXT0_EXT1_ET_EPS0_([6 x i32]* noundef nonnull align 4 dereferenceable(24) %m, i32* noundef %Ptr)
-  // CHECK:         [[M:%.*]] = load <6 x i32>, <6 x i32>* {{.*}}, align 4
-  // CHECK-NEXT:    [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    call void @llvm.matrix.column.major.store.v6i32.i64(<6 x i32> [[M]], i32* align 4 [[PTR]], i64 3, i1 false, i32 3, i32 2)
+  // CHECK-LABEL:  define linkonce_odr void @_Z30column_major_store_with_strideIiLj3ELj2ELj3EEvRu11matrix_typeIXT0_EXT1_ET_EPS0_(ptr noundef nonnull align 4 dereferenceable(24) %m, ptr noundef %Ptr)
+  // CHECK:         [[M:%.*]] = load <6 x i32>, ptr {{.*}}, align 4
+  // CHECK-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    call void @llvm.matrix.column.major.store.v6i32.i64(<6 x i32> [[M]], ptr align 4 [[PTR]], i64 3, i1 false, i32 3, i32 2)
 
   matrix_t<int, 3, 2> M1;
   column_major_store_with_stride<int, 3, 2, 3>(M1, Ptr);
 }
 
 void test_column_major_store_stride_wrapper(int *Ptr, UnsignedWrapper &W) {
-  // CHECK-LABEL: define{{.*}} void @_Z38test_column_major_store_stride_wrapperPiR15UnsignedWrapper(i32* noundef %Ptr, %struct.UnsignedWrapper* noundef nonnull align 1 dereferenceable(1) %W)
-  // CHECK:         [[M:%.*]] = load <4 x i32>, <4 x i32>* {{.*}}, align 4
-  // CHECK-NEXT:    [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
-  // CHECK-NEXT:    [[W:%.*]] = load %struct.UnsignedWrapper*, %struct.UnsignedWrapper** %W.addr, align 8
-  // CHECK-NEXT:    [[IDX:%.*]] = call noundef i32 @_ZN15UnsignedWrappercvjEv(%struct.UnsignedWrapper* {{[^,]*}} [[W]])
+  // CHECK-LABEL: define{{.*}} void @_Z38test_column_major_store_stride_wrapperPiR15UnsignedWrapper(ptr noundef %Ptr, ptr noundef nonnull align 1 dereferenceable(1) %W)
+  // CHECK:         [[M:%.*]] = load <4 x i32>, ptr {{.*}}, align 4
+  // CHECK-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
+  // CHECK-NEXT:    [[W:%.*]] = load ptr, ptr %W.addr, align 8
+  // CHECK-NEXT:    [[IDX:%.*]] = call noundef i32 @_ZN15UnsignedWrappercvjEv(ptr {{[^,]*}} [[W]])
   // CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64
-  // CHECK-NEXT:    call void @llvm.matrix.column.major.store.v4i32.i64(<4 x i32> [[M]], i32* align 4 [[PTR]], i64 [[IDX_EXT]], i1 false, i32 2, i32 2)
+  // CHECK-NEXT:    call void @llvm.matrix.column.major.store.v4i32.i64(<4 x i32> [[M]], ptr align 4 [[PTR]], i64 [[IDX_EXT]], i1 false, i32 2, i32 2)
 
   matrix_t<int, 2, 2> M1;
   __builtin_matrix_column_major_store(M1, Ptr, W);
 }
 
 void test_column_major_store_constexpr_stride_constexpr(int *Ptr) {
-  // CHECK-LABEL: define{{.*}} void @_Z50test_column_major_store_constexpr_stride_constexprPi(i32* noundef %Ptr)
-  // CHECK:         [[M:%.*]] = load <4 x i32>, <4 x i32>* %0, align 4
-  // CHECK-NEXT:    [[PTR:%.*]] = load i32*, i32** %Ptr.addr, align 8
+  // CHECK-LABEL: define{{.*}} void @_Z50test_column_major_store_constexpr_stride_constexprPi(ptr noundef %Ptr)
+  // CHECK:         [[M:%.*]] = load <4 x i32>, ptr %M, align 4
+  // CHECK-NEXT:    [[PTR:%.*]] = load ptr, ptr %Ptr.addr, align 8
   // CHECK-NEXT:    [[IDX:%.*]] = call noundef i32 @_Z10constexpr3v()
   // CHECK-NEXT:    [[IDX_EXT:%.*]] = sext i32 [[IDX]] to i64
-  // CHECK-NEXT:    call void @llvm.matrix.column.major.store.v4i32.i64(<4 x i32> [[M]], i32* align 4 [[PTR]], i64 [[IDX_EXT]], i1 false, i32 2, i32 2)
+  // CHECK-NEXT:    call void @llvm.matrix.column.major.store.v4i32.i64(<4 x i32> [[M]], ptr align 4 [[PTR]], i64 [[IDX_EXT]], i1 false, i32 2, i32 2)
 
   matrix_t<int, 2, 2> M;
   __builtin_matrix_column_major_store(M, Ptr, constexpr3());

diff  --git a/clang/test/CodeGenCXX/ms-property.cpp b/clang/test/CodeGenCXX/ms-property.cpp
index 67f5d50a89580..744de224b2f9a 100644
--- a/clang/test/CodeGenCXX/ms-property.cpp
+++ b/clang/test/CodeGenCXX/ms-property.cpp
@@ -1,6 +1,6 @@
-// RUN: %clang_cc1 -no-opaque-pointers -emit-llvm -triple=x86_64-pc-win32 -fms-compatibility %s -o - | FileCheck %s
-// RUN: %clang_cc1 -no-opaque-pointers -triple=x86_64-pc-win32 -fms-compatibility -emit-pch -o %t %s
-// RUN: %clang_cc1 -no-opaque-pointers -emit-llvm -triple=x86_64-pc-win32 -fms-compatibility -include-pch %t -verify %s -o - | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -triple=x86_64-pc-win32 -fms-compatibility %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fms-compatibility -emit-pch -o %t %s
+// RUN: %clang_cc1 -emit-llvm -triple=x86_64-pc-win32 -fms-compatibility -include-pch %t -verify %s -o - | FileCheck %s
 // expected-no-diagnostics
 
 #ifndef HEADER
@@ -59,71 +59,71 @@ int main(int argc, char **argv) {
   Test1 t(argc);
   S *p1 = 0;
   St<float> *p2 = 0;
-  // CHECK: call noundef i32 @"?GetX at S@@QEAAHHH at Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 223, i32 noundef 11)
+  // CHECK: call noundef i32 @"?GetX at S@@QEAAHHH at Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 223, i32 noundef 11)
   int j = p1->x[223][11];
-  // CHECK: [[J:%.+]] = load i32, i32* %
-  // CHECK-NEXT: call void @"?PutX at S@@QEAAXHHH at Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 23, i32 noundef 1, i32 noundef [[J]])
+  // CHECK: [[J:%.+]] = load i32, ptr %
+  // CHECK-NEXT: call void @"?PutX at S@@QEAAXHHH at Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 23, i32 noundef 1, i32 noundef [[J]])
   p1->x[23][1] = j;
-  // CHECK: call noundef i32 @"?GetY at S@@QEAAHHH at Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 123, i32 noundef 22)
+  // CHECK: call noundef i32 @"?GetY at S@@QEAAHHH at Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 123, i32 noundef 22)
   int k = p1->y[123][22];
-  // CHECK: [[K:%.+]] = load i32, i32* %
-  // CHECK-NEXT: call void @"?PutY at S@@QEAAXHHH at Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 16, i32 noundef 2, i32 noundef [[K]])
+  // CHECK: [[K:%.+]] = load i32, ptr %
+  // CHECK-NEXT: call void @"?PutY at S@@QEAAXHHH at Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 16, i32 noundef 2, i32 noundef [[K]])
   p1->y[16][2] = k;
-  // CHECK: call noundef i32 @"?GetZ at S@@QEAAHHHH at Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 123, i32 noundef 22, i32 noundef 44)
+  // CHECK: call noundef i32 @"?GetZ at S@@QEAAHHHH at Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 123, i32 noundef 22, i32 noundef 44)
   k = p1->z[123][22][44];
-  // CHECK: [[K:%.+]] = load i32, i32* %
-  // CHECK-NEXT: call void @"?PutZ at S@@QEAAXHHHH at Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 16, i32 noundef 2, i32 noundef 32, i32 noundef [[K]])
+  // CHECK: [[K:%.+]] = load i32, ptr %
+  // CHECK-NEXT: call void @"?PutZ at S@@QEAAXHHHH at Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 16, i32 noundef 2, i32 noundef 32, i32 noundef [[K]])
   p1->z[16][2][32] = k;
-  // CHECK: call noundef float @"?GetX@?$St at M@@QEAAMMM at Z"(%class.St* {{[^,]*}} %{{.+}}, float noundef 2.230000e+02, float noundef 1.100000e+01)
+  // CHECK: call noundef float @"?GetX@?$St at M@@QEAAMMM at Z"(ptr {{[^,]*}} %{{.+}}, float noundef 2.230000e+02, float noundef 1.100000e+01)
   float j1 = p2->x[223][11];
-  // CHECK: [[J1:%.+]] = load float, float* %
-  // CHECK-NEXT: [[CALL:%.+]] = call noundef float @"?PutX@?$St at M@@QEAAMMMM at Z"(%class.St* {{[^,]*}} %{{.+}}, float noundef 2.300000e+01, float noundef 1.000000e+00, float noundef [[J1]])
+  // CHECK: [[J1:%.+]] = load float, ptr %
+  // CHECK-NEXT: [[CALL:%.+]] = call noundef float @"?PutX@?$St at M@@QEAAMMMM at Z"(ptr {{[^,]*}} %{{.+}}, float noundef 2.300000e+01, float noundef 1.000000e+00, float noundef [[J1]])
   // CHECK-NEXT: [[CONV:%.+]] = fptosi float [[CALL]] to i32
-  // CHECK-NEXT: store i32 [[CONV]], i32*
+  // CHECK-NEXT: store i32 [[CONV]], ptr
   argc = p2->x[23][1] = j1;
   // CHECK: [[IDX:%.+]] = call noundef i32 @"?idx@@YAHXZ"()
   // CHECK-NEXT: [[CONV:%.+]] = sitofp i32 [[IDX]] to float
-  // CHECK-NEXT: [[GET:%.+]] = call noundef float @"?GetX@?$St at M@@QEAAMMM at Z"(%class.St* {{[^,]*}} %{{.+}}, float noundef [[CONV]], float noundef 1.000000e+00)
+  // CHECK-NEXT: [[GET:%.+]] = call noundef float @"?GetX@?$St at M@@QEAAMMM at Z"(ptr {{[^,]*}} %{{.+}}, float noundef [[CONV]], float noundef 1.000000e+00)
   // CHECK-NEXT: [[INC:%.+]] = fadd float [[GET]], 1.000000e+00
   // CHECK-NEXT: [[CONV:%.+]] = sitofp i32 [[IDX]] to float
-  // CHECK-NEXT: call noundef float @"?PutX@?$St at M@@QEAAMMMM at Z"(%class.St* {{[^,]*}} %{{.+}}, float noundef [[CONV]], float noundef 1.000000e+00, float noundef [[INC]])
+  // CHECK-NEXT: call noundef float @"?PutX@?$St at M@@QEAAMMMM at Z"(ptr {{[^,]*}} %{{.+}}, float noundef [[CONV]], float noundef 1.000000e+00, float noundef [[INC]])
   ++p2->x[idx()][1];
   // CHECK: call void @"??$foo at H@@YAXHH at Z"(i32 noundef %{{.+}}, i32 noundef %{{.+}})
   foo(argc, (int)argv[0][0]);
-  // CHECK: [[P2:%.+]] = load %class.St*, %class.St** %
-  // CHECK: [[P1:%.+]] = load %class.S*, %class.S** %
-  // CHECK: [[P1_X_22_33:%.+]] = call noundef i32 @"?GetX at S@@QEAAHHH at Z"(%class.S* {{[^,]*}} [[P1]], i32 noundef 22, i32 noundef 33)
+  // CHECK: [[P2:%.+]] = load ptr, ptr %
+  // CHECK: [[P1:%.+]] = load ptr, ptr %
+  // CHECK: [[P1_X_22_33:%.+]] = call noundef i32 @"?GetX at S@@QEAAHHH at Z"(ptr {{[^,]*}} [[P1]], i32 noundef 22, i32 noundef 33)
   // CHECK: [[CAST:%.+]] = sitofp i32 [[P1_X_22_33]] to double
-  // CHECK: [[ARGC:%.+]] = load i32, i32* %
-  // CHECK: [[T_X:%.+]] = call noundef i32 @"?get_x at Test1@@QEBAHXZ"(%class.Test1* {{[^,]*}} %{{.+}})
+  // CHECK: [[ARGC:%.+]] = load i32, ptr %
+  // CHECK: [[T_X:%.+]] = call noundef i32 @"?get_x at Test1@@QEBAHXZ"(ptr {{[^,]*}} %{{.+}})
   // CHECK: [[CAST2:%.+]] = trunc i32 [[T_X]] to i8
-  // CHECK: call void @"?PutY@?$St at M@@QEAAXDHN at Z"(%class.St* {{[^,]*}} [[P2]], i8 noundef [[CAST2]], i32 noundef [[ARGC]], double noundef [[CAST]])
+  // CHECK: call void @"?PutY@?$St at M@@QEAAXDHN at Z"(ptr {{[^,]*}} [[P2]], i8 noundef [[CAST2]], i32 noundef [[ARGC]], double noundef [[CAST]])
   p2->y[t.X][argc] =  p1->x[22][33];
-  // CHECK: [[P2_1:%.+]] = load %class.St*, %class.St**
-  // CHECK: [[P2_2:%.+]] = load %class.St*, %class.St**
-  // CHECK: [[P1:%.+]] = load %class.S*, %class.S**
-  // CHECK: [[ARGC:%.+]] = load i32, i32* %
-  // CHECK: [[P1_X_ARGC_0:%.+]] = call noundef i32 @"?GetX at S@@QEAAHHH at Z"(%class.S* {{[^,]*}} [[P1]], i32 noundef [[ARGC]], i32 noundef 0)
+  // CHECK: [[P2_1:%.+]] = load ptr, ptr
+  // CHECK: [[P2_2:%.+]] = load ptr, ptr
+  // CHECK: [[P1:%.+]] = load ptr, ptr
+  // CHECK: [[ARGC:%.+]] = load i32, ptr %
+  // CHECK: [[P1_X_ARGC_0:%.+]] = call noundef i32 @"?GetX at S@@QEAAHHH at Z"(ptr {{[^,]*}} [[P1]], i32 noundef [[ARGC]], i32 noundef 0)
   // CHECK: [[CAST:%.+]] = trunc i32 [[P1_X_ARGC_0]] to i8
-  // CHECK: [[P2_Y_p1_X_ARGC_0_T:%.+]] = call noundef i8 @"?GetY@?$St at M@@QEAADDVTest1@@@Z"(%class.St* {{[^,]*}} [[P2_2]], i8 noundef [[CAST]], %class.Test1* noundef %{{.+}})
+  // CHECK: [[P2_Y_p1_X_ARGC_0_T:%.+]] = call noundef i8 @"?GetY@?$St at M@@QEAADDVTest1@@@Z"(ptr {{[^,]*}} [[P2_2]], i8 noundef [[CAST]], ptr noundef %{{.+}})
   // CHECK: [[CAST:%.+]] = sitofp i8 [[P2_Y_p1_X_ARGC_0_T]] to float
-  // CHECK: [[J:%.+]] = load i32, i32* %
+  // CHECK: [[J:%.+]] = load i32, ptr %
   // CHECK: [[CAST1:%.+]] = sitofp i32 [[J]] to float
-  // CHECK: [[J:%.+]] = load i32, i32* %
+  // CHECK: [[J:%.+]] = load i32, ptr %
   // CHECK: [[CAST2:%.+]] = sitofp i32 [[J]] to float
-  // CHECK: call noundef float @"?PutX@?$St at M@@QEAAMMMM at Z"(%class.St* {{[^,]*}} [[P2_1]], float noundef [[CAST2]], float noundef [[CAST1]], float noundef [[CAST]])
+  // CHECK: call noundef float @"?PutX@?$St at M@@QEAAMMMM at Z"(ptr {{[^,]*}} [[P2_1]], float noundef [[CAST2]], float noundef [[CAST1]], float noundef [[CAST]])
   p2->x[j][j] = p2->y[p1->x[argc][0]][t];
-  // CHECK: [[CALL:%.+]] = call noundef %class.Test1* @"?GetTest1 at Test1@@SAPEAV1 at XZ"()
-  // CHECK-NEXT: call noundef i32 @"?get_x at Test1@@QEBAHXZ"(%class.Test1* {{[^,]*}} [[CALL]])
+  // CHECK: [[CALL:%.+]] = call noundef ptr @"?GetTest1 at Test1@@SAPEAV1 at XZ"()
+  // CHECK-NEXT: call noundef i32 @"?get_x at Test1@@QEBAHXZ"(ptr {{[^,]*}} [[CALL]])
   return Test1::GetTest1()->X;
 }
 
 // CHECK: define linkonce_odr dso_local void @"??$foo at H@@YAXHH at Z"(i32 noundef %{{.+}}, i32 noundef %{{.+}})
-// CHECK: call noundef i32 @"?GetX@?$St at H@@QEAAHHH at Z"(%class.St{{.+}}* {{[^,]*}} [[BAR:%.+]], i32 noundef %{{.+}} i32 noundef %{{.+}})
-// CHECK: call noundef i32 @"?PutX@?$St at H@@QEAAHHHH at Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i32 noundef %{{.+}}, i32 noundef %{{.+}}, i32 noundef %{{.+}})
-// CHECK: call noundef i32 @"?GetX@?$St at H@@QEAAHHH at Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i32 noundef %{{.+}} i32 noundef %{{.+}})
-// CHECK: call void @"?PutY@?$St at H@@QEAAXDHN at Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i8 noundef %{{.+}}, i32 noundef %{{.+}}, double noundef %{{.+}}
-// CHECK: call noundef i32 @"?GetX@?$St at H@@QEAAHHH at Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i32 noundef %{{.+}} i32 noundef %{{.+}})
-// CHECK: call noundef i8 @"?GetY@?$St at H@@QEAADDVTest1@@@Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i8 noundef %{{.+}}, %class.Test1* noundef %{{.+}})
-// CHECK: call noundef i32 @"?PutX@?$St at H@@QEAAHHHH at Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i32 noundef %{{.+}}, i32 noundef %{{.+}}, i32 noundef %{{.+}})
+// CHECK: call noundef i32 @"?GetX@?$St at H@@QEAAHHH at Z"(ptr {{[^,]*}} [[BAR:%.+]], i32 noundef %{{.+}} i32 noundef %{{.+}})
+// CHECK: call noundef i32 @"?PutX@?$St at H@@QEAAHHHH at Z"(ptr {{[^,]*}} [[BAR]], i32 noundef %{{.+}}, i32 noundef %{{.+}}, i32 noundef %{{.+}})
+// CHECK: call noundef i32 @"?GetX@?$St at H@@QEAAHHH at Z"(ptr {{[^,]*}} [[BAR]], i32 noundef %{{.+}} i32 noundef %{{.+}})
+// CHECK: call void @"?PutY@?$St at H@@QEAAXDHN at Z"(ptr {{[^,]*}} [[BAR]], i8 noundef %{{.+}}, i32 noundef %{{.+}}, double noundef %{{.+}}
+// CHECK: call noundef i32 @"?GetX@?$St at H@@QEAAHHH at Z"(ptr {{[^,]*}} [[BAR]], i32 noundef %{{.+}} i32 noundef %{{.+}})
+// CHECK: call noundef i8 @"?GetY@?$St at H@@QEAADDVTest1@@@Z"(ptr {{[^,]*}} [[BAR]], i8 noundef %{{.+}}, ptr noundef %{{.+}})
+// CHECK: call noundef i32 @"?PutX@?$St at H@@QEAAHHHH at Z"(ptr {{[^,]*}} [[BAR]], i32 noundef %{{.+}}, i32 noundef %{{.+}}, i32 noundef %{{.+}})
 #endif //HEADER

diff  --git a/clang/test/CodeGenCXX/ms-thunks-unprototyped.cpp b/clang/test/CodeGenCXX/ms-thunks-unprototyped.cpp
index 042dd8ba4bf1c..46fd33c58f6ae 100644
--- a/clang/test/CodeGenCXX/ms-thunks-unprototyped.cpp
+++ b/clang/test/CodeGenCXX/ms-thunks-unprototyped.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -fno-rtti-data -triple x86_64-windows-msvc -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -fno-rtti-data -triple x86_64-windows-msvc -emit-llvm %s -o - | FileCheck %s
 
 // In this example, C does not override B::foo, but it needs to emit a thunk to
 // adjust for the relative 
diff erence of position between A-in-B and A-in-C.
@@ -31,43 +31,40 @@ struct S : B1, B2 { DoNotInstantiate<void> f() override; };
 S s;
 
 // CHECK: @"??_7S@@6BB2@@@" = linkonce_odr unnamed_addr constant
-// CHECK-SAME: void (%struct.S*, ...)* @"?f at S@@W7EAA?AU?$DoNotInstantiate at X@@XZ"
+// CHECK-SAME: ptr @"?f at S@@W7EAA?AU?$DoNotInstantiate at X@@XZ"
 
 // CHECK: @"??_7C@@6B@" = linkonce_odr unnamed_addr constant
-// CHECK-SAME: void (%struct.B*, ...)* @"?foo at B@@W7EAAXUIncomplete@@@Z"
-// CHECK-SAME: void (%struct.B*, ...)* @"?bar at B@@W7EAAXU?$DoNotInstantiate at H@@@Z"
-// CHECK-SAME: i32 (i8*, i32)* @"?baz at B@@W7EAAHU?$InstantiateLater at H@@@Z"
+// CHECK-SAME: ptr @"?foo at B@@W7EAAXUIncomplete@@@Z"
+// CHECK-SAME: ptr @"?bar at B@@W7EAAXU?$DoNotInstantiate at H@@@Z"
+// CHECK-SAME: ptr @"?baz at B@@W7EAAHU?$InstantiateLater at H@@@Z"
 
 
-// CHECK-LABEL: define linkonce_odr dso_local void @"?f at S@@W7EAA?AU?$DoNotInstantiate at X@@XZ"(%struct.S* noundef %this, ...)
-// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, i8* {{.*}}, i32 -8
-// CHECK: %[[THIS_ADJ:[^ ]*]] = bitcast i8* %[[THIS_ADJ_i8]] to %struct.S*
-// CHECK: musttail call void (%struct.S*, ...) {{.*}}@"?f at S@@UEAA?AU?$DoNotInstantiate at X@@XZ"
-// CHECK-SAME: (%struct.S* noundef %[[THIS_ADJ]], ...)
+// CHECK-LABEL: define linkonce_odr dso_local void @"?f at S@@W7EAA?AU?$DoNotInstantiate at X@@XZ"(ptr noundef %this, ...)
+// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, ptr {{.*}}, i32 -8
+// CHECK: musttail call void (ptr, ...) {{.*}}@"?f at S@@UEAA?AU?$DoNotInstantiate at X@@XZ"
+// CHECK-SAME: (ptr noundef %[[THIS_ADJ_i8]], ...)
 // CHECK: ret void
 
 // The thunks should have a -8 adjustment.
 
-// CHECK-LABEL: define linkonce_odr dso_local void @"?foo at B@@W7EAAXUIncomplete@@@Z"(%struct.B* noundef %this, ...)
-// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, i8* {{.*}}, i32 -8
-// CHECK: %[[THIS_ADJ:[^ ]*]] = bitcast i8* %[[THIS_ADJ_i8]] to %struct.B*
-// CHECK: musttail call void (%struct.B*, ...) {{.*}}@"?foo at B@@UEAAXUIncomplete@@@Z"
-// CHECK-SAME: (%struct.B* noundef %[[THIS_ADJ]], ...)
+// CHECK-LABEL: define linkonce_odr dso_local void @"?foo at B@@W7EAAXUIncomplete@@@Z"(ptr noundef %this, ...)
+// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, ptr {{.*}}, i32 -8
+// CHECK: musttail call void (ptr, ...) {{.*}}@"?foo at B@@UEAAXUIncomplete@@@Z"
+// CHECK-SAME: (ptr noundef %[[THIS_ADJ_i8]], ...)
 // CHECK-NEXT: ret void
 
-// CHECK-LABEL: define linkonce_odr dso_local void @"?bar at B@@W7EAAXU?$DoNotInstantiate at H@@@Z"(%struct.B* noundef %this, ...)
-// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, i8* {{.*}}, i32 -8
-// CHECK: %[[THIS_ADJ:[^ ]*]] = bitcast i8* %[[THIS_ADJ_i8]] to %struct.B*
-// CHECK: musttail call void (%struct.B*, ...) {{.*}}@"?bar at B@@UEAAXU?$DoNotInstantiate at H@@@Z"
-// CHECK-SAME: (%struct.B* noundef %[[THIS_ADJ]], ...)
+// CHECK-LABEL: define linkonce_odr dso_local void @"?bar at B@@W7EAAXU?$DoNotInstantiate at H@@@Z"(ptr noundef %this, ...)
+// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, ptr {{.*}}, i32 -8
+// CHECK: musttail call void (ptr, ...) {{.*}}@"?bar at B@@UEAAXU?$DoNotInstantiate at H@@@Z"
+// CHECK-SAME: (ptr noundef %[[THIS_ADJ_i8]], ...)
 // CHECK-NEXT: ret void
 
 // If we complete the definition later, things work out.
 template <typename T> struct InstantiateLater { T x; };
 inline int B::baz(InstantiateLater<int> p) { return p.x; }
 
-// CHECK-LABEL: define linkonce_odr dso_local noundef i32 @"?baz at B@@W7EAAHU?$InstantiateLater at H@@@Z"(i8* noundef %this.coerce, i32 %p.coerce)
-// CHECK: = getelementptr i8, i8* {{.*}}, i32 -8
-// CHECK: tail call noundef i32 @"?baz at B@@UEAAHU?$InstantiateLater at H@@@Z"(i8* {{[^,]*}}, i32 {{.*}})
+// CHECK-LABEL: define linkonce_odr dso_local noundef i32 @"?baz at B@@W7EAAHU?$InstantiateLater at H@@@Z"(ptr noundef %this, i32 %p.coerce)
+// CHECK: = getelementptr i8, ptr {{.*}}, i32 -8
+// CHECK: tail call noundef i32 @"?baz at B@@UEAAHU?$InstantiateLater at H@@@Z"(ptr {{[^,]*}}, i32 {{.*}})
 
-// CHECK-LABEL: define linkonce_odr dso_local noundef i32 @"?baz at B@@UEAAHU?$InstantiateLater at H@@@Z"(i8* noundef %this.coerce, i32 %p.coerce)
+// CHECK-LABEL: define linkonce_odr dso_local noundef i32 @"?baz at B@@UEAAHU?$InstantiateLater at H@@@Z"(ptr noundef %this, i32 %p.coerce)

diff  --git a/clang/test/CodeGenCXX/ms-union-member-ref.cpp b/clang/test/CodeGenCXX/ms-union-member-ref.cpp
index fd1f2511ead2b..b6afeff926bf5 100644
--- a/clang/test/CodeGenCXX/ms-union-member-ref.cpp
+++ b/clang/test/CodeGenCXX/ms-union-member-ref.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -no-opaque-pointers -triple=i686-pc-win32 -fms-extensions %s -emit-llvm -o- | FileCheck %s
+// RUN: %clang_cc1 -triple=i686-pc-win32 -fms-extensions %s -emit-llvm -o- | FileCheck %s
 
 union A {
   int *&ref;
@@ -8,27 +8,27 @@ union A {
 int *f1(A *a) {
   return a->ref;
 }
-// CHECK-LABEL: define {{.*}}i32* @"?f1@@YAPAHPATA@@@Z"(%union.A* noundef %a)
-// CHECK:       [[REF:%[^[:space:]]+]] = bitcast %union.A* %{{.*}} to i32***
-// CHECK:       [[IPP:%[^[:space:]]+]] = load i32**, i32*** [[REF]]
-// CHECK:       [[IP:%[^[:space:]]+]]  = load i32*, i32** [[IPP]]
-// CHECK:       ret i32* [[IP]]
+// CHECK-LABEL: define {{.*}}ptr @"?f1@@YAPAHPATA@@@Z"(ptr noundef %a)
+// CHECK:       [[A_ADDR:%[^[:space:]]+]] = load ptr, ptr %{{.*}}
+// CHECK:       [[IPP:%[^[:space:]]+]] = load ptr, ptr [[A_ADDR]]
+// CHECK:       [[IP:%[^[:space:]]+]]  = load ptr, ptr [[IPP]]
+// CHECK:       ret ptr [[IP]]
 
 void f2(A *a) {
   *a->ref = 1;
 }
-// CHECK-LABEL: define {{.*}}void @"?f2@@YAXPATA@@@Z"(%union.A* noundef %a)
-// CHECK:       [[REF:%[^[:space:]]+]] = bitcast %union.A* %{{.*}} to i32***
-// CHECK:       [[IPP:%[^[:space:]]+]] = load i32**, i32*** [[REF]]
-// CHECK:       [[IP:%[^[:space:]]+]]  = load i32*, i32** [[IPP]]
-// CHECK:       store i32 1, i32* [[IP]]
+// CHECK-LABEL: define {{.*}}void @"?f2@@YAXPATA@@@Z"(ptr noundef %a)
+// CHECK:       [[A_ADDR:%[^[:space:]]+]] = load ptr, ptr %{{.*}}
+// CHECK:       [[IPP:%[^[:space:]]+]] = load ptr, ptr [[A_ADDR]]
+// CHECK:       [[IP:%[^[:space:]]+]]  = load ptr, ptr [[IPP]]
+// CHECK:       store i32 1, ptr [[IP]]
 
 bool f3(A *a, int *b) {
   return a->ref != b;
 }
-// CHECK-LABEL: define {{.*}}i1 @"?f3@@YA_NPATA@@PAH at Z"(%union.A* noundef %a, i32* noundef %b)
-// CHECK:       [[REF:%[^[:space:]]+]] = bitcast %union.A* %{{.*}} to i32***
-// CHECK:       [[IPP:%[^[:space:]]+]] = load i32**, i32*** [[REF]]
-// CHECK:       [[IP:%[^[:space:]]+]]  = load i32*, i32** [[IPP]]
-// CHECK:       [[IP2:%[^[:space:]]+]]  = load i32*, i32** %b.addr
-// CHECK:       icmp ne i32* [[IP]], [[IP2]]
+// CHECK-LABEL: define {{.*}}i1 @"?f3@@YA_NPATA@@PAH at Z"(ptr noundef %a, ptr noundef %b)
+// CHECK:       [[A_ADDR:%[^[:space:]]+]] = load ptr, ptr %{{.*}}
+// CHECK:       [[IPP:%[^[:space:]]+]] = load ptr, ptr [[A_ADDR]]
+// CHECK:       [[IP:%[^[:space:]]+]]  = load ptr, ptr [[IPP]]
+// CHECK:       [[IP2:%[^[:space:]]+]]  = load ptr, ptr %b.addr
+// CHECK:       icmp ne ptr [[IP]], [[IP2]]


        


More information about the cfe-commits mailing list