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
3 target 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"
5 define {} @load0({}* %p) {
6 ; COMBINE_PTR_LABEL: @"dfs$load0"
7 ; COMBINE_PTR_LABEL: load
8 ; COMBINE_PTR_LABEL-NOT: load
10 ; NO_COMBINE_PTR_LABEL: @"dfs$load0"
11 ; NO_COMBINE_PTR_LABEL: load
12 ; NO_COMBINE_PTR_LABEL-NOT: load
17 define i8 @load8(i8* %p) {
18 ; COMBINE_PTR_LABEL: @"dfs$load8"
19 ; COMBINE_PTR_LABEL: load i16*
20 ; COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} to i64
21 ; COMBINE_PTR_LABEL: and i64
22 ; COMBINE_PTR_LABEL: mul i64
23 ; COMBINE_PTR_LABEL: inttoptr i64
24 ; COMBINE_PTR_LABEL: load i16*
25 ; COMBINE_PTR_LABEL: icmp ne i16
26 ; COMBINE_PTR_LABEL: call zeroext i16 @__dfsan_union
27 ; COMBINE_PTR_LABEL: load i8*
28 ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
29 ; COMBINE_PTR_LABEL: ret i8
31 ; NO_COMBINE_PTR_LABEL: @"dfs$load8"
32 ; NO_COMBINE_PTR_LABEL: ptrtoint i8*
33 ; NO_COMBINE_PTR_LABEL: and i64
34 ; NO_COMBINE_PTR_LABEL: mul i64
35 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} to i16*
36 ; NO_COMBINE_PTR_LABEL: load i16*
37 ; NO_COMBINE_PTR_LABEL: load i8*
38 ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
39 ; NO_COMBINE_PTR_LABEL: ret i8
45 define i16 @load16(i16* %p) {
46 ; COMBINE_PTR_LABEL: @"dfs$load16"
47 ; COMBINE_PTR_LABEL: ptrtoint i16*
48 ; COMBINE_PTR_LABEL: and i64
49 ; COMBINE_PTR_LABEL: mul i64
50 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
51 ; COMBINE_PTR_LABEL: getelementptr i16
52 ; COMBINE_PTR_LABEL: load i16*
53 ; COMBINE_PTR_LABEL: load i16*
54 ; COMBINE_PTR_LABEL: icmp ne
55 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
56 ; COMBINE_PTR_LABEL: icmp ne i16
57 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
58 ; COMBINE_PTR_LABEL: load i16*
59 ; COMBINE_PTR_LABEL: store {{.*}} @__dfsan_retval_tls
60 ; COMBINE_PTR_LABEL: ret i16
62 ; NO_COMBINE_PTR_LABEL: @"dfs$load16"
63 ; NO_COMBINE_PTR_LABEL: ptrtoint i16*
64 ; NO_COMBINE_PTR_LABEL: and i64
65 ; NO_COMBINE_PTR_LABEL: mul i64
66 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
67 ; NO_COMBINE_PTR_LABEL: getelementptr i16*
68 ; NO_COMBINE_PTR_LABEL: load i16*
69 ; NO_COMBINE_PTR_LABEL: load i16*
70 ; NO_COMBINE_PTR_LABEL: icmp ne i16
71 ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
72 ; NO_COMBINE_PTR_LABEL: load i16*
73 ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
74 ; NO_COMBINE_PTR_LABEL: ret i16
80 define i32 @load32(i32* %p) {
81 ; COMBINE_PTR_LABEL: @"dfs$load32"
82 ; COMBINE_PTR_LABEL: ptrtoint i32*
83 ; COMBINE_PTR_LABEL: and i64
84 ; COMBINE_PTR_LABEL: mul i64
85 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
86 ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
87 ; COMBINE_PTR_LABEL: load i64*
88 ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
89 ; COMBINE_PTR_LABEL: shl i64
90 ; COMBINE_PTR_LABEL: lshr i64
91 ; COMBINE_PTR_LABEL: or i64
92 ; COMBINE_PTR_LABEL: icmp eq i64
93 ; COMBINE_PTR_LABEL: icmp ne i16
94 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
95 ; COMBINE_PTR_LABEL: load i32*
96 ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
97 ; COMBINE_PTR_LABEL: ret i32
98 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
100 ; NO_COMBINE_PTR_LABEL: @"dfs$load32"
101 ; NO_COMBINE_PTR_LABEL: ptrtoint i32*
102 ; NO_COMBINE_PTR_LABEL: and i64
103 ; NO_COMBINE_PTR_LABEL: mul i64
104 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
105 ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
106 ; NO_COMBINE_PTR_LABEL: load i64*
107 ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
108 ; NO_COMBINE_PTR_LABEL: shl i64
109 ; NO_COMBINE_PTR_LABEL: lshr i64
110 ; NO_COMBINE_PTR_LABEL: or i64
111 ; NO_COMBINE_PTR_LABEL: icmp eq i64
112 ; NO_COMBINE_PTR_LABEL: load i32*
113 ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
114 ; NO_COMBINE_PTR_LABEL: ret i32
115 ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
122 define i64 @load64(i64* %p) {
123 ; COMBINE_PTR_LABEL: @"dfs$load64"
124 ; COMBINE_PTR_LABEL: ptrtoint i64*
125 ; COMBINE_PTR_LABEL: and i64
126 ; COMBINE_PTR_LABEL: mul i64
127 ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
128 ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
129 ; COMBINE_PTR_LABEL: load i64*
130 ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
131 ; COMBINE_PTR_LABEL: shl i64
132 ; COMBINE_PTR_LABEL: lshr i64
133 ; COMBINE_PTR_LABEL: or i64
134 ; COMBINE_PTR_LABEL: icmp eq i64
135 ; COMBINE_PTR_LABEL: icmp ne i16
136 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
137 ; COMBINE_PTR_LABEL: load i64*
138 ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
139 ; COMBINE_PTR_LABEL: ret i64
140 ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
141 ; COMBINE_PTR_LABEL: getelementptr i64* {{.*}} i64
142 ; COMBINE_PTR_LABEL: load i64*
143 ; COMBINE_PTR_LABEL: icmp eq i64
145 ; NO_COMBINE_PTR_LABEL: @"dfs$load64"
146 ; NO_COMBINE_PTR_LABEL: ptrtoint i64*
147 ; NO_COMBINE_PTR_LABEL: and i64
148 ; NO_COMBINE_PTR_LABEL: mul i64
149 ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
150 ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
151 ; NO_COMBINE_PTR_LABEL: load i64*
152 ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
153 ; NO_COMBINE_PTR_LABEL: shl i64
154 ; NO_COMBINE_PTR_LABEL: lshr i64
155 ; NO_COMBINE_PTR_LABEL: or i64
156 ; NO_COMBINE_PTR_LABEL: icmp eq i64
157 ; NO_COMBINE_PTR_LABEL: load i64*
158 ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
159 ; NO_COMBINE_PTR_LABEL: ret i64
160 ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
161 ; NO_COMBINE_PTR_LABEL: getelementptr i64* {{.*}} i64
162 ; NO_COMBINE_PTR_LABEL: load i64*
163 ; NO_COMBINE_PTR_LABEL: icmp eq i64