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