41 lines · plain
1; RUN: opt < %s -passes=tsan -S | FileCheck %s2; Check that vtable pointer updates are treated in a special way.3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"4 5define void @Foo(ptr nocapture %a, ptr %b) nounwind uwtable sanitize_thread {6entry:7; CHECK-LABEL: @Foo8; CHECK: call void @__tsan_vptr_update9; CHECK: ret void10 store ptr %b, ptr %a, align 8, !tbaa !011 ret void12}13 14define void @FooInt(ptr nocapture %a, i64 %b) nounwind uwtable sanitize_thread {15entry:16; CHECK-LABEL: @FooInt17; CHECK: call void @__tsan_vptr_update18; CHECK: ret void19 store i64 %b, ptr %a, align 8, !tbaa !020 ret void21}22 23 24declare i32 @Func1()25declare i32 @Func2()26 27; Test that we properly handle vector stores marked as vtable updates.28define void @VectorVptrUpdate(ptr nocapture %a, ptr %b) nounwind uwtable sanitize_thread {29entry:30; CHECK-LABEL: @VectorVptrUpdate31; CHECK: call void @__tsan_vptr_update{{.*}}Func132; CHECK-NOT: call void @__tsan_vptr_update33; CHECK: ret void34 store <2 x ptr> <ptr @Func1, ptr @Func2>, ptr %a, align 8, !tbaa !035 ret void36}37 38!0 = !{!2, !2, i64 0}39!1 = !{!"Simple C/C++ TBAA"}40!2 = !{!"vtable pointer", !1}41