1; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL
2; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=0 -S | FileCheck %s --check-prefix=NO_COMBINE_PTR_LABEL
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"
4target triple = "x86_64-unknown-linux-gnu"
5
6define {} @load0({}* %p) {
7  ; COMBINE_PTR_LABEL: @"dfs$load0"
8  ; COMBINE_PTR_LABEL: load
9  ; COMBINE_PTR_LABEL-NOT: load
10
11  ; NO_COMBINE_PTR_LABEL: @"dfs$load0"
12  ; NO_COMBINE_PTR_LABEL: load
13  ; NO_COMBINE_PTR_LABEL-NOT: load
14  %a = load {}, {}* %p
15  ret {} %a
16}
17
18define i8 @load8(i8* %p) {
19  ; COMBINE_PTR_LABEL: @"dfs$load8"
20  ; COMBINE_PTR_LABEL: load i16, i16*
21  ; COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} to i64
22  ; COMBINE_PTR_LABEL: and i64
23  ; COMBINE_PTR_LABEL: mul i64
24  ; COMBINE_PTR_LABEL: inttoptr i64
25  ; COMBINE_PTR_LABEL: load i16, i16*
26  ; COMBINE_PTR_LABEL: icmp ne i16
27  ; COMBINE_PTR_LABEL: call zeroext i16 @__dfsan_union
28  ; COMBINE_PTR_LABEL: load i8, i8*
29  ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
30  ; COMBINE_PTR_LABEL: ret i8
31
32  ; NO_COMBINE_PTR_LABEL: @"dfs$load8"
33  ; NO_COMBINE_PTR_LABEL: ptrtoint i8*
34  ; NO_COMBINE_PTR_LABEL: and i64
35  ; NO_COMBINE_PTR_LABEL: mul i64
36  ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} to i16*
37  ; NO_COMBINE_PTR_LABEL: load i16, i16*
38  ; NO_COMBINE_PTR_LABEL: load i8, i8*
39  ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
40  ; NO_COMBINE_PTR_LABEL: ret i8
41
42  %a = load i8, i8* %p
43  ret i8 %a
44}
45
46define i16 @load16(i16* %p) {
47  ; COMBINE_PTR_LABEL: @"dfs$load16"
48  ; COMBINE_PTR_LABEL: ptrtoint i16*
49  ; COMBINE_PTR_LABEL: and i64
50  ; COMBINE_PTR_LABEL: mul i64
51  ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
52  ; COMBINE_PTR_LABEL: getelementptr i16
53  ; COMBINE_PTR_LABEL: load i16, i16*
54  ; COMBINE_PTR_LABEL: load i16, i16*
55  ; COMBINE_PTR_LABEL: icmp ne
56  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
57  ; COMBINE_PTR_LABEL: icmp ne i16
58  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
59  ; COMBINE_PTR_LABEL: load i16, i16*
60  ; COMBINE_PTR_LABEL: store {{.*}} @__dfsan_retval_tls
61  ; COMBINE_PTR_LABEL: ret i16
62
63  ; NO_COMBINE_PTR_LABEL: @"dfs$load16"
64  ; NO_COMBINE_PTR_LABEL: ptrtoint i16*
65  ; NO_COMBINE_PTR_LABEL: and i64
66  ; NO_COMBINE_PTR_LABEL: mul i64
67  ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
68  ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
69  ; NO_COMBINE_PTR_LABEL: load i16, i16*
70  ; NO_COMBINE_PTR_LABEL: load i16, i16*
71  ; NO_COMBINE_PTR_LABEL: icmp ne i16
72  ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
73  ; NO_COMBINE_PTR_LABEL: load i16, i16*
74  ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
75  ; NO_COMBINE_PTR_LABEL: ret i16
76
77  %a = load i16, i16* %p
78  ret i16 %a
79}
80
81define i32 @load32(i32* %p) {
82  ; COMBINE_PTR_LABEL: @"dfs$load32"
83  ; COMBINE_PTR_LABEL: ptrtoint i32*
84  ; COMBINE_PTR_LABEL: and i64
85  ; COMBINE_PTR_LABEL: mul i64
86  ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
87  ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
88  ; COMBINE_PTR_LABEL: load i64, i64*
89  ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
90  ; COMBINE_PTR_LABEL: shl i64
91  ; COMBINE_PTR_LABEL: lshr i64
92  ; COMBINE_PTR_LABEL: or i64
93  ; COMBINE_PTR_LABEL: icmp eq i64
94  ; COMBINE_PTR_LABEL: icmp ne i16
95  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
96  ; COMBINE_PTR_LABEL: load i32, i32*
97  ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
98  ; COMBINE_PTR_LABEL: ret i32
99  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
100
101  ; NO_COMBINE_PTR_LABEL: @"dfs$load32"
102  ; NO_COMBINE_PTR_LABEL: ptrtoint i32*
103  ; NO_COMBINE_PTR_LABEL: and i64
104  ; NO_COMBINE_PTR_LABEL: mul i64
105  ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
106  ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
107  ; NO_COMBINE_PTR_LABEL: load i64, i64*
108  ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
109  ; NO_COMBINE_PTR_LABEL: shl i64
110  ; NO_COMBINE_PTR_LABEL: lshr i64
111  ; NO_COMBINE_PTR_LABEL: or i64
112  ; NO_COMBINE_PTR_LABEL: icmp eq i64
113  ; NO_COMBINE_PTR_LABEL: load i32, i32*
114  ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
115  ; NO_COMBINE_PTR_LABEL: ret i32
116  ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
117
118
119  %a = load i32, i32* %p
120  ret i32 %a
121}
122
123define i64 @load64(i64* %p) {
124  ; COMBINE_PTR_LABEL: @"dfs$load64"
125  ; COMBINE_PTR_LABEL: ptrtoint i64*
126  ; COMBINE_PTR_LABEL: and i64
127  ; COMBINE_PTR_LABEL: mul i64
128  ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
129  ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
130  ; COMBINE_PTR_LABEL: load i64, i64*
131  ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
132  ; COMBINE_PTR_LABEL: shl i64
133  ; COMBINE_PTR_LABEL: lshr i64
134  ; COMBINE_PTR_LABEL: or i64
135  ; COMBINE_PTR_LABEL: icmp eq i64
136  ; COMBINE_PTR_LABEL: icmp ne i16
137  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
138  ; COMBINE_PTR_LABEL: load i64, i64*
139  ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
140  ; COMBINE_PTR_LABEL: ret i64
141  ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
142  ; COMBINE_PTR_LABEL: getelementptr i64, i64* {{.*}} i64
143  ; COMBINE_PTR_LABEL: load i64, i64*
144  ; COMBINE_PTR_LABEL: icmp eq i64
145
146  ; NO_COMBINE_PTR_LABEL: @"dfs$load64"
147  ; NO_COMBINE_PTR_LABEL: ptrtoint i64*
148  ; NO_COMBINE_PTR_LABEL: and i64
149  ; NO_COMBINE_PTR_LABEL: mul i64
150  ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
151  ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
152  ; NO_COMBINE_PTR_LABEL: load i64, i64*
153  ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
154  ; NO_COMBINE_PTR_LABEL: shl i64
155  ; NO_COMBINE_PTR_LABEL: lshr i64
156  ; NO_COMBINE_PTR_LABEL: or i64
157  ; NO_COMBINE_PTR_LABEL: icmp eq i64
158  ; NO_COMBINE_PTR_LABEL: load i64, i64*
159  ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
160  ; NO_COMBINE_PTR_LABEL: ret i64
161  ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
162  ; NO_COMBINE_PTR_LABEL: getelementptr i64, i64* {{.*}} i64
163  ; NO_COMBINE_PTR_LABEL: load i64, i64*
164  ; NO_COMBINE_PTR_LABEL: icmp eq i64
165
166  %a = load i64, i64* %p
167  ret i64 %a
168}
169