[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