1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; Test basic address sanitizer instrumentation.
4 ; RUN: opt < %s -passes=hwasan -S | FileCheck %s
5 ; RUN: opt < %s -passes=hwasan -hwasan-inline-fast-path-checks=0 -S | FileCheck %s --check-prefixes=NOFASTPATH
6 ; RUN: opt < %s -passes=hwasan -hwasan-inline-fast-path-checks=1 -S | FileCheck %s --check-prefixes=FASTPATH
7 ; RUN: opt < %s -passes=hwasan -hwasan-recover=0 -hwasan-mapping-offset-dynamic=ifunc -S | FileCheck %s --check-prefixes=ABORT-DYNAMIC-SHADOW
8 ; RUN: opt < %s -passes=hwasan -hwasan-recover=1 -hwasan-mapping-offset-dynamic=ifunc -S | FileCheck %s --check-prefixes=RECOVER-DYNAMIC-SHADOW
9 ; RUN: opt < %s -passes=hwasan -hwasan-recover=0 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=ABORT-ZERO-BASED-SHADOW
10 ; RUN: opt < %s -passes=hwasan -hwasan-recover=1 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=RECOVER-ZERO-BASED-SHADOW
13 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
14 target triple = "riscv64-unknown-linux"
16 define i8 @test_load8(ptr %a) sanitize_hwaddress {
17 ; CHECK-LABEL: define i8 @test_load8
18 ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
20 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
21 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
22 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
23 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
24 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
25 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
26 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
27 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
28 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
29 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
30 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
31 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
32 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
33 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2:![0-9]+]]
35 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 0)
36 ; CHECK-NEXT: br label [[TMP13]]
38 ; CHECK-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
39 ; CHECK-NEXT: ret i8 [[B]]
41 ; NOFASTPATH-LABEL: define i8 @test_load8
42 ; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
43 ; NOFASTPATH-NEXT: entry:
44 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
45 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
46 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
47 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
48 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
49 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 0)
50 ; NOFASTPATH-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
51 ; NOFASTPATH-NEXT: ret i8 [[B]]
53 ; FASTPATH-LABEL: define i8 @test_load8
54 ; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
55 ; FASTPATH-NEXT: entry:
56 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
57 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
58 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
59 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
60 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
61 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
62 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
63 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
64 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
65 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
66 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
67 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
68 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
69 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2:![0-9]+]]
71 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 0)
72 ; FASTPATH-NEXT: br label [[TMP13]]
74 ; FASTPATH-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
75 ; FASTPATH-NEXT: ret i8 [[B]]
77 ; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load8
78 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
79 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
80 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
81 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
82 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
83 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
84 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
85 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
86 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
87 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
88 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
89 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2:![0-9]+]]
90 ; ABORT-DYNAMIC-SHADOW: 8:
91 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)
92 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
93 ; ABORT-DYNAMIC-SHADOW: 9:
94 ; ABORT-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
95 ; ABORT-DYNAMIC-SHADOW-NEXT: ret i8 [[B]]
97 ; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load8
98 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
99 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
100 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
101 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
102 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
103 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
104 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
105 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
106 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
107 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
108 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
109 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2:![0-9]+]]
110 ; RECOVER-DYNAMIC-SHADOW: 8:
111 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
112 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
113 ; RECOVER-DYNAMIC-SHADOW: 10:
114 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 96", "{x10}"(i64 [[TMP0]])
115 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
116 ; RECOVER-DYNAMIC-SHADOW: 11:
117 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
118 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
119 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 0
120 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
121 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
122 ; RECOVER-DYNAMIC-SHADOW: 16:
123 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
124 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
125 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
126 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
127 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
128 ; RECOVER-DYNAMIC-SHADOW: 21:
129 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
130 ; RECOVER-DYNAMIC-SHADOW: 22:
131 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
132 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret i8 [[B]]
134 ; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load8
135 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
136 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
137 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
138 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
139 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
140 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
141 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
142 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
143 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
144 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
145 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
146 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2:![0-9]+]]
147 ; ABORT-ZERO-BASED-SHADOW: 8:
148 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)
149 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
150 ; ABORT-ZERO-BASED-SHADOW: 9:
151 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
152 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret i8 [[B]]
154 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load8
155 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
156 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
157 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
158 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
159 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
160 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
161 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
162 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
163 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
164 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
165 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
166 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2:![0-9]+]]
167 ; RECOVER-ZERO-BASED-SHADOW: 8:
168 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
169 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
170 ; RECOVER-ZERO-BASED-SHADOW: 10:
171 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 96", "{x10}"(i64 [[TMP0]])
172 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
173 ; RECOVER-ZERO-BASED-SHADOW: 11:
174 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
175 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
176 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 0
177 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
178 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
179 ; RECOVER-ZERO-BASED-SHADOW: 16:
180 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
181 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
182 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
183 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
184 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
185 ; RECOVER-ZERO-BASED-SHADOW: 21:
186 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
187 ; RECOVER-ZERO-BASED-SHADOW: 22:
188 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
189 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret i8 [[B]]
192 %b = load i8, ptr %a, align 4
196 define i16 @test_load16(ptr %a) sanitize_hwaddress {
197 ; CHECK-LABEL: define i16 @test_load16
198 ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
200 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
201 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
202 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
203 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
204 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
205 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
206 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
207 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
208 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
209 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
210 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
211 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
212 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
213 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
215 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 1)
216 ; CHECK-NEXT: br label [[TMP13]]
218 ; CHECK-NEXT: [[B:%.*]] = load i16, ptr [[A]], align 4
219 ; CHECK-NEXT: ret i16 [[B]]
221 ; NOFASTPATH-LABEL: define i16 @test_load16
222 ; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
223 ; NOFASTPATH-NEXT: entry:
224 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
225 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
226 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
227 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
228 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
229 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 1)
230 ; NOFASTPATH-NEXT: [[B:%.*]] = load i16, ptr [[A]], align 4
231 ; NOFASTPATH-NEXT: ret i16 [[B]]
233 ; FASTPATH-LABEL: define i16 @test_load16
234 ; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
235 ; FASTPATH-NEXT: entry:
236 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
237 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
238 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
239 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
240 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
241 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
242 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
243 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
244 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
245 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
246 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
247 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
248 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
249 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
251 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 1)
252 ; FASTPATH-NEXT: br label [[TMP13]]
254 ; FASTPATH-NEXT: [[B:%.*]] = load i16, ptr [[A]], align 4
255 ; FASTPATH-NEXT: ret i16 [[B]]
257 ; ABORT-DYNAMIC-SHADOW-LABEL: define i16 @test_load16
258 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
259 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
260 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
261 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
262 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
263 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
264 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
265 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
266 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
267 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
268 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
269 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
270 ; ABORT-DYNAMIC-SHADOW: 8:
271 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)
272 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
273 ; ABORT-DYNAMIC-SHADOW: 9:
274 ; ABORT-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i16, ptr [[A]], align 4
275 ; ABORT-DYNAMIC-SHADOW-NEXT: ret i16 [[B]]
277 ; RECOVER-DYNAMIC-SHADOW-LABEL: define i16 @test_load16
278 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
279 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
280 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
281 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
282 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
283 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
284 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
285 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
286 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
287 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
288 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
289 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
290 ; RECOVER-DYNAMIC-SHADOW: 8:
291 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
292 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
293 ; RECOVER-DYNAMIC-SHADOW: 10:
294 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 97", "{x10}"(i64 [[TMP0]])
295 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
296 ; RECOVER-DYNAMIC-SHADOW: 11:
297 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
298 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
299 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 1
300 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
301 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
302 ; RECOVER-DYNAMIC-SHADOW: 16:
303 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
304 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
305 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
306 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
307 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
308 ; RECOVER-DYNAMIC-SHADOW: 21:
309 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
310 ; RECOVER-DYNAMIC-SHADOW: 22:
311 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i16, ptr [[A]], align 4
312 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret i16 [[B]]
314 ; ABORT-ZERO-BASED-SHADOW-LABEL: define i16 @test_load16
315 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
316 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
317 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
318 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
319 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
320 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
321 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
322 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
323 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
324 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
325 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
326 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
327 ; ABORT-ZERO-BASED-SHADOW: 8:
328 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)
329 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
330 ; ABORT-ZERO-BASED-SHADOW: 9:
331 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i16, ptr [[A]], align 4
332 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret i16 [[B]]
334 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define i16 @test_load16
335 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
336 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
337 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
338 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
339 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
340 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
341 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
342 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
343 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
344 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
345 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
346 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
347 ; RECOVER-ZERO-BASED-SHADOW: 8:
348 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
349 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
350 ; RECOVER-ZERO-BASED-SHADOW: 10:
351 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 97", "{x10}"(i64 [[TMP0]])
352 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
353 ; RECOVER-ZERO-BASED-SHADOW: 11:
354 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
355 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
356 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 1
357 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
358 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
359 ; RECOVER-ZERO-BASED-SHADOW: 16:
360 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
361 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
362 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
363 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
364 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
365 ; RECOVER-ZERO-BASED-SHADOW: 21:
366 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
367 ; RECOVER-ZERO-BASED-SHADOW: 22:
368 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i16, ptr [[A]], align 4
369 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret i16 [[B]]
372 %b = load i16, ptr %a, align 4
376 define i32 @test_load32(ptr %a) sanitize_hwaddress {
377 ; CHECK-LABEL: define i32 @test_load32
378 ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
380 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
381 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
382 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
383 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
384 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
385 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
386 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
387 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
388 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
389 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
390 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
391 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
392 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
393 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
395 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 2)
396 ; CHECK-NEXT: br label [[TMP13]]
398 ; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[A]], align 4
399 ; CHECK-NEXT: ret i32 [[B]]
401 ; NOFASTPATH-LABEL: define i32 @test_load32
402 ; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
403 ; NOFASTPATH-NEXT: entry:
404 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
405 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
406 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
407 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
408 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
409 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 2)
410 ; NOFASTPATH-NEXT: [[B:%.*]] = load i32, ptr [[A]], align 4
411 ; NOFASTPATH-NEXT: ret i32 [[B]]
413 ; FASTPATH-LABEL: define i32 @test_load32
414 ; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
415 ; FASTPATH-NEXT: entry:
416 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
417 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
418 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
419 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
420 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
421 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
422 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
423 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
424 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
425 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
426 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
427 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
428 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
429 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
431 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 2)
432 ; FASTPATH-NEXT: br label [[TMP13]]
434 ; FASTPATH-NEXT: [[B:%.*]] = load i32, ptr [[A]], align 4
435 ; FASTPATH-NEXT: ret i32 [[B]]
437 ; ABORT-DYNAMIC-SHADOW-LABEL: define i32 @test_load32
438 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
439 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
440 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
441 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
442 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
443 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
444 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
445 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
446 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
447 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
448 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
449 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
450 ; ABORT-DYNAMIC-SHADOW: 8:
451 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)
452 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
453 ; ABORT-DYNAMIC-SHADOW: 9:
454 ; ABORT-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i32, ptr [[A]], align 4
455 ; ABORT-DYNAMIC-SHADOW-NEXT: ret i32 [[B]]
457 ; RECOVER-DYNAMIC-SHADOW-LABEL: define i32 @test_load32
458 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
459 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
460 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
461 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
462 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
463 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
464 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
465 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
466 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
467 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
468 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
469 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
470 ; RECOVER-DYNAMIC-SHADOW: 8:
471 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
472 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
473 ; RECOVER-DYNAMIC-SHADOW: 10:
474 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 98", "{x10}"(i64 [[TMP0]])
475 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
476 ; RECOVER-DYNAMIC-SHADOW: 11:
477 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
478 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
479 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 3
480 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
481 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
482 ; RECOVER-DYNAMIC-SHADOW: 16:
483 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
484 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
485 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
486 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
487 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
488 ; RECOVER-DYNAMIC-SHADOW: 21:
489 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
490 ; RECOVER-DYNAMIC-SHADOW: 22:
491 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i32, ptr [[A]], align 4
492 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret i32 [[B]]
494 ; ABORT-ZERO-BASED-SHADOW-LABEL: define i32 @test_load32
495 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
496 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
497 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
498 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
499 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
500 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
501 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
502 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
503 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
504 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
505 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
506 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
507 ; ABORT-ZERO-BASED-SHADOW: 8:
508 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)
509 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
510 ; ABORT-ZERO-BASED-SHADOW: 9:
511 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i32, ptr [[A]], align 4
512 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret i32 [[B]]
514 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define i32 @test_load32
515 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
516 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
517 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
518 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
519 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
520 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
521 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
522 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
523 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
524 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
525 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
526 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
527 ; RECOVER-ZERO-BASED-SHADOW: 8:
528 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
529 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
530 ; RECOVER-ZERO-BASED-SHADOW: 10:
531 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 98", "{x10}"(i64 [[TMP0]])
532 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
533 ; RECOVER-ZERO-BASED-SHADOW: 11:
534 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
535 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
536 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 3
537 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
538 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
539 ; RECOVER-ZERO-BASED-SHADOW: 16:
540 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
541 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
542 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
543 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
544 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
545 ; RECOVER-ZERO-BASED-SHADOW: 21:
546 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
547 ; RECOVER-ZERO-BASED-SHADOW: 22:
548 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i32, ptr [[A]], align 4
549 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret i32 [[B]]
552 %b = load i32, ptr %a, align 4
556 define i64 @test_load64(ptr %a) sanitize_hwaddress {
557 ; CHECK-LABEL: define i64 @test_load64
558 ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
560 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
561 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
562 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
563 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
564 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
565 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
566 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
567 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
568 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
569 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
570 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
571 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
572 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
573 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
575 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 3)
576 ; CHECK-NEXT: br label [[TMP13]]
578 ; CHECK-NEXT: [[B:%.*]] = load i64, ptr [[A]], align 8
579 ; CHECK-NEXT: ret i64 [[B]]
581 ; NOFASTPATH-LABEL: define i64 @test_load64
582 ; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
583 ; NOFASTPATH-NEXT: entry:
584 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
585 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
586 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
587 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
588 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
589 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 3)
590 ; NOFASTPATH-NEXT: [[B:%.*]] = load i64, ptr [[A]], align 8
591 ; NOFASTPATH-NEXT: ret i64 [[B]]
593 ; FASTPATH-LABEL: define i64 @test_load64
594 ; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
595 ; FASTPATH-NEXT: entry:
596 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
597 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
598 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
599 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
600 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
601 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
602 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
603 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
604 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
605 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
606 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
607 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
608 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
609 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
611 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 3)
612 ; FASTPATH-NEXT: br label [[TMP13]]
614 ; FASTPATH-NEXT: [[B:%.*]] = load i64, ptr [[A]], align 8
615 ; FASTPATH-NEXT: ret i64 [[B]]
617 ; ABORT-DYNAMIC-SHADOW-LABEL: define i64 @test_load64
618 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
619 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
620 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
621 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
622 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
623 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
624 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
625 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
626 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
627 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
628 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
629 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
630 ; ABORT-DYNAMIC-SHADOW: 8:
631 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)
632 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
633 ; ABORT-DYNAMIC-SHADOW: 9:
634 ; ABORT-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i64, ptr [[A]], align 8
635 ; ABORT-DYNAMIC-SHADOW-NEXT: ret i64 [[B]]
637 ; RECOVER-DYNAMIC-SHADOW-LABEL: define i64 @test_load64
638 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
639 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
640 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
641 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
642 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
643 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
644 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
645 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
646 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
647 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
648 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
649 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
650 ; RECOVER-DYNAMIC-SHADOW: 8:
651 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
652 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
653 ; RECOVER-DYNAMIC-SHADOW: 10:
654 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 99", "{x10}"(i64 [[TMP0]])
655 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
656 ; RECOVER-DYNAMIC-SHADOW: 11:
657 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
658 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
659 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 7
660 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
661 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
662 ; RECOVER-DYNAMIC-SHADOW: 16:
663 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
664 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
665 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
666 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
667 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
668 ; RECOVER-DYNAMIC-SHADOW: 21:
669 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
670 ; RECOVER-DYNAMIC-SHADOW: 22:
671 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i64, ptr [[A]], align 8
672 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret i64 [[B]]
674 ; ABORT-ZERO-BASED-SHADOW-LABEL: define i64 @test_load64
675 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
676 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
677 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
678 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
679 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
680 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
681 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
682 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
683 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
684 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
685 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
686 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
687 ; ABORT-ZERO-BASED-SHADOW: 8:
688 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)
689 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
690 ; ABORT-ZERO-BASED-SHADOW: 9:
691 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i64, ptr [[A]], align 8
692 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret i64 [[B]]
694 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define i64 @test_load64
695 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
696 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
697 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
698 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
699 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
700 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
701 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
702 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
703 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
704 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
705 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
706 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
707 ; RECOVER-ZERO-BASED-SHADOW: 8:
708 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
709 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
710 ; RECOVER-ZERO-BASED-SHADOW: 10:
711 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 99", "{x10}"(i64 [[TMP0]])
712 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
713 ; RECOVER-ZERO-BASED-SHADOW: 11:
714 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
715 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
716 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 7
717 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
718 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
719 ; RECOVER-ZERO-BASED-SHADOW: 16:
720 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
721 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
722 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
723 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
724 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
725 ; RECOVER-ZERO-BASED-SHADOW: 21:
726 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
727 ; RECOVER-ZERO-BASED-SHADOW: 22:
728 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i64, ptr [[A]], align 8
729 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret i64 [[B]]
732 %b = load i64, ptr %a, align 8
736 define i128 @test_load128(ptr %a) sanitize_hwaddress {
737 ; CHECK-LABEL: define i128 @test_load128
738 ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
740 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
741 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
742 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
743 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
744 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
745 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
746 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
747 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
748 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
749 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
750 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
751 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
752 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
753 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
755 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 4)
756 ; CHECK-NEXT: br label [[TMP13]]
758 ; CHECK-NEXT: [[B:%.*]] = load i128, ptr [[A]], align 16
759 ; CHECK-NEXT: ret i128 [[B]]
761 ; NOFASTPATH-LABEL: define i128 @test_load128
762 ; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
763 ; NOFASTPATH-NEXT: entry:
764 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
765 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
766 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
767 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
768 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
769 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 4)
770 ; NOFASTPATH-NEXT: [[B:%.*]] = load i128, ptr [[A]], align 16
771 ; NOFASTPATH-NEXT: ret i128 [[B]]
773 ; FASTPATH-LABEL: define i128 @test_load128
774 ; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
775 ; FASTPATH-NEXT: entry:
776 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
777 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
778 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
779 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
780 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
781 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
782 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
783 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
784 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
785 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
786 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
787 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
788 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
789 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
791 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 4)
792 ; FASTPATH-NEXT: br label [[TMP13]]
794 ; FASTPATH-NEXT: [[B:%.*]] = load i128, ptr [[A]], align 16
795 ; FASTPATH-NEXT: ret i128 [[B]]
797 ; ABORT-DYNAMIC-SHADOW-LABEL: define i128 @test_load128
798 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
799 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
800 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
801 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
802 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
803 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
804 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
805 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
806 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
807 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
808 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
809 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
810 ; ABORT-DYNAMIC-SHADOW: 8:
811 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)
812 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
813 ; ABORT-DYNAMIC-SHADOW: 9:
814 ; ABORT-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i128, ptr [[A]], align 16
815 ; ABORT-DYNAMIC-SHADOW-NEXT: ret i128 [[B]]
817 ; RECOVER-DYNAMIC-SHADOW-LABEL: define i128 @test_load128
818 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
819 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
820 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
821 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
822 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
823 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
824 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
825 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
826 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
827 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
828 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
829 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
830 ; RECOVER-DYNAMIC-SHADOW: 8:
831 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
832 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
833 ; RECOVER-DYNAMIC-SHADOW: 10:
834 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 100", "{x10}"(i64 [[TMP0]])
835 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
836 ; RECOVER-DYNAMIC-SHADOW: 11:
837 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
838 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
839 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 15
840 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
841 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
842 ; RECOVER-DYNAMIC-SHADOW: 16:
843 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
844 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
845 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
846 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
847 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
848 ; RECOVER-DYNAMIC-SHADOW: 21:
849 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
850 ; RECOVER-DYNAMIC-SHADOW: 22:
851 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i128, ptr [[A]], align 16
852 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret i128 [[B]]
854 ; ABORT-ZERO-BASED-SHADOW-LABEL: define i128 @test_load128
855 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
856 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
857 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
858 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
859 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
860 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
861 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
862 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
863 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
864 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
865 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
866 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
867 ; ABORT-ZERO-BASED-SHADOW: 8:
868 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)
869 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
870 ; ABORT-ZERO-BASED-SHADOW: 9:
871 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i128, ptr [[A]], align 16
872 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret i128 [[B]]
874 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define i128 @test_load128
875 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
876 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
877 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
878 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
879 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
880 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
881 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
882 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
883 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
884 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
885 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
886 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
887 ; RECOVER-ZERO-BASED-SHADOW: 8:
888 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
889 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
890 ; RECOVER-ZERO-BASED-SHADOW: 10:
891 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 100", "{x10}"(i64 [[TMP0]])
892 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
893 ; RECOVER-ZERO-BASED-SHADOW: 11:
894 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
895 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
896 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 15
897 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
898 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
899 ; RECOVER-ZERO-BASED-SHADOW: 16:
900 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
901 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
902 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
903 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
904 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
905 ; RECOVER-ZERO-BASED-SHADOW: 21:
906 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
907 ; RECOVER-ZERO-BASED-SHADOW: 22:
908 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i128, ptr [[A]], align 16
909 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret i128 [[B]]
912 %b = load i128, ptr %a, align 16
916 define i40 @test_load40(ptr %a) sanitize_hwaddress {
917 ; CHECK-LABEL: define i40 @test_load40
918 ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
920 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
921 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
922 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
923 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
924 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
925 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
926 ; CHECK-NEXT: call void @__hwasan_loadN(i64 [[TMP4]], i64 5)
927 ; CHECK-NEXT: [[B:%.*]] = load i40, ptr [[A]], align 4
928 ; CHECK-NEXT: ret i40 [[B]]
930 ; NOFASTPATH-LABEL: define i40 @test_load40
931 ; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
932 ; NOFASTPATH-NEXT: entry:
933 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
934 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
935 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
936 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
937 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
938 ; NOFASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
939 ; NOFASTPATH-NEXT: call void @__hwasan_loadN(i64 [[TMP4]], i64 5)
940 ; NOFASTPATH-NEXT: [[B:%.*]] = load i40, ptr [[A]], align 4
941 ; NOFASTPATH-NEXT: ret i40 [[B]]
943 ; FASTPATH-LABEL: define i40 @test_load40
944 ; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
945 ; FASTPATH-NEXT: entry:
946 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
947 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
948 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
949 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
950 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
951 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
952 ; FASTPATH-NEXT: call void @__hwasan_loadN(i64 [[TMP4]], i64 5)
953 ; FASTPATH-NEXT: [[B:%.*]] = load i40, ptr [[A]], align 4
954 ; FASTPATH-NEXT: ret i40 [[B]]
956 ; ABORT-DYNAMIC-SHADOW-LABEL: define i40 @test_load40
957 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
958 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
959 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
960 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
961 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @__hwasan_loadN(i64 [[TMP0]], i64 5)
962 ; ABORT-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i40, ptr [[A]], align 4
963 ; ABORT-DYNAMIC-SHADOW-NEXT: ret i40 [[B]]
965 ; RECOVER-DYNAMIC-SHADOW-LABEL: define i40 @test_load40
966 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
967 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
968 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
969 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
970 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void @__hwasan_loadN_noabort(i64 [[TMP0]], i64 5)
971 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i40, ptr [[A]], align 4
972 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret i40 [[B]]
974 ; ABORT-ZERO-BASED-SHADOW-LABEL: define i40 @test_load40
975 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
976 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
977 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
978 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
979 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @__hwasan_loadN(i64 [[TMP0]], i64 5)
980 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i40, ptr [[A]], align 4
981 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret i40 [[B]]
983 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define i40 @test_load40
984 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
985 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
986 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
987 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
988 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void @__hwasan_loadN_noabort(i64 [[TMP0]], i64 5)
989 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i40, ptr [[A]], align 4
990 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret i40 [[B]]
993 %b = load i40, ptr %a, align 4
997 define void @test_store8(ptr %a, i8 %b) sanitize_hwaddress {
998 ; CHECK-LABEL: define void @test_store8
999 ; CHECK-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1000 ; CHECK-NEXT: entry:
1001 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1002 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1003 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1004 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1005 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1006 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1007 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1008 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1009 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1010 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1011 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1012 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1013 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1014 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1016 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 16)
1017 ; CHECK-NEXT: br label [[TMP13]]
1019 ; CHECK-NEXT: store i8 [[B]], ptr [[A]], align 4
1020 ; CHECK-NEXT: ret void
1022 ; NOFASTPATH-LABEL: define void @test_store8
1023 ; NOFASTPATH-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1024 ; NOFASTPATH-NEXT: entry:
1025 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1026 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1027 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1028 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1029 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1030 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 16)
1031 ; NOFASTPATH-NEXT: store i8 [[B]], ptr [[A]], align 4
1032 ; NOFASTPATH-NEXT: ret void
1034 ; FASTPATH-LABEL: define void @test_store8
1035 ; FASTPATH-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1036 ; FASTPATH-NEXT: entry:
1037 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1038 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1039 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1040 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1041 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1042 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1043 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1044 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1045 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1046 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1047 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1048 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1049 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1050 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1052 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 16)
1053 ; FASTPATH-NEXT: br label [[TMP13]]
1055 ; FASTPATH-NEXT: store i8 [[B]], ptr [[A]], align 4
1056 ; FASTPATH-NEXT: ret void
1058 ; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store8
1059 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1060 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
1061 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1062 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1063 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1064 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1065 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1066 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1067 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1068 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1069 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1070 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1071 ; ABORT-DYNAMIC-SHADOW: 8:
1072 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)
1073 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
1074 ; ABORT-DYNAMIC-SHADOW: 9:
1075 ; ABORT-DYNAMIC-SHADOW-NEXT: store i8 [[B]], ptr [[A]], align 4
1076 ; ABORT-DYNAMIC-SHADOW-NEXT: ret void
1078 ; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store8
1079 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1080 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
1081 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1082 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1083 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1084 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1085 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1086 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1087 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1088 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1089 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1090 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1091 ; RECOVER-DYNAMIC-SHADOW: 8:
1092 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1093 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1094 ; RECOVER-DYNAMIC-SHADOW: 10:
1095 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 112", "{x10}"(i64 [[TMP0]])
1096 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
1097 ; RECOVER-DYNAMIC-SHADOW: 11:
1098 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1099 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1100 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 0
1101 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1102 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1103 ; RECOVER-DYNAMIC-SHADOW: 16:
1104 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1105 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1106 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1107 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1108 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1109 ; RECOVER-DYNAMIC-SHADOW: 21:
1110 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
1111 ; RECOVER-DYNAMIC-SHADOW: 22:
1112 ; RECOVER-DYNAMIC-SHADOW-NEXT: store i8 [[B]], ptr [[A]], align 4
1113 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret void
1115 ; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store8
1116 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1117 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
1118 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1119 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1120 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1121 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1122 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1123 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1124 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1125 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1126 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1127 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1128 ; ABORT-ZERO-BASED-SHADOW: 8:
1129 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)
1130 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
1131 ; ABORT-ZERO-BASED-SHADOW: 9:
1132 ; ABORT-ZERO-BASED-SHADOW-NEXT: store i8 [[B]], ptr [[A]], align 4
1133 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret void
1135 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store8
1136 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1137 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
1138 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1139 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1140 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1141 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1142 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1143 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1144 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1145 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1146 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1147 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1148 ; RECOVER-ZERO-BASED-SHADOW: 8:
1149 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1150 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1151 ; RECOVER-ZERO-BASED-SHADOW: 10:
1152 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 112", "{x10}"(i64 [[TMP0]])
1153 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
1154 ; RECOVER-ZERO-BASED-SHADOW: 11:
1155 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1156 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1157 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 0
1158 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1159 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1160 ; RECOVER-ZERO-BASED-SHADOW: 16:
1161 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1162 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1163 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1164 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1165 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1166 ; RECOVER-ZERO-BASED-SHADOW: 21:
1167 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
1168 ; RECOVER-ZERO-BASED-SHADOW: 22:
1169 ; RECOVER-ZERO-BASED-SHADOW-NEXT: store i8 [[B]], ptr [[A]], align 4
1170 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret void
1173 store i8 %b, ptr %a, align 4
1177 define void @test_store16(ptr %a, i16 %b) sanitize_hwaddress {
1178 ; CHECK-LABEL: define void @test_store16
1179 ; CHECK-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1180 ; CHECK-NEXT: entry:
1181 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1182 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1183 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1184 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1185 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1186 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1187 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1188 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1189 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1190 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1191 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1192 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1193 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1194 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1196 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 17)
1197 ; CHECK-NEXT: br label [[TMP13]]
1199 ; CHECK-NEXT: store i16 [[B]], ptr [[A]], align 4
1200 ; CHECK-NEXT: ret void
1202 ; NOFASTPATH-LABEL: define void @test_store16
1203 ; NOFASTPATH-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1204 ; NOFASTPATH-NEXT: entry:
1205 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1206 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1207 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1208 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1209 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1210 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 17)
1211 ; NOFASTPATH-NEXT: store i16 [[B]], ptr [[A]], align 4
1212 ; NOFASTPATH-NEXT: ret void
1214 ; FASTPATH-LABEL: define void @test_store16
1215 ; FASTPATH-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1216 ; FASTPATH-NEXT: entry:
1217 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1218 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1219 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1220 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1221 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1222 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1223 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1224 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1225 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1226 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1227 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1228 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1229 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1230 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1232 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 17)
1233 ; FASTPATH-NEXT: br label [[TMP13]]
1235 ; FASTPATH-NEXT: store i16 [[B]], ptr [[A]], align 4
1236 ; FASTPATH-NEXT: ret void
1238 ; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store16
1239 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1240 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
1241 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1242 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1243 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1244 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1245 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1246 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1247 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1248 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1249 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1250 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1251 ; ABORT-DYNAMIC-SHADOW: 8:
1252 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)
1253 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
1254 ; ABORT-DYNAMIC-SHADOW: 9:
1255 ; ABORT-DYNAMIC-SHADOW-NEXT: store i16 [[B]], ptr [[A]], align 4
1256 ; ABORT-DYNAMIC-SHADOW-NEXT: ret void
1258 ; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store16
1259 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1260 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
1261 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1262 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1263 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1264 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1265 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1266 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1267 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1268 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1269 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1270 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1271 ; RECOVER-DYNAMIC-SHADOW: 8:
1272 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1273 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1274 ; RECOVER-DYNAMIC-SHADOW: 10:
1275 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 113", "{x10}"(i64 [[TMP0]])
1276 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
1277 ; RECOVER-DYNAMIC-SHADOW: 11:
1278 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1279 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1280 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 1
1281 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1282 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1283 ; RECOVER-DYNAMIC-SHADOW: 16:
1284 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1285 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1286 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1287 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1288 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1289 ; RECOVER-DYNAMIC-SHADOW: 21:
1290 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
1291 ; RECOVER-DYNAMIC-SHADOW: 22:
1292 ; RECOVER-DYNAMIC-SHADOW-NEXT: store i16 [[B]], ptr [[A]], align 4
1293 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret void
1295 ; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store16
1296 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1297 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
1298 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1299 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1300 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1301 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1302 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1303 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1304 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1305 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1306 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1307 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1308 ; ABORT-ZERO-BASED-SHADOW: 8:
1309 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)
1310 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
1311 ; ABORT-ZERO-BASED-SHADOW: 9:
1312 ; ABORT-ZERO-BASED-SHADOW-NEXT: store i16 [[B]], ptr [[A]], align 4
1313 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret void
1315 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store16
1316 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1317 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
1318 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1319 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1320 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1321 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1322 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1323 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1324 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1325 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1326 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1327 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1328 ; RECOVER-ZERO-BASED-SHADOW: 8:
1329 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1330 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1331 ; RECOVER-ZERO-BASED-SHADOW: 10:
1332 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 113", "{x10}"(i64 [[TMP0]])
1333 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
1334 ; RECOVER-ZERO-BASED-SHADOW: 11:
1335 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1336 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1337 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 1
1338 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1339 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1340 ; RECOVER-ZERO-BASED-SHADOW: 16:
1341 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1342 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1343 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1344 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1345 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1346 ; RECOVER-ZERO-BASED-SHADOW: 21:
1347 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
1348 ; RECOVER-ZERO-BASED-SHADOW: 22:
1349 ; RECOVER-ZERO-BASED-SHADOW-NEXT: store i16 [[B]], ptr [[A]], align 4
1350 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret void
1353 store i16 %b, ptr %a, align 4
1357 define void @test_store32(ptr %a, i32 %b) sanitize_hwaddress {
1358 ; CHECK-LABEL: define void @test_store32
1359 ; CHECK-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1360 ; CHECK-NEXT: entry:
1361 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1362 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1363 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1364 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1365 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1366 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1367 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1368 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1369 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1370 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1371 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1372 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1373 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1374 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1376 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 18)
1377 ; CHECK-NEXT: br label [[TMP13]]
1379 ; CHECK-NEXT: store i32 [[B]], ptr [[A]], align 4
1380 ; CHECK-NEXT: ret void
1382 ; NOFASTPATH-LABEL: define void @test_store32
1383 ; NOFASTPATH-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1384 ; NOFASTPATH-NEXT: entry:
1385 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1386 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1387 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1388 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1389 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1390 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 18)
1391 ; NOFASTPATH-NEXT: store i32 [[B]], ptr [[A]], align 4
1392 ; NOFASTPATH-NEXT: ret void
1394 ; FASTPATH-LABEL: define void @test_store32
1395 ; FASTPATH-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1396 ; FASTPATH-NEXT: entry:
1397 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1398 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1399 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1400 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1401 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1402 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1403 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1404 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1405 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1406 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1407 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1408 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1409 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1410 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1412 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 18)
1413 ; FASTPATH-NEXT: br label [[TMP13]]
1415 ; FASTPATH-NEXT: store i32 [[B]], ptr [[A]], align 4
1416 ; FASTPATH-NEXT: ret void
1418 ; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store32
1419 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1420 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
1421 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1422 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1423 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1424 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1425 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1426 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1427 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1428 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1429 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1430 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1431 ; ABORT-DYNAMIC-SHADOW: 8:
1432 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)
1433 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
1434 ; ABORT-DYNAMIC-SHADOW: 9:
1435 ; ABORT-DYNAMIC-SHADOW-NEXT: store i32 [[B]], ptr [[A]], align 4
1436 ; ABORT-DYNAMIC-SHADOW-NEXT: ret void
1438 ; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store32
1439 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1440 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
1441 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1442 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1443 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1444 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1445 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1446 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1447 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1448 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1449 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1450 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1451 ; RECOVER-DYNAMIC-SHADOW: 8:
1452 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1453 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1454 ; RECOVER-DYNAMIC-SHADOW: 10:
1455 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 114", "{x10}"(i64 [[TMP0]])
1456 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
1457 ; RECOVER-DYNAMIC-SHADOW: 11:
1458 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1459 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1460 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 3
1461 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1462 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1463 ; RECOVER-DYNAMIC-SHADOW: 16:
1464 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1465 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1466 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1467 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1468 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1469 ; RECOVER-DYNAMIC-SHADOW: 21:
1470 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
1471 ; RECOVER-DYNAMIC-SHADOW: 22:
1472 ; RECOVER-DYNAMIC-SHADOW-NEXT: store i32 [[B]], ptr [[A]], align 4
1473 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret void
1475 ; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store32
1476 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1477 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
1478 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1479 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1480 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1481 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1482 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1483 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1484 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1485 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1486 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1487 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1488 ; ABORT-ZERO-BASED-SHADOW: 8:
1489 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)
1490 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
1491 ; ABORT-ZERO-BASED-SHADOW: 9:
1492 ; ABORT-ZERO-BASED-SHADOW-NEXT: store i32 [[B]], ptr [[A]], align 4
1493 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret void
1495 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store32
1496 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1497 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
1498 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1499 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1500 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1501 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1502 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1503 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1504 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1505 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1506 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1507 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1508 ; RECOVER-ZERO-BASED-SHADOW: 8:
1509 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1510 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1511 ; RECOVER-ZERO-BASED-SHADOW: 10:
1512 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 114", "{x10}"(i64 [[TMP0]])
1513 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
1514 ; RECOVER-ZERO-BASED-SHADOW: 11:
1515 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1516 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1517 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 3
1518 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1519 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1520 ; RECOVER-ZERO-BASED-SHADOW: 16:
1521 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1522 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1523 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1524 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1525 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1526 ; RECOVER-ZERO-BASED-SHADOW: 21:
1527 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
1528 ; RECOVER-ZERO-BASED-SHADOW: 22:
1529 ; RECOVER-ZERO-BASED-SHADOW-NEXT: store i32 [[B]], ptr [[A]], align 4
1530 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret void
1533 store i32 %b, ptr %a, align 4
1537 define void @test_store64(ptr %a, i64 %b) sanitize_hwaddress {
1538 ; CHECK-LABEL: define void @test_store64
1539 ; CHECK-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1540 ; CHECK-NEXT: entry:
1541 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1542 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1543 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1544 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1545 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1546 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1547 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1548 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1549 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1550 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1551 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1552 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1553 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1554 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1556 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 19)
1557 ; CHECK-NEXT: br label [[TMP13]]
1559 ; CHECK-NEXT: store i64 [[B]], ptr [[A]], align 8
1560 ; CHECK-NEXT: ret void
1562 ; NOFASTPATH-LABEL: define void @test_store64
1563 ; NOFASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1564 ; NOFASTPATH-NEXT: entry:
1565 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1566 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1567 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1568 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1569 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1570 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 19)
1571 ; NOFASTPATH-NEXT: store i64 [[B]], ptr [[A]], align 8
1572 ; NOFASTPATH-NEXT: ret void
1574 ; FASTPATH-LABEL: define void @test_store64
1575 ; FASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1576 ; FASTPATH-NEXT: entry:
1577 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1578 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1579 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1580 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1581 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1582 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1583 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1584 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1585 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1586 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1587 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1588 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1589 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1590 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1592 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 19)
1593 ; FASTPATH-NEXT: br label [[TMP13]]
1595 ; FASTPATH-NEXT: store i64 [[B]], ptr [[A]], align 8
1596 ; FASTPATH-NEXT: ret void
1598 ; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store64
1599 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1600 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
1601 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1602 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1603 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1604 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1605 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1606 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1607 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1608 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1609 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1610 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1611 ; ABORT-DYNAMIC-SHADOW: 8:
1612 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)
1613 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
1614 ; ABORT-DYNAMIC-SHADOW: 9:
1615 ; ABORT-DYNAMIC-SHADOW-NEXT: store i64 [[B]], ptr [[A]], align 8
1616 ; ABORT-DYNAMIC-SHADOW-NEXT: ret void
1618 ; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store64
1619 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1620 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
1621 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1622 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1623 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1624 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1625 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1626 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1627 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1628 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1629 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1630 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1631 ; RECOVER-DYNAMIC-SHADOW: 8:
1632 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1633 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1634 ; RECOVER-DYNAMIC-SHADOW: 10:
1635 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 115", "{x10}"(i64 [[TMP0]])
1636 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
1637 ; RECOVER-DYNAMIC-SHADOW: 11:
1638 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1639 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1640 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 7
1641 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1642 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1643 ; RECOVER-DYNAMIC-SHADOW: 16:
1644 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1645 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1646 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1647 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1648 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1649 ; RECOVER-DYNAMIC-SHADOW: 21:
1650 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
1651 ; RECOVER-DYNAMIC-SHADOW: 22:
1652 ; RECOVER-DYNAMIC-SHADOW-NEXT: store i64 [[B]], ptr [[A]], align 8
1653 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret void
1655 ; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store64
1656 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1657 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
1658 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1659 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1660 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1661 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1662 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1663 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1664 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1665 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1666 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1667 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1668 ; ABORT-ZERO-BASED-SHADOW: 8:
1669 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)
1670 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
1671 ; ABORT-ZERO-BASED-SHADOW: 9:
1672 ; ABORT-ZERO-BASED-SHADOW-NEXT: store i64 [[B]], ptr [[A]], align 8
1673 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret void
1675 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store64
1676 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1677 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
1678 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1679 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1680 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1681 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1682 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1683 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1684 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1685 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1686 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1687 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1688 ; RECOVER-ZERO-BASED-SHADOW: 8:
1689 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1690 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1691 ; RECOVER-ZERO-BASED-SHADOW: 10:
1692 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 115", "{x10}"(i64 [[TMP0]])
1693 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
1694 ; RECOVER-ZERO-BASED-SHADOW: 11:
1695 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1696 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1697 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 7
1698 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1699 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1700 ; RECOVER-ZERO-BASED-SHADOW: 16:
1701 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1702 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1703 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1704 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1705 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1706 ; RECOVER-ZERO-BASED-SHADOW: 21:
1707 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
1708 ; RECOVER-ZERO-BASED-SHADOW: 22:
1709 ; RECOVER-ZERO-BASED-SHADOW-NEXT: store i64 [[B]], ptr [[A]], align 8
1710 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret void
1713 store i64 %b, ptr %a, align 8
1717 define void @test_store128(ptr %a, i128 %b) sanitize_hwaddress {
1718 ; CHECK-LABEL: define void @test_store128
1719 ; CHECK-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1720 ; CHECK-NEXT: entry:
1721 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1722 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1723 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1724 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1725 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1726 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1727 ; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1728 ; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1729 ; CHECK-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1730 ; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1731 ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1732 ; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1733 ; CHECK-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1734 ; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1736 ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 20)
1737 ; CHECK-NEXT: br label [[TMP13]]
1739 ; CHECK-NEXT: store i128 [[B]], ptr [[A]], align 16
1740 ; CHECK-NEXT: ret void
1742 ; NOFASTPATH-LABEL: define void @test_store128
1743 ; NOFASTPATH-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1744 ; NOFASTPATH-NEXT: entry:
1745 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1746 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1747 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1748 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1749 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1750 ; NOFASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 20)
1751 ; NOFASTPATH-NEXT: store i128 [[B]], ptr [[A]], align 16
1752 ; NOFASTPATH-NEXT: ret void
1754 ; FASTPATH-LABEL: define void @test_store128
1755 ; FASTPATH-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1756 ; FASTPATH-NEXT: entry:
1757 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1758 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1759 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1760 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1761 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1762 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1763 ; FASTPATH-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1764 ; FASTPATH-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1765 ; FASTPATH-NEXT: [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1766 ; FASTPATH-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1767 ; FASTPATH-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1768 ; FASTPATH-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1769 ; FASTPATH-NEXT: [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
1770 ; FASTPATH-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1772 ; FASTPATH-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 20)
1773 ; FASTPATH-NEXT: br label [[TMP13]]
1775 ; FASTPATH-NEXT: store i128 [[B]], ptr [[A]], align 16
1776 ; FASTPATH-NEXT: ret void
1778 ; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store128
1779 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1780 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
1781 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1782 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1783 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1784 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1785 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1786 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1787 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1788 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1789 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1790 ; ABORT-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1791 ; ABORT-DYNAMIC-SHADOW: 8:
1792 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)
1793 ; ABORT-DYNAMIC-SHADOW-NEXT: br label [[TMP9]]
1794 ; ABORT-DYNAMIC-SHADOW: 9:
1795 ; ABORT-DYNAMIC-SHADOW-NEXT: store i128 [[B]], ptr [[A]], align 16
1796 ; ABORT-DYNAMIC-SHADOW-NEXT: ret void
1798 ; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store128
1799 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1800 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
1801 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1802 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1803 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1804 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1805 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1806 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1807 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1808 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1809 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1810 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1811 ; RECOVER-DYNAMIC-SHADOW: 8:
1812 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1813 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1814 ; RECOVER-DYNAMIC-SHADOW: 10:
1815 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 116", "{x10}"(i64 [[TMP0]])
1816 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP21:%.*]]
1817 ; RECOVER-DYNAMIC-SHADOW: 11:
1818 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1819 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1820 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 15
1821 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1822 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1823 ; RECOVER-DYNAMIC-SHADOW: 16:
1824 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1825 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1826 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1827 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1828 ; RECOVER-DYNAMIC-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1829 ; RECOVER-DYNAMIC-SHADOW: 21:
1830 ; RECOVER-DYNAMIC-SHADOW-NEXT: br label [[TMP22]]
1831 ; RECOVER-DYNAMIC-SHADOW: 22:
1832 ; RECOVER-DYNAMIC-SHADOW-NEXT: store i128 [[B]], ptr [[A]], align 16
1833 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret void
1835 ; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store128
1836 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1837 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
1838 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1839 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1840 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1841 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1842 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1843 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1844 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1845 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1846 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1847 ; ABORT-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1848 ; ABORT-ZERO-BASED-SHADOW: 8:
1849 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)
1850 ; ABORT-ZERO-BASED-SHADOW-NEXT: br label [[TMP9]]
1851 ; ABORT-ZERO-BASED-SHADOW: 9:
1852 ; ABORT-ZERO-BASED-SHADOW-NEXT: store i128 [[B]], ptr [[A]], align 16
1853 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret void
1855 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store128
1856 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1857 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
1858 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1859 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1860 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1861 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1862 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1863 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1864 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1865 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1866 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1867 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
1868 ; RECOVER-ZERO-BASED-SHADOW: 8:
1869 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1870 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1871 ; RECOVER-ZERO-BASED-SHADOW: 10:
1872 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void asm sideeffect "ebreak\0Aaddiw x0, x11, 116", "{x10}"(i64 [[TMP0]])
1873 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP21:%.*]]
1874 ; RECOVER-ZERO-BASED-SHADOW: 11:
1875 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP12:%.*]] = and i64 [[TMP0]], 15
1876 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1877 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP14:%.*]] = add i8 [[TMP13]], 15
1878 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1879 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1880 ; RECOVER-ZERO-BASED-SHADOW: 16:
1881 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP17:%.*]] = or i64 [[TMP3]], 15
1882 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1883 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1884 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1885 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1886 ; RECOVER-ZERO-BASED-SHADOW: 21:
1887 ; RECOVER-ZERO-BASED-SHADOW-NEXT: br label [[TMP22]]
1888 ; RECOVER-ZERO-BASED-SHADOW: 22:
1889 ; RECOVER-ZERO-BASED-SHADOW-NEXT: store i128 [[B]], ptr [[A]], align 16
1890 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret void
1893 store i128 %b, ptr %a, align 16
1897 define void @test_store40(ptr %a, i40 %b) sanitize_hwaddress {
1898 ; CHECK-LABEL: define void @test_store40
1899 ; CHECK-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1900 ; CHECK-NEXT: entry:
1901 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1902 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1903 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1904 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1905 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1906 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1907 ; CHECK-NEXT: call void @__hwasan_storeN(i64 [[TMP4]], i64 5)
1908 ; CHECK-NEXT: store i40 [[B]], ptr [[A]], align 4
1909 ; CHECK-NEXT: ret void
1911 ; NOFASTPATH-LABEL: define void @test_store40
1912 ; NOFASTPATH-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1913 ; NOFASTPATH-NEXT: entry:
1914 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1915 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1916 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1917 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1918 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1919 ; NOFASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1920 ; NOFASTPATH-NEXT: call void @__hwasan_storeN(i64 [[TMP4]], i64 5)
1921 ; NOFASTPATH-NEXT: store i40 [[B]], ptr [[A]], align 4
1922 ; NOFASTPATH-NEXT: ret void
1924 ; FASTPATH-LABEL: define void @test_store40
1925 ; FASTPATH-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1926 ; FASTPATH-NEXT: entry:
1927 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1928 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1929 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1930 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1931 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1932 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1933 ; FASTPATH-NEXT: call void @__hwasan_storeN(i64 [[TMP4]], i64 5)
1934 ; FASTPATH-NEXT: store i40 [[B]], ptr [[A]], align 4
1935 ; FASTPATH-NEXT: ret void
1937 ; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store40
1938 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1939 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
1940 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1941 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1942 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @__hwasan_storeN(i64 [[TMP0]], i64 5)
1943 ; ABORT-DYNAMIC-SHADOW-NEXT: store i40 [[B]], ptr [[A]], align 4
1944 ; ABORT-DYNAMIC-SHADOW-NEXT: ret void
1946 ; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store40
1947 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1948 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
1949 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1950 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1951 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 5)
1952 ; RECOVER-DYNAMIC-SHADOW-NEXT: store i40 [[B]], ptr [[A]], align 4
1953 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret void
1955 ; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store40
1956 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1957 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
1958 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1959 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1960 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @__hwasan_storeN(i64 [[TMP0]], i64 5)
1961 ; ABORT-ZERO-BASED-SHADOW-NEXT: store i40 [[B]], ptr [[A]], align 4
1962 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret void
1964 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store40
1965 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1966 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
1967 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1968 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1969 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 5)
1970 ; RECOVER-ZERO-BASED-SHADOW-NEXT: store i40 [[B]], ptr [[A]], align 4
1971 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret void
1974 store i40 %b, ptr %a, align 4
1978 define void @test_store_unaligned(ptr %a, i64 %b) sanitize_hwaddress {
1979 ; CHECK-LABEL: define void @test_store_unaligned
1980 ; CHECK-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1981 ; CHECK-NEXT: entry:
1982 ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1983 ; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1984 ; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1985 ; CHECK-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1986 ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1987 ; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1988 ; CHECK-NEXT: call void @__hwasan_storeN(i64 [[TMP4]], i64 8)
1989 ; CHECK-NEXT: store i64 [[B]], ptr [[A]], align 4
1990 ; CHECK-NEXT: ret void
1992 ; NOFASTPATH-LABEL: define void @test_store_unaligned
1993 ; NOFASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1994 ; NOFASTPATH-NEXT: entry:
1995 ; NOFASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1996 ; NOFASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1997 ; NOFASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1998 ; NOFASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1999 ; NOFASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
2000 ; NOFASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
2001 ; NOFASTPATH-NEXT: call void @__hwasan_storeN(i64 [[TMP4]], i64 8)
2002 ; NOFASTPATH-NEXT: store i64 [[B]], ptr [[A]], align 4
2003 ; NOFASTPATH-NEXT: ret void
2005 ; FASTPATH-LABEL: define void @test_store_unaligned
2006 ; FASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
2007 ; FASTPATH-NEXT: entry:
2008 ; FASTPATH-NEXT: [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
2009 ; FASTPATH-NEXT: [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
2010 ; FASTPATH-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
2011 ; FASTPATH-NEXT: [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
2012 ; FASTPATH-NEXT: [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
2013 ; FASTPATH-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
2014 ; FASTPATH-NEXT: call void @__hwasan_storeN(i64 [[TMP4]], i64 8)
2015 ; FASTPATH-NEXT: store i64 [[B]], ptr [[A]], align 4
2016 ; FASTPATH-NEXT: ret void
2018 ; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store_unaligned
2019 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
2020 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
2021 ; ABORT-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
2022 ; ABORT-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
2023 ; ABORT-DYNAMIC-SHADOW-NEXT: call void @__hwasan_storeN(i64 [[TMP0]], i64 8)
2024 ; ABORT-DYNAMIC-SHADOW-NEXT: store i64 [[B]], ptr [[A]], align 4
2025 ; ABORT-DYNAMIC-SHADOW-NEXT: ret void
2027 ; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store_unaligned
2028 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
2029 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
2030 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
2031 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
2032 ; RECOVER-DYNAMIC-SHADOW-NEXT: call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 8)
2033 ; RECOVER-DYNAMIC-SHADOW-NEXT: store i64 [[B]], ptr [[A]], align 4
2034 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret void
2036 ; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store_unaligned
2037 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
2038 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
2039 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
2040 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
2041 ; ABORT-ZERO-BASED-SHADOW-NEXT: call void @__hwasan_storeN(i64 [[TMP0]], i64 8)
2042 ; ABORT-ZERO-BASED-SHADOW-NEXT: store i64 [[B]], ptr [[A]], align 4
2043 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret void
2045 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store_unaligned
2046 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
2047 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
2048 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
2049 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
2050 ; RECOVER-ZERO-BASED-SHADOW-NEXT: call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 8)
2051 ; RECOVER-ZERO-BASED-SHADOW-NEXT: store i64 [[B]], ptr [[A]], align 4
2052 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret void
2055 store i64 %b, ptr %a, align 4
2059 define i8 @test_load_noattr(ptr %a) {
2060 ; CHECK-LABEL: define i8 @test_load_noattr
2061 ; CHECK-SAME: (ptr [[A:%.*]]) {
2062 ; CHECK-NEXT: entry:
2063 ; CHECK-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2064 ; CHECK-NEXT: ret i8 [[B]]
2066 ; NOFASTPATH-LABEL: define i8 @test_load_noattr
2067 ; NOFASTPATH-SAME: (ptr [[A:%.*]]) {
2068 ; NOFASTPATH-NEXT: entry:
2069 ; NOFASTPATH-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2070 ; NOFASTPATH-NEXT: ret i8 [[B]]
2072 ; FASTPATH-LABEL: define i8 @test_load_noattr
2073 ; FASTPATH-SAME: (ptr [[A:%.*]]) {
2074 ; FASTPATH-NEXT: entry:
2075 ; FASTPATH-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2076 ; FASTPATH-NEXT: ret i8 [[B]]
2078 ; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_noattr
2079 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) {
2080 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
2081 ; ABORT-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2082 ; ABORT-DYNAMIC-SHADOW-NEXT: ret i8 [[B]]
2084 ; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_noattr
2085 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) {
2086 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
2087 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2088 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret i8 [[B]]
2090 ; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_noattr
2091 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) {
2092 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
2093 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2094 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret i8 [[B]]
2096 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_noattr
2097 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) {
2098 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
2099 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2100 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret i8 [[B]]
2103 %b = load i8, ptr %a, align 4
2107 define i8 @test_load_notmyattr(ptr %a) sanitize_address {
2108 ; CHECK-LABEL: define i8 @test_load_notmyattr
2109 ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2110 ; CHECK-NEXT: entry:
2111 ; CHECK-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2112 ; CHECK-NEXT: ret i8 [[B]]
2114 ; NOFASTPATH-LABEL: define i8 @test_load_notmyattr
2115 ; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2116 ; NOFASTPATH-NEXT: entry:
2117 ; NOFASTPATH-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2118 ; NOFASTPATH-NEXT: ret i8 [[B]]
2120 ; FASTPATH-LABEL: define i8 @test_load_notmyattr
2121 ; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2122 ; FASTPATH-NEXT: entry:
2123 ; FASTPATH-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2124 ; FASTPATH-NEXT: ret i8 [[B]]
2126 ; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_notmyattr
2127 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2128 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
2129 ; ABORT-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2130 ; ABORT-DYNAMIC-SHADOW-NEXT: ret i8 [[B]]
2132 ; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_notmyattr
2133 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2134 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
2135 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2136 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret i8 [[B]]
2138 ; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_notmyattr
2139 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2140 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
2141 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2142 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret i8 [[B]]
2144 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_notmyattr
2145 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2146 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
2147 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
2148 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret i8 [[B]]
2151 %b = load i8, ptr %a, align 4
2155 define i8 @test_load_addrspace(ptr addrspace(256) %a) sanitize_hwaddress {
2156 ; CHECK-LABEL: define i8 @test_load_addrspace
2157 ; CHECK-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2158 ; CHECK-NEXT: entry:
2159 ; CHECK-NEXT: [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
2160 ; CHECK-NEXT: ret i8 [[B]]
2162 ; NOFASTPATH-LABEL: define i8 @test_load_addrspace
2163 ; NOFASTPATH-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2164 ; NOFASTPATH-NEXT: entry:
2165 ; NOFASTPATH-NEXT: [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
2166 ; NOFASTPATH-NEXT: ret i8 [[B]]
2168 ; FASTPATH-LABEL: define i8 @test_load_addrspace
2169 ; FASTPATH-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2170 ; FASTPATH-NEXT: entry:
2171 ; FASTPATH-NEXT: [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
2172 ; FASTPATH-NEXT: ret i8 [[B]]
2174 ; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_addrspace
2175 ; ABORT-DYNAMIC-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2176 ; ABORT-DYNAMIC-SHADOW-NEXT: entry:
2177 ; ABORT-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
2178 ; ABORT-DYNAMIC-SHADOW-NEXT: ret i8 [[B]]
2180 ; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_addrspace
2181 ; RECOVER-DYNAMIC-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2182 ; RECOVER-DYNAMIC-SHADOW-NEXT: entry:
2183 ; RECOVER-DYNAMIC-SHADOW-NEXT: [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
2184 ; RECOVER-DYNAMIC-SHADOW-NEXT: ret i8 [[B]]
2186 ; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_addrspace
2187 ; ABORT-ZERO-BASED-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2188 ; ABORT-ZERO-BASED-SHADOW-NEXT: entry:
2189 ; ABORT-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
2190 ; ABORT-ZERO-BASED-SHADOW-NEXT: ret i8 [[B]]
2192 ; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_addrspace
2193 ; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2194 ; RECOVER-ZERO-BASED-SHADOW-NEXT: entry:
2195 ; RECOVER-ZERO-BASED-SHADOW-NEXT: [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
2196 ; RECOVER-ZERO-BASED-SHADOW-NEXT: ret i8 [[B]]
2199 %b = load i8, ptr addrspace(256) %a, align 4