1; RUN: opt < %s -dfsan -S | FileCheck %s
2target 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"
3
4define i8 @load8(i8* %p) {
5  ; CHECK: @"dfs$load8"
6  ; CHECK: ptrtoint
7  ; CHECK: and
8  ; CHECK: mul
9  ; CHECK: inttoptr
10  ; CHECK: load
11  ; CHECK: store{{.*}}__dfsan_retval_tls
12  ; CHECK: ret i8
13  %a = load i8* %p
14  ret i8 %a
15}
16
17define i16 @load16(i16* %p) {
18  ; CHECK: @"dfs$load16"
19  ; CHECK: ptrtoint
20  ; CHECK: and
21  ; CHECK: mul
22  ; CHECK: inttoptr
23  ; CHECK: load
24  ; CHECK: load
25  ; CHECK: icmp ne
26  ; CHECK: call{{.*}}__dfsan_union
27  ; CHECK: store{{.*}}__dfsan_retval_tls
28  ; CHECK: ret i16
29  %a = load i16* %p
30  ret i16 %a
31}
32
33define i32 @load32(i32* %p) {
34  ; CHECK: @"dfs$load32"
35  ; CHECK: ptrtoint
36  ; CHECK: and
37  ; CHECK: mul
38  ; CHECK: inttoptr
39  ; CHECK: bitcast
40  ; CHECK: load
41  ; CHECK: trunc
42  ; CHECK: shl
43  ; CHECK: lshr
44  ; CHECK: or
45  ; CHECK: icmp eq
46
47  ; CHECK: store{{.*}}__dfsan_retval_tls
48  ; CHECK: ret i32
49
50  ; CHECK: call{{.*}}__dfsan_union_load
51
52  %a = load i32* %p
53  ret i32 %a
54}
55
56define i64 @load64(i64* %p) {
57  ; CHECK: @"dfs$load64"
58  ; CHECK: ptrtoint
59  ; CHECK: and
60  ; CHECK: mul
61  ; CHECK: inttoptr
62  ; CHECK: bitcast
63  ; CHECK: load
64  ; CHECK: trunc
65  ; CHECK: shl
66  ; CHECK: lshr
67  ; CHECK: or
68  ; CHECK: icmp eq
69
70  ; CHECK: store{{.*}}__dfsan_retval_tls
71  ; CHECK: ret i64
72
73  ; CHECK: call{{.*}}__dfsan_union_load
74
75  ; CHECK: getelementptr
76  ; CHECK: load
77  ; CHECK: icmp eq
78
79  %a = load i64* %p
80  ret i64 %a
81}
82