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::m + W::m + &X::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::m + W::m + &X::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 T &make(); // CHECK: @_ZDC2a12a2E ={{.*}} global {{.*}} zeroinitializer, align 4 auto [a1, a2] = make(); // 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(); -// CHECK: @_ZDC2c12c2E ={{.*}} global [2 x i32]* null, align 8 +// CHECK: @_ZDC2c12c2E ={{.*}} global ptr null, align 8 auto &[c1, c2] = make(); // CHECK: @_ZDC2d12d2E ={{.*}} global <2 x i32> zeroinitializer, align 8 auto [d1, d2] = make(); // CHECK: @_ZDC2e12e2E ={{.*}} global { i32, i32 } zeroinitializer, align 4 auto [e1, e2] = make(); -// 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 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@Udestroying_delete_t@std@@@Z"(%{{.*}}* noundef %[[a]], i8 -// CHECK-MSABI32: call void @"??3A@@SAXPAU0@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@Udestroying_delete_t@std@@@Z"(ptr noundef %[[a]], i8 +// CHECK-MSABI32: call void @"??3A@@SAXPAU0@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@Udestroying_delete_t@std@@@Z"(%{{.*}}* noundef %[[a]], i8 -// CHECK-MSABI32: call void @"??3A@@SAXPAU0@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@Udestroying_delete_t@std@@@Z"(ptr noundef %[[a]], i8 +// CHECK-MSABI32: call void @"??3A@@SAXPAU0@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@Udestroying_delete_t@std@@_KW4align_val_t@2@@Z"(%{{.*}}* noundef %[[a]], i8 {{[^,]*}}, i64 noundef 32, i64 noundef 16) -// CHECK-MSABI32: call void @"??3F@@SAXPAU0@Udestroying_delete_t@std@@IW4align_val_t@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@Udestroying_delete_t@std@@_KW4align_val_t@2@@Z"(ptr noundef %[[a]], i8 {{[^,]*}}, i64 noundef 32, i64 noundef 16) +// CHECK-MSABI32: call void @"??3F@@SAXPAU0@Udestroying_delete_t@std@@IW4align_val_t@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(); 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(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(A()) : static_cast(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; // @@ -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@noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}) + // MSABI-LABEL: define internal {{.*}} @"??0B@noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}}) // MSABI: call {{.*}} @"??0Z@@Q{{AE|EAA}}@XZ"( - // MSABI: call {{.*}} @"??0A@noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}) + // MSABI: call {{.*}} @"??0A@noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__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@noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}) - // MSABI: call {{.*}} @"??0B@noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}) + // MSABI-LABEL: define internal {{.*}} @"??0C@noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}}) + // MSABI: call {{.*}} @"??0B@noninline_nonvirt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__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@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}, i32 %{{.*}}) + // MSABI-LABEL: define internal {{.*}} @"??0B@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}}, i32 %{{.*}}) // MSABI: %[[COMPLETE:.*]] = icmp ne // MSABI: br i1 %[[COMPLETE]], - // MSABI: call {{.*}} @"??0A@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}) + // MSABI: call {{.*}} @"??0A@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__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@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}, i32 %{{.*}}) + // MSABI-LABEL: define internal {{.*}} @"??0C@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}}, i32 %{{.*}}) // MSABI: %[[COMPLETE:.*]] = icmp ne // MSABI: br i1 %[[COMPLETE]], - // MSABI: call {{.*}} @"??0A@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}) + // MSABI: call {{.*}} @"??0A@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(ptr{{.*}}, i32{{.*}}, ptr{{.*}}, ptr{{.*}}, i{{32|64}}{{.*}}) // MSABI: br - // MSABI: call {{.*}} @"??0B@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__clang@@@Z"(%{{.*}}, i32{{.*}}, %{{.*}}, i8*{{.*}}, i{{32|64}}{{.*}}, i32 0) + // MSABI: call {{.*}} @"??0B@noninline_virt@@Q{{AE|EAA}}@H$$Q{{E?}}AUQ@@P{{E?}}AXW4__pass_object_size0@__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@H@Z"(%{{.*}}* {{[^,]*}} %[[TMP]], i32 4) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4) // WIN32: %[[ARG3:.*]] = getelementptr {{.*}} %[[ARGMEM]] - // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3) // WIN32: %[[ARG1:.*]] = getelementptr {{.*}} %[[ARGMEM]] - // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1) // WIN32: call {{.*}} @"??0Z@@QAE@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@inalloca_nonvirt@@QAE@UQ@@H0$$QAU2@@Z"(%{{[^,]*}}, <{{.*}}>* inalloca(<{{.*}}>) %[[ARGMEM]]) + // WIN32: store ptr %[[TMP]], ptr %[[ARG4]] + // WIN32: call {{.*}} @"??0A@inalloca_nonvirt@@QAE@UQ@@H0$$QAU2@@Z"(ptr{{[^,]*}}, ptr inalloca(<{{.*}}>) %[[ARGMEM]]) // WIN32: call void @llvm.stackrestore( // WIN32: call {{.*}} @"??0Z@@QAE@XZ"( // WIN32: call {{.*}} @"??1Q@@QAE@XZ"( @@ -144,13 +144,13 @@ namespace inalloca_nonvirt { // WIN64: %[[TMP:.*]] = alloca // WIN64: %[[ARG3:.*]] = alloca // WIN64: %[[ARG1:.*]] = alloca - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[TMP]], i32 4) - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3) - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1) // WIN64: call {{.*}} @"??0Z@@QEAA@XZ"( - // WIN64: call {{.*}} @"??0A@inalloca_nonvirt@@QEAA@UQ@@H0$$QEAU2@@Z"(%{{.*}}, %{{.*}}* %[[ARG1]], i32 2, %{{.*}}* %[[ARG3]], %{{.*}} %[[TMP]]) + // WIN64: call {{.*}} @"??0A@inalloca_nonvirt@@QEAA@UQ@@H0$$QEAU2@@Z"(ptr{{.*}}, ptr %[[ARG1]], i32 2, ptr %[[ARG3]], ptr{{.*}} %[[TMP]]) // WIN64: call {{.*}} @"??0Z@@QEAA@XZ"( - // WIN64: call void @"??1Q@@QEAA@XZ"({{.*}}* {{[^,]*}} %[[TMP]]) + // WIN64: call void @"??1Q@@QEAA@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@H@Z"(%{{.*}}* {{[^,]*}} %[[TMP]], i32 4) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4) // WIN32: %[[ARG3:.*]] = getelementptr {{.*}} %[[ARGMEM]] - // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3) // WIN32: %[[ARG1:.*]] = getelementptr {{.*}} %[[ARGMEM]] - // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1) // WIN32: call {{.*}} @"??0Z@@QAE@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@inalloca_nonvirt@@QAE@UQ@@H0$$QAU2@@Z"(%{{[^,]*}}, <{{.*}}>* inalloca(<{{.*}}>) %[[ARGMEM]]) + // WIN32: store ptr %[[TMP]], ptr %[[ARG4]] + // WIN32: call {{.*}} @"??0A@inalloca_nonvirt@@QAE@UQ@@H0$$QAU2@@Z"(ptr{{[^,]*}}, ptr inalloca(<{{.*}}>) %[[ARGMEM]]) // WIN32: call void @llvm.stackrestore( // WIN32: call {{.*}} @"??0Z@@QAE@XZ"( // WIN32: call {{.*}} @"??1Q@@QAE@XZ"( @@ -180,13 +180,13 @@ namespace inalloca_nonvirt { // WIN64: %[[TMP:.*]] = alloca // WIN64: %[[ARG3:.*]] = alloca // WIN64: %[[ARG1:.*]] = alloca - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[TMP]], i32 4) - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3) - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1) // WIN64: call {{.*}} @"??0Z@@QEAA@XZ"( - // WIN64: call {{.*}} @"??0A@inalloca_nonvirt@@QEAA@UQ@@H0$$QEAU2@@Z"(%{{.*}}, %{{.*}}* %[[ARG1]], i32 2, %{{.*}}* %[[ARG3]], %{{.*}} %[[TMP]]) + // WIN64: call {{.*}} @"??0A@inalloca_nonvirt@@QEAA@UQ@@H0$$QEAU2@@Z"(ptr{{.*}}, ptr %[[ARG1]], i32 2, ptr %[[ARG3]], ptr{{.*}} %[[TMP]]) // WIN64: call {{.*}} @"??0Z@@QEAA@XZ"( - // WIN64: call void @"??1Q@@QEAA@XZ"({{.*}}* {{[^,]*}} %[[TMP]]) + // WIN64: call void @"??1Q@@QEAA@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@H@Z"(%{{.*}}* {{[^,]*}} %[[TMP]], i32 4) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4) // WIN32: %[[ARG3:.*]] = getelementptr {{.*}} %[[ARGMEM]] - // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3) // WIN32: %[[ARG1:.*]] = getelementptr {{.*}} %[[ARGMEM]] - // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1) + // WIN32: call {{.*}} @"??0Q@@QAE@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@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@inalloca_virt@@QAE@UQ@@H0$$QAU2@@Z"(%{{[^,]*}}, <{{.*}}>* inalloca(<{{.*}}>) %[[ARGMEM]]) + // WIN32: store ptr %[[TMP]], ptr %[[ARG4]] + // WIN32: call {{.*}} @"??0A@inalloca_virt@@QAE@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@H@Z"({{.*}}* {{[^,]*}} %[[TMP]], i32 4) - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3) - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1) // WIN64: br i1 - // WIN64: call {{.*}} @"??0A@inalloca_virt@@QEAA@UQ@@H0$$QEAU2@@Z"(%{{.*}}, %{{.*}}* %[[ARG1]], i32 2, %{{.*}}* %[[ARG3]], %{{.*}} %[[TMP]]) + // WIN64: call {{.*}} @"??0A@inalloca_virt@@QEAA@UQ@@H0$$QEAU2@@Z"(ptr{{.*}}, ptr %[[ARG1]], i32 2, ptr %[[ARG3]], ptr{{.*}} %[[TMP]]) // WIN64: br // WIN64: call {{.*}} @"??0Z@@QEAA@XZ"( // WIN64: call {{.*}} @"??0Z@@QEAA@XZ"( - // WIN64: call void @"??1Q@@QEAA@XZ"({{.*}}* {{[^,]*}} %[[TMP]]) + // WIN64: call void @"??1Q@@QEAA@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@H@Z"(%{{.*}}* {{[^,]*}} %[[TMP]], i32 4) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4) // WIN32: %[[ARG3:.*]] = getelementptr {{.*}} %[[ARGMEM]] - // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3) + // WIN32: call {{.*}} @"??0Q@@QAE@H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3) // WIN32: %[[ARG1:.*]] = getelementptr {{.*}} %[[ARGMEM]] - // WIN32: call {{.*}} @"??0Q@@QAE@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@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@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@inalloca_virt@@QAE@UQ@@H0$$QAU2@@Z"(%{{[^,]*}}, <{{.*}}>* inalloca(<{{.*}}>) %[[ARGMEM]]) + // WIN32: store ptr %[[TMP]], ptr %[[ARG4]] + // WIN32: call {{.*}} @"??0A@inalloca_virt@@QAE@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@H@Z"({{.*}}* {{[^,]*}} %[[TMP]], i32 4) - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[ARG3]], i32 3) - // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"({{.*}}* {{[^,]*}} %[[ARG1]], i32 1) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[TMP]], i32 4) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[ARG3]], i32 3) + // WIN64: call {{.*}} @"??0Q@@QEAA@H@Z"(ptr {{[^,]*}} %[[ARG1]], i32 1) // WIN64: br i1 // WIN64: store {{.*}} @"??_8C@inalloca_virt@@7B@" - // WIN64: call {{.*}} @"??0A@inalloca_virt@@QEAA@UQ@@H0$$QEAU2@@Z"(%{{.*}}, %{{.*}}* %[[ARG1]], i32 2, %{{.*}}* %[[ARG3]], %{{.*}} %[[TMP]]) + // WIN64: call {{.*}} @"??0A@inalloca_virt@@QEAA@UQ@@H0$$QEAU2@@Z"(ptr{{.*}}, ptr %[[ARG1]], i32 2, ptr %[[ARG3]], ptr{{.*}} %[[TMP]]) // WIN64: call {{.*}} @"??0Z@@QEAA@XZ"( // WIN64: call {{.*}} @"??0Z@@QEAA@XZ"( - // WIN64: call void @"??1Q@@QEAA@XZ"({{.*}}* {{[^,]*}} %[[TMP]]) + // WIN64: call void @"??1Q@@QEAA@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(); } -//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 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{}.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{}.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 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(fr); // CHECK: load - // CHECK: {{bitcast.*to i32\*}} - // CHECK: load i32, i32* + // CHECK: load i32, ptr ir = reinterpret_cast(xr); - // CHECK: load i32 - // CHECK: {{bitcast.*to float\*}} - // CHECK: load float, float* + // CHECK: load ptr + // CHECK: load float, ptr fr = reinterpret_cast(ir); // CHECK: load - // CHECK: {{bitcast.*to float\*}} - // CHECK: load float, float* + // CHECK: load float, ptr fr = reinterpret_cast(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(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(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@NeedsReferenceTemporary@@3ABHB" -// X64-DAG: @"?NeedsReferenceTemporary@@3AEBHEB" = dso_local constant i32* @"?$RT1@NeedsReferenceTemporary@@3AEBHEB" +// CHECK-DAG: @"?NeedsReferenceTemporary@@3ABHB" = dso_local constant ptr @"?$RT1@NeedsReferenceTemporary@@3ABHB" +// X64-DAG: @"?NeedsReferenceTemporary@@3AEBHEB" = dso_local constant ptr @"?$RT1@NeedsReferenceTemporary@@3AEBHEB" class foo { static const short d; @@ -434,7 +434,7 @@ void f(S::T6) {} // X64-DAG: @"?f@UnnamedType@@YAXQEAPEAU@S@1@@Z" // X64-DAG: @"?f@UnnamedType@@YAXUT2@S@1@@Z" -// X64-DAG: @"?f@UnnamedType@@YAXPEAUT4@S@1@@Z"(%"struct.UnnamedType::S::T4" +// X64-DAG: @"?f@UnnamedType@@YAXPEAUT4@S@1@@Z"(ptr // X64-DAG: @"?f@UnnamedType@@YAXUT4@S@1@@Z" // X64-DAG: @"?f@UnnamedType@@YAXUT5@S@1@@Z" // X64-DAG: @"?f@UnnamedType@@YAXPEAU@S@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@PassObjectSize@@YAHQAHW4__pass_object_size0@__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 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 c; matrix_5_5 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 c; matrix_5_5 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 i; @@ -350,9 +324,9 @@ class Foo { }; Foo class_constructor_matrix_ty(matrix_5_5 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 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 transpose(const MyMatrix &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 M1; @@ -31,23 +31,21 @@ void test_transpose_template1() { void test_transpose_template2(MyMatrix &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 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]], // 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 m_t = __builtin_matrix_transpose(get_matrix() + 2.0); } void test_transpose_const(const matrix_t &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 m_t = __builtin_matrix_transpose(m); } @@ -88,25 +84,25 @@ matrix_t 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 M1 = column_major_load_with_stride(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 M1 = column_major_load_with_stride(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 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 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 M1 = __builtin_matrix_column_major_load(Ptr, 2, constexpr1(), 3); } @@ -151,18 +147,18 @@ template 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 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 M1 = __builtin_matrix_column_major_load(Ptr, 2, 2, constexpr3()); } @@ -193,53 +189,53 @@ void column_major_store_with_stride(matrix_t &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 M1; column_major_store_with_stride(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 M1; column_major_store_with_stride(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 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 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 *p2 = 0; - // CHECK: call noundef i32 @"?GetX@S@@QEAAHHH@Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 223, i32 noundef 11) + // CHECK: call noundef i32 @"?GetX@S@@QEAAHHH@Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 223, i32 noundef 11) int j = p1->x[223][11]; - // CHECK: [[J:%.+]] = load i32, i32* % - // CHECK-NEXT: call void @"?PutX@S@@QEAAXHHH@Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 23, i32 noundef 1, i32 noundef [[J]]) + // CHECK: [[J:%.+]] = load i32, ptr % + // CHECK-NEXT: call void @"?PutX@S@@QEAAXHHH@Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 23, i32 noundef 1, i32 noundef [[J]]) p1->x[23][1] = j; - // CHECK: call noundef i32 @"?GetY@S@@QEAAHHH@Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 123, i32 noundef 22) + // CHECK: call noundef i32 @"?GetY@S@@QEAAHHH@Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 123, i32 noundef 22) int k = p1->y[123][22]; - // CHECK: [[K:%.+]] = load i32, i32* % - // CHECK-NEXT: call void @"?PutY@S@@QEAAXHHH@Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 16, i32 noundef 2, i32 noundef [[K]]) + // CHECK: [[K:%.+]] = load i32, ptr % + // CHECK-NEXT: call void @"?PutY@S@@QEAAXHHH@Z"(ptr {{[^,]*}} %{{.+}}, i32 noundef 16, i32 noundef 2, i32 noundef [[K]]) p1->y[16][2] = k; - // CHECK: call noundef i32 @"?GetZ@S@@QEAAHHHH@Z"(%class.S* {{[^,]*}} %{{.+}}, i32 noundef 123, i32 noundef 22, i32 noundef 44) + // CHECK: call noundef i32 @"?GetZ@S@@QEAAHHHH@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@S@@QEAAXHHHH@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@S@@QEAAXHHHH@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@M@@QEAAMMM@Z"(%class.St* {{[^,]*}} %{{.+}}, float noundef 2.230000e+02, float noundef 1.100000e+01) + // CHECK: call noundef float @"?GetX@?$St@M@@QEAAMMM@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@M@@QEAAMMMM@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@M@@QEAAMMMM@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@M@@QEAAMMM@Z"(%class.St* {{[^,]*}} %{{.+}}, float noundef [[CONV]], float noundef 1.000000e+00) + // CHECK-NEXT: [[GET:%.+]] = call noundef float @"?GetX@?$St@M@@QEAAMMM@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@M@@QEAAMMMM@Z"(%class.St* {{[^,]*}} %{{.+}}, float noundef [[CONV]], float noundef 1.000000e+00, float noundef [[INC]]) + // CHECK-NEXT: call noundef float @"?PutX@?$St@M@@QEAAMMMM@Z"(ptr {{[^,]*}} %{{.+}}, float noundef [[CONV]], float noundef 1.000000e+00, float noundef [[INC]]) ++p2->x[idx()][1]; // CHECK: call void @"??$foo@H@@YAXHH@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@S@@QEAAHHH@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@S@@QEAAHHH@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@Test1@@QEBAHXZ"(%class.Test1* {{[^,]*}} %{{.+}}) + // CHECK: [[ARGC:%.+]] = load i32, ptr % + // CHECK: [[T_X:%.+]] = call noundef i32 @"?get_x@Test1@@QEBAHXZ"(ptr {{[^,]*}} %{{.+}}) // CHECK: [[CAST2:%.+]] = trunc i32 [[T_X]] to i8 - // CHECK: call void @"?PutY@?$St@M@@QEAAXDHN@Z"(%class.St* {{[^,]*}} [[P2]], i8 noundef [[CAST2]], i32 noundef [[ARGC]], double noundef [[CAST]]) + // CHECK: call void @"?PutY@?$St@M@@QEAAXDHN@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@S@@QEAAHHH@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@S@@QEAAHHH@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@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@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@M@@QEAAMMMM@Z"(%class.St* {{[^,]*}} [[P2_1]], float noundef [[CAST2]], float noundef [[CAST1]], float noundef [[CAST]]) + // CHECK: call noundef float @"?PutX@?$St@M@@QEAAMMMM@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@Test1@@SAPEAV1@XZ"() - // CHECK-NEXT: call noundef i32 @"?get_x@Test1@@QEBAHXZ"(%class.Test1* {{[^,]*}} [[CALL]]) + // CHECK: [[CALL:%.+]] = call noundef ptr @"?GetTest1@Test1@@SAPEAV1@XZ"() + // CHECK-NEXT: call noundef i32 @"?get_x@Test1@@QEBAHXZ"(ptr {{[^,]*}} [[CALL]]) return Test1::GetTest1()->X; } // CHECK: define linkonce_odr dso_local void @"??$foo@H@@YAXHH@Z"(i32 noundef %{{.+}}, i32 noundef %{{.+}}) -// CHECK: call noundef i32 @"?GetX@?$St@H@@QEAAHHH@Z"(%class.St{{.+}}* {{[^,]*}} [[BAR:%.+]], i32 noundef %{{.+}} i32 noundef %{{.+}}) -// CHECK: call noundef i32 @"?PutX@?$St@H@@QEAAHHHH@Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i32 noundef %{{.+}}, i32 noundef %{{.+}}, i32 noundef %{{.+}}) -// CHECK: call noundef i32 @"?GetX@?$St@H@@QEAAHHH@Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i32 noundef %{{.+}} i32 noundef %{{.+}}) -// CHECK: call void @"?PutY@?$St@H@@QEAAXDHN@Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i8 noundef %{{.+}}, i32 noundef %{{.+}}, double noundef %{{.+}} -// CHECK: call noundef i32 @"?GetX@?$St@H@@QEAAHHH@Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i32 noundef %{{.+}} i32 noundef %{{.+}}) -// CHECK: call noundef i8 @"?GetY@?$St@H@@QEAADDVTest1@@@Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i8 noundef %{{.+}}, %class.Test1* noundef %{{.+}}) -// CHECK: call noundef i32 @"?PutX@?$St@H@@QEAAHHHH@Z"(%class.St{{.+}}* {{[^,]*}} [[BAR]], i32 noundef %{{.+}}, i32 noundef %{{.+}}, i32 noundef %{{.+}}) +// CHECK: call noundef i32 @"?GetX@?$St@H@@QEAAHHH@Z"(ptr {{[^,]*}} [[BAR:%.+]], i32 noundef %{{.+}} i32 noundef %{{.+}}) +// CHECK: call noundef i32 @"?PutX@?$St@H@@QEAAHHHH@Z"(ptr {{[^,]*}} [[BAR]], i32 noundef %{{.+}}, i32 noundef %{{.+}}, i32 noundef %{{.+}}) +// CHECK: call noundef i32 @"?GetX@?$St@H@@QEAAHHH@Z"(ptr {{[^,]*}} [[BAR]], i32 noundef %{{.+}} i32 noundef %{{.+}}) +// CHECK: call void @"?PutY@?$St@H@@QEAAXDHN@Z"(ptr {{[^,]*}} [[BAR]], i8 noundef %{{.+}}, i32 noundef %{{.+}}, double noundef %{{.+}} +// CHECK: call noundef i32 @"?GetX@?$St@H@@QEAAHHH@Z"(ptr {{[^,]*}} [[BAR]], i32 noundef %{{.+}} i32 noundef %{{.+}}) +// CHECK: call noundef i8 @"?GetY@?$St@H@@QEAADDVTest1@@@Z"(ptr {{[^,]*}} [[BAR]], i8 noundef %{{.+}}, ptr noundef %{{.+}}) +// CHECK: call noundef i32 @"?PutX@?$St@H@@QEAAHHHH@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 difference of position between A-in-B and A-in-C. @@ -31,43 +31,40 @@ struct S : B1, B2 { DoNotInstantiate f() override; }; S s; // CHECK: @"??_7S@@6BB2@@@" = linkonce_odr unnamed_addr constant -// CHECK-SAME: void (%struct.S*, ...)* @"?f@S@@W7EAA?AU?$DoNotInstantiate@X@@XZ" +// CHECK-SAME: ptr @"?f@S@@W7EAA?AU?$DoNotInstantiate@X@@XZ" // CHECK: @"??_7C@@6B@" = linkonce_odr unnamed_addr constant -// CHECK-SAME: void (%struct.B*, ...)* @"?foo@B@@W7EAAXUIncomplete@@@Z" -// CHECK-SAME: void (%struct.B*, ...)* @"?bar@B@@W7EAAXU?$DoNotInstantiate@H@@@Z" -// CHECK-SAME: i32 (i8*, i32)* @"?baz@B@@W7EAAHU?$InstantiateLater@H@@@Z" +// CHECK-SAME: ptr @"?foo@B@@W7EAAXUIncomplete@@@Z" +// CHECK-SAME: ptr @"?bar@B@@W7EAAXU?$DoNotInstantiate@H@@@Z" +// CHECK-SAME: ptr @"?baz@B@@W7EAAHU?$InstantiateLater@H@@@Z" -// CHECK-LABEL: define linkonce_odr dso_local void @"?f@S@@W7EAA?AU?$DoNotInstantiate@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@S@@UEAA?AU?$DoNotInstantiate@X@@XZ" -// CHECK-SAME: (%struct.S* noundef %[[THIS_ADJ]], ...) +// CHECK-LABEL: define linkonce_odr dso_local void @"?f@S@@W7EAA?AU?$DoNotInstantiate@X@@XZ"(ptr noundef %this, ...) +// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, ptr {{.*}}, i32 -8 +// CHECK: musttail call void (ptr, ...) {{.*}}@"?f@S@@UEAA?AU?$DoNotInstantiate@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@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@B@@UEAAXUIncomplete@@@Z" -// CHECK-SAME: (%struct.B* noundef %[[THIS_ADJ]], ...) +// CHECK-LABEL: define linkonce_odr dso_local void @"?foo@B@@W7EAAXUIncomplete@@@Z"(ptr noundef %this, ...) +// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, ptr {{.*}}, i32 -8 +// CHECK: musttail call void (ptr, ...) {{.*}}@"?foo@B@@UEAAXUIncomplete@@@Z" +// CHECK-SAME: (ptr noundef %[[THIS_ADJ_i8]], ...) // CHECK-NEXT: ret void -// CHECK-LABEL: define linkonce_odr dso_local void @"?bar@B@@W7EAAXU?$DoNotInstantiate@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@B@@UEAAXU?$DoNotInstantiate@H@@@Z" -// CHECK-SAME: (%struct.B* noundef %[[THIS_ADJ]], ...) +// CHECK-LABEL: define linkonce_odr dso_local void @"?bar@B@@W7EAAXU?$DoNotInstantiate@H@@@Z"(ptr noundef %this, ...) +// CHECK: %[[THIS_ADJ_i8:[^ ]*]] = getelementptr i8, ptr {{.*}}, i32 -8 +// CHECK: musttail call void (ptr, ...) {{.*}}@"?bar@B@@UEAAXU?$DoNotInstantiate@H@@@Z" +// CHECK-SAME: (ptr noundef %[[THIS_ADJ_i8]], ...) // CHECK-NEXT: ret void // If we complete the definition later, things work out. template struct InstantiateLater { T x; }; inline int B::baz(InstantiateLater p) { return p.x; } -// CHECK-LABEL: define linkonce_odr dso_local noundef i32 @"?baz@B@@W7EAAHU?$InstantiateLater@H@@@Z"(i8* noundef %this.coerce, i32 %p.coerce) -// CHECK: = getelementptr i8, i8* {{.*}}, i32 -8 -// CHECK: tail call noundef i32 @"?baz@B@@UEAAHU?$InstantiateLater@H@@@Z"(i8* {{[^,]*}}, i32 {{.*}}) +// CHECK-LABEL: define linkonce_odr dso_local noundef i32 @"?baz@B@@W7EAAHU?$InstantiateLater@H@@@Z"(ptr noundef %this, i32 %p.coerce) +// CHECK: = getelementptr i8, ptr {{.*}}, i32 -8 +// CHECK: tail call noundef i32 @"?baz@B@@UEAAHU?$InstantiateLater@H@@@Z"(ptr {{[^,]*}}, i32 {{.*}}) -// CHECK-LABEL: define linkonce_odr dso_local noundef i32 @"?baz@B@@UEAAHU?$InstantiateLater@H@@@Z"(i8* noundef %this.coerce, i32 %p.coerce) +// CHECK-LABEL: define linkonce_odr dso_local noundef i32 @"?baz@B@@UEAAHU?$InstantiateLater@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@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@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]]