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"
4 target triple = "x86_64-unknown-linux-gnu"
6 define {} @load0({}* %p) {
7 ; COMBINE_PTR_LABEL: @"dfs$load0"
8 ; COMBINE_PTR_LABEL: load
9 ; COMBINE_PTR_LABEL-NOT: load
11 ; NO_COMBINE_PTR_LABEL: @"dfs$load0"
12 ; NO_COMBINE_PTR_LABEL: load
13 ; NO_COMBINE_PTR_LABEL-NOT: load
18 define 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
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
46 define 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
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
77 %a = load i16, i16* %p
81 define 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
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
119 %a = load i32, i32* %p
123 define 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
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
166 %a = load i64, i64* %p