1 // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o %t.ll -O1 -disable-llvm-optzns -fms-extensions -fstrict-vtable-pointers
2 // RUN: %clang_cc1 %s -triple i686-pc-win32 -emit-llvm -o %t.ms.ll -O1 -disable-llvm-optzns -fms-extensions -fstrict-vtable-pointers
3 // FIXME: Assume load should not require -fstrict-vtable-pointers
5 // RUN: FileCheck --check-prefix=CHECK1 --input-file=%t.ll %s
6 // RUN: FileCheck --check-prefix=CHECK2 --input-file=%t.ll %s
7 // RUN: FileCheck --check-prefix=CHECK3 --input-file=%t.ll %s
8 // RUN: FileCheck --check-prefix=CHECK4 --input-file=%t.ll %s
9 // RUN: FileCheck --check-prefix=CHECK-MS --input-file=%t.ms.ll %s
10 // RUN: FileCheck --check-prefix=CHECK6 --input-file=%t.ll %s
11 // RUN: FileCheck --check-prefix=CHECK7 --input-file=%t.ll %s
12 // RUN: FileCheck --check-prefix=CHECK8 --input-file=%t.ll %s
13 // RUN: FileCheck --check-prefix=CHECK9 --input-file=%t.ll %s
25 void g(A *a) { a->foo(); }
27 // CHECK1-LABEL: define void @_ZN5test14fooAEv()
28 // CHECK1: call void @_ZN5test11AC1Ev(%"struct.test1::A"*
29 // CHECK1: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}}
30 // CHECK1: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTVN5test11AE, i32 0, i32 2)
31 // CHECK1: call void @llvm.assume(i1 %[[CMP]])
39 // CHECK1-LABEL: define void @_ZN5test14fooBEv()
40 // CHECK1: call void @_ZN5test11BC1Ev(%"struct.test1::B"* %{{.*}})
41 // CHECK1: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}}
42 // CHECK1: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTVN5test11BE, i32 0, i32 2)
43 // CHECK1: call void @llvm.assume(i1 %[[CMP]])
50 // there should not be any assumes in the ctor that calls base ctor
51 // CHECK1-LABEL: define linkonce_odr void @_ZN5test11BC2Ev(%"struct.test1::B"*
52 // CHECK1-NOT: @llvm.assume(
70 void g(A *a) { a->foo(); }
71 void h(B *b) { b->bar(); }
73 // CHECK2-LABEL: define void @_ZN5test24testEv()
74 // CHECK2: call void @_ZN5test21CC1Ev(%"struct.test2::C"*
75 // CHECK2: %[[VTABLE:.*]] = load i8**, i8*** {{.*}}
76 // CHECK2: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ([6 x i8*], [6 x i8*]* @_ZTVN5test21CE, i32 0, i32 2)
77 // CHECK2: call void @llvm.assume(i1 %[[CMP]])
79 // CHECK2: %[[V2:.*]] = bitcast %"struct.test2::C"* %{{.*}} to i8*
80 // CHECK2: %[[ADD_PTR:.*]] = getelementptr inbounds i8, i8* %[[V2]], i64 8
81 // CHECK2: %[[V3:.*]] = bitcast i8* %[[ADD_PTR]] to i8***
82 // CHECK2: %[[VTABLE2:.*]] = load i8**, i8*** %[[V3]]
83 // CHECK2: %[[CMP2:.*]] = icmp eq i8** %[[VTABLE2]], getelementptr inbounds ([6 x i8*], [6 x i8*]* @_ZTVN5test21CE, i32 0, i32 5)
84 // CHECK2: call void @llvm.assume(i1 %[[CMP2]])
86 // CHECK2: call void @_ZN5test21gEPNS_1AE(
106 struct C : virtual A, B {
110 void g(B *a) { a->foo(); }
112 // CHECK3-LABEL: define void @_ZN5test34testEv()
113 // CHECK3: call void @_ZN5test31CC1Ev(%"struct.test3::C"*
114 // CHECK3: %[[CMP:.*]] = icmp eq i8** %{{.*}}, getelementptr inbounds ([4 x i8*], [4 x i8*]* @_ZTVN5test31CE, i32 0, i32 3)
115 // CHECK3: call void @llvm.assume(i1 %[[CMP]])
129 struct B : virtual A {
138 void g(C *c) { c->foo(); }
140 // CHECK4-LABEL: define void @_ZN5test44testEv()
141 // CHECK4: call void @_ZN5test41CC1Ev(%"struct.test4::C"*
142 // CHECK4: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}}
143 // CHECK4: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ([5 x i8*], [5 x i8*]* @_ZTVN5test41CE, i32 0, i32 4)
144 // CHECK4: call void @llvm.assume(i1 %[[CMP]]
146 // CHECK4: %[[VTABLE2:.*]] = load i8**, i8*** %{{.*}}
147 // CHECK4: %[[CMP2:.*]] = icmp eq i8** %[[VTABLE2]], getelementptr inbounds ([5 x i8*], [5 x i8*]* @_ZTVN5test41CE, i32 0, i32 4)
148 // CHECK4: call void @llvm.assume(i1 %[[CMP2]])
159 struct __declspec(novtable) S {
163 void g(S &s) { s.foo(); }
165 // if struct has novtable specifier, then we can't generate assumes
166 // CHECK-MS-LABEL: define void @"\01?test@testMS@@YAXXZ"()
167 // CHECK-MS: call x86_thiscallcc %"struct.testMS::S"* @"\01??0S@testMS@@QAE@XZ"(
168 // CHECK-MS-NOT: @llvm.assume
187 // FIXME: Because A's vtable is external, and no virtual functions are hidden,
188 // it's safe to generate assumption loads.
189 // CHECK6-LABEL: define void @_ZN5test61gEv()
190 // CHECK6: call void @_ZN5test61AC1Ev(
191 // CHECK6-NOT: call void @llvm.assume(
193 // We can't emit assumption loads for B, because if we would refer to vtable
194 // it would refer to functions that will not be able to find (like implicit
195 // inline destructor).
197 // CHECK6-LABEL: call void @_ZN5test61BC1Ev(
198 // CHECK6-NOT: call void @llvm.assume(
207 // Because A's key function is defined here, vtable is generated in this TU
208 // CHECK7: @_ZTVN5test71AE = unnamed_addr constant
216 // CHECK7-LABEL: define void @_ZN5test71gEv()
217 // CHECK7: call void @_ZN5test71AC1Ev(
218 // CHECK7: call void @llvm.assume(
233 // CHECK8-DAG: @_ZTVN5test81BE = available_externally unnamed_addr constant
240 // CHECK8-DAG: @_ZTVN5test81CE = linkonce_odr unnamed_addr constant
246 inline void C::bar() {}
255 // CHECK8-DAG: @_ZTVN5test81EE = linkonce_odr unnamed_addr constant
260 // CHECK8-LABEL: define void @_ZN5test81bEv()
261 // CHECK8: call void @llvm.assume(
268 // FIXME: C has inline virtual functions which prohibits as from generating
269 // assumption loads, but because vtable is generated in this TU (key function
270 // defined here) it would be correct to refer to it.
271 // CHECK8-LABEL: define void @_ZN5test81cEv()
272 // CHECK8-NOT: call void @llvm.assume(
279 // FIXME: We could generate assumption loads here.
280 // CHECK8-LABEL: define void @_ZN5test81dEv()
281 // CHECK8-NOT: call void @llvm.assume(
288 // CHECK8-LABEL: define void @_ZN5test81eEv()
289 // CHECK8: call void @llvm.assume(
301 __attribute__((visibility("hidden"))) virtual void doStuff();
304 // CHECK9-LABEL: define void @_ZN5test94testEv()
305 // CHECK9-NOT: @llvm.assume(