blob: 69d4117399b754e281a1f4f9c54c3636f21db02e [file] [log] [blame]
Kostya Serebryanye2a0e412012-02-13 22:50:51 +00001; RUN: opt < %s -tsan -S | FileCheck %s
2
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"
4target triple = "x86_64-unknown-linux-gnu"
5
Dmitry Vyukovb1ad5722013-10-17 07:20:06 +00006define i32 @read_4_bytes(i32* %a) sanitize_thread {
Kostya Serebryanye2a0e412012-02-13 22:50:51 +00007entry:
David Blaikiea79ac142015-02-27 21:17:42 +00008 %tmp1 = load i32, i32* %a, align 4
Kostya Serebryanye2a0e412012-02-13 22:50:51 +00009 ret i32 %tmp1
10}
11
Ismail Pazarbasi2d4ae9f2015-05-07 21:41:23 +000012; CHECK: @llvm.global_ctors = {{.*}}@tsan.module_ctor
Kostya Serebryanye2a0e412012-02-13 22:50:51 +000013
Dmitry Vyukovb1ad5722013-10-17 07:20:06 +000014; CHECK: define i32 @read_4_bytes(i32* %a)
Kostya Serebryanye2a0e412012-02-13 22:50:51 +000015; CHECK: call void @__tsan_func_entry(i8* %0)
16; CHECK-NEXT: %1 = bitcast i32* %a to i8*
17; CHECK-NEXT: call void @__tsan_read4(i8* %1)
David Blaikiea79ac142015-02-27 21:17:42 +000018; CHECK-NEXT: %tmp1 = load i32, i32* %a, align 4
Kostya Serebryanye2a0e412012-02-13 22:50:51 +000019; CHECK-NEXT: call void @__tsan_func_exit()
20; CHECK: ret i32
21
22
Daniel Neilson1e687242018-01-19 17:13:12 +000023declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1)
24declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1)
25declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1)
Kostya Serebryany463aa812013-03-28 11:21:13 +000026
27
28; Check that tsan converts mem intrinsics back to function calls.
29
Alexey Samsonov82667c72014-05-31 00:26:03 +000030define void @MemCpyTest(i8* nocapture %x, i8* nocapture %y) sanitize_thread {
Kostya Serebryany463aa812013-03-28 11:21:13 +000031entry:
Daniel Neilson1e687242018-01-19 17:13:12 +000032 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %x, i8* align 4 %y, i64 16, i1 false)
Kostya Serebryany463aa812013-03-28 11:21:13 +000033 ret void
34; CHECK: define void @MemCpyTest
35; CHECK: call i8* @memcpy
36; CHECK: ret void
37}
38
Alexey Samsonov82667c72014-05-31 00:26:03 +000039define void @MemMoveTest(i8* nocapture %x, i8* nocapture %y) sanitize_thread {
Kostya Serebryany463aa812013-03-28 11:21:13 +000040entry:
Daniel Neilson1e687242018-01-19 17:13:12 +000041 tail call void @llvm.memmove.p0i8.p0i8.i64(i8* align 4 %x, i8* align 4 %y, i64 16, i1 false)
Kostya Serebryany463aa812013-03-28 11:21:13 +000042 ret void
43; CHECK: define void @MemMoveTest
44; CHECK: call i8* @memmove
45; CHECK: ret void
46}
47
Alexey Samsonov82667c72014-05-31 00:26:03 +000048define void @MemSetTest(i8* nocapture %x) sanitize_thread {
Kostya Serebryany463aa812013-03-28 11:21:13 +000049entry:
Daniel Neilson1e687242018-01-19 17:13:12 +000050 tail call void @llvm.memset.p0i8.i64(i8* align 4 %x, i8 77, i64 16, i1 false)
Kostya Serebryany463aa812013-03-28 11:21:13 +000051 ret void
Benjamin Kramerb50682e2013-04-11 12:41:41 +000052; CHECK: define void @MemSetTest
Kostya Serebryany463aa812013-03-28 11:21:13 +000053; CHECK: call i8* @memset
54; CHECK: ret void
55}
Ismail Pazarbasi2d4ae9f2015-05-07 21:41:23 +000056
Arnold Schwaighofer8eb1a482017-02-15 18:57:06 +000057; CHECK-LABEL: @SwiftError
58; CHECK-NOT: __tsan_read
59; CHECK-NOT: __tsan_write
60; CHECK: ret
61define void @SwiftError(i8** swifterror) sanitize_thread {
62 %swifterror_ptr_value = load i8*, i8** %0
63 store i8* null, i8** %0
64 %swifterror_addr = alloca swifterror i8*
65 %swifterror_ptr_value_2 = load i8*, i8** %swifterror_addr
66 store i8* null, i8** %swifterror_addr
67 ret void
68}
69
70; CHECK-LABEL: @SwiftErrorCall
71; CHECK-NOT: __tsan_read
72; CHECK-NOT: __tsan_write
73; CHECK: ret
74define void @SwiftErrorCall(i8** swifterror) sanitize_thread {
75 %swifterror_addr = alloca swifterror i8*
76 store i8* null, i8** %0
77 call void @SwiftError(i8** %0)
78 ret void
79}
80
Ismail Pazarbasi2d4ae9f2015-05-07 21:41:23 +000081; CHECK: define internal void @tsan.module_ctor()
82; CHECK: call void @__tsan_init()