Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
cfe/trunk/test/CodeGenCXX/vtable-assume-load.cpp
Show All 21 Lines | struct B : A { | ||||
virtual void foo(); | virtual void foo(); | ||||
}; | }; | ||||
void g(A *a) { a->foo(); } | void g(A *a) { a->foo(); } | ||||
// CHECK1-LABEL: define void @_ZN5test14fooAEv() | // CHECK1-LABEL: define void @_ZN5test14fooAEv() | ||||
// CHECK1: call void @_ZN5test11AC1Ev(%"struct.test1::A"* | // CHECK1: call void @_ZN5test11AC1Ev(%"struct.test1::A"* | ||||
// CHECK1: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}} | // CHECK1: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}} | ||||
// CHECK1: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ({ [3 x i8*] }, { [3 x i8*] }* @_ZTVN5test11AE, i32 0, i32 0, i32 2) | // CHECK1: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ({ [3 x i8*] }, { [3 x i8*] }* @_ZTVN5test11AE, i32 0, inrange i32 0, i32 2) | ||||
// CHECK1: call void @llvm.assume(i1 %[[CMP]]) | // CHECK1: call void @llvm.assume(i1 %[[CMP]]) | ||||
// CHECK1-LABEL: {{^}}} | // CHECK1-LABEL: {{^}}} | ||||
void fooA() { | void fooA() { | ||||
A a; | A a; | ||||
g(&a); | g(&a); | ||||
} | } | ||||
// CHECK1-LABEL: define void @_ZN5test14fooBEv() | // CHECK1-LABEL: define void @_ZN5test14fooBEv() | ||||
// CHECK1: call void @_ZN5test11BC1Ev(%"struct.test1::B"* %{{.*}}) | // CHECK1: call void @_ZN5test11BC1Ev(%"struct.test1::B"* %{{.*}}) | ||||
// CHECK1: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}} | // CHECK1: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}} | ||||
// CHECK1: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ({ [3 x i8*] }, { [3 x i8*] }* @_ZTVN5test11BE, i32 0, i32 0, i32 2) | // CHECK1: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ({ [3 x i8*] }, { [3 x i8*] }* @_ZTVN5test11BE, i32 0, inrange i32 0, i32 2) | ||||
// CHECK1: call void @llvm.assume(i1 %[[CMP]]) | // CHECK1: call void @llvm.assume(i1 %[[CMP]]) | ||||
// CHECK1-LABEL: {{^}}} | // CHECK1-LABEL: {{^}}} | ||||
void fooB() { | void fooB() { | ||||
B b; | B b; | ||||
g(&b); | g(&b); | ||||
} | } | ||||
// there should not be any assumes in the ctor that calls base ctor | // there should not be any assumes in the ctor that calls base ctor | ||||
Show All 17 Lines | struct C : A, B { | ||||
virtual void foo(); | virtual void foo(); | ||||
}; | }; | ||||
void g(A *a) { a->foo(); } | void g(A *a) { a->foo(); } | ||||
void h(B *b) { b->bar(); } | void h(B *b) { b->bar(); } | ||||
// CHECK2-LABEL: define void @_ZN5test24testEv() | // CHECK2-LABEL: define void @_ZN5test24testEv() | ||||
// CHECK2: call void @_ZN5test21CC1Ev(%"struct.test2::C"* | // CHECK2: call void @_ZN5test21CC1Ev(%"struct.test2::C"* | ||||
// CHECK2: %[[VTABLE:.*]] = load i8**, i8*** {{.*}} | // CHECK2: %[[VTABLE:.*]] = load i8**, i8*** {{.*}} | ||||
// CHECK2: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ({ [3 x i8*], [3 x i8*] }, { [3 x i8*], [3 x i8*] }* @_ZTVN5test21CE, i32 0, i32 0, i32 2) | // CHECK2: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ({ [3 x i8*], [3 x i8*] }, { [3 x i8*], [3 x i8*] }* @_ZTVN5test21CE, i32 0, inrange i32 0, i32 2) | ||||
// CHECK2: call void @llvm.assume(i1 %[[CMP]]) | // CHECK2: call void @llvm.assume(i1 %[[CMP]]) | ||||
// CHECK2: %[[V2:.*]] = bitcast %"struct.test2::C"* %{{.*}} to i8* | // CHECK2: %[[V2:.*]] = bitcast %"struct.test2::C"* %{{.*}} to i8* | ||||
// CHECK2: %[[ADD_PTR:.*]] = getelementptr inbounds i8, i8* %[[V2]], i64 8 | // CHECK2: %[[ADD_PTR:.*]] = getelementptr inbounds i8, i8* %[[V2]], i64 8 | ||||
// CHECK2: %[[V3:.*]] = bitcast i8* %[[ADD_PTR]] to i8*** | // CHECK2: %[[V3:.*]] = bitcast i8* %[[ADD_PTR]] to i8*** | ||||
// CHECK2: %[[VTABLE2:.*]] = load i8**, i8*** %[[V3]] | // CHECK2: %[[VTABLE2:.*]] = load i8**, i8*** %[[V3]] | ||||
// CHECK2: %[[CMP2:.*]] = icmp eq i8** %[[VTABLE2]], getelementptr inbounds ({ [3 x i8*], [3 x i8*] }, { [3 x i8*], [3 x i8*] }* @_ZTVN5test21CE, i32 0, i32 1, i32 2) | // CHECK2: %[[CMP2:.*]] = icmp eq i8** %[[VTABLE2]], getelementptr inbounds ({ [3 x i8*], [3 x i8*] }, { [3 x i8*], [3 x i8*] }* @_ZTVN5test21CE, i32 0, inrange i32 1, i32 2) | ||||
// CHECK2: call void @llvm.assume(i1 %[[CMP2]]) | // CHECK2: call void @llvm.assume(i1 %[[CMP2]]) | ||||
// CHECK2: call void @_ZN5test21gEPNS_1AE( | // CHECK2: call void @_ZN5test21gEPNS_1AE( | ||||
// CHECK2-LABEL: {{^}}} | // CHECK2-LABEL: {{^}}} | ||||
void test() { | void test() { | ||||
C c; | C c; | ||||
g(&c); | g(&c); | ||||
Show All 14 Lines | |||||
struct C : virtual A, B { | struct C : virtual A, B { | ||||
C(); | C(); | ||||
virtual void foo(); | virtual void foo(); | ||||
}; | }; | ||||
void g(B *a) { a->foo(); } | void g(B *a) { a->foo(); } | ||||
// CHECK3-LABEL: define void @_ZN5test34testEv() | // CHECK3-LABEL: define void @_ZN5test34testEv() | ||||
// CHECK3: call void @_ZN5test31CC1Ev(%"struct.test3::C"* | // CHECK3: call void @_ZN5test31CC1Ev(%"struct.test3::C"* | ||||
// CHECK3: %[[CMP:.*]] = icmp eq i8** %{{.*}}, getelementptr inbounds ({ [4 x i8*] }, { [4 x i8*] }* @_ZTVN5test31CE, i32 0, i32 0, i32 3) | // CHECK3: %[[CMP:.*]] = icmp eq i8** %{{.*}}, getelementptr inbounds ({ [4 x i8*] }, { [4 x i8*] }* @_ZTVN5test31CE, i32 0, inrange i32 0, i32 3) | ||||
// CHECK3: call void @llvm.assume(i1 %[[CMP]]) | // CHECK3: call void @llvm.assume(i1 %[[CMP]]) | ||||
// CHECK3-LABLEL: } | // CHECK3-LABLEL: } | ||||
void test() { | void test() { | ||||
C c; | C c; | ||||
g(&c); | g(&c); | ||||
} | } | ||||
} // test3 | } // test3 | ||||
Show All 12 Lines | struct C : B { | ||||
virtual void foo(); | virtual void foo(); | ||||
}; | }; | ||||
void g(C *c) { c->foo(); } | void g(C *c) { c->foo(); } | ||||
// CHECK4-LABEL: define void @_ZN5test44testEv() | // CHECK4-LABEL: define void @_ZN5test44testEv() | ||||
// CHECK4: call void @_ZN5test41CC1Ev(%"struct.test4::C"* | // CHECK4: call void @_ZN5test41CC1Ev(%"struct.test4::C"* | ||||
// CHECK4: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}} | // CHECK4: %[[VTABLE:.*]] = load i8**, i8*** %{{.*}} | ||||
// CHECK4: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTVN5test41CE, i32 0, i32 0, i32 4) | // CHECK4: %[[CMP:.*]] = icmp eq i8** %[[VTABLE]], getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTVN5test41CE, i32 0, inrange i32 0, i32 4) | ||||
// CHECK4: call void @llvm.assume(i1 %[[CMP]] | // CHECK4: call void @llvm.assume(i1 %[[CMP]] | ||||
// CHECK4: %[[VTABLE2:.*]] = load i8**, i8*** %{{.*}} | // CHECK4: %[[VTABLE2:.*]] = load i8**, i8*** %{{.*}} | ||||
// CHECK4: %[[CMP2:.*]] = icmp eq i8** %[[VTABLE2]], getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTVN5test41CE, i32 0, i32 0, i32 4) | // CHECK4: %[[CMP2:.*]] = icmp eq i8** %[[VTABLE2]], getelementptr inbounds ({ [5 x i8*] }, { [5 x i8*] }* @_ZTVN5test41CE, i32 0, inrange i32 0, i32 4) | ||||
// CHECK4: call void @llvm.assume(i1 %[[CMP2]]) | // CHECK4: call void @llvm.assume(i1 %[[CMP2]]) | ||||
// CHECK4-LABEL: {{^}}} | // CHECK4-LABEL: {{^}}} | ||||
void test() { | void test() { | ||||
C c; | C c; | ||||
g(&c); | g(&c); | ||||
} | } | ||||
} // test4 | } // test4 | ||||
▲ Show 20 Lines • Show All 158 Lines • Show Last 20 Lines |