1*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - -fsanitize=thread %s | FileCheck %s 2*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - -O1 %s | FileCheck %s 3*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - -O1 -relaxed-aliasing -fsanitize=thread %s | FileCheck %s 4*67e74705SXin Li // 5*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s --check-prefix=NOTBAA 6*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - -O2 -relaxed-aliasing %s | FileCheck %s --check-prefix=NOTBAA 7*67e74705SXin Li // 8*67e74705SXin Li // Check that we generate TBAA for vtable pointer loads and stores. 9*67e74705SXin Li // When -fsanitize=thread is used TBAA should be generated at all opt levels 10*67e74705SXin Li // even if -relaxed-aliasing is present. 11*67e74705SXin Li struct A { 12*67e74705SXin Li virtual int foo() const ; 13*67e74705SXin Li virtual ~A(); 14*67e74705SXin Li }; 15*67e74705SXin Li CreateA()16*67e74705SXin Livoid CreateA() { 17*67e74705SXin Li new A; 18*67e74705SXin Li } 19*67e74705SXin Li CallFoo(A * a,int (A::* fp)()const)20*67e74705SXin Livoid CallFoo(A *a, int (A::*fp)() const) { 21*67e74705SXin Li a->foo(); 22*67e74705SXin Li (a->*fp)(); 23*67e74705SXin Li } 24*67e74705SXin Li 25*67e74705SXin Li // CHECK-LABEL: @_Z7CallFoo 26*67e74705SXin Li // CHECK: %{{.*}} = load {{.*}} !tbaa ![[NUM:[0-9]+]] 27*67e74705SXin Li // CHECK: br i1 28*67e74705SXin Li // CHECK: load {{.*}}, !tbaa ![[NUM]] 29*67e74705SXin Li // 30*67e74705SXin Li // CHECK-LABEL: @_ZN1AC2Ev 31*67e74705SXin Li // CHECK: store {{.*}} !tbaa ![[NUM]] 32*67e74705SXin Li // 33*67e74705SXin Li // CHECK: [[NUM]] = !{[[TYPE:!.*]], [[TYPE]], i64 0} 34*67e74705SXin Li // CHECK: [[TYPE]] = !{!"vtable pointer", !{{.*}} 35*67e74705SXin Li // NOTBAA-NOT: = !{!"Simple C++ TBAA"} 36